wie kann ich von char* nach char (*)[40] konvertieren ?
-
hallo,
wie kann ich von char * nach char (*)[40] konvertieren ?
hat jemand ne idee ?
-
Hallo
Gegenfrage : Wozu brauchst du das überhaupt? Wenn du dir den Unterschied zwischen den beiden Typen überlegst wirst du auch feststellen wie du "konvertieren" must. Dazu gehört natürlich das du überhaupt weißt was die Typen jeweils bedeuten.
bis bald
akari
-
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 sindDamit 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ückzugebenint 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.