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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите как исправить... динамический массив 
V
    Опции темы
Sasisa
Дата 21.4.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В программе необходимо иметь динамический двумерный массив temp, с добавлением в него элементов. Для этого был создан массив-копия (copytemp) для запоминания данных массива temp при его удалении. 
Проблема в том, что при 
Код
 copytemp[ii][j]=temp[ii][j];
 не происходит абсолютно ничего. Массив-копия как был заполнен ерундой, так и не изменяется. Подскажите, пожалуйста, в чем может быть ошибка!

Код проги:
Код


#include <iostream.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>
#include <stdlib.h>
#include <mem.h>
#include <string.h>

void main()
{

const int n=4, r1=10;

int MK[r1][n]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,1},
          {0,1,1,0},{0,1,1,1},{1,0,0,1},{1,1,0,0},
          {1,1,0,1},{1,1,1,0}}; //massiv edinichnyh konyunkciy

int **temp, **copytemp;
int sum=0, rtemp=0;
int *S = new int[n];
int *MIK; //massiv ispol'zovannyh konyunkciy pri skleivanii
MIK=new int[r1];
memset(MIK,0,r1*2);

clrscr();
for(int i=0; i<(r1-1); i++)
 { 
     for(int k=i+1; k<r1; k++)
       { 
            for(int j=0; j<n; j++)
                 {
                      if (MK[i][j]==MK[k][j]) S[j]=1;
                      else S[j]=0;
                  }

             for(j=0; j<n; j++)
             sum+=S[j];

             if(sum==(n-1))
              { 
                   MIK[i]=1; MIK[k]=1;

                   for (int ii=0; ii<rtemp; ii++)
                     for (j=0; j<n; j++)
                       copytemp[ii][j]=temp[ii][j]; // проблема тут!

                   delete temp;
                   rtemp++;
                   int **temp = new int*[rtemp];
                   for (j=0; j<rtemp; j++)
                   temp[j] = new int[n];
                 
                   for (ii=0; ii<(rtemp-1); ii++)
                    for(j=0; j<n; j++)
                      temp[ii][j]=copytemp[ii][j];
            
                   delete copytemp;
                   int **copytemp = new int*[rtemp];
                   for (j=0; j<rtemp; j++)
                   copytemp[j] = new int[n];

                   for (j=0; j<n; j++)
                     {
                         if (S[j]==1)
                            temp[rtemp-1][j]=MK[i][j];
                         else
                            temp[rtemp-1][j]=3;
                      }

                }
   sum=0;

  }
}



for (i=0; i<rtemp; i++)    // вывод на экран
 {
  for( int j=0; j<n; j++)
   cout<<temp[i][j];
  cout<<"\n";
 }
getch();

}



Это сообщение отредактировал(а) Sasisa - 21.4.2007, 18:47
PM MAIL   Вверх
vinter
Дата 21.4.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



под копию не выделена память
оно поидее вообще работать не должна..если компилятор нормальный.


--------------------
Мой блог
PM MAIL WWW   Вверх
Sasisa
Дата 21.4.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



похоже, что дело не в этом. при первом обращении к  циклу 
Код
   for (int ii=0; ii<rtemp; ii++)
    for (j=0; j<n; j++)
     copytemp[ii][j]=temp[ii][j]; // проблема тут!

 к копии даже не обращаемся, т.к. внутрь цикла не попадаем. а потом уже идет выделение памяти 
Код
    delete copytemp;
    int **copytemp = new int*[rtemp];
    for (j=0; j<rtemp; j++)
     copytemp[j] = new int[n];


PM MAIL   Вверх
apook
Дата 21.4.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так у тебя rtemp=0


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


Новичок



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

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



сначала 0. потом, при выполнении условия, rtemp++. и каждый раз при увеличении rtemp в массив temp добавляется строка.
PM MAIL   Вверх
vinter
Дата 21.4.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



блин у тебя copy обьявлена два раза, да и на такой код смотреть невозможнго, расставь нормально скобки и приведи  код в порядок, тогда и поговорим..


--------------------
Мой блог
PM MAIL WWW   Вверх
Sasisa
Дата 21.4.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



расставил smile
первый раз я объявляю просто указатель на массив указателей, что компилятор не придирался.
а второй раз я указываю сколько указателей в массиве (определяю размер массива).
PM MAIL   Вверх
vinter
Дата 21.4.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



            не гут
 
Код
...............
 delete copytemp;
                   int **copytemp = new int*[rtemp];
................................

гут
Код

..................
 for (j=0; j<rtemp; j++)//и это все делать если только память была!!! выделена
      delete []copytemp[i];
 delete []copytemp[i];
                   copytemp = new int*[rtemp];
................



--------------------
Мой блог
PM MAIL WWW   Вверх
apook
Дата 22.4.2007, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот сокращенный вариант, одна из твоих ошибок это обьявление по многу раз
переменных с одним и тем же именем, в частности массив int **temp ты соз
даешь второй раз локально для цикла, int i, int j по многу раз? 
Код

#include <iostream.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>
#include <stdlib.h>
#include <mem.h>
#include <string.h>

void main()
{

const int n=4, r1=10;

int MK[ r1 ][ n ]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,1},
          {0,1,1,0},{0,1,1,1},{1,0,0,1},{1,1,0,0},
          {1,1,0,1},{1,1,1,0}}; //massiv edinichnyh konyunkciy

int **temp, **copytemp, j, i, ii, c;
int sum=0, rtemp=r1;


for( i=0; i<rtemp; i++ ) //динамическая копия оригинала
    for( j=0; j<n; j++)
        temp[ i ][ j ]=MK[ i ][ j ];


for( rtemp=r1; rtemp<(r1*2); /*rtemp++*/ )
{
    copytemp=new int*[ rtemp ];    //память под старый массив
    for( j=0; j<rtemp; j++ )
        copytemp[ j ]=new int[ n ];

    for( i=0; i<rtemp; i++ )
        for( j=0; j<n; j++ )       //запомнили старый массив
            copytemp[ i ][ j ]=temp[ i ][ j ];


    for( j=0; j<rtemp; j++ )
        delete [] temp[ j ];
    delete [] temp;                 //удалили дин коп оригинала


    rtemp++;
    temp=new int*[ rtemp ];   //создали новый на один ряд больше
    for( i=0; i<rtemp; i++ )
       temp[ i ]=new int[ n ];


    for( i=0; i<(rtemp-1); i++ )
        for( j=0; j<n; j++ )
            temp[ i ][ j ]=copytemp[ i ][ j ];

    //- - - -- - --- - - -
    for( j=0; j<n; j++ )
        temp[ rtemp-1 ][ j ]=1; // для примера единичками заполнить новый ряд



    cout << endl << "------------------------" << endl;
    for( i=0; i<rtemp; i++ )
    {
        for( j=0; j<n; j++)
            cout << temp[ i ][ j ] << " ";
        cout << endl;
        }
    getch();


    for( j=0; j<rtemp; j++ )
        delete [] copytemp[ j ];
    delete [] copytemp;

    }



for( j=0; j<rtemp; j++ )
    delete [] copytemp[ j ];
delete [] copytemp[ j ];

for( j=0; j<rtemp; j++ )
    delete [] temp[ j ];
delete [] temp[ j ];
return;
}

но все-равно почему-то слегка глючно( этот new delete smile)


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


Новичок



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

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



Спасибо! Вопрос решен. Действительно был перебор с определением массивов.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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