GNUfan Skrevet 15. juli 2003 Del Skrevet 15. juli 2003 #include <iostream> #include <unistd.h> using namespace std; int main() //ingen kommandolinjeargumenter { char** args; //Argumenter som skal sendes til execvp int antallargs; cout<<"Hvilket program vil du kjøre? "; args[0]= new char[10]; //funker fint cin>>args[0]; //første argument må være programnavnet cout<<"Hvor mange args? "; cin>>antallargs; for(int i=1; i<=antallargs;) { cout<<"Skriv inn argument nummer "<<i<<". "; args[i]=new char[10]; //denne har skylda. Når jeg fjerna den så cin>>args[i]; //segfaulta den ikke før etter at // man skreiv inn svaret her. args[++i]=NULL; //execvp vil ha ei nullterminert liste. } //slutt for execvp (args[0], args); //Det skal være sånn. } //slutt main Dette programmet segfaulter med en gang. Jeg gjør det bare for å lære meg det. args= new char[10] mener jeg å huske at fungerte tidligere, men jeg sletta kildekoden på den av en eller annen grunn (mekka et script som kompilerte alt i cpp-mappa, men brukte , som separator i stedet for .) Noen som kan hjelpe meg? Lenke til kommentar
GNUfan Skrevet 16. juli 2003 Forfatter Del Skrevet 16. juli 2003 Det kan ha noe med at PC-en min er på vei ned (den segfaulter på mye rart sånn av og til). For eksempel ville den ikke ha ei for-løkke med en verdi som ikke var forutbestemt (f.eks antallargs). Lenke til kommentar
GNUfan Skrevet 16. juli 2003 Forfatter Del Skrevet 16. juli 2003 takker! Får teste, men pcn er sånn delvis ustabil nå Lenke til kommentar
GNUfan Skrevet 16. juli 2003 Forfatter Del Skrevet 16. juli 2003 Den koden din segfaulta dj_offset segfaulta (og ja, jeg har lånt minne av en kamerat, og feilen er funnet hardwaremessig). #include <iostream> #include <unistd.h> using namespace std; int main() { char** args; int antallargs=0; char* program; cout<<"Hvilket program vil du kjøre? "; cin>>program; cout<<"Hvor mange args? "; cin>>antallargs; *args = new char[antallargs+2]; args[0]=program; for(int i=1; i<=antallargs;) { cout << "Skriv inn argument nummer "<<i<<". "; char* argu = new char [10]; // heiv på litt ting for å debugge, // "Etter cin" kommer ikke fram. Den // segfaulter altså på cin>> argu; cin >> argu; cout<<"etter cin"; args[i] = argu; cout<<"før args=null"; args[++i] = NULL; cout<<"Siste i for-løkka"; } execvp (args[0], args); } Lenke til kommentar
GNUfan Skrevet 17. juli 2003 Forfatter Del Skrevet 17. juli 2003 Nå kom den så langt at den segfaulta på execvp. Kan jo lage en metode som sjekker at arrayet er som det skal... edit: Lagde den, og arrayet så fint ut det... void sjekkArray(char** test) { for(int i=0; test[i]!=NULL; i++) { cout<<"Objekt "<<i<<" er "<<test[i]<<endl; } } Lenke til kommentar
A_N_K Skrevet 17. juli 2003 Del Skrevet 17. juli 2003 Tok meg den frihet å rydde opp litt: #include <iostream> #include <string> #include <cstring> #include <unistd.h> using namespace std; int main() { char **args; string program; int antallargs; cout << "Hvilket program vil du kjøre? "; cin >> program; cout << "Hvor mange args? "; cin >> antallargs; args = new char *[antallargs+2]; // her setter vi det første elementet args[0] = const_cast<char *>(program.c_str()); // return 0; string param; for(int i = 1; i < antallargs+1; i++) { cout << "Skriv inn argument nummer " << i << ". "; cin >> param; args[i] = strdup(param.c_str()); } args[antallargs+1] = 0; execvp(args[0], args); for (int i = 1; i < antallargs+1; ++i) free(args[i]); delete [] args; return 0; } Lenke til kommentar
GNUfan Skrevet 17. juli 2003 Forfatter Del Skrevet 17. juli 2003 Tok meg den frihet å rydde opp litt: #include <iostream> #include <unistd.h> using namespace std; int main() { char **args; char program[10]; int antallargs; cout << "Hvilket program vil du kjøre? "; cin >> program; cout << "Hvor mange args? "; cin >> antallargs; args = new char *[antallargs+2]; // her setter vi det første elementet args[0] = program; // return 0; for(int i = 1; i < antallargs+1; i++) { cout << "Skriv inn argument nummer " << i << ". "; char param[10]; cin >> param; args[i] = param; } args[antallargs+1] = 0; execvp(args[0], args); delete [] args; return 0; } DET FUNKA!!! (sånn reint bortsett fra at med mer en ett argument blir alle argumentene lik det siste...) Lenke til kommentar
A_N_K Skrevet 17. juli 2003 Del Skrevet 17. juli 2003 Oi, innlegget mitt ble fanget opp raskt. Gjorde et par små edits jeg håpet jeg skulle slippe unna med : ) Men den versjonen du prøvde burde være helt grei, selv om det er litt usikkert å begrense strengene dine til 10 tegn. Hva mener du med at alle argumentene blir likt det siste forresten? Det med at param blir allokert på stack istedenfor heap (med new)? Det har ikke noe å si, ikke noe point i å overdrive bruken av dynamisk allokering. Edit: Hm, det var noe galt ja. Merkelig, mente at regelen var at alle variabler skulle allokeres på nytt for en slik løkke, kanskje optimalisering? Jaja, gjort om på det i alle fall, slik at hver streng er unik. Lenke til kommentar
GNUfan Skrevet 17. juli 2003 Forfatter Del Skrevet 17. juli 2003 Det jeg mente er at når jeg kjører ls med -la og --color som argumenter, så blir det ls --color --color (sjekka med metoden jeg skrev over.) Lenke til kommentar
GNUfan Skrevet 17. juli 2003 Forfatter Del Skrevet 17. juli 2003 Ok. Nå funker det fint, men jeg husker at når jeg lagde den første versjonen trengte jeg bare å include unistd.h og iostream. Menmen, learning purpose, hadde sikkert godt av å mekke det en gang til Lenke til kommentar
A_N_K Skrevet 17. juli 2003 Del Skrevet 17. juli 2003 Jeg la til et par ting, f.eks string er en fordel når du skal hente input fra tastaturet. Da slipper du å vite hvor mye plass du trenger, ikke vær redd for å bruke biblioteker Lenke til kommentar
GNUfan Skrevet 17. juli 2003 Forfatter Del Skrevet 17. juli 2003 Nå har jeg skrevet hele greia på nytt(igjen learning purpose) , både med string og char*. Har jeg rett når jeg sier at templaten const_cast<char *> gjør en const char* om til char*? Og at string.c_str returnerer en const char* av stringen? Og at strdup returnerer minneverdien til en duplisert versjon av innputt-strengen? /me håper han har gjort leksa si Lenke til kommentar
GNUfan Skrevet 17. juli 2003 Forfatter Del Skrevet 17. juli 2003 BTW har jeg nå klart (stort ) å lage samme program UTEN å spørre om antall argumenter. Eneste minus er at man ikke kan ha mer enn 10 objekter i args; altså 8 parametere maks. #include <iostream> #include <unistd.h> using namespace std; int main() { char** args; string program; cout<<"Hvilket program vil du kjøre? "; cin>>program; // cout<<"Hvor mange argumenter kommer du med nå? "; // cin>>antallargs; args = new char *[10]; for(int i = 1; i<=10; i++) { args[i]=NULL; } args[0]=const_cast<char *>(program.c_str()); string temp; int antallarg; for( int i = 1;1; ) { cout<<"Skriv inn argument nr. " << i << " " <<" Avslutt med 'stop'"; cin >> temp; if( temp == "stop") { args[i] = NULL; break; } args[i]=strdup(temp.c_str()); antallarg = i++; } args[antallarg+1]=NULL; execvp(args[0], args); for( int i = 0; i<=antallarg; i++) { free(args[i]); } delete [] args; } Jeg er flink Lenke til kommentar
A_N_K Skrevet 17. juli 2003 Del Skrevet 17. juli 2003 Nå har jeg skrevet hele greia på nytt(igjen learning purpose) , både med string og char*. Har jeg rett når jeg sier at templaten const_cast<char *> gjør en const char* om til char*? Og at string.c_str returnerer en const char* av stringen? Og at strdup returnerer minneverdien til en duplisert versjon av innputt-strengen? /me håper han har gjort leksa si Ser ut som du har rett. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå