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 :

[débutant]taille de tableau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 129
    Par défaut [débutant]taille de tableau
    Bonjour, tout d'abord, je préviens que je suis débutant en c++.

    Voilà mon 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
    const unsigned long PREC = 300000;
    const unsigned long PRECISION = PREC / 2;
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        unsigned long taille = PRECISION * 3.32;
        unsigned long reste[taille], pi=0, som=0, ret;
        char pi100 = 0;
        FILE * sortie;
    .........
    }
    En fait, mon problème est double et vient de unsigned long reste[taille].

    y-a-t-il une limite pour la taille des tableau ? est-ce max(int) ? max(unsigned int) ? max(long) ? autre chose ?

    en fait j'aimerai savoir pourquoi le programme fonctionne avec PREC = 313618 et plante avec 313619. car au final, PREC devra dépasser le million voire le milliard !!!

    y a-t-il un moyen d'y remédier ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    C'est peut-être un problème de mémoire.

    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned long reste[taille]
    , ça doit allouer "taille * 4" octets dans la mémoire, et ce de manière continue.

    Dans ton exemple, si PREC est égal à 313618, ça devra allouer 2082424 octets soit 2MO...
    Suffit qu'il n'y ai pas de "trou" dans la mémoire pour stocker 2Mo et ça marchera plus.

    Pour en etre sûr, fait un try/catch et récupère l'exception. Si c'est du OutOfMemory...

    Sinon défragmente la mémoire, ou redemarre le pc et voit si ça bloque toujours à 313619.

    Imagine PREC est égal à 1 milliard, il va te falloir 6,4 GO de mémoire rien que pour cette instruction.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 129
    Par défaut
    enfin bon, 2Mo de mémoire, c'est pas non plus énorme... (on parle bien de mémoire vive là ?)

    en utilisant un logiciel de gestion de mémoire tel que cacheman ou ramboost XP, vous pensez que ça devrait résoudre le problème ?

    moi j'avais bien pensé que c'étai un problème du genre, mais je me demandais si il ne fallait pas (comme en JAVA) spécifier au programme (compilateur ? éxécutable ? autre ?) la quantité de mémoire à allouer au programme

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Bah oui je sais, 2Mo c'est pas grand chose mais bon, entre 313618 et 313619, ni la valeur de taille, ni la quantité à allouer n'est ni un chiffre rond, ni un chiffre en puissance de 2, donc ça m'étonnerai que s'il y a une option pour définir ça, qu'elle soit définie entre (520605 et 520607) ou (2082420 et 2082428)

    Essaye voir un peu de nettoyer la mémoire et/ou de redemarrer et de retrouver la limite de PREC pour déclencher l'erreur.

    Ou plus simplement, tu englobes ton instruction dans un try/catch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
       unsigned long reste[taille];
    }
    catch(std::exception ex)
    {
     
    }
    et tu regardes dans le debugger ex.message (ou un truc similaire).

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    C'est normale,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned long reste[taille]
    va réserver taille*sizeof(long) dans la pile et non dans la memoire. Ce qui est énorme. Il faut que tu fasse une allocation dynamic (new/delete).
    Le mieux est d'utiliser std::vector


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector< unsigned long> reste(taille);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 129
    Par défaut
    en fait, si je n'ai pas utilisé de Vector (que je connais un peu) c'est que (à moins que je ne me trompe) l'intéret d'utiliser des tableaux est que le temps d'accès aux données est beaucoup plus rapide (à ce que je sais) (déjà qu'avec 300k, le programme mais 4h à s'exécuter.....)

    La solution serai-t-elle de créer un objet TABLEAU du style :

    class TABLEAU {

    public :
    unsigned long reste[taille]

    }

    et de l'appeller avec new TABLEAU ? puis TABLEAU.reste[50] ?

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par jpean.net Voir le message
    en fait, si je n'ai pas utilisé de Vector (que je connais un peu) c'est que (à moins que je ne me trompe) l'intéret d'utiliser des tableaux est que le temps d'accès aux données est beaucoup plus rapide (à ce que je sais) (déjà qu'avec 300k, le programme mais 4h à s'exécuter.....)

    La solution serai-t-elle de créer un objet TABLEAU du style :

    class TABLEAU {

    public :
    unsigned long reste[taille]

    }

    et de l'appeller avec new TABLEAU ? puis TABLEAU.reste[50] ?
    Les accés aux éléments de vector est aussi rapide que celle d'un tableau dynamic.

    Le problème est que tu veut utiliser un grand tableau.
    Cette ecriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned long reste[taille]
    est mauvais, car la place sur la pile est trés limité. Genre 2Mo pour un exe. En gros cette pile est l'endroit ou sont crée tes variable non dynamic.

    Pour de grand tableau, il y as deux methode:
    1- avec des new et delete et ou l'ongère la memoire "a la main"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned long* reste = new unsigned long[taille];
    .
    .
    .
    delete [] reste;
    2- avec vector ou la memoire est géré automatiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<unsigned long> reste(taille);
    Sachant que c'est 2 méthode sont aussi rapide en accés au données, faut mieux prendre des vector, car tu ne te prend plus la tête pour delete.

    Aprés pour la rapidité entre la mémoire de la pile et la mémoire du tas, je ne sais pas. Et franche je pense que c'est quasi identique.
    Si tu programme met 4h a s'exécute c'est peut être un problème d'algo. Est tu sûre de compiler avec des optimization?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Par curiosité, il fait quoi ton programme??

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

Discussions similaires

  1. [Débutant] Trier un tableau en 2 boucles
    Par SaladinDev dans le forum Assembleur
    Réponses: 9
    Dernier message: 07/05/2005, 22h38
  2. [débutant] taille d'un JScrollPane
    Par Benoit_Durand dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 07/04/2005, 10h15
  3. static const et taille de tableau
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 16h01
  4. [débutant] Taille d'un JSplitPane
    Par pingoui dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 31/08/2004, 18h59
  5. [Débutant][Taille BD]Meme vide elle fait 25 Mo
    Par exe dans le forum Débuter
    Réponses: 3
    Dernier message: 18/08/2003, 19h19

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