Avatar billede andreas13_fam Nybegynder
14. februar 2011 - 13:48 Der er 7 kommentarer og
1 løsning

Problem med at hente værdier fra dynamisk array

Hej eksperter

Jeg er ikke særlig habil i C++ og er stødt på et problem.

Jeg har forsøgt at lave en Table klasse som på sigt skal kunne udskrive tabeller. Men jeg kan ikke hente (eller måske sætte) værdier til et dynamisk array som jeg har oprettet. Når jeg henter en værdi fra det for jeg kun den seneste satte værdi.

Håber i kan hjælpe


#include <iostream>
#include <string>
#include <sstream>

using namespace std;

class Table {
   
private:
    int width;
    int height;
    int currentCol;
    int currentRow;
    char** currentRowValues;
    void resetArray();
    void print();
   
public:
    Table(int argwidth, int argheight);
    ~Table();
    void fill(std::string text);
    void fill(const char* text);
    void fill(char* text);
};

Table::Table (int argwidth, int argheight) {
   
    //Set width og height
    width  = argwidth;
    height = argheight;
   
    //Nulstil og opret et array
    currentCol = 0;
    currentRow = 0;
    currentRowValues = new (nothrow) char*[width];
}

void Table::resetArray () {
    //Nulstil og opret et array
    delete[] currentRowValues;
    currentCol = 0;
    currentRowValues = new (nothrow) char*[width];
}

void Table::fill(char* text) {
   
    //Gem text
    cout << "Setter: currentRowValues[" << currentCol << "] = \"" << text << "\"; \n";
    currentRowValues[currentCol] = text;
   
    //Hvis currentCol er ligmed width: print, nulstil og hæv currentRow
    if (currentCol == (width - 1)) {
        cout << "\n";
       
        print();
        resetArray();
        currentRow = currentRow + 1;
    }
   
    else {
        currentCol = currentCol + 1;
    }
}

void Table::print() {
    cout << "Udskriver række: " << currentRow << "\n";
    for (int i=0; i<width; i++) {
        cout << "Getter: currentRowValues[" << i << "] = \"" << currentRowValues[i] << "\"; \n";
    }
    cout << "\n";
}

//Konventer alle former for input til char*
void Table::fill(std::string text) {
    fill((const char*)text.c_str());
}
void Table::fill(const char* text) {
    fill((char*)text);
}

//Destructor
Table::~Table() {
    delete[] currentRowValues;
}

int main (int argc, char * const argv[]) {
   
    system("clear");
   
    Table table(7, 6);
   
    for (int h=0;h<6;h++) {
       
        cout << "Sender række: " << h << "\n";
       
        for (int w=0;w<7;w++) {
           
            std::stringstream cellcontent;
           
            cellcontent << (w+1) << "x" << (h+1);
           
            table.fill(cellcontent.str());
           
        }       
       
    }
   
    return 0;
}
Avatar billede andreas13_fam Nybegynder
14. februar 2011 - 18:12 #1
Problemmet kan simplificeres til følgende:


#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main (int argc, char * const argv[]) {
   
    system("clear");
   
    char** row = new char*[7];
       
    for (int w=0;w<7;w++) {
           
        std::stringstream cellcontent;
        cellcontent <<  "--" << (w+1) << "--";
       
        char* text = (char *)cellcontent.str().c_str();
       
       
        cout << "Setter: row[" << w << "] = \"" <<  text << "\"; \n";
        row[w] = text;
           
    }
   
    cout << "\n";
    for (int i=0; i<7; i++) {
        cout << "Getter: row[" << i << "] = \"" << row[i] << "\"; \n";
    }
   
    delete[] row;
   
    return 0;
}
Avatar billede arne_v Ekspert
14. februar 2011 - 18:29 #2
proev og erstat:

        row[w] = text;

med:

        row[w] = new char[strlen(text)+1];
        strcpy(row[w], text);
Avatar billede arne_v Ekspert
14. februar 2011 - 18:29 #3
Du skal saa lige have en:

#include <cstring>

i toppen.
Avatar billede andreas13_fam Nybegynder
14. februar 2011 - 18:34 #4
Det virkede. Men jeg vil da gerne forstå hvad jeg gjorde forkert?

PS: er det ikke en lidt overdreven brug af dynamiske arrays?
Avatar billede arne_v Ekspert
14. februar 2011 - 18:37 #5
Det som text peger paa er kun validt indtil bunden af for loekken naaes.
Avatar billede andreas13_fam Nybegynder
14. februar 2011 - 19:02 #6
Mange tak, du er velkommen til at ligge et svar.
Avatar billede arne_v Ekspert
14. februar 2011 - 19:13 #7
svar
Avatar billede arne_v Ekspert
14. februar 2011 - 19:14 #8
Det er en af de ting man skal passe paa med i C++. Bare fordi en pointer peger paa noget validt et sted i programmet saa betyder det ikke at den bliver ved det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester