Синтаксическая ошибка при использовании указателей через вызов функции и параметры в C

#c

#c

Вопрос:

Я получаю синтаксическую ошибку при попытке выделить пространство для многомерной матрицы. Я новичок в программировании на C, так что все, что угодно, поможет. Ошибка возникает при попытке получить доступ к элементам структуры матрицы в функции read_matrix. Синтаксическая ошибка: «выражение должно иметь тип struct или union». Место, где возникает ошибка, закомментировано в функции read_matrix.

 typedef struct {

int *elements;
int rows;
int columns;

} matrix;

void main() {

matrix a, b, c;

void read_matrix(matrix *);
void deallocate(matrix *);
void print(matrix);
matrix add(matrix, matrix);
matrix subtract(matrix, matrix);
matrix multiply(matrix, matrix);

read_matrix(amp;a);
read_matrix(amp;b);

c = add(a, b);

deallocate(amp;c);
c = subtract(a, b);

deallocate(amp;c);
c = multiply(a, b);

}

void read_matrix(matrix *z) {

int d1, d2, i, x, y, val;

printf("What is the first dimension of the array? ");
scanf("%d", amp;d1);

printf("What is the second dimension of the array? ");
scanf("%d", amp;d2);

*z.elements = (int *)calloc(d2, sizeof(int));
*z.rows = d1;
*z.columns = d2;        
    /* error here. It isn't letting me access the 
      elements/rows/columns of the matrix */

/* additional code below here */
}
 

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

1. И синтаксическая ошибка? (пожалуйста, дословный текст)

2. Совсем не похоже на C #… Пожалуйста, проверьте название языка, написанное в вашем учебнике.

3. @AlexeiLevenkov OP уже заявил, что это c. Я удалил нерелевантные теги.

4. Синтаксическая ошибка — «выражение должно иметь тип struct или union». Извините

5. Во-первых, не добавляйте важную информацию в качестве комментария. Отредактируйте свой вопрос и добавьте его в вопрос. Во-вторых, также добавьте, какая строка кода вызывает эту ошибку. Мы здесь не читатели мыслей.

Ответ №1:

Оператор . имеет более высокий приоритет, чем унарный оператор * , что означает, что если вы хотите получить доступ к элементам структуры через указатель z , используя * -и- . комбинацию, вы должны использовать круглые скобки. Это ваш случай, так и должно быть

 (*z).elements = ...
 

В качестве альтернативы вы можете использовать -> operator

 z->elements = ...
 

И так и должно быть int main() , а не void main()

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

1. Спасибо, это устранило мою проблему!

2. @M. Diet: Ваш код страдает и от других проблем. Я не понимаю, как d1 влияет на выделение памяти для матрицы. На самом деле это не так. Это кажется неправильным, поскольку выделение памяти для матрицы обычно зависит от обоих размеров матрицы.

3. Да, я также узнал об этом в приведенных выше комментариях. Спасибо за совет!