2-dim char Array: printf geht nicht



  • Hallo,
    ich habe ein problem den Inhalt von einem 2 dimensionalen char array auszugeben. Obwohl ich eigentlich dachte, dass das Problem banal sei,
    habe ich bisher keine direkte Loesung gefunden und bekomme immer wieder
    folgende Fehlermeldung (gcc, ANSI C, kein C99 aktiviert):

    error: invalid use of array with unspecified bounds

    Hier ein Demo-code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define ELEMENT_COUNT 10
    #define ELEMENT_LENGTH 8
    
    void output(char[][]);
    
    // ...
    
        char str[ELEMENT_COUNT][ELEMENT_LENGTH] = {
       	  "str 0", "str 1", "str 2", "str 3", "str 4", "str 5", "str 6", "str 7", "str 8", "str 9" };
        output(str);
    
    // ...
    
    void output(char arr[][])
    {
        // in der folgenden Zeile tritt der Error auf
        printf("first element: %s\n", arr[0]);
    };
    

    Was mache ich falsch? Ich muss doch kein separates '\0' setzen, wenn ich per " char arrays festlege. Wenn ich als Parameter angebe, dass es sich um ein begrenztes Array handelt mit arr[][] duerfte er den Parameter doch gar nicht annehmen. Wie bringe ich printf dazu den String auszugeben - %s funktioniert sonst auch.

    Danke im voraus! 🙂



  • Wenn du Arrays übergibst, darf nur die äußerste Dimension variabel sein - die inneren Dimensionen mußt du beim Compilen vorgeben:

    void output(char arr[][ELEMENT_LENGTH]);
    


  • Ich habe nun in der Deklaration und der Definition die jeweilige Laenge der einzel-Elemente, "ELEMENT_LENGTH", entsprechend angegeben. Es kompiliert anstandslos durch. Danke.

    Zusaetzliche Frage:
    Kann ich denn nicht auch eine Funktion "output()" mit variabler Laenge eines char Array Parameters definieren und dann die Laenge erst im Aufruf "irgendwie" mit uebergeben? Oder ist diese Arraylaenge IMMER an die Definition einer Funktion fest gebunden, wenn ich nicht mit einem char* arbeiten will?

    Also

    void output(char arr[][]);
    

    und dann zu obigem Beispiel einen Aufruf der Art:

    output(str[][ELEMENT_LENGTH]);
    

    Irgendwie geht das nicht - gibt's da ne Moeglichkeit oder nicht?



  • void output(char *arr[])
    {
        printf("first element: %s\n", arr[0]);
    } 
    ...
    char *str[] = {"str 0", "str 1", "str 2", "str 3", "str 4", "str 5", "str 6", "str 7", "str 8", "str 9" };
    output(str);   
    ...
    

    🙂



  • Die Größe der einzelnen Unter-Arrays ist fest vorgegeben. Aber du kannst dir auch ein Array von Zeigern anlegen, die jeweils auf extra liegende Datenblöcke verweisen.

    (schau dir mal die C++ FAQ zum Thema "dynamische mehrdimensionale Arrays an - mit Ausnahme von Variante 4 sind alle Lösungen auch C-tauglich)



  • Gut, Danke. Das es mit Zeigern geht, hab ich schon gewusst. Ich wollte nur mal sicher gehen, dass DER WEG fuer "dynamische" Dinge derart NUR ueber Zeiger laeuft und es dennoch mal mit char[] ausdruecken ohne * versuchen.

    Nun habe ich darin wieder etwas mehr Sicherheit gewonnen. Danke!!!
    😉


Anmelden zum Antworten