Entra

View Full Version : [c++]Errore che non mi so spiegare


Velkan
14-11-2008, 13:27
Salve a tutti premetto che sono un niubbo di c++ vengo da java e devo fare un progettino in c++.

in pratica devo ordinare un'array di strighe con il metodo merge sort.
posto il codice:

#include "MergeSort.h"

#include <iostream>
using namespace std;


vector <string> MergeSort::ordina(vector <string> s, int i){

vector <string>::iterator ct;
ct=s.begin();
string appoggio [s.size()];
int h=0;
while(ct!=s.end()){
appoggio[h]=*ct;

h++;
ct++;

}


int left=0;
int right=(int)(s.size());


mergesort(appoggio,left,right);
ct=s.begin();




return s;


};
void MergeSort::mergesort(string s [], int left, int right){
if (left<right) {
int center = (left+right)/2;

mergesort(s, left, center);
mergesort(s, center+1, right);
merge(s, left, center, right);
}
//cout << "merda" << endl;


};


void MergeSort::merge(string s[], int left, int center, int right) {


vector <string>b;

int x=left;
int j=center+1;
int z=0;
while((x<=center)&&(j<=right)){

if(s[x].compare(s[j])<0){

//cout << b[z] << center << endl;
b.push_back(s[x]);
x++;
z++;
}
else {
//b[z]=s[j];
b.push_back(s[j]);
j++;
z++;

}
}//while 1


while(x<=center){

//b[z]=s[x];
b.push_back(s[x]);
x++;
z++;

}//while 2


while(j<=right){
//b[z]=s[j];
b.push_back(s[j]);
j++;
z++;

}//while 3

z=left;
vector <string> :: iterator it;
it=b.begin();
while (z<=right){

s[z]=*it;
//cout << s[z] << right <<endl;
z++;
it++;
}

};


quel passaggio che vedete su dove trasferisco da vector di stringhe ad array l'ho fatto in uno dei mille tentativi di capirci qualcosa,il codice è un po sporco ma è work in progress siate buoni vi prego ^^
il programma crasha dopo aver comunque ordinato ma non so perchè crasha...
Siete la mia ultima spiaggia aiutooooooo!!!

banryu79
14-11-2008, 15:20
Se il codice non lo posti tra i tag CODE ben formattato sarà difficile che qualcuno abbia voglia di mettersi a gurdarlo :rolleyes: (ultimamente mi trovo a ripeterlo spesso).

Velkan
14-11-2008, 17:30
ti ringrazio per il consiglio ma on sono pratico di "postaggi" di codice XD

e poi credo che uno che di c++ ne capisce al primo colpo d'occhio se ne accorgerà qui ci dev'essere qualche bestialità abnorme secondo me...!

vizzz
14-11-2008, 18:10
edita il primo post e mettilo nel tag code come ha detto banryu79, così non si capisce dove inizia una funzione e dove ne inizia un altra...

Velkan
15-11-2008, 01:18
modificato spero vada bene ora...scusate ma è la prima volta che posto codice su un forum!

Tommo
15-11-2008, 09:21
Ma quindi, quand'è che crasha esattamente? E quando crasha cosa dice?

Prova a mettere qualche breakpoint in giro e vedi a che punto dell'esecuzione si blocca...
se si blocca dopo che hai eseguito ::mergesort() credo che l'errore sia nel resto del programma, dato che dopo c'è solo return s; :stordita:

Velkan
15-11-2008, 10:00
allora lo vedete quel cout commentato che io ho elegantemente chiamato merda nel metodo mergesort? (scusate scleri da insuccesso :D )
Quello me lo stampa correttamente, cioè per un'array di dimensione 3 lo stampa 5 volte, la cosa che succede è che crasha immediatamente dopo perchè se nel metodo ordina metto una cout subito dopo la chiamata di mergesort lui non la stampa!

L'errore che mi da non è nessuno mi compare la finestra di windows con il famoso inviare? non inviare? e mi si impalla tutto....io ho pensato ad un ciclo infinito ma....nn ne vedo!

Tommo
15-11-2008, 10:13
Hmm con che lo stai scrivendo?
Tipo, su VC++ ci sono i breakpoints da mettere a mano, e se c'è un crash ti da la riga esatta dove è accaduto, ed i valori delle variabili in gioco.
Debuggare a forza di cout non è proprio validissimo :sofico:

banryu79
15-11-2008, 12:12
L'errore che mi da non è nessuno mi compare la finestra di windows con il famoso inviare? non inviare? e mi si impalla tutto....io ho pensato ad un ciclo infinito ma....nn ne vedo!
Probabile puntatore andato a donne di facili costumi...

Velkan
15-11-2008, 13:09
sto sviluppando con code::blocks eh sti puntatori infatti mi sa che rompono un po purtroppo vengo da java e so abituato ad eccezioni e robe del genere che ti rendono la vita piu facile...ho uppato tutto il progetto in code blocks se qualcuno vuole vedere con i suoi occhi...

ComplementidiPOO.rar (http://www.filefactory.com/file/f57c54/n/ComplementidiPOO_rar)

anyanka
15-11-2008, 13:48
ho provato ad eseguirlo:
la prima volta è crashato all'istante,
poi ho tolto l'ultimo "invio" dal file di testo che ho creato come esempio e l'ha eseguito senza problemi...che non riesca a gestire la stringa vuota??

Velkan
15-11-2008, 14:01
provo subito, anche se gli altri metodi di ordinamento non mi danno questo errore

Velkan
15-11-2008, 14:03
:mbe:
ho aggiunto qualche stringa in piu e va...tutto questo non ha senso!!!

anyanka
15-11-2008, 14:04
un momento: c'è un comportamento strano!! ho provato ad eseguirlo di nuovo ma mi va di nuovo in crash..
cmq io ho eseguito il main, quindi ottengo i risultati con tutti gli ordinamenti (giusto??)
forse c'è qualcosa nella gestione del file? mi dà un errore di tipo "segmentation fault" facendoil debug

Velkan
15-11-2008, 14:12
no allora nel main sono commentati gli utilizzi degli altri algoritmi e si c'è qualcosa che non va perchè in effetti se provo a fare una stampa del vettore ordinato mi crasha, a questo punto devo aver fatto davvero casini coi puntatori perchè è come se in java desse una nullpointer exception per intenderci

anyanka
15-11-2008, 14:14
sì ho visto adesso i commenti del main...cmq è molto strano il comportamento perchè crasha quasi a caso.. a volte sì a volte no..dipende da quello che hai fatto prima, o forse da come si è liberata la memoria...

Velkan
15-11-2008, 14:15
mamma che casino guarda è che purtroppo devo usare o sto merge sort o quick sort o heap sort...e fra tutti il merge mi sembrava il piu abordabile ma mi sta facendo impazzire

cionci
15-11-2008, 14:32
Sicuramente uno dei problemi è che se anche funzionasse non ordinerebbe niente, a mergesort passi appoggio, non s.

Velkan
15-11-2008, 14:44
si questo lo so è stata una delle tante prove che ho fatto per capirci qualcosa...cioè gia mi bastava non farlo crashare poi ci avrei lavorato su XD

Velkan
15-11-2008, 14:45
credo sia il metodo compare che lo fa crashare...dite è possibile?

cionci
15-11-2008, 15:20
Ripulisci tutto, togli quel vettore d'appoggio e poi ti renderai conto dell'errore ;) Magari posta nuovamente il codice.
E mi raccomando indenta bene !!! Così non va...

anyanka
15-11-2008, 15:25
forse perché gli passi stringhe "non buone"??
fai in modo che funzioni davvero...inutile perdere il doppio del tempo per trovare e risolvere errori prima e dopo :D

cionci
15-11-2008, 15:26
forse perché gli passi stringhe "non buone"??
fai in modo che funzioni davvero...inutile perdere il doppio del tempo per trovare e risolvere errori prima e dopo :D
C'è una piccola svista ;) Vediamo se se ne accorge rimettendo il tutto un po' in ordine. Io se non l'avessi rimesso in ordine non me ne sarei accorto velocemente.

Velkan
15-11-2008, 15:38
C'è una piccola svista ;) Vediamo se se ne accorge rimettendo il tutto un po' in ordine. Io se non l'avessi rimesso in ordine non me ne sarei accorto velocemente.

nuuuuuuuuuuuuuuuuu nn dirmi cosi che io so uscito pazzo 2 giorniiiiiii!!!!

cmq lo posso fare stasera credo non ora perchè purtroppo devo uscire, domani al massimo cerco di postare il codice ripulito, ma spero di farlo stasera...!!

Velkan
16-11-2008, 11:47
ho ripulito tutto ma purtroppo ancora nn riesco a trovare l'errore, ti ricordo cmq che io di c++ sono un niubbo oquindi puo darsi che sbaglio qualcosa e non me ne rendo conto!!

non è che potresti dirmi dove sto sbagliando?

cionci
16-11-2008, 12:04
non è che potresti dirmi dove sto sbagliando?
Sbagli a passare la dimensione del vettore alla prima chiamata di mergesort. Devi passare la dimensione - 1 ;) Infatti quello è un indice e non una dimensione, quindi deve essere l'indice dell'ultimo elemento del vettore, essendo i vettori 0-based...

Velkan
16-11-2008, 12:17
Sbagli a passare la dimensione del vettore alla prima chiamata di mergesort. Devi passare la dimensione - 1 ;) Infatti quello è un indice e non una dimensione, quindi deve essere l'indice dell'ultimo elemento del vettore, essendo i vettori 0-based...
posto i tre metodi puliti e modificati:


#include "MergeSort.h"

#include <iostream>
using namespace std;


vector <string> MergeSort::ordina(vector <string> s, int i){

int left=0;
int right=(int)(s.size()-1);
cout << right << endl;


mergesort(s,left,right);
return s;


};



metodo mergesort


void MergeSort::mergesort(vector <string> s, int left, int right){
if (left<right) {
int center = (left+right)/2;

mergesort(s, left, center);
mergesort(s, center+1, right);
merge(s, left, center, right);
}



};




metodo merge:



void MergeSort::merge(vector <string> s, int left, int center, int right) {


vector <string>b;
int x=left;
int j=center+1;
int z=0;


while((x<=center)&&(j<=right)){

if(s[x].compare(s[j])<0){
b[z]=s[x];
x++;
z++;
}
else {
b[z]=s[j];
j++;
z++;
}
}//while 1


while(x<=center){
b[z]=s[x];
x++;
z++;

}


while(j<=right){
b[z]=s[j];
j++;
z++;

}//while 3

z=left;


while (z<=right){

s[z]=b[z];
z++;

}

};



ho modificato la dimensione dell'indice...ma crasha ancora!!!!:doh:

cionci
16-11-2008, 12:19
Perché devi passare s per riferimento, altrimenti le modifiche non si riflettono sul chiamante.

Velkan
16-11-2008, 12:23
ecco altra questione per riferimento vuol dire &s giusto? e la notazione dev'essere riportata anche nella dichiarazione del metodo nel .h...non me lo fa fare! riprovo e ti dico l'errore

Velkan
16-11-2008, 12:31
mi dice no matching function to call

premetto che ho provato :
1)a passare per riferimento senza modificare i parametri dei metodi, quindi ho solo messo &s alla prima chiamata di merge sort

2)ho modificato sia il .h che le intestazzioni del .ccp a prendere in ingresso un vector <string> &s ma mi da lo stesso errore

Velkan
16-11-2008, 12:37
Perché devi passare s per riferimento, altrimenti le modifiche non si riflettono sul chiamante.

e poi scusami ma per capire...se anche il problema fosse del riferimento dovrebbe non produrre i risultati che mi aspetto ma non crashare no?

Vincenzo1968
16-11-2008, 17:29
Prova così:


#include <iostream>
#include <vector>
#include <string>
using namespace std;

const int max_strings = 100;

void merge(vector<string>& a, int left, int center, int right)
{
int i, j;
static vector<string> aux(max_strings);

for(i = center + 1; i > left; i--)
aux[i - 1] = a[i - 1];

for(j = center; j < right; j++)
aux[right + center - j] = a[j + 1];

for(int k = left; k <= right; k++)
{
if( aux[j].compare(aux[i]) < 0 )
a[k] = aux[j--];
else
a[k] = aux[i++];
}
}

void mergesort(vector<string>& a, int left, int right)
{
if ( right <= left )
return;

int center = (right + left)/2;
mergesort(a, left, center);
mergesort(a, center + 1, right);
merge(a, left, center, right);
}

int main()
{
vector<string> s(5);

s[0] = "Stringa B";
s[1] = "Stringa A";
s[2] = "Stringa D";
s[3] = "Stringa C";
s[4] = "Stringa E";

cout << endl;
cout << "vettore originale:" << endl;

for ( int i = 0; i < s.size(); i++ )
{
cout << s[i] << endl;
}

mergesort(s, 0, 4);

cout << endl;
cout << "vettore ordinato:" << endl;

for ( int i = 0; i < s.size(); i++ )
{
cout << s[i] << endl;
}

return 0;
}

cionci
16-11-2008, 18:32
e poi scusami ma per capire...se anche il problema fosse del riferimento dovrebbe non produrre i risultati che mi aspetto ma non crashare no?
Crasha perché s[x] non contiene un valore all'indice x ;) Dovrebbe generare un'eccezione. L'eccezione non è catturata e quindi va in segmentation fault.

cionci
16-11-2008, 18:51
Aspetta...hai tolto anche i push_back...i push_back erano giusti !!!
Ora bisogna riservare lo spazio nel vettore, altrimenti non funziona:

void merge(vector <string> &s, int left, int center, int right)
{


vector <string> b(s.size());
int x=left;
int j=center+1;
int z=0;


while ((x<=center)&&(j<=right))
{

if (s[x].compare(s[j])<0)
{
b[z]=s[x];
x++;
z++;
}
else
{
b[z]=s[j];
j++;
z++;
}
}//while 1


while (x<=center)
{
b[z]=s[x];
x++;
z++;

}


while (j<=right)
{
b[z]=s[j];
j++;
z++;

}//while 3

z=left;

j = 0;

while (z<=right)
{
s[z]=b[j];
z++;
j++;
}
};

PS: avevi inserito un altro errore nella parte in grassetto ;)

Velkan
17-11-2008, 13:32
Cionci io devo dire che se in italia ci fossero piu persone come te si starebbe molto meglio!!!

SEI UN GRANDE GRAZIE MILLE A TUTTI !!!!
gli errori erano esattamente quelli riportati da cionci per questo mensione speciale a lui ma grazie davvero a tutti!!!

cionci
17-11-2008, 13:54
Eh...esagerato :D