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
|
Zaslal: 22. říjen 2007, 20:24:47 Předmět: Ukazatele na pole |
|
|
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 ?
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 |
|
 |
MePHyst0
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: SVK/CZK
|
Zaslal: 22. říjen 2007, 20:37:09 Předmět: |
|
|
co ti to rve? |
|
Návrat nahoru |
|
 |
Malek
Založen: 07. 10. 2007 Příspěvky: 11 Bydliště: Hradec Kralove
|
Zaslal: 22. říjen 2007, 22:22:51 Předmět: |
|
|
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 |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 22. říjen 2007, 23:40:05 Předmět: |
|
|
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
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 23. říjen 2007, 09:36:14 Předmět: |
|
|
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 |
|
 |
Malek
Založen: 07. 10. 2007 Příspěvky: 11 Bydliště: Hradec Kralove
|
Zaslal: 23. říjen 2007, 16:14:31 Předmět: |
|
|
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á ? |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 23. říjen 2007, 16:26:37 Předmět: |
|
|
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 |
|
 |
Malek
Založen: 07. 10. 2007 Příspěvky: 11 Bydliště: Hradec Kralove
|
Zaslal: 4. listopad 2007, 01:59:09 Předmět: |
|
|
Ahoj tak sem tu zase (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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 4. listopad 2007, 09:02:17 Předmět: |
|
|
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
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 4. listopad 2007, 10:17:01 Předmět: |
|
|
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
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 4. listopad 2007, 10:20:32 Předmět: |
|
|
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 |
|
 |
Artman
Založen: 28. 07. 2007 Příspěvky: 20 Bydliště: Ostrava
|
Zaslal: 4. listopad 2007, 10:34:27 Předmět: |
|
|
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
|
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 ... 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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 4. listopad 2007, 11:04:38 Předmět: |
|
|
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
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 4. listopad 2007, 11:08:27 Předmět: |
|
|
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 |
|
 |
|