Bonsoir,
j'essaye de creer un tableau de sfConvexShape* (simplement pour pouvoir iterer sur ses elements) mais je rencontre un crash que je ne comprends pas.
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <SFML/Graphics.h>#include <SFML/System.h>int main
() { sfEvent event
; int sizeArray
= 4; //Size of the array containing the shapes//Create Window sfRenderWindow
*window
= sfRenderWindow_create
((sfVideoMode
){1440, 900, 32}, "SFML window", sfTitlebar
| sfClose
, NULL
); if (!window
) { perror("Open window."); }//Create Shapes sfConvexShape
*shape
= malloc(sizeof(sfConvexShape
*) * sizeArray
); //Alocate the space for [sizeArray] Shapes. sfConvexShape
**shapeArray
= &shape
; //Create Original Shape shapeArray
[0] = sfConvexShape_create
(); sfConvexShape_setPointCount
(shapeArray
[0], 3); //Number Of Vertices sfConvexShape_setPoint
(shapeArray
[0], 0, (sfVector2f
){0,7}); sfConvexShape_setPoint
(shapeArray
[0], 1, (sfVector2f
){2.5,0}); sfConvexShape_setPoint
(shapeArray
[0], 2, (sfVector2f
){5,7}); //Copy Shapes int i
; for (i
= 1; i
< sizeArray
; i
++) { shapeArray
[i
] = sfConvexShape_create
(); shapeArray
[i
] = sfConvexShape_copy
(shapeArray
[0]); sfConvexShape_move
(shapeArray
[i
], (sfVector2f
){i
*100, i
*100}); }// Start the game loop while (sfRenderWindow_isOpen
(window
)) { //Events while (sfRenderWindow_pollEvent
(window
, &event
)) { /* Close window : exit */ if (event.
type == sfEvtClosed
) sfRenderWindow_close
(window
); } //Drawning sfRenderWindow_clear
(window
, sfBlack
); for (i
= 0; i
< sizeArray
; i
++) { sfRenderWindow_drawConvexShape
(window
, shapeArray
[i
], NULL
); } sfRenderWindow_display
(window
);// Flip }//Free variables. sfRenderWindow_destroy
(window
); return EXIT_SUCCESS
;} Le crash se produit a l'appel de sfRenderWindow_drawConvexShape();.
Fait interressant : si on change la valeur de sizeArray par une valeur inferieur a 4.. le code ne crash pas et effectue ce qu'il est suppose faire.
Autre fait etrange, si on change ce code //Copy Shapes
int i;
for (i = 1; i < sizeArray; i++) {
shapeArray[i] = sfConvexShape_create();
shapeArray[i] = sfConvexShape_copy(shapeArray[0]);
sfConvexShape_move(shapeArray[i], (sfVector2f){i*100, i*100});
}
par celui-ci:
//Copy Shapes
shapeArray[1] = sfConvexShape_create();
shapeArray[1] = sfConvexShape_copy(shapeArray[0]);
sfConvexShape_move(shapeArray[1], (sfVector2f){100, 100});
shapeArray[2] = sfConvexShape_create();
shapeArray[2] = sfConvexShape_copy(shapeArray[0]);
sfConvexShape_move(shapeArray[2], (sfVector2f){200, 200});
shapeArray[3] = sfConvexShape_create();
shapeArray[3] = sfConvexShape_copy(shapeArray[0]);
sfConvexShape_move(shapeArray[3], (sfVector2f){300, 300});
(en mettant sizeArray a 4)
le code s'execute parfaitement (alors qu'on est d'accord que c'est un code equivalent a la boucle for ?).
Bref, je pense que tout ceci vient d'un cafouillage dans la creation de mon tableau (je ne pas encore tres tres a l'aise avec les pointeurs de pointeurs de pointeurs de structures ^^').
Merci d'avance ;-)
J'utilisais la RC.
J'ai supprime les dossiers SFML dans /usr/local/lib et /usr/local/include et installe les dernieres sources mais le programme crashe toujours.
Sortie de gdb (de la lib version debug):
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff67af570 in sf::RenderTarget::draw (this=0x60e978, drawable=...,
states=...)
at /home/mscofield/SFML/SFML/src/SFML/Graphics/RenderTarget.cpp:126
126 drawable.draw(*this, states);
(gdb) bt full
#0 0x00007ffff67af570 in sf::RenderTarget::draw (this=0x60e978, drawable=...,
states=...)
at /home/mscofield/SFML/SFML/src/SFML/Graphics/RenderTarget.cpp:126
No locals.
#1 0x00007ffff79c5619 in sfRenderWindow_drawConvexShape (
renderWindow=0x60e950, object=0x2c40000000a, states=0x0)
at /home/mscofield/SFML/CSFML/src/SFML/Graphics/RenderWindow.cpp:391
No locals.
#2 0x0000000000400c2a in main () at test.c:62
event = {type = sfEvtMouseMoved, size = {type = sfEvtMouseMoved,
width = 708, height = 829}, key = {type = sfEvtMouseMoved,
code = 708, alt = 829, control = 0, shift = 4197712, system = 0},
text = {type = sfEvtMouseMoved, unicode = 708}, mouseMove = {
type = sfEvtMouseMoved, x = 708, y = 829}, mouseButton = {
type = sfEvtMouseMoved, button = 708, x = 829, y = 0},
mouseWheel = {type = sfEvtMouseMoved, delta = 708, x = 829, y = 0},
joystickMove = {type = sfEvtMouseMoved, joystickId = 708,
axis = 829, position = 0}, joystickButton = {
type = sfEvtMouseMoved, joystickId = 708, button = 829},
joystickConnect = {type = sfEvtMouseMoved, joystickId = 708}}
window = 0x60e950
shape = 0x1175040
shapeArray = 0x7fffffffe958
---Type <return> to continue, or q <return> to quit---
i = 3
Bah,
cd /usr/local/lib
rm SFML -R
cd ..
cd include
rm SFML -R
Apres ca les repertoires etaient bien vides, maintenant ils contiennent respectivement les lib(c)sfml-****-d.so et les .h.
Apparement, le probleme vient du fait que le second argument de sfRenderWindow_drawConvexShape() contient une valeur etrange (object=0x2c40000000a) alors qu'il devrait contenir 0x1175040 (ce qui arrive bien lorsque sizeArray vaut 3).
Le plus simple serait de voir si tu arrives a reproduire le bug ?