передача массива структуры в качестве параметра функции

#c

#c

Вопрос:

 typedef struct What_if
{
    char   price                 [2];
} what_if ;

what_if  what_if_var[100];

int format_input_records();

int process_input_records(what_if *what_if_var);

int format_input_records()
{
    if (infile != NULL )
    {
        char mem_buf [500];

        while ( fgets ( mem_buf, sizeof mem_buf, infile ) != NULL ) 
        {
            item = strtok(mem_buf,delims);     
            strcpy(what_if_var[line_count].trans_Indicator,item) ;
            printf("ntrans_Indicator     ==== : : %s",what_if_var[line_count].price);
            process_input_records(amp;what_if_var);
            line_count=line_count 1;
        }
    }
}

int process_input_records(what_if *what_if_var)
{
    printf("nfund_price process_input_records    ==== : : %s",what_if_var[line_count]->price);
    return 0;
}
  

Я сталкиваюсь с ошибкой здесь, может кто-нибудь, пожалуйста, сказать мне, в чем ошибка, которую я допустил здесь?

Назначение аргумента функции между типами « struct {...}* » и « struct {...}(*)[100] » не допускается.

Ожидаемый указатель на структуру или объединение.

Комментарии:

1. Также, пожалуйста, поработайте над отступом в коде. Трудно увидеть, какая закрывающая скобка соответствует открывающей.

2. Назначение аргумента функции между типами «struct {…}*» и «struct {…}(*)[100]» не допускается.

3. Ваш пример кода является неполным и в любом случае не будет компилироваться (например, trans_Indicator отсутствует в предоставленной вами структуре What_if). Откуда берется line_count и т.д…

4. Я полагаю, что по крайней мере одна из ваших проблем заключается в следующем: «what_if_var[line_count]-> price» должно быть «what_if_var[line_count].price» поскольку ‘what_if * what_if_var’ указывает на массив объектов, «what_if_var [line_count]» ссылается на фактический объект, а не указатель на объект, поэтому вам не нужно использовать оператор «->»

Ответ №1:

Массив по сути уже является указателем на некоторое пространство памяти, где была выделена длина массива. Поэтому вы должны просто сделать:

 process_input_records(what_if_var);
  

без amp;

Комментарии:

1. -1 за предположение, что malloc где-то близко похож на var[100] (iow: мне больше понравился ваш ответ, когда он еще не включал последнее предложение 🙂

2. @mmutz В моем ответе я говорю, что объявление переменных в некотором роде эквивалентно. Я не говорю, что malloc эквивалентен объявлению массива. Моя точка зрения на malloc заключается только в том, чтобы дать подсказку с ответом. Я старался быть осторожным, когда писал это, чтобы не сделать вывод, что malloc был эквивалентен — только то, что объявления являются своего рода эквивалентными.

3. @msalvadores: но они даже не являются «своего рода» эквивалентом. Я помню, когда я впервые попытался определить разницу между хранилищем стека и кучи. Если бы я тогда сказал, что они были «своего рода» эквивалентны, это довольно сильно сбило бы меня с толку. Не говорю, что jcrshankar такой уж новичок, но я уверен, что некоторые новички в C / C наткнутся на этот вопрос и поймут неправильное представление : (

4. @mmutz Чтобы не вводить людей в заблуждение, я согласен с вами, лучше удалить это. Я только что отредактировал ответ, чтобы сделать это. Спасибо за ваш конструктивный отзыв.

5. @msalvadores: спасибо, теперь я изменил свой отрицательный голос на положительный

Ответ №2:

Ошибка заключается здесь:

 process_input_records(amp;what_if_var);
                      ^
  

Вы принимаете адрес массива, который эквивалентен what_if** , в то время как функция принимает только what_if* .

 process_input_records(what_if_var);
  

Обратите внимание, что вы, вероятно, захотите передать размер массива в качестве второго параметра в process_input_records , чтобы функция знала, сколько элементов в массиве:

 process_input_records( what_if_var, sizeof  what_if_var / sizeof *what_if_var );
  

Комментарии:

1. printf(«nfund_price process_input_records ==== : : %s»,what_if_var[line_count]->price); возвращает 0; } является ли это способом вывода значения? потому что он показывает ошибку, подобную.. Ожидание указателя на структуру или объединение

2. @jcrshankar: Для этого нужно использовать .price, а не -> price (см. Мой комментарий к вашему вопросу …)

3. @jcrshankar: what_if_var[line_count] имеет тип what_if , not what_if* , поэтому вы используете . в качестве оператора выбора элемента, not -> , который предназначен для указателей.