почему я получаю переменную - используется без инициализированной ошибки? - PullRequest
0 голосов
/ 28 февраля 2012

Я хочу использовать эту программу для записи хеш-таблицы в файл, но я получаю

не могу преобразовать параметр 1 из 'fpinfo' в 'const void *'

ошибка во время компиляции

при изменении struct fpinfo e; на struct fpinfo *e я получаю ошибку времени выполнения:

Переменная 'e' используется без инициализации.

Я попытался инициализировать e, объявив его как struct fpinfo *e=NULL;.Это тоже не работает.

Пожалуйста, помогите мне, как обычно.

WriteHTtoFile(struct fpinfo t[][B_ENTRIES],int this_tanker,tanker_record tr[][BUCKETS])
{
    //struct fpinfo *e;
    struct fpinfo e;
    int i=0, mask;
    char filename[sizeof ("file0000.txt")];
    sprintf(filename, "filee%d.txt", this_tanker);
    curr_tanker++;
    //fp = fopen(filename,"w");
    FILE *htfile=fopen(filename,"w+b");
     system("cls");
if (htfile != NULL)  
        { 
         for (int j = 0; j < BUCKETS; ++j) 
        {
            for (int k = 0; k < tr[this_tanker][j].bkt.num_of_entries; ++k)
            {
            printf("%d\t%d\t%s\n",t[j][k].chunk_offset,t[j][k].chunk_length,t[j][k].fing_print);
            (e).chunk_offset=t[j][k].chunk_offset;
            (e).chunk_length=t[j][k].chunk_length;
            strcpy((char*)((e).fing_print),(char*)t[j][k].fing_print);
            fwrite(e,sizeof(fpinfo),1,htfile);
            }
        } 
            fclose(htfile); 
         } 
        else 
        { 
            std::cout<<"File could not be opend for writing";
            printf("Error %d\t\n%s", errno,strerror(errno));
        }

    fclose(htfile);
    return 1;
}

1 Ответ

3 голосов
/ 28 февраля 2012

Первый аргумент fwrite() - это const void*.Это передает struct fpinfo:

fwrite(e, sizeof(fpinfo), 1, htfile);

Изменить на:

fwrite(&e, sizeof(fpinfo), 1, htfile);

Я не уверен, что члены struct fpinfo, так что это может быть небезопасно (если, например,он содержит любые указатели членов).Любое будущее изменение порядка элементов в struct fpinfo или изменение, которое приводит к увеличению размера struct fpinfo (например, добавление новых членов), означает, что любая попытка прочитать ранее записанные данные struct fpinfo будет неверной.

Когда объявление e было изменено на struct fpinfo* e;, унифицированная ошибка произошла из-за того, что указатель не был равен NULL или был назначен динамически распределенному struct fpinfo.

При изменении на struct fpinfo *e = NULL; thisвызовет ошибку сегментации, когда попытка доступа к любому элементу e произошла, поскольку он не указывает на struct fpinfo.

...