Array C: array subscript is not an integer

elfelf Membre
09:04 modifié dans Vos applications #1
Bonjour,

Je suis toujours en train de me battre avec mon jeu de sokoban. J'ai prèsque terminé le core, il ne resteras bientôt que les finitions...

Mais la je tombe sur un gros problème, d'autant plus gros qu'il m'est incompéensible:

Pour tout le jeu, pour représenter les cases du jeu j'utilise un array deux dimensionel C (board[BOARD_SIZE][BOARD_SIZE], ou BOARD_SIZE est une constante à  la #define).
Dans mon code pour la gestion des colisions (merci SdZ pour ce bout, lol) gcc me resort 32 fois la même erreur (ce qui n'aide pas trop): "error: array subscript is not an integer".
Bref, ça ne veut rien dire pour moi, donc si quelqu'un comprens ça...

Le code:
- (void)movePlayer:(int)direction<br />{<br />	switch(direction)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; case UP:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (playerPosition.y - 1 &lt; 0)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (board[playerPosition.x][playerPosition.y - 1] == TILE_WALL)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />			if ((board[playerPosition.x][playerPosition.y - 1] == TILE_BOX || board[playerPosition.x][playerPosition.y - 1] == TILE_BOX_OK) &amp;&amp;<br />				(playerPosition.y - 2 &lt; 0 || board[playerPosition.x][playerPosition.y - 2] == TILE_WALL ||<br />				 board[playerPosition.x][playerPosition.y - 2] == TILE_BOX || board[playerPosition.x][playerPosition.y - 2] == TILE_BOX_OK))<br />				break;<br />			[self moveBoxWithFirstTile:&amp;board[playerPosition.x][playerPosition.y - 1] secondTile:&amp;board[playerPosition.x][playerPosition.y - 2]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerPosition.y--;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case DOWN:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (playerPosition.y + 1 &gt;= BOARD_SIZE)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (board[playerPosition.x][playerPosition.y + 1] == TILE_WALL)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />			if ((board[playerPosition.x][playerPosition.y + 1] == TILE_BOX || board[playerPosition.x][playerPosition.y + 1] == TILE_BOX_OK) &amp;&amp;<br />				(playerPosition.y + 2 &lt; 0 || board[playerPosition.x][playerPosition.y + 2] == TILE_WALL ||<br />				 board[playerPosition.x][playerPosition.y + 2] == TILE_BOX || board[playerPosition.x][playerPosition.y + 2] == TILE_BOX_OK))<br />				break;<br />			[self moveBoxWithFirstTile:&amp;board[playerPosition.x][playerPosition.y + 1] secondTile:&amp;board[playerPosition.x][playerPosition.y + 2]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerPosition.y++;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case LEFT:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (playerPosition.x - 1 &lt; 0)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (board[playerPosition.x - 1][playerPosition.y] == TILE_WALL)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />			if ((board[playerPosition.x - 1][playerPosition.y] == TILE_BOX || board[playerPosition.x - 1][playerPosition.y] == TILE_BOX_OK) &amp;&amp;<br />				(playerPosition.x - 2 &lt; 0 || board[playerPosition.x - 2][playerPosition.y] == TILE_WALL ||<br />				 board[playerPosition.x - 2][playerPosition.y] == TILE_BOX || board[playerPosition.x - 2][playerPosition.y] == TILE_BOX_OK))<br />				break;<br />			[self moveBoxWithFirstTile:&amp;board[playerPosition.x - 1][playerPosition.y] secondTile:&amp;board[playerPosition.x - 2][playerPosition.y]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerPosition.x--;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; case RIGHT:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (playerPosition.x + 1 &gt;= BOARD_SIZE)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (board[playerPosition.x - 1][playerPosition.y] == TILE_WALL)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />				if ((board[playerPosition.x + 1][playerPosition.y] == TILE_BOX || board[playerPosition.x + 1][playerPosition.y] == TILE_BOX_OK) &amp;&amp;<br />					(playerPosition.x + 2 &lt; 0 || board[playerPosition.x + 2][playerPosition.y] == TILE_WALL ||<br />					 board[playerPosition.x + 2][playerPosition.y] == TILE_BOX || board[playerPosition.x + 2][playerPosition.y] == TILE_BOX_OK))<br />					break;<br />					[self moveBoxWithFirstTile:&amp;board[playerPosition.x + 1][playerPosition.y] secondTile:&amp;board[playerPosition.x + 2][playerPosition.y]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playerPosition.x++;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />&nbsp; &nbsp; }<br />	<br />	[gameView setNeedsDisplay:YES];<br />}<br />


Merci d'avance,
elf

Réponses

  • fouffouf Membre
    09:04 modifié #2
    Quel est le type de playerPosition ? Si c'est un NSPoint c'est normal : les membres sont des floats donc même quand tu fais playerPosition.x + 2 est un float.

    Ce qui faut que tu fasses c'est caster le float : au lieu de

    ... if (board[playerPosition.x][playerPosition.y - 1] == TILE_WALL) ...
    
    tu fais
    ... if (board[(int)(playerPosition.x)][(int)(playerPosition.y - 1)] == TILE_WALL) ...
    


    Il faut que tu fasses ça avec tous les autres tableaux.
  • elfelf Membre
    09:04 modifié #3
    Ah, je suis soulagé! Merci fouf!!!!!
  • AliGatorAliGator Membre, Modérateur
    09:04 modifié #4
    Le mieux ce serait que tu fasses une structure Coord avec 2 membres de type int plutôt que d'utiliser NSPoint en fait, je pense.
    typedef struct Coord {<br />&nbsp; int x;<br />&nbsp; int y;<br />}
    
    C'est plus adapté je pense parce que NSPoint c'est bien mais c'est plus pour localiser un point au sens de "pixel" plutôt qu'une position sur une grille.
  • odjauodjau Membre
    09:04 modifié #5
    dans 1145266181:

    Ce qui faut que tu fasses c'est caster le float


    Je vais sûrement dire une bétise, mais pour moi c'est pas un cast mais une conversion, non ?
    Un cast c'est juste un "changement" de représentation ???

    Quelqu'un peut éclairer ma lanterne sur ce point?

    Merci  :o
  • Eddy58Eddy58 Membre
    avril 2006 modifié #6
    Si c'est bien un cast (que l'on appelle conversion de type, ou transtypage). La valeur dans le tableau ne va pas changer, seul sa valeur entière sera exploitée. :)
  • AliGatorAliGator Membre, Modérateur
    09:04 modifié #7
    En fait la limite est fine en effet entre les deux.

    Théoriquement on pourrait croire que cela fait un casting "brut", c'est à  dire que ça interprète les données binaires du float comme un int, au risque de très très mal les interpréter (les float sont représentés en mémoire sous forme de mantisse + exposant, alors que les int directement avec leur valeur en binaire, donc y'aurait grosse confusion)

    Mais ce n'est pas le cas, en particulier, pour les "types standards" : le casting fait en fait une conversion : caster un float en int, c'est à  dire faire [tt]int i = (int)f[/tt] sur un [tt]float f[/tt] va tronquer le float (comme la fonction "floor") et le convertir en entier.

    D'ailleurs lorsque tu fais un "casting" dans ton code, le compilateur peux très bien te dire que ton casting est illégal (essayes de caster une classe C++ en int pour voir).

    Par contre pour interpréter un floatant comme un entier (fondamentalement je ne vois pas l'intérêt mais c'est à  pur but didactique), il faudrait faire un tour par les pointeurs : prendre l'adresse du float, puis dire "ah non en fait c'est pas une adresse qui pointe sur un float mais sur un int", et ensuite redemander la valeur à  cette adresse :
    float f = 1.7;<br />int strangeInt = *(&nbsp; (int*)(&amp;f) ); // adresse de f, convertie de float* en int*, puis on prend le contenu
    
    Là  dans ce cas particulier il y aura bien réinterprétation et non pas conversion, mais bon c'est vraiment parce qu'on a fait la gymnastique pour le faire explicitement.
  • odjauodjau Membre
    09:04 modifié #8
    Merci pour les précisions  :o
Connectez-vous ou Inscrivez-vous pour répondre.