Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Совместимость Си и Делфи


Bazi ©   (2005-10-18 14:02:00) 

Использую ф-цию из сторонней библиотеки, написанной на Си. Ей передается буфер с данными и их длинна (указатель на переменную содержащую длинну). Непонятно с тем - как правильно передать длинну. Слышал, что Делфи и Си отличаются форматом данных в памяти типа Integer.
(Вроде бы, как говорили, один размещает данные со старшего байта к младшему в памяти ... другой наоборот)

Хотел бы услышать от мастеров правильное решение данной задачи.
И какие еще подводные камни могут меня ожидать?

Спасибо.

P.S. Я должен передать именно указатель на переменную содержащую длинну.


evvcom   (2005-10-18 16:55:00) [1]

<offtop>
Гы-гы... шЮтка! :)
</offtop>


Германн   (2005-10-18 16:10:00) [2]

2 evvcom ©   (18.10.05 15:42) [12]
Ну ты и злопамятный! :)


evvcom   (2005-10-18 15:42:00) [3]

А... ну да. :) Это я за рожки отыгрался :-)


Германн   (2005-10-18 15:28:00) [4]

2 evvcom ©   (18.10.05 15:20) [10]
А я с тобой и не спорил. Когда писал свой ответ, твоего ещё не было :)


evvcom   (2005-10-18 15:20:00) [5]


> Если речь при этом идёт и о разных процессорах

И тем не менее, это уже не зависит от языка программирования, а зависит от архитектуры процессора. Компилятор, написанный под этот процессор, сам разберется, в каком порядке должны следовать байты, и мы своим кодом никак не можем на это повлиять. Так что я остаюсь при своем мнении.


Германн   (2005-10-18 15:09:00) [6]


> А поповоду порядка байтов в разных языках программирования
> - это чушь получается?


Если речь при этом идёт и о разных процессорах, то может быть и не чушь.


evvcom   (2005-10-18 15:08:00) [7]


> поповоду порядка байтов в разных языках программирования - это чушь получается?

Однозначно. Но если все же имелся ввиду порядок аргументов, то это уже не чушь.


Bazi   (2005-10-18 14:57:00) [8]

Написал так:
procedure Decompress(Dest: PChar; const Src: PChar; var Dest_Size, Src_Size: Integer); cdecl; external 'dec.dll';
и вроде бы прошло.

А поповоду порядка байтов в разных языках программирования - это чушь получается?


evvcom   (2005-10-18 14:51:00) [9]

Попробуй
procedure Decompress(Dest: PChar; const Src: PChar; var Dest_Size, Src_Size: Integer); cdecl;
может пройдет.


Bazi   (2005-10-18 14:40:00) [10]


> han_malign

В заголовочном файле нашел в таком ввиде:
extern "C" void Decompress(char *dest, const char *src, int *dest_size, int *src_size);

Как мне теперь ее правильно в Делфи обявить?


evvcom   (2005-10-18 14:35:00) [11]


> один размещает данные со старшего байта к младшему в памяти
> ... другой наоборот

Байты в слове (двойном слове) и тот и другой размещают одинаково, потому как процессор их в свои регистры грузит точно также. А вот соглашений о вызовах функций и процедур существует несколько видов: fastcall, stdcall, cdecl, safecall и еще вроде как thiscall он называется. Сишный компилятор, по-моему по умолчанию cdecl применяет.


han_malign   (2005-10-18 14:35:00) [12]


> один размещает данные со старшего байта к младшему в памяти ... другой наоборот

- параметры в стек они по разному размещают, в зависимости от соглашения по вызовам (stdcall, cdecl). А Integer, на Intel платфорамах, в машинном представлении - всегда Little endian...

З.Ы. Big endian - встречается, в основном, в сетевых пакетах(так дамп проще читать), и - в машинном представлении - то-ли на Маках, то-ли на Спарках, то-ли вообще не Ваксах(короче, есть какя-то экзотическая платформа)...


> void Decompress

- а там ничего больше нет, вроде Extern "C", __declspec(...), APICALL- какой-нибудь?


Bazi   (2005-10-18 14:15:00) [13]

void Decompress(char *dest, const char *src, int *dest_size, int *src_size);


MBo   (2005-10-18 14:05:00) [14]

> один размещает данные со старшего байта к младшему в памяти ... другой наоборот

;)

приведи объявление функции в С-шном файле


Наверх

Титульная страница Поиск, карта сайта Написать письмо