2-D Array, Übergabe Probleme mit Nullterminator



  • Hallo

    Ich wollte folgendes wissen.
    Ich habe zwei 2-D Tabellen und 2 1D Tabellen:

    char tabelle1[50[16];
    char tabelle2[20]11];
    
    char extract1[16];
    char extract2[11];
    

    Im Moment habe ich zwei getrennte funktion, um daten von der tabelle1 in die tabelle extract1 zu setzen und eine funktion für die daten von tabelle2 in die tabelle extract2 zu kopieren.
    Das finde ich aber nicht schön, möchte gerne nur eine Funktion dafür haben.

    Das erste Problem ist schon, dass in den jeweiligen Funktionen im Header die zweite Größe der Arrays definiert sein soll..
    Also:

     void func1(char array[][16], uint8_t Index]);
    
    void func2(char array[][11], uint8_t Index]);
    

    Gibt es eine Möglichkeit, außer die arrays gleicher Größe zu setzen, nur eine einzelne Funktion zu benutzen? Sonst knallt es schon bei der Übergabe..

    Vielen vielen Dank



  • @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Im Moment habe ich zwei getrennte funktion, um daten von der tabelle1 in die tabelle extract1 zu setzen und eine funktion für die daten von tabelle2 in die tabelle extract2 zu kopieren.

    Das hört sich - zusammen mit Deinen Funktionsdeklarationen - so an, als wäre extract1 und extract2 global? Tu das nicht.

    Funktionen zeigen.

    @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Das erste Problem ist schon, dass in den jeweiligen Funktionen im Header die zweite Größe der Arrays definiert sein soll..

    Warum ist dein Index ein uint8_t?

    @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Gibt es eine Möglichkeit, außer die arrays gleicher Größe zu setzen, nur eine einzelne Funktion zu benutzen?

    Ja:

    void func(char **data, size_t size, size_t some_strange_Index);



  • Hallo Swordfish,

    Oh sorry, die kommen natürlich mit als Parameter in die Funktion. Global sind die also nicht.

      void func1(char array[][16], char extracted, uint8_t Index]); 
    

    Mein Index, also welcher gerade die Stelle im Array angibt wo die Daten ausgelesen werden soll, geht bis max 255, daher ein uint8_t Datentyp.

    Im Moment sieht das so aus:

      void func1(char array[][16], char extracted, uint8_t Index]){
      uint8_t i;
      // zeichenketten sind mit \0 terminiert
      for(i=0;i<strlen(array[Index]);i++){
         extracted[i] = array[Index][i];
      }
    }
    

    Wenn ich einen Double Pointer mache, sagt der Compiler mir beim übergeben dass die Pointer nicht kompatibel sind.



  • @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Im Moment sieht das so aus:

    Das glaube ich Dir nicht.

    @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Wenn ich einen Double Pointer mache, sagt der Compiler mir beim übergeben dass die Pointer nicht kompatibel sind.

    Dann machst Du was falsch, was aber keiner sehen kann, weil Du nicht den echten Code (auch den Aufruf) zeigst (copy + paste).

    Du suchst wahrscheinlich strcpy, eg.

    strcpy(extract1, tabelle1[42]);
    strcpy(extract2, tabelle2[2]);
    


  • Warum glaubst du mir das nicht? Es funktioniert, ist halt nur wie gesagt doof dass ich im Moment zwei solcher Funktionen benötige.

    So wie du es vorgeschlagen hast:

    void func(char **array, char extracted[], uint8_t Index){
        // Im moment steht noch nichts drin
    }
    

    Aufruf:

    func(tabelle1, extract1, 5);
    

    Meldung: warning:passing argument 1 of 'func' from incompatible pointer type
    note: expected 'char **' but argument is of type 'char (*)[16]'

    oder:

    func(tabelle1[5], extract1, 5);
    

    note: expected 'char **' but argument is of type 'char *'

    oder:

    func(&tabelle1[5], extract1, 5);
    

    note: expected 'char **' but argument is of type 'char (*)[16]'



  • @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Warum glaubst du mir das nicht?

    Weil Du in Deinem Code sicher nicht

    void func1(char array[][16], char extracted, uint8_t Index])
    

    hast, wie Du oben geschrieben hast.



  • @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    So wie du es vorgeschlagen hast

    Sorry, hab auch Quatsch erzählt. Seit C99 geht es so:

    void func(size_t length, char array[][length], char *extracted, size_t Index)
    

    aber wie gesagt:

    @swordfish sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Du suchst wahrscheinlich strcpy, eg.

    strcpy(extract1, tabelle1[42]);
    strcpy(extract2, tabelle2[2]);
    


  • Ja genau, für die Tabelle extracted muss sogar kein stern stehen, da die übergabe der tabelle ja schon eine Adresse ist.

    Danke für die Lösung mit strcpy, aber das gefällt mir nicht. Wollte das mit den Tabellen machen, weißt du was ich falsch mache wenn ich das mit den Doppel Zeiger machen will?



  • @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Ja genau, für die Tabelle extracted muss sogar kein stern stehen, da die übergabe der tabelle ja schon eine Adresse ist.

    void foo(char bar[]);
    

    und

    void foo(char *bar);
    

    ist exakt dasselbe.

    @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Danke für die Lösung mit strcpy, aber das gefällt mir nicht.

    Was gefällt Dir daran nicht? Was Du vorhast ist doch bloß unnötig komplifiziert!?

    @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    Wollte das mit den Tabellen machen, weißt du was ich falsch mache wenn ich das mit den Doppel Zeiger machen will?

    Es geht nicht, weil ein char[m][n] nicht in einen char ** konvertierbar ist. Wie gesagt, ich habe Quatsch geschrieben.

    Außerdem, wenn Du sowieso nur auf array[Index][...] zugreifen willst, wie in

    @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator:

    void func1(char array[][16], char extracted, uint8_t Index])
    {
      uint8_t i;
      // zeichenketten sind mit \0 terminiert
      for(i=0; i < strlen(array[Index]); i++) {
         extracted[i] = array[Index][i];
      }
    }
    

    angedeutet, warum über gibst Du nicht gleich tabelle1[Index] bzw. tabelle2[Index]`:

    void func(char *array, char *extracted)
    {
    	/* ... */
    }
    
    int main(void)
    {
    	char tabelle1[50][16] = { "foo", "bar", "baz" /* , ... */ };
    	char extract1[16];
    
    	func(tabelle1[42], extract1);
    }
    

    was dann aber wieder auf strcpy() hinausläuft:

    #include <string.h>
    
    int main(void)
    {
    	char tabelle1[50][16] = { "foo", "bar", "baz" /* , ... */ };
    	char extract1[16];
    
    	strcpy(extract1, tabelle1[42]);
    }
    

    btw solltest Du auch nicht bei jedem Schleifendurchlauf strlen() aufrufen, wenn sich array[Index] nicht ändert, sondern das Ergebnis zwischenspeichern, oder besser gleich klassisch kopieren (while(*dst++ = *src++);) wenn Du schon nicht strcpy() nehmen willst.



  • This post is deleted!


  • strcpy ist hier eine schlechte Wahl, sie geht von Strings als Tabelleninhalt aus und überhaupt von initialisierten Tabelleninhalten.



  • @wutz Nichts anderes tut aber seine Funktion func1() die er oben gezeigt hat.



  • @swordfish
    Das hindert dich nicht, den Frager auf sein Fehldesign und Fehlimplementierung hinzuweisen bzgl. UB usw.

    Hier mal eine Variante ohne strcpy und auch ohne memcpy:

    void f(size_t n, const char a[][n], char *x, int i)
    {
       struct {char m[n];} *f = (void*)a[i], *t = (void*)x;
       *t = *f;
    }
    
    enum {N=20};
    int main()
    {
       char a[][N]={"null","eins","zwei","drei"};
       char x0[N]="",x1[N]="",x2[N]="",x3[N]="";
       puts("=====");
       puts(x0);
       puts(x1);
       puts(x2);
       puts(x3);
       puts("=====");
       
       f(N,a,x1,1);
       f(N,a,x2,2);
    
       puts(x0);
       puts(x1);
       puts(x2);
       puts(x3);
       puts("=====");
    	
       return 0;
    }
    

    https://ideone.com/ejJzaE

    Falls sich jemand berufen fühlt, mit mir hier über UB oder nicht zu diskutieren, kann er gerne mal vorlegen.



  • @Wutz Was ist daran

    @newinc sagte in 2-D Array, Übergabe Probleme mit Nullterminator sinngemäß:

    void func1(char array[][16], char *extracted, uint8_t Index){
      uint8_t i;
      // zeichenketten sind mit \0 terminiert
      for(i=0;i<strlen(array[Index]);i++){
         extracted[i] = array[Index][i];
      }
    }
    

    UB?



  • strcpy ist hier eine schlechte Wahl, sie geht von Strings als Tabelleninhalt aus und überhaupt von initialisierten Tabelleninhalten.



  • @wutz Das beantwortet nicht meine Frage.



  • @swordfish
    Nerv nicht rum sondern lies meine Antworten.



  • @wutz Arrogant und herablassend wie wir Dich kennen. Einfach herrlich, Wutzi.



  • @Wutz
    Ja sieht sehr toll aus. Ist nur leider komplett unverständlich und wurde von dir auch nicht erklärt, und daher ist das am Ziel vorbei, meinst du nicht?


Log in to reply