2009-09-24 3 views
5

Я делаю программу на C++, которая проверяет, задан ли aray latin square. Мне нужно использовать динамический многомерный массив, который хранит данный латинский квадрат. Но я не могу передать массив в функцию, которая делает проверку ...Использование динамических многомерных массивов в C++

В настоящее время у меня есть такой код для вызова функции:

int squaretest(int **p, int n, int sum) { 

    //some code 
}; 

И этот код для создания массива:

int main() { 

    //some code. n - length of one row, sum - sum of elements in one row. 
    int a; 
    int **lsquare; 
    lsquare = new int*[n]; 
    for (int i=0;i<=n-1;i++) for (int j=0;j<=n-1;j++) { 
     cin >>a; 
     lsquare[i][j] = a; 
    } 
    blocktest(lsquare,n,sum); 
    //some code 
}; 

Код компилируется (я использую компилятор Geany IDE и G ++), но когда я запускаю его в терминале, после первого ввода, который должен быть сохранен в блоке [0] [0], я получаю Ошибка сегментации. Что не так с моим кодом и что такое правильное решение?

+0

+1 для латинского квадрата –

+2

Почему бы не использовать зЬй :: вектор? – Yacoby

ответ

7

Чтобы быть в состоянии сделать это .. Вы на самом деле нужно сделать это:

int **lsquare = new int*[n]; 

for (int i=0; i<n; ++i) 
    lquare[i] = new int[n]; 

for (int i=0; i<n; i++) 
    for (int j=0; j<n; j++) 
     cin >> lsquare[i][j]; 

blocktest(lsquare,n,sum); 

Чем лучше система будет делать:

int *lsquare = new int[n*n]; 

for (int i=0; i<n; ++i) 
    for (int j=0; j<n; ++j) 
     cin >> lsquare[i + j*n]; 

blocktest(lsquare, n, sum); 
0

У вас есть массив указателей в lsquare.

Вы можете просто сделать что-то вроде:

lsquare = new int[n * n]; 

Таким образом, то вы можете заполнить на этой площади, но тип затем:

int *lsquare 
0

То, что вы фактически создаете массив массивов. Вам не только нужно выделить массив массивов с помощью new, но и вы должны выделить все массивы n. Вы хотите, чтобы внешний цикл вашего вложенного цикла цикла выделял каждый из n подмассивов.

lsquare = new int*[n]; 
for (int i=0;i<=n-1;i++) 
{ 
    lsquare[i] = new int[n]; 
    for (int j = 0;j<=n-1;j++) 
    { 
    //... 
0

Вы сделали себе указатель указатель, который может быть использован в качестве матрицы, выделяется один ряд для него, а затем продолжил действовать, как бы вы выделили целую п * п матрица. Вы действительно получите segfault, если вы запустите это.

Вам необходимо выделить достаточное пространство для n * n элементов, а не только n из них.

Менее ошибочным решением может быть использование std :: vector of std :: vectors.

0

Вы должны выделить пространство для второго измерения тоже добавьте это после того, как вы выделите lsquare:

for(int i = 0; i < n; ++i) 
{ 
    lsquare[i] = new int[n]; 
} 
2

Вы забыли выделить память для второго измерения матрицы IX.

int **lsquare; 
lsquare = new int*[n]; 
for (int i=0; i<n; ++i){ 
    lsquare[i] = new int[n]; 
....} 

никто не пишет

for (int i=0;i<=n-1;i++){...} 

ли вместо

for (int i=0; i<n; ++i){...} 
Смежные вопросы