Gå til innhold

Problem med array av pekerstrenger i c++


Anbefalte innlegg

Skrevet


#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?

Videoannonse
Annonse
Skrevet

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).

Skrevet

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);





}

Skrevet

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;

}

}

Skrevet

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; 

}

Skrevet
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...)

Skrevet

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.

Skrevet

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.)

Skrevet

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

Skrevet

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

Skrevet

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

Skrevet

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

Skrevet
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.

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...