Stringtabelle als Referenz an eine Funktion übergeben



  • Hello,

    ich möchte in der Programmiersprache C (C99-Standard) eine Stringtabelle als Funktionsparameter (via Referenz) übergeben.

    Meine Stringtabelle:

    char t[2][10] = {"lol", "help"}; // dient als Beispiel
    

    Folgendes habe ich mir schon ergoogelt:

    Ich muss einen Zeiger auf einen Array als Parameter haben und zwar mit fester "Spaltenlänge" (L).

    # define L 10
    void F(char z[][L]);
    

    Und hier ist das Dilemma! Die Spalte lässt sich nur mit einem Platzhalter realisieren (# define).
    Geht das auch irgendwie anders - schöner/besser?

    Mit einer Variablen (int l) oder Konstanten (const int l) schmeißt der Compiler (GCC) Fehlermeldungen um sich.

    Meine selbst erdachte Alternative dazu ist folgendes Codesegment, was mir jedoch nicht wirklich als die Lösung zusagt.
    Da ich der Meinung bin, es muss doch so wie o.g. gehen, nur ohne # define.

    void Funk(char* stringtabelle, int zeile, int spalte)
    {
        int i;
    
        // soll den Umgang mit der Stringtabelle zeigen
        for(i = 0; i < zeile; i++)
        {
            strncpy(stringtabelle, "leer", spalte);
            stringtabelle += spalte;
        }
    }
    

    Vielen Dank im Voraus für hilfreiche Vorschläge/Denkweisungen!



  • Willst du die Strings zur Laufzeit verändern?

    Sonst geht auch

    const char *t[] = {"lol", "help"};
    

    Wie bei argv



  • In C99 geht Folgendes:

    #include <stddef.h>
    #include <stdio.h>
    
    void foo(size_t dim_outer, size_t dim_inner, char data[][dim_inner]) {
      for(size_t i = 0; i < dim_outer; ++i) {
        puts(data[i]);
      }
    }
    
    int main(void) {
      char data[][10] = {
        "foo",
        "bar",
        "baz"
      };
    
      foo(3, 10, data);
    
      return 0;
    }
    


  • DirkB schrieb:

    Willst du die Strings zur Laufzeit verändern?

    Ja, sollen veränderbar sein.

    DirkB schrieb:

    Sonst geht auch

    const char *t[] = {"lol", "help"};
    

    Wie bei argv

    Hm .. wie willst du die Funktion dann aufrufen?

    Klappt bei mir nicht so ganz ..

    # include <stdio.h>
    
    void Funk2(const char *t[])
    {
        int i;
    
        for(i = 0; i < 3; i++)
            printf("%s", t[i]);
    }
    
    int main()
    {
        char t[3][10] = {"lol", "lol", "lol"};
    
        Funk2(t);
    
        return 0;
    }
    


  • seldon schrieb:

    In C99 geht Folgendes:

    #include <stddef.h>
    #include <stdio.h>
    
    void foo(size_t dim_outer, size_t dim_inner, char data[][dim_inner]) {
      for(size_t i = 0; i < dim_outer; ++i) {
        puts(data[i]);
      }
    }
    
    int main(void) {
      char data[][10] = {
        "foo",
        "bar",
        "baz"
      };
    
      foo(3, 10, data);
    
      return 0;
    }
    

    Damit geb ich mich am ehesten zufrieden - Danke! 🙂



  • Wenn du sie ändern willst, ist das auch nichts für dich.

    mister_ratlos schrieb:

    Hm .. wie willst du die Funktion dann aufrufen?
    Klappt bei mir nicht so ganz ..

    Schau dir mal meine Definition an und dann deine (Zeile 13).



  • DirkB schrieb:

    Wenn du sie ändern willst, ist das auch nichts für dich.

    mister_ratlos schrieb:

    Hm .. wie willst du die Funktion dann aufrufen?
    Klappt bei mir nicht so ganz ..

    Schau dir mal meine Definition an und dann deine (Zeile 13).

    Ahh .. stimmt - hab da was wesentliches übersehen (const) ^^

    Danke 🙂



  • mister_ratlos schrieb:

    Ahh .. stimmt - hab da was wesentliches übersehen (const)

    Nein, das *t[] ist gemeint. Ein Array von Zeigern auf char.

    Da das dann aber Zeiger auf Stringliterale sind, ist das const angebracht.


Log in to reply