Problem mit Array Pointer



  • 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++; 
      }
    

Anmelden zum Antworten