#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
, notwhat_if*
, поэтому вы используете.
в качестве оператора выбора элемента, not->
, который предназначен для указателей.