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

Przekazywanie tablicy dwuwymiarowej jako argumentu funkcji, przy rozmiarze drugiego wymiaru nieznanym na początku działania programu

Ostatnio zmodyfikowano 2012-11-18 22:09
Autor Wiadomość
McAffey
Temat założony przez niniejszego użytkownika
» 2012-11-18 22:09:03
Dzięki wielkie, to jeszcze nie mój poziom programowania, więc raczej sam bym nie wpadł na takie rozwiązanie. Temat zamykam :)

Edit :
Dzisiaj przypadkiem wpadłem na pomysł tak prostego rozwiązania problemu, że aż mi było wstyd że na nie wczoraj nie wpadłem. Rozwiązanie to jest tym bardziej skomplikowane, im bardziej złożone są tablice (im więcej wymiarów mają), ale dla dwuwymiarowej tablicy sprawdza się bardzo dobrze. Wystarczy jako dwa argumenty w funkcji dodać wymiary tablicy, a tablicę dwuwymiarową przekształcić w tablicę jednowymiarową o takiej samej liczbie elementów i ją dodać jako trzeci argument. Wówczas wewnątrz funkcji trzeba zrobić takie samo działanie tylko na odwrót i wtedy wewnątrz funkcji otrzymujemy tę samą tablicę dwuwymiarową którą mieliśmy w mainie.

Podaję przykład który najpierw tworzy tablicę dwuwymiarową, potem wypełnia ją wartościami dla testu, następnie przekształca ją w tablicę jednowymiarową, potem przekazuje ją do funkcji, a w funkcji przekształca ją z powrotem do tablicy dwuwymiarowej. Oczywiście korzystając ze sposobu z tego przykładu wartości z tablicy można tylko odczytać, a nie można ich potem modyfikować (tzn modyfikacje nie zostaną wprowadzone do tablicy dwuwymiarowej z początku programu), ale gdyby ktoś tego potrzebował może sobie to sam (analogicznie) dopisać. (Sory cyklopek11 za to wytłumaczenie, wiem że Ty tego nie potrzebujesz, ale napisałem z myślą o ewentualnych przyszłych (początkujących) czytelnikach ;> )

Przykład :

C/C++
#include <iostream>
using namespace std;

void funkcja( int tablica_tymczasowa[], int x, int y )
{
    int tablica[ x ][ y ];
   
    //Uzupełnianie tablicy dwuwymiarowej wartościami takimi samymi jak miała ona przed wywołaniem funkcji
    int indeks = 0;
   
    for( int i = 0; i < x; i++ )
    {
        for( int j = 0; j < y; j++ )
        {
            tablica[ i ][ j ] = tablica_tymczasowa[ indeks ];
            indeks++;
        }
    }
   
    //Teraz już tablica dwuwymiarowa "tablica" jest taka sama jak ta na początku wywołania programu :)
   
    //Wyświetlanie zawartości tablicy dla sprawdzenia poprawności
    for( int i = 0; i < x; i++ )
    {
        for( int j = 0; j < y; j++ )
        {
            cout << tablica[ i ][ j ] << endl;
        }
    }
   
    return;
}

int main()
{
    int x, y;
   
    cout << "Wprowadz pierwszy rozmiar : ";
    cin >> x;
    cout << "Wprowadz drugi rozmiar : ";
    cin >> y;
   
    int tablica[ x ][ y ];
   
    //Uzupełnianie tablicy wartościami dla sprawdzenia poprawności
    int indeks = 1;
   
    for( int i = 0; i < x; i++ )
    {
        for( int j = 0; j < y; j++ )
        {
            tablica[ i ][ j ] = indeks;
            indeks++;
        }
    }
   
    //Tworzenie tablicy tymczasowej jako "bufora" do funkcji
    int tablica_tymczasowa[ x * y ];
    indeks = 0;
   
    for( int i = 0; i < x; i++ )
    {
        for( int j = 0; j < y; j++ )
        {
            tablica_tymczasowa[ indeks ] = tablica[ i ][ j ];
            indeks++;
        }
    }
   
    funkcja( tablica_tymczasowa, x, y );
   
    return 0;
}

Samo działanie (bez wyjaśnień i testów) można skrócić do takiego kodu :

C/C++
using namespace std;

void funkcja( int tablica_tymczasowa[], int x, int y )
{
    int tablica[ x ][ y ];
    int indeks = 0;
   
    for( int i = 0; i < x; i++ )
    {
        for( int j = 0; j < y; j++ )
        {
            tablica[ i ][ j ] = tablica_tymczasowa[ indeks ];
            indeks++;
        }
    }
   
    return;
}

int main()
{
    int x = 5, y = 5, indeks = 0;
   
    int tablica[ x ][ y ];
    int tablica_tymczasowa[ x * y ];
   
    for( int i = 0; i < x; i++ )
    {
        for( int j = 0; j < y; j++ )
        {
            tablica_tymczasowa[ indeks ] = tablica[ i ][ j ];
            indeks++;
        }
    }
   
    funkcja( tablica_tymczasowa, x, y );
   
    return 0;
}
P-69521
1 « 2 »
Poprzednia strona Strona 2 z 2