1

Я хочу создать и инициализировать 2D-массив, но инициализация завершилась неудачно. Я встречаю «Программа неожиданно закончилась». в Qt Creator.Инициализация динамического 2D-массива

Что не так?

в файле .h

private: 
    int pop; 
    int d; 
    float **uye; 

в .cpp файле

pop=50; 
d=12; 
uye = new float*[pop]; 
for(int i=0; i<d; i++) uye[i] = new float[d]; 

for(int n=0; n<pop; n++) 
{ 
    for(int m=0; m<d; m++) 
    { 
     uye[n][m] = (float) n*m; 
    } 
} 
+0

2D-зубчатый массив, размер которых определяются во время выполнения, не просачивается: 'станд :: вектор <станд :: вектор >'. –

ответ

3

Первый цикл for(int i=0; i<d; i++) должен вероятно быть for(int i=0; i<pop; i++). В противном случае вы зарезервируете пространство для 12 элементов, но позже попытаетесь получить доступ к 50.

Обратите внимание, что наличие сырых указателей считается очень плохой идеей в современном C++, потому что вам нужно беспокоиться о копировании семантики. Лучше используйте плоский std::vector<float> и выполните 2D-1D-сопоставление вручную или используйте std::vector<std::vector<float> > с удобным синтаксисом доступа.

Я предпочел бы вторую версию. Не видя больше контекста:

pop = 50; 
d = 12; 
uye = std::vector<std::vector<float> >(pop, std::vector<float>(d)); 

Вложенные петли, которые следуют за работой, работают одинаково, никаких изменений не требуется.

3

Что не так?

Вы не используете std::vector (это одна из вещей, которые не правы, @FredO покрыл другую вещь).

#include <vector> 

int main(){ 
    typedef std::vector<float> inner_vec; 
    typedef std::vector<inner_vec> outer_vec; 

    int pop = 50, d = 12; 
    // first parameter to vector is its size 
    // second is what every element should be initialized to 
    outer_vec uye(pop, inner_vec(d)); 
    for(unsigned n = 0; n < uye.size(); ++n){ 
    for(unsigned m = 0; m < uye[n].size(); ++m){ 
     uye[n][m] = (float)n*m; 
    } 
    } 
}