/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste