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


  • Mod

    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.


  • Mod

    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);
    }
    

Anmelden zum Antworten