Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Совместимость Си и Делфи   Найти похожие ветки 

 
Bazi   (2005-10-18 14:02) [0]

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

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

Спасибо.

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


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

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

;)

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


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

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


 
evvcom ©   (2005-10-18 14:35) [3]


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

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


 
han_malign ©   (2005-10-18 14:35) [4]


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

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

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


> void Decompress

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


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


> han_malign

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

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


 
evvcom ©   (2005-10-18 14:51) [6]

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


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

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

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


 
evvcom ©   (2005-10-18 15:08) [8]


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

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


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


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


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


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


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

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


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

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


 
evvcom ©   (2005-10-18 15:42) [12]

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


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

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


 
evvcom ©   (2005-10-18 16:55) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
2-1129453062
antoxa2005
2005-10-16 12:57
2005.11.06
Для соритировки ADOTable я использую его св-во IndexFieldNames, а


4-1126025128
Gest
2005-09-06 20:45
2005.11.06
WMI библиотека


14-1129388870
Piter
2005-10-15 19:07
2005.11.06
Вопрос по FireFox


4-1125854024
Ландграф Павел
2005-09-04 21:13
2005.11.06
рисовать на канве то, что находится под ней (под формой)


1-1129549303
Trifle
2005-10-17 15:41
2005.11.06
Поменять надписи на кнопках MessageDlg?