2010-02-21 10 views
2

J'essaie d'imprimer un tableau d'entiers. Je reçois une faute de seg quand j'essaie d'imprimer comme ci-dessous. Si je décommente le "In for loop" il imprimera tout sauf le dernier élément du tableau et il a toujours un défaut seg. Quand je décommente les deux commentaires (ou juste le "fait avec la boucle") tout imprime bien. Pourquoi cela arrive-t-il et comment puis-je le réparer?Erreur de segmentation lors de la sortie en C++

for(int i = 0; i < l.usedLength; i++) 
{ 
    //cout << "**********In for loop" << endl; 
    cout << l.largeInt[ i ]; 
} 
//cout << "**********done with for loop" << endl; 

est ici toute la classe:

#include "LargeInt.h" 
#include <ctype.h> 

LargeInt::LargeInt() 
{ 
    usedLength = 0; 
    totalLength = 50; 

    largeInt = new int[totalLength]; 
    for(int i=0; i<totalLength; i++) 
    { 
     largeInt[i] = 0; 
    } 
} 

LargeInt LargeInt::operator+(const LargeInt &l) const 
{} 

LargeInt LargeInt::operator-(const LargeInt &l) const 
{} 

LargeInt LargeInt::operator*(const LargeInt &l) const 
{} 

LargeInt LargeInt::operator/(const LargeInt &l) const 
{} 

bool LargeInt::operator==(const LargeInt &l) const 
{} 

ostream& operator<<(ostream &out, const LargeInt &l) 
{ 
    cout << "In output" << endl; 

    if(l.usedLength == 0) 
    { 
     cout << 0; 
    } 
    else 
    { 
     cout << "In else... NON 0" << endl; 

     for(int i = 0; i < l.usedLength; i++) 
     { 
      cout << "In for loop" << endl; 
      cout << l.largeInt[ i ]; 
     } 
     //cout << "done with for loop" << endl; 
    } 
    //cout << "after the if.... all done with output" << endl; 
} 

istream& operator>>(istream &in, LargeInt &l) 
{ 
    char x; 
    while (std::cin.get(x) && x >= '0' && x <= '9') 
    { 
     l.largeInt[ l.usedLength ] = x-48; 
     l.usedLength++; 
     //need to check array length and make bigger if needed 
    } 

} 

principal:

#include <stdlib.h> 
#include <iostream> 

#include "LargeInt.h" 

int main(int argc, char** argv) { 

    cout << "\nJosh Curren's Assignment #5 - Large Integer\n" << endl; 

    LargeInt lint; 

    cout << "Enter a large int: "; 
    cin >> lint; 

    cout << "\nYou entered: " << endl; 
    cout << lint << endl; 
    cout << endl; 


    return (EXIT_SUCCESS); 
} 
+0

Quoi de neuf? 15 – Tom

+0

quel est le type de 'l'? – Vlad

+0

Pourriez-vous décrire d'autres? Quel type est de l? Qu'est-ce que l.usedLength, l.largeInt? – lollinus

Répondre

4

Vous avez oublié la dernière ligne ostream& operator<<(ostream &out, const LargeInt &l):

return out; 

Avec cette ligne, il fonctionne parfaitement.

+0

Ahh Oui bien sûr, quelqu'un a oublié de lire la sortie du compilateur et ne jamais ignorer les avertissements. Comment pourrais-je manquer cela. – lollinus

+0

Je suis curieux de savoir pourquoi vous ne recevez pas cela comme une erreur parfois. Ça m'a mordu avant. Est-ce un bug du compilateur VS2008 ou un coin sombre de la langue? – Macke

+0

En fait, VS doit émettre un avertissement au niveau d'avertissement> 0. Voir http://msdn.microsoft.com/en-us/library/ft5xye74.aspx – Vlad

0

Mon pari est que le problème est dans la partie l.largeInt [i], mais ne peut pas dire sans plus d'informations.

COuld vous publiez plus de code?

l est un Largeint qui est la classe ce code se trouve dans l ... comporte un réseau de 50 ints qui est Largeint. l a également un usedLength int qui est le nombre d'éléments dans le tableau

Vérifiez que usedLength < 50.

Et faire du débogage. On dirait le genre de problème où un débogueur irait loin (n'est-ce pas la quasi-totalité?)

+0

i ajouté toute la classe –

+0

je n'ai testé avec <10 articles jusqu'à présent si son pas usedLength est> 50 –

0

Ce que vous dites ne semble pas, à première vue, avoir un sens; envoyer des trucs à stdout ne devrait pas affecter si oui ou non le code segfaults. Je suppose que vous avez un bug de corruption de mémoire subtile ailleurs, peut-être dans l (quel que soit le type - vous n'en avez pas beaucoup parlé).

+0

i ajouté la classe –

+0

Vous avez besoin que des bornes vérifier si incrémenter usedLength. Sinon, dès que vous lisez ce 51ème chiffre, vous gribouillez toute la mémoire. – crazyscot

+0

maintenant j'ai testé avec <50 chiffres ... Je vais éventuellement ajouter du code à l'entrée qui fera un plus grand tableau si elle arrive à 50 si usedLength ne sera jamais> the totalLength –

0

Je suppose que usedLength est la taille du tableau et que le dernier index valide est usedLength - 1. Ainsi, lorsque vous accédez à l'élément de usedLength, vous obtenez le défaut seg.

+0

il n'accède jamais à l'élément à usedLength. –

+0

Votre code posté le confirme. –

+0

où voyez-vous cela? –

0

Je ne vois pas de destructeur I Votre code. Je peux deviner que delete largeInt peut être mal utilisé.

0

Si vous utilisez Linux (ou quelque chose de similaire), oubliez stdout pour trouver segfault. Essayez d'utiliser valgring ou générez le noyau et analysez-le avec gdb. En raison de la mise en mémoire tampon des flux en cas de segfault, il n'y a aucune garantie que votre impression apparaîtra.

+0

Je ne suis pas à linux ... im sur Win 7 –

+0

http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows vérifier ce fil, ici vous trouverez certains outils Windows pour vérifier votre utilisation de la mémoire – kokosing

+0

http://www.microsoft.com/downloads/details.aspx?familyid=c4a25ab9-649d-4a1b-b4a7-c9d8b095df18&displaylang=en peut-être que cela vous sera utile – kokosing

1

Vous devez régler usedLength à zéro au début de l'istream operator >>.

+0

Merci! Mais cela ne règle pas la faute de seg. –

1

Eh bien, ce code ne devrait même pas compiler: Vos opérateurs ne retournent rien. En outre, vous avez & en paramètres, mais utilisez cout & cin. Mais aucun d'entre eux ne causerait le problème que vous voyez. Comme le crash se déplace en fonction de la présence ou de l'absence de code et de chaînes à proximité, je vais augmenter mes compétences de débogage psychique, et dire que, où, vous êtes en train de dépasser la fin d'un tableau, probablement largeInt.

En outre, ce serait bien de voir la fonction main() de votre code.

+0

J'ai ajouté le code pour –

Questions connexes