|
| Grøn, og massere af problemer ;-) Fra : Heine Laursen |
Dato : 29-10-02 14:54 |
|
Hejsa Ng.
Jeg forsøger at compile, noget c programmel under linux.
Jeg har et problem, jeg ikke rigtig ved hvad jeg skal kalde.
Jeg vil gerne have det sådan at jeg kan gøre:
color[5] = ("RED, GREEN, YELLOW, BLUE, BLACK");
og så vil jeg gerne kalde det med:
for (i = 0; i < 5; i++){
src.x = i * 25 - 25;
src.y = 0;
src.w = color[i]->w; /* color[i] skal så erstattes af RED hvis i = 0, */
src.y = color[i]->h; /* GREEN hvis i = 1, osv osv osv.
dest = src;
SDL_BlitSurface([color[i], &src, screen, &dest);
Det skulde gerne tegne. 5 forskællige figure, øverst i venstre hjørne.
Uheldigvis, kan jeg ikke finde ud af at gøre sådan noget. Men det
stoppede mig ikke i at gøre et forsøg
Ideen med det, er at jeg gerne vil ende med, et program, der laver en
random 5 gange, og baseret på det tal, skal en farve vises.
Fejlmeddelsen jeg får du af at compile skidtet er fgl:
[heine@localhost pbubles]$ make
gcc `sdl-config --cflags` -ggdb -c main.c
main.c:13: warning: `color' initialized and declared `char'
main.c:13: invalid initializer
main.c: In function `main':
main.c:55: invalid type argument of `->'
main.c:56: invalid type argument of `->'
main.c:58: warning: passing arg 1 of `SDL_UpperBlit' makes pointer from
integer without a cast
[heine@localhost heine]$
Og min kode ser sådan her ud:
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <stdio.h>
#include <stdlib.h>
#define RED = "graphis/red-brick.png"
#define BLUE = "graphis/blue-brick.png"
#define YELLOW = "graphis/yellow-brick.png"
#define GREEN = "graphis/red-brick.png"
#define BLACK = "graphis/black-brick.png"
char color[4] = ("RED,BLUE,YELLOW,GREEN,BLACK");
int randomnumber;
SDL_Surface *screen;
SDL_Surface *backgrund;
SDL_Surface *red;
SDL_Surface *blue;
SDL_Surface *yellow;
SDL_Surface *green;
SDL_Surface *black;
SDL_Rect src, dest;
int main()
{
int i;
/* init SDL */
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("Error. Unable to init SDL: %s\n", SDL_GetError());
return 1;
}
/* Set video mode */
screen = SDL_SetVideoMode(640, 480, 16, 0);
if (screen == NULL) {
printf("Unable to set video mode: &s");
return 1;
}
atexit(SDL_Quit);
/* init graphis */
red = IMG_Load("RED");
blue = IMG_Load("BLUE");
green = IMG_Load("GREEN");
yellow = IMG_Load("YELLOW");
black = IMG_Load("BLACK");
for(i = 0; i < 5; i++) {
src.x = i * 25 -25;
src.y = 0;
src.w = color[i]->w;
src.h = color[i]->h;
dest = src;
SDL_BlitSurface(color[i], &src, screen, &dest);
}
SDL_UpdateRect(screen, 0, 0, 0, 0);
SDL_Delay(3000);
return 0;
}
--
Mvh
Heine Laursen
| |
Jens Axel Søgaard (29-10-2002)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 29-10-02 15:02 |
|
Heine Laursen wrote:
> Jeg vil gerne have det sådan at jeg kan gøre:
>
> color[5] = ("RED, GREEN, YELLOW, BLUE, BLACK");
Skal det ikke være
color[5] = {"RED, GREEN, YELLOW, BLUE, BLACK"};
?
--
Jens Axel Søgaard
| |
Igor V. Rafienko (29-10-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 29-10-02 15:34 |
|
[ Jens Axel Søgaard ]
[ ... ]
> > color[5] = ("RED, GREEN, YELLOW, BLUE, BLACK");
>
> Skal det ikke være
>
> color[5] = {"RED, GREEN, YELLOW, BLUE, BLACK"};
Neppe. Men kanskje
color[] = { "RED", "GREEN", "YELLOW", "BLUE", "BLACK" };
(eller evt.)
color[] = "RED, GREEN, YELLOW, BLUE, BLACK";
ivr
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
-- pederst på irc
| |
Kent Friis (29-10-2002)
| Kommentar Fra : Kent Friis |
Dato : 29-10-02 16:50 |
|
Den 29 Oct 2002 15:33:54 +0100 skrev Igor V. Rafienko:
>[ Jens Axel Søgaard ]
>
>[ ... ]
>
>> > color[5] = ("RED, GREEN, YELLOW, BLUE, BLACK");
>>
>> Skal det ikke være
>>
>> color[5] = {"RED, GREEN, YELLOW, BLUE, BLACK"};
>
>
>Neppe. Men kanskje
>
>color[] = { "RED", "GREEN", "YELLOW", "BLUE", "BLACK" };
>
>(eller evt.)
>
>color[] = "RED, GREEN, YELLOW, BLUE, BLACK";
Jeg tror faktisk det skal være:
color[] = { RED, GREEN, YELLOW, BLUE, BLACK };
Det lignede noget grafik-kode, så det er nok konstanter, og ikke strenge
han forsøger at lege med.
(om ikke andet har han da masser af forslag at vælge imellem)
Mvh
Kent
--
8:16pm up 2:37, 1 user, load average: 101.21, 95.46, 55.85
164 processes: 62 sleeping, 102 running, 0 zombie, 0 stopped
With XMMS tugging along nicely, playing Vivaldi...
| |
Heine Laursen (29-10-2002)
| Kommentar Fra : Heine Laursen |
Dato : 29-10-02 19:16 |
|
In article <apmank$lr2$4@sunsite.dk>, Kent Friis wrote:
> Den 29 Oct 2002 15:33:54 +0100 skrev Igor V. Rafienko:
Tak for hjælpen alle sammen. Der ver desvære ikke nogen af forslagende der
virkede ;-(
> Det lignede noget grafik-kode, så det er nok konstanter, og ikke strenge
> han forsøger at lege med.
Nu kender jeg ikke forskellen melllem, stringe og konstanter men, det jeg
prøver på er at color[1] skal blive erstattet af RED, og color[2] bliver
erstattet af BLUE
Så koden kommer til at se sådan her ud:
for (i = 0; i < 5; i++;) {
src.x = 25 * i - 25;
src.y = 0;
src.w = RED->w;
src.h = RED->h;
SDL_BlitSurface(RED, &src, screen, &dest);
}
--
Mvh
Heine Laursen
| |
Heine Laursen (29-10-2002)
| Kommentar Fra : Heine Laursen |
Dato : 29-10-02 19:20 |
|
In article <slrnartk0b.1jb.Gozar@localhost.localdomain>, Heine Laursen wrote:
> Så koden kommer til at se sådan her ud:
>
> for (i = 0; i < 5; i++;) {
> src.x = 25 * i - 25;
> src.y = 0;
> src.w = RED->w;
> src.h = RED->h;
> SDL_BlitSurface(RED, &src, screen, &dest);
> }
>
RED, BLUE, osv, bliver forøverit oprettet sådan her:
SDL_Surface *RED;
og bliledet sådan her:
RED = IMG_Load("billed_der_skal_loades");
--
Mvh
Heine Laursen
| |
Igor V. Rafienko (29-10-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 29-10-02 19:33 |
|
[ Heine Laursen ]
[ ... ]
> > for (i = 0; i < 5; i++;) {
> > src.x = 25 * i - 25;
> > src.y = 0;
> > src.w = RED->w;
> > src.h = RED->h;
> > SDL_BlitSurface(RED, &src, screen, &dest);
> > }
>
> RED, BLUE, osv, bliver forøverit oprettet sådan her:
> SDL_Surface *RED;
Mao. du vil ha en tabell som oversetter fra heltallige indekser til
"SDL_Surface" instanser?
Kanskje noe slikt:
SDL_Surface *RED = IMG_Load( "foo" ),
*GREEN = IMG_Load( "bar" ),
*BLUE = IMG_Load( "baz" );
SDL_Surface *mapping[] = { RED, GREEN, BLUE };
?
Dersom du ikke trenger RED/GREEN/BLUE hver for seg, så kan du sikkert
la være å lage disse variablene.
ivr
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
-- pederst på irc
| |
Heine Laursen (30-10-2002)
| Kommentar Fra : Heine Laursen |
Dato : 30-10-02 14:59 |
|
In article <xjv4rb5hz7u.fsf@andvarefoss.ifi.uio.no>, Igor V. Rafienko wrote:
> Mao. du vil ha en tabell som oversetter fra heltallige indekser til
> "SDL_Surface" instanser?
Noget ligende ja. Så jeg ikkke behøver at skrive:
src.x = 25 * i -25
....
....
....
5 gange, men istædet for køre det igennem, en for loop
> Kanskje noe slikt:
>
> SDL_Surface *RED = IMG_Load( "foo" ),
> *GREEN = IMG_Load( "bar" ),
> *BLUE = IMG_Load( "baz" );
> SDL_Surface *mapping[] = { RED, GREEN, BLUE };
>
> ?
Jeg forstår ikke hvad overstående gør? endvidre, forstår jeg selt ikke,
hvordan det kan inplaseres i min eksisterne kode.
> Dersom du ikke trenger RED/GREEN/BLUE hver for seg, så kan du sikkert
> la være å lage disse variablene.
Mener du, at jeg ikke kan gøre:
color = { "RED", ...,...,... }
Jeg forstår ikke, meget om programmering, men man skal vel starte et sted
Jeg har læst, bogen Programming Linux Games, som er skrevet af en af mændene
bag loki. Det er derfra, jeg har min meget begranset viden, om linux
programmering
--
Mvh
Heine Lauresn
| |
Igor V. Rafienko (30-10-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 30-10-02 18:21 |
|
[ Heine Laursen ]
[ ... ]
> > Mao. du vil ha en tabell som oversetter fra heltallige indekser
> > til "SDL_Surface" instanser?
>
> Noget ligende ja. Så jeg ikkke behøver at skrive:
> src.x = 25 * i -25
> ...
> ...
> ...
>
> 5 gange, men istædet for køre det igennem, en for loop
En array, som veldig mye annet, kan sees på som en funksjon, som tar
verdier fra heltallige indekser til hva den nå enn en array skal ta
vare på. Dersom du vil at dine bilder (eller hva det nå enn
SDL_Surface skal representere) skal kunne behandles i en sekvens og
det ikke spiller noen rolle hvilke indekser SDL_Surface's får i denne
sekvensen, er en array en ypperlig datastruktur til formålet.
[ ... ]
> > SDL_Surface *RED = IMG_Load( "foo" ),
> > *GREEN = IMG_Load( "bar" ),
> > *BLUE = IMG_Load( "baz" );
> > SDL_Surface *mapping[] = { RED, GREEN, BLUE };
:
> Jeg forstår ikke hvad overstående gør? endvidre, forstår jeg selt
> ikke, hvordan det kan inplaseres i min eksisterne kode.
for ( size_t i = 0; i != sizeof mapping / sizeof *mapping; ++i ) {
/* init src appropriately */
SDL_BlitSurface( mapping[ i ], &src, screen, &dest );
}
(det kan hende at det blir mer elegant å lagre arraystørrelsen i egen
variabel).
> > Dersom du ikke trenger RED/GREEN/BLUE hver for seg, så kan du
> > sikkert la være å lage disse variablene.
>
> Mener du, at jeg ikke kan gøre:
> color = { "RED", ...,...,... }
Jo, det kan du sikkert. Spørsmålet er -- hva skal du med disse
SDL_Surface's videre? Trenger du å se på de en og en under et bestemt
(og da typisk meningsfylt) navn, så er det kanskje kjekt å ha disse
RED, GREEN osv. Trenger du ikke det, da holder det sikkert med en
tabell for å representere alle SDL_Surfaces uten å nødvendigvis gi
hver av de eget navn.
> Jeg forstår ikke, meget om programmering, men man skal vel starte et
> sted Jeg har læst, bogen Programming Linux Games, som er skrevet
> af en af mændene bag loki. Det er derfra, jeg har min meget
> begranset viden, om linux programmering
Da er tipset K&R2, boken til van der Linden og APUE (sannsynligvis i
den rekkefølgen).
ivr
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
-- pederst på irc
| |
Heine Laursen (01-11-2002)
| Kommentar Fra : Heine Laursen |
Dato : 01-11-02 12:47 |
|
igorr@ifi.uio.no (Igor V. Rafienko) wrote in
news:xjvsmyn2684.fsf@rimmugy.ifi.uio.no:
Mange tak for hjælpen end til vidre.
Men jeg har lige, nogne problemer mere
>> > Mao. du vil ha en tabell som oversetter fra heltallige indekser
>> > til "SDL_Surface" instanser?
>>
>> Noget ligende ja. Så jeg ikkke behøver at skrive:
>> src.x = 25 * i -25
>> ...
>> ...
>> ...
>>
>> 5 gange, men istædet for køre det igennem, en for loop
>
> En array, som veldig mye annet, kan sees på som en funksjon, som tar
> verdier fra heltallige indekser til hva den nå enn en array skal ta
> vare på. Dersom du vil at dine bilder (eller hva det nå enn
> SDL_Surface skal representere) skal kunne behandles i en sekvens og
> det ikke spiller noen rolle hvilke indekser SDL_Surface's får i denne
> sekvensen, er en array en ypperlig datastruktur til formålet.
>
> [ ... ]
>
>
>> > SDL_Surface *RED = IMG_Load( "foo" ),
>> > *GREEN = IMG_Load( "bar" ),
>> > *BLUE = IMG_Load( "baz" );
>> > SDL_Surface *mapping[] = { RED, GREEN, BLUE };
Det kan min compiler ikke rigtig lide!!
[heine@localhost test]$ make
gcc `sdl-config --cflags` -ggdb -c test.c
pbubles.c: In function `main':
pbubles.c:36: parse error before `*'
pbubles.c:41: `red' undeclared (first use in this function)
pbubles.c:41: (Each undeclared identifier is reported only once
pbubles.c:41: for each function it appears in.)
pbubles.c:41: `blue' undeclared (first use in this function)
pbubles.c:41: `green' undeclared (first use in this function)
pbubles.c:41: `yellow' undeclared (first use in this function)
pbubles.c:41: `black' undeclared (first use in this function)
make: *** [test] Error 1
[heine@localhost test]$
Jeg har fået det til, at virke ved at skrive:
src.x = i * 25 - 25
osv,
osv.
osv.
Uden brug af for next then løkken.
Men ikke med den kode, du skirver ovenover, Der melder den fejl.
> for ( size_t i = 0; i != sizeof mapping / sizeof *mapping; ++i ) {
> /* init src appropriately */
>
> SDL_BlitSurface( mapping[ i ], &src, screen, &dest );
> }
Er der noget specielt include tags der skal sættes for at få size_t til
at virke? (Har fjernet den igen, for at tage en ting af gangen)
Min nuverende kode er således:
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <stdio.h>
#include <stdlib.h>
SDL_Surface *screen;
SDL_Surface *backgrund;
/*SDL_Surface *red;
SDL_Surface *blue;
SDL_Surface *yellow;
SDL_Surface *green;
SDL_Surface *black;
SDL_Surface *mapping[]; */
SDL_Rect src, dest;
int main()
{
int i, place=0;
/* init SDL */
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("Error. Unable to init SDL: %s\n", SDL_GetError());
return 1;
}
/* Set video mode */
screen = SDL_SetVideoMode(640, 480, 16, 0);
if (screen == NULL) {
printf("Unable to set video mode: &s", SDL_GetError());
return 1;
}
atexit(SDL_Quit);
/* init graphis */
SDL_Surface *mapping[] = { *red = IMG_Load("graphis/red-
brick.png"),
*blue = IMG_Load("graphis/blue-brick.png"),
*green = IMG_Load("graphis/green-brick.png"),
*yellow = IMG_Load("graphis/yellow-
brick.png"),
*black = IMG_Load("graphis/black-brick.png")
};
if (red == NULL || blue == NULL || green == NULL || yellow == NULL
|| black == NULL) {
printf("Unable to initialize 1 or more bitmaps.\n");
if ( red == NULL)
printf("Unable to initilaze red.\n");
if (blue == NULL)
printf("Unable to initialize blue.\n");
if (green == NULL)
printf("Unable tp initilize green.\n");
if (yellow == NULL)
printf("Unable to initilize yellow.\n");
if (black == NULL)
printf("Unable to initilize black.\n");
return 1;
}
for(i = 0; i < 5; i++) {
src.x = place;
src.y = 0;
src.w = red->w;
src.h = red->h;
dest = src;
SDL_BlitSurface(red, &src, screen, &dest);
place = place + 25;
}
SDL_UpdateRect(screen, 0, 0, 0, 0);
SDL_Delay(3000);
return 0;
}
--
Mvh
Heine Laursen
| |
Igor V. Rafienko (01-11-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 01-11-02 17:21 |
|
[ Heine Laursen ]
[ ... ]
> Men jeg har lige, nogne problemer mere
Hva med å ta en titt i K&R2 eller boken til van der Linden? Du får en
langt bedre forklaring der enn du finner på njus.
[ ... ]
> >> > SDL_Surface *RED = IMG_Load( "foo" ),
> >> > *GREEN = IMG_Load( "bar" ),
> >> > *BLUE = IMG_Load( "baz" );
> >> > SDL_Surface *mapping[] = { RED, GREEN, BLUE };
>
> Det kan min compiler ikke rigtig lide!!
Jo, det kan den.
[ ... ]
> Uden brug af for next then løkken.
Hva slags konstruksjon er det?
> > for ( size_t i = 0; i != sizeof mapping / sizeof *mapping; ++i ) {
> > /* init src appropriately */
> >
> > SDL_BlitSurface( mapping[ i ], &src, screen, &dest );
> > }
>
> Er der noget specielt include tags der skal sættes for at få size_t
> til at virke?
Ikke annet enn <stddef.h>, iirc.
> (Har fjernet den igen, for at tage en ting af gangen)
Nei, det er det ikke (men i C90 er det ikke lov å deklarere variable
initialiseringsdelen av en for-løkke. Jeg er litt vel påvirket av C++
for å huske på slike detaljer).
[ ... ]
> int main()
> {
[ ... ]
> /* init graphis */
> SDL_Surface *mapping[] = { *red = IMG_Load("graphis/red-brick.png"),
> *blue = IMG_Load("graphis/blue-brick.png"),
> *green = IMG_Load("graphis/green-brick.png"),
> *yellow = IMG_Load("graphis/yellow-brick.png"),
> *black = IMG_Load("graphis/black-brick.png")
> };
Sånn, rent ved siden av at det ikke er lov å blande sammen setninger
og deklarasjoner i C, koden gir jo ikke mening rent syntaktisk. Hva er
er du vil gjøre over?
int
main()
{
SDL_Surface *mapping[] = { IMG_Load( "foo" ),
IMG_Load( "bar" ),
/* etc */
IMG_Load( "last" ) };
size_t i ;
/* whatever */
for ( i = 0; i != sizeof mapping / sizeof *mapping; ++i ) {
src.x = place;
src.y = 0;
src.w = mapping[ i ]->w;
src.h = mapping[ i ]->h;
dest = src;
SDL_BlitSurface( mapping[ i ], &src, screen, &dest );
place += 25;
}
/* whatever */
}
(Om du må ha mapping global, så blir saken litt værre, da man vil
måtte skille fra hverandre definisjonen og initialisering, men heller
ikke det er uoverkommelig).
ivr
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
-- pederst på irc
| |
|
|