Текущий архив: 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.48 MB
Время: 0.053 c