problem mit char***



  • Hallo Leute,
    Habe folgendes Problem:

    void fktName(char*** oValues) {

    oValues = ....; 😡
    }

    Habe alles ausprobiert um oValues sinnvoll einen Wert zuzuweisen.
    Bin aber mit meinem Latein am Ende.
    Ich habe nicht die Möglichkeit die Funktion zu aendern, also einen anderen Parameter zu benutzen.

    Vielen Dank



  • Was soll die Funktion machen?



  • sie er es meint glaub sowas

    char huhu[] =  "h";
    char *mattliebtjunix      = huhu;
    char **holahitidiewaldfee = &mattliebtjunix;
    char ***derboesewolf      = &holahitidiewaldfee;
    


  • Diese Funktion kommt aus einer API. Nur der Funktionsrumpf ist
    fest vorgegeben und das Programm setzt diesen Wert den man dort
    setzt, als default Wert im Fenster.

    Habe alles schon probiert, erzeuge immer einen Core Dump .
    (Ich entwickle auf AIX). wahrscheinlich muss man sich den Speicher
    erst hohlen. Der Aufrufer der Funktion macht dann das free.

    Ich verstehe auch nicht was char*** ist. ein p auf p auf p ???



  • siehst du doch an meinem qualitativ hochwertigen sourcecode 🙄



  • Hi 1ntrud0r
    vielen dank für deine Hilfe, aber ...

    Core dump wird immer noch erzeugt: hier mal die orginalfunktion.
    Das Programm (in dem Falle VPM) ruft die Funktion bei bestimmten
    user actions auf.

    void CATDMUsrMethod::GetInputListOfValues(const char* iCatab,
    					  const char* iAttribute,
    					  int* oAuthorized, 
    					  int* oNbValues, char*** oValues)
    // *oAuthorized=-1; //Help values without default value
    // *oAuthorized=1;  //Authorized values without default value
    // *oAuthorized=-2; //Help values with first value as default value
    // *oAuthorized=2;  //Authorized values with first value as default value
    {
    	static char *partNumber = "EMIL";
    	static char **partNumbers;
    
      //--------------------------
      //Your code !!
    
      if(getenv("TRACEUSRMETHOD"))
        {
        if ( strcmp(iAttribute, "S_PART_NUMBER") == 0 ) {
    
            // set oValues
            // 
            *oAuthorized=2;
    	*oNbValues = 1;
    
             char var1[] = "EMIL";
             char *p1 = var1;
             char **p2 = &p1;
             char ***p3 = &p2;
    
             oValues = p3;
          }
        }
    }
    

    irgentwie versucht der Aufrufer da ein free auf oValues zu machen. Wie du siehst hab ich mich an deinen Code orientiert.



  • Dein Fehler is das du in der Funktion GetInputListOfValues die Variable

    char var1[] = "EMIL";
    

    anlegst. Diese Variable wird auf dem Stack angelegt und ist mit dem Ende der Funktion GetInputListOfValues
    wieder weg. Damit referenuzierst du als Aufruferer irgendwo wild in irgeneinen Speicher und somit ist der
    CoreDump da und berechtigt.

    Folgende Frage. An der Stelle an der die Funkton GetInputListOfValues aufgerufen wird ist da schon Speicher
    für char*** oValues allociert? Falls ja musst du nur den Wert mit strcpy zuweisen

    Falls nein must du mit malloc in C oder new in C++ entsprechend Speicher allokieren und danach den Wert mit strcpy zuweisen.

    Viel Spaß


Anmelden zum Antworten