Zrobiłem tak jak mi powiedział człowiek który prowadzi ćwiczenia z programowania, tzn. napisał do mnie:
void tworzenie_macierzy(int w, int k, int **&tab) {//musimy dać referencję ponieważ musimy zmodyfikować w funkcji podwójny wskaźnik
tab=new int *[w]; // odnosimy się bezpośrednio do wskaźnika, nie ma potrzeby jego ponownej inicjalizacji
for (int i=0; i<w; i++)
tab[i]=new int [k];
cout<<"Wypelnij tablice";
for(int i=0; i<w; i++)
{
for(int j=0; j<k; j++)
{
cout<<"Podaj liczbe w "<<i+1<<" wierszu i "<<j+1<<" kolumnie";
cin>>tab[i][j];
}
}
cout<<endl<<endl<<"Wyswietlenie tablicy:"<<endl<<endl;
for(int i=0; i<w; i++){
for (int j=0; j<k; j++)
cout<<tab[i][j];
cout<<endl;
}
}
Przykładowe wywołanie:
int **A;
tworzenie_macierzy(3,4,A);
tylko że wyskakuje mi błąd pomimo, że wszystkie 3 pliki z osobna się kompilują :
C:\Documents and Settings\Bakik\Moje dokumenty\c+\macierze\main.o:main.cpp|| undefined reference to `dodawanie()'|
oraz
C:\Documents and Settings\Bakik\Moje dokumenty\c+\macierze\main.cpp||In function 'int main()':|
C:\Documents and Settings\Bakik\Moje dokumenty\c+\macierze\main.cpp|33|error: variable or field 'tworzenie_macierzy' declared void|
== Build finished: 1 errors, 0 warnings ===
Moje pliki wyglądają tak:
biblioteka.h
#ifndef BIBLIOTEKA_H
#define BIBLIOTEKA_H
// definicje funkcji
#include <iostream>
void tworzenie_macierzy(int w, int k, int **&tab);
void wczytanie_macierzy();
void wyznacznik();
void odwracanie();
void dodawanie();
void odejmowanie();
void mnozenie();
void dzielenie();
#endif // BIBLIOTEKA_H_INCLUDED
biblioteka.cpp
#include "biblioteka.h"
using namespace std;
void tworzenie_macierzy(int w, int k, int **&tab) {
tab=new int *[w];
for (int i=0; i<w; i++)
tab[i]=new int [k];
cout<<"Wypelnij tablice";
for(int i=0; i<w; i++)
{
for(int j=0; j<k; j++)
{
cout<<"Podaj liczbe w "<<i+1<<" wierszu i "<<j+1<<" kolumnie";
cin>>tab[i][j];
}
}
cout<<endl<<endl<<"Wyswietlenie tablicy:"<<endl<<endl;
for(int i=0; i<w; i++){
for (int j=0; j<k; j++)
cout<<tab[i][j];
cout<<endl;
}
}
void dodawanie()
{
int w1,k1,w2,k2,w3,k3;
cout<<"Podaj liczbe wierszy 1 macierzy";
cin>>w1;
cout<<"Podaj liczbe kolumn 1 macierzy";
cin>>k1;
int **tab1;
tworzenie_macierzy(w1, k1, tab1);
cout<<"Podaj liczbe wierszy 2 macierzy";
cin>>w2;
cout<<"Podaj liczbe kolumn 2 macierzy";
cin>>k2;
int **tab2;
tworzenie_macierzy(w2, k2, tab2);
// dodawanie
if((w1==w2)&&(k1==k2))
{
int x,z,a,b;
w3=w1;
k3=k1;
int **tablica_suma=new int *[w3];
for (int i=0; i<w3; i++)
tablica_suma[i]=new int [k3];
for(x=0; x<w3; x++)
{
for(z=0; z<k3; z++)
tablica_suma[x][z] = tab1[x][z]+tab2[x][z];
}
cout<<endl<<endl<<"Wyswietlenie tablicy:"<<endl<<endl;
for(int i=0; i<w3; i++){
for (int j=0; j<k3; j++)
cout<<tablica_suma[i][j];
cout<<endl;
}
for(int i = 0; i < w1; i++)
delete [] tab1[i]; // usuwamy tablicę każdego elementu tablicy
for(int i = 0; i < w2; i++)
delete [] tab2[i];
delete [] tab1; // usuwamy tablicę wskaźników na tamte tablice
delete [] tab2;
for(int i=0; i<w3; i++)
delete [] tablica_suma[i];
delete [] tablica_suma;
} }
oraz main.cpp główny:
#include "biblioteka.h"
using namespace std;
int main()
{
int liczba;
cout<<"Witaj. Podaj nr operacji, jaka chcesz wykonac na macierzy";
cout<<endl<<endl<<"1 Wpisz macierz recznie 2. Wczytaj macierz z pliku";
cout<<endl<<"3. Liczenie wyznacznika 4. Odwracanie macierzy";
cout<<endl<<"5. Dodawanie macierzy 6. Odejmowanie macierzy";
cout<<endl<<"7. Mnozenie dwóch macierzy 8. Dzielenie dwóch macierzy";
cin>>liczba;
switch (liczba)
{
case 1:
int w,k;
int **A;
cout<<"Podaj liczbe wierszy macierzy";
cin>>w;
cout<<"Podaj liczbe kolumn macierzy";
cin>>k;
void tworzenie_macierzy(w, k, A);
break;
/*
case 2:
wczytanie_macierzy();
break;
case 3:
wyznacznik();
break;
case 4:
odwracanie();
break;
*/
case 5:
dodawanie();
break;
/*
case 6:
odejmowanie();
break;
case 7:
mnozenie();
break;
case 8:
dzielenie();
break;
*/
}
return 0;
}
Nie potrafię sobie poradzić z tymi problemami, nie rozumiem co one znaczą a szukając z googli nie mogę dojść dokładnie co one znaczą. Myślałem, że teraz będzie wszystko ok, niestety nie jest.