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

[c++] Tablice dynamiczne, probem z deklaracją

Ostatnio zmodyfikowano 2015-11-25 19:53
Autor Wiadomość
szymon2432
Temat założony przez niniejszego użytkownika
[c++] Tablice dynamiczne, probem z deklaracją
» 2015-11-25 19:01:21
Witam, robię projekt, który polega na stworzeniu gry w labirynt w konsoli i zatrzymałem się na samym początku.
Program ma wczytywać domyślny labirynt po wciśnięciu "i", inne "labirynty" też mają się wczytywać po ich wybraniu, ale to mniej ważne. Głównie chodzi o to, że kiedy po wciśnięciu klawisza "i" wywołuje się funkcja domyslny():
C/C++
int szer, wys;


void domyslny()
{
    FILE * f = fopen( "domyslny.txt", "r" );
   
    fscanf( f, "%i", & wys );
    fscanf( f, "%i", & szer );
   
    gotoxy( 40, 3 ); printf( "%i  %i", wys, szer );
   
    tab = new char *[ wys ];
   
    for( int i = 0; i < wys; ++i ) {
        tab[ i ] = new char[ szer ];
        for( int j = 0; j <= szer; ++j ) {
            tab[ i ][ j ] = getc( f );
            gotoxy( 55 + j, 4 + i );
            printf( "%c", tab[ i ][ j ] );
        }
    }
    gotoxy( 1, 1 ); printf( "%c", tab[ 0 ][ 20 ] );
    fclose( f );
   
}

void gra()
{
    int zn, x = 40, y = 12, attr = 7;
    do {
       
        //clrscr();
        textcolor( 7 );
        gotoxy( 55, 1 );
        cputs( "q = wyjscie, i = domyslna plansza" );
        gotoxy( 55, 2 );
        cputs( "strzalki = poruszanie" );
        gotoxy( 55, 3 );
        cputs( "spacja = zmiana koloru" );
        gotoxy( x, y );
        textcolor( attr );
        putch( '*' );
        zn = getch();
        if( zn == 0 ) {
            zn = getch();
            if( zn == 0x48 ) y--;
            else if( zn == 0x50 ) y++;
            else if( zn == 0x4b ) x--;
            else if( zn == 0x4d ) x++;
           
        }
        else if( zn == 'i' ) domyslny();
        else if( zn == ' ' ) attr =( attr + 1 ) % 16;
       
    } while( zn != 'q' );
   
}

int main()
{
   
    settitle( "imie nazwisko nr_indeksu" );
    textbackground( BLACK );
    _setcursortype( 0 );
    gra();
   
    return 0;
}
 
to wszystko jest spoko, ALE, program działa w pętli, która za każdym razem czyści ekran clrscr(), więc z automatu piękny labirynt znika, więc pomyślałem, żeby po wciśnięciu klawisza "i" wywołać funkcję, która tworzy tablice dynamiczną dwuwymiarową, a potem za każdym razem w pętli do...while będzie wywoływana np. funkcja rysuj(); która pobierze tą tablicę i ją wyrysuje, więc mam taki kodzik:
C/C++
int szer, wys;


void domyslny( char ** tab )
{
    FILE * f = fopen( "domyslny.txt", "r" );
   
    fscanf( f, "%i", & wys );
    fscanf( f, "%i", & szer );
   
    gotoxy( 40, 3 ); printf( "%i  %i", wys, szer );
   
    tab = new char *[ wys ];
   
    for( int i = 0; i < wys; ++i ) {
        tab[ i ] = new char[ szer ];
        for( int j = 0; j <= szer; ++j ) {
            tab[ i ][ j ] = getc( f );
        }
    }
    gotoxy( 1, 1 ); printf( "%c", tab[ 0 ][ 20 ] );
    fclose( f );
   
}

void gra()
{
    char ** tab;
    int zn, x = 40, y = 12, attr = 7;
    do {
       
        //clrscr();
        textcolor( 7 );
        gotoxy( 55, 1 );
        cputs( "q = wyjscie, i = domyslna plansza" );
        gotoxy( 55, 2 );
        cputs( "strzalki = poruszanie" );
        gotoxy( 55, 3 );
        cputs( "spacja = zmiana koloru" );
        gotoxy( x, y );
        textcolor( attr );
        putch( '*' );
        zn = getch();
        if( zn == 0 ) {
            zn = getch();
            if( zn == 0x48 ) y--;
            else if( zn == 0x50 ) y++;
            else if( zn == 0x4b ) x--;
            else if( zn == 0x4d ) x++;
           
        }
        else if( zn == 'i' ) domyslny( tab );
        else if( zn == ' ' ) attr =( attr + 1 ) % 16;
       
    } while( zn != 'q' );
   
}

int main()
{
   
    settitle( "imie nazwisko nr_indeksu" );
    textbackground( BLACK );
    _setcursortype( 0 );
    gra();
   
    return 0;
}
 Funkcji rysuj(); jeszcze nie napisałem, bo nie wiem jak przekazać wskaźnik **tab do funkcji domyslny(), żeby w tej funkcji utworzyło mi tablice o danych wymiarach (wymiary to dwie pierwsze linie w pliku tekstowym), może ktoś ma jakiś inny pomysł na rozwiązanie tego problemu? byłbym bardzo wdzięczny.

EDIT: żeby lepiej zrozumieć: Czy da się zadeklarować taki wskaźnik **tab, potem przekazać go jako argument funkcji domyslny(tab); która wygląda tak: void domyslny(char **tab) i ma za zadanie stworzyć tablicę dynamiczną dwuwymiarową?
P-140799
Monika90
» 2015-11-25 19:21:32
Ale dlaczego chcesz go do funkcji przekazać, czy nie możesz go zwrócić? Wtedy w funkcji gra miałbyś
C/C++
char ** tab = domyslny();
P-140804
szymon2432
Temat założony przez niniejszego użytkownika
» 2015-11-25 19:26:07
Wtedy char **tab deklarowałby się za każdym razem, chyba. Ale co musiałbym zmienić w funkcji domyslny()?
Zmieniłem trochę kod i działa przekazywanie, ale labirynt pokazuje się na 1ms może.
C/C++
int szer, wys;

void rysuj( char **& tab ) {
    for( int i = 0; i < wys; ++i ) {
        for( int j = 0; j <= szer; ++j ) {
            gotoxy( 55 + j, 4 + i );
            printf( "%c", tab[ i ][ j ] );
        }
    }
}

void domyslny( char **& tab )
{
    FILE * f = fopen( "domyslny.txt", "r" );
   
    fscanf( f, "%i", & wys );
    fscanf( f, "%i", & szer );
   
    gotoxy( 40, 3 ); printf( "%i  %i", wys, szer );
   
    tab = new char *[ wys ];
   
    for( int i = 0; i < wys; ++i ) {
        tab[ i ] = new char[ szer ];
        for( int j = 0; j <= szer; ++j ) {
            tab[ i ][ j ] = getc( f );
            //gotoxy(55 + j, 4 + i);
            //printf("%c", tab[i][j]);
        }
    }
    gotoxy( 1, 1 ); printf( "%c", tab[ 0 ][ 20 ] );
    fclose( f );
   
}

void gra()
{
    char ** tab;
    int zn, x = 40, y = 12, attr = 7;
    do {
       
        clrscr();
        textcolor( 7 );
        gotoxy( 55, 1 );
        cputs( "q = wyjscie, i = domyslna plansza" );
        gotoxy( 55, 2 );
        cputs( "strzalki = poruszanie" );
        gotoxy( 55, 3 );
        cputs( "spacja = zmiana koloru" );
        gotoxy( x, y );
        textcolor( attr );
        putch( '*' );
        zn = getch();
        if( zn == 0 ) {
            zn = getch();
            if( zn == 0x48 ) y--;
            else if( zn == 0x50 ) y++;
            else if( zn == 0x4b ) x--;
            else if( zn == 0x4d ) x++;
           
        }
        else if( zn == 'i' ) domyslny( tab );
        else if( zn == ' ' ) attr =( attr + 1 ) % 16;
       
        rysuj( tab );
    } while( zn != 'q' );
   
}

int main()
{
   
    settitle( "imie nazwisko nr_indeksu" );
    textbackground( BLACK );
    _setcursortype( 0 );
    gra();
   
    return 0;
}
P-140805
Monika90
» 2015-11-25 19:42:12
for( int j = 0; j <= szer; ++j ) {
Tu masz nieprawidłowy warunek, przez co j wychodzi poza zakres tablicy.
P-140806
szymon2432
Temat założony przez niniejszego użytkownika
» 2015-11-25 19:46:08
A wiedziałem, że ktoś zauważy :P niby nieprawidłowy, ale jak mam samo "<" to mi ucina ostatnią kolumnę, nie wiem czemu :O
P-140807
Monika90
» 2015-11-25 19:51:25
Pewnie dlatego, że w pliku z planszą masz białe znaki, np. znaki przejścia do nowej linii, musisz je pomijać przy wczytywaniu.
P-140810
szymon2432
Temat założony przez niniejszego użytkownika
» 2015-11-25 19:53:53
Tak, nie dodałem warunku w przypadku znaku nowej linii, w labirynt rysuje się w 1 przebiegu funkcji, ale w następnych już znika, tak jakby funkcja rysuj() dostawała pustą tablicę :/

Może to strukturą jakąś załatwić? Pytam bo już nie wiem co robić, jakiś trop by się przydał :P
P-140812
« 1 »
  Strona 1 z 1