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. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut SIGSEGV au moment d'un return d'une variable globale (sans pointeur)
    bonjour,
    je voudrais connaitre la distance entre deux objets. j'ai donc fait une classe distance qui reçoit en parametre un point3D(il ignore la position y) et un point2D et il revoie un float point 2D et point 3D sont identiques a une coordonée près.
    point2D.cpp :
    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
    #include "point2D.h"
     
    point2D::point2D(float a_X, float a_Z) : X(a_X), Z(a_Z)
    {
    }
    bool operator==(point2D point1, point2D point2)
    {
        if (point1.X == point2.X && point1.Z == point2.Z)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    void point2D::operator=(point2D point)
    {
        X = point.X;
        Z = point.Z;
    }
    point2D operator+=(point2D point1, point2D point2)
    {
        point2D point3;
        point3.X=(point1.X+=point2.X);
        point3.Z=(point1.Z+=point2.Z);
        return point3;
    }
    et le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef POINT2D_H
    #define POINT2D_H
     
    class point2D
    {
    public:
        void operator=(point2D point);
        point2D(float a_X = 0, float a_Z = 0);
        float X;
        float Z;
    };
     
    #endif // POINT2D_H
    j'ai donc un de mes deux objets qui a une variable globale m_pos
    (dans le .h en private)
    et une de ses fonctions est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    point2D objet::getPos()
    {
         return m_pos;
    }
    j'ai une boucle dans laquelle getPos() est utilisé.
    quand je lance mon programme (avec debogeur) il marche puis au bout d'un certain nombre de tour de boucle il plante et je reçois un signal SIGSEGV segmentation fault.
    je n'utilise aucun pointeur et cette partie du code n'utilise aucun tableau je ne vois pas ce qui pourrait causer ça.
    quelqu'un pourrait m'aider ?
    merci

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 851
    Points : 2 293
    Points
    2 293
    Par défaut
    Avec les float, on evite de faire des comparaisons ==. T'as pas un tableau declare en dur quelque part ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    si (float m_array[16][256][16]) mais il n'est pas utilisé par getPos()

  4. #4
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 851
    Points : 2 293
    Points
    2 293
    Par défaut
    Je pense que tu fais une lecture/ecriture dans de la memoire qui ne t'appartiens pas. Lance ton executable avec valgrind pour confirmer cette hypothese.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    oui c'est le principe d'un sigsegv mais où et comment le corriger ?
    je vais aller voir valgrind

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    je n'ai pas l'impression que valgrind soit disponible pour windows mais peut-etre que je sais pas chercher si sa existe tu peut m'envoyer un lien ?

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Dans ce cas, on utilisera Dr Memory.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je ne vois rien dans le code que tu as montré qui puisse produire ce problème. Il doit donc être ailleurs... Pourrais tu poster un bout de code complet, compilable, mais minimaliste (et de préférence monofichier, c'est plus simple pour nous), qui reproduise cette situation ? Déjà, il y a des chance qu'en faisant cet effort, tu trouves toi-même le soucis (genre, tu enlèves telle autre partie du code, a priori sans rapport, et ça ne plante plus), mais sinon, ça nous permettra de le regarder de plus près.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    j'aurais du mal a tout mettre dans un seul fichier donc je vais essayer d'en envoyer le minimum
    je veut essayer de faire une sorte de minecraft (là c'est le moment où vous rigolez)
    la map est générée aléatoirement par chunks (carrés de 16x256x16 blocs) qui se chargent ou se décharge en fonction de leur distance parrapport au joueur.
    c'est chunkmanager qui gère le chargement ou déchargement de chunk
    chunkmanager.cpp :
    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
    #include "chunkmanager.h"
    #include "chunk.h"
    #include <string>
    #include <distance.h>
    #include <cmath>
    #include <fstream>
    #include "config.h"
    #include <iostream>
    #include <time.h>
    chunkmanager::chunkmanager()
    {
        m_config.chunksRange = 16; //pour l'instant m_config est un objet qui ne contient qu'une variable
                                               // mais devrais devenir une sorte de conteneur spécial
    }
    std::list<chunk> chunkmanager::manage(Player player, std::list<chunk> &list)
    {
        m_chunkArray = list; //m_chunkArray est une list d'objets chunks
        for(std::list<chunk>::iterator it = m_chunkArray.begin(); it != m_chunkArray.end();++it){
            // si le chunk est trop loin
            if(floor(distance::getDistance32((player.getPos()).divide(16), it->getPos())) > (m_config.chunksRange-1))
            {
                std::string file("C:\\Users\\Asus\\AppData\\Roaming\\.Programme\\save\\world\\chunks\\");
                file += it->getPos().X;
                file += "-";
                file += it->getPos().Z;
                file += ".txt";
                it->save(file); //on sauvegarde
                m_chunkArray.erase(it);
            }
        }
        for(int x((-m_config.chunksRange)+1); x < m_config.chunksRange-1;++x){
            for(int z((-m_config.chunksRange)+1); z < m_config.chunksRange-1;++z){ //carré au tour du joueur où tous les chunks doivent etre chargés
                std::string file("C:\\Users\\Asus\\AppData\\Roaming\\.Programme\\save\\world\\chunks\\");
                file += x;
                file += "-";
                file += z;
                file += ".txt";
                point2D point(x, z);
                chunk c(point, file);//on créé un nouveau chunk
                m_chunkArray.push_back(c);//on le place dans la liste des chunks
            }
        }
        return m_chunkArray;
    }
    je n'ai pas encore fait ce qui permettra de ne charger un chunk que si il ne l'est pas déjà le bug viens peut-etre de là

    chunk.cpp
    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
    86
    87
    88
    89
    90
    91
    92
    93
    #include "chunk.h"
    #include <iostream>
    #include <fstream>
    #include <cmath>
    #include <time.h>
    #include <iostream>
    #include "calque.h"
    #include <generator.h>
    #include <calque.h>
    chunk::chunk(point2D const& coords, std::string file) : m_pos(coords)
    {
        srand(time(0));
        if(!load(file)) //si il n'y a pas de fichier a charger on génère le chunk
            generate();//génération
    }
    chunk::~chunk()
    {
    }
    bool chunk::load(std::string const& file)//pour charger
    {
        std::ifstream flux(file.c_str());
        bool succes;
        if (flux)
        {
            for(int X(0); X<15; ++X)
            {
                for (int Y(0); Y<255; ++Y)
                {
                    for (int Z(0); Z<15; ++Z)
                    {
                        flux >> m_array[X][Y][Z];
                    }
                }
            }
            succes = true;//permet de savoir si le chargement a marché (pour le test plus haut)
            loaded = true;//pour savoir si le chunk est chargé
        }
        else
        {
            succes = false;
            loaded = false;
        }
        return succes;
    }
    void chunk::save(std::string file)//pour sauvegarder
    {
        std::ofstream flux(file.c_str());
        for(int X(0); X<15; ++X)
        {
            for (int Y(0); Y<255; ++Y)
            {
                for (int Z(0); Z<15; ++Z)
                {
                    flux << (m_array[X][Y][Z]) << std::endl;
                }
            }
        }
    }
     
    void chunk::generate(int seed, int octaves, int frequence, float persistance, int lissage)//génération
    {
        srand(seed);
        // création de calque
        Calque calque(0);
        generator surface(frequence, octaves, persistance, lissage, calque, seed);
        surface.generer_calque();
        for(int x(0); x<16; ++x){
            for(int z(0); z<16; ++z){
                int y = calque(x, z);
                m_array[x][y][z] = 3;}
        }
        std::cout << "chunk genere" << std::endl;
        loaded = true;
    }
    point2D chunk::getPos() //getpos la fonction problematique
    {
        return m_pos;
    }
    void chunk::operator=(bool const& value)//les operateurs ils concernent loaded seulement
    {
        loaded = value;
    }
    bool chunk::operator==(bool const& value)
    {
        if(loaded == value)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    j’espère que c'est assez clair
    en attendant je vais aller voir du coté de dr memory (merci littlewhite)
    edit : j'arrive pas a l'utilisr :/ le deboggeur par defaut de Qt creator ne suffit pas ?

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est pour ça que je ne demandais pas tout le code, mais juste un extrait du code suffisant pour reproduire le problème... Mais je suis d'accord que ça ne s'obtient pas en 5 minutes...

    Sinon, dans ton nouveau code que tu montres, je vois pas mal d'inélégances, mais pas d'erreur manifeste (sauf peut-être sur les 15/16). Mais tu montres peu...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    des inélégance ? peut-tu me les indiquer ou au moins les pires pour que je les corriges
    qu'est-ce qui pourrait provoquer une erreur a la ligne 15 ?

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    15 et 16 représentaient non pas des numéros de ligne, mais des valeurs numériques dans ton programme. Et le fait qu'il y ait des valeurs différentes est toujours étrange (mais peut-être justifié).

    Quelques soucis en vrac :
    - Des valeurs numériques justement, à remplacer par des constantes expliquant à quoi elles servent
    - Un operator= ou == qui ne traite qu'une partie de la classe
    - if (a) return true; else return false; à remplacer par return a;
    - Beaucoup trop de srand qui baissent la qualité des nombres aléatoires générés. Normalement, un srand, il y en a un et un seul au début du programme (et en C++11, il n'y en a pas : on utilise <random>)
    - Des constructeurs de copies explicites alors que la version du compilateur aurait fait pareil en mieux (dans tes exemples précédents)
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    oui en effet pour le 16 il doit etre remplacé par un 15
    les srand c'est parce que j'ai besoin d'un random completement aleatoire et d'un autre avec un seed
    pour les constructeurs je n'ai jamais appris ce que c'était explicite comment je peut l'améliorer ?

  14. #14
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Et est-ce qu'en remplaçant 16 par 15, le problème disparaît ?

    Pour l'affectation (désolé, j'ai dit constructeur de copie par erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void point2D::operator=(point2D point)
    {
        X = point.X;
        Z = point.Z;
    }
    Ne fait rien d'autre que ce que le compilateur génèrerait par défaut si tu ne mentionnais pas d'opérateur d'affectation. Vire le et laisse le compilateur faire ce genre de boulot lui même. http://cpp.developpez.com/faq/cpp/?p...-d-affectation
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    ha je savais pas que le compilateur le faisait merci
    sinon j'arrive pas a tester a cause d'un bug avec les erase :
    erreur : no matching function for call to 'std::list<point2D>::erase(point2D&)'
    coordsList.erase(m_point);
    ^
    (la fleche est sous le m_point mais elle bug)
    edit : c'est bon je viens de me rappeler qu'il lui fallait un iterateur et pas un "point"
    j'ai aussi un espece de drapeau bleu bizarre a coté d'une ligne (je suis sur Qt creator)

  16. #16
    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
    Bonjour , à part le problème cité auparavant (15/16)
    Il y a une fonction qui m'intrigue
    En effet dans le fichier chunk.cpp à partir de la ligne 67
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    
    for(int x(0); x<16; ++x){
            for(int z(0); z<16; ++z){
                int y = calque(x, z); // ici , si calque retourne une valeur trop grande (ie > 255 )segfault assuré
                m_array[x][y][z] = 3;}
    }
    En tout cas c'est le seul endroit d'où pourrait venir le segfault
    Il suffirait de faire un test et d'afficher un erreur si calque retourne une valeur supérieur à 255
    Si l'erreur ne viens pas de la il serrait préférable d'avoir un code complet pour compiler et tester

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    enfaite je pense savoir ce qui ne vas pas : m_pos ne devais pas etre initialisé ou initialisé avec une autre variable qui ne l'était pas je pense que maintenant sa devrais marcher si je trouve une solution a un dernier problème : j'utilise des iterateurs sur des listes vides mais il y a dans les boucles des iterateurs des choses qui permettent de les remplir mais comme les listes sont vide le programme ne lis pas ce qu'il y a a l'interieur donc il ne fait rien.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    je vois rien a part créer une sorte de fausse variables (chunk et poiny2D) temporaires pour parcourir les boucles une fois au moins puis les effacer dans la boucle mais je pense que ce n'est pas la meilleure des solutions
    d'autres idées ? (peut être pas a 23h20)

  19. #19
    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
    Mais il y a un truc que je ne comprend pas, pourquoi m_pos est une variable globale ?
    Pourrais tu mettre tous tes headers utilisés ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 183
    Points : 60
    Points
    60
    Par défaut
    m_pos est la position du chunk (en X et Z)
    headers :
    chunk.h
    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
    #ifndef CHUNK_H
    #define CHUNK_H
    #include <fstream>
    #include "point2D.h"
    #include <cstdio>
    #include <cstdlib>
    class chunk
    {
    public:
        chunk(const point2D &coords, std::string file);
        ~chunk();
        bool load(const std::string &file); //charge un chunk
        void save(std::string file); //sauvgarde un chunk
        void generate(int seed = rand(), int octaves = 3, int frequence = 1, float persistence = 0.3, int lissage = 2); //génere un chunk
        point2D getPos(); //renvoi un point qui contient la position du chunk
    private:
        float m_array[16][256][16]; //les blocs
        point2D m_pos; //la position du chunk
    };
     
    #endif // CHUNK_H
    chunkmanager.h
    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
    #ifndef CHUNMANAGER_H
    #define CHUNMANAGER_H
    #include "chunk.h"
    #include <list>
    #include "distance.h"
    #include "player.h"
    #include "config.h"
    #include <vector>
    #include <point2D.h>
    class chunkmanager
    {
    public:
        chunkmanager();
        std::list<chunk> manage(Player player, std::list<chunk> &list);
    private:
        std::list<chunk> m_chunkArray;
        config m_config;
        std::list<point2D> coordsList;
        point2D m_point;
    };
    j'ai un peu modifié le cpp de chunkmanager :
    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
    #include "chunkmanager.h"
    #include "chunk.h"
    #include <string>
    #include <distance.h>
    #include <cmath>
    #include <fstream>
    #include "config.h"
    #include <iostream>
    #include <time.h>
    chunkmanager::chunkmanager()
    {
        m_config.chunksRange = 16;
    }
    std::list<chunk> chunkmanager::manage(Player player, std::list<chunk> &list)
    {
        m_chunkArray = list;
        std::cout << "1" << std::endl;
        for(std::list<chunk>::iterator it = m_chunkArray.begin(); it != m_chunkArray.end();++it){
            // si le chunk est trop loin
            m_point = it->getPos();
            std::cout << "distance" << floor(distance::getDistance32((player.getPos()).divide(16), it->getPos())) <<std::endl;
            if(floor(distance::getDistance32((player.getPos()).divide(16), it->getPos())) > (m_config.chunksRange-1))
            {
                std::string file("C:\\Users\\Asus\\AppData\\Roaming\\.Programme\\save\\world\\chunks\\");
                file += m_point.X;
                file += "-";
                file += m_point.Z;
                file += ".txt";
                it->save(file);
                m_chunkArray.erase(it);
                std::cout << "delete" << std::endl;
            }
            else
            {
                coordsList.push_back(m_point);
            }
        }
        std::cout << "2" << std::endl;
        for(int x((-m_config.chunksRange)+1); x < m_config.chunksRange-1;++x){
            for(int z((-m_config.chunksRange)+1); z < m_config.chunksRange-1;++z){
                for(std::list<point2D>::iterator it = coordsList.begin(); it != coordsList.end(); ++it)
                {
                    if(m_point.X != x || m_point.Z != z )
                    {
                        std::string file("C:\\Users\\Asus\\AppData\\Roaming\\.Programme\\save\\world\\chunks\\");
                        file += x;
                        file += "-";
                        file += z;
                        file += ".txt";
                        point2D point(x, z);
                        chunk c(point, file);
                        m_chunkArray.push_back(c);
                        std::cout << "new chunk" << std::endl;
                        if(floor(distance::getDistance32((player.getPos()).divide(16), it->X)) > (m_config.chunksRange-1))
                        {
                            coordsList.erase(it);
                        }
                    }
                }
            }
        }
        return m_chunkArray;
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 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