2015-04-20 3 views
0

Я пытался вырыть больше в использовании массивов и указателей в то время как я наткнулся на эту проблему:
Передача массивов в качестве параметров указатель

main.cpp:13:7: error: cannot convert 'int [2][5][10]' to 'int*' 

присваивание show=ary;

Вот код:

#include <iostream> 

using namespace std; 

void arrayLearn(int *); 
int main() 
{ 
    int ary[2][5][10]; 
    int *show; 
    ary[2][4][9]=263; 
    ary[2][5][10]=100; 
    show=ary; //line 13 
    arrayLearn(show); //line 14 
    cout <<"End process"<<endl; 
    return 0; 
} 
void arrayLearn(int *arg) 
{ 
    for(int i=0;i<100;i++) 
    { 
     cout<<"Pointer position: "<<i<<" Value: "<<*(arg++)<<endl; 
    } 

} 

Если я удаляю линию и заменяю Строка 14 со следующим кодом,

arrayLearn(ary[5][10]); 

тогда программа компилируется, но я не понимаю, почему я должен пройти только два измерения, а не три. Если я передаю указатель на первый элемент в массиве, то почему я не могу просто передать указатель вот так?

arrayLearn(ary); 

Пожалуйста, дайте мне знать, если я пропустил некоторые важные концепции или не смог увидеть действительно простую ошибку.

+0

См Http: // StackOverflow. ком/вопросы/29735567/с-несовместимый-указатель типа инициализация/29735593 # 29735593. Другой язык, одна и та же проблема. В любом случае ваш код выглядит как C. – juanchopanza

+0

не рекомендуется использовать эти поддерживаемые языки массивы. даже тем более, что вы объявляете их в стеке, вы будете вызывать stackoverflows. просто используйте несколько классных классов, gee. –

+0

См. Http://stackoverflow.com/questions/3911400/passing-2d-arrays, чтобы понять, как передавать 2D-массивы. Надеюсь, это поможет вам понять, как передавать 2D-массивы. –

ответ

1

Как Abhishek сказан, вы пытаетесь передать 3-мерный массив в 1-мерный объект.

Если переменная show не используется нигде, вы можете сделать следующее:

#include <iostream> 

using namespace std; 

void arrayLearn(int *); 
int main() 
{ 
    int ary[2][5][10]; 

    // Code change explained below (see Note) 
    ary[1][4][8] = 263; 
    ary[1][4][9] = 100; 

    // Pass the starting address of the array 
    arrayLearn(&ary[0][0][0]); 

    cout <<"End process"<<endl; 
    return 0; 
} 

// Iterate through the array using the position of the elements in memory 
void arrayLearn(int *arg) 
{ 
    for(int i=0;i<=100;i++) 
    { 
     cout<<"Pointer position: "<<i<<" Value: "<<*(arg++)<<endl; 
    } 

} 

Выход:

... 
Pointer position: 98 value: 263 
Pointer position: 99 value: 100 
End process 

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

Примечание: Следует отметить, что исходный массив заданий ary[2][4][9] = 263; и ary[2][5][10] = 100; находятся за пределами массива. Индексы массива начинаются с 0. Итак, хотя вы объявили свой массив как ary[2][5][10]; Чтобы получить доступ к последнему элементу массива, вы должны использовать ary[1][4][9];.

0

Простыми словами, ary является 3-мерным и show является 1-мерным. Ошибки компиляции говорят вам, что вы не можете преобразовать 3D в 1D. Теперь, почему следующая работа?

arrayLearn(ary[5][10]); 

Это происходит потому, что ary[5][10] имеет в виду 1D (строки или столбца или высоты, зависит от того, как вы визуализировать 3D массив) и arrayLearn также принимает параметр 1D.

если вы хотите передать ary с помощью show затем передать 2D как ary[5][10] к show переменным, что-то вроде следующего :)

show = ary[5][10]; 
+0

Исправить, за исключением последнего абзаца. – molbdnilo

+0

@molbdnilo Что случилось с последним абзацем? – Abhishek

+0

Найдите компилятор и попробуйте его. (Массив не является указателем.) – molbdnilo

1

Если вы готовы использовать std::vector, который я настоятельно рекомендую, вы можете использовать следующий код для создания 2D-вектор:

using std::vector<int> Vec1; 
using std::vector<Vec1> Vec2; 
using std::vector<Vec2> Vec3; 

Vec3 a(2, Vec2(5, Vec1(10, 0)); 

, а затем изменить аргумент arrayLearn к const Vec3& называть его U петь a.

void arrayLearn(const Vec3& arg) 
{ 
    // You'll need to use three loops to traverse all the elements. 
    for (auto const& v2 : arg) 
    { 
     for (auto const& v1 : v2) 
     { 
      for (auto const& item : v1) 
      { 
       // Use item 
      } 
     } 
    } 
} 
0

вы можете использовать структурированные данные STL, такие как вектор, карта, связанный список, ... , что все они лучше, чем массив, как в реализации, так и в производительности.

но для решения именно этой проблемы, вы должны передать массив 3 Dimention одной функции таким образом:

int array[10][7][8]; 

void function_sample(int (*a)[7][8] , int length) 
{ 
    //for example for printing array cells 
    for(int i =0 ; i< length ; i++) 
    { 
     for(int j =0 ; j< 7 ; j++) 
     { 
      for(int k =0 ; k< 8 ; k++) 
      { 
       cout << a[i][j][k] << endl 
      } 
     } 
    } 

    //.... 
} 

и для вызова этой функции:

int array[10][7][8] //= {initial your array}; 
function_sample(array , 10);