1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Есть ли в нашем городе знатоки Visual C++

Тема в разделе "Программирование", создана пользователем Voyager, 03.12.04.

  1. Voyager

    Voyager Активный участник

    3.066
    0
    Есть ли среди форумчан люди, программирующие на С++ или хотя бы знающие его синтаксис? У меня есть пара вопросов (ничего замудреного), но так как я кроме как WinAPI, больше в С++ ничем особо серьезным не занимался, то не могу быстро справится с одной проблемой. Кто не понаслышке знает С++, просьба отозваться.
     
  2. DirectX

    DirectX Активный участник

    1.880
    4
    Ну, ты заходи, если что...

    DirectX добавил [date]1102051430[/date]:
    А вообще могу посоветовать ИМХО лучший русскоязычный ресурс по сабжу с неплохим форумом: www.rsdn.ru - массу ответов на вопросы можно найти там. Если и этого недостаточно - уэлкам на буржуйские сайты: www.codeguru.com и www.codeproject.com
     
  3. Voyager

    Voyager Активный участник

    3.066
    0
    По сути надо перевести на язык Дельфи

    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;
    }
     
  4. Hermes

    Hermes Активный участник

    11.635
    2
    Тут какие-то методы класса 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 могут быть проблемы.
     
  5. pegas

    pegas Участник

    311
    0
    ну полного переноса не получится, FILE не имеет полного аналога в делфях но примерно так

    PboEntry=class
    private
    filename:pchar;
    size:integer;
    unknown:pointer;
    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;

    это без всяких проверок, открытия файла, освобождения памяти и прочего.
     
  6. Voyager

    Voyager Активный участник

    3.066
    0
    pegas
    Функции с точками компилятор не воспринимает.
     
  7. Hermes

    Hermes Активный участник

    11.635
    2
    Voyager
    Да ну? А вы класс нормально объявили? Вы выложили ряд методов класса, которые без этого класса работать не будут. Я правда не помню синтаксиса Делфи, на самом деле там точки нужны или что-то другое, но вам придется реализовывать весь класс либо делать реализацию вышеприведенных вами функций отдельно.

    Я же вроде прокомментировал каждую строчку cpp-шного кода. Если вы знаете Делфи, реализовать что-то подобное не должно составить особого труда.
     
  8. Voyager

    Voyager Активный участник

    3.066
    0
    Все, нормально все перевел на синтаксис дельфи. Через BlockRead и т.д.
    Hermes
    Спасибо, помог.

    Voyager добавил [date]1102546960[/date]:
    Вопрос. Можно ли в Дельфи как то изменить размер буфера во время выполнения программы?
    Buf: array[1..1] of Char;
    Например сделать в
    Buf: array[1..100] of Char;

    SetLength(Buf, Size); не пашет :(
     
  9. Hermes

    Hermes Активный участник

    11.635
    2
    Voyager

    По идее статический массив нельзя увеличить. Попробуте работать с динамическими массивами или напрямую с памятью. Вот только Делфи я оследний раз использовал, года 4 назад, так что тут я не помощник.