2013-10-24 2 views
-1

У меня есть следующий массив в C:Как передать массив как параметр функции в C?

int format[6][6] = { {1,1,1,1,1,1}, 
        {2,2,2,2,2,2}, 
        {3,3,3,3,3,3}, 
        {4,4,4,4,4,4}, 
        {5,5,5,5,5,5}, 
        {6,6,6,6,6,6} 
} 

то у меня есть функция необходимость передавать массив format функции, и скопировать все данные в новый массив:

void constructNewArray(int array[6][6]) 
{ 
    int newArray[10][10] = {0}; 
    memcpy(newArray, array, sizeof(int)*6*6); 
} 

Так параметр constructNewArray функция, есть int array[6][6] Право для параметра? или как его исправить?

+0

Я бы обсуждал любую настоящую «потребность» в этой жизни. – Blindy

+0

что вы имеете в виду, мужчина? – user2131316

+0

'' void constructNewArray (int ** array) '' может быть то, что вы ищете? – Vorsprung

ответ

0

Попробуйте это:

void constructNewArray(int array[][6]) 
{ 
    ... 
} 
0

метод вы использовали, чтобы передать массив в constructNewArray правильно. При передаче общего многомерного массива, скажем, data[a][b]...[x], вы должны указать все размеры, кроме первого. Например, вы могли бы объявить constructNewArray как это:

void constructNewArray(int array[][6]) 

Другим способом вы можете передать массив в функции используется указатель.

void constructNewArray(int **array) 

Вы все еще можете получить доступ к элементам, используя индексацию как array[1][2] внутри constructNewArray с этим методом.

+0

ok, но если я использую void constructNewArray (int array [] [6]), правильно ли это memcpy (newArray, array, sizeof (int) * 6 * 6); как это? – user2131316

+0

@ user2131316 memcpy все равно, что вы передали ему массив или нет. Он будет копировать 'sizeof (int) * 6 * 6' байт данных, начиная с адреса' array' и скопировать его в 'newArray'. Вы хотите это сделать, это зависит от вас. – Kunal

+0

ОК, то в этом случае, что является правильным способом копирования данных? – user2131316

2

Как указано, код в функции «ОК»; определение функции ОК. Как указывает abelenky, точка с запятой отсутствует в инициализаторе массива в вызывающем коде.

Ведущее измерение массива по существу игнорируется компилятором. Если у вас есть компилятор C99, вы могли бы написать:

void constructNewArray(int array[static 6][6]) 

Это говорит компилятору, что он может допустить, что будет по крайней мере, 6 строк в массиве. Я не уверен, когда это действительно приносит пользу, но объект есть.

Насколько яснее, копируются ли данные в массив 10x10 так, как вы хотите. На самом деле вы будете в конечном итоге с массивом инициализирован, как будто бы вы написали:

int newArray[10][10] = 
    { { 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, }, 
     { 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, }, 
     { 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, }, 
     { 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, }, 
     // ... all zeroes from here onwards 
    }; 

Кроме того, компилятор не будет жаловаться, если вы попытаетесь пройти 10x6 или 2x6 матрицу функции.

В своей основе ваша функция тщательно создает массив и инициализирует его, а затем ничего не делает с ним. Вы не можете вернуть (указатель на) локальный массив. Для этого вам нужно будет сделать динамическое выделение памяти, или вы передадите новый массив в качестве параметра функции, и в этом случае он станет «инициализировать массив 10x10 из массива 6x6». Или вы можете организовать вызов другой функции с построенным массивом изнутри функции constructNewArray(), но это неправдоподобно для функции с именем «construct». Таким образом, пока не ясно, что ваша функция правильно разработана.

+1

Код, написанный не полностью «хорошо». В конце своего массива 'format' у него отсутствует полуколона. – abelenky

+0

+1 для еще одного извращенного использования 'static' – Bathsheba

+1

@abelenky: touché! Игнорируя мелочи, которые укажет компилятор, ... –

1

Это определение неправильно

int format[6][6] = { {1,1,1,1,1,1}, 
        {2,2,2,2,2,2}, 
        {3,3,3,3,3,3}, 
        {4,4,4,4,4,4}, 
        {5,5,5,5,5,5}, 
        {6,6,6,6,6,6} 
} 

Все объявления переменных заканчиваются точкой с запятой. Это должно быть:

int format[6][6] = { {1,1,1,1,1,1}, 
        {2,2,2,2,2,2}, 
        {3,3,3,3,3,3}, 
        {4,4,4,4,4,4}, 
        {5,5,5,5,5,5}, 
        {6,6,6,6,6,6} 
}; // <== NOTE the final semi-colon. 
Смежные вопросы