Array C: array subscript is not an integer
elf
Membre
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:
Merci d'avance,
elf
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 /> {<br /> case UP:<br /> if (playerPosition.y - 1 < 0)<br /> break;<br /> if (board[playerPosition.x][playerPosition.y - 1] == TILE_WALL)<br /> break;<br /> if ((board[playerPosition.x][playerPosition.y - 1] == TILE_BOX || board[playerPosition.x][playerPosition.y - 1] == TILE_BOX_OK) &&<br /> (playerPosition.y - 2 < 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:&board[playerPosition.x][playerPosition.y - 1] secondTile:&board[playerPosition.x][playerPosition.y - 2]];<br /> playerPosition.y--;<br /> break;<br /> case DOWN:<br /> if (playerPosition.y + 1 >= BOARD_SIZE)<br /> break;<br /> if (board[playerPosition.x][playerPosition.y + 1] == TILE_WALL)<br /> break;<br /> if ((board[playerPosition.x][playerPosition.y + 1] == TILE_BOX || board[playerPosition.x][playerPosition.y + 1] == TILE_BOX_OK) &&<br /> (playerPosition.y + 2 < 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:&board[playerPosition.x][playerPosition.y + 1] secondTile:&board[playerPosition.x][playerPosition.y + 2]];<br /> playerPosition.y++;<br /> break;<br /> case LEFT:<br /> if (playerPosition.x - 1 < 0)<br /> break;<br /> if (board[playerPosition.x - 1][playerPosition.y] == TILE_WALL)<br /> break;<br /> if ((board[playerPosition.x - 1][playerPosition.y] == TILE_BOX || board[playerPosition.x - 1][playerPosition.y] == TILE_BOX_OK) &&<br /> (playerPosition.x - 2 < 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:&board[playerPosition.x - 1][playerPosition.y] secondTile:&board[playerPosition.x - 2][playerPosition.y]];<br /> playerPosition.x--;<br /> break;<br /> case RIGHT:<br /> if (playerPosition.x + 1 >= BOARD_SIZE)<br /> break;<br /> if (board[playerPosition.x - 1][playerPosition.y] == TILE_WALL)<br /> break;<br /> if ((board[playerPosition.x + 1][playerPosition.y] == TILE_BOX || board[playerPosition.x + 1][playerPosition.y] == TILE_BOX_OK) &&<br /> (playerPosition.x + 2 < 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:&board[playerPosition.x + 1][playerPosition.y] secondTile:&board[playerPosition.x + 2][playerPosition.y]];<br /> playerPosition.x++;<br /> break;<br /> }<br /> <br /> [gameView setNeedsDisplay:YES];<br />}<br />
Merci d'avance,
elf
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce qui faut que tu fasses c'est caster le float : au lieu de
tu fais
Il faut que tu fasses ça avec tous les autres tableaux.
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
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 :
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.