.[ ČeskéHry.cz ].
Ukazatele na pole

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Malek



Založen: 07. 10. 2007
Příspěvky: 11
Bydliště: Hradec Kralove

PříspěvekZaslal: 22. říjen 2007, 20:24:47    Předmět: Ukazatele na pole Odpovědět s citátem

Ahoj mám problém s ukazatelama na pole. Chci přiřadit ukazatel na pole (*p) typu struktury SDL_Rect pomocí kostruktoru třídy , soukromému ukazately této třídy(Animation::clip). Dále ve třídě předat za pomocí ukazatele (Animation::clip) předat SDL_Rect do fce SDL_BlitSurface().

kód:
Zde je inicalizace Struktury a odkaz na její deklaraci:
SDL_Rect sheet[4] = {
 {0,0,50,50},
 {50,0,50,50},
 {0,50,50,50},
 {50,50,50,50},
};
SDL_Rect *p1 = &sheet[0] ;
http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fRect

Animation::Animation(int fr, int vel, char * fl ,SDL_Rect * cl,int lp)
{
 ...
 ...
 *clip = *cl;
}// definice ctoru

a1 = Animation( 4, 1000, "xxx.bmp",p1 , -1);// volani konstruktoru

void Animation::Show(int x , int y )
{
...
...
 SDL_BlitSurface(anim,  clip[frame] , screen,&place);
...
} volaní Blit s ukazatelem clip

http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fBlitSurface // odkaz na definici fce Blit


nevíte kde je prosím chyba ? Sad
EDIT: Jde o to , že mám třídu která má přehrávat animace a potřebuju jí nějak předat sprite sheet. Díky za odpovědi


Naposledy upravil Malek dne 22. říjen 2007, 22:34:25, celkově upraveno 3 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MePHyst0



Založen: 28. 07. 2007
Příspěvky: 85
Bydliště: SVK/CZK

PříspěvekZaslal: 22. říjen 2007, 20:37:09    Předmět: Odpovědět s citátem

co ti to rve?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Malek



Založen: 07. 10. 2007
Příspěvky: 11
Bydliště: Hradec Kralove

PříspěvekZaslal: 22. říjen 2007, 22:22:51    Předmět: Odpovědět s citátem

TO MePHyst0 :Nic mi to nenapíše , vše se skompiluje Done . Je to program dělaný s SDL , po zapnutí se mi otevře okno a při vykonávání fce SDL_BlitSurface(?,clip,?,?) to spadne . Závada je někde v tom "clipu" (Používám IDE Dev-cpp ).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 22. říjen 2007, 23:40:05    Předmět: Odpovědět s citátem

tady predas ukazatel na prvni prvek pole
kód:
SDL_Rect *p1 = &sheet[0] ;


tady dereferencujes ukazatele a do promenne clip zkopirujes hodnotu z promenne cl(pokud nemas clip alokovanou pomoci new/malloc, tak je to chyba), tedy do promenne clip zkopirujes prvni prvek pole sheet
kód:
*clip = *cl;


A tady se snazis funkci, ktera ocekava na vstupu ukazatel na SDL_Rect, vnucujes neco co nemuze byt to co si myslis, ze te funkci chces predat.
kód:
SDL_BlitSurface(anim,  clip[frame] , screen,&place);



Jinak pouzivej debugger, tam tu chybu lehce odladis ... Takto z kousku osekaneho zdrojoveho kodu tezko nekdo neco pozna. Ty si mozna myslis, ze mas chybu tady v tom uryvky a ze nekomu neco reknou ty promene a kdesi cosi ... ale proste takto muzem jen hadat.
Ale je uplne jasne, ze to mas cele blbe ... hlavne *clip = *cl; a potom predavat funkci, ktera chce ukazatel clip[frame] je proste nelogicke.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 23. říjen 2007, 09:36:14    Předmět: Odpovědět s citátem

I Dev-C++ umi debugovat: Zkompiluj projekt s ladicimi informacemi (ve Vlastnostech projektu) a pust jej volbou Ladit (namisto Spustit). Kdyz tam nemas po ceste zadny breakpointy, tak se normalne pusti a v miste, kde mas poruseni pristupu v pameti (bezna chyba v C/C++), se ti zastavi a zustane stat na miste, kde chyba nastala. Pak si treba dej o neco predtim breakpoint a od toho si to krokuj a sleduj obsah promennych, kterych se to tyka - obvykle chybu najdes rychle.

EDIT: Kdyz SDL aplikace spadne, tak to neni bez chybove hlasky. SDL ji obvykle ulozi do souboru stderror.txt v adresari aplikace. Pokud tam je neco jako "SDL Parachute Deployed", tak je to poruseni pristupu v pameti, coz je tvuj pripad (spatna prace s ukazately).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Malek



Založen: 07. 10. 2007
Příspěvky: 11
Bydliště: Hradec Kralove

PříspěvekZaslal: 23. říjen 2007, 16:14:31    Předmět: Odpovědět s citátem

OT : nevíte co mám dělat když mi debugger vyhodi "No source file named main.cpp" a dál to nic nědělá Very Happy ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 23. říjen 2007, 16:26:37    Předmět: Odpovědět s citátem

skus Code::Blocks Dev-C++ je dnes uz hruza. a kedze aj Dev aj CB pouziva gcc tak prechod bude bezproblemovi.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Malek



Založen: 07. 10. 2007
Příspěvky: 11
Bydliště: Hradec Kralove

PříspěvekZaslal: 4. listopad 2007, 01:59:09    Předmět: Odpovědět s citátem

Ahoj tak sem tu zase Very Happy (bohužel).
Snažím se dynamicky přidělit ukazately "line" na typ SDL_Surface pole. Poté fcí TTF_RenderText_Solid(...,...,...) navratit do "line" adresu vyrendrovaného Surfacu. Asi tam mám nějakou chybu protože to nejde skompilovat viz chyba z kompilátoru:
kód:
 error: non-lvalue in assigment

kód:

class TextField
{
    private:
 
            SDL_Surface *line;
               ...
           
    public:
          ...
};

TextField::TextField(int x,int y,int w,int h,char * string,char * font,int fontsize,SDL_Color color)
{
   ...
    line = new SDL_Surface [linecount];
    int i;
    for(i = 0;i < linecount; i++)
    {
        line + i = TTF_RenderText_Solid(fnt,GetPartofSizedStr(fnt,w,str,rear ,start),textcolor);
        start = start + rear;
    }

}

void TextField::Show()
{
    int i;
    for(i=0 ; i < linecount ; i++ )
    {
        SDL_BlitSurface(line + i,NULL,screen,&pos);
    }

}


Zde je celek:http://sweb.cz/0.Malek/TextField.txt
Je to pokus o textové pole s SDL_ttf, které se bude samo zarovnávat na řádky podle určené velikosti.(Programuji v Code::Blocks.)
Díky moc za odpovědi.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 4. listopad 2007, 09:02:17    Předmět: Odpovědět s citátem

Problém je v tom

kód:

line + i = TTF_RenderText_Solid(...


kde se snažíš nastavit hodnotu nějakému výrazu. K tomu přesně odpovídá ta hláška překladače. Je to podobné jako bys napsal třeba
kód:

x + 2/3 = f;

Něco takového nemůžeš po překladači chtít, ten umí přiřazovat jen do proměnné.

V tomto případě je řešení jednoduché
kód:

SDL_Surface *target = line + i;
target = TTF_RenderText_Solid(...

_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 4. listopad 2007, 10:17:01    Předmět: Odpovědět s citátem

Quiark napsal:
Problém je v tom

kód:

line + i = TTF_RenderText_Solid(...


kde se snažíš nastavit hodnotu nějakému výrazu. K tomu přesně odpovídá ta hláška překladače. Je to podobné jako bys napsal třeba
kód:

x + 2/3 = f;


to neni az tak pravda. (line+i) je ekvivalent line[i] do ktereho uz samozrejme priradit pujde. pripadne by mohlo jit priradit i do *(line+i).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 4. listopad 2007, 10:20:32    Předmět: Odpovědět s citátem

Quiark napsal:
V tomto případě je řešení jednoduché
kód:

SDL_Surface *target = line + i;
target = TTF_RenderText_Solid(...


podle me tam mas chybu a ma na konci byt

kód:

*target = TTF_RenderText_Solid(...


jinak to snad ani nema smysl a to (line+i) se ti cele ztrati, protoze prvne do target priradis (line+i) a potom neco zcela jineho cili neco smysl

kód:

int x = a + b;
x = c;


coz je kod zcela k nicemu
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Artman



Založen: 28. 07. 2007
Příspěvky: 20
Bydliště: Ostrava

PříspěvekZaslal: 4. listopad 2007, 10:34:27    Předmět: Odpovědět s citátem

rezna napsal:
Quiark napsal:
Problém je v tom

kód:

line + i = TTF_RenderText_Solid(...


kde se snažíš nastavit hodnotu nějakému výrazu. K tomu přesně odpovídá ta hláška překladače. Je to podobné jako bys napsal třeba
kód:

x + 2/3 = f;

to neni az tak pravda. (line+i) je ekvivalent line[i] do ktereho uz samozrejme priradit pujde. pripadne by mohlo jit priradit i do *(line+i).


tak tak... jen tak pro zajímavost by šlo také napsat i[line], protože platí zákon komutativy a překladač to vyhodnotí jako *( i + line )...

EDIT: Aha, diskuzi jsem jen tak proletěl a nějak mi ušlo, že se nebavíme v případě line o poli Smile... Ta zajímavost platí samozřejmě jen případě, že line je pole... Omlouvám se... Přiřadit jde samozřejmě jen do prvků, které jsou v paměti nějak identifikovatelné, tedy, že maj nějakou adresu....


Naposledy upravil Artman dne 4. listopad 2007, 12:23:52, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 4. listopad 2007, 11:04:38    Předmět: Odpovědět s citátem

Do line + i opravdu nejde zapisovat a analogie s x + 2/3 platí. Je to totiž výsledek nějakého výpočtu a do něj logicky nemůžu zapisovat. Zapisovat jde až tam, kam tento výsledek ukazuje, stejně tak (line + i) není ekvivalentní s line[i], ale s *(line + i) už je.

Samozřejmě s tím *target jsem to popletl Smile

Jinak další problém je v tom, že TTF_RenderText_Solid vrací ukazatel na SDL_Surface a přitom pole line obsahuje konkrétní objekty SDL_Surface. Takže pole line by mělo být polem ukazatelů na SDL_Surface.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 4. listopad 2007, 11:08:27    Předmět: Odpovědět s citátem

jo to co co vraci a kam to ukazuje uz jsem fakt nestudoval. v tom pripade by si mel Malek prvne ujasnit co je * (pointer), ** (pointer na pointer) *[] (pole pointeru) []* (pointer na pole), ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna