Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.036 c
3-1127894734
axx
2005-09-28 12:05
2005.11.06
FireBird SQL синтаксис


1-1129296155
Sysanin
2005-10-14 17:22
2005.11.06
Проигрывание звука из DLL


14-1129106888
Андрей Жук
2005-10-12 12:48
2005.11.06
Нынешняя молодежь - самая образованная в истории человечества


6-1121587327
Gamer
2005-07-17 12:02
2005.11.06
Много скриншотов


2-1129295255
MAcK
2005-10-14 17:07
2005.11.06
Звук





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский