View Full Version : [c++]Errore che non mi so spiegare
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).
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...!
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...
modificato spero vada bene ora...scusate ma è la prima volta che posto codice su un forum!
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:
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!
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...
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)
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??
provo subito, anche se gli altri metodi di ordinamento non mi danno questo errore
:mbe:
ho aggiunto qualche stringa in piu e va...tutto questo non ha senso!!!
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
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
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...
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
Sicuramente uno dei problemi è che se anche funzionasse non ordinerebbe niente, a mergesort passi appoggio, non s.
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
credo sia il metodo compare che lo fa crashare...dite è possibile?
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...
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
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.
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...!!
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?
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...
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:
Perché devi passare s per riferimento, altrimenti le modifiche non si riflettono sul chiamante.
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
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
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;
}
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.
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 ;)
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!!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.