Problem mit Array Pointer



  • Moin,

    habe eine problem mit ponter QueryData welcher auf einen Array zeigt.
    Nur wird wenn ich drauf zugreife ab der hälfte des String anscheinend nicht mehr richtig zugeweisen leider habe ich den Fehler noch nicht gefunden.
    Das merkwürdige ist auch wenn ich innerhalb der Funktion urlencode drauf zugreife habe ich dieses phenomän nicht.
    Vllt kann mir hier jemand weiterhelfen.

    char ***QueryData;
    
    void urlencode(const char *input){
      if(input==0){
        return;
      }
      char* res=strtok((char*)input,"&");
      QueryData = new char**[strlen(res)+1];
      int i = 0;
      while( res != 0 && i < (sizeof(res)/sizeof(int))) {
        QueryData[i]= new char*[2];
        QueryData[i][0]=strtok(res,"=");
        QueryData[i][1]=strtok(NULL,"\0");
        i++;
      }
      if(QueryData[0][0]!=0){
        std::cout << QueryData[0][0] <<std::endl;
      }
    }
    


  • Tuxist schrieb:

    char ***QueryData;
    

    Das habe ich jetzt seit Jahren nicht mehr gesehen. Wahnsinn!!!



  • inwiefern ? das verweist nur auf nen 2 dimensionales array wo ein char array drinne gespeichert wird.



  • Uff.

    char* res=strtok((char*)input,"&");
    

    Da müssten eigentlich sofort sämtliche Alarmglocken schrillen.

    Auch nicht schlecht:

    while( res != 0 && i < (sizeof(res)/sizeof(int)))
    

    (wenn man den Typ von res bedenkt)

    Fazit: Lass die Pointerfummelei.



  • char* res=strtok((char*)input,"&");
    

    type casting von const char* zu char * dar strtok ein char* erwartet und mir den zeiger auf die gewünschten werte zurück gibt. Sehe hier jetzt kein Problem aber lasse mich gerne eines besseren belehren.

    habe ich geprüft gibt mir immer die länge des arrays, aber wenn es eine bessere Lösung gibt würde ich die gerne hören.

    while( res != 0 && i < (sizeof(res)/sizeof(int)))
    


  • sizeof(res)/sizeof(int) = 1
    

    das kann nicht das sein, was du haben willst. Schau dir lieber mal std::vector und std::string an. Dann wird dein Code sicherer (und letztendlich funktionieren)

    greetz KN4CK3R



  • Ich bin verwirrt... res ist doch ein Zeiger, hat damit wahrscheinlich eine Größe von 4Byte, genauso wie wahrscheinlich dein int 4Byte hat. Und 4/4 ergibt ja bekanntlich 1, was deine Schleife nur 1x durchlaufen ließe. Und const wegzucasten ist glaub auch nicht so das wahre. Du musst immer bedenken, nur weil der Compiler nicht meckert heißt das noch lange nicht, dass das Programm funktioniert.



  • Bei mir ist sizeof(res) / sizeof(int) == 2.

    Wenn du einen char const * entgegennimmst, versprichst du, nicht darin herumzuschreiben. Ihn an strtok weiterzureichen, ist dementsprechend keine gute Möglichkeit. Die Funktionalität von strtok scheint dir auch nicht so richtig klar zu sein.

    Überhaupt: Wo wir doch im C++-Forum sind, warum arbeitest du nicht mit std::string und std::stringstream? Damit wäre das viel einfacher zu haben. Wenn ich richtig verstehe, was du vorhast (ungetestet):

    #include <stdexcept>
    #include <sstream>
    #include <string>
    #include <vector>
    #include <utility>
    
    std::vector<std::pair<std::string, std::string> > urldecode(std::string const &url) {
      std::vector<std::pair<std::string, std::string> > result;
      std::istringstream url_stream(url);
      std::string resource;
    
      while(std::getline(url_stream, resource, '&')) {
        std::istringstream resource_stream(resource);
        std::string name, value;
    
        std::getline(resource_stream, name, '=');
        value = resource_stream.str();
    
        if(!resource_stream) { throw std::invalid_argument(resource); }
    
        result.push_back(std::make_pair(name, value));
      }
    
      return result;
    }
    


  • seldon schrieb:

    Bei mir ist sizeof(res) / sizeof(int) == 2.

    Eben. Das kann von System zu System variieren.

    Was ich aber nicht ganz verstehe, ist wozu du diese Zeile

    std::cout << QueryData[0][0] <<std::endl;
    

    brauchst?

    printf ("%c\n",QueryData[0][0]);
    

    hätte es doch auch getan (zumindest syntaktisch) und du wärst vor allem einheitlich bei deinem C geblieben.
    Ich versuch mal deine Frage zu verstehen (an deiner Zeichensetzung solltest du auch arbeiten): wenn du auf dein Array über QueryData nicht über diese Funktion zugreifst (d.h. dann wahrscheinlich in einer anderen Methode), dann passieren komische Dinge, die sich hier im Forum nur schwer beschreiben lassen. Wenn du das aber innerhalb von urlencode() machst, dann läuft dein Programm erwartungsgemäß und das Phänomen tritt nicht auf. Habe ich das richtig entziffert?
    Wenn ja, dann wo ist das problem?



  • das ist nur ein Auszug aus einer klasse später wird noch mal auf Querydata Zugriffen mit einem Get. Ich habe es in C implementiert dar ich die Befürchtung hege das mit einem multiform Datei Upload der Arm zu sehr ins schwitzen kommt und c array schneller sind als stl Container. Der Datei Upload hat ist natürlich in einer anderen Funktion speichert aber im selben array.

    prinft ist natürlich schöner das cout hatte ich aber nur zum Debuggen drinne und fliegt wieder raus.



  • Tuxi schrieb:

    das ist nur ein Auszug aus einer klasse später wird noch mal auf Querydata Zugriffen mit einem Get. Ich habe es in C implementiert dar ich die Befürchtung hege das mit einem multiform Datei Upload der Arm zu sehr ins schwitzen kommt und c array schneller sind als stl Container. Der Datei Upload hat ist natürlich in einer anderen Funktion speichert aber im selben array.

    prinft ist natürlich schöner das cout hatte ich aber nur zum Debuggen drinne und fliegt wieder raus.

    Kommt immer darauf an, wie du die STL-Container verwendest.
    std::vector ist praktisch immer gleichschnell wie deine manuelle Speicherverwaltung.
    Seldons Beispiel hingegen verbrät aber schon massig Rechenzeit.



  • habe die funktion nochmal überarbeitet leider mit dem selben erfolg

    char ***QueryData;
    
    void urlencode(char *input){ 
      if(input==0){
        return;
      }
      char* res=strtok(input,"&");
      QueryData = new char**[strlen(res)+1];
      int i = 0;  
      while( res != 0 && i < strlen(res)/sizeof(int)) {
        QueryData[i]= new char*[2];
        QueryData[i][0]=strtok(res,"=");
        QueryData[i][1]=strtok(NULL,"\0");
        i++;
      }
      if(QueryData[0][0]!=0){
        std::cout << QueryData[0][0] <<std::endl; //ausgabe hier noch korreckt
      }
    }
    

    Das die funktion wie auf den Array zugreife:

    const char getFormdata(const char *name){
      if(QueryData==0){
        return 0;    
      }
      printf(QueryData[0][0]); //debug ausgabe gib wirre zeichen
      printf(QueryData[0][1]); //value wird korrekt ausgegeben 
      for( int pos = 0; pos < sizeof(QueryData)/sizeof(int); pos++ ){
        if(strcmp(QueryData[pos][0],name)==0){
          return QueryData[pos][1];    
        }
      }
      return 0;
    }
    


  • Tuxist schrieb:

    habe die funktion nochmal überarbeitet leider mit dem selben erfolg

    Ich seh keine Überarbeitung. Meine angemeckerten Punkte sind noch drin. Vielleicht hast du die aber auch gar nicht verstanden, aber ... sie sind einfacher zu verstehen als die Benutzung von strtok 😉



  • urlencode(char *input)
    

    ist jetzt nen char *

    while( res != 0 && i < strlen(res)/sizeof(int))
    

    verwende jetzt strlen()

    ?



  • Fast perfekt nur str copy koppiert immer nur erste value ist aber lösbar 😃

    void urlencode(char *input){ 
      if(input==0){
        return;
      }
      char *res;
      int i=0;  
      QueryData = new char**[strlen(input)+1]; 
      while((res=strsep(&input,"&"))!=0) {      
        char *res2;
        while((res2=strsep(&res,"="))!=0) {
          if(res!=0){
            QueryData[i]= new char*[2];
            QueryData[i][0]=new char;
            strcpy(QueryData[i][0],res2);
            QueryData[i][1]=new char;
            strcpy(QueryData[i][1],res);
            printf("%s: %s\n",res2,res);
          }
        }
        i++; 
      }
    

Log in to reply