![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Совместимость Си и Делфи
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]> один размещает данные со старшего байта к младшему в памяти ... другой наоборот
;)
приведи объявление функции в С-шном файле