Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Program mnożenia macierzy. Problem z alokacją tablicy dwuwymiarowej

Ostatnio zmodyfikowano 2016-06-16 18:04
Autor Wiadomość
K1tsun
Temat założony przez niniejszego użytkownika
[C++] Program mnożenia macierzy. Problem z alokacją tablicy dwuwymiarowej
» 2016-06-16 12:59:17
Witam. Jestem studentem informatyki i piszę pracę na zaliczenie przedmiotu. Program ma mnożyć dwie macierze ściągnięte z pliku. Napotkałem problem kiedy alokuję nową tablice dwuwymiarową. Próbowałem różnych sposobów, jednakże kończy sie na tym, że do funkcji loadMatrix przekazywana jest tablica jednoelementowa (wskaźnik?), a dalej nie mogę przypisywać.
Oto kod jaki do tej pory napisałem i prosiłbym o pomoc
C/C++
#include<iostream>
#include<string>
#include<cstdlib>
#include<fstream>
using namespace std;
struct dimm
{
    int wiersze, kolumny;
};
dimm loadDimensions( string nazwa );
int ** allocMatrix2D( int dim1, int dim2 );
void deleteMatrix2D( int **& );
void loadMatrix( string nazwa, int **& macierz, dimm rozmiar );
bool check( int kolumny2, int wiersze1 );
int ** multMatrix( dimm dimm1, dimm dimm2, int **& macierz1, int **& macierz2, int **& macierz3 );
void saveMatrix( int **& matrix );
int main()
{
    dimm rozmiar1;
    dimm rozmiar2;
    int ** macierz1, macierz2, macierz3;
    //pobieranie rozmiaru macierzy
    rozmiar1 = loadDimensions( "macierz1.txt" );
    rozmiar2 = loadDimensions( "macierz2.txt" );
    if( check( rozmiar1.kolumny, rozmiar2.wiersze ) )
    {
        macierz1 = allocMatrix2D( rozmiar1.wiersze, rozmiar1.kolumny );
        /*int** macierz2 = allocMatrix2D(rozmiar2.wiersze,rozmiar2.kolumny);
        int** macierz3 = allocMatrix2D(rozmiar2.wiersze,rozmiar1.kolumny);
        */ loadMatrix( "macierz1.txt", macierz1, rozmiar1 ); /*
        loadMatrix("macierz2.txt",macierz2);
        multMatrix(rozmiar1,rozmiar2,macierz1,macierz2,macierz3);
        saveMatrix(macierz3);*/
    }
    else
    {
        cout << "Macierzy nie da sie pomnozyc";
        system( "PAUSE" );
        return 0;
    }
   
   
   
    return 0;
}
int ** allocMatrix2D( int dim1, int dim2 ) {
    int ** macierz2d = new int *[ dim1 ];
    int * dumm = new int[ dim1 * dim2 ];
   
    for( int i = 0; i < dim1; i++ )
         macierz2d[ i ] = dumm + i * dim2;
   
    return macierz2d;
}

void deleteMatrix2D( int **& macierz2d )
{
    delete[] macierz2d[ 0 ];
    delete[] macierz2d;
    macierz2d = 0;
}

dimm loadDimensions( string nazwa )
{
    int i = 1;
    dimm rozmiar;
    string bufor;
    ifstream plik;
    plik.open( nazwa.c_str(), ios::binary );
    if( plik.good() )
    {
        while( true )
        {
            if( i == 1 )
            {
                plik >> bufor;
                rozmiar.wiersze = atoi( bufor.c_str() );
            }
            else if( i == 2 )
            {
                plik >> bufor;
                rozmiar.kolumny = atoi( bufor.c_str() );
            }
            else
                 break;
           
            i++;
           
           
        }
        return rozmiar;
        plik.close();
    }
    else
    {
        plik.close();
        cout << "Nie można otworzyć pliku!!!";
        rozmiar.wiersze = 0;
        rozmiar.kolumny = 0;
        return rozmiar;
       
    }
   
   
}

bool check( int kolumny1, int wiersze2 )
{
    if( kolumny1 == wiersze2 )
    {
        cout << "Lights are green, here-a-we-go";
        return 1;
    }
    else
    {
        cout << "Macierze nie spełniają warunków";
        return 0;
    }
   
   
   
}

void loadMatrix( string nazwa, int **& macierz, dimm rozmiar )
{
    int i = 0;
    string bufor;
    ifstream plik;
    plik.open( nazwa.c_str(), ios::binary );
    if( plik.good() )
    {
        while( i < 2 )
        {
            plik >> bufor;
            i++;
        }
       
       
        for( i = 0; i < rozmiar.wiersze + 2; i++ )
        {
            for( int j = 0; j < rozmiar.kolumny; j++ )
            {
                plik >> bufor;
                macierz[ i ][ j ] = atoi( bufor.c_str() );
               
            }
        }
        plik.close();
    }
    else
    {
        plik.close();
        cout << "Nie wiem jak to zrobiles, ale nie mozna otworzyc pliku";
       
    }
   
   
   
}
P-149181
mateczek
» 2016-06-16 18:04:12
kilka rzeczy jest co-najmniej dziwnych w tym kodzie !!!
C/C++
void loadMatrix( string nazwa, int **& macierz, dimm rozmiar ) // wskaźnik przez referencje jest zbędny aczkolwiek nie szkodliwy
{
    int i = 0;
    //string bufor;   // po co bufor??
    ifstream plik( nazwa );
    //plik.open( nazwa.c_str(), ios::binary );
    //int wiersze kolumny;
    //plik>>wiersze>>kolumny; // możesz wczytać z pliku i to poniżej while pominąć  
    if( plik.good() )
    {
        while( i < 2 )
        {
            plik >> bufor;
            i++;
        }
       
       
       
        for( i = 0; i < rozmiar.wiersze + 2; i++ ) //dlaczego +2?? ewidentnie wywalisz poza zakres co niewątpliwie jest przyczyną problemów
        {
            for( int j = 0; j < rozmiar.kolumny; j++ )
            {
                plik >> macierz[ i ][ j ] // przecież można tak bez żadnych buforów
            }
        }
        plik.close(); //destruktor i tak zamknie plik więc zbędne
    }
    else
    {
        plik.close();
        cout << "Nie wiem jak to zrobiles, ale nie mozna otworzyc pliku";
       
    }
   
   
   
}
PS.
Funkcja alokująca przyznaje oryginalna. Ja to zrobiłem inaczej. http://cpp0x.pl/forum/temat/​?id=23012. kod w trzecim poście
P-149187
« 1 »
  Strona 1 z 1