Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [CRASH]Creer un tableau de sfConvexShape*  (Lu 4073 fois)

0 Membres et 1 Invité sur ce sujet

mscofield

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
[CRASH]Creer un tableau de sfConvexShape*
« le: Septembre 03, 2012, 09:49:24 pm »
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 ;-)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [CRASH]Creer un tableau de sfConvexShape*
« Réponse #1 le: Septembre 03, 2012, 10:12:57 pm »
Tu utilises quelle version de SFML ? Tu as essayé les dernières sources ? Il me semble qu'un tel bug a été corrigé depuis la RC.
Laurent Gomila - SFML developer

mscofield

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [CRASH]Creer un tableau de sfConvexShape*
« Réponse #2 le: Septembre 04, 2012, 04:10:16 pm »
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
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [CRASH]Creer un tableau de sfConvexShape*
« Réponse #3 le: Septembre 04, 2012, 05:01:45 pm »
Tu as bien tout viré ? Et ensuite tu as bien recompiler SFML et CSFML ?
Laurent Gomila - SFML developer

mscofield

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [CRASH]Creer un tableau de sfConvexShape*
« Réponse #4 le: Septembre 04, 2012, 05:15:57 pm »
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 ?
« Modifié: Septembre 04, 2012, 05:17:30 pm par mscofield »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [CRASH]Creer un tableau de sfConvexShape*
« Réponse #5 le: Septembre 04, 2012, 08:03:55 pm »
Citer
Le plus simple serait de voir si tu arrives a reproduire le bug ?
Complètement :D
J'ai pas trop le temps mais j'essayerai de tester ça quand même. Le souci c'est que j'ai pas vraiment d'environnement de test pour CSFML, donc ça va me prendre un peu plus de temps que d'habitude.
Laurent Gomila - SFML developer