Gå til innhold

Hvorfor får dette programmet til å kræsje?


Anbefalte innlegg

Heisann!

 

Skal lage en streng for å kommunisere med en SQL database. Koden kompileres helt fint, men når den kjøres kræsjer programmet :S

 

	char* SqlString = new char[501];

{...}

		SqlString = "INSERT INTO Music(track, title, artist, album, genre, year, path) values(";
		//strcat(SqlString, TF.tag()->track());
		strcat(SqlString, ", ");
		strcat(SqlString, TF.tag()->title().toCString());
		strcat(SqlString, ", ");
		strcat(SqlString, TF.tag()->artist().toCString());
		strcat(SqlString, ", ");
		strcat(SqlString, TF.tag()->album().toCString());
		strcat(SqlString, ", ");
		strcat(SqlString, TF.tag()->genre().toCString());
		strcat(SqlString, ", ");
		//strcat(SqlString, TF.tag()->year().toCString());
		strcat(SqlString, ", ");
		strcat(SqlString, F.char_str());
		strcat(SqlString, "))");*/
		wxMessageBox(wxString::FromUTF8(SqlString), _("Welcome to..."));

 

Jeg har sjekket, og hvis jeg kommenterer ut strcat setningene så er det ingen problemer...

Lenke til kommentar
Videoannonse
Annonse

Først og fremst kan du allokere stringen din på stack, så slipper du en eventuel minnelekasje; pluss at stack-minne også kan være raskere en heap.

altså

 

char SqlString[501];
SqlString[0] = 0;

 

Aprikos det, kan det hende det kræsjer fordi du ikke setter første byte i arrayet til 0.

Lenke til kommentar
Først og fremst kan du allokere stringen din på stack, så slipper du en eventuel minnelekasje; pluss at stack-minne også kan være raskere en heap.

altså

 

char SqlString[501];
SqlString[0] = 0;

 

Aprikos det, kan det hende det kræsjer fordi du ikke setter første byte i arrayet til 0.

 

Løste dessverre ikke saken. Jeg fant heldigvis en annen måte å gjøre det på. Men nå har jeg støtt på et nytt problem... sukk.. Denne gangen gjelder det å gjøre om en int til const char*.

 

SqlString.Append(wxString::FromUTF8((const char *)(TF.tag()->year())));

 

Hva som skjer her er at jeg prøver å legge til TF.tag()->year() til SqlString (som er av type wxString). Problemet er at wxString ikke støtter uint(unsigned int) som da er TF.tag()->year(), men krever at det skal være en const char*.

 

Så jeg har prøvd å gjøre dette ved å legge til en (const char *) som dere ser, men å kjøre denne koden resulterer i kræsj igjen. Noen annen måte å gjøre dette på?

Lenke til kommentar
Heisann!

	char* SqlString = new char[501];

{...}

		SqlString = "INSERT INTO Music(track, title, artist, album, genre, year, path) values(";
		//strcat(SqlString, TF.tag()->track());

 

Jeg har sjekket, og hvis jeg kommenterer ut strcat setningene så er det ingen problemer...

 

Hei!

Problemet her er at du tildeler variabelen SqlString et konstant minneområde (ved SqlString = "INSERT...". En char* variabel fungerer IKKE som en std::string. Hvis SqlString etter dynamisk allokering peker til et minneområde vil den peke til et annet område etter "INSERT INTO".

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...