2016-10-10 3 views
1

Вот моя программа:Я не знаю, почему эта программа не будет компилироваться

#include<stdio.h> 
#define COL 3; 

void copy_row(int arr1[][COL], int rows, int arr2[], int r); 

void copy_row(int arr1[][COL], int rows, int arr2[], int r){ 
    int i; 
    if(r >= rows || r < 0) 
    return; 

    for(i = 0; i < COL; i++){ 
    arr1[r][i] = &arr2[i]; 
    } 
} 

int main(void){ 

    return 0; 
} 

Когда я пытаюсь скомпилировать это с GCC, он говорит: «ошибка: ожидается,„]“перед„;“ токен "в строке 4 и строке 6.

Кроме того, обратитесь к циклу for:" arr1 [r] [i] = arr2 [i]; " сделайте то же самое как «arr1 [r] [i] = & arr2 [i];"? Что является (более) правильным?

+6

Вам не нужна точка с запятой в конце этой строки '# define'. –

+0

Операторы '# define' редко, если вообще когда-либо, заканчиваются точкой с запятой. Предложите удалить эту конечную точку с запятой, тогда единственное сообщение компилятора: предупреждение: присваивание делает целое число из указателя без приведения для этой строки: 'arr1 [r] [i] = & arr2 [i];' – user3629249

ответ

6

Макрос COL расширяется до 3;, поэтому внутри вашей декларации и определение выглядит следующим образом:

int arr1[][3;] 

Удалите точку с запятой вашей #define линии.

Also, refer to the for-loop, would arr1[r][i] = arr2[i]; do the same thing as arr1[r][i] = &arr2[i]; ?

№ Первый правильный. lvaluearr1[r][i] относится к целому числу. rvaluearr2[i] также является целым числом.

Если ссылаться на него, принимая &arr2[i] то его типа становится int*, и является указателем на элемент i, и вы пытаетесь присвоить, что к именующему типа int. Если вы попытаетесь это сделать, ваш компилятор должен предупредить вас.

+0

Хороший улов. Это хороший пример разницы между операторами C и инструкциями препроцессора C. –

+0

молодец. Спасибо –

Смежные вопросы