2016-11-10 6 views
-1

, пожалуйста, можете ли вы помочь мне с моей простой программой? Я начинаю, и мой английский не очень хорош, это трудно понять. :/«Значение не является ни массивом, ни указателем, ни вектором» в моей простой программе

ПРОГРАММА:

void tisk_pole (P); 

int main() 
{ 
    char P1[3][3]={{'1','2','3'},{'4','5','6'},{'7','8','9'}}; 
    tisk_pole(P1); 
    return 0; 
} 

void tisk_pole (P){ 
    int i, j; 

    for (i = 0; i < 3; i++){ 
     for (j = 0; j < 3; j++) 
      printf("%c", P[i][j]); //HERE IS PROBLEM -> value is neither array nor pointer nor vector 
     putchar('\n'); 
    } 
} 

ПОЖАЛУЙСТА, вы можете помочь мне решить эту проблему? Большое спасибо.

+1

do 'void tisk_pole (char P [3] [3]) {' вместо этого. –

ответ

1

Вам не хватает объявления типа аргумента P.

void tisk_pole(char P[3][3]) { 
    int i, j; 

    for (i = 0; i < 3; i++){ 
     for (j = 0; j < 3; j++) 
      printf("%c", P[i][j]); 
     putchar('\n'); 
    } 
} 

См. C Function with parameter without type indicator still works?, как компиляторы рассматривают параметр без типа.

1

Тип параметра P в определении функции tisk_pole должен соответствовать типу аргумента P1 в вызове функции.

P1 имеет тип char [3][3] - то есть 3-элементный массив из 3-элементного массива char. Таким образом, декларация параметра P в tisk_pole должен быть одним из следующих:

void tisk_pole(char P[3][3]) 

или

void tisk_pole(char P[][3]) 

или

void tisk_pole(char (*P)[3]) 

исключением случаев, когда это операнд sizeof или унарные & или строковый литерал, используемый для инициализации массива символов в объявлении, выражение типа «N-элементный массив из T» будет преобразован («распад») в выражение типа «указатель на T», а значение выражения будет адресом первого элемента массива.

В вызове функции

tisk_pole(P1); 

экспрессииP1 имеет тип "3-элемент массива 3-элемента массива char" (char [3][3]); поскольку он не является операндом операторов sizeof или унарных &, он преобразуется в выражение типа «указатель на 3-элементный массив char» (char (*)[3]) и оценивает адрес первого элемента P1. Это означает, что tisk_pole принимает значение , а не значение массива.

В параметре декларации в функции, T a[N], T a[] и T *a все это означает то же самое - все они объявляют a как указатель к T, а не массив T. Это только true в объявлении параметра функции.

Вы можете использовать операторы индекса [] на указателях так же, как на массивах, поэтому P[i][j] работает точно так, как вы ожидаете.

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

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