2016-01-05 6 views
-5

Код:Как передать массив функции?

void case1(); 
void case2(); 
void case3(); 
void case4(); 
void case5(); 

//Global variables 
const int MAXROW = 5; 
const int MAXCOL = 5; 

int main() 
{ 
    ........ 
    ... 
MENU(with do while) 
} 

void case1() 
{ 
    int A[MAXROW][MAXCOL] = { 0 }; 

    for (int r = 0; r < MAXROW; ++r) 
     for (int c = 0; c < MAXCOL; ++c) { 
      cout << "\n A[" << r << "][" << c << "]= "; 
      cin >> A[r][c]; 
     } 
} 

void case2() 
{ 
    ... 
} 

//Function to find average of negatives 
void case3() 
{ 
    int negNumber = 0; 
    double average = 0; 

    for (int r = 0; r < 6; ++r) { 
     for (int c = 0; c < 6; ++c) { 
      if... 
} 

void case4() 
{//Function to find product of numbers different from 0 
    ... 
} 

void case5() 
{ 
    ... 
} 

Как вы можете видеть массив ввода в case1(). Интересно, как использовать этот массив во всех других функциях (case2, case3, case4, case5).

Как это сделать?

Как называть их в меню? Например case2():

case '2': { 
    case2(......); 

На данный момент мой список ошибок полна сообщений, как

'A': необъявленный идентификатор

+2

Пожалуйста, отредактируйте ваш вопрос с помощью [mcve]. – YSC

+0

Вы получили это немного короче, полностью отбросив, но все еще не настолько приближаясь к минимуму. Я предлагаю вам удалить его, немного переформулировать (и перестроить ваш пример) и только тогда, когда вы будете готовы восстановить и отредактировать его. (As-is, вы просто собираете вниз и закрываете голоса ...) – Deduplicator

+0

Любые массивы, определенные локально в функциях, не видны внутри других функций. Поскольку вы просите вас определить этот массив в глобальном масштабе (не то, что я считаю это хорошей идеей). –

ответ

0

Вы можете передать массив по ссылке, например:

void case1(int (&A)[MAXROW][MAXCOL]) 
{ 
    // do use array here 
} 
0

Вы должны объявить свой массив в main функция, не в одном из ваших case... функций. В C++ объекты (включая массивы) уничтожаются после того, как выполнение переходит из блока, в котором определяется объект. Так что в вашем коде

void case1() 
{ 
    int A[MAXROW][MAXCOL] = { 0 }; 
    ... 
} 

когда выполнение покидает функцию case1, массив A разрушается. Компилятор пытается рассказать вам об этом, когда он жалуется на неизвестное имя A. Это не то, что вы хотите! Вместо этого:

int main() 
{ 
    int A[MAXROW][MAXCOL] = { 0 }; 
    ... 
    // your menu code 
    ... 
    switch (menu_result) 
    { 
    case 1: case1(A); break; 
    case 2: case2(A); break; 
    case 3: case3(A); break; 
    case 4: case4(A); break; 
    case 5: case5(A); break; 
    } 
} 

Здесь вы передаете массив A своим функциям. Для того, чтобы сделать этот код работать, вы должны заявить, что ваши функции получают массив в качестве параметра:

void case1(int (&A)[MAXROW][MAXCOL]) 
{ 
    // do use array here 
} 

(код взят из this ответа)


BTW с синтаксисом передачи по ссылке редко используется для массивов, потому что код работает, даже если опустить опорный знак &:

void case2(int A[MAXROW][MAXCOL]) // also works; does the same 
{ 
} 

В этом случае вы также можете опустить внешний размер обр ау:

void case3(int A[][MAXCOL]) // also works; does the same 
{ 
} 

Причина эти два варианта также работают is a bit technical - в этих вариантах, вещь передается указатель на одномерный массив, а не ссылка на двумерный массив. Я хотел не упоминать их, но это не реально, потому что они широко используются (возможно, потому, что они могут быть скомпилированы компилятором C).

+0

Да с этим ошибки в одном случае исчезают, но как это сделать в другом fucntion. [code] void case1 (int (& A) [MAXROW] [MAXCOL]) [/ code] Это то же самое, что и в случае 1? – Fingolfin

+0

или что-то вроде этого void case2 (int A [] []) – Fingolfin

+0

или это: void case2 (int A [MAXROW] [MAXCOL]) – Fingolfin