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

[C++] Przekazywanie tablicy do zmiennej.

Ostatnio zmodyfikowano 2013-01-06 23:01
Autor Wiadomość
polkom21
Temat założony przez niniejszego użytkownika
» 2013-01-06 21:17:58
Tak tak mam wyliczenie jaka duża jest tablica tylko, że jest problem z jej przekazaniem.
mam wywołanie funkcji:
DrawMap( window, map, rozmiarx, rozmiary );
i funkcja jak na razie nic nie wykonuje.
C/C++
void DrawMap( sf::RenderWindow & window, int ** map, int mapSizeX, int mapSizeY )
{
   
}
I cały czas ten sam błąd. Nie ma sensu tu wstawiać więcej kodu bo tylko z tym jest problem a zmienna map jest to tablica dwuwymiarowa przechowująca w pozycji OX, OY id grafiki która ma być wczytana w tym miejscu.
P-73195
Mrovqa
» 2013-01-06 21:29:14
Nie zrozumiałeś mnie, daj kod, który wywołuje funkcje.

Jakie to ma znaczenie? Jeśli to tablica statyczna to po prostu wcześniej trzeba zadeklarować te zmienne jako stałe lub użyć #define. A jeśli to tablica dynamiczna to tym bardziej muszą tu być jakieś zmienne bo inaczej nie miałoby to większego sensu.
Po logu domyśliłem się, że to są stałe, równe 100. Jakie to ma znaczenie? Otóż wielkie - dynamicznie tak się nie alokuje tablic.
P-73198
RazzorFlame
» 2013-01-06 21:34:35
Chyba lepiej zrobić to tak:

C/C++
void DrawMap( sf::RenderWindow _device, reszta argumentow )
{
    sf::RenderWindow * device = & _device;
    ...
}
P-73200
Mrovqa
» 2013-01-06 21:36:41
Chyba lepiej zrobić to tak:

C/C++
void DrawMap( sf::RenderWindow & /*!!*/ _device, reszta argumentow )
{
    sf::RenderWindow * device = & _device;
    ...
}
Wiesz o tym, że _device to lokalna kopia, nieprawdaż? Chciałeś chyba użyć referencji (z resztą tak jak autor).
P-73203
polkom21
Temat założony przez niniejszego użytkownika
» 2013-01-06 21:45:36
A poza tym z przekazywaniem okna jest wszystko ok. Mapa jest generowana przez taki skrypt:
C/C++
int rozmiarx, rozmiary;
fstream plik;
plik.open( "map/map.txt", ios::in );
plik >> rozmiarx >> rozmiary;
int map[ rozmiarx ][ rozmiary ];
for( int x = 0; x < rozmiarx; x++ )
{
    for( int y = 0; y < rozmiary; y++ )
    {
        plik >> map[ x ][ y ];
    }
}
plik.close();
a wywoływana jest funkcja w głównej pętli gry
DrawMap( window, map, rozmiarx, rozmiary );
a ta funkcja wygląda tak jak wcześniej podawałem.
P-73205
unimator
» 2013-01-06 22:34:32
@Mrovqa
Wiem, że to tablice statyczne są przekazywane w przykładzie. Chodziło mi o to, że lepiej jest tworzyć jakiekolwiek tablicę z pomocą stałych lub zmiennych (zależnie od tego jakie to tablice).

@topic
Rzeczywiście, dla tablicy statycznej funkcja powinna wyglądać trochę inaczej. Napisałem odpowiedni kod:
C/C++
#include <iostream>
#include <cstdlib>

template < class typ > //funkcja szablonowa dla tablicy dynamicznej
void FuncDynamic( typ ** tablica, unsigned sizeX, unsigned sizeY )
{
    std::cout << "Funkcja wywolana dla tablicy o rozmiarze " << sizeX << " " << sizeY << ".\n";
}

template < class typ > //funkcja szablonowa dla tablicy statycznej
void FuncStatic( typ tablica[][ 100 ], unsigned sizeX, unsigned sizeY )
{
    std::cout << "Funkcja wywolana dla tablicy o rozmiarze " << sizeX << " " << sizeY << ".\n";
}

int main( int argc, char ** argv )
{
    char ** tablica_dynamiczna;
    int tablica_statyczna[ 100 ][ 100 ];
    int sizeX, sizeY;
   
    sizeX = 5;
    sizeY = 15;
   
    tablica_dynamiczna = new char *[ sizeX ];
   
    for( unsigned i = 0; i < sizeX; ++i )
    {
        tablica_dynamiczna[ i ] = new char[ sizeY ];
    }
   
    FuncDynamic < char >( tablica_dynamiczna, sizeX, sizeY );
    FuncStatic < int >( tablica_statyczna, 100, 100 );
   
    for( unsigned i = 0; i < sizeX; ++i )
    {
        delete[] tablica_dynamiczna[ i ];
    }
   
    delete[] tablica_dynamiczna;
   
    system( "PAUSE" );
   
    return 0;
}

Przerób sobie to na funkcję, której potrzebujesz i będzie działać jak trzeba.

BTW, jeśli znasz wskaźniki i rozumiesz jak działa alokacja pamięci dla tablic z ich pomocą to szczerze polecam przerzucenie się na nie. Jak widać w wywołaniu funkcji dla tablicy dynamicznej potrzebujemy jedynie znać liczbę wymiarów i rozmiar tablicy. Dla tablicy statycznej funkcja musi mieć ustalony rozmiar tego obiektu, jaki może przyjąć (z wyjątkiem pierwszego wymiaru). Czyli jeśli musiałbyś np. obsłużyć mapy o różnych wymiarach to potrzebowałbyś do tego kilku funkcji (chyba, że zmieniałby się tylko pierwszy wymiar).
P-73209
Mrovqa
» 2013-01-06 22:44:59
C/C++
plik.open( "map/map.txt", ios::in );
plik >> rozmiarx >> rozmiary;
int map[ rozmiarx ][ rozmiary ];
To co wspominałem - nie możesz tak tworzyć tablicy - musisz ją dynamicznie zaalokować.

@Mrovqa
Wiem, że to tablice statyczne są przekazywane w przykładzie. Chodziło mi o to, że lepiej jest tworzyć jakiekolwiek tablicę z pomocą stałych lub zmiennych (zależnie od tego jakie to tablice).
No wiem, ale po co to pisałeś? Zzyżbym stwierdził gdzieś inaczej?
P-73211
polkom21
Temat założony przez niniejszego użytkownika
» 2013-01-06 23:01:04
Dobra. Na razie działa :) Taki mały błąd a tak wiele szkód narobił. Dzięki bardzo za pomoc :)
P-73215
1 « 2 »
Poprzednia strona Strona 2 z 2