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 :

Problème mémoire et avantage des pointeurs


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Par défaut Problème mémoire et avantage des pointeurs
    j'ai une question a propos d'un message d'erreur qui m'est afficher a l'exécution d'un code C++ le message d'erreur est le suivant:

    Exception non gérée à 0x00839057 dans FirstReport1.exe : 0xC00000FD: Stack overflow.
    1) Qu'est ce que ça veut dire? 2) comment puis-je l'eviter et executer mo code correctement?

    sachant que ce que je veut de se code est de lire et de filtrer les données contenu dans un fichier texte (file6.txt).

    Une autre question qu'est ce que je gagnerai en temps d'exécution si j'utiliserai les pointeurs surtout quand le fichier est de taille considérable ?

    Merci d'avance.

    le code est le suivant :

    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
    49
    50
    51
    #include <iostream>
    #include <fstream>
    #include <ctime>
    #include <iomanip>
     
    using namespace std;
     
    const int width(10001);
    const int height(15);
     
    void main()
    {
        ifstream inputfile ("file6.txt");
        ofstream outputfile ("outfile.txt");
        ofstream filteredfile ("filteredfile.txt");
        ofstream timefile ("time.txt");
    clock_t tstart, tend;
    tstart = clock();
     
    int i, x, y;
    double tab[height][width];
     
    for (y=0; y<height; y++){
        for (x=0; x<width; x++){
            tab[y][x]=0;
        }
    }
     
    if (inputfile){
        for (y=0; y<height; y++){
            for (x=0; x<width; x++){ 
                inputfile >> tab[y][x];
            }
        }
    }
     
    if (filteredfile){
        for (y=0; y<height-1; y++){
            for (x=0; x<width-1; x++){
                if (tab[y+1][x+1]==-9999 || tab[y+1][x+1]<20 || tab[y+1]
     
    [x+1]>1200) {tab[y+1][x+1]= 0;}
                    filteredfile << tab[y][x] << '\t';
                }
            }
        }
    tend = clock();
        double time;
        time = double (tend-tstart)/CLOCKS_PER_SEC;
        timefile << time;
    }

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double tab[height][width];
    cause l'allocation de 10001*15*8 octets sur la pile, soit grosso modo 1.2Mo.
    Je n'ai pas essayé, mais je suppose que le système d'exploitation prend ça assez mal, et pour te manifester son mécontentement, il te génère une exception très explicite de "Stack overflow" (débordement de pile).
    Je sais qu'il existe une option de Visual Studio qui te permet de spécifier la taille initiale de la pile, mais je ne l'ai jamais employée.
    Dans ton cas, le plus simple est encore de placer cet énorme buffer en globale ou encore sur la heap, via un appel à new.

    Edit : Ce qui m'épate, c'est que le compilateur t'a laissé faire ça sans te gronder. Tu es sûr que tu n'as pas eu un warning à la compilation ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Par défaut
    Lors de la compilation j'ai pas eu de "warning".
    Pour l'utilisation de "new", justement je veux comparer entre les deux méthodes en matière de temps pour prouver le gain en temps en utilisant les pointeurs( associés à new).

    P.S: si ce que je dis n'a pas de sens, j’espère que vous me corrigerai.

    merci

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 615
    Par défaut
    Salut,

    Les perfs seront identique étant donné que tab est aussi un pointeur (sisi, un tableau n'est rien d'autre qu'un pointeur au final).

    Peut-être y'aura-t-il une légère différence entre accéder à la mémoire de la pile et du tas mais je suis assez sceptique...

    Sinon, essaye d'utiliser les std::vector plutôt que les pointeur nu et les tableaux. Cela tévitera beaucoup de soucis par la suite.
    cf. la faq pour aprendre à utiliser les vector

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 35
    Par défaut
    Merci pour ton retour Pyros, ça me clarifie les choses énormément. et c'est ce que j'ai remarqué en exécutant un autre code ou j'ai utilisé un double pointeur (**tab), y a une petite différence de temps, mais j'arrive pas à démontrer théoriquement la raison.

    Toutefois, j'en ai une autre question à poser:
    Sachant que je ferai plusieurs traitements sur les données de mon tableau ( claculer des moyennes, des max et des min, de STD, des réarangement, des ecritures sur un fichier de sortie,,,,,), EST CE QUE LES POINTEURS NE M'AIDERONT T'ILS PAS A GAGNER DU TEMPS ? puisque mes données sont stockées dans des fichiers texte de 150 Mo dans le disque dur.

    Merci d'avance

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 615
    Par défaut
    Gagner du temps par rapport à quoi ?

    A un tableau tab[N][N] ?
    Non. tab[N][N] n'est rien d'autre qu'un pointeur sur une zone mémoire de taille NxN. La petite différence de temps que tu as eu est sûrement due à d'autres facteurs.
    Et si tu souhaite mettre tout ton fichier en mémoire, tu ne pourrais pas le mettre dans un tableau car les tableau ont une taille limité par la pile (je ne sais plus combien exactement mais c'est de toute manière très moche de vouloir allouer des gros truc sur la pile, elle n'est pas faite pour ça).

    Par rapport à un std::vector ?
    Non (a condition de bien utiliser le vector ). Le gain en perf d'un pointeur par rapport à un std::vector est quasi nul et le vector a l'énorme avantage de gérer la mémoire pour toi.

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

Discussions similaires

  1. problème de fonction avec des pointeurs
    Par bl4cksky dans le forum Débuter
    Réponses: 16
    Dernier message: 09/09/2013, 12h28
  2. Réponses: 47
    Dernier message: 29/05/2011, 23h17
  3. Problème avec des pointeurs
    Par Darick dans le forum C
    Réponses: 4
    Dernier message: 15/05/2008, 09h43
  4. problème char-actéristique avec des pointeurs
    Par Antigonos Ier Gonatas dans le forum C
    Réponses: 11
    Dernier message: 16/04/2007, 21h22
  5. Problémes mémoire avec le bde sur des bases paradox
    Par Keke des Iles dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/05/2004, 16h55

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