[C++] Tworzenie tablic dwuwymiarowych - operacje na plikach

palcedavosa12
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 29 sty 2017, o 15:42
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Podziękował: 1 raz

[C++] Tworzenie tablic dwuwymiarowych - operacje na plikach

Post autor: palcedavosa12 »

Mam trzy funkcje :
utworz - tworzy ona tablice o wymiarze do niej przekazanym (wiersze, kolumny) i wypełnia je zerami

Kod: Zaznacz cały

double** utworz(const unsigned int wiersze, const unsigned kolumny)
{
    double**tab = new double* [wiersze];
    for(unsigned i=0; i<wiersze; i++)
    {
        tab[i] = new double [kolumny];
            for(unsigned j=0; j<kolumny; j++)
            tab[i][j]=0;
    }
    return tab;

}
czytaj - powinna pobierać najpierw rozmiary tablicy,a potem jej wartości i wrzucić te wartosci w macierze

Kod: Zaznacz cały

bool czytaj (ifstream &plik, double **tab1, unsigned int &wiersze1,  unsigned int &kolumny1, double **tab2, unsigned int &wiersze2, unsigned int &kolumny2)
{

 plik >> wiersze1;
 plik >> kolumny1;
 if(wiersze1==0 || kolumny1==0) return false;


 tab1=utworz(wiersze1,kolumny1);

 for(unsigned i = 0; i < wiersze1; ++i)
		for(unsigned j = 0; j < kolumny2; ++j)
			plik >> tab1[i][j];

 plik>>wiersze2;
 plik>>kolumny2;
  if(wiersze2==0 || kolumny2==0) return false;


 tab2=utworz(wiersze2,kolumny2);
  for(unsigned i = 0; i < wiersze2; ++i)
		for(unsigned j = 0; j < kolumny2; ++j)
			plik >> tab2[i][j];

return true;
}
wyswietl - wyświetla w konsoli - używam jej kontrolnie, zeby sprawdzić czy śmiga

Kod: Zaznacz cały

void wyswietl(double** tab, const unsigned int wiersze, const unsigned kolumny)
{
    for(unsigned i=0; i<wiersze; i++)
    {

    {
        for(unsigned j=0; j<kolumny; j++)
        cout<<"["<<tab[i][j]<<"]";
    }
        cout<<endl;
    }
}
usun - usuwa tablicę dwuwymiarową

Kod: Zaznacz cały

void usun(double **tab, const unsigned int wiersze)
{
     for(unsigned i=0; i<wiersze; i++)
     {
         delete [] tab [i];
     }
     delete[]tab;
}
A tak wygląda main :

Kod: Zaznacz cały

int main()
{/////////////////////////////////////////////////////////////////////testy funkcji
ifstream wejscie("dane.txt");
double**A=0;
double**B=0;
unsigned int n,m,p,q;
bool udalo;

if(czytaj(wejscie,A,m,n,B,p,q))
 {
    testowa_wyswietl(A,m,n);
    testowa_wyswietl(B,p,q);
 }
 else cout<<"bd w pliku, zle wymiary"<<endl;


wejscie.close();
usun(A,m);
usun(B,p);

//////////////////////////////////////////////////////////////////////testy funkcji

   return 0;
Problem polega na tym, że program się kompiluje, lecz nic sie nie dzieje. Po chwili program "przestaje działać". W konsoli pojawia się linijka what(): std::bad_alloc. Domyślam się, że to problem z alokacją pamięci w tych tablicach dynamicznych, lecz nie wiem za bardzo w czym tkwi błąd
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Tworzenie tablic dwuwymiarowych - operacje na plikach

Post autor: mortan517 »

Spróbuj napisać program testujący samą funkcję utwórz, jeżeli wtedy nie rzuci wyjątku, zapisz coś tam, wyświetl, usuń. A jak wszystko będzie w porządku zajmiesz się resztą kodu, bo teraz nie wiadomo co działa a co nie.

Kilka uwag:
- kod warto byłoby pisać w języku angielskim
- raz używasz unsigned int, raz unsigned
- wartości typu int można spokojnie przekazać przez wartość, nie trzeba referencji
palcedavosa12
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 29 sty 2017, o 15:42
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Podziękował: 1 raz

[C++] Tworzenie tablic dwuwymiarowych - operacje na plikach

Post autor: palcedavosa12 »

Kod: Zaznacz cały

#include <iostream>
#include <fstream>

using namespace std;

double** utworz(const unsigned  wiersze, const unsigned kolumny)
{
    double**tab = new double* [wiersze];
    for(unsigned i=0; i<wiersze; i++)
    {
        tab[i] = new double [kolumny];
            for(unsigned j=0; j<kolumny; j++)
            tab[i][j]=0;
    }
    return tab;



int main()
{
   ifstream dane("dane.txt");
   unsigned a,b;
   double **A;
   dane>>a>>b;
   A=utworz(a,b);

   for(unsigned i=0;i<a;i++)
   {
       cout<<endl;
       for(unsigned j=0;j<a;j++)
       cout<<"["<<A[i][j]<<"]";
   }
return 0;
}

Testuję w ten sposób, wyswietla to samo, czyli faktycznie, tutaj jest błąd. pozmieniałem na unsigned zeby było jednolicie, ale to chyba nie o to chodziło. ;/
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Tworzenie tablic dwuwymiarowych - operacje na plikach

Post autor: kalwi »

Wstaw ten cały kod do jednego [ code ] i wstaw też plik dane.txt jak ma wyglądać
ODPOWIEDZ