Segmentation fault

di il
15 risposte

Segmentation fault

#include <iostream>
using namespace std;

const int P=5;
const int S=5;

class Distributore {
   int** armadio;
   int ripiani;
public:
   Distributore::Distributore(const int);
   friend ostream& operator<<(ostream& os, const Distributore&);
}

Distributore::Distributore(const int num)
{
   ripiani=num;
   armadio=new int*[ripiani];
   for(int r=0; r<ripiani; r++)
      armadio[r]=new int[S];
      for(int r=0; r<ripiani; r++)
         for(int c=0; c<S; c++)
            armadio[r][c]=1;
}

ostream& operator<<(ostream& os, const Distributore& dis)
{
   cout << endl;
   for(int x=0; x<dis.ripiani; x++) {
      cout << endl << x+1 << ": ";
      for(int y=0; y<S; y++)
         cout << dis.armadio[x][y] << ' ';
      }
}
[i][/i]
int main()
{
Distributore d(3);
cout << d <<endl;
}


Sono quasi 6 h che cerco di spulciare questo codice ma non capisco perchè ottengo all'esecuzione del programma "segmentation fault".
Questo errore lo elimino solo se sostituisco nel main la riga di codice cout << d <<endl; con cout << d;
Come mai?

15 Risposte

  • Re: Segmentation fault

    Ma scusa ... in questa parte di codice
    
    stream& operator<<(ostream& os, const Distributore dis)
    {
       cout << endl;
       for(int x=0; x<dis.ripiani; x++)
          cout << endl << x+1 << ": ";
          for(int y=0; y<S; y++)
             cout << dis.armadio[x][y] << ' ';
    }
    
    sei sicuro che sia tutto a posto? Io vedo un problema nella dichiarazione, nel fatto che non restituisce nulla e in quei cicli strani ...
  • Re: Segmentation fault

    oregon ha scritto:


    
    stream& operator<<(ostream& os, const Distributore dis)
    {
       cout << endl;
       for(int x=0; x<dis.ripiani; x++) {
          cout << endl << x+1 << ": ";
          for(int y=0; y<S; y++)
             cout << dis.armadio[x][y] << ' ';
          }
    }
    
    sei sicuro che sia tutto a posto? Io vedo un problema nella dichiarazione, nel fatto che non restituisce nulla e in quei cicli strani ...
    Incredibile, è quasi tutto il giorno e tu in mezzo sec!
    Ho corretto la dichiarazione aggiungendo &.
    E' vero dovrebbe esserci un 'return os' !

    Perchè cicli strani?!
  • Re: Segmentation fault

    Guarda che il codice che hai riportato nel post iniziale contiene molti errori, a me infatti non compila.
  • Re: Segmentation fault

    Nippolo ha scritto:


    Guarda che il codice che hai riportato nel post iniziale contiene molti errori, a me infatti non compila.
    l'ho ricopiato a mano, non ho potuto fare copia e incolla del codice.
    Presumo che ci sia qualche errore di trascrizione, il compilatore non dava errori.
    Ma essenzialmente ciò che avevo dimenticato era il return nella funzione operator responsabile del segmentation fault.

    Secondo voi perchè si parla di cicli strani? Ho sbagliato qualcosa?
  • Re: Segmentation fault

    Per evitare di parlare di presunti errori che in realtà non esistono, riguardati il codice e, nel caso ci siano errori di trascrizione, correggilo.
  • Re: Segmentation fault

    Nippolo ha scritto:


    Per evitare di parlare di presunti errori che in realtà non esistono, riguardati il codice e, nel caso ci siano errori di trascrizione, correggilo.
    ok
  • Re: Segmentation fault

    Le due for sono indipendenti o uno dentro l'altra?
    Come mai usi x nella seconda for?
  • Re: Segmentation fault

    oregon ha scritto:


    Le due for sono indipendenti o uno dentro l'altra?
    Come mai usi x nella seconda for?
    Mi riscuso per gli errori di trascrizione, vedo di stare più attento nei prossimi thread.
    Ho corretto, mancava una parentesi graffa.
    I for sono uno dentro l'altro, la x nel secondo for è utilizzata perchè devo stampare una matrice.
  • Re: Segmentation fault

    oregon ha scritto:


    Ma scusa ... in questa parte di codice
    
    stream& operator<<(ostream& os, const Distributore dis)
    {
       cout << endl;
       for(int x=0; x<dis.ripiani; x++) {
          cout << endl << x+1 << ": ";
          for(int y=0; y<S; y++)
             cout << dis.armadio[x][y] << ' ';
       }
    }
    
    sei sicuro che sia tutto a posto? Io vedo un problema nella dichiarazione, nel fatto che non restituisce nulla e in quei cicli strani ...
  • Re: Segmentation fault

    L'ultimo argomento non è passato correttamente come ti era stato detto.

    Vuoi postare il codice completo e corretto altrimenti non se ne esce. Ma tu lo compili? Copia e incolla il codice che compili, non trascriverlo nel forum.
  • Re: Segmentation fault

    Si compilo, ma ho risolto grazie al suggerimento del valore di ritorno che avevo dimenticato nella funzione operator<<
  • Re: Segmentation fault

    Il compilatore dobrebbe avvisarti che manca il valore di ritorno.
  • Re: Segmentation fault

    oregon ha scritto:


    Il compilatore dobrebbe avvisarti che manca il valore di ritorno.
    sinceramente non mi ha avvisato, ho notato soltanto che se nel codice inserivo cout << d << endl; ottenevo un errore in esecuzione mentre se lasciavo cout << d non avevo alcun errore.
    In entrambi i casi la compilazione non dava alcun errore.
    Se lo ritenete interessante vedo di fare il copia incolla del codice.
  • Re: Segmentation fault

    Ecco i vari errori/imprecisioni che ho notato:
    - nel prototipo del costruttore non c'è bisogno di utilizzare l'operatore di risoluzione di visibilità ::, inoltre se dichiari l'argomento const tanto vale passarlo per riferimento e non per valore;
    - nel prototipo dell'overload dell'operatore <<, l'identificatore os è superfluo (soprattutto se per tutti gli altri argomenti hai omesso l'identificatore);
    - nella definizione del costruttore mancano delle parentesi graffe e inoltre il secondo for è inutile;
    - mancano delle parentesi graffe anche nella definizione dell'overload di <<.
Devi accedere o registrarti per scrivere nel forum
15 risposte