Gå til innhold

Problem med array av pekerstrenger i c++


Anbefalte innlegg


#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
Videoannonse
Annonse

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

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

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
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!!! :D (sånn reint bortsett fra at med mer en ett argument blir alle argumentene lik det siste...)

Lenke til kommentar

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

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 :D

Lenke til kommentar

BTW har jeg nå klart (stort :D) å 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 :D

Lenke til kommentar
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 :D

Ser ut som du har rett.
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...