C-Interface char oder Pointer als Übergabeparameter



  • HI,

    ok, hat du vielleicht ein kleines Codebeispiel!?:-)

    Danke



  • Na ja, ein normaler char*-Parameter halt:

    void MeineFunktion(char *pMeinStringParameter);
    

    Oder wofür genau willst du ein Beispiel?



  • Hi,

    erst mal danke für die Antwort!

    Mein Fall:

    AnsiString neinString = "Das will ich übergeben!";
    
    //Wandle ansiString in char-Pointer um
    //??
    charpointer keineAhnung = kovertvonAnsiString(neinString );//??
    //??
    
    //C-Funktion aufrufen
    //??
    bool meineAntwort = C_FUnktion(charpointer);
    //??
    Label->Caption = kovertzuAnsiString(charpointer);
    

    Habe den Ablauf mal in Worten aufgeschrieben!

    Habe das mit den Pointern noch nicht so raus!

    Wäre super wenn ihr mir ein COdebeispiel zu folgendem Ablauf geben könntet, damit ich mir das anschauen und kapieren kann!

    Danke



  • Hallo,

    mal etwas vereinfacht (innerhalb einer Form):

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString uebergabe = "Übergabestring";
    bool antwort         = C_Function(uebergabe.c_str());
    if (antwort)
            ShowMessage("Das hat geklappt");
    }
    //---------------------------------------------------------------------------
    bool TForm1::C_Function(char *value)
    {
            if (AnsiString(value) == "Übergabestring")
                    return true;
            else
                    return false;
    }
    

    LG, Micha



  • HI,

    schon mal danke für die Antwort.

    Noch eine Frage:

    Wie kann ich jetzt noch einen Andresspointer übergeben?

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString uebergabe = "Übergabestring";
    AnsiString rueckgabe;
    bool antwort         = C_Function(uebergabe.c_str(),rueckgabe.c_str());
    if (antwort)
            ShowMessage("Das hat geklappt");
            Label->Caption = rueckgabe;
    }
    //---------------------------------------------------------------------------
    bool TForm1::C_Function(char *value, char &rueckgabe)//Adresspointer?????
    {
            if (AnsiString(value) == "Übergabestring")
            {
                    rueckgabe = "Hier hast du den Antwortstring";
                    //KOnvertierung zu char??
                    return true;
    
            }
            else
                    return false;
    }
    

    Danke



  • Hallo,

    wieso nicht einfach:

    void __fastcall TForm1::Button1Click(TObject *Sender) 
    { 
    AnsiString uebergabe = "Übergabestring"; 
    Label->Caption = AnsiString(C_Function(uebergabe.c_str())); 
    } 
    //--------------------------------------------------------------------------- 
    char *TForm1::C_Function(char *value)
    { 
            char *rueckgabe = "";
            if (AnsiString(value) == "Übergabestring") 
            { 
                    rueckgabe = "Hier hast du den Antwortstring"; 
                    return rueckgabe; 
            } 
    
            return rueckgabe; 
    }
    

    LG, Micha



  • HI,

    die Lösung wäre super, aber die vorgegebne Struktur erlaubt dies leider nicht!
    Muss mich an einen vorgegebenen Standard halten und da muss ich es leider über einen Pointer machen!

    Wie mach ich das?

    Danke



  • Vielleicht eher so.

    const char* TForm1::C_Function(char *value)
    {
            if (AnsiString(value) == "Übergabestring")
                    return "Hier hast du den Antwortstring";
            return "";
    }
    

    PS. Du machst das doch hier mit einem Pointer. Wo ist das Problem?



  • HI,

    ok, so kann ich es machen!

    Jetzt kommt bloß der Fehler:
    Konvertierung von AnsiString nach char* nicht möglich beim return-Value!

    extern "C" __declspec (dllexport) char* SM_writeParam(char *geraet, char *befehl, char *wert)
    {
        AnsiString uebefehl = (AnsiString)befehl;
        AnsiString ueantwort;
        AnsiString uewert = (AnsiString)wert;
    
        //Geräteunterscheidung zur Demo
        if((AnsiString)geraet == "G1")
          COMU->WritePositionCSV(uebefehl, ueantwort, 0);
        else if((AnsiString)geraet == "G2")
          COMU->WritePosition(uebefehl,ueantwort,uewert);
    
        return ueantwort;
    }
    

    Wie kann ich den String wieder in ein Char wandeln?

    Danke



  • In deinem Fall mußt du wohl dynamisch ein char Array erstellen und dann deinen AnsiString da rein kopieren. Allerdings mußt du auch dafür sorgen, dass dieses Array wieder gelöscht wird weil das ja nicht automatisch passiert.

    extern "C" __declspec (dllexport) char* SM_writeParam(char *geraet, char *befehl, char *wert)
    {
        AnsiString uebefehl = befehl;
        AnsiString ueantwort;
        AnsiString uewert = wert;
    
        //Geräteunterscheidung zur Demo
        if((AnsiString)geraet == "G1")
          COMU->WritePositionCSV(uebefehl, ueantwort, 0);
        else if((AnsiString)geraet == "G2")
          COMU->WritePosition(uebefehl,ueantwort,uewert);
        char* ret = new char[ueantwort.Lenght() + 1];
        strcpy(ret, ueantwort.c_str());
        return ret;
    }
    

Anmelden zum Antworten