c++ typedef Array
-
Hallo zusammen, ich möchte ein char 2d. Array mit Werten füllen allerdings funktioniert es nicht.
typedef struct retval { char** arrayRef; int zeile; int spalte; }RETVAL; // Gibt ein 2D-Array in der Struktur zurück __declspec(dllexport) RETVAL* __stdcall get2darray() { retval test; test.arrayRef = (char**) new const char*[2][2]; test.arrayRef[1][1] = "test";//funktioniert leider nicht test.count=1; test.lLen = 1; return &test; }
So test.arrayRef[1][1] = "test"; müsste es doch funktionieren. Oder habe ich hier ein Denkfehler
-
Was soll denn das bitteschoen werden?
Willst du jetzt ein 2d-Char-Area oder ein 2d-Char*-Area? Allgemein sieht mir dein Loesungsansatz eher nach C mit new aus. Warum keinen Vector o.ae.?
-
Es ist ein Dll und ich kann leider da kein vektor verwenden, da ich das Ergebnis in VB.Net noch benutzen möchte.
-
Irgendwie kommt mir das trotzdem spanisch vor. Willst du jetzt n*n Chars oder n*n C-Strings?
-
Ich möchte ein 2d Strin Array, die ich mit Werten aus einer DB Abfrage füllen möchte (Es sollen nicht einzelen Buchstaben sondern Wörter gespeichert werden)
-
Du kannst mittels std::vector::data() oder &std::vector[0] and den internen char buffer gelangen. Bei mir hat sich eingebuergert, einen linearen Buffer zu allokieren und die konkrete 2D-Position an mittels width und height auszurechnen.
test.arrayRef[1][1] = "test";
Nein, das funktioniert nicht. Jede eckiges Klammerpaar nimmt die ein * . D.h. aus char** mit [][] wird char. Du kannst keinen char* ("test", c-String) einem char zuweisen.
-
Nein, das funktioniert nicht. Jede eckiges Klammerpaar nimmt die ein * . D.h. aus char** mit [][] wird char. Du kannst keinen char* ("test", c-String) einem char zuweisen.
und wie soll ich es dann machen. Mein Ziel ist es ein 2d Array in dem Werte stehen
-
test.arrayRef = (char**) new const char*[2][2];
wird dich auch nicht glücklich machen.
Das Ergebnis des new ist ein const char*()[2]. Also ein Zeiger auf ein Array (aus const char), kein Zeiger auf einen Zeiger.
-
Bin ich der einzige, den es stört, dass er...
...in einer Funktion sowohl den Struktur- als auch den umdefinierten Namen verwendet, also beides mischt?
...in nicht existente Felder (count,lLen) schreiben möchte?
...die Referenz lokalen Speichers zurückgibt?
Um nur ein paar Dinge zu nennen.
-
Meint der TE so etwas?
test.h:#ifndef TEST_H #define TEST_H #ifdef __cplusplus extern "C"{ #endif typedef struct { int argc; char **argv; } c_style_handle; c_style_handle new_handle(); void get2darray(c_style_handle *h); void free_handle(c_style_handle *h); #ifdef __cplusplus } #endif #endif
test.cpp:
#include <cstring> #include "test.h" c_style_handle new_handle() { c_style_handle h; h.argc = 0; h.argv = 0; return h; } void get2darray(c_style_handle *h) { if (h->argc) { free_handle(h); } h->argc = 3; h->argv = new char*[4]; h->argv[0] = new char[6]; std::strcpy(h->argv[0], "Hello"); h->argv[1] = new char[6]; std::strcpy(h->argv[1], "World"); h->argv[2] = new char[2]; std::strcpy(h->argv[2], "!"); h->argv[3] = 0; } void free_handle(c_style_handle *h) { if (h->argc) { for (int i = 0; i < h->argc; ++i) delete[] h->argv[i]; delete[] h->argv; h->argc = 0; } }
test.c (hier C99, aber das ist nicht essentiell):
#include <stdio.h> #include "test.h" int main() { c_style_handle h = new_handle(); get2darray(&h); for (int i = 0; i < h.argc; ++i) { fputs(h.argv[i], stdout); putchar(' '); } free_handle(&h); }