Есть ли среди форумчан люди, программирующие на С++ или хотя бы знающие его синтаксис? У меня есть пара вопросов (ничего замудреного), но так как я кроме как WinAPI, больше в С++ ничем особо серьезным не занимался, то не могу быстро справится с одной проблемой. Кто не понаслышке знает С++, просьба отозваться.
Ну, ты заходи, если что... DirectX добавил [date]1102051430[/date]: А вообще могу посоветовать ИМХО лучший русскоязычный ресурс по сабжу с неплохим форумом: www.rsdn.ru - массу ответов на вопросы можно найти там. Если и этого недостаточно - уэлкам на буржуйские сайты: www.codeguru.com и www.codeproject.com
По сути надо перевести на язык Дельфи PboEntry::PboEntry() { filename[0]=0; size=0; memset(unknown,0,16); } int PboEntry::Read(FILE *f) { while(1) { char c=fgetc(f); if (c==char(0)) break; filename+=c; } fread(unknown,1,16,f); fread(&size,1,4,f); if (size==0) return 0; return 1; } int PboEntry::Write(FILE *f) { fwrite(filename.c_str(),1,filename.size(),f); fputc(char(0),f); fwrite(unknown,1,16,f); fwrite(&size,1,4,f); return 1; }
Тут какие-то методы класса PboEntry приведены. Попробуем прокомментировать. PboEntry::PboEntry() { // Здесь filename – это член класса PboEntry либо глобальная переменная // это строка типа string. Концом строки является // символ с кодом 0 (ноль) // то есть здесь фактически filename присваивается значение «пустая строка» filename[0]=0; // ну тут понятно, инициализация члена класса либо глобальной переменной size // нулем size=0; // unknown – это указатель на массив, скорее всего на строку типа char[ ] // 0 – это код символа, которым надо заполнить массив // 16 – это количество элементов массива, которые надо проинициализировать // вообще memset заполняет область памяти значением второго параметра memset(unknown,0,16); } // из файла f читаются данные int PboEntry::Read(FILE *f) { // бесконечный цикл while(1) { //читается символ из файла, на который указывает f. Значение помещается в с char c=fgetc(f); // если считали символ с кодом 0, выходим из цикла if (c==char(0)) break; // тут к строке filename добавляется считанный символ (в конец) filename+=c; } // в unknown из файла f читается 16 байт fread(unknown,1,16,f); // в size из файла f читается 4 байта (скорее всего значение типа int) fread(&size,1,4,f); // если size=0 возвращаем 0 if (size==0) return 0; // иначе возвращаем 1 return 1; } // в файл f пишутся данные int PboEntry::Write(FILE *f) { // пишем в файл f // пишем данные из буфера filename (строка) // размерность ячейки буфера 1 байт // величина буфера = длине строки filename fwrite(filename.c_str(),1,filename.size(),f); // пишем символ с кодом 0 fputc(char(0),f); // пишем в файл f из буфера unknown 16 байт fwrite(unknown,1,16,f); // пишем в файл f целочисленное(?) значение size fwrite(&size,1,4,f); //возвращаем 1 return 1; } Во всех функциях f – это указатель на объект типа FILE. Значение этого указателя инициализируется при открытии или создании файла. Что-то более определенное сказать трудно, т.к. тут приведены куски реализации класса PboEntry, и для чего он предназначен – не очень понятно. Эти куски, насколько я понял, предназначены для считывания из некоего файла имени другого файла и набора параметров, а также для записи всего этого обратно в файл. Hermes добавил [date]1102321956[/date]: Только я не понял, при чем тут Visual C++? Им тут вроде как и не пахнет. И вообще, код какой-то странноватый что-ли. Настораживает наличие бесконечного цикла. Если этому коду скормить большой файл, не содержащий символа с кодом 0 могут быть проблемы.
ну полного переноса не получится, FILE не имеет полного аналога в делфях но примерно так PboEntry=class private filenamechar; size:integer; unknownointer; public constructor create; function read(f:thandle):integer; function write(f:thandle):integer; end; ..... constructor PboEntry.create; var s1,s2:string; begin size:=0; GetMem(unknown,16); FillChar(unknown^,16,0); end; function PboEntry.read(f: thandle): integer; var c:char; i:integer; j:integer; begin i:=0; FileRead(f,c,1); while (c<>char(0)) do begin filename:=c; i:=i+1; FileRead(f,c,1); end; FileRead(f,unknown^,16); FileRead(f,size,4); if (size=0) then Result:=1 else Result:=0; end; function PboEntry.write(f: thandle): integer; var i:char; begin i:=char(0); FileWrite(f,filename^,length(filename)); FileWrite(f,i,1); FileWrite(f,unknown^,16); FileWrite(f,size,4); end; это без всяких проверок, открытия файла, освобождения памяти и прочего.
Voyager Да ну? А вы класс нормально объявили? Вы выложили ряд методов класса, которые без этого класса работать не будут. Я правда не помню синтаксиса Делфи, на самом деле там точки нужны или что-то другое, но вам придется реализовывать весь класс либо делать реализацию вышеприведенных вами функций отдельно. Я же вроде прокомментировал каждую строчку cpp-шного кода. Если вы знаете Делфи, реализовать что-то подобное не должно составить особого труда.
Все, нормально все перевел на синтаксис дельфи. Через BlockRead и т.д. Hermes Спасибо, помог. Voyager добавил [date]1102546960[/date]: Вопрос. Можно ли в Дельфи как то изменить размер буфера во время выполнения программы? Buf: array[1..1] of Char; Например сделать в Buf: array[1..100] of Char; SetLength(Buf, Size); не пашет
Voyager По идее статический массив нельзя увеличить. Попробуте работать с динамическими массивами или напрямую с памятью. Вот только Делфи я оследний раз использовал, года 4 назад, так что тут я не помощник.