Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

динамическое выделение памяти

47K
12 ноября 2010 года
Стрелок
21 / / 16.01.2010
Здравствуйте. Есть часть кода:
Код:
void CGomoriDlg::OnBnClickedButton1()
{
    int mm=3,nn=9;
    result_file.open("results.log");
    double x[3][9]={{4,0,18,2,-3,6,1,0,0},
                    {5,0,24,-3,2,-2,0,1,0},
                    {6,0,36,1,3,-4,0,0,1}};
    int k[9-3]={-3,-2,6,0,0,0};
    int *K1=new int [nn-3];
    int i;
    for(i=0;i<nn-3;i++) K1=k;
    double **X1=new double*[nn];
    for(i=0;i<mm;i++) X1=new double[mm];
    for(i=0;i<mm;i++)
        for(int j=0;j<nn;j++) X1[j]=x[j];
    Simplex(K1,X1,mm,nn);
    result_file.close();
    for(i=0;i<mm;++i) delete X1;
    delete []K1; delete []X1;
}

void CGomoriDlg::Simplex(int *K1, double **X1, const int m,const int n)
{
    double **X=new double*[n];      //на этом месте выскакивает ошибка
    for(int i=0;i<n;i++) X=new double[m];
    double *S=new double[n-3];

После нажатия на кнопку постоянно выскакивает ошибка "Out of memory". Дебагер показал, что ошибка в указанном мной месте. Не могу понять, что не так?
247
13 ноября 2010 года
wanja
1.2K / / 03.02.2003
То есть, вы выделяете склероз под массив в функции OnBnClickedButton1(), запихиваете туда значения, а потом, в функции Simplex, снова выделяете под нее память, затирая введенные значения?
11
13 ноября 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: wanja
То есть, вы выделяете склероз под массив в функции OnBnClickedButton1(), запихиваете туда значения, а потом, в функции Simplex, снова выделяете под нее память, затирая введенные значения?


С этим в коде все нормально

535
13 ноября 2010 года
Нездешний
537 / / 17.01.2008
Вы выделяете массив размерностью nn, а затем устраиваете перебор по mm
Дальше в двойном цикле размерности массивов тоже перепутаны
 
Код:
int mm=3,nn=9;
double **X1=new double*[[COLOR="Red"]nn[/COLOR]]; // 9 указателей
for(i=0;i<[COLOR="#ff0000"]mm[/COLOR];i++) X1=new double[[COLOR="#ff0000"]mm[/COLOR]]; //из 9 указателей только для 3 созданы массивы, т.е., фактически, создана матрица 3*3
for(i=0;i<[COLOR="#ff0000"]mm[/COLOR];i++)
    for(int j=0;j<[COLOR="#ff0000"]nn[/COLOR];j++) X1[j]=x[j]; //выход за границы массива (размерность 3, а перебор до 9)


ЗЫ Назовите нормально размерности - и сразу все будет видно
47K
13 ноября 2010 года
Стрелок
21 / / 16.01.2010
да да. Уже разобрался. Вопрос снят
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог