когда я выполняю следующий код, я получаю сообщение об ошибке для этой строки scanf("%s",A.(T+i)->CNE)
сообщение об ошибке: expected identifier before '(' token|
можно узнать в чем проблема? заранее спасибо.
typedef struct date
{
int day;
int month;
int year;
}date;
typedef struct Student
{
char CNE[10];
char FirstName[30];
char LastName[30];
date BD;
float Grades[6];
}Student;
typedef struct Class
{
Student T[1500];
int dim;
}Class;
Class input(Class A)
{
int i=A.dim;
printf("Enter the student CNE : ");
scanf("%s",A.(T+i)->CNE);
}
(T+i)
не является членом структуры Class
, поэтому использовать A.(T+i)
нельзя.
Кажется A.(T+i)->CNE
должно быть A.T[i].CNE
.
Также подозрительно, что модифицированный A
отбрасывается при возврате из функции input
. Кажется, вы забыли написать return A;
.
Единственное, что может быть после оператора .
, — это имя участника. Это не может быть такое выражение, как (T+i)
.
Обычно, чтобы получить доступ к элементу i
члена T
, нужно использовать A.T[i]
, и тогда его CNE
член будет A.T[i].CNE
.
Предположительно, вы изучали арифметику указателей и заинтересованы в доступе к A.T[i]
с помощью указателей. В этом случае A.T + i
даст адрес элемента i
из A.T
. Тогда (A.T + i)->CNE
будет CNE
членом этого элемента. (Обратите внимание, что A.T
— это массив, но в этом выражении он автоматически преобразуется в указатель на его первый элемент. Таким образом, A.T + i
эквивалентен &A.T[0] + i
, который говорит взять адрес A.T[0]
и увеличить его на i
элементов.)
Кажется, вы имеете в виду либо
scanf("%s",A.T[i].CNE);
или
scanf("%s", ( A.T + i )->CNE );
То есть в используемом вами выражении
A.(T+i)->CNE
оператор точки ожидает идентификатор вместо выражения.
И ваша функция ничего не возвращает, хотя ее тип возвращаемого значения не void
.
Функция может быть объявлена и определена, например, следующим образом
void input(Class *A)
{
int i = A->dim;
printf("Enter the student CNE : ");
scanf( "%s", ( A->T + i )->CNE );
}