Помогите перевести функцию C++ -> Delphi

KOJAN

Местный
Регистрация
26 Ноя 2008
Сообщения
22
Реакции
5
Credits
24
Очень нужна функция, а С++ я не знаю
Код:
bool __declspec(dllexport) _stdcall GenerateGuide(char* filename, bool extract)
{
	FILETIME ft;
	SYSTEMTIME st;
	FILE *f1;
	int f2,f3;
	char name[5000];

//	printf("JTV 3.0 TVGuide generator v3\n");
//	error(argc<2,"Usage: guidegen.exe filename_without_extension [/extract]\n");

	char sf1[100];sprintf(sf1,"%s.txt",filename);
	char sf2[100];sprintf(sf2,"%s.ndx",filename);
	char sf3[100];sprintf(sf3,"%s.pdt",filename);

	if(!extract){
		
		f1=fopen(sf1,"rt");error(!f1,"Can't open file .txt!\n");
		f2=open(sf2,O_RDWR|O_BINARY|O_CREAT|O_TRUNC,_S_IWRITE|_S_IREAD);
		f3=open(sf3,O_RDWR|O_BINARY|O_CREAT|O_TRUNC,_S_IWRITE|_S_IREAD);
		error(f2<0 || f3<0,"Can't open file .ndx or .pdt!\n");

		int nelem=0;
		write(f2,&nelem,2);

		char jtvsgn[]="JTV 3.x TV Program Data\x0a\x0a\x0a";
		write(f3,jtvsgn,26);

		int offset=0x1a;

		while(7==
			fscanf(f1,"%hd %hd %hd %hd %hd %hd %[^\n]",
				&st.wDay,
				&st.wMonth,
				&st.wYear,
				&st.wHour, 
				&st.wMinute, 
				&st.wDayOfWeek,
				name
			)){

			st.wSecond=0;
			st.wMilliseconds=0;
			SystemTimeToFileTime(&st,&ft);

			int tmp=0;
			write(f2,&tmp,2);

			write(f2,&ft,8);

			write(f2,&offset,2);

			int len=strlen(name);
			write(f3,&len,2);
			write(f3,name,len);

			offset+=len+2;
			nelem++;

		}

		lseek(f2,0,SEEK_SET);
		write(f2,&nelem,2);

		//printf(".ndx and .pdt files created success.\n");

	}else{

		error(!extract,"Incorrect option!\n");

		f1=fopen(sf1,"wt");error(!f1,"Can't open file .txt!\n");
		f2=open(sf2,_O_RDONLY|O_BINARY);
		f3=open(sf3,_O_RDONLY|O_BINARY);
		error(f2<0 || f3<0,"Can't open file .ndx or .pdt!\n");

		int nelem=0;
		error(read(f2,&nelem,2)<0,"Read error!\n");
		for(int i=0;i<nelem;i++){
			int tmp;
			read(f2,&tmp,2);
			read(f2,&ft,8);
			FileTimeToSystemTime(&ft,&st);
	
			fprintf(f1,"%d %d %d %d %d %d\n",
				st.wDay,
				st.wMonth,
				st.wYear,
				st.wHour, 
				st.wMinute, 
				st.wDayOfWeek?st.wDayOfWeek:7
			);

			long offset=0;
			read(f2,&offset,2);
			lseek(f3,offset,SEEK_SET);
			int len=0;
			read(f3,&len,2);
			read(f3,name,len);name[len]=0;
			fprintf(f1,"%s\n",name);
		}

		//printf(".txt file created success.\n");

	}
	
	fclose(f1);
	close(f2);
	close(f3);

	return true;
}
Заранее спасибо
 

Баклан

Местный
Регистрация
7 Янв 2010
Сообщения
5
Реакции
8
Credits
10
А что делает функция?
Может легче не переводить в Delphi, а написать с нуля?
 

delphip

Турист
Регистрация
5 Мар 2011
Сообщения
1
Реакции
0
Credits
2
Проще написать самому, если Вы понимаете что должна делать данная функция
 

alchemist131

Турист
Регистрация
16 Ноя 2010
Сообщения
10
Реакции
0
Credits
21
Функция уже почти на паскале :)
Нужно только заменить скобки {} на begin end, вставить then после if, добавить двоеточие в присваивание, поменять имена типов и т.д. - техническая работа
Самое "сложное" - работа с консолью и файлами. Хотя и здесь синтаксис функций схож: sprintf и printf заменяются на write (writeln), fopen и open - на FileOpen.

Функцию error и модификатор _stdcall нужно исключить - они лишние. Модификатор __declspec(dllexport) в делфи должен быть почти в таком же виде.
 

KOJAN

Местный
Регистрация
26 Ноя 2008
Сообщения
22
Реакции
5
Credits
24
После перевода не работает функция:
Код:
function GenerateGuide(filename:char; extract:boolean):boolean;
const
        jtvsgn='JTV 3.x TV Program Data\x0a\x0a\x0a';
        offset=0x1a;
var
	ft:TFileTime;
	st:TSystemTime;
	f1,f2,f3:File;
	name:char[5000];
        sf1:char[100];
 	sf2:char[100];
	sf3:char[100];
     	nelem:integer;
        tmp:integer;
begin
	write(sf1,"%s.txt",filename);
	write(sf2,"%s.ndx",filename);
	write(sf3,"%s.pdt",filename);
	if not extract then begin		
		f1:=FileOpen(sf1,"rt");
		f2:=FileOpen(sf2,O_RDWR|O_BINARY|O_CREAT|O_TRUNC,_S_IWRITE|_S_IREAD);
		f3:=FileOpen(sf3,O_RDWR|O_BINARY|O_CREAT|O_TRUNC,_S_IWRITE|_S_IREAD);
		nelem:=0;
		write(f2,&nelem,2);
		write(f3,jtvsgn,26);
		while(7==
			fscanf(f1,"%hd %hd %hd %hd %hd %hd %[^\n]",
				&st.wDay,
				&st.wMonth,
				&st.wYear,
				&st.wHour, 
				&st.wMinute, 
				&st.wDayOfWeek,
				name
			)) do begin
			st.wSecond=0;
			st.wMilliseconds=0;
			SystemTimeToFileTime(&st,&ft);
			int tmp=0;
			write(f2,&tmp,2);
			write(f2,&ft,8);
			write(f2,&offset,2);
			int len=strlen(name);
			write(f3,&len,2);
			write(f3,name,len);
			offset+=len+2;
			nelem++;

		end;
		lseek(f2,0,SEEK_SET); //Что это?
		write(f2,&nelem,2);
	end else begin
		f1:=FileOpen(sf1,"wt");
		f2:=FileOpen(sf2,_O_RDONLY|O_BINARY);
		f3:=FileOpen(sf3,_O_RDONLY|O_BINARY);
		nelem:=0;
		for(int i=0;i<nelem;i++) do begin
			read(f2,&tmp,2);
			read(f2,&ft,8);
			FileTimeToSystemTime(&ft,&st);
			fprintf(f1,"%d %d %d %d %d %d\n",
				st.wDay,
				st.wMonth,
				st.wYear,
				st.wHour, 
				st.wMinute, 
				st.wDayOfWeek?st.wDayOfWeek:7
			);
			long offset=0;
			read(f2,&offset,2);
			lseek(f3,offset,SEEK_SET);
			int len=0;
			read(f3,&len,2);
			read(f3,name,len);name[len]=0;
			write(f1,"%s\n",name);
		end;

	end;
	fclose(f1);
	close(f2);
	close(f3);
	return:=true;
end;
 

osvirt

Турист
Регистрация
18 Янв 2010
Сообщения
2
Реакции
0
Credits
4
тебе реально проще заново переписать функцию, т.к. при твоем "переводе" всё, после строчки "begin" теряют смысл.

если в С++
Код:
char sf1[100];sprintf(sf1,"%s.txt",filename);
объявляет переменную sf1 и присваивает ей значение <filename>.txt
то твоя
Код:
write(sf1,"%s.txt",filename);
делает ваще не пойми чего...


так что выясни, чего твоя функция делать должна и оттуда уже пляши ;)
 

yura371

Турист
Регистрация
26 Фев 2012
Сообщения
4
Реакции
0
Credits
88
Может можно скомпилить этот код в C++ Builder, посмотреть машинный код и выполнить его уже в Delphi.
 

dustypup

Турист
Регистрация
27 Ноя 2008
Сообщения
21
Реакции
1
Credits
57
Скомпилируй dll с этой функцией и используй её из дельфи.
 

May3ep

Местный
Регистрация
5 Ноя 2009
Сообщения
8
Реакции
0
Credits
130
"Не смешно" за ради одной функции с dll заморачиваться