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 :

taille d'un tableau 2d trop grande ?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut taille d'un tableau 2d trop grande ?
    Bonjour,
    je travaille sur un projet en infographie sur le lancé de rayons (Ray Trace). Sans rentrer dans les détails, voici le problème que j'ai:

    J'ai une classe CPixel qui a 5 int comme attributs (x,y,r,g,b) qui sont les coordonnées et la couleur du pixel.

    J'ai un tableau de CPixels à deux dimensions représentant l'ecran. Le problème est que dès que le tableau devient trop grand, il y a une erreur à l'exécution du programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unhandled exception at 0x00406125 in RayTraceVisual.exe: 0xC00000FD: Stack overflow.

    voici un code simplifié qui montre le problème:


    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
     
     
    #include <cstdlib>
    #include <iostream>
    using namespace std;
     
    class CPixel
    {
    private:
    	int r, g, b;
    	// coordonnées dans le repere
    	int x,y;
    };
     
     
    int main()
    {
        cout << sizeof(CPixel) << endl;
        CPixel grille[640][200];
        cout << sizeof(grille) << endl;
     
        system("PAUSE");
        return(0);    
    }
    Si je change la taille du tableau à [200][200], il n'y a plus d'erreur. Tout ça est bizarre car la taille d'une instance de classe CPixel est de 20 octets. Un tableau de 640*200*20 = 2 560 000 octets ne devrait pas poser de problèmes, si ?

    J'ai 512 Mo de ram.

    merci pour votre aide.

  2. #2
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Alors ça doit être l'allocation statique qui plante...

    Essaie avec un new...

    PS: pour les pros, l'allocation statique dépend du type de compilo ? OS ? Rien à voir ??

    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    Je pense ke l'utilisation de vector pourrai t'aider.

    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
    #include <cstdlib>
    #include <iostream>
    [b]#include <vector>[/b]
    using namespace std;
     
    class CPixel
    {
    private:
       int r, g, b;
       // coordonnées dans le repere
       int x,y;
    };
     
     
    int main()
    {
        cout << sizeof(CPixel) << endl;
        vector<CPixel> colonne;
        vector<colone> grille;
        cout << sizeof(grille) << endl;
     
        system("PAUSE");
        return(0);   
    }
    et en faisant grille[i][j] = CPixel ca devrait te remplir la bonne case.

    Je n'ai aps testé mais je pense que ca devrai marcher.

  4. #4
    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
    Le problème vient sûrement du fait que tu alloues ton tableau sur la pile.
    Si tu l'alloues sur le tas, tu ne devrais plus avoir de soucis.
    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
    class CPixel
    {
    private:
       int r, g, b;
       // coordonnées dans le repere
       int x,y;
    };
     
     
    int main()
    {
        cout << sizeof(CPixel) << endl;
        CPixel * grille = new CPixel[640*200];
        cout << sizeof(grille) << endl;
     
     
        system("PAUSE");
        delete [] grille;
        return(0);   
    }
    Je trouve que ce design est néanmoins particulier. Si tu crée un tableau à 2 dimensions pour stocker tes pixels, quel besoin a tu de stocker pour chaque case du tableau son abscisse et son ordonnée ?

    EDIT: Corrigé l'allocation du tableau, cf dessous.

  5. #5
    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
    Citation Envoyé par mathieu_t
    PS: pour les pros, l'allocation statique dépend du type de compilo ? OS ? Rien à voir ??
    Il n'y a pas à ma connaissance de concensus sur la taille que doit avoir la pile à l'éxecution.

  6. #6
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    Pour moi, la grille représente l'écran de projection sur lequel se projette la scene. Cet écran a une position dans l'espace et donc je pense que je dois calculer les coordonnées de chaque pixel.
    ex:
    si j'ai un écran de 8*8 pixel en position (0,0,5) dans l'espace les coordonnées des pixels vont de -4 à 4 en x et y. (z étant constant). Je calcule ces coordonnées de chaque pixel pour pouvoir "lancer" un rayon partant du point où se situe l'observateur et passant par chaque pixel de l'écran et calculer les intersections entre ce rayon et les objets ...

    Bref, je ne vais pas trop m'embarquer car ce n'est pas le sujet du topic.

    C'est vrai que je n'ai pas vraiment besoin de stocker ces coordonnées. Je pourrais les calcules à chaque fois que j'en ai besoin. Ceci dit j'ai besoin des variables R B G pour chaque pixel. Même si je stock que ces 3 entiers, le probleme se pose également.



    Citation Envoyé par VoidSeer
    Le problème vient sûrement du fait que tu alloues ton tableau sur la pile.
    Si tu l'alloues sur le tas, tu ne devrais plus avoir de soucis.
    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
    class CPixel
    {
    private:
       int r, g, b;
       // coordonnées dans le repere
       int x,y;
    };
     
     
    int main()
    {
        cout << sizeof(CPixel) << endl;
        CPixel * grille = new grille[640*200];
        cout << sizeof(grille) << endl;
     
     
        system("PAUSE");
        delete [] grille;
        return(0);   
    }
    Je trouve que ce design est néanmoins particulier. Si tu crée un tableau à 2 dimensions pour stocker tes pixels, quel besoin a tu de stocker pour chaque case du tableau son abscisse et son ordonnée ?

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par mathieu_t
    Alors ça doit être l'allocation statique qui plante...

    Essaie avec un new...

    PS: pour les pros, l'allocation statique dépend du type de compilo ? OS ? Rien à voir ??

    A+
    Il n'y a pas d'allocation statique dans l'exemple, mais de l'allocation automatique (ie "dans lla pile"). L'espace disponible dans la pile est generalement limite. Suivant les OS, on peut le modifier (ulimit -s sous Unix, une option dans l'editeur de lien sous Dos, je suppose que Windows a sa methode), mais ce n'est pas particulierement une bonne idee. Il vaut mieux en effet faire de l'allocation dynamique ou a la rigueur statique (ie une variable globale a visibilite plus ou moins limitee si on utilise static) si la duree de vie correspond.

  8. #8
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
        CPixel * grille = new grille[640*200];
     
        delete [] grille;
     
    }
    ... je ne suis pas sur de comprendre la syntaxe ...

  9. #9
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Citation Envoyé par mathieu_t
    Alors ça doit être l'allocation statique qui plante...

    Essaie avec un new...

    PS: pour les pros, l'allocation statique dépend du type de compilo ? OS ? Rien à voir ??

    A+
    Il n'y a pas d'allocation statique dans l'exemple, mais de l'allocation automatique (ie "dans lla pile"). L'espace disponible dans la pile est generalement limite. Suivant les OS, on peut le modifier (ulimit -s sous Unix, une option dans l'editeur de lien sous Dos, je suppose que Windows a sa methode), mais ce n'est pas particulierement une bonne idee. Il vaut mieux en effet faire de l'allocation dynamique ou a la rigueur statique (ie une variable globale a visibilite plus ou moins limitee si on utilise static) si la duree de vie correspond.
    C'est noté... merci

  10. #10
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    Citation Envoyé par Tex-Twil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
        CPixel * grille = new grille[640*200];
     
        delete [] grille;
     
    }
    ... je ne suis pas sur de comprendre la syntaxe ...
    Ca ne serait pas plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
        CPixel * grille = new CPixel [640*200];
     
        delete [] grille;
     
    }
    mais comment je fais pour accéder à un element i j ?

  11. #11
    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
    Au temps pour moi, tu as corrigé de toi-même.
    L'élément [i,j] correspond à grille[j*640 + i]

  12. #12
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut [RESOLU]taille d'un tableau 2d trop grande ?
    ok, merci beaucoup à tout le monde. Cela a résolu mon problème et m'a permi de découvrir un truc en plus

    je me coucherai moins con ce soir, coool

Discussions similaires

  1. taille tableau trop grande
    Par zhao dans le forum C++
    Réponses: 12
    Dernier message: 26/03/2008, 15h59
  2. [xml][asp_vbscript] Taille de fichier XML trop grande...
    Par nicko5959 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 06/03/2006, 11h50
  3. Taille de clé (PK) trop grande
    Par AlexB59 dans le forum Débuter
    Réponses: 8
    Dernier message: 04/10/2005, 17h06
  4. Taille d'archive trop grande
    Par mick84m dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 12/05/2005, 16h39
  5. tableau trop grand ?
    Par Praxe dans le forum C++
    Réponses: 17
    Dernier message: 17/03/2005, 14h14

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