IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

SIGSEGV au moment d'un return d'une variable globale (sans pointeur)


Sujet :

C++

  1. #21
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Bon pour m_pos sans le code de chunk.cpp ça va être dur de voir s'il a bien été initialisé, par contre pour cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    std::list<chunk> chunkmanager::manage(Player player, std::list<chunk> &list) // le paramètre list est juste un paramètre résultat ? Ou c'est un paramètre donnée et donc devrait être const
    {
        m_chunkArray = list; // ceci suggère que tu copie list --> tu n'as pas pour vocation de modifier list 
        std::cout << "1" << std::endl;
        for(std::list<chunk>::iterator it = m_chunkArray.begin(); it != m_chunkArray.end();++it){ // ...
    Je me pose la question suivante : pour appeler chunkmanager::manage il faut avoir une liste non vide on est bien d'accord ?
    Par contre si on lui envoie une liste vide je doute que ça va marcher.
    Un conseil que je te donne est de mettre le plus souvent possible les pré-condition et post-condition de tes fonctions.
    Comme ça ce sera plus aisé de voir qu'es-ce qui ne vas pas lors de l'appel de ta fonction

  2. #22
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    enfaite chunkmanager est une série de tests pour voir si les chunks chargés doivent être déchargés et inversement.
    list est la liste des chunks chargés on copie au début la liste de l'ancien test pour voir si elle est correcte ou si il faut ajouter/retirer des chunks.
    elle est vide au premier test mais ça ne pose pas de problème (du moins je crois)

  3. #23
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Ok , si j'ai bien compris, tu fais une copie de list dans m_chunkArray pour modifier la copie et ensuite la retourner à la fin du traitement , ma question est de savoir s'il ne serait pas plus judicieux de modifier directement list ? (c'est surtout le passage par référence qui me le suggère)
    Pour le cas où la liste est vide , il suffirait juste de faire un test et donc de charger les chunk

    PS: @Winjerome : je n'avais nullement l'intention de colorer le code manuellement , j'ai juste copier coller le code sur le forum (je suppose que les infos de couleurs ont aussi été copiées)

  4. #24
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    oui c'est ce que je voulais faire au début (d'où le passage par référence) mais pour une raison obscure que j'ignore moi même j'ai fais autre chose plus moche et je viens de m'en rendre compte merci.

  5. #25
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Ok , mais du coup avec toutes les modifications , le problème de SIGSEGV est-il toujours présent ? J'ai cru comprendre que tu utilises Qt , es-ce juste pour l'affichage ou tu l'utilise dans tes classes pour la gestion des signaux et slot ?
    Autre question , ton objectif étant de faire un minecraft-like( si j'ai bien suivi), tu compte utiliser ton propre moteur 3D (avec quelle API ?) ou tu compte utiliser un moteur existant ?

  6. #26
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    oui je pense utiliser mon propre moteur 3D pour et pour ce qui est de l'API je pense faire un truc assez basique avec par exemple ajouter un objet, un cube, un vehicule, une entitée... ce seras plus limité que minecraft mais je ne sais pas trop comment faire autrement sinon pour le sigsegv, j'ai actuellement d'autres problemes donc je ne sais pas pour l'instant

  7. #27
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Quand je parlais d'API je sous entendais Direct3D ou OpenGL ( j'aurais dû être plus précis xD), à la limite pour le sigsegv , tu devrais peut être repartir sur une nouvelle base , et remettre petit à petit tes différents "module"/"fonctionnalité".Pour la gestion de ta scene il serait astucieux d'organiser tes données dans des graphes ou arbre "générique" (ie arbre à nombre de fils variable). Je réagis aussi à un autre sujet que tu as posté sur la génération de terrain 3D, mon idée est la suivante : tu génère d'abord un terrain plat , ensuite tu le sépare en 4 et fais un rand pour savoir de quel type seront chacun des 4 parties , ensuite tu l'appliques avec les hauteurs pour le relief. L'idée viens de l'octree de ta map , pour que tu ais une cohérence de décors , il faudrat juste définir la taille du cube minimum où tout l'espace doit être "cohérents" . Ce n'est qu'un début "d'algorithme" , en effet ceci n'est que la première "passe" , puisqu'il faudrat ensuite "lisser" les bords de chaque cube de l'espace (si tu vois ce que je veux dire).
    En espérant t'avoir donné de bonnes idées

  8. #28
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    pour la 3D j’utiliserais OpenGL. sa fait au moins 4 fois que je recommence ma classe de façon différente et j'ai toujours eu ce problème de sigsegv. pour la génération j'ai pas compris grand chose mais normalement l'algorithme que j'ai déjà marche mais a chaque variation de hauteur l'écart est d'au moins 3 blocs je me demandais comment régler ça.

  9. #29
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas normal de se traîner ce bug là. Un SIGSEV n'est pas un simple warning, on ne peut pas le négliger.

    Ce que je te conseille quand tu ne sais vraiment pas d'où vient l'erreur, c'est de commenter le contenu de TOUTES tes fonctions (quitte à renvoyer une valeur par défaut dans le cas où la fonction demande une valeur de retour), un peu comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::string doSomething(arg1, arg2, ...)
    {
        //std::string result;
        //result = do1();
        //result += do2();
        //return result;
     
        return ""; // ajout pour debug.
    }
    Après ça:
    1) tu lances le code. Go étape 2.
    2) Si pas d'erreur, décommenter une fonction, et repartir étape 1. Sinon, étape 3.
    3) La dernière fonction décommentée a entraîné un bug. Donc recommente toute cette fonction, et go étape 4.
    4) Lances le code. Go étape 5.
    5) Si pas d'erreur, décommente une petite partie de la fonction, et retourne étape 4. Sinon, go étape 6.
    6) Tu viens de trouver la ligne qui entraîne le bug. Vois d'où vient le problème et corrige.


    Cela peut être lourd quand le code est long et complexe, mais tu en sauras davantage sur ton bug.
    Dernière modification par Invité ; 06/05/2014 à 10h29.

  10. #30
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    merci je vais voir ça mais pour l'instant mon code est incomplet donc je ne peut pas le lancer il planterais avant j'ai 2-3 idées pour le corriger mais en ce moment je suis un peu en pose je préfère programmer en cours

  11. #31
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    j'ai corrigé ce que je pouvais mais ça ne marche toujours pas quand je le lance j'ai ça en sortie :
    Début du débogage
    Init SGL4 version:1.08.00.290036
    -1 -1
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\-1.-1.chunk
    -1 0
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\-1.0.chunk
    Invalid parameter passed to C runtime function.
    -1 1
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\-1.1.chunk
    Invalid parameter passed to C runtime function.
    0 -1
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\0.-1.chunk
    0 0
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\0.0.chunk
    0 1
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\0.1.chunk
    1 -1
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\1.-1.chunk
    1 0
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\1.0.chunk
    1 1
    Invalid parameter passed to C runtime function.
    chunk genere
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    new chunk C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\1.1.chunk
    distance 21
    C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\9.8.chunk
    Invalid parameter passed to C runtime function.
    distance 19
    C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\10.9.chunk
    Invalid parameter passed to C runtime function.
    distance 19
    C:\Users\Asus\AppData\Roaming\OpenGL\saves\chunks\10.9.chunk
    Invalid parameter passed to C runtime function.

  12. #32
    Invité
    Invité(e)
    Par défaut
    Et en mettant des crans d'arrêt tu saurais trouver à quelle ligne tu te chopes ce "Invalid parameter passed to C runtime function." ?

  13. #33
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    c'est bon j'ai corrigé ce bug je sais pas d'où il venait c'était assez aléatoire quand ça le faisait c'était pas toujours au même endroit pour un chiffre modifié sur une ligne ou une autre mais c'est réglé.
    le dernier bug (je pense) est un bug avec les listes, un iterateur parcourt une liste et en supprime les éléments si nécessaire mais en supprimant, ça fait varier la taille de la liste, décale des éléments et fait bugger l'iterateur et provoque le sigsegv ailleur (au même endroit qu'avant)
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #include "chunkmanager.h"
    #include "chunk.h"
    #include <string>
    #include <distance.h>
    #include <cmath>
    #include <fstream>
    #include "config.h"
    #include <iostream>
    #include <time.h>
    #include <string>
    std::string convertInt(int number)
    {
        std::string temp="";
        std::string returnvalue="";
        if (number == 0)
            return "0";
        if (number < 0){
            returnvalue += "-";
            number = -number;}
        while (number>0)
        {
            temp+=number%10+48;
            number/=10;
        }
        for (unsigned int i=0;i<temp.length();i++)
            returnvalue+=temp[temp.length()-i-1];
        return returnvalue;
    }
    chunkmanager::chunkmanager()
    {
        m_config.chunksRange = 2;
    }
    //----------------debut manage----------------//
    void chunkmanager::manage(Player player, std::list<chunk>& list)
    {
        for(int x(-m_config.chunksRange+1); x != m_config.chunksRange;++x)
        {
            for(int z(-m_config.chunksRange+1); z != m_config.chunksRange;++z)
            {
                //test chunk chargé
                bool loaded(false);
                for(std::list<chunk>::iterator it = list.begin(); it != list.end();++it)
                {
                    if(it->getPos().X == x+player.getPos().X && it->getPos().Z == z+player.getPos().Z)
                        loaded = true;
                }
                if(loaded == false)
                {
                    //chargement du chunk
                    std::string file("C:\\Users\\Administrateur\\AppData\\Roaming\\OpenGL\\saves\\chunks\\");
                    int X(x+player.getPos().divide(16).X);
                    int Z(z+player.getPos().divide(16).Z);
                    std::cout << X << " " << Z << std::endl;
                    file += convertInt(X);
                    file += ".";
                    file += convertInt(Z);
                    file += ".chunk";
                    point2D coords(X, Z);
                    chunk c(coords, file);
                    c.save();
                    list.push_back(c);
                    std::cout << "new chunk " << file << std::endl;
                }
            }
        }
            for(std::list<chunk>::iterator it = list.begin(); it != list.end();++it){
                point2D point = it->getPos();
                std::cout << "distance " << distance::getDistance32((player.getPos()).divide(16), it->getPos()) <<std::endl;
                //si le chunk est trop loin
                if(distance::getDistance32((player.getPos()).divide(16), it->getPos()) > (m_config.chunksRange))
                {
                    //----sauvegarde et supression de la liste----//
                    std::string file("C:\\Users\\Administrateur\\AppData\\Roaming\\OpenGL\\saves\\chunks\\");
                    file += convertInt(point.X);
                    file += ".";
                    file += convertInt(point.Z);
                    file += ".chunk";
                    std::cout << "delete " << file << std::endl;
                    it->save();
                    list.erase(it);
                    //--------------------------------------------//
                }
            }
        }
        //---------------------------------------------//

  14. #34
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    Si tu lis la doc de std::list::erase (et de la plupart/tous les erase (sauf map dans une version pré-C++11)), il retourne l'itérateur valide suivant.
    Y'a même tous les exempels.

  15. #35
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    yes ! ça marche ! tous les chunks se génènèrent, chargent ou décharent correctement merci a tous

  16. #36
    Invité
    Invité(e)
    Par défaut
    En passant:

    tu peux remplacer ta fonction "std::string convertInt(int number)" en utilisant un simple ostringstream.


    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <sstream> // std::ostringstream
    #include <string> // std::string
    int a = 125;
    std::ostringstream ss;
    ss << a;
    std::string str = ss.str(); // str = "125"

    en C++0X tu peux même faire un simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string s = std::to_string(125); // s = "125"

  17. #37
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    merci mais to_string ne marche pas chez moi donc je vais garder ma fonction converInt
    sinon quelqu'un connais l’équivalent Qt de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
        SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

  18. #38
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    C'est pas glGet ?

  19. #39
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    et pour les SDL_GL_DOUBLEBUFFER Et SDL_GL_DEPTH_SIZE

  20. #40
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    Et si tu scrollais un peu la page que je viens de donner...?

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Recupérer la valeur d'un return dans une variable
    Par paragoge dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 26/10/2009, 12h15
  2. Réponses: 5
    Dernier message: 25/05/2005, 23h29
  3. Comment déclarer une variable globale
    Par davkick dans le forum C
    Réponses: 13
    Dernier message: 20/05/2005, 19h50
  4. [servlet][bean] return d'une variable
    Par LoLoSS dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/05/2004, 17h59
  5. utilisation d'une variable globale
    Par ZZ dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2003, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo