Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перенос функции с с++ на паскаль

9.6K
21 января 2005 года
Гриша123
3 / / 21.01.2005
Есть функция, написанная на с++(с) мне нужно написать её на паскале.
Только такое ощущение, что функции выполняющие по описанию одни и те же действия работают в разных языках по-разному!

Если кто-нибуть сможет пришлите на мыло:
[email]kovalenko_gr@mail.nnov.ru[/email]

сама функция:

CRCTAB_16 - массив шестнадцатиричных чисел

DWORD calcCRC16(DWORD iPrevSumm, BYTE *btArr, UINT iLen)
{
for(int i = 0; i < iLen; i++)
iPrevSumm = (CRCTAB_16[(iPrevSumm>>8 ) & 0xFF] ^ iPrevSumm<<8 ^ btArr) & 0xFFFF;
return iPrevSumm;
}


iPrevSumm - предыдущая сумма
btArr() - байтовый входной массив, контрольное число которого надо получить
iLen - длина байтового массива
259
22 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Гриша123
Есть функция, написанная на с++(с) мне нужно написать её на паскале.
Только такое ощущение, что функции выполняющие по описанию одни и те же действия работают в разных языках по-разному!

Если кто-нибуть сможет пришлите на мыло:
[email]kovalenko_gr@mail.nnov.ru[/email]

сама функция:

CRCTAB_16 - массив шестнадцатиричных чисел

DWORD calcCRC16(DWORD iPrevSumm, BYTE *btArr, UINT iLen)
{
for(int i = 0; i < iLen; i++)
iPrevSumm = (CRCTAB_16[(iPrevSumm>>8 ) & 0xFF] ^ iPrevSumm<<8 ^ btArr) & 0xFFFF;
return iPrevSumm;
}


iPrevSumm - предыдущая сумма
btArr() - байтовый входной массив, контрольное число которого надо получить
iLen - длина байтового массива


Поставь в определении функции модификатор __pascal и можешь вызывать ее в паскале без переписывания.

9.6K
22 января 2005 года
Гриша123
3 / / 21.01.2005
Наверно я чего-то не понял, но у меня на слове "__pascal" выдает ошибку

Если можно объясните по подробнее...

И как быть если эта функция находится в dll-ке(что изменится???)
259
22 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by Гриша123
Наверно я чего-то не понял, но у меня на слове "__pascal" выдает ошибку

Если можно объясните по подробнее...

И как быть если эта функция находится в dll-ке(что изменится???)


С++ и Паскалевские функции отличаются способом передачи параметров. У Борланда есть модификаторы, которые указывают компилятору каким образом данная функция передает параметры.
Вот Help из Delphi7
When you declare a procedure or function, you can specify a calling convention using one of the directives register, pascal, cdecl, stdcall, and safecall. For example,

function MyFunction(X, Y: Real): Real; cdecl;
...

Calling conventions determine the order in which parameters are passed to the routine. They also affect the removal of parameters from the stack, the use of registers for passing parameters, and error and exception handling. The default calling convention is register.

The register and pascal conventions pass parameters from left to right; that is, the left most parameter is evaluated and passed first and the rightmost parameter is evaluated and passed last. The cdecl, stdcall, and safecall conventions pass parameters from right to left.
For all conventions except cdecl, the procedure or function removes parameters from the stack upon returning. With the cdecl convention, the caller removes parameters from the stack when the call returns.

The register convention uses up to three CPU registers to pass parameters, while the other conventions pass all parameters on the stack.
The safecall convention implements exception "firewalls." On Windows, this implements interprocess COM error notification.

The table below summarizes calling conventions.

Calling conventions
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
The default register convention is the most efficient, since it usually avoids creation of a stack frame. (Access methods for published properties must use register.) The cdecl convention is useful when you call functions from shared libraries written in C or C++, while stdcall and safecall are recommended, in general, for calls to external code. On Windows, the operating system APIs are stdcall and safecall. Other operating systems generally use cdecl. (Note that stdcall is more efficient than cdecl.)

The safecall convention must be used for declaring dual-interface methods. The pascal convention is maintained for backward compatibility. For more information on calling conventions, see Program control.
The directives near, far, and export refer to calling conventions in 16-bit Windows programming. They have no effect in 32-bit applications and are maintained for backward compatibility only.

9.6K
22 января 2005 года
Гриша123
3 / / 21.01.2005
Большое спасибо!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог