![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
C++ 2 Delphi [D5, WinXP]
dumb © (2002-12-04 01:09:00)Пожалуйста,
Помогите перевести кусок С++ в Delphi. Я избалован Delphi и незнаю кто тут кому сколько памяти должен. Спасбио.
...
CString strOutFile;
DoSomething(strOutFile.GetBuffer(255));
strOutFile.ReleaseBuffer();
...
Fantasist (2002-12-04 07:02:00) [1]
> strOutFile.GetBuffer(255) возвращает указатель на array
> of CHAR, заполняя его из поля класса
Тут не столь важно, как это устроенно внутри. Копирование происходит не всегда, но главное - возвращается указатель на внутренний буффер.
> а 255 - максимальный размер буфера.
Минимальный.
> strOutFile := Copy(strOutFile, 1, Pos(#0, strOutFile) -
> 1);
А это зачем? Копируем себя в самого себя? Если зарание размер не известен, но точно известно, что DoSomething поставит 0 в конце строки, то можно так:
var
strOutFile: string;
p:^Cardinal;
..
SetLength(strOutFile, 255);
DoSomething(pointer(strOutFile));
p:=Pointer(Integer(strOutFile)-4);
p^:=Pos(#0,strOutFile)-1;
dumb (2002-12-04 01:39:00) [2]скорее всего, наоборот
wam (2002-12-04 01:34:00) [3]StrCopy & StrPCopy
dumb (2002-12-04 01:32:00) [4]да блин... что же со мной! вот нормальный код для размышления без всякого мусора:
var strOutFile: string
..
SetLength(strOutFile, 255);
DoSomething(strOutFile);
strOutFile := Copy(strOutFile, 1, Pos(#0, strOutFile) - 1);
dumb (2002-12-04 01:30:00) [5]Ой.. извините, погнал.
var strOutFile: string
..
SetLength(OutFile, 255);
DoSomething(strOutFile, i);
strOutFile := Copy(strOutFile, 1, Pos(#0, strOutFile) - 1);
wam (2002-12-04 01:30:00) [6]Поправка
strOutFile.GetBuffer(255) возвращает указатель на array of CHAR, заполняя его из поля класса, а 255 - максимальный размер буфера.
В С функция работает с буфером как с массивом символов.
При вызове из Delphi 3 и выше будет преобразование в этот массив.
Если неизвестен механизм функции, надежнее преобразовать string в array of CHAR признак конца строки - chr(0).
strOutFile.ReleaseBuffer() записывает из буфера в поле класса
dumb (2002-12-04 01:28:00) [7]первое, что приходит в голову (и работает)
var strOutFile: string
..
DoSomething(strOutFile, i);
strOutFile := Copy(strOutFile, 1, SmartPos(#0, strOutFile) - 1);
но можно ли красивее?
wam (2002-12-04 01:21:00) [8]var
strOutFile: string;
procedureDoSomething(var str: string);
DoSomething(strOutFile);
strOutFile.GetBuffer(255) возвращает указатель на arrayof PCHAR
strOutFile.ReleaseBuffer() записывает из буфера в поле класса
PVOzerski (2002-12-04 01:18:00) [9]И как такое переводить, не зная устройства С++-ного класса CString? :^(
а формально-то всё просто:
...
var
strOutFile:CString;
...
begin
...
DoSomething(strOutFile.GetBuffer(255));
strOutFile.ReleaseBuffer;
...
Только вот толку-то с такого перевода?