2016-11-30 3 views
1

Программы врежется прямо в инструкции, указанной в исходном коде (я не писал весь код, потому что это слишком долго)Изменение значения массива из функции в C

int main() 
{ 
char screen[24][80]; 

//......every thing is well until this instruction 

backgrounds(5,screen); 

//......the program doesn't execute the rest of the code 

} 
//______________________________________________________ 

//this is a header file 

void backgrounds(int choice,char **screen) 
{ 
    if(choice==5) 
    { 
     screen[18][18]='-'; 
     screen[18][19]='-'; 
     screen[18][20]='-'; 
    } 
} 
+4

2D-массив это не то же самое, что указатель на указатель. См. [This] (http://stackoverflow.com/questions/4470950/why-cant-we-use-double-pointer-to-represent-two-dimensional-arrays) – samgak

+2

И вы проигнорировали предупреждения компилятора, потому что ... ? – Olaf

+0

, также имеющий функцию в файле заголовка (обычно) Плохая идея (tm) – pm100

ответ

3

char [24][80] не может быть преобразован до char **.

Когда передано функции, массив распадается на указатель на свой первый элемент. Это просто для одномерного массива, но тем более для более высоких измерений.

В этом случае char [24][80] представляет собой массив из char [80]. Поэтому передача переменной этого типа в функцию дает char (*)[80].

Измените определение функции либо на это:

void backgrounds(int choice,char (*screen)[80]) 

Или это:

void backgrounds(int choice,char screen[24][80]) 

Или вы можете использовать переменную массив длины для максимальной гибкости:

void backgrounds(int choice, int x, int y, char screen[x][y]) 
+0

«Это просто для одномерного массива, но не для более высоких измерений». - Это неверно. Это очень хорошо прямолинейно: он распадается на указатель на массив из одного меньшего размера: 2D-массив распадается на указатель на 1D-массив, 3D-массив на указатель на 2D-массив и т. Д. Как вы писали: массив распадается на указатель на его элемент. Элементом (n) D-массива является массив (n-1) D. С массивом 0D является один элемент. – Olaf

+0

@ Олаф «прямолинейный», вероятно, был не лучшим выбором слов. Изменено на «простое». – dbush

+0

Я до сих пор не доволен этим. Может быть, я слишком глубоко в этом, но для меня это как в прямом, так и в явном виде: массив всегда распадается на указатель на первый элемент. Нет никаких исключений, сколько измерений. На самом деле путаница в том, что ppl не останавливается после этого decaing, но думаю, что он переписывается в следующем измерении и так далее. Но это не ** очевидно для меня. Во всяком случае, я не намерен DV для этого, поэтому не стесняйтесь игнорировать мой комментарий :-) – Olaf

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