Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамический двумерный массив, падение программы при запуске 
:(
    Опции темы
trinitr0
Дата 10.12.2014, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Пытаюсь переписать одну из своих программ применив 
двумерные динамиские массивы:

Код

{
        double  Lx = 0.9, 
               dt = 0.01,
               a  = 0.0001; 
        int       tsc;  

   double dx = Lx/(X-1); 
   double dy = Ly/(Y-1);

   double **pdT = new double *[X];

   for (int i; i<X; ++i)
   {
        pdT[i] = new double [Y];
   }

   double **pT = new double *[X];

   for (int i; i<X; ++i)
   {
        pT[i] = new double [Y];
   }
//-----------------------------------------------------------------------------

   for (int i=0; i<X-1; ++i)
   {
        for (int j=0; j<Y-1; ++j)
        {
                pdT[i][j] = pT[i][j] = 0;
        }
   }

//-----------------------------------------------------------------------------

   for (int tsc=1; tsc<500; ++tsc)
   {

         for (int i=1; i<4; ++i)
         {
                 for (int j=1; j<8; ++j)
                 {
                        double x = ( pT[i+1][j] - 2* pT[i][j] + pT[i-1][j] );
                        double y = ( pT[i][j+1] - 2* pT[i][j] + pT[i][j+1] );
                        pdT[i][j] = dt * ( a * (( x / (dx * dx)) + y / (dy * dy) + pT[i][j] ));

//----------------------------------------------------------------------------

                       for (int x=0; x < X-1; ++x)
                       {
                                for (int y=0; y < Y-1; ++y)
                                       {
                                                pT[4][7] = 100;
                                                pT[x][y] = 0;
                                                pT[x][y] = pT[x][y] + pdT[x][y];
                                       }
                       }

           Series1 -> AddXY(tsc*dt, pT[3][3]);
         }
      }
 }
 for (int i=0; i<X; i++)
 {
        delete [] pdT[i];
        delete [] pdT;
 }

 
for (int i=0; i<X; i++)
 {
        delete [] pT[i];
        delete [] pT;
 }

}


Но после компиляции и нажатии кнопки в программе Windows 7 автоматически 
её завершает с сообщением:

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


Помогите пожалуйста исправить этот код  smile 

PM MAIL Jabber   Вверх
feodorv
Дата 10.12.2014, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



12 и 19 строки:
Цитата(trinitr0 @  10.12.2014,  22:27 Найти цитируемый пост)
  for (int i=0; i<X; ++i)



Что за фиксированные константы 4 и 8? Как они коррелируют с X и Y?
Цитата(trinitr0 @  10.12.2014,  22:27 Найти цитируемый пост)
         for (int i=1; i<4; ++i)
         {
                 for (int j=1; j<8; ++j)



Как это:
Цитата(trinitr0 @  10.12.2014,  22:27 Найти цитируемый пост)
                                                pT[x][y] = 0;
                                                pT[x][y] = pT[x][y] + pdT[x][y];
???


Точно нужно X-1 и Y-1 (а то элементы массива pdT[X-1][*] и pdT[*][Y-1] останутся неинициализированными):
Цитата(trinitr0 @  10.12.2014,  22:27 Найти цитируемый пост)
   for (int i=0; i<X-1; ++i)
   {
        for (int j=0; j<Y-1; ++j)
        {
                pdT[i][j] = pT[i][j] = 0;
        }
   }
Дважды pdT[i][j] - это чтобы наверняка, да?



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
baldina
Дата 11.12.2014, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



trinitr0, покажите что было до применения "двумерных динамиских" 
PM MAIL   Вверх
trinitr0
Дата 12.12.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Так было до "двумерных динамиских" : 

(так работало, обсчитывалось, кривая процесса строилась)

Код

double      Lx = 0.9, 
            Ly = 0.1, 
            
            dt = 0.01,
            a  = 0.0001; 

        int     tsc;  

   double dx = Lx/(X-1); //шаг по X
   double dy = Ly/(Y-1); //шаг по Y

   double dT[X][Y],
               T[X][Y];

//----------------- ќбнуление массивов ----------------------------------------

   for (int i=0; i<X-1; ++i)
   {
        for (int j=0; j<Y-1; ++j)
        {
                dT[i][j] = T [i][j] = 0;
        }
   }

//-----------------------------------------------------------------------------

   for (int tsc=1; tsc<500; ++tsc)
   {

         for (int i=1; i<4; ++i)
         {
                 for (int j=1; j<8; ++j)
                 {
                        double x = ( T[i+1][j] - 2 * T[i][j] + T[i-1][j] );
                        double y = ( T[i][j+1] - 2 * T[i][j] + T[i][j-1] );
                        dT[i][j] = dt * ( a * (( x / (dx * dx)) + y / (dy * dy) + T[i][j] ));

//---------------------------------------------------------

                       for (int x=0; x < X-1; ++x)
                       {
                                for (int y=0; y < Y-1; ++y)
                                       {
                                                T[4][7] = 100;
                                                T[0][0] = 0;
                                                T[x][y] = T[x][y] + dT[x][y];
                                       }
                       }

        Series1 -> AddXY(tsc*dt, T[3][3]);
         }
      
  }
 }
}

PM MAIL Jabber   Вверх
baldina
Дата 12.12.2014, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



понятно. она неправильная (см. комменты от feodorv), и работала случайно. когда исправите, и с динамическими сразу получится.
кстати, наверняка в вашей задаче можно обойтись без массивов: алгоритм линеен, если сделать вывод по мере вычисления, массив не нужен.
PM MAIL   Вверх
trinitr0
  Дата 26.3.2015, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Спустя некоторое время нашёл время разобраться с начатым. 
Нашёл ошибки,  исправил. Теперь считается как надо:

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
       double  Lx = 0.9,
                Ly = 0.5,
                dt = 0.1,
                a  = 0.00019;

        int     tsc;

   double dx = Lx/X;
   double dy = Ly/Y;


   double **pdT = new double* [X];

   for (int i=0; i<X; ++i)
   {
        pdT[i] = new double [X];
   }

   double **pT = new double* [X];

   for (int i=0; i<X; ++i)
   {
        pT[i] = new double [X];
   }
//-----------------------------------------------------------------------------
   for (int i=0; i<X; ++i)
   {
        for (int j=0; j<Y; ++j)
        {
                pdT[i][j] = pT[i][j] = 0;
        }
   }
//-----------------------------------------------------------------------------
   for (int tsc=1; tsc<1500; ++tsc)
   {
         for (int i=1; i<X-1; ++i)
         {
                 for (int j=1; j<Y-1; ++j)
                 {
                        double x = ( pT[i-1][j] - 2* pT[i][j] + pT[i+1][j] );
                        double y = ( pT[i][j-1] - 2* pT[i][j] + pT[i][j+1] );
                        pdT[i][j] = dt*(a*((x/(dx*dx))+y/(dy*dy)+pT[i][j]));
                  }
          }

//----------------------------------------------------------------------------
    for (int x=1; x<X-1; ++x)
    {
        for (int y=1; y<Y-1; ++y)
        {
            pT[0][y] = 100;
            pT[14][y] = 0;
            pT[x][y] = pT[x][y] + pdT[x][y];
        }

         Series1 -> AddXY(tsc*dt, pT[3][3]);
      }
    }


 for (int i=0; i<X; i++)
 {
        delete [] pdT[i];
 }
 delete [] pdT;

 for (int i=0; i<X; i++)
 {
        delete [] pT[i];
 }
 delete [] pT;
}



З.Ы. Спасибо за помощь и тыкание носом! 
PM MAIL Jabber   Вверх
feodorv
Дата 26.3.2015, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(trinitr0 @  26.3.2015,  17:33 Найти цитируемый пост)
Нашёл ошибки,  исправил.

Замечательно!

Эх, недавно в одной непростой программе я тоже исправил ошибку... и создал новую!!! Увы, за каждым исправлением нужно следить. Если у Вас считается как надо, то это здорово))) Тем не менее:
Цитата(trinitr0 @  26.3.2015,  17:33 Найти цитируемый пост)
   for (int i=0; i<X; ++i)
   {
        pdT[i] = new double [X];
   }
Цитата(trinitr0 @  26.3.2015,  17:33 Найти цитируемый пост)
   for (int i=0; i<X; ++i)
   {
        pT[i] = new double [X];
   }
Где здесь Y???



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
trinitr0
Дата 2.4.2015, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Вы имеете в виду так:
Код

for (int i=0; i<X; ++i)
{
        pdT[i] = new double [X][Y];
}

Код

 for (int i=0; i<X; ++i)
{
        pdT[i] = new double [X][Y];
}


или так:

Код

for (int i=0; i<X; ++i)
{
    for (int j=0; j<Y; ++j)
   {
        pdT[i] = new double [X][Y];
    }
}

Код

 for (int i=0; i<X; ++i)
{
     for (int j=0; j<Y; ++j)
    {
             pdT[i] = new double [X][Y];
    }
}


PM MAIL Jabber   Вверх
feodorv
Дата 2.4.2015, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Не понял)))

Я имел в виде так:
Цитата(trinitr0 @  26.3.2015,  17:33 Найти цитируемый пост)
   for (int i=0; i<X; ++i)
   {
        pdT[i] = new double [Y];
   }




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
trinitr0
Дата 2.4.2015, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



То есть вот так?

Код

for (int i=0; i<X; ++i)
   {
     dT[i] = new double [X];
   }
   for (int j=0; j<Y; ++j)
   {
     dT[j] = new double [Y];
   }

PM MAIL Jabber   Вверх
feodorv
Дата 2.4.2015, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Ну, здесь-то тоже Y:
Цитата(trinitr0 @  2.4.2015,  12:28 Найти цитируемый пост)
for (int i=0; i<X; ++i)
   {
     dT[i] = new double [ Y ];
   }

Не?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
trinitr0
Дата 3.4.2015, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Простите за мою безтолковость, но я запутался!
Никак не пойму, что Вы хотите мне сказать?  smile 
PM MAIL Jabber   Вверх
feodorv
Дата 3.4.2015, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



У Вас матрицы размером X*Y. X строк, Y столбцов. Вот здесь Вы правильно инициализируете обе матрицы:
Цитата(trinitr0 @  26.3.2015,  17:33 Найти цитируемый пост)
   for (int i=0; i<X; ++i)
   {
        for (int j=0; j<Y; ++j)
        {
                pdT[i][j] = pT[i][j] = 0;
        }
   }

Так почему при выделении памяти под них Вы мечетесь из стороны в сторону? Стандартно, для матрицы X*Y (и неважно, как она называется):
Цитата

   double **M = new double* [ X ];
   for (int i=0; i<X; ++i)
   {
        M[i] = new double [ Y ];
   }

Подставьте вместо M имя pdT или pT, что Вы получите? А теперь сравните с тем, что предлагаете...

Это сообщение отредактировал(а) feodorv - 3.4.2015, 21:21


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
trinitr0
Дата 6.4.2015, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.6.2013

Репутация: нет
Всего: нет



Честно говоря тоже самое (результаты те же) или я не туда смотрю?
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.