не может найти в двойном разыменованном указателе - PullRequest
0 голосов
/ 05 декабря 2010

В моей программе есть другой массив:

data=malloc(sizeof(int)*lines);

Я хочу прочитать данные из файла в этот массив. Я открыл файл и т. Д.

Я создал функцию для чтения данных в этот массив:

int readfile(FILE* fp,int** storage_array,int lines)

{
    int i=0;

    for(i=0; i<lines; i++)
    {
        fscanf(fp,"%lf",&(**storage_array+i));
    }


    rewind(fp);

    return 0;

}

Dev c ++ дает мне

invalid lvalue in unary '&'

Я пробовал так много разных способов заставить это работать, и это действительно меня напрягало: (

У тебя есть идеи, что я делаю не так?

Большое спасибо:)

Ответы [ 2 ]

0 голосов
/ 05 декабря 2010

В C переменная указателя на int (int *) содержит адрес целого числа и может также использоваться для хранения адреса 1-го целого числа в массиве из нескольких, потому что вы можете достичь 2-го ипоследующие целые, просто добавив к адресу 1-го.malloc() дает вам адрес блока памяти, который вы будете использовать для хранения lines последовательных целых чисел, поэтому вы должны хранить адрес, который он вам дает, в переменной указателя на int, и соответствующий параметр readfile()должен иметь этот тип тоже.

Внутри readfile(), вы хотите дать fscanf() call адрес i-го целого числа.Вы можете получить это, просто добавив i к исходному адресу, потому что C позаботится о том, чтобы умножить для вас i на sizeof (int):

int *data;
data=malloc(sizeof(int)*lines);
readfile(fp, data, lines);

...

free(data);    /* Don't forget to release the memory eventually */

...

int readfile(FILE* fp,int* storage_array,int lines)
{
    int i=0;

    for(i=0; i<lines; i++)
    {
        fscanf(fp,"%lf",storage_array+i);
    }


    rewind(fp);

    return 0;

}

Строка fscanf() может быть эквивалентно записана

fscanf(fp,"%lf",&(*(storage_array+i)));

или даже

fscanf(fp,"%lf",&storage_array[i]);

, поскольку в C выражения *(a + b) и a[b] эквивалентны во всех отношениях.

0 голосов
/ 05 декабря 2010

Вы должны очень внимательно посмотреть, как вы используете указатели и как они отображаются в вашем вопросе ...

  1. Использование вашей функции, возвращающей 0, если она читает данные в массив- зачем возвращать 0?Его избыточность делает эту функцию void ....
  2. Ваш недостаток понимания указателей явно слабым ... вы используете переменную с двойным указателем, в которой она передается по ссылке, поэтому вы использовалидвойная де-ссылка, которая неверна - это должна быть одна де-ссылка, поскольку другая звездочка указывает адрес этой переменной ...
  3. Если это то, что вас сбивает с толку, почему бы не сделать это так?Кстати, прочитайте в отдельную переменную и вместо этого поместите переменную в параметр by-reference массива, чтобы было проще избежать сложности и спутать проблему с указателями

См. ниже ... проверка ошибокопущено ....

void readfile(FILE* fp,int** storage_array,int lines)
{
    int i=0;

    for(i=0; i<lines; i++)
    {
        int readval = 0;        
        fscanf(fp,"%d",&readval);
        *(storage_array[i]) = readval;
    }
    rewind(fp);
}
...