ERRORE DI SEGMENTAZIONE C++

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
reder92
Prode Principiante
Messaggi: 3
Iscrizione: giovedì 29 marzo 2012, 12:46

ERRORE DI SEGMENTAZIONE C++

Messaggio da reder92 »

Salve a tutti, frequento il primo anno di università in informatica e come tale, a casa mi esercito molto in programmazione c++, ma ogni tanto inciampo in problemi che non sempre riesco a vedere o addirittura a risolvere, causa la mia inesperienza.
Il problema di oggi è questo : scrivere una funzione che riceve una matrice di tipo char[][5] ed il numreo di righe limite_1 e determina se c'è un carattere che è presente in tutte le righe della matrice.
Allora io il programma l'ho abbozzato, ma quando inserisco i caratteri nell"array (supponendo di aver messo come limite righe un numero  maggiore  di 2 ) mi da errore di segmentazione, io so cos'è questo errore, ma non riesco a capire dove sbaglio nel programma, se voi riusciste a darmi una mano, facendomi capire dove sbaglio, sarei veramente contento, in quanto mi da molto fastidio non riuscire a capire l'errore e comunque trovo molto interessante confrontarmi con voi tutti!

questo è il mio programma :
#include
using namespace std;
char trova(char C[][5],int limite_1)
{
char *punt_ele=C[0];
bool fine=false;
for(int j=0;j> x;
cout > C[j];
}
}
cout<<"array pieno "<<endl;
trova(C,x);
}
sp27
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 397
Iscrizione: mercoledì 19 marzo 2008, 19:22

Re: ERRORE DI SEGMENTAZIONE C++

Messaggio da sp27 »

Codice: Seleziona tutto

#include<iostream>
using namespace std;
char trova(char C[][5],int limite_1)
{
char *punt_ele=C[0];
bool fine=false;
for(int j=0;j<5 && !fine;j++)//questo seleziona il carattere da confrontare con il resto dell'array;
      {
      bool ok=true;//ok mi serve per capire se l'elemento è stato trovato
      for(int k=0;k<limite_1 && ok;k++)//seleziona la riga dove controllare il carettere
         {//se nella riga non è presente l'elemento richiesto, cambia subito carattere in C[0][j]
            ok=false;//qui è false in quanto z appena vede C[0][j]== C[k][z] fa diventare ok=true, e quindi non serve che controlla la prossima posizione
         for(int z=0; z<5 && !ok;z++)//seleziona la colonna scorrendo la riga
            {//quando ok=true vuol dire che deve cambiare riga in k, per confrontare l'elemento con la prossima riga
            if((!ok) && (C[0][j]==C[k][z]))
               {
               ok=true;
               *punt_ele=C[0][j];
               }         
                  if ((k==limite_1-1) && ok)
                  {
                     cout<<" l'elemento comune nell'array è : "<<*punt_ele<<endl;
                     fine=true;
                  }
            }
         }
      
      }   

}
main()
{
   char C[][5]={};
   int x;
   cout <<"inserire limite array"<<endl;
   cin>> x;
   cout <<"inserire caratteri array"<<endl;
   for (int i=0;i<x;i++)
      {
      for (int j=0;j<5;j++)
         {
         cin >> C[i][j];
         }
      }
   cout<<"array pieno "<<endl;
   trova(C,x);
}
Ho dato un'occhiata superficiale: secondo me c'era un 10 al posto di un 5 e poi ho messo un  cin >> C[j]; al posto di  cin >> C[j].

EDIT: eheh qui sopra risultano uguali  ma io ho scritto

Codice: Seleziona tutto

 cin >> C[i][j];
e l'altro

Codice: Seleziona tutto

 cin >> C[j]
...  il forum si mangia qualche pezzo! o meglio prende la i tra parentesi quadre come italic.. meglio sempre scrivere i codici usando l'apposito "inserisci codice" (tasto cancelletto!)
Ultima modifica di Anonymous il giovedì 29 marzo 2012, 15:20, modificato 1 volta in totale.
reder92
Prode Principiante
Messaggi: 3
Iscrizione: giovedì 29 marzo 2012, 12:46

Re: ERRORE DI SEGMENTAZIONE C++

Messaggio da reder92 »

grazie per l'informazione, comunque anche dopo quest'ultima correzione, l'errore persiste!
avevo provato a mettere come limite dell'array 10 "giusto per", e poi mi sono dimenticato!
cmq grazie mille  ;)
sp27
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 397
Iscrizione: mercoledì 19 marzo 2008, 19:22

Re: ERRORE DI SEGMENTAZIONE C++

Messaggio da sp27 »

curioso... a me funziona! nessun segmentation fault. Di solito comunque questo errore succede se cerchi di scrivere "fuori da un vettore". A me comunque il programma gira.
Ultima modifica di Anonymous il giovedì 29 marzo 2012, 16:21, modificato 1 volta in totale.
reder92
Prode Principiante
Messaggi: 3
Iscrizione: giovedì 29 marzo 2012, 12:46

Re: ERRORE DI SEGMENTAZIONE C++

Messaggio da reder92 »

allora partendo dal fatto che la prima riga fa da padrona di tutto il programma, se mettessi un array lungo come una colonna, che mi dice con true se è stato trovato il carattere in questione ,arrivato all'ultimo booleano vero vorrei che la condizione mi porta ad identificare il carattere comune...ossia :
bool T[limite_1]={};
controlla se C[0][j]==C[k][z] se questo è uguale, allora finisce il ciclo di z e cambia riga con k, intanto il booleano è diventato vero, quindi nella posizione T[k]=vero;
quando ha controllato tutte le righe di k,T[k] avrà al suo interno booleani veri o falsi, supponendo che abbia tutti veri, vuol dire che il carattere C[0][j] è presente almeno una volta, in tutte le righe dell'array, risolvendo il mio problema! ecco io voglio sapere quest'ultima parte come scriverla nel programma.
ossia quando l'array di booleani ha tutte le 5 righe T[k]==vere il carattere C[0][j] è quello ricercato!
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: ERRORE DI SEGMENTAZIONE C++

Messaggio da 1001001 »

ciao!

l'errore è a monte, quando dichiari l'array. Per avere un array di dimensione variabile, puoi:
1) usare un vector:

Codice: Seleziona tutto

vector<vector<char> > C;
2) usare "a mano" new e delete (dico a mano, perchè poi in realtà il vector usa new e delete, ma in automatico)

Codice: Seleziona tutto

char **C;
   int x;
   cout <<"inserire limite array"<<endl;
   cin>> x;
   
   C = new char* [x];
   
   for (int i=0; i<x; i++)
    C[i] = new char [5];

   [.....]


 for (int i = 0; i<x; i++)
 {
    delete [] C[i];
 }
    
    delete [] C;
nota che devi anche cambiare l'header della funzione trova:

Codice: Seleziona tutto

char trova(char **C,int limite_1)
"I find your lack of faith disturbing."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti