day & night

Перевести код с C на Delphi, Программирование
Дата обновления: , перейти к новому сообщению
#1
Soloton



Грамотный
Group Icon

Группа: Наши Люди
Сообщений: 292
Регистрация: 18.12.2005
Из: Невинномысск
Пользователь №: 88.260


Респектов: 72
-----X----




Есть код на C++:
» Нажмите, для открытия спойлера | Press to open the spoiler «

Нужно сделать аналог функции на Delphi. Особенностью задачи является использование API и обязательный отказ от громоздких модулей типа SysUtils, в идеале нужно вообще оставить в uses только Windows.
Прошу помощи.
User is offline
Go topGo end
 

Ответов(1 - 6)
26.08.2009 - 16:52
#2
yah



профи!
[SoftoRooMTeaM] Group Icon

Группа: Наши Люди
Сообщений: 2.336
Регистрация: 27.01.2006
Из: рнд
Пользователь №: 500


Респектов: 408
-----XXX--




Если ты хочешь использовать API-функции, то никаких проблем, связанных с языком C++\Delphi, возникнуть не должно, т.к. API - он и в африке API.
Если брать СИ-шные функии, то для них есть аналоги в Делфи:
1. "xf_malloc" - не встречался. Встречалась только функция malloc (если язык - С++, то куда уместнее было бы использовать new\delete для работы с памятью).
Для Си-шного "malloc" есть делфи-аналоги GetMem/FreeMem, New/Dispose, либо SetLength/Finalize.
2. "memset" - можно использовать ZeroMemory.
3. Для работы с указателями вместо СИ-шных *\& используется делфи-аналоги ^\@.
User is offline
Go topGo end
27.08.2009 - 7:19
#3
Soloton



Грамотный
Group Icon

Группа: Наши Люди
Сообщений: 292
Регистрация: 18.12.2005
Из: Невинномысск
Пользователь №: 88.260


Респектов: 72
-----X----




Цитата | Quote(yah @ 26.08.2009 - 16:52)
"xf_malloc" - не встречался.
*

Это оболочка для malloc, используется по всему коду, который перевожу, можно префикс xf_ опустить, смысл от этого не поменяется.

Собственно проблемы с fgets (). Что из Delphi-функций может быть использовано вместо неё? Пробовал так:
» Нажмите, для открытия спойлера | Press to open the spoiler «

Получаю AV при попытке освобождения памяти. Если не использовать ReadFile, то всё нормально, правда тогда ф-я вообще ничего не читает.
User is offline
Go topGo end
27.08.2009 - 10:06
#4
yah



профи!
[SoftoRooMTeaM] Group Icon

Группа: Наши Люди
Сообщений: 2.336
Регистрация: 27.01.2006
Из: рнд
Пользователь №: 500


Респектов: 408
-----XXX--




Цитата | Quote
function ReadString (Afile: hFile; Dest: PChar; nDestLength, nCodePage: DWORD): PChar;
var
lpDest: PAnsiChar;
nLength: integer;
nNewLength: integer;
begin
GetMem(lpDest, (nDestLength+1));
FillMemory(lpDest, (nDestLength+1), 0);
ReadFile(Afile, lpDest^, nDestLength, nDestLength, nil);
if nDestLength <> 0 then begin
  MultiByteToWideChar(CP_OEMCP, 0, lpDest, nDestLength, Dest, nDestLength);
  end
else begin
 FreeMem(lpDest); - освободили память....
  exit;
  end;
FreeMem(lpDest); // <-- "Тут AV". Пытаемся освободить память, которую освободили ранее. Получаем AV.
GetMem(Result, nDestLength+1);
lstrcpy(Result, Dest);
lstrcat(Result, #0);
end;
User is offline
Go topGo end
27.08.2009 - 10:48
#5
stepanyk



Грамотный
***

Группа: Пользователи
Сообщений: 232
Регистрация: 5.10.2006
Пользователь №: 241.996


Респектов: 55
-----X----


Предупреждений: 0


yah,
это тут не при чем:
» Нажмите, для открытия спойлера | Press to open the spoiler «


а может попробовать CloseHandle сделать? Вдруг поможет:
» Нажмите, для открытия спойлера | Press to open the spoiler «
User is offline
Go topGo end
27.08.2009 - 11:03
#6
Soloton



Грамотный
Group Icon

Группа: Наши Люди
Сообщений: 292
Регистрация: 18.12.2005
Из: Невинномысск
Пользователь №: 88.260


Респектов: 72
-----X----




Цитата | Quote(stepanyk @ 27.08.2009 - 10:48)
а может попробовать CloseHandle сделать?
*

BOOL WINAPI ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);
Как интересно ваш код сработает, если API-функция ReadFile возвращает совсем не хэндл файла? Я его в парамертрах к своей функции пишу, и закрываю вне функции.
User is offline
Go topGo end
27.08.2009 - 11:05
#7
yah



профи!
[SoftoRooMTeaM] Group Icon

Группа: Наши Люди
Сообщений: 2.336
Регистрация: 27.01.2006
Из: рнд
Пользователь №: 500


Респектов: 408
-----XXX--




Цитата | Quote(stepanyk @ 27.08.2009 - 11:48)
это тут не при чем:
*


Тогда следует проверить функцию GetMem(lpDest, (nDestLength+1)).
Может, по неизвестной причине, не происходит выделения памяти.
Советы:
1. Смотреть в отладчике шаг GetMem(lpDest, (nDestLength+1));
2. Посмотреть адрес, на который указывает указатель lpDest после вызова MultiByteToWideChar(CP_OEMCP, 0, lpDest, nDestLength, Dest, nDestLength);
3. Посмотреть адрес, на который указывает указатель lpDest до и после первого вызова FreeMem(lpDest);
4. Посмотреть адрес, на который указывает указатель lpDest до и после второго вызова FreeMem(lpDest);
5. "а может попробовать CloseHandle сделать? Вдруг поможет:"(с)
User is offline
Go topGo end

Topic Options
Сейчас: 27.04.2024 - 20:37
Мобильная версия | Lite версия