15. maj 2004 - 16:37Der er
24 kommentarer og 1 løsning
Segmentation fault.
Jeg har lavet lidt ud fra den artikel fra arne_v og det virker også fint. Men ligeså snart jeg laver cin >> input; så kommer den med Segmentation fault når jeg trykker enter.
Ok den skrev noget til mig nu, men jeg ved ikke hvad det betyder.
(gdb) run Starting program: /home/hyper/c++/sql Input: hej
Program received signal SIGSEGV, Segmentation fault. 0x400dcf7e in vfprintf () from /lib/libc.so.6 (gdb) bt #0 0x400dcf7e in vfprintf () from /lib/libc.so.6 #1 0x400f40c3 in vsprintf () from /lib/libc.so.6 #2 0x400e440d in sprintf () from /lib/libc.so.6 #3 0x080496a1 in main () at sql.c:25
måske kan du teste sqlcmd med en if om den er NULL ligesom der gøres i if(handle == NULL)?
Så vidt jeg ved segfaulter programmer normalt når du kommer ud for en eller anden situation som de ikke forstår at håndtere primært pga manglende fejl håndtering. Så det kan være alt muligt. Sidst jeg var ude for noget der lignede det her lidt var pga en firewall som lukkede mysql porten lokalt og programmet ikke vidste hvad det skulle gøre så. Men det bliver der vist testet for i ovenstående kode så det er nok ikke det. Men alligevel test den der om indholdet er NULL :) Du kan også sætte breakpoints med gdb og aflæse hvad variabel indhold er osv. Det er et ret kraftfuldt værktøj, men vi skal vist have arne til at skrive en artikel om det :)
Nu er jeg så lige kommet ind i et nyt problem. Når jeg har den cin >> input, så hvis jeg skriver mere end 1 ord, looper den min sql query og skriver ikke det hele ind i en post, men hvert ord i hver post, ind i sqlen. Hvordan kan jeg lave sådan at en variabel kan have en sætning?
Det virker sådan nogenlunde, problemet er at jeg har det til at stå i en while loop, så den skulle gerne stoppe og be om brugerens input. Jeg har det stående i en function som jeg kalder og en anden function der bliver galt bagefter. Men den sidste function bliver kaldt med det samme.
Jeg har en function der hedder menu_1(); og en der hedder mainMenu(); I min menu_1(); har jeg mit input crap som ikke virker helt. I min mainMenu(); har jeg min hoved menu i programmet.
jeg har så lavet en whileloop der kører så længe "quit" ikke bliver valgt.
Det sådan sådan her:
menu_1(); mainMenu(); break;
Mit problem er at når jeg bruger cin.getline(input,sizeof(input)); går den helt ned til break med det samme, men bruger jeg cin >> input stopper den i menu_1() og venter TIL jeg har skrevet noget input.
Ja, når jeg skal vælge menu (et tal) bruger jeg cin, men ved til at smide noget i min variabel input, bruger jeg det du skrev. Men den opføre sig ikke på samme måde, så jeg ved ikke helt hvordan jeg skal lave det. Min kode er blevet lidt for lang til at cut/paste herinde desværre.
int mainMenu() { int menuValg; clear(); cout << "|-----Menu-----|\n1) Skriv til database\n2) Laes fra database\n"; cout << "Menu valg: "; cin >> menuValg; return menuValg; }
void menu_1() { /* Mysql crap ting før det her */ cout << "|-----Skriv til Database-----|\n\n"; cout << "Input: "; getline(cin, input,sizeof(input)); sprintf(sqlcmd, "INSERT INTO testc (text) VALUES ('%s')", input); mysql_query(handle, sqlcmd); mysql_close(handle); }
int main() { int menuValg; menuValg = mainMenu(); do { switch (menuValg) { case 1: menu_1(); mainMenu(); break; default: menuValg = mainMenu(); }
} while (menuValg != 9); return 0; }
Det virker fint med menuvalg. Mit problem er somsagt at med "cin >> input;" stopper den mellem menu_1(); og mainMenu(); for at vente på jeg skriver noget. Men med "cin.getline(input,sizeof(input));" hopper den bare videre ned til mainMenu(); i stedet for at stoppe og vente på jeg skriver noget ind til den.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.