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:int t[ 21 ][ 8 ]; int tmp; Czerwony * klocek_c;
tmp = klocek_c->ruch( a, t ); czerwony.h:#include <iostream> #include <allegro.h> #include "kafelek.h"
class Czerwony : public Kafelek { private: int wiersz; BITMAP * kkafelek; public: Czerwony(); ~Czerwony(); int kafelek( int tt[ 21 ][ 8 ], int wwiersz, BITMAP * kkafelek ); int ruch( int aaa, int ttt[ 21 ][ 8 ] ); }; czerwony.cpp:#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 ) { if( tt[ wwiersz + 1 ][ sciezka ] != 0 ) { allegro_message( "WTF w kafelku" ); return 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 ); }
int Czerwony::w_dol_obrot_1( int aa, int tt[ 21 ][ 8 ] ) { int tmp1, tmp2, tmp3, tmp4; if( aa > 0 ) { tmp1 = kafelek( tt, aa, kkafelek ); allegro_message( "He?%d", tmp1 ); aa++; tmp2 = kafelek( tt, aa, kkafelek ); aa--; sciezka++; tmp3 = kafelek( tt, aa, kkafelek ); sciezka--; 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ć? |
|
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. |
|
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ę. |
|
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 |
|
« 1 » |