Realokacja dwuwymiarowej tablicy przy pomocy funkcji 'realloc'

Odpowiedz Nowy wątek
2014-12-04 16:57
0

Witam!
Mam nastepujaca metode w klasie matrix

 bool matrix::readFromFile(char* fileName)
{
    ifstream file;
    file.open(fileName);
    if(!file.good()) return false;
    file>>x>>y;
    tab = (double**) realloc(tab, x * sizeof(double*));
    for(int i = 0; i < x; ++i)
        tab[i] = (double*) realloc(tab, y * sizeof(double));
    for(int i = 0; i < x; ++i)
        for(int j = 0; j < y; ++j)
            file>>tab[i][j];
    return true;
} 

W klasie mam wskaznik do tablicy wskazników (double **tab), na poczatku jest mallociem alokowana pamiec 1 x 1, pozniej chce z pliku odczytać rozmiar nowej macierzy i ja całą wczytac do powiekszonej tablicy.
Nie działa mi funkcja realloc, chyba nie tak jej uzywam. Mógłby ktoś podpowiedzieć jak to poprawić?

edytowany 1x, ostatnio: xxxmateusz00xxx, 2014-12-04 16:57

Pozostało 580 znaków

2014-12-04 17:21
0

A czy jest jakiś szczególny powód, dla którego nie możesz używać vector<vector<double>>?

Pozostało 580 znaków

2014-12-04 17:23
0

nie ma, ale chce użyć malloc'a, i realloc'a do zwiekszenia pamieci

Pozostało 580 znaków

2014-12-04 17:31
1

To ma sens jedynie przy nauce. A babola masz tu:

tab[i] = (double*) realloc(tab, y * sizeof(double));

powinno być:

tab[i] = (double*) realloc(tab[i], y * sizeof(double));

Pozostało 580 znaków

2014-12-04 17:35
0

Dzięki :D Że też tego nie zauważyłem ;D Wszystko działa, a program właśnie pisze w celach edukacyjnych ;)

Pozostało 580 znaków

2014-12-04 17:41
0

a nie masz crasha? Powiększając macierz robisz realloc na śmieciach pamięci!
Tak samo w przypadku pomniejszania macierzy masz wyciek pamięci!


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2014-12-04 20:08
0

No właśnie valgrind wywala mase błedow w całym programie, ktore nie do końca rozumiem :/

edytowany 1x, ostatnio: xxxmateusz00xxx, 2014-12-04 20:10

Pozostało 580 znaków

2014-12-05 10:35

Radzę nie kombinować z realloc, przynajmniej na razie.
Zrób sobie metodę do zwalniania i alokowania pamięci na macierz, a zmianę rozmiaru sobie daruj.
Po prostu twórz nowy kawałek pamięci wykonaj kopię i zwalniaj starą.

Na dodatek skoro robisz klasę od tego, to spokojnie możesz użyć jednego kawałka pamięci, do trzymania jedynie wartości, zysk na stosowaniu wskaźników do tablic jest zerowy jeśli opakowujesz to klasą z C++.
Zdefiniuj sobie takie operatory:

double matrix::operator()(int i, int j) const {
     assert(i>=0 && i<rowSize);
     assert(j>=0 && j<columnSize);
     return data[i*columnSize + j]
}

double &matrix::operator()(int i, int j) {
     assert(i>=0 && i<rowSize);
     assert(j>=0 && j<columnSize);
     return data[i*columnSize + j];
}

// i/albo
const double *matrix::operator[](int i) const {
     assert(i>=0 && i<rowSize);
     return data+i*columnSize;
}

double *matrix::operator[](int i) {
     assert(i>=0 && i<rowSize);
     return data+i*columnSize;
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2014-12-05 10:35

Pozostało 580 znaków

2014-12-05 11:44
Pijany Lew
0

Pomyśle nad przeładowaniem operatorów w taki sposób który podałeś, bo aktualnie, mam je podobnie przeciążone ale dla tablicy dwuwymiarowej i utworzenie tablicy jednowymiarowej zamiast dwuwymiarowej. Generalnie program ma za zadanie poćwiczyć przeładowanie operatorów, zgłaszanie wyjątków i alokowanie/realokowanie pamięci. Wcześniejsze programy musialem zrobic przy użyciu realloc'a i nie wiem czy i tym razem nie bedzie to wymagane, ale moze sprobuje jeszcze to samo napisac przy pomocy new, w sposób jaki podałeś na początku

serio napisałem to z takim nickiem? ;D - xxxmateusz00xxx 2014-12-05 11:45

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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