C, PASCAL (parameter passing conventions)

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 4011
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Admin »

В справке написано "In 32-bit programs, both C and PASCAL conventions pass the parameters to the stack from right to left"
В примере же показано что параметры с атрибутом C передаются справа на лево а с PASCAL наоборот.
Чему верить?

Код: Выделить всё

       MAP
         MODULE('Party3.Obj')                          !A third-party library
Func46	   PROCEDURE(*CSTRING,*REAL),REAL,C,RAW       !Pass REAL then CSTRING, address-only 
Func49	   PROCEDURE(*CSTRING,*REAL),REAL,PASCAL,RAW  !Pass CSTRING then REAL, address-only 
         END
       END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4011
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Admin »

Просто столкнулся со странностями.

В программе используется библиотека из Windows.
Описал функции как PASCAL.
В дебаг режиме Clarion программа работает прекрасно.
В режиме без отладочной информации программа падает.

Поменял PASCAL на С
Программа в обоих режимах стала работать корректно. Но смущает что вроде все Windows API должно быть с PASCAL

И вдобавок как программа будет работать (даже в дебаг режиме) и с C и с PASCAL если они меняют направление передачи параметров в стеке.
На бред смахивает. Или я дописался :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

C, PASCAL (parameter passing conventions)

Сообщение PavelNK »

Если соглашения PASCAL, то параметры запихиваются в стэк начиная с первого, если C, то начиная с последнего.
В WinAPI используются соглашения PASCAL.
Аватара пользователя
Admin
Администратор
Сообщения: 4011
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Admin »

PavelNK писал(а): Если соглашения PASCAL, то параметры запихиваются в стэк начиная с первого, если C, то начиная с последнего.
Вроде как да. И вроде как согласен.
Но расскажите мне как тогда у меня пример из http://forum.clarionlife.net/phpbb/view ... f=1&t=3496
компилируется и работает и с PASCAL и с С ?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

C, PASCAL (parameter passing conventions)

Сообщение PavelNK »

Не совсем понял, какая функция и в каком примере. Исходники, плиз.
Возможны варианты:
1. Нет параметров
2. Если параметры симметричны: 0, 1456, 0
Это навскидку, сказать точнее можно имея конкретный пример.
Аватара пользователя
Admin
Администратор
Сообщения: 4011
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Admin »

Пример из поста http://forum.clarionlife.net/phpbb/view ... 597#p23597
Конкретно посмотрите строку

Код: Выделить всё

Err# = SSL_read(SELF.SSL,ADDRESS(LOC:buffer),SIZE(LOC:buffer))
Параметры не совсем симметричны, т.к. SELF.SSL и SIZE(LOC:buffer) не могут совпасть. Если их перевернуть то SSL_read не будет знать откуда читать данные...
Сам дебагер посмотрел, да код немного разный, но в ассемблере не очень шарю.

P.S. Проверял все на Clarion 10
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Yufil »

Насчёт порядка параметров - вроде в Windows он одинаков. Разница в очистке стека при выходе, должна его чистить вызываемая процедура или вызывающая программа.
Аватара пользователя
Admin
Администратор
Сообщения: 4011
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Admin »

Yufil писал(а): вроде в Windows он одинаков
получается С или PASCAL методом тыка устанавливать ?
есть проекты с PASCAL работают норм а в примере только с С
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4011
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Admin »

Yufil писал(а): Насчёт порядка параметров
ну и тогда нужно запомнить что пример в описании кривой.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

C, PASCAL (parameter passing conventions)

Сообщение PavelNK »

Не одинаковый - разный. Существуют разные соглашения. Передача может происходить не только через стэк, может и через регистры. Если регистров не хватает, то тогда используется стэк. Такие соглашения в клаше. И чистится стэк по-разному. Если соглашение PASCAL, то чистит вызываемая процедура, если C, то чистит вызывающая. Поэтому в Паскале не бывает процедур с переменным кол-вом параметров, а в С - бывает. Это совершенно точно.
Аватара пользователя
Admin
Администратор
Сообщения: 4011
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Admin »

Я описал что у меня в дебаг моде и PASCAL и С работают одинаково. Как?
И как догадываться что использовать С или PASCAL?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Yufil »

А для чего в Clarion (по крайней мере до CW6) входит приложение winAPI и база APIView.tps ?
Там для кучи функций, структур данных и констант есть декларации.

Например, GetClipboardData(UNSIGNED),HANDLE,PASCAL - кстати, везде PASCAL
Есть, конечно, ошибки, не без этого (разок наткнулся), но в целом правильно
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

C, PASCAL (parameter passing conventions)

Сообщение PavelNK »

Блин! Писал, писал сообщение. Нажал отправить - пропало...
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

C, PASCAL (parameter passing conventions)

Сообщение Yufil »

Кстати, у википедов нашёл https://ru.wikipedia.org/wiki/%D0%A1%D0 ... 0%B2%D0%B5

stdcall или winapi
stdcall или winapi — соглашение о вызовах, применяемое в ОС Windows для вызова функций WinAPI.

Аргументы функций передаются через стек, справа налево. Очистку стека производит вызываемая подпрограмма.
PavelNK
Старожил
Сообщения: 280
Зарегистрирован: 15 Март 2011, 8:02

C, PASCAL (parameter passing conventions)

Сообщение PavelNK »

Проверил в debugger'е. Действительно фигня! Что PASCAL, что C, вызов все равно идет C-шный. На самом деле, эта dll - ssleay32.dll не виндусовая, это OpenSSL. При вызове нужно использовать C-шный вызов
SSL_read(LONG SSL, LONG Buffer, LONG BufferSize),LONG,RAW,C,NAME('SSL_read')
Посмотрел паскалевский файл:
function SSL_library_init:Integer; cdecl; external SSL_LIB_NAME;
function SSLv2_client_method:Pointer; cdecl; external SSL_LIB_NAME;
function SSL_CTX_new(meth: Pointer):Pointer; cdecl; external SSL_LIB_NAME;
function SSL_new(ctx: Pointer):Pointer; cdecl; external SSL_LIB_NAME;
function SSL_set_fd(s: pointer; fd: tsocket):Integer cdecl; external SSL_LIB_NAME;
function SSL_connect(ssl: pointer):Integer; cdecl; external SSL_LIB_NAME;
procedure SSL_free(ssl: pointer); cdecl; external SSL_LIB_NAME;
function SSL_read(ssl: pointer; buf: PChar; num: Integer):Integer; cdecl; external SSL_LIB_NAME;
function SSL_write(ssl: pointer; buf: PChar; num: Integer):Integer; cdecl; external SSL_LIB_NAME;
везде cdecl, т.е. C-шные соглашения.
Почему Clarion10 независимо от ключевого слова делает C-шный вызов - загадка. Нужно на других версиях Клары попробовать...
Ответить