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

Вниз

Помогите с С на Делфи перевести?   Найти похожие ветки 

 
Архип   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
15-1306528204
Юрий
2011-05-28 00:30
2011.09.18
С днем рождения ! 28 мая 2011 суббота


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


15-1306873798
Юрий
2011-06-01 00:29
2011.09.18
С днем рождения ! 1 июня 2011 среда


15-1306064953
Архип
2011-05-22 15:49
2011.09.18
Помогите с С на Делфи перевести?


2-1306852612
MenuItem.Bitmap
2011-05-31 18:36
2011.09.18
Динамически поменять Bitmap у элемента TMenuItem





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский