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 :

Vector et mémoire insuffisante


Sujet :

C++

  1. #1
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut Vector et mémoire insuffisante
    bonsoir ,

    J'ai défini deux vector :
    std::vector<int> num1(199);
    std::vector<int> produit1(40);

    Avec un produit de 5 composantes sur num1 , l'erreur console est :

    terminate called after throuwing an instance of 'std::out_of_range what():
    vector :: _M_range_check
    Aborted ( core dumped )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // --------------------------------------
        int i_min=0; // 200 400
        int i_max=100; // 399 499
        for( int i=i_min ; i < i_max; i+=5)
        {
        produit1.at(i)=num1[i]*num1[i+1]*num1[i+2]*num1[i+3]*num1[i+4];
        std::cout << "(" << i/5 << ")" << produit1[i] <<"|";
        if(produit1[i]>sup){
            sup=produit1[i];
            rang=i/5;
        }}
        std::cout << "-----" <<endl;
        std::cout << "sup=(" << rang << ")" << sup <<endl;
    Il n'y a pas d'erreur de compilation.

    @+

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu déclares un tableau de 40 éléments std::vector<int> produit1(40); et tu espères parcourir 100 éléments for( int i=i_min ; i < i_max; i+=5) ?
    L'erreur est pourtant claire : out of range, ça n'a rien à voir avec une insuffisance mémoire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    produit1.at(i)=num1[i]*num1[i+1]*num1[i+2]*num1[i+3]*num1[i+4];
    produit1.at(i) n'a que 20 éléments avec i = 0 , 5 , 10 , .. 100
    et num(i) a 100 éléments

    i avance de 5 en 5 , et je ne vois ce qui cloche dans cette boucle ?


  4. #4
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Bousk a raison.
    I est incrémenté, de 5 par 5, d'accord, mais quand il arrive au dela de 40 il va trouver quoi ici : if(produit1[i]>sup) ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Tu as déjà ouvert un fil de discussion sur ce problème, il me semble: : Problème de conteneur char / int

    Voici ce que je propose: tu as un liste comme celle-ci [7,3,1,6,7,1,7,6,5,3,1]

    Tu vas avoir un tableau circulaire "last_5_numbers" de 5 chiffres qui seront les 5 derniers chiffres [0, 0, 0, 0, 0]
    Circulaire (avec l'opérateur modulo), parce qu'il faut juste supprimer le chiffre le plus ancien.
    Et à chaque tour de boucle, on va calculer le produit en multipliant tous les nombres contenus dans ce tableau circulaire.

    Astuce: Pour les 4 premiers chiffres, le produit va être zéro. Mais cela ne dérange pas puisqu'on demande le maximum

    Déroulement:
    • 7 -> [7, 0, 0, 0, 0], current product: 0, max product 0
    • 3 -> [7, 3, 0, 0, 0], current product: 0, max product 0
    • 1 -> [7, 3, 1, 0, 0], current product: 0, max product 0
    • 6 -> [7, 3, 1, 6, 0], current product: 0, max product 0
    • 7 -> [7, 3, 1, 6, 7], current product: 882, max product 882
    • 1 -> [1, 3, 1, 6, 7], current product: 126, max product 882
    • 7 -> [1, 7, 1, 6, 7], current product: 294, max product 882
    • 6 -> [1, 7, 6, 6, 7], current product: 1764, max product 1764
    • 5 -> [1, 7, 6, 5, 7], current product: 1470, max product 1764
    • 3 -> [1, 7, 6, 5, 3], current product: 630, max product 1764



    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
    #include<vector>
    #include<iostream>
     
    using namespace std;
     
     
    int main(int argc, char* argv[])
    {
    //  XXX TODO: Need to initialize vector list
        unsigned char list_c[] = {7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9,2,2,5,1,1,9,6,7,4,4,2,6,5,7,4,7,4,2,3,5,5,3,4,9,1,9,4,9,3,4};
        vector<unsigned char> list(list_c, list_c + sizeof(list_c) / sizeof(list_c[0]));
     
        if (list.size() < 5) { return 1; }
     
    //  Circular array
        unsigned char last_5_numbers[5] = {0, 0, 0, 0, 0};
        unsigned char last_index = 0;
     
        unsigned short current_product = 0, max_product = 0;
     
        for(vector<unsigned char>::iterator it = list.begin(); it != list.end(); ++it, last_index = ((last_index + 1) % 5)) {
            last_5_numbers[last_index] = *it;
     
            current_product = last_5_numbers[0] * last_5_numbers[1] * last_5_numbers[2] * last_5_numbers[3] * last_5_numbers[4];
     
            if (current_product > max_product) { max_product = current_product; }
     
            cout << (unsigned int) last_5_numbers[last_index] << ", current: " << current_product << ", max: " << max_product << endl;
        }
     
        return 0;
    }
    Édit: j'ai changé it < list.end() par it != list.end()
    Et effectivement, je n'ai pas mis de compteur ni même sauvegarder les 5 chiffres qui font le produit maximal (si le couple est unique )

    Par contre, pour sauvegarder les 5 chiffres, comme c'est un tableau circulaire c'est un peu compliqué si on veut garder l'ordre de ces 5 chiffres: il faut utiliser l'opérateur modulo ((last_index + 5 - 1) % 5)

  6. #6
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    ok , je vois le nombre total de produit[i] qui est 20 , mais pas la variation de
    l'indice i .

    [Résolu]

  7. #7
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    @foetus :

    http://submoon.freeshell.org/fr/sphinx/euler.html

    Pour le problème N°8 , je trouve dans le sens de la lecture horizontale , le plus grand produit de 40824 .

    Quintuplet de ( 9 ? ? ? 9 )

    Je n'ai pas testé le sens vertical ..


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

Discussions similaires

  1. [CR][VB.NET] Message : mémoire insuffisante
    Par arno2000 dans le forum SDK
    Réponses: 1
    Dernier message: 22/12/2005, 13h52
  2. Mémoire insuffisante
    Par cjo dans le forum Bases de données
    Réponses: 6
    Dernier message: 07/11/2005, 12h14
  3. message d'erreur "Mémoire insuffisante"
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2005, 14h41
  4. Mémoire insuffisante
    Par lenouvo dans le forum MFC
    Réponses: 6
    Dernier message: 31/08/2005, 09h14
  5. Mémoire insuffisante sous Dos
    Par Bubonik software dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 20/09/2003, 10h35

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