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++

  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??

  9. #9
    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 c'est un programme destinée à faire des calculs mathématiques sur des grands nombres (genre Pi) où les 12-13 décimales des doubles ne sont pas suffisantes.

    Euh optimi-quoi ?

    bon bref, je savais qu'il était possible de demander au compilateur de faire des optimisation de codes mais je n'ai aucune idée de la manière dont on s'y prend... un lien ou une méthode à proposer ?

  10. #10
    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 c'est un programme destinée à faire des calculs mathématiques sur des grands nombres (genre Pi) où les 12-13 décimales des doubles ne sont pas suffisantes.

    Euh optimi-quoi ?

    bon bref, je savais qu'il était possible de demander au compilateur de faire des optimisation de codes mais je n'ai aucune idée de la manière dont on s'y prend... un lien ou une méthode à proposer ?
    tu compile avec quoi?

  11. #11
    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
    Dev C++, mais si tu me dis que GCC ou un autre serait plus efficase, propose...

    (merci de m'aider...)

  12. #12
    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
    Calculer Pi... l'algo ne doit pas être monstrueux, tu peux poster ton code?

  13. #13
    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
    Dev C++, mais si tu me dis que GCC ou un autre serait plus efficase, propose...

    (merci de m'aider...)
    alors pour commencer,
    dev c++ <==> gcc


    Perso, je préfère code block (version en développement).
    Sinon faut que tu regarde dans les options de compilation et activé -O2

  14. #14
    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
    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
    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;
     
            new unsigned long reste[taille];
            unsigned long  pi=0, som=0, ret;
            char pi100 = 0;
     
            //initialisation des tableaux
            for (unsigned long i=0 ; i<taille ; i++) {
                reste[i] = 2;
            } ;
     
            for (unsigned long i=0 ; i<PRECISION ; i++) {
                ret = 0;
                for (unsigned long j=taille-1 ; j>0 ; j--) {
                    unsigned long b= 2* j + 1;
                    reste[j] = (som = (reste[j] = reste[j] * 100) + ret) % b;
                    ret = j * (som / b);
                } ;
     
                reste[0] = (som = (reste[0] = reste[0] * 100) + ret) % 100;
     
                pi = som / 100;
                printf("%c%c", (pi/10)+48, (pi%10)+48);
            }    
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    bien sur, j'ai pas encore testé avec les vector et les "new"

  15. #15
    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
    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
    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;
     
            new unsigned long reste[taille];
            unsigned long  pi=0, som=0, ret;
            char pi100 = 0;
     
            //initialisation des tableaux
            for (unsigned long i=0 ; i<taille ; i++) {
                reste[i] = 2;
            } ;
     
            for (unsigned long i=0 ; i<PRECISION ; i++) {
                ret = 0;
                for (unsigned long j=taille-1 ; j>0 ; j--) {
                    unsigned long b= 2* j + 1;
                    reste[j] = (som = (reste[j] = reste[j] * 100) + ret) % b;
                    ret = j * (som / b);
                } ;
     
                reste[0] = (som = (reste[0] = reste[0] * 100) + ret) % 100;
     
                pi = som / 100;
                printf("%c%c", (pi/10)+48, (pi%10)+48);
            }    
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    bien sur, j'ai pas encore testé avec les vector et les "new"
    ATTENTION
    unsigned long * reste = new unsigned long[taille];

  16. #16
    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
    oui oui, je viens de voir l'erreur...

    bon bah là je peux monter jusqu'à 400k... donc erreur résolue...

    maintenant je vais pouvoir passer au plus intéressant : l'optimisation de code !! (perso j'adoooore ça)

  17. #17
    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
    il fait quoi ton code?
    il calcule et affiche un aprés l'autre les decimale de pi?

  18. #18
    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
    oui oui, je viens de voir l'erreur...

    bon bah là je peux monter jusqu'à 400k... donc erreur résolue...

    maintenant je vais pouvoir passer au plus intéressant : l'optimisation de code !! (perso j'adoooore ça)
    en principe tu peut allouer jusqu'à 2Go de mémoire

  19. #19
    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
    c'est exactement ça !

    c'est ce qu'on apelle un alogorithme compte-goutte. moi je les calcule 2 par 2

    mais il vas y avoir un autre bugue (autour de la 100 000è décimale je pense) car les int et les long ont tout de même une limite donc mes multiplications seront fausses à partir d'un moment... mais je sais comment le résoudre celui-là ! (putain de calcul mathématiques de ... à faire)

  20. #20
    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
    Citation Envoyé par Mongaulois Voir le message
    en principe tu peut allouer jusqu'à 2Go de mémoire
    mais c'est limité à la taille de la mémoire système ? mem matérielle + mémoire paginée ? autre chose ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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