T4b's persönlicher Dumme-C-Fragen-Thread


Re: T4b's-C-Fragen-Thread

<r><QUOTE author="foxblock"><s>
foxblock said:
</s>Das sollte gehen, warum auch nicht...<e>
</e></QUOTE>Wusste nicht mehr genau wie das gehandhabt wird, wenn man ints und floats durcheinanderbringt...<br/>
<br/>
Okay, danke. <E>:)</E><br/>
<br/>
-- So Aug 22, 2010 21:12 --<br/>
<br/>
Ich habe mir gerade mit Synaptic (in Ubuntu) sdl_image installiert. Dann wollte ich sehen ob es geht und habe <URL url="http://de.wikibooks.org/wiki/SDL:_Tux-Programm"><s></s>dieses<e></e></URL> Beispielprogramm im SDL Wikibook abgeändert, so dass es diese lib für das laden des Bildes nutzen sollte:
<CODE><s>
Code:
</s>#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

int main(int argc, char *argv[])
{
	SDL_Surface *screen, *image;
    SDL_Rect dst, dstblue;
    SDL_Event event;
    Uint8 *keys;
	int tuxX = 50, tuxY = 50;
    int done = 0;
    if (SDL_Init(SDL_INIT_VIDEO) == -1) {
        printf("Can't init SDL:  %s\n", SDL_GetError());
        exit(1);
    }
    atexit(SDL_Quit); 
    screen = SDL_SetVideoMode(800, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 255));
    if (screen == NULL) {
        printf("Can't set video mode: %s\n", SDL_GetError());
        exit(1);
    }
    image = IMG_Load ("tux.bmp");
    if (image == NULL) {
        printf("Can't load image of tux: %s\n", SDL_GetError());
        exit(1);
    }	
    dst.w = image->w;
    dst.h = image->h;
    dstblue.w = image->w + 1;
    dstblue.h = image->h + 1;
    SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 0));    
    while (!done) {
        while (SDL_PollEvent(&event)) {
            switch(event.type) {
            case SDL_QUIT:
                done = 1;
                break;
            }
        }
       dstblue.x = tuxX;
       dstblue.y = tuxY;
       keys = SDL_GetKeyState(NULL);
       if (keys[SDLK_UP]) {
           if (tuxY > 10) {
               tuxY--;
           }
       }
       if (keys[SDLK_DOWN]) {
           if (tuxY < 470 - image->h) {
               tuxY++;
           }
       }
       if (keys[SDLK_RIGHT]) {
           if(tuxX < 630 - image->w) {
               tuxX++;
           }
       }
       if (keys[SDLK_LEFT]) {
           if (tuxX > 10) {
               tuxX--;
           }
       }
       dst.x = tuxX;
       dst.y = tuxY;
       SDL_FillRect(screen, &dstblue, SDL_MapRGB(screen->format, 0, 0, 255));
       SDL_BlitSurface(image, NULL, screen, &dst);
       SDL_Flip(screen);
    }
    SDL_FreeSurface(image);
    return 0;
}
<e>
</e></CODE>
Wenn ich das jetzt kompilieren will kommt das:
<CODE><s>
Code:
</s>t4b@t4b-desktop:~/Dev/C/SDL/Beispielprogramm_Tux$ gcc Beispielprogramm_Tux.c 
/tmp/ccDw2cn6.o: In function `main':
Beispielprogramm_Tux.c:(.text+0x29): undefined reference to `SDL_Init'
Beispielprogramm_Tux.c:(.text+0x33): undefined reference to `SDL_GetError'
Beispielprogramm_Tux.c:(.text+0x57): undefined reference to `SDL_Quit'
Beispielprogramm_Tux.c:(.text+0x80): undefined reference to `SDL_SetVideoMode'
Beispielprogramm_Tux.c:(.text+0xab): undefined reference to `SDL_MapRGB'
Beispielprogramm_Tux.c:(.text+0xc3): undefined reference to `SDL_FillRect'
Beispielprogramm_Tux.c:(.text+0xcf): undefined reference to `SDL_GetError'
Beispielprogramm_Tux.c:(.text+0xf8): undefined reference to `IMG_Load'
Beispielprogramm_Tux.c:(.text+0x108): undefined reference to `SDL_GetError'
Beispielprogramm_Tux.c:(.text+0x182): undefined reference to `SDL_MapRGB'
Beispielprogramm_Tux.c:(.text+0x19a): undefined reference to `SDL_SetColorKey'
Beispielprogramm_Tux.c:(.text+0x1c3): undefined reference to `SDL_PollEvent'
Beispielprogramm_Tux.c:(.text+0x1e5): undefined reference to `SDL_GetKeyState'
Beispielprogramm_Tux.c:(.text+0x2b4): undefined reference to `SDL_MapRGB'
Beispielprogramm_Tux.c:(.text+0x2cc): undefined reference to `SDL_FillRect'
Beispielprogramm_Tux.c:(.text+0x2f0): undefined reference to `SDL_UpperBlit'
Beispielprogramm_Tux.c:(.text+0x2fc): undefined reference to `SDL_Flip'
Beispielprogramm_Tux.c:(.text+0x313): undefined reference to `SDL_FreeSurface'
collect2: ld returned 1 exit status
t4b@t4b-desktop:~/Dev/C/SDL/Beispielprogramm_Tux$ 
<e>
</e></CODE>
<E>:huh:</E> <br/>
<br/>
Ich sehe den Fehler nicht.</r>
 
Re: T4b's-C-Fragen-Thread

<r>wie kompilierst du das? mit einer Makefile oder in einer IDE?<br/>
EDIT: Sorry blöde frage.... ich sehe gerade, du machst es direkt mit gcc.... dir fehlen die Includes und nach dem kompilieren die Links...<br/>
<br/>
vielleicht auch hier deinen eigenen Rat zu herzen nehmen <E>;)</E>
<QUOTE author="T4b"><s>
T4b said:
</s>
In dem Fall wird mein Kommentar noch ein bisschen bissiger, ist aber nicht böse gemeint: Zuerst denken (bzw. eine suchmaschine, manpages oder was auch immer bemühen) dann posten. <E>;)</E><e>
</e></QUOTE></r>
 
Re: T4b's-C-Fragen-Thread

<r>Die includes sind alle da... Wenn sie nicht da sind kommt z. B. sowas
<QUOTE><s>
</s>Beispielprogramm_Tux.c:3:26: error: SDL/SDL_imag.h: No such file or directory<e>
</e></QUOTE>
wenn man das "e" bei image vergessen hat.<br/>
<br/>
Das hab ich extra gemacht (vor dem posten) um festzustellen ob das include richtig da ist.</r>
 
Re: T4b's-C-Fragen-Thread

<r>Hi,<br/>
ich kann mich Thrake eigentlich nur anschließen, versuche solche Probleme erst einmal selber zu lösen, für solche Fälle gibts 10000000000000000000000 Hits bei Google <E>;)</E><br/>
<br/>
Aber das Problem liegt darin das du dem Compiler/Linker nicht sagst welche Libs er einbinden soll, die Header alleine reichen da nicht, weil die nur zusammen mit der entsprechenden Lib ihre Funktionen erfüllen können. <br/>
<br/>
Am besten googelst du mal nach "SDL Makefile", ich arbeite z.B. seit einigen Jahren mit diesem Tutorial, für den Einstieg in SDL gut geeignet wie ich finde : <br/>
<br/>
<URL url="http://www.amigalien.de/AMIGAProjekt/help/sdl/index.htm">http://www.amigalien.de/AMIGAProjekt/help/sdl/index.htm</URL><br/>
<br/>
Ich hoffe das hilft dir weiter!<br/>
<br/>
MfG</r>
 
Re: T4b's-C-Fragen-Thread

<t>Mist, eigentlich weiss ich das, hab ich glatt vergessen, Danke.<br/>
<br/>
-- Mo Aug 23, 2010 21:43 --<br/>
<br/>
Ich finde dazu nirgend ein Beispiel oder eine Beschreibung aus der ich schlau würde.<br/>
<br/>
Wenn ich einen Pointer in eine Struktur stecke, sieht das dann "struktur.*pointer" aus oder irgendwas mit diesem "->" oder was?<br/>
<br/>
Edit: Also ich will ein<br/>
SDL_Surface * picture<br/>
in einer Struktur stecken.<br/>
<br/>
-- Di Aug 24, 2010 15:48 --<br/>
<br/>
Push</t>
 
Re: T4b's-C-Fragen-Thread

<r><CODE><s>
Code:
</s>struct
{
  SDL_Surface *yfi;
}yfs;

yfs.yfi = SDL_LoadBMP("yfp.bmp");<e>
</e></CODE>

Einfach zu merken: wenn links ein Zeiger steht, dann "->", wenn nicht, dann '.' . Wenn du jetzt z.B. auf die Breite des Bildes zugreifen willst, dann nimmst du "->", da "yfi" nur die Anfangsadresse des SDL_Surfaces enthält ( = Zeiger auf das eigentlich SDL_Surface ), nicht aber das SDL_Surface selbst.<br/>

<CODE><s>
Code:
</s><i>
</i>int w = yfs.yfi->w;
<e>
</e></CODE>

<br/>
Buchtipp: "C von A bis Z" von Jürgen Wolf, gibts auch als Openbook.</r>
 
Re: T4b's-C-Fragen-Thread

<r><QUOTE author="Schnatterplatsch"><s>
Schnatterplatsch said:
</s>Buchtipp: "C von A bis Z" von Jürgen Wolf, gibts auch als Openbook.<e>
</e></QUOTE>
Liegt aufgeschlagen neben mir, wie meistens wenn ich in C ein Problem habe...<br/>
Dort hat's seitenweise Beispiele (<edit>und auch sonst schreibt er über simple Themen, die in ein paar Sätzen klar wären Romane, aber auf den Punkt bringt er's selten</edit>), aber einfach nur kurz und bündig etwas schreiben kann der Typ nicht. Finde nicht, dass sich der Kauf gelohnt hat. <E>:grrr:</E> <br/>
<br/>
Der Stil von z. B. <URL url="http://www.netzmafia.de/skripten/ad/thomas-c/index.html">http://www.netzmafia.de/skripten/ad/thomas-c/index.html</URL> finde ich viel besser (<edit>ist vielleicht nicht so für Anfänger geeignet, aber ich verstehe das viel besser als C von A bis Z. Mit Anfänger meine ich Leute die nicht nur von C, sondern auch von sonst allem keine Ahnung haben.</edit>). Nur dass ich es hasse längere Texte am Bildschirm zu lesen.<br/>
<br/>
Edit: Aber ich hab's jetzt kapiert, Danke. <E>:)</E><br/>
<br/>
-- Mi Aug 25, 2010 17:46 --<br/>
<br/>
Ich versuche die fps meines Spiels zu kontrollieren. Mit dem unterhalb gezeigten Code will ich erreichen, dass die Schleife an deren Anfang das steht möglichst immer 33 ms dauert.
<QUOTE><s>
</s>// Vor der Schleife in der das steht hab ich noch "Uint32 fpsControl = 0;"<br/>
if(fpsControl){<br/>
if(fpsControl >= 33){<br/>
SDL_Delay (33-fpsControl);<br/>
fpsControl=SDL_GetTicks();<br/>
}else{<br/>
char tooSlow=1;<br/>
}<br/>
}else{<br/>
fpsControl=SDL_GetTicks();<br/>
}<e>
</e></QUOTE>
Geht aber nicht, es bringt nur mein vorher funktionierendes Spiel dazu beim Start sofort einzufrieren, so dass ich es nur noch mit kill loswerden kann.</r>
 
Re: T4b's-C-Fragen-Thread

<r><QUOTE><s>
</s>SDL_GetTicks -- Gets the number of milliseconds since SDL library initialization. <e>
</e></QUOTE>
Soll heißen, wenn dein beschriebener Code nicht DIREKT hinter der SDL Initialisierung steht, wird
<CODE><s>
Code:
</s>fpsControl = SDL_GetTicks()<e>
</e></CODE>
einen wert deutlich über 0 und vermutlich auch über 33 liefern, was bewirkt dass
<CODE><s>
Code:
</s>SDL_GetTicks(33-fpsControl)<e>
</e></CODE>
einen negativen Wert ergibt und das SDL_Delay vermutlich veranlasst für immer zu warten.<br/>
Du musst, damit das funktioniert am Anfang deiner Schleife den Wert von SDL_GetTicks() speichern, dann deine Anweisungen durchführen und dann mit dem Wert von SDL_GetTicks() von danach vergleichen und ggf. die Differenz warten (Achtung vor negativen Werten!).<br/>
<br/>
foxblock out</r>
 
Re: T4b's-C-Fragen-Thread

<r>SDL_gfx hat einen einfachen FPS-Manager, probier den doch mal aus. <E>;)</E></r>
 
Re: T4b's-C-Fragen-Thread

<r>Das probiere ich mal aus.<br/>
<br/>
@foxblock: Eigentlich wollte ich genau das machen - aber irgendwie bin ich da wohl auf dem Schlauch gestanden, dass ich nicht bemerkt habe, dass ich da einen Denkfehler drin hatte. Wenn der FPS-Manager von SDL_gfx nicht das macht was ich will mache ich das dann. <E>^_^</E><br/>
<br/>
<B><s></s><I><s></s>Edit:<e></e></I><e></e></B><br/>
<br/>
Der SDL_gfx FPS-Manager beschehrt mir einen Segmentation fault.<br/>
<br/>
Dann hat selber...</r>
 
Re: T4b's-C-Fragen-Thread

<r><QUOTE><s>
</s>Der SDL_gfx FPS-Manager beschehrt mir einen Segmentation fault.<e>
</e></QUOTE>

Ich glaube eher, dass du dem FPSManager nen segfault bescherst und nicht andersrum. <E>;)</E> <br/>

<CODE><s>
Code:
</s>FPSmanager *fpsmanager;
fpsmanager = malloc( sizeof( FPSmanager ) );
SDL_initFramerate( fpsmanager );
SDL_setFramerate( fpsmanager, 60 );

while(1)
{
  SDL_framerateDelay( gfx_fpsmanager );
}<e>
</e></CODE>

<QUOTE><s>
</s>
Wenn der FPS-Manager von SDL_gfx nicht das macht was ich will mache ich das dann. <E>^_^</E><e>
</e></QUOTE>

Du strengst deine grauen Zellen an, mit Programmieren hat das hier nur z.T. was zu tun. Oder du benutzt google. Wenn du da nichts findest, dann verschluck ich ne Pandora im Ganzen.</r>
 
Re: T4b's-C-Fragen-Thread

<r><QUOTE author="Schnatterplatsch"><s>
Schnatterplatsch said:
</s>Du strengst deine grauen Zellen an, mit Programmieren hat das hier nur z.T. was zu tun. Oder du benutzt google. Wenn du da nichts findest, dann verschluck ich ne Pandora im Ganzen.<e>
</e></QUOTE>
Das will ich sehen. <E>:-D</E> <br/>
<br/>
Das war mir zu dumm, ich habe gestern in 10 Minuten schnell selbst so einen FPS-manager geschrieben, ist vielleicht nicht so komfortabel und ich müsste ihn noch hübsch in ein oder zwei Funktionen stecken, damit er auch in anderen Programmen verwendbar ist, aber er geht...<br/>
<br/>
Edit:<QUOTE author="Schnatterplatsch"><s>
Schnatterplatsch said:
</s>Ich glaube eher, dass du dem FPSManager nen segfault bescherst und nicht andersrum. <E>;)</E> <e>
</e></QUOTE>
Schon möglich, ich gebe ihm trotzdem die Schuld. <E>:-D</E><br/>
<br/>
-- Fr Sep 10, 2010 16:41 --<br/>

<SPOILER><s>
</s><CODE><s>
Code:
</s><i>
</i>#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <SDL/SDL.h>
#include <SDL_gfxPrimitives.h>
#include <SDL_image.h>
#include <SDL_ttf.h>


#define FPS 30

int main(int argc, char *argv[]){
	SDL_Surface *screen;
	SDL_Event event;
	Uint8 *keys;
	bool done=false, pause=false;
	Uint32 fpsControl=0;
	char loc=1;
		//0 = Menü
		//1 = Level
	
	struct opponent { // A structure for the opponent
		struct opponentAppearance { // A structure for the appearance of the opponent
			Sint16 x1; // Top left corner
			Sint16 y1; // Top left corner
			Sint16 x2; // How many to add to x1 to get the bottom right corner
			Sint16 y2; // How many to add to y1 to get the bottom right corner
			Uint32 color; // The color value of the opponent to draw (0xRRGGBBAA).
			short shape;
				// Which shape
				// 1 = rectangle
				// 2 = ellipse
		}appearance;
		struct opponentMovement { // Another structure for the movement-related variables
			short chasemode;
				// Which chasemode to choose.
				// 1 = straight
				// ...
			short speed; // How fast the opponent is
			// More stuff which is missing for now, as it hasn't been implemented yet in moveOpponent
		}movement;
		// Maybe in the future more stuff which doesn't fit in either structure, or even a third structure
	};
	
	struct player { // A structure which contains all information about the player
		short x;
		short y;
		short speed;
		char alive;
			// 1 = alive
			// 2 = dead
		SDL_Surface * image;
		// Maybe in the future more stuff
	};
	
	int printOpponent(struct opponent *opponent){
		if(opponent->appearance.shape == 1){
			boxColor(screen,opponent->appearance.x1,opponent->appearance.y1,opponent->appearance.x1+opponent->appearance.x2,opponent->appearance.y1+opponent->appearance.y2,opponent->appearance.color);
		}else if(opponent.appearance.shape == 2){
			filledEllipseColor(screen,opponent->appearance.x1+opponent->appearance.x2/2,opponent->appearance.y1+opponent->appearance.y2/2,opponent->appearance.x2/2,opponent->appearance.y2/2,opponent->appearance.color);
		}else{
			printf("opponent->appearance.shape has the wrong value.");
			exit(1);
		}
		return 0;
	}
	
	int near(Sint16 *x1, Sint16 *x2,Sint16 *returnval, short *change){
		if(*x1 > *x2){
			*returnval += *change;
		}else if(*x1 < *x2){
			*returnval -= *change;
		}
	return 0;
	}
	
	int moveOpponent(struct opponent *opponent, struct player *player){// move the opponent in different ways depending on chasemode
		if(opponent->movement.chasemode == 1){ //straight
			short playerx = player->x+player->image->w/2, playery = player->y+player->image->h/2,opponentx = opponent->appearance.x1+opponent->appearance.x2/2,opponenty = opponent->appearance.y1+opponent->appearance.y2/2;
			near(&playery,&opponenty,&opponent->appearance.y1,&opponent->movement.speed);
			near(&playerx,&opponentx,&opponent->appearance.x1,&opponent->movement.speed);
			printOpponent(*opponent);
		}else if(opponent->movement.chasemode == 2){
			short playerx = player->x+player->image->w/2, playery = player->y+player->image->h/2,opponentx = opponent->appearance.x1+opponent->appearance.x2/2,opponenty = opponent->appearance.y1+opponent->appearance.y2/2;
			//Unfinished
		}else{
			printf("opponent.movement.chasemode has the wrong value.");
			exit(1);
		}
		return 0;
	}
	
	int printPlayer(struct player *player){
		SDL_Rect dst;
		dst.w = player->image->w;
		dst.h = player->image->h;
		dst.x = player->x;
		dst.y = player->y;
		SDL_BlitSurface(player->image, NULL, screen, &dst);
		return 0;
	}
	
	int movePlayer(struct player *player){
		keys = SDL_GetKeyState(NULL);
		if(keys[SDLK_UP]){
			player->y -= player->speed;
		}else if(keys[SDLK_DOWN]){
			player->y += player->speed;
		}else if(keys[SDLK_RIGHT]){
			player->x += player->speed;
		}else if(keys[SDLK_LEFT]){
			player->x -= player->speed;
		}
		return 0;
	}
	
	int checkAlive(struct player *player, struct opponent *opponent){
		if((player->x + player->image->w > opponent->appearance.x1 || player->x < opponent->appearance.x1+opponent->appearance.x2) && (player->y + player->image->h> opponent->appearance.y1 || player->y < opponent->appearance.y1+opponent->appearance.y2)){
			player->alive = 2;
		}
		return 0;
	}
	int level(struct player *player,struct opponent *opponent){
		movePlayer(&player);
		printPlayer(&player);
		moveOpponent(&opponent,&player);
		printOpponent(&opponent);
		checkAlive(&player,&opponent);
	}
	/*******************Level initialization **********************************/
	// Only temporary here, that isn't possible anymore when I want more dann one level (or a main menu)
	struct opponent opponent1 = {
		.appearance={
			.x1=780,
			.y1=400,
			.x2=100,
			.y2=100,
			.color=0xFF000080,
			.shape=1
		},
		.movement={
			.chasemode=1,
			.speed=1
		}
	};
	struct player player1 = {
		.x=1,
		.y=1,
		.speed=5,
		.alive=1,
		.image=IMG_Load("player.png")
	};
	if (player1.image == NULL) {
		printf("Can't load image: %s\n", SDL_GetError());
		exit(1);
	}
	/********************** SDL initialization stuff **************************/
	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) {
		printf("Can't init SDL:  %s\n", SDL_GetError());
		exit(1);
	}
	atexit(SDL_Quit);
	if(TTF_Init()==-1) {
		printf("TTF_Init: %s\n", TTF_GetError());
		exit(2);
	}

	SDL_Color white = {255,255,255};
	SDL_Color red = {255,0,0};
	screen = SDL_SetVideoMode(800, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
	if (screen == NULL) {
		printf("Can't set video mode: %s\n", SDL_GetError());
		exit(1);
	}
	fpsControl=SDL_GetTicks();
	while (!done) {
		keys=SDL_GetKeyState(NULL);
		if(keys[SDLK_ESCAPE]){
			done = true;
		}
		if(keys[SDLK_p]){
			if(!pause){
				pause = true;
				SDL_Delay(500);
			}else{
				pause = false;
				SDL_Delay(500);
			}
		}
		while (SDL_PollEvent(&event)) {
			switch(event.type) {
			case SDL_QUIT:
				done = true;
				break;
			}
		}
		if(pause){
			continue;
		}
		SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); // Fill screen with black.
		if( (SDL_GetTicks()-fpsControl) <= FPS){
		SDL_Delay (FPS-(SDL_GetTicks()-fpsControl));
		fpsControl=SDL_GetTicks();
		}else{
//			bool tooSlow=true;
			fpsControl=SDL_GetTicks();
		}
	/**************************************************************************/
		if(loc == 1){
			level(&player1,&opponent1);
		}else if(loc == 0){
			//menu
			TTF_Font *font=TTF_OpenFont("trancefm.ttf",28);
			if(!font) {
				printf("TTF_OpenFont: %s\n", TTF_GetError());
			}
			SDL_Surface *mainmenu = TTF_RenderText_Solid(font, "Press enter to play", white);
			SDL_Rect rect = {200,0,0,0};
			SDL_BlitSurface(mainmenu,NULL,screen,&rect);
		}
		SDL_Flip(screen);
	}
	return 0;
}

<e>
</e></CODE><e>
</e></SPOILER>
Irgendwas hab ich bei den Pointern verpatzt, bei der Funktion "level", die Funktionen die von "level" aufgerufen werden gingen alle als ich sie direkt aufgerufen habe.<br/>
Ich weiss aber nicht was ich falsch mache, ich finde den Fehler nicht. Kann sich das mal Jemand schnell anschauen?
<SPOILER><s>
</s><CODE><s>
Code:
</s>$ gcc -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -L/usr/lib -l SDL -l SDL_image -l SDL_gfx -lSDL_ttf -Wall main.c -o main
main.c: In function ‘printOpponent’:
main.c:69: error: request for member ‘appearance’ in something not a structure or union
main.c: In function ‘moveOpponent’:
main.c:92: error: incompatible type for argument 1 of ‘printOpponent’
main.c:66: note: expected ‘struct opponent *’ but argument is of type ‘struct opponent’
main.c:94: warning: unused variable ‘opponenty’
main.c:94: warning: unused variable ‘opponentx’
main.c:94: warning: unused variable ‘playery’
main.c:94: warning: unused variable ‘playerx’
main.c: In function ‘level’:
main.c:134: warning: passing argument 1 of ‘movePlayer’ from incompatible pointer type
main.c:113: note: expected ‘struct player *’ but argument is of type ‘struct player **’
main.c:135: warning: passing argument 1 of ‘printPlayer’ from incompatible pointer type
main.c:103: note: expected ‘struct player *’ but argument is of type ‘struct player **’
main.c:136: warning: passing argument 1 of ‘moveOpponent’ from incompatible pointer type
main.c:87: note: expected ‘struct opponent *’ but argument is of type ‘struct opponent **’
main.c:136: warning: passing argument 2 of ‘moveOpponent’ from incompatible pointer type
main.c:87: note: expected ‘struct player *’ but argument is of type ‘struct player **’
main.c:137: warning: passing argument 1 of ‘printOpponent’ from incompatible pointer type
main.c:66: note: expected ‘struct opponent *’ but argument is of type ‘struct opponent **’
main.c:138: warning: passing argument 1 of ‘checkAlive’ from incompatible pointer type
main.c:127: note: expected ‘struct player *’ but argument is of type ‘struct player **’
main.c:138: warning: passing argument 2 of ‘checkAlive’ from incompatible pointer type
main.c:127: note: expected ‘struct opponent *’ but argument is of type ‘struct opponent **’
main.c:139: warning: no return statement in function returning non-void
main.c: In function ‘main’:
main.c:179: warning: unused variable ‘red’
<e>
</e></CODE><e>
</e></SPOILER>
Die Warnungen wegen unbenützen Variablen kommen daher, dass das Spielchen noch nicht fertig ist, und daher halt nicht alle auch wirklich benützt werden.<br/>
Ist also durchaus Absicht, dass da einige im Augenblick überflüssige Variablen sind. <E>;)</E><br/>
<br/>
-------------------------------------<br/>
<br/>
Push.</r>
 
Re: T4b's-C-Fragen-Thread

<r>Hmm, bin jetzt nicht der C Experte, aber müsstest du nicht, wenn du einen struct definierst
<CODE><s>
Code:
</s>struct opponent {...} <e>
</e></CODE>
Diesen als funktionsparameter so übergeben (hier als pointer)
<CODE><s>
Code:
</s>int printOpponent(opponent *opponent){...}<e>
</e></CODE>
also ohne nochmal struct davor zu setzen, da du ja quasi schon einen neuen Typen definiert hast (ist zumindest in C++ so).</r>
 
Re: T4b's-C-Fragen-Thread

<r>Ne, in C muss man da ein typedef machen. Habs mir jetzt nicht groß angeschaut, aber geht denn eine Variable mit gleichem Namen wie der Typ überhaupt??? <E>;)</E></r>
 
Re: T4b's-C-Fragen-Thread

<r><QUOTE author="Schnatterplatsch"><s>
Schnatterplatsch said:
</s>Ne, in C muss man da ein typedef machen. Habs mir jetzt nicht groß angeschaut, aber geht denn eine Variable mit gleichem Namen wie der Typ überhaupt??? <E>;)</E><e>
</e></QUOTE>
Hat immer funktioniert. Ich glaube wenn er gleich ist könnte man den Namen sogar weglassen.<br/>
<br/>
Vorher hatte ich ein paar Funktionen
<CODE><s>
Code:
</s>      movePlayer(&player);
      printPlayer(&player);
      moveOpponent(&opponent,&player);
      printOpponent(&opponent);
      checkAlive(&player,&opponent);<e>
</e></CODE>
Die ich für jedes Frame aufgerufen habe. Ich wollte diese Funktionen ihrerseits in ein Funktion "level" stecken:
<CODE><s>
Code:
</s>   int level(struct player *player,struct opponent *opponent){
      movePlayer(&player);
      printPlayer(&player);
      moveOpponent(&opponent,&player);
      printOpponent(&opponent);
      checkAlive(&player,&opponent);
   }<e>
</e></CODE>
Aber irgendwas ab ich da falsch gemacht, es geht so nicht mehr.</r>
 
Re: T4b's-C-Fragen-Thread

<r><QUOTE author="T4b"><s>
T4b said:
</s>
<CODE><s>
Code:
</s>   int level(struct player *player,struct opponent *opponent){
      movePlayer(&player);
      printPlayer(&player);
      moveOpponent(&opponent,&player);
      printOpponent(&opponent);
      checkAlive(&player,&opponent);
   }<e>
</e></CODE>
<e>
</e></QUOTE>

Das Problem liegt an den doppelten Pointern. Mit <CODE><s>
Code:
</s>struct player *player<e>
</e></CODE> ist player bereits ein Pointer auf ein player struct. <CODE><s>
Code:
</s>&player<e>
</e></CODE> bedeutet in dem Fall dann die Adresse vom Pointer player, der auf ein player struct zeigt (deswegen auch die Meldung "argument is of type ‘struct player **’").<br/>
Wenn du die &s in dieser Funktion weglässt, sollte sie kompilieren.</r>
 
Re: T4b's persönlicher Dume-C-Fragen-Thread

<r><B><s></s>-- Mi Sep 15, 201<COLOR color="#BF0000"><s></s>0<e></e></COLOR> 16:07 --<e></e></B><br/>
Ah, klar.<br/>
<br/>
Wieso bin ich da nur nicht selbst drauf gekommen? <E>:huh:</E> <br/>
Ist ja eigentlich vollkommen logisch (zumindest im Nachhinein <E>:-D</E> ).<br/>
<br/>
Jetzt aber hier etwas, wo ich wirklich absolut nicht verstehe wieso das nicht geht:
<CODE><s>
Code:
</s><i>
</i>    struct opponent opponent[1];
    opponent[0] = {
        .appearance={
            .x1=780,
            .y1=400,
            .x2=100,
            .y2=100,
            .color=0xFF000080,
            .shape=1
        },
        .movement={
            .chasemode=1,
            .speed=1
        }
    };<e>
</e></CODE>
(Ich weiss, ein Array mit einem Feld ist sinnlos, ich wollte zuerst nur mal, das es auch mit einem Array geht)<br/>
<br/>
Aber irgendwie will das so nicht:
<CODE><s>
Code:
</s>main.c:143: error: expected expression before ‘{’ token<e>
</e></CODE>
WTF?<br/>
Das ging doch vorher genauso, nur das es halt nicht "opponent[0]" sondern "opponent" war.<br/>
<br/>
<B><s></s>-- Sa Apr 09, 201<COLOR color="#BF0000"><s></s>1<e></e></COLOR> 22:53 --<br/>
<br/>
Wieder mal meinen alten Thread mit blöden Fragen wieder aufleben lassen. <E>:-D</E> <e>
</e></B><br/>
<br/>
Durch was wird "error: invalid types ‘GLuint[int]’ for array subscript" ausgelöst? Ich hab schon gesucht, aber ich habe soweit ich das sehe keinen der Fehler gemacht, die die in den Suchergebnissen gemacht haben.<br/>
Wenn ich vielleicht wüsste was ein "array subscript" ist, fände ich ihn vielleicht schon.</r>
 
Back
Top