wie kann ich von char* nach char (*)[40] konvertieren ?



  • ich rufe ne externe dll funktion auf die erwartet einen char(*)[40] parameter.



  • Hallo

    Dann mach dir doch mal klar was die Typangaben bedeuten
    char* = Pointer auf (NULL-terminierte) Zeichenkette aus char
    char(*)[40] = Array aus 40 Elementen, wobei die Elemente vom Typ Pointer auf (NULL-terminierte) Zeichenkette aus char sind

    Damit ergibt sich folgende Möglichkeit

    char* text = "...";
    char(*)[40] texte;
    texte[0] = text; // Ertes Element von texte wird mit text belegt
    

    Ob das allerdings im Sinne der DLL steht weiß ich nicht. Normalerweise erwartet man auch 40 sinnvolle Elemente, wenn ein Array mit genau 40 Elementen erwartet wird. Kann es sein das du den Ausgangs-String noch auseinandernehmen mußt?

    bis bald
    akari



  • typedef char		SoRecId[40];	// Record-ID
    typedef char		SoStr40[40];	// 40-Zeichen-String
    typedef char		SoStr256[256];	// 256-Zeichen-String
    typedef long		SoHandle;	// Handle
    typedef long		SoBool;	        // Boolean
    typedef long            SoRetCode;      // Return-Code
    
    #pragma pack(push,inc1)
    #pragma pack(1)				/* byte alignment */
    struct TSostaDbData
    {
            SoStr40		m_dbKey;
    	short		m_type;
    	short		m_bIsSearch;
    	SoStr256	m_data;
    } *Rekords;
    #pragma pack(pop,inc1)			/* restore previous packing alignment */
    
    typedef long (_stdcall * APROSDBSUCHE)(SoRecId*      pSysID,
                                              SoBool        IsStart,
                                              SoRecId*      pSatzId,
                                              TSostaDbData* pSearchData,
                                              long          lNumOfRecords);
    
    SoRecId SysID;
    

    ich möchte die SysID übergeben;

    die funktion erwartet von mir einen string der 40 zeichenlang ist. nur so wie ich ihn übergebe klappts nicht:

    strcpy(SysID,"DB"); hustet dir mir einen.
    
    Ergebcode=AllgDBSuche(SysID,Iststart,SatzID,&Rekords,MAX_REKORDS);
    


  • Hallo

    Da ist schon das Mißverständnis. Du willst char* in char[40] umwandeln.
    Das sollte aber ohne Probleme gehen, solange die Funktion in den Parameter nichts reichschreibt um Werte zurückzugeben

    int func(char value[40] )
    {
      std::cout << value << std::endl;
      return 0;
    };
    
    char* test = "abc";
    func(test);
    

    Wenn du allerdings über diesen Parameter einen Wert zurückbekommst, must du einen extra Buffer vom Typ verwenden, wo du mit der Funktion strncpy den Inhalt reinkopierst.

    Nitchsdestotrotz gehört das ins Ansi-C Forum.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Sorry akari, aber das will er nicht. Er will einen Pointer auf ein char[40] übergeben.

    Ergebcode=AllgDBSuche(&SysID,Iststart,SatzID,&Rekords,MAX_REKORDS);
    


  • nostre schrieb:

    hallo,

    wie kann ich von char * nach char (*)[40] konvertieren ?

    hat jemand ne idee ?

    char(*)[40] ist ein Cast-Ausdruck (Zeiger auf ein zweidimensionales Array - (2. Dimension = 40))

    int main()
    {
        char a[800];
        char (*pa)[40] = (char(*)[40])a;
        // Jetzt kann ich auf das eindimensionale char a[800] Array 
        // zweidimensional zugreifen als sei es mit char pa[20][40] deklariert worden.
    
        pa[3][10] = 'A';
        char test = a[3*40+10]; // test == a[3*40+10] == pa[3][10]; 
        return 0;
    }
    


  • hmm... die funktion erwartet nur einen 40 zeichenlangen arraystring, dieser muss 40 zeichen lang sein und nullterminiert.

    char buff[40];
    
    strcpy(buff,"dbname");
    

    nimmt er nicht. da kommt dann die fehlermeldung mit dem char * nach char (*)[40] kann nicht konvertiert werden.

    hier nochmal die typedef:

    typedef char        SoRecId[40];    // Record-ID 
    
    typedef long (_stdcall * APROSDBSUCHE)(SoRecId*      pSysID, 
                                              SoBool        IsStart, 
                                              SoRecId*      pSatzId, 
                                              TSostaDbData* pSearchData, 
                                              long          lNumOfRecords);
    


  • Daß der Compiler die strcpy-Konstruktion nicht schluckt, wage ich zu bezweifeln.

    Was "deine" Funktion angeht - die erwartet einen Zeiger auf ein char-Array, also mußt du ihr genau das übergeben:

    char SysId[40],SatzId[40];
    ...
    APROSDBSUCHE(&SysId,true,&SatzID,...);
    

    (PS: Nur um Verwissungen zu vermeiden: Wie heißt denn diese Funktion?)



  • CStoll schrieb:

    Daß der Compiler die strcpy-Konstruktion nicht schluckt, wage ich zu bezweifeln.

    Was "deine" Funktion angeht - die erwartet einen Zeiger auf ein char-Array, also mußt du ihr genau das übergeben:

    char SysId[40],SatzId[40];
    ...
    APROSDBSUCHE(&SysId,true,&SatzID,...);
    

    (PS: Nur um Verwissungen zu vermeiden: Wie heißt denn diese Funktion?)

    du hast mir die lösung gezeigt, habe mich von den compilermeldungen dull machen lassen.

    delphi:
    type
      umw40_typ   = packed array[1..40] of char ;
      umw256_typ  = packed array[1..256] of char ;
      SatzIDTyp   = packed array[1..40] of char ;
    

    das gab der delphi coder mir, so sollte ich die varis definieren,wenn ich es mit
    den variabeln übergeben wollte klappte es nicht:

    typedef char		SoRecId[40];	// Record-ID
    typedef char		SoStr256[256];	// 256-Zeichen-String
    typedef char		SoStr40[40];	// 40-Zeichen-String
    
    SoRecId SysID;
    SoRecId SatzID;
    

    simpel version einfach so übergeben ohne seine declaration wie oben:

    char sysid[40];
     char satzid[40];
    
     strcpy(sysid,Edit2->Text.c_str());
    
     Ergebcode=AllgDBSuche(&sysid,Iststart,&satzid,Rekords,MAX_REKORDS);
    

    ich musste den zugriff von delphi source complett in c++ nachbilden.

    danke @all, super hilfe jedesmal hier.


Anmelden zum Antworten