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

Tablica w klasach

Ostatnio zmodyfikowano 2012-02-28 19:43
Autor Wiadomość
Matylda
Temat założony przez niniejszego użytkownika
Tablica w klasach
» 2012-02-25 18:02:23
Hej!

Mam prośbę, czy ktoś pomoże mi z moim programem? Chodzi o odwoływanie się do globalnej tablicy z funkcji klasy (w innych plikach niż mainie zresztą).

Mam tablicę globalną w mainie, w której trzymam dane (do tetrisa, bo to akurat pisze). Mam dwie klasy, problem jest z jedną, z Czerwony [klocek] . Jest w niej funcja ruch, która po prostu uruchamia w_dol_obrot_1 (w założeniu ta klasa ma posłużyć za szkielet podobnej, z innymi klockiem, który nie jest kwadratem i może się obracać), z której z kolei jest uruchamiania funkcja kilkakrotnie jeszcze jednak funkcja, która odpowiada za sterowanie pojedynczego "kafelka" (klocek czerwony, jako kwadrat, składa się w cztery "kafelków"). Problem polega na tym, że jak po prostu przekazuje tablicę (ładnie wcześniej wyzerowaną w mainie) to funkcje widzą jakieś śmieci i nic się nie dzieje :/.

Jako, że to co mówię nie ma większego sensu bez kodu, oto i on:


W maine:
C/C++
int t[ 21 ][ 8 ];
int tmp;
Czerwony * klocek_c;

//...

tmp = klocek_c->ruch( a, t );

czerwony.h:
C/C++
#include <iostream>
#include <allegro.h>
#include "kafelek.h"

class Czerwony
    : public Kafelek
{
   
private:
    int wiersz;
    BITMAP * kkafelek;
public:
    Czerwony(); //kontruktor, ustalenie bitmapy
    ~Czerwony(); //dekontruktor
    int kafelek( int tt[ 21 ][ 8 ], int wwiersz, BITMAP * kkafelek ); //kafelek, o ile pod nim nie jest coś, przesuwa się niżej
   
    //...
    int ruch( int aaa, int ttt[ 21 ][ 8 ] ); //jedzie z kolockiem w dół, jupi!
};

czerwony.cpp:
C/C++
#include <iostream>
#include <allegro.h>

#include "czerwony.h"

Czerwony::Czerwony()
{
    kkafelek = load_bmp( "grafika/1.bmp", default_palette );
    if( !kkafelek )
         allegro_message( "Problemy z grafiką! Program się wywali! Lojalnie ostrzegam!" );
   
}

Czerwony::~Czerwony()
{
}

int Czerwony::kafelek( int tt[ 21 ][ 8 ], int wwiersz, BITMAP * kkafelek ) //zwraca 123 jeśli nie moze się już ruszyć
{
   
    if( tt[ wwiersz + 1 ][ sciezka ] != 0 ) //jeśli wiersz niżej nie jest pusty
    {
        allegro_message( "WTF w kafelku" );
        return 123; //a czemu nie 123?
    }
   
    masked_blit( kkafelek, screen, 0, 0,( sciezka * 20 + 4 ),(( wwiersz ) * 20 ), kkafelek->w, kkafelek->h );
    return 0;
}

//...

int Czerwony::ruch( int aaa, int tttt[ 21 ][ 8 ] )
{
    return w_dol_obrot_1( aaa, tttt ); //bo to kwadrat, nie obraca się
}

int Czerwony::w_dol_obrot_1( int aa, int tt[ 21 ][ 8 ] )
{
    int tmp1, tmp2, tmp3, tmp4;
    if( aa > 0 )
    {
        //lewy górny kafelek
        tmp1 = kafelek( tt, aa, kkafelek );
        allegro_message( "He?%d", tmp1 );
        //lewy dolny kafelek
        aa++;
        tmp2 = kafelek( tt, aa, kkafelek );
        aa--;
        //prawy górny kafelek
        sciezka++;
        tmp3 = kafelek( tt, aa, kkafelek );
        sciezka--;
        //prawy dolny kafelek
        sciezka++;
        aa++;
        tmp4 = kafelek( tt, aa, kkafelek );
        aa--;
        sciezka--;
    }
    if(( tmp1 == 123 ) ||( tmp2 == 123 ) ||( tmp3 == 123 ) ||( tmp4 == 123 ) )
         return 123;
   
    return 0;
}
Nie przeczę, mam duże braki w mojej wiedzy o C++ (cztery laborki z C++ i mamy umieć programować?! na Pascala było więcej) i do tego nie łapie wskaźników i pewnie dlatego mam problem.

Nie wiem, może powinnam była cały kod wkleić?
P-51411
konri1990
» 2012-02-26 19:09:20
Żeby operować na tablicy przekazujemy ja przez referencję, ("przesyłamy jej adres do funkcji"), w przeciwnym razie działamy na kopii tej tablicy.
Jak przekazujesz parametr przez wartość prawdopodobnie "przesłaniasz" tablicę globalną.
Spróbuj wykorzystać zapis z ampersandem (&t). Ewentualnie jeżeli masz tablicę globalną, zmodyfikuj tak program, aby przekopiować działania na tablicy wewnątrz funkcji do tablicy globalnej. Nie wiem czy reszta kodu, którą masz jest poprawna, dobrze by było, żebyś wrzuciła cały kod programu.
Poza tym tak jak właśnie mówisz przyda Ci się tutaj wiedza przekazywaniu zmiennej przez referencję, proponuję poczytać na ten temat, no i oczywiście na temat wskaźników, bo od tego raczej nie uciekniesz:)

P.S zapomniałem tutaj dodać, że działasz na tablicy w klasie, musisz spróbować napisać metodę która skopiuję tablicę globalną do tablicy w klasie, jeżeli wykorzystujesz to tablicę globalną (tak to rozumiem). Oczywiście będziesz musiała zadbać jeszcze o zapisanie zmian w tablicy globalnej, po zakończeniu operacji.
P-51479
akwes
» 2012-02-26 20:25:39
Mam tablicę globalną w mainie

Rzuciło mi się w oczy. Tablica globalna w main?

Problem polega na tym, że jak po prostu przekazuje tablicę (ładnie wcześniej wyzerowaną w mainie) to funkcje widzą jakieś śmieci i nic się nie dzieje :/
Wartości zmiennych globalnych są zerowane z automatu.

A jeżeli mówimy o tablicy lokalnej, bo wychodzi że taką mamy :)

To mamy dwie możliwości. Odwołać się przez wskaźnik bądź referencję.

P-51485
Matylda
Temat założony przez niniejszego użytkownika
» 2012-02-28 19:43:45
Od wskaźników wiem, że nie ucieknę, ale wolałabym się ich uczyć w mniej stresującym czasie (czytaj sesja i posesjowe zaliczanie na ostatni termin). I tak będę musiała do tego siąść bo czeka mnie w IV semestrze większy projekt...

Anyway - dziękuję bardzo za podpowiedzi, siadam do tego i może uda mi się coś wymyślić. Mam czas do czwartku najprawdopodobniej więc troszkę czasu jest jeszcze.

EDIT:
**Problem polega na tym, że jak po prostu przekazuje tablicę (ładnie wcześniej wyzerowaną w mainie) to funkcje widzą jakieś śmieci i nic się nie dzieje :/

*Wartości zmiennych globalnych są zerowane z automatu

Tego nie wiedziałam. Pewnie tu jest mój problem. Dzięki!

Co do reszty, racze jest poprawna. Bawiłam się już z tetrisem w wakacje, ale pisałam to nieobiektowo i przy zamianie mi się wszystko popsuło.

EDIT2:
Postanowiłam zrobić nową klasę, której elementem jest tablica. Obiekty klasy potrafię przesyłać do funkcji więc dzięki temu ominęłam problem. Ale obiecuję poczytać i dowiedzieć się jak to z tablicami powinno być XD
P-51592
« 1 »
  Strona 1 z 1