Przekazanie tablicy dynamicznej jako parametr w funkcji

2011-05-06 17:05
0

Jak przekazać jako parametr funkcji tablicę dynamiczną?
Wiadomo że deklaracja tablicy dynamicznej wygląda tak:
int *tab=new int [w];
for (int i=0; i<w; i++)
tab[i]=new int [k];

Ja natomiast chcę zrobić funkcję tworzącą macierz, gdzie parametrami będą: liczba kolumn macierzy, liczba wierszy macierzy no i sama tablica 2-wymiarowa, po to by np. w funkcji dodawania wywołać funkcję tworzenia macierzy 2 razy i operować na samych liczbach wierszy i kolumn w pętlach (w funkcji dodawania dodać odpowiednie współrzędne) i przekazać ich sumę do następnej, nowej wynikowej macierzy, wyświetlić ją i usunąć tablicę dynamiczną - zwolnić pamięć.
Na przykład:

void tworzenie_macierzy(int w, int k, int **tab) {

int **tab=new int *[w]; // tutaj mam problem bo nie może być czegoś takiego jak int **tab
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;
}

} 

Pozdrawiam

edytowany 1x, ostatnio: the_barti, 2011-05-06 17:06

Pozostało 580 znaków

2011-05-06 17:27
0

int **tab=new int *[w]; // tutaj mam problem bo nie może być czegoś takiego jak int **tab
No przecież jak funkcja dostaje w argumencie tab, to nie możesz deklarować jeszcze raz tej tablicy o tej samej nazwie...

edytowany 1x, ostatnio: aurel, 2011-05-06 17:27

Pozostało 580 znaków

2011-05-06 17:34
0

owszem, dlatego nie wiem jak to zrobić, napisałem że tak być nie może ;)

Pozostało 580 znaków

2011-05-06 17:41
0
void tworzenie_macierzy(int w, int k, int **tab)
 {

    cout<<"Wypelnij tablice:\n";
    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<< "\n\n" <<"Wyswietlenie tablicy:"<< "\n\n"; // zamieniłem z  << endl << endl na << "\n\n", z powodu tego, że jest szybsze a dwa, że jest to zbyt krótki program, żeby to nie działało jak należy, buffor i tak zwolni to co ma w sobie i wyswietli zanim się zapełni

    for(int i=0; i<w; i++)
    {
        for (int j=0; j<k; j++)
            cout<<tab[i][j] << " ";
        cout<<endl;
    }
} 

int main()
{
    int w = 3, k = 2;
    int **tab=new int *[w]; // tutaj mam problem bo nie może być czegoś takiego jak int **tab
    for (int i=0; i<w; i++)
         tab[i]=new int [k];

    tworzenie_macierzy(w, k, tab);

//EDIT: MUSISZ ZLIKWIDOWAĆ ZAREZERWOWANĄ PAMIĘĆ PRZED ZAKOŃCZENIEM PROGRAMU!

    for(int i = 0; i < w; i++)
        delete [] tab[i]; // usuwamy tablicę każdego elementu tablicy

    delete [] tab; // usuwamy tablicę wskaźników na tamte tablice (oba usuwania muszą się znaleźć, bo inaczej usuwałbyś tylko pierwsze elementy a reszta by została)

    system("pause");
    return 0;
}

Nie wiem czy funkcja jest napisana w porzadku, bo ją tylko przekopiowalem, ale wydaje mi sie ze teraz powinno zadzialac

Ale z tego programu strasznie cieknie, dlatego nie jest to dobre abyś go odpalał zanim nie zlikwidujesz całej tablicy dwuwymiarowej


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 4x, ostatnio: MJay, 2011-05-06 18:21

Pozostało 580 znaków

2011-05-06 18:07
0

Okej, tylko jak teraz napisać funkcję dodawania, skoro tworzenie jej zachodzi w int main() ?
Tzn. nie wiem czy ja w ogóle dobrze rozumuję, chciałbym zrobić coś takiego jak niżej, ten kod jest w pliku biblioteka.cpp, mam jeszcze drugi biblioteka.h z deklaracjami funkcji.

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;

    tworzenie_macierzy(w1, k1, tab1);   // tutaj wywala błąd że tab1 was not declared in this scope

        cout<<"Podaj liczbe wierszy 2 macierzy";
cin>>w2;
cout<<"Podaj liczbe kolumn 2 macierzy";
cin>>k2;

    tworzenie_macierzy(w2, k2, tab2); // tutaj też oczywiście wywala

// 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(int x=0; x<w3; x++)
        {
                 for(z=0; z<k3; z++)
                 tablica_suma[x][z] = tab1[x][z]+tab2[x][z]; //i tutaj o tych tab1 i tab2
        }

}
}

Macie pomysł jak sobie z tym poradzić?

dzięki za pomoc w usuwaniu, ja jeszcze programu nie odpalałem tylko na razie uczę się na błędach pisząc i kompilując ;)
Ogólnie piszę projekt nt. operacji na macierzach i trochę późno zaczynam a już mam problemy takie, jak załapie to o co się pytam to mam nadzieję już dalej pójdzie sprawnie bo oprócz dodawania jest jeszcze mnożenie, wyznaczniki itp..

edytowany 3x, ostatnio: the_barti, 2011-05-06 18:15

Pozostało 580 znaków

2011-05-06 18:14
0

przekaz tab1 i tab2 do funkcji, albo dodawanie zrob w mainie, skad w funkcji ma sie znalezc tab1 i tab2 skoro one sa tworzone jak sam powiedziales w funkcji main()?


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-05-06 18:29
0
MJay napisał(a)

przekaz tab1 i tab2 do funkcji ... zrób w mainie

co to znaczy?

  int w1,k1,w2,k2,w3,k3;
    cout<<"Podaj liczbe wierszy 1 macierzy";
cin>>w1;
cout<<"Podaj liczbe kolumn 1 macierzy";
cin>>k1;

    tworzenie_macierzy(w1, k1, tab1);   // tutaj wywala błąd że tab1 was not declared in this scope

        cout<<"Podaj liczbe wierszy 2 macierzy";
cin>>w2;
cout<<"Podaj liczbe kolumn 2 macierzy";
cin>>k2;

    tworzenie_macierzy(w2, k2, tab2); // tutaj też oczywiście wywala

to przed funkcją dodawanie() rozumiem że mam umieścić w int main() i będzie wszystko grać?

Pozostało 580 znaków

2011-05-06 20:55
1
#include <iostream>

using namespace std;

void dodawanie_macierzy(int**, int, int, int**);

void tworzenie_macierzy(int w, int k, int **tab)
 {

    cout<<"Wypelnij tablice:\n";
    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<< "\n\n" <<"Wyswietlenie tablicy:"<< "\n\n"; // zamieniłem z  << endl << endl na << "\n\n", z powodu tego, że jest szybsze a dwa, że jest to zbyt krótki program, żeby to nie działało jak należy, buffor i tak zwolni to co ma w sobie i wyswietli zanim się zapełni

    for(int i=0; i<w; i++)
    {
        for (int j=0; j<k; j++)
            cout<<tab[i][j] << " ";
        cout<<endl;
    }
} 

int main()
{
    int w = 3, k = 2;
    int **tab1=new int *[w];
    for (int i=0; i<w; i++)
         tab1[i]=new int [k];

    tworzenie_macierzy(w, k, tab1);

    int **tab2=new int *[w];
    for (int i=0; i<w; i++)
         tab2[i]=new int [k];

    tworzenie_macierzy(w, k, tab2);

    dodawanie_macierzy(tab1, w, k, tab2);

    cout<< "\n\n" <<"Wyswietlenie tablicy:"<< "\n\n"; // zamieniłem z  << endl << endl na << "\n\n", z powodu tego, że jest szybsze a dwa, że jest to zbyt krótki program, żeby to nie działało jak należy, buffor i tak zwolni to co ma w sobie i wyswietli zanim się zapełni

    for(int i=0; i<w; i++)
    {
        for (int j=0; j<k; j++)
            cout<<tab1[i][j] << " ";
        cout<<endl;
    }

//EDIT: MUSISZ ZLIKWIDOWAĆ ZAREZERWOWANĄ PAMIĘĆ PRZED ZAKOŃCZENIEM PROGRAMU!

    for(int i = 0; i < w; i++)
        delete [] tab1[i]; // usuwamy tablicę każdego elementu tablicy

    for(int i = 0; i < w; i++)
        delete [] tab2[i];

    delete [] tab1; // usuwamy tablicę wskaźników na tamte tablice (oba usuwania muszą się znaleźć, bo inaczej usuwałbyś tylko pierwsze elementy a reszta by została)
    delete [] tab2;

    system("pause");
    return 0;
}

void dodawanie_macierzy(int** tab1, int w, int k, int** tab2) // nie chce mi się bawić w wymyślanie funkcji kiedy macierze są różnych\
rozmiarów dlatego pokazałem Ci samą idee a resztę musisz zrobić sam.
{
    for(int i = 0; i < w; i++)
        for(int j = 0; j < k; j++)
            tab1[i][j] += tab2[i][j];
}

Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 3x, ostatnio: MJay, 2011-05-08 13:23

Pozostało 580 znaków

2011-05-08 13:02
0

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.

Pozostało 580 znaków

2011-05-08 13:12
Macron_Niezalogowany
0

Gdzie dołączasz plik "Biblioteka.cpp"?

A jak ma go załączyć? One są połączone plikiem nagłówkowym Biblioteka.h - MJay 2011-05-08 13:18

Pozostało 580 znaków

2011-05-08 13:18
0

Jednak nieważne co tutaj było. Wykładowca ma racje ;]


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 1x, ostatnio: MJay, 2011-05-08 13:22

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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