Текущий архив: 2011.09.18;
Скачать: CL | DM;
Вниз
Помогите с С на Делфи перевести? Найти похожие ветки
← →
Архип (2011-05-22 15:49) [0]struct - это класс? char, char*, char**, char**** - это какой тип?
struct TS3Functions {
unsigned int (*getClientLibVersion)(char** result);
unsigned int (*spawnNewServerConnectionHandler)(int port, uint64* result);
unsigned int (*destroyServerConnectionHandler)(uint64 serverConnectionHandlerID);
/* Error handling */
unsigned int (*getErrorMessage)(unsigned int errorCode, char** error);
/* Memory management */
unsigned int (*freeMemory)(void* pointer);
/* Logging */
unsigned int (*logMessage)(const char* logMessage, enum LogLevel severity, const char* channel, uint64 logID);
/* Sound */
unsigned int (*getPlaybackDeviceList)(const char* modeID, char**** result);
unsigned int (*getPlaybackModeList)(char*** result);
unsigned int (*getCaptureDeviceList)(const char* modeID, char**** result);
unsigned int (*getCaptureModeList)(char*** result);
unsigned int (*getDefaultPlaybackDevice)(const char* modeID, char*** result);
unsigned int (*getDefaultPlayBackMode)(char** result);
unsigned int (*getDefaultCaptureDevice)(const char* modeID, char*** result);
unsigned int (*getDefaultCaptureMode)(char** result);
unsigned int (*openPlaybackDevice)(uint64 serverConnectionHandlerID, const char* modeID, const char* playbackDevice);
unsigned int (*openCaptureDevice)(uint64 serverConnectionHandlerID, const char* modeID, const char* captureDevice);
};
← →
clickmaker © (2011-05-22 18:30) [1]> struct - это класс?
struct - это record
> unsigned int (*getClientLibVersion)(char** result);
type
TgetClientLibVersion = function(var res: PChar): Cardinal;
дальше - сам, по аналогии
← →
icelex © (2011-05-22 18:34) [2]
> unsigned int (*getPlaybackDeviceList)(const char* modeID,
> char**** result);
у сишников завсегда прикольное чуйстваюмара
← →
clickmaker © (2011-05-22 18:36) [3]> у сишников завсегда прикольное чуйстваюмара
это не настоящий сишник писал. Настоящий бы 5 звездочек написал )
← →
icelex © (2011-05-22 19:14) [4]
> clickmaker © (22.05.11 18:36) [3]
угу, приложение бизнес-класса :)
← →
Leon-Z © (2011-05-22 20:02) [5]В С * - означает то же что и ^ в паскале - указатель.
char* - строка (указатель на массив символов)
char** - матрица символов (указатель на такую матрицу)
char*** - матрица 3D
char**** - матрица 4Dunsigned int (*getClientLibVersion)(char** result)
- указатель на ф-ию, которая возвращает Integer и принимает в качестве параметра указатель на матрицу символов (или массив строк). Аналог процедурный тип в паскале.
Вообще, если говорить о том что char* в С - это строка, то:
char* = ShortString
char** = array [0..0] of ShortString;
char*** = array [0..0, 0..0] of ShortString;
char**** = array [0..0, 0..0, 0..0] of ShortString;
ShortString и String - разные типы в Delphi.
В частности MaxLength(ShortString) = 256 байт, а MaxLength(String) - неограничена.
← →
Dimka Maslov © (2011-05-22 20:27) [6]
> Вообще, если говорить о том что char* в С - это строка,
> то:
>
> char* = ShortString...
Вы перестаньте мне сказать.
type
PChar = ^Char; // char* -- уже определено
PPChar = ^PChar; // char**
PPPChar = ^PPChar; // char***
PPPPChar = ^PPPChar; // char ****
Так и только так.
← →
Leon-Z © (2011-05-22 20:30) [7]
> Dimka Maslov © (22.05.11 20:27) [6]
Нормально :))))))
Тока смысла маловато.
> Так и только так.
В общем согласен.
Но как я написал в [5] то же самое, и еще смысл есть.
← →
Dimka Maslov © (2011-05-22 20:37) [8]
> Leon-Z © (22.05.11 20:30) [7]
char** не прикаких обстоятельствах не может быть ни array[0..0] of ShortString ни array[0..0] of String. ShortString - это старая паскаль-строка, в которой нулевым байтом идёт длина. String - это тип данных с автоматической финализацией у которого до непосредственно содержимого также записана длина и счётчик ссылок.
char** = array[0..0] of PChar - на это я ещё могу согласиться. А что касается array[0..0, 0..0] of Char - это вообще нм в какие ворота не лезет, ибо двумерный массив должет хранить информацию о своей размерности
← →
Leon-Z © (2011-05-22 20:57) [9]
> Dimka Maslov © (22.05.11 20:37) [8]
Плохо паскаль учил в школе.
type
myMas = array [0..0] of тип данных
- это указатель на массив данного типа. Можно сделать так:
var
m: myMas;
i: Integer;
begin
GetMem(m, 100 * SizeOf(тип данных));
for i := 0 to 99 do
m^[i] := значение типа данных
end;
← →
MBo © (2011-05-22 21:08) [10]>myMas = array [0..0] of тип данных
> - это указатель на массив данного типа
Похоже, кто-то здесь чего-то не путает
← →
MBo © (2011-05-22 21:08) [11]чего-то путает
;)
← →
Leon-Z © (2011-05-22 21:36) [12]
> MBo © (22.05.11 21:08) [10]
Сам проверь -
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
myMas = array [0..0] of Integer;
var
m: myMas;
i: Integer;
begin
GetMem(Pointer(m), 100 * SizeOf(Integer));
for i := 0 to 99 do m[i] := i;
for i := 0 to 99 do Write(m[i], " ");
Readln;
FreeMem(Pointer(m), 100 * SizeOf(Integer));
end.
← →
MBo © (2011-05-22 21:58) [13]Не удержался, проверил.
Access Violation, как и положено.
Поясняю -
type
myMas = array [0..0] of Integer;
- это статический массив из одного элемента.
PmyMas = ^myMas;
- это указатель на массив, для него уже можно задействовать динамическое выделение памяти, и обращение к любому элементу в ее пределах (при выключенном range checking)
← →
Palladin © (2011-05-22 22:00) [14]с дуба рухнул советовать такую хрень?
Pointer(m) этим ты говоришь компилятору рассматривать m[0] integer как pointer
а m[i] это тебе очень долго везет
← →
Palladin © (2011-05-22 22:01) [15]упал ты в глазах моих... упал..
← →
Leon-Z © (2011-05-22 22:03) [16]
> MBo © (22.05.11 21:58) [13]
У меня наверное Delphi глючит, раз прога ошибку не выдает.
Да еще и AccessViolation - ваще ЖЕСТЬ !!!!!
Нужно просто было скопировать текст программы и вставить в проект консольного приложения. Не знаю что и как ты проверял, но у меня
все работает.
← →
Leon-Z © (2011-05-22 22:07) [17]
> Palladin © (22.05.11 22:01) [15]
:-D
> PmyMas = ^myMas;
Да, согласен, можно и так.
← →
Германн © (2011-05-22 22:10) [18]
> У меня наверное Delphi глючит, раз прога ошибку не выдает.
>
> Да еще и AccessViolation - ваще ЖЕСТЬ !!!!!
Это ты сам глючишь. AV вовсе не обязана выскакивать.
← →
MBo © (2011-05-22 22:10) [19]>но у меня все работает.
Тебе не повезло.
При попытке написать лажу должен бить по рукам компилятор, а чего он пропустит - рантайм-система отлавливать.
Здесь же в корне неправильные соображения якобы подтвердились, и ты в них уверовал...
← →
!!! (2011-05-22 23:12) [20]
> unsigned int
беззнаковое целое
> uint64
соответственно беззнаковое целое 64 битное
> enum LogLevel
перечислимый тип, соответственно нужно найти его описание и посмотреть, какие константы там определены, чтобы создать аналогию.
Вообще это интернфейсная часть, есть смысл ее переводить?
← →
inoremap (2011-05-23 09:32) [21]http://www.rsdn.ru/forum/humour/4211973.flat.aspx 8-)
← →
Архип (2011-05-23 10:01) [22]
> > unsigned int (*getClientLibVersion)(char** result);
>
> type
> TgetClientLibVersion = function(var res: PChar): Cardinal;
>
может лучше DWORD? или какой тип аналогичный есть в Делфи unsigned int?
← →
RWolf © (2011-05-23 10:26) [23]для DWORD придётся подключать модуль Windows.
> или какой тип аналогичный есть в Делфи unsigned int?
Cardinal и есть.
← →
DiamondShark © (2011-05-23 10:51) [24]
> Нормально :))))))Тока смысла маловато.
У хардкорных сишников есть обычай использовать эзотерическую нотацию с целью идентификации себе подобных и +100500 к ЧСВ. Так что
char** вполне может означать по смыслу массив строк, а char*** -- двумерный массив строк.
А может означать параметр по ссылке (соответственно -- строку и массив строк).
А ещё char* может означать generic pointer, потому что от void* у некоторых возникает когнитивный диссонанс и мозг рака.
А может нихрена не означать, а просто у аффтора либы пиво кочилось.
Разумеется, typedef-ом труЪ сишник не пользуется.
← →
Dimka Maslov © (2011-05-23 12:19) [25]
> Leon-Z © (22.05.11 20:57) [9]
Нам в школе Бейсик преподавали для УКНЦ. Именно поэтому я знаю, что массив нельзя приводить к указателю.
← →
Inovet © (2011-05-23 14:17) [26]> [25] Dimka Maslov © (23.05.11 12:19)
> массив нельзя приводить к указателю
Массив можно даже вызвать как функцию, если никто не запретит.
← →
Архип (2011-05-24 09:46) [27]ребят, раз "char****" - это "PPPPChar", то можно ли писать "^^^^char" в Делфи, по аналогии с С-шным "char****" ?
← →
Dimka Maslov © (2011-05-24 10:16) [28]
> Архип (24.05.11 09:46) [27]
Всегда сначала лучше определить тип. Хотя бы потому, что в описании функции конструкции типа ^^^^char недопустимы.
← →
Архип (2011-05-24 12:20) [29]
> Dimka Maslov
ясненько, а вот еще смотри, такой вопрос (и всем тоже), но для наглядности сокращу пример:struct TS3Functions {
unsigned int (*getClientLibVersion)(char** result);
int (*getAPIVersion)();
void (*getAppPath)(char* path, size_t maxLen);
};
на Делфи будет выглядеть следующим образом:type
size_t: Integer;
PChar: ^Char;
PPChar: ^PChar;
PPPChar: ^PPChar;
TS3Functions = Record
getClientLibVersion = function(result: PPChar): Cardinal;
getAPIVersion = function(): Integer;
getAppPath = procedure(path: PChar, maxLen: size_t);
end;
правильно так будет?
← →
Игорь Шевченко © (2011-05-24 12:28) [30]
> правильно так будет?
практика - критерий истины. Гораздо быстрее скомпилировать и проверить, чем заставлять остальных работать компиляторами
← →
Архип (2011-05-24 12:35) [31]
> Игорь Шевченко
меня прост смущает, что объявляется сразу указатель на функцию и выше был был указан пример с var в аргументах, хотя я так и не понял почему... не сильно я с этим знаком прост, а желание перевести это сишный код огромное ))
на самом деле, там очень много кода - я по аналогии всё сам переделаю, главное понять на правильном ли я пути, чтоб не переделывать потом
← →
Dimka Maslov © (2011-05-24 16:18) [32]
> Архип (24.05.11 12:35) [31]
я бы всё-таки объявил типы
TgetClientLibVersion = function(result: PPChar): Cardinal cdecl;
TgetAPIVersion = function: Integer cdelc;
TgetAppPath = procedure GetAppPath(path PChar; maxLen: Cardinal) cdecl;
← →
han_malign (2011-05-25 08:55) [33]
> unsigned int (*getClientLibVersion)(char** result) - указатель
> на ф-ию, которая возвращает Integer и принимает в качестве
> параметра указатель на матрицу символов (или массив строк)
getClientLibVersion = function(var result: PChar): cardinal;
> char**** = array [0..0, 0..0, 0..0] of ShortString;
array [0..0, 0..0, 0..0] of ShortString
- тождественно эквивалентен структуре
array[0..1*1*1*sizeof(ShortString)-1] of char
но никак не:PListOfPChar = ^TArrayOfPChar;
TListOfPChar = array[word]of PChar;
PGarlandOfPChar = ^TGarlandOfPChar;
TGarlandOfPChar = array[word]of PListOfPChar;
... function( ... , var result: PGarlandOfPChar);
З.Ы. array[word] - размер 65536 задан для того чтобы структуру можно было посмотреть в отладчике на глубину больше чем 0..0
З.З.Ы. Garland - список списков - это ни разу не матрица, а ListOfList - ни разу не красиво....
WARNING: применение функций High, Lenght и SizeOf к структурам TListOfPChar и TGarlandOfPChar - недопустимо, т.к. их жестко заданные границы не имеют ничего общего с реальным количеством данных в списках(скорее всего 0 и Nil терминированных, если счетчик не задан жестко(этот случай лучше обыгрывать строгой типизацией) или не возвращается соответствующей функцией)...
← →
Архип (2011-05-26 11:08) [34]Может, кто-либо взялся бы за трансляцию кода с С++ на Делфи?
Это шаблон плагина для клиента TeamSpeak3. Код на С++ находится в каталоге "pluginsdk" в каталоге с установленной программой.
На сайте разработчика я смотрел, есть там делфи-исходники, но они для более старого билда третьей версии и вылетают с ошибкой из-за несоответствия структуры. Да и код там плохочитабелен.
А здесь всё-таки мастера.
Если готов кто взяться, напишите свой скайп - я бы позвонил обсудить.
Страницы: 1 вся ветка
Текущий архив: 2011.09.18;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.003 c