Member 12949087 Ответов: 1

Что такое ошибка преобразования, возникающая в следующей программе ?


Следующая программа преобразует 3D-массив в 1D-массив с помощью указателей . Грядет какая-то ошибка преобразования . Строка, в которой появляется ошибка, содержит оператор присваивания с указателем на указатель типа int с обеих сторон .
#include<iostream>
using namespace std ;
int main()
{
// REPLACING 3D ARRAY WITH A 2D ARRAY AND THEN INTO A 1D ARRAY USING               POINTERS  .  

int abc [2][2][3] ;
int **p[3][2] ;
int *c[6] ;
//          // abc gives address of first element of 3d array ie first 2d   array .

// abc is pointer to pointer to pointer to int type .

int i , j ;     // * abc represents address of first 1d array of first 2d array .

for (i=0 ; i<=2 ; i++) // *abc +1:address of second 1d array of first 2d 
{                            // array .
for (j=0 ; j<=1 ; j++)
{
p[i][j] =  *(abc+i )  + j ; // Conversion error comes here , but WHY ?

} 
}                  

for (i=0 ; i<=5 ; i++) 
{
for (j=0 ; j<=1 ; j++ )     
{
c[i] = *p[i][j] ;     
}

}

// entering array elements .
for (i=0 ; i<=5 ; i++)
{
cin>>* c[i] ;   

}

// required array elements .
for (i=0 ;i<=5 ;i++)
{
cout<<*c[i]<<"    "; // 3d array elements are accessed using 1d array  
}                                                        // of pointers .
}


Что я уже пробовал:

Я пытался запустить эту программу на dev c++, но выводит следующую ошибку :

[Ошибка] не удается преобразовать 'int (*) [3]' в 'int**' в присваивании

Philippe Mori

Делайте одно дело за раз... Начните с простой программы и пишите по одной строке кода за раз.

Кстати, сообщение об ошибке компилятора ясно объясняет, что он не может преобразовать массив целых чисел в указатель на указатель на целое число.

David O'Neil

Представьте себе трехмерный массив в своей голове. Я не прошел через ваш код, но вы, кажется, пытаетесь рассматривать его часть как 2d-массив для своего первого шага. И если я правильно понимаю, вы обрабатываете массив 2x3 как массив 3x2, что не одно и то же. Прежде чем это исправить, я не верю, что вы можете преобразовать трехмерный массив в двумерный массив так, как вы думаете. Далее, поскольку вы определили массив, он уже линейен в памяти, если вам нужен основной трюк. Но ваш учитель, вероятно, хочет, чтобы вы создали второй линейный массив в памяти, чтобы показать, что вы понимаете указатели. При этом вам нужно скопировать значения из существующего массива, используя номенклатуру [] [] [], а не номенклатуру указателя, если вы хотите, чтобы это было просто. (Вы можете использовать номенклатуру указателя, если знаете, что делаете, но она будет сильно отличаться от того, что есть у вас. Сначала используйте метод [], чтобы освоить это.)

1 Ответов

Рейтинг:
1

KarstenK

Это довольно очевидно, когда вы понимаете механизм доступа к массивам. Ваша азбука-это 3-мерный массив целых чисел.

действительный код:

int value =  abc[i][j][k] ;//get value with array access
int *pointer =  &(abc[i][j][k]);//get pointer

Проще работать с доступом к массиву и избегать архитметики больших указателей