c++ przekazywanie parametru tablica dwuwymiarowa

0

Witam panowie, mam problem. Na zaliczenie muszę zrobić kalkulator macierzy z wykorzystaniem tablic dwuwymiarowych, wszystko już mam gotowe ale wszystko w mainie a chciałbym włożyć to poza mainem a w nim odwoływać się tylko do poszczególnych części programu ale nie wiem jak to zrobić, próbowałem zrobić voidy ale nie wiem jak przekazywać parametry.

Tutaj kawałek kodu, który chciałbym umieścić osobno :

    //Mnozenie przez liczbe
int liczba;
cout << "Przez ile pomnozyc macierz : "; 
cin >> liczba; 
for (int i=0; i<wiersze; i++) 
{ 
	for (int j=0; j<kolumny; j++) 
	{ 
		macierz[i][j] = macierz[i][j] * liczba;
	} 
}

Proszę o pomoc, z góry dziękuje ;-)

0

Rozumiem, że chodzi Ci o zdefiniowanie takiej funkcji przed mainem. Jeśli chcesz podać w swojej funkcji jako argument tablicę dwuwymiarową to możesz napisać : (przykładowo dla tablicy integerów)

void nazwa_funkcji(int** tab)
0

Chodzi o to, że przykładowo mam polecenie, które odpowiada za wypełnienie macierzy

	    for (int i=0; i<wiersze; i++) 
	 	{ 
			for (int j=0; j<kolumny; j++) 
			{ 
		 		cout << "Podaj wartosci elementow pierwszej macierzy : "; 
				cin >> macierz[i][j]; 
			} 
	 	} 

Chce go wyrzucić z maina, zdefiniować go poza mainem a w mainie już tylko odwołać się do niej.

0

@lukashid podał ci deklaracje, w main'ie wywołujesz tak: nazwa_funkcji(macierz);

0

Za mainem dałem

void wypelnienie(int** macierz, int wiersze, int kolumny)
{
	   for (int i=0; i<wiersze; i++) 
         { 
            for (int j=0; j<kolumny; j++) 
            { 
                 cout << "Podaj wartosci elementow pierwszej macierzy : "; 
                cin >> macierz[i][j]; 
            } 
         } 
}

A w mainie

wypelnienie(macierz, wiersze, kolumny);

Oczywiście przed tym jest zadeklarowana macierz, wiersze i kolumny i wyskakuje ciągle ten sam błąd :

[Error] cannot convert 'int (*)[(((sizetype)(((ssizetype)kolumny) + -1)) + 1)]' to 'int**' for argument '1' to 'void wypelnienie(int**, int, int)'

0

Pokaż cały kod. Ciekawe jak zadeklarowałeś macierz bo statycznie a dynamicznie to rożnica w przypadku deklaracji funkcji która przyjmuję taką tablicę.

0

Statycznie

	 	int kolumny;
		int wiersze;

		cout<<"Wprowadz rozmiary macierzy : \n";
		cout<<"\n Liczba wierszy : \n";
		cin>>wiersze;
		cout<<"\n Liczba kolumn : \n";
		cin>>kolumny;
		int macierz[wiersze][kolumny];
1

To jest ani satatycznie ani dynamicznie.
Kompilator przy tworzeniu tablic statycznych musi znać wielkość tablicy.
Ty musisz to zrobić dynamicznie ponieważ uzyskujesz dane o wielkości w trakcie działania programu.

    int kolumny;
        int wiersze;
 
        cout<<"Wprowadz rozmiary macierzy : \n";
        cout<<"\n Liczba wierszy : \n";
        cin>>wiersze;
        cout<<"\n Liczba kolumn : \n";
        cin>>kolumny;
        int **macierz=new int*[wiersze];
        for(int i=0; i<wiersze; ++i) macierz[i]=new int[kolumny];
     Oczywiście trzeba pamiętać o zwolnieniu aby zapobiec wyciekom.
    
 
         for(int i=0; i<wiersze; ++i) delete [] macierz[i];
         delete [] macierz;  
0

Wielkie dzięki :) Działa tylko jeszcze mam problem z odwrotnością macierzy i mnożeniem przez drugą macierz

0

Jaki problem?

0

Mam zrobione dodawanie/odejmowanie/mnozenie przez liczbe, kiedy dodalem to ostatnie zaczal wyskakiwac error "terminate called after throwing an instance of 'std::bad_alloc' " po wpisaniu liczby wierszy i kolumn macierzy

Coś z tym kodem musi być nie tak

		int kolumny;
        int wiersze;
        cout<<"Wprowadz rozmiary macierzy : \n";
        cout<<"\n Liczba wierszy : \n";
        cin>>wiersze;
        cout<<"\n Liczba kolumn : \n";
        cin>>kolumny;
        int **macierz=new int*[wiersze];
        for(int i=0; i<wiersze; ++i) macierz[i]=new int[kolumny];
		
		int kolumnyB;
		int wierszeB;
        int **macierzB=new int*[wierszeB]; 
        for(int i=0; i<wierszeB; ++i) macierzB[i]=new int[kolumnyB];
        int liczba;
0

Mam zrobione dodawanie/odejmowanie/mnozenie przez liczbe, kiedy dodalem to ostatnie zaczal wyskakiwac error "terminate called after throwing an instance of 'std::bad_alloc' " po wpisaniu liczby wierszy i kolumn macierzy

Coś z tym kodem musi być nie tak

		int kolumny;
        int wiersze;
        cout<<"Wprowadz rozmiary macierzy : \n";
        cout<<"\n Liczba wierszy : \n";
        cin>>wiersze;
        cout<<"\n Liczba kolumn : \n";
        cin>>kolumny;
        int **macierz=new int*[wiersze];
        for(int i=0; i<wiersze; ++i) macierz[i]=new int[kolumny];
		
		int kolumnyB;
		int wierszeB;
        int **macierzB=new int*[wierszeB]; 
        for(int i=0; i<wierszeB; ++i) macierzB[i]=new int[kolumnyB];
        int liczba;
0

Mam zrobione dodawanie/odejmowanie/mnozenie przez liczbe, kiedy dodalem to ostatnie zaczal wyskakiwac error "terminate called after throwing an instance of 'std::bad_alloc' " po wpisaniu liczby wierszy i kolumn macierzy

Coś z tym kodem musi być nie tak

		int kolumny;
        int wiersze;
        cout<<"Wprowadz rozmiary macierzy : \n";
        cout<<"\n Liczba wierszy : \n";
        cin>>wiersze;
        cout<<"\n Liczba kolumn : \n";
        cin>>kolumny;
        int **macierz=new int*[wiersze];
        for(int i=0; i<wiersze; ++i) macierz[i]=new int[kolumny];
		
		int kolumnyB;
		int wierszeB;
        int **macierzB=new int*[wierszeB]; 
        for(int i=0; i<wierszeB; ++i) macierzB[i]=new int[kolumnyB];
        int liczba;
0

Mam zrobione dodawanie/odejmowanie/mnozenie przez liczbe, kiedy dodalem to ostatnie zaczal wyskakiwac error "terminate called after throwing an instance of 'std::bad_alloc' " po wpisaniu liczby wierszy i kolumn macierzy

Coś z tym kodem musi być nie tak

		int kolumny;
        int wiersze;
        cout<<"Wprowadz rozmiary macierzy : \n";
        cout<<"\n Liczba wierszy : \n";
        cin>>wiersze;
        cout<<"\n Liczba kolumn : \n";
        cin>>kolumny;
        int **macierz=new int*[wiersze];
        for(int i=0; i<wiersze; ++i) macierz[i]=new int[kolumny];
		
		int kolumnyB;
		int wierszeB;
        int **macierzB=new int*[wierszeB]; 
        for(int i=0; i<wierszeB; ++i) macierzB[i]=new int[kolumnyB];
        int liczba;
0

Nigdzie nie inicjalizujesz zmiennych kolumnyB i wierszeB.

0

sa inicjowane przy dodawaniu i odejmowaniu, tutaj masz caly kod

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <cstdio>

using namespace std;

void wypelnienie(int** macierz, int wiersze, int kolumny)
{
       for (int i=0; i<wiersze; i++) 
         { 
            for (int j=0; j<kolumny; j++) 
            { 
                 cout << "Podaj wartosci elementow pierwszej macierzy : "; 
                cin >> macierz[i][j]; 
            } 
         } 
}

void pokazywanieA(int** macierz, int wiersze, int kolumny)
{
		for (int i = 0; i < wiersze; ++i)
	    {
	        for (int j = 0; j < kolumny; ++j)
	        cout << macierz[i][j] << " ";
	        cout << "\n";
	    }
}

void pokazywanieB(int** macierzB, int wierszeB, int kolumnyB)
{
		for (int i = 0; i < wierszeB; ++i)
	    {
	        for (int j = 0; j < kolumnyB; ++j)
	        cout << macierzB[i][j] << " ";
	        cout << "\n";
	    }
}

void dodawanieMacierzy(int** macierzB, int wierszeB, int kolumnyB, int** macierz, int wiersze, int kolumny)
{
	cout<<"Wprowadź rozmiary drugiej macierzy : \n";
	cout<<"\n Liczba wierszy : \n";
	cin>>wierszeB;
	cout<<"\n Liczba kolumn : \n";
	cin>>kolumnyB;
    if(wiersze == wierszeB , kolumny == kolumnyB)
    {
	    for (int i=0; i<wierszeB; i++) 
	 	{ 
			for (int j=0; j<kolumnyB; j++) 
			{ 
				cout << "Podaj wartosc elementow drugiej macierzy : "; 
				cin>>macierzB[i][j];
				macierzB[i][j] = macierz[i][j] + macierzB[i][j];
			} 
    	}
		//Pokazanie macierzy
		pokazywanieA(macierzB, wierszeB, kolumnyB);
		for(int i=0; i<wiersze; ++i) delete [] macierz[i];
        delete [] macierz;  
        for(int i=0; i<wierszeB; ++i) delete [] macierzB[i];
        delete [] macierzB;  
    }
    else
    {
    	cout<<"Inna liczba kolumn lub wierszy, macierzy nie da sie dodac!";
    }
}

void odejmowanieMacierzy(int** macierzB, int wierszeB, int kolumnyB, int** macierz, int wiersze, int kolumny)
{
	cout<<"Wprowadź rozmiary drugiej macierzy : \n";
	cout<<"\n Liczba wierszy : \n";
	cin>>wierszeB;
	cout<<"\n Liczba kolumn : \n";
	cin>>kolumnyB;
    if(wiersze == wierszeB , kolumny == kolumnyB)
    {
	    for (int i=0; i<wierszeB; i++) 
	 	{ 
			for (int j=0; j<kolumnyB; j++) 
			{ 
				cout << "Podaj wartosc elementow drugiej macierzy : "; 
				cin>>macierzB[i][j];
				macierzB[i][j] = macierz[i][j] - macierzB[i][j];
			} 
    	}
		//Pokazanie macierzy
		pokazywanieB(macierzB, wierszeB, kolumnyB);
		for(int i=0; i<wiersze; ++i) delete [] macierz[i];
        delete [] macierz;  
        for(int i=0; i<wierszeB; ++i) delete [] macierzB[i];
        delete [] macierzB;  
    }
    else
    {
    	cout<<"Inna liczba kolumn lub wierszy, macierzy nie da sie dodac!";
    }
}

void mnozeniePrzezLiczbe(int** macierz, int wiersze, int kolumny, int liczba)
{
		//Mnozenie przez liczbe
	cout << "Przez ile pomnozyc macierz : "; 
	cin >> liczba; 
 	for (int i=0; i<wiersze; i++) 
 	{ 
		for (int j=0; j<kolumny; j++) 
		{ 
			macierz[i][j] = macierz[i][j] * liczba;
			
		} 

 	}
 	//Pokazanie macierzy
		pokazywanieA(macierz, wiersze, kolumny);
		for(int i=0; i<wiersze; ++i) delete [] macierz[i];
        delete [] macierz;  
}

int main(int argc, char** argv) 
{	
	int b=0,li=0;
	int q=0,w=1;
	for(;q!=w;)
	{
		system("cls");
		
		//Tworzenie i zerowanie macierzy
		int kolumny;
        int wiersze;
        cout<<"Wprowadz rozmiary macierzy : \n";
        cout<<"\n Liczba wierszy : \n";
        cin>>wiersze;
        cout<<"\n Liczba kolumn : \n";
        cin>>kolumny;
        int **macierz=new int*[wiersze];
        for(int i=0; i<wiersze; ++i) macierz[i]=new int[kolumny];
		
		int kolumnyB;
		int wierszeB;
        int **macierzB=new int*[wierszeB]; 
        for(int i=0; i<wierszeB; ++i) macierzB[i]=new int[kolumnyB];
        int liczba;
	    
	    //Wypelnianie macierzy
		wypelnienie(macierz, wiersze, kolumny);
		
		system("cls");
		
		//Pokazanie macierzy
		pokazywanieA(macierz, wiersze, kolumny);
		
		cout<<"Wybierz operacje : \n";
		cout<<" \n1. Dodawanie\n2. Odejmowanie\n3. Mnozenie\n4. Mnozenie przez liczbe rzeczywista\n5. Odwrotnosc\n6. Zakoncz program\n";
		cin>>b;
		switch (b)
	{
	
	case 1:system("cls");
	//Dodawanie macierzy
	dodawanieMacierzy(macierzB, wierszeB, kolumnyB, macierz, wiersze, kolumny);
	getch();   break;
	
	case 2:system("cls");
	odejmowanieMacierzy(macierzB, wierszeB, kolumnyB, macierz, wiersze, kolumny);
	getch();   break;
	
	case 3:system("cls");
	getch();   break;
	
	case 4:system("cls");
	mnozeniePrzezLiczbe(macierz, wiersze, kolumny, liczba);
	getch();   break;
	
	case 5:system("cls");
	getch();   break;
	
	case 6:
	w=0;break;
	
	default:
	cout<<"Zla opcja sprobuj ponownie";
	getch();   break;
	
	system("PAUSE");
	return EXIT_SUCCESS; 
	}
	
	}


	
	
	return 0;
}
1

Nie, wcale nie:

        int kolumnyB;
        int wierszeB;
        int **macierzB=new int*[wierszeB]; 
        for(int i=0; i<wierszeB; ++i) macierzB[i]=new int[kolumnyB];

Ile wynoszą wierszeB oraz kolumnyB w tym momencie?

0
 
int main(int argc, char** argv) 
{    
    int b=0,li=0;
    int q=0,w=1;
    for(;q!=w;)
    {
        system("cls");
 
        //Tworzenie i zerowanie macierzy
        int kolumny;
        int wiersze;
        cout<<"Wprowadz rozmiary macierzy : \n";
        cout<<"\n Liczba wierszy : \n";
        cin>>wiersze;
        cout<<"\n Liczba kolumn : \n";
        cin>>kolumny;
        int **macierz=new int*[wiersze];
        for(int i=0; i<wiersze; ++i) macierz[i]=new int[kolumny];
 
        int kolumnyB; // bez inicjalizacji
        int wierszeB; // jw.
        int **macierzB=new int*[wierszeB]; // ups...
        for(int i=0; i<wierszeB; ++i) macierzB[i]=new int[kolumnyB]; 
        int liczba;
        //...

Prześledź kawałek Twoje kodu z trzema, moimi komentarzami.

0

A to nie jest tak, ze tylko deklaruje a nadaje im wartosc kiedy mi sa potrzebne np w voidzie "dodawanieMacierzy"?

0

chyba, ze np nadam im wartosc 0 a potem ewentualnie zmienie?

0

No tak, ale akurat są Ci potrzebne, gdy tworzysz tablicę :P
Jak nadasz im wartość zero, to stworzysz sobie tablicę o zerowej liczbie elementów i w funkcji dodawanieMacierzy będziesz pisał po niezaalokowanej pamięci.

0

No to jak moge ten problem rozwiazac abym tylko na potrzeby czesci programu mogl stworzyc i zadeklarowac macierzB

0

Ja bym to zrobił obiektowo - klasa Matrix zawierająca jej dane (szerokość oraz wysokość i pole ze wskaźnikiem na dane liczbowe) oraz metody w stylu:

class Matrix
{
 /* ... */
 Matrix add(Matrix b)
 {
  if ((getWidth != b.getWidth) || (getHeight != b.getHeight))
   return null;

  Matrix result = new Matrix(getWidth, getHeight); // tworzy macierz o podanych wymiarach

  /* ... */

  return result;
 }
}

No proszę, jak schludnie to teraz wygląda.

PS if(wiersze == wierszeB , kolumny == kolumnyB) to nie robi tego, co myślisz.

0

A moge zrobic w jednej klasie 2 typy macierzy?

0

To zależy, co masz na myśli?

0

Ok problem rozwiązałem. Słuchaj, masz może jakiś pomysł na mnożenie przez inną macierz bądź odwrócenie danej macierzy? Myślę i nie mam naprawdę zielonego pojęcia jak to zrobić

0

Jednak dużo nie naprawiłem bo program działa ale po obliczeniu dodawania do macierzy 2x2 "Program Projekt1.exe przestał działać" a większych nawet nie wczyta a już wywala ... Zrobiłem tak jak napisałem. Nadałem im wartość 0 a potem w działaniu nadaje się im inną wartość a po wykonaniu działania macierz jest kasowana z pamięci i robiona na nowo.

0

Wrzuć kod.

A odnośnie mnożenia: http://www.math.edu.pl/mnozenie-macierzy :P

0

Zdałem z dosyć dobrym wynikiem :) Dziękuję wszystkim za pomoc

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