Deklarowanie dynamicznych tablic dwuwymiarowych

0

Wiem, wiem, problem był już w innym wątku, ale jego temat nie odpowiada temu zagadnieniu. jakby co, tamten temat można już usunąć ;)

Otóż mój kod kompiluje się na dev-c++, ale na ms visualu już nie. Musi mieć dynamicznie tworzone tablice. Czy ktoś mógłby mi pomóc, i pokazać gdzie i jakie poprawki wprowadzić? Podobno to kwestia tylko ok. trzech linijek, w miejscach deklaracji tablic, ja niestety mimo wielu prób nie dałem rady tego sam zrobić.
Wierzę, że i tym razem ktoś pomoże :)
Miejsca, gdzie wymagane sa poprawy zaznaczone przypiami.
Aha, potrzebny będzie do tego chyba jeszcze destruktor, nie?

#include <iostream>
#include <fstream>
#include <cstdlib>


using namespace std;

class CData
{
private:
               
        char *Name1;
        char *Name2;
        fstream File1;
        fstream File2;
        int x;
        int y;

public:

        int InFile(char *InName);
        int OutFile(char *OutName);
        void Encryption();
        void Decryption();
        void Dim(int& a, int& b);
        void Close();
       
        CData(void ){
       
                Name1 = new char[128];
                Name2 = new char[128];
       
        }

        ~CData(){
       
                delete[] Name1;
                delete[] Name2;
       
        }

};
int CData::InFile(char *InName){


        strcpy(Name1, InName);                                       

        File1.open(Name1,ios::in);       

        if(File1.is_open()==true){

                cout << endl << "Source accessed successfully!" << endl;
   
        } 
       
        if(!File1){                                                                       
           
                cout << endl << "Unable to access source file" << Name1 << endl;
               
                return 1;
        }

  return 0;
}
int CData::OutFile(char *OutName){


        strcpy(Name2, OutName);                                               

        File2.open(Name2,ios::out);       

    if(File2.is_open()==true){

                cout << endl << "Target accessed successfully!" << endl;
   
        } 

        else if(!File2){                                                                               
           
                cout << endl << "Unable to access target file" << Name2 << endl;
               
                return 1;
        }

  return 0;
}
void CData::Dim(int& a, int& b){

        x = a;
        y = b;

}
void CData::Encryption(){

    char tab[x][y];            //     Deklaracja tablicy, do poprawy
    int i,j;
   

    for(i=0; i<x; i++){
         for(j=0; j<y; j++){     
                  tab[i][j]='\0';
         }
    }

    i=j=0;
   
    char zmienna;
    zmienna = File1.get();
   
    while (File1.good()){
          i=j=0;
          while((i<x) && (File1.good())){
          tab[i][j]=zmienna;
          zmienna = File1.get();
          if(i%2==0) j++;
          if(j==y){j--; i++;}
          if(i%2==1) j--;
          if(j==(-1)){j++; i++;} 
          }
         
          i=j=0;
         
          while (j<y){
          while(i<x){   
          File2.put (tab[i][j]);
          i++;             
          }                 
          i=0;
          j++;
          }
         
    for(i=0; i<x; i++){
         for(j=0; j<y; j++){     
                  tab[i][j]='\0';
         }
    }
   }   
}
void CData::Decryption(){

    char tab[x][y];            //     Deklaracja tablicy, do poprawy
    int i,j;

    for(i=0; i<x; i++){
         for(j=0; j<y; j++){     
                  tab[i][j]='\0';
         }
    }
   
    char zmienna;
    zmienna = File1.get(); 
   
   
    while(File1.good()){   
      i=j=0;                     
      while (j<y){
           while ((i<x) && (File1.good())){
                 tab[i][j]=zmienna;
                 zmienna = File1.get();
                 i++;                                                 
           }
           i=0;
           j++;
      }
         
      i=j=0;
     
      while(i<x){
           
            File2.put (tab[i][j]);
            if(i%2==0) j++;
            if(j==y){j--; i++;}
            if(i%2==1) j--;
            if(j==(-1)){j++; i++;}
           
      }       
    for(i=0; i<x; i++){
         for(j=0; j<y; j++){     
                  tab[i][j]='\0';
         }
    }
   }
}
void CData::Close(){

        File1.close();
        File2.close();

}

int main(){

        CData Object;
        char FileName1[128];
        char FileName2[128];
        int c;
        int d;
        int choise;

    cout << "Enter source file name:"<<endl;
    cin >> FileName1;

        Object.InFile(FileName1);

    cout << "Enter target file name:"<<endl;
    cin >> FileName2;

        Object.OutFile(FileName2);

    cout <<"Enter X dimension:"<<endl;
    cin >> c;

    cout <<"Enter Y dimension:"<<endl;
    cin >> d;

        Object.Dim(c, d);

        cout << "1. Encryption \n 2. Decryption"<<endl;
    cin >> choise;

    cout <<endl;
   

        switch (choise){
           case 1:
                Object.Encryption();
                break;
           case 2:
                Object.Decryption();
                break;
           default:
                return 0;
                break;
    } 

        Object.Close();

        system("PAUSE");

        return 0;
}
0

Po co kopiujesz sobie nazwę pliku? Potrzebne ci to do czegoś?
NIE!

char** tab; // wskaźnik na wskaźnik do char

// tworzenie tablicy
tab = new char*[x];
for(int i=0;i<x;++i)
     tab[i] = new char[y];

// dostęp noromalnie

// kasowanie tablicy:
for(int i=0;i<x;++i)
     delete [] tab[i];
delete [] tab;
0

Cholera, zanim zobaczyłem ten temat, odpowiedziałem ci w starym... ok, posprzątane, starego posta przekleję ci tu. To jest dokładnie to samo co Marek napisał, tylko ubrane w prostą klasę - Array2D pilnuje, żeby pamięć sama się zwolniła po opuszczeniu zasięgu, czyli masz zmienne zachowujące się identycznie, jak variable-length array z GNU C, których użyłeś wcześniej.

Oryginał:
a to się ucieszysz, bo ci nowa klasa dojdzie :) Wstaw gdzieś na samej górze taką klasę:

class Array2D
{
private:
        char** data;
        int rows;

public:
        Array2D(int _x, int _y) {

            rows = _x;
            data = new char*[rows];
	    for(int i=0; i<rows; i++) data[i] = new char[_y];
        }

        ~Array2D() {

            for(int i=0; i<rows; i++) delete []data[i];
            delete []data;

        }

        char* operator[](int x) {

            return data[x];
        }
};

a "deklaracje do poprawy" zamień na

Array2D tab(x,y);

jak znasz szablony, chociaż w podstawach, to możesz to zrobić również szablonowo. Wtedy nasza klasa Array2D by wyglądała tak:

template<class Type>
class Array2D {
    private:
        Type** data;
        int rows;
    public:
        Array2D(int _x, int _y) {
            rows = _x;
            data = new Type*[rows];
	    for(int i=0; i<rows; i++) data[i] = new char[_y];
            }
        ~Array2D() {
            for(int i=0; i<rows; i++) delete []data[i];
            delete []data;
            }
        Type* operator[](int x) {
            return data[x];
            }
    };

zaś "deklaracje do poprawy" tak:

Array2D<char> tab(x,y);

Wiem, że zmyślny jesteś - jak na razie całość była bardzo ładna - ale na wszelki wypadek (jak zaglądasz na 4p, to wiesz, że człowiek takie indywiduaa spotyka, że wiarę w ludzi się traci) masz w pastebin cały kod

1 użytkowników online, w tym zalogowanych: 0, gości: 1