Текущее время: Пн, июл 21 2025, 21:07

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Доступ к локальным данным вызвавшей функции?
СообщениеДобавлено: Пт, дек 15 2006, 16:11 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Добрый день!

Видимо это маловероятно, но все же вдруг существует "хитрый" способ через assign получить доступ из ФМ к локальным данным в функции, вызвавшей эту функцию?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к локальным данным вызвавшей функции?
СообщениеДобавлено: Пт, дек 15 2006, 18:59 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 14:35
Сообщения: 1519
Откуда: В ВЕЧНОМ БАНЕ
vga написал(а):
Добрый день!

Видимо это маловероятно, но все же вдруг существует "хитрый" способ через assign получить доступ из ФМ к локальным данным в функции, вызвавшей эту функцию?

А искать не пробовали??? Очень помогает знаете ли...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб, дек 16 2006, 22:35 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
А еще неплохо внимательно читать вопросы, чтобы не отвечать "а бы как".

На форуме неоднократно обсуждался вопрос доступа к глобальным переменным и с этим проблем не возникает. Но ключевое слово вопроса - локальная переменная.
Думаю, не стоит объяснять разницу между локальной и глобальной переменной. Для хранения глобальных переменных SAP использует shared область данных + для возможности динамического assign специально хранит символьные имена всех глобальных переменных с адресами их размещения в памяти. Локальные же переменные размещаются на стеке и обращение к ним идет по смещению от начала стека. При завершении работы подпрограммы или FM оператор return устаналивает указатель стека в состояние, предшествующее вызову FM, и тем самым доступ к локальной переменной теряется и при следующих вызовах ее значение затирается.
Собственно вопрос заключался в нахождении смещения локальной переменной на стеке в вызывающей функции и получения к ней доступа.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб, дек 16 2006, 23:46 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
vga написал(а):
... Локальные же переменные размещаются на стеке и обращение к ним идет по смещению от начала стека. При завершении работы подпрограммы или FM оператор return устаналивает указатель стека в состояние, предшествующее вызову FM, и тем самым доступ к локальной переменной теряется и при следующих вызовах ее значение затирается.
Собственно вопрос заключался в нахождении смещения локальной переменной на стеке в вызывающей функции и получения к ней доступа.

Это, возможно, было-бы применимо при описании механизмов работы С или Pascal. В АВАР, как мне думается, механизм слегка другой. Ведь, например, информация о дампе содержит стек вызова и содержимое локальных переменных различного уровня, и по именам.
Но как-то это неправильно - лазить в локальные переменные - может лучше честно отмодифицировать стандарт?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс, дек 17 2006, 00:02 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Понимаю, что неправильно, но потребность возникла в customer function в MIGO и таблица, определенная в глобал, в момент вызова этого exit, еще не заполнена нужными данными.

PS: Пример про дамп, возможно не совсем показателен, поскольку нет информации, как он формируется. Может используется исходник, всегда присутствующий в системе или промежуточный интерпретируемый byte-code. Но имена символьные имена локальных переменных конечно программе известны, ведь динамический assign работает с локальными переменными внутри FM.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 02:31 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
Думется что в абапе локальные переменные хранятся также как и глобальные просто к ним доступ закрыт (для размышлений есть команда STATICS, рекомендую посмотреть оператор LOAD (DATA и SYMB)).

провёл небольшой эксперимент
    DATA ptr POINTER.
    FIELD-SYMBOLS <fs>.

    PERFORM test.

    IF <fs> IS ASSIGNED.
    WRITE <fs>. " Сюда не попадает
    ELSE.
    WRITE: 'Not Assigned'. ", <fs> - Падает в дамп
    SYSTEM-CALL POINTER <fs> FROM ptr.
    WRITE <fs>. " НЕ падает в дамп - выводится "Y"
    ENDIF.

    FORM test.
    DATA: x TYPE c.
    x = 'Y'.
    ASSIGN x TO <fs>.
    SYSTEM-CALL POINTER <fs> TO ptr.
    ENDFORM.


Вот собственно и ответ на ваш вопрос - через POINTER можно добраться до локальных переменных (вопрос только стоит ли так делать)

ptr - 16 байтная переменная которую можно впринципе заполнить самому и сделать. SYSTEM-CALL POINTER <fs> FROM ptr.

похоже в абапе ptr не адрес (как в C) это некоторая структура
в начале offi ofsg из load 'DATA' в конце тип, длина.. точно не помню


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 10:05 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Цитата:
WRITE <fs>. " НЕ падает в дамп - выводится "Y"


У меня падает, не смотря на то, что в дебаггере <fs> имеет значение 'Y'.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 10:43 
Специалист
Специалист

Зарегистрирован:
Чт, июн 23 2005, 18:05
Сообщения: 119
DKiyanov написал:
Вот собственно и ответ на ваш вопрос - через POINTER можно добраться до локальных переменных (вопрос только стоит ли так делать)

Вы создали переменную и получили ее адрес присоединив ее к FS в рамках своей проги.
Не понял как таким образом получить адрес локальной переменной в вызывающей программе. И даже например адрес одноименной переменной в вызывающей вызывающую программу. Вам известно только имя переменной.

В отладчике например , если на закладке вызовы встать на вызывающую прогу - все локальные переменные (вызывающей проги) видны.
Тут нужно искать какой-то класс который использует отладчик. И юзать его.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 11:21 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Господа, Вы подождите проверять. Похоже код не совсем корректен с точки зрения вложений.
Получается, что подпрограмма отработала, и после ее выхода идет обращение к ее внутренней переменной. В этом случае локальная переменная может быть затерта, а может быть и нет - дело случая. Но такое обращение некорректно. Наверно из-за этого и падения.

Может алгоритм, предложенный уважаемым DKiyanov и отработает, еще не проверил.

Я же спрашивал про другой уровень вложений, когда из FM1 вызывается FM2 и из него получить доступ к локальной переменной в FM1. В этом случае 100% локальная переменная в FM1 не затерта.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 11:42 
Специалист
Специалист

Зарегистрирован:
Чт, июн 23 2005, 18:05
Сообщения: 119
vga написал(а):
Я же спрашивал про другой уровень вложений, когда из FM1 вызывается FM2 и из него получить доступ к локальной переменной в FM1. В этом случае 100% локальная переменная в FM1 не затерта.

Именно про такой случай я и писал.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 11:44 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 14:35
Сообщения: 1519
Откуда: В ВЕЧНОМ БАНЕ
vga написал(а):
А еще неплохо внимательно читать вопросы, чтобы не отвечать "а бы как".

Понимаешь ли в чем причина, это обсуждалось уже не раз, и общий вывод такой, доступ к глобальным переменным чужого пула программ уже есть не хорошо, а доступ к локальным данным вообще-то из разряда а мы сейчас это дело хакнем по быстренькому, а дальше хоть трава не расти... поэтому я к таким методам отношусь, как там у Высоцкого, "ну очень отрицательно" и 100% есть другие методы чтобы не заниматься такими вещами и не делать геммороя другим кто придется после вас на поддержку этой системы.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 12:07 
Специалист
Специалист

Зарегистрирован:
Чт, июн 23 2005, 18:05
Сообщения: 119
Uukrul написал(а):
vga написал(а):
А еще неплохо внимательно читать вопросы, чтобы не отвечать "а бы как".

.... а мы сейчас это дело хакнем по быстренькому, а дальше хоть трава не расти... поэтому я к таким методам отношусь, как там у Высоцкого, "ну очень отрицательно" и 100% есть другие методы чтобы не заниматься такими вещами и не делать геммороя другим кто придется после вас на поддержку этой системы.

Думаю что это не в нашей компетеции. Разработчик должен уметь предложить заказчику все варианты решения задачи. Выбирать должен заказчик. К тому же если работа с указателями относится к стандартным, документируемым возможностям SAP, то слово хакнем вообще не уместно.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 12:07 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Вопрос вообщем то даже не в том, хорошо или плохо, а в том - возможно ли. Я же не говорю, что пойду по этому пути, смогу принять правильное решение для будущих поколений ;-)

Перерыв помимо этого еще 2 зарубежных форума, нигде не нашел, чтобы где-то было описан способ доступа к локальной переменной.
Поэтому видимо обсуждения сводились к тому, что это плохо, а на поверку оказывается что это даже и не возможно.


Последний раз редактировалось vga Пн, дек 18 2006, 13:54, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 12:42 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
kizif написал(а):
К тому же если работа с указателями относится к стандартным, документируемым возможностям SAP, то слово хакнем вообще не уместно.
Рекомендуется ознакомиться с комментариями по поводу SYSTEM-CALL. Слово "хакнем" в данном контексте более чем уместно.

Цитата:
SYSTEM-CALL


Note
*---------------------------------------------------------*
This statement is only for

!!! Internal use in SAP Basis development !!!

Even within SAP Basis, it may only be used in programs within the ABAP+GUI development group.

Its use is subject to various restrictions, not all of which may be listed in the documentation. This documentation is intended for internal SAP use within the Basis development group ABAP+GUI.

Changes and further development, which may be incompatible, may occur at any time, without warning or notice!

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 18 2006, 17:57 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, апр 07 2005, 05:27
Сообщения: 621
Откуда: Москва
Пол: Мужской
Пардон, а что мешает добавить параметр для передачи этой переменной в FM2 ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB