Realokacja dwuwymiarowej tablicy przy pomocy funkcji 'realloc'

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ć?

0

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

0

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

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));
0

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

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!

0

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

1

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;
}
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

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