Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Подскажите как исправить...


Автор: Sasisa 21.4.2007, 15:01
В программе необходимо иметь динамический двумерный массив 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();

}


Автор: vinter 21.4.2007, 15:27
под копию не выделена память
оно поидее вообще работать не должна..если компилятор нормальный.

Автор: Sasisa 21.4.2007, 18:01
похоже, что дело не в этом. при первом обращении к  циклу 
Код
   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];


Автор: apook 21.4.2007, 18:08
Так у тебя rtemp=0

Автор: Sasisa 21.4.2007, 18:11
сначала 0. потом, при выполнении условия, rtemp++. и каждый раз при увеличении rtemp в массив temp добавляется строка.

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

Автор: Sasisa 21.4.2007, 18:51
расставил smile
первый раз я объявляю просто указатель на массив указателей, что компилятор не придирался.
а второй раз я указываю сколько указателей в массиве (определяю размер массива).

Автор: vinter 21.4.2007, 19:00
            не гут
 
Код
...............
 delete copytemp;
                   int **copytemp = new int*[rtemp];
................................

гут
Код

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

Автор: apook 22.4.2007, 07:22
Вот сокращенный вариант, одна из твоих ошибок это обьявление по многу раз
переменных с одним и тем же именем, в частности массив 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)

Автор: Sasisa 22.4.2007, 11:56
Спасибо! Вопрос решен. Действительно был перебор с определением массивов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)