Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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**** - матрица 4D

unsigned 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.56 MB
Время: 0.007 c
15-1306480585
OW
2011-05-27 11:16
2011.09.18
Старая программка вылетает TProgressBar property out of range


2-1306830994
supergraf3000
2011-05-31 12:36
2011.09.18
просмотр html-кода


2-1307097736
unknown2
2011-06-03 14:42
2011.09.18
бинаризация изображения


15-1306268993
Юрий
2011-05-25 00:29
2011.09.18
С днем рождения ! 25 мая 2011 среда


2-1306758953
And7
2011-05-30 16:35
2011.09.18
Если в строке есть символ, то