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 :

[C/C++] petit problème de tableau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Par défaut [C/C++] petit problème de tableau
    salut,
    je suis en train de creer un prog en c/c++ et j'ai un problemme au niveau de l'execution. je ne vous explique pas le but du projet ni la signification des variables c'est trop long...
    je vous montre mon code, ce n'est que le debut du projet:
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
    struct Couleur
    {
        int r,g,b;
        SDL_Surface *rectangle;
    };
     
    struct Pixel
    {
        int no_couleur;
        int est_physique;
    };
     
    int main(int argc, char *argv[])
    {
        //initialisation du tableau de couleurs
        Couleur couleurs[100];
        for(int i=0;i<100;i++){
                couleurs[i].r=-1;
                couleurs[i].g=-1;
                couleurs[i].b=-1;
                couleurs[i].rectangle=NULL;
        }
     
        //initialisation du tableau de pixels ( le problemme est ici!!! )
        Pixel pixels[800][600];
        for(int i=0;i<800;i++){
                for(int j=0;j<600;j++){
                        (pixels[i][j]).no_couleur=-1;
                        (pixels[i][j]).est_physique=0;
                }
        }
     
        //ecriture dans un fichier pour tester si les valeurs ont été bien ecrite ( c'est juste un test ça ne restera pas )
        FILE* fichier = NULL;
        fichier = fopen("testvar.txt", "w");
        for(int i=0;i<800;i++){
                for(int j=0;j<60;j++){
                        fprintf(fichier,"%d,%d\n",(pixels[i][j]).no_couleur,(pixels[i][j]).est_physique);
                }
        }
        fclose(fichier);
     
    }
    le problemme est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        //initialisation du tableau de pixels
        Pixel pixels[800][600];
        for(int i=0;i<800;i++){
                for(int j=0;j<600;j++){
                        (pixels[i][j]).no_couleur=-1;
                        (pixels[i][j]).est_physique=0;
                }
        }
    je creer un tableau de pixels de 800 par 600. tout compile parfaitement mais au moment de l'execution, ça plante!
    j'ai testé avec un tableau de pixels de 800 par 60 et la ça ne plante plus!
    j'ai aussi testé avec un tableau d'entier de 800 par 600 et pareil ça ne plante plus.

    je cherche a savoir pourquoi ça plante, p-e un problemme de memoire? de taille du tableau?

    merci de vos reponses

  2. #2
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 29
    Par défaut
    Je ne suis pas sûr mais tu as déclaré statiquement un tableau de 800*600 contenant une structure.

    As tu essayé d'allouer dynamiquement ton tableau de pixels ?

    De plus je te conseille de mettre des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define WIDTH_SIZE 800
    #define HEIGHT_SIZE 600
    C'est plus facile pour changer ses valeurs par la suite plutot que de tout réécrire dans le code !

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Pas de #define pour des constantes en C++. C'est villain et inutile.

    En revanche, pour ce qui est de la cause première je pense qu'effectivement allouer 800x600 élément sur la pile en est probablement la source.

  4. #4
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 29
    Par défaut
    Pas de #define mais il code en C/C++ car dans ce cas si il fait que du C++ je lui interdirait aussi les struct et lui conseillerais de faire des classes avec des constructeurs par défaut et de jolies données membres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Class Pixels
    {
        public:
        Pixels();
     
        int mGetNoCouleur();
        int mGetIsPhysical();
     
    private:
         int no_couleur;
         int est_physique;
    };
    Et je ferais une classe Ecran qui contiendrait des pixels ... 800*600 par exemple

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Par défaut
    effectivement, a terme j'utiliserai des classes, pour le moment j'utilise des struct car je ne maitrise pas encore tout le c++ ( comme les classes par exemples ), ce programme est juste un "brouillon" je n'ai pas besoin qu'il soit codé a la perfection, il servira surtout de base pour une autre partie du projet et sera refait.

    donc le problemme vien de la pile, new n'utilise pas la pile??

    si je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
        //initialisation du tableau de pixels
        Pixel *pixels = NULL;
        pixels = new Pixel[WIDTH_SIZE][HEIGHT_SIZE];
        for(int i=0;i<WIDTH_SIZE;i++){
                for(int j=0;j<HEIGHT_SIZE;j++){
                        (pixels[i][j]).no_couleur=-1;
                        (pixels[i][j]).est_physique=0;
                }
        }
    (il y a peut etre des erreur?)
    il commence a m'insulter:
    cannot convert `Pixel (*)[600]' to `Pixel*' in assignment
    no match for 'operator[]' in '*((+(((unsigned int)i) * 8u)) + pixels)[j]'
    ... ect

  6. #6
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 29
    Par défaut
    new est utilisé quand tu veux instancier une classe. Or Pixels est une structure, tu doit donc utiliser la fonction malloc().

    Déclare un Pixels** et regarde cela :http://www.developpez.net/forums/d28...sation-malloc/

  7. #7
    Membre éclairé Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Citation Envoyé par bebaijhi Voir le message
    (il y a peut etre des erreur?)
    il commence a m'insulter:
    cannot convert `Pixel (*)[600]' to `Pixel*' in assignment
    no match for 'operator[]' in '*((+(((unsigned int)i) * 8u)) + pixels)[j]'
    ... ect
    Tu dois utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Pixel (*pixels)[600] = new Pixel[800][600];
    et puis "pixels[i][j]" marchera.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Tu explose royalement ta pile. Par défaut, sous windows, je crois qu'elle est à 1MB et tu en demande 800x600x8=3 840 000!
    Solution pas propre: /STACK:4000000 comme option de link.
    Meilleur solution: new.

    Plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define WIDTH_SIZE 800
    #define HEIGHT_SIZE 600
    en C++, préférer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static const unsigned int g_uiWidth;
    static const unsigned int g_uiHeight;
    voire même encapsulé:
    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
     
    struct stTailleEcran
    {
    static const stTailleEcran g_TailleEcran;
     
    const unsigned int Width;
    const unsigned int Height;
     
    private:
    stTailleEcran()
    :Width(800),Height(600)
    {}
    stTailleEcran(const stTailleEcran&):Width(800),Height(600){}
     
    }; 
    const stTailleEcran stTailleEcran::g_TailleEcran;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] Un petit problème de caractères & tableau
    Par e-m.guillaume dans le forum Langage
    Réponses: 7
    Dernier message: 20/06/2011, 18h17
  2. Petit problème de désallocation de tableau 2D
    Par bertry dans le forum Débuter
    Réponses: 4
    Dernier message: 29/04/2011, 13h46
  3. Petit problème de tableau
    Par jpboogie dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 16/01/2009, 10h13
  4. [SDL]Petit problème avec un tableau de surfaces
    Par Jordinateur dans le forum SDL
    Réponses: 15
    Dernier message: 29/08/2007, 12h12
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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