Zugriff auf zweidimensionales Array



  • Hallo,

    Ich habe ein Char Array um einen String zu speichern und mochte das eindimensionale Array in ein zweidimesnionales Array umwandeln.

    Ich hatte vorher folgendes:

    char serialPort1[20];
    char serialPort2[20];
    char serialPort3[20];
    
    strncpy(serialSmi1, value, 29);
    

    jetzt würde ich ein Array daraus machen um die verschiedenen Serial-Ports aus dem Config-File einzulesen und zwischenzu speichern.
    Der Einfachheit halber möchte ich ein zweidimensonales Array nehmen.
    Also so etwas:

    char serialPort[4][20];
    

    Wie greiffe ich jetzt darauf zu? Warum bringt mir GCC einen Fehler und sagt dass es "undeclared" ist:

    'serialPort' undeclared (first use in this function)
    strncopy(serialPort[0][0], value, 19);
    

    bei strncopy(serialPort[0], value, 19); kommt das selbe.


  • Mod

    Dann wird serialPort in deinem Code wohl nicht deklariert worden sein. Aber da der Code offensichtlich streng geheim ist, können nur eingeweihte Mitverschwörer sich an der Fehlersuche beteiligen.



  • Sorry dummer Fehler...

    Wollte jetzt nicht alles posten und habe mein Beispiel vereinfacht.
    Wie es aussieht wohl zu stark vereinfacht.

    Hatte ein Groß/Kleinschreibungs problem.

    einamal serialSMI und das andere mal serialSmi



  • Falls mal einer mit der Suchfunktion über diesen Thread stolpert:

    char serialPort[4][20];
    
    strncopy(serialPort[0], value, 19);
    


  • gnorf schrieb:

    Hatte ein Groß/Kleinschreibungs problem.

    Das ist noch das harmloseste "Problem" das du hast...



  • Also erstmal heißt das strncpy und nicht strncopy, und außerdem benutzen nur Deppen strncpy, so auch hier: falls die Zeichenkette ein '\0' enthält, dürfte das Ergebnis nicht den Erwartungen entsprechen denn für sowas nimmt man memcpy.



  • Wutz schrieb:

    Also erstmal heißt das strncpy und nicht strncopy, und außerdem benutzen nur Deppen strncpy, so auch hier: falls die Zeichenkette ein '\0' enthält, dürfte das Ergebnis nicht den Erwartungen entsprechen denn für sowas nimmt man memcpy.

    alle sind deppen, nur du nicht.
    und all die deppen muessen erst einmal alles lernen, nur du nicht.
    du wuerdest vermutlich auch ein neu geborenes kind verpruegeln, weil es noch nicht laufen kann... 👍
    was es da fuer leute gibt... 😕



  • Trotzdem liegt es doch nahe, dass funktionen mit "str" im namen nur für daten verwendet werden sollten, auf die "str" auch zutrifft, oder nicht?

    Außerdem: Wie wäre es mit einem array aus 4 zeigern auf char oder einem doppelzeiger und verzicht aufs kopieren?



  • Danke an alle.

    Habe strncpy genommen weil ich ja einen String kopieren möchte (C-HowTo).
    Ich habe das Chararray auf 20 Zeichen gesetzt und das letzte Zeichen als \0 gesetzt. STRNCPY kopiert dann nur 19 Zeichen.
    Außerdem habe ich die Strings vorher mit STRTOK zerlegt. Und dort werden die gesuchten Zeichen durch \0 ersetzt?!

    In meinem Fall möchte ich ja nur bis zur \0 kopieren. Und die \0 existiert auch bei mir. Die Angabe der Zeichen bei strncpy ist nur dafür da um nicht mehr zu kopieren als das in das Zielarray-1 passt.

    Tippfehler macht jeder mal. Ich gehe nicht mit meinem programmier-PC ins Internet und dann tippe ich schon mal kurze Codezeilen oder Fehlermeldungen ab bevor ich mit USB-Sticks herumspiele.

    Den Tip mit den Zeigerarray werde ich am Ende bestimmt übernehmen. Die Serial-Ports werden nur beim start des Daemon einmalig eingelesen und die Ports geöffnet. Die vier Kopiervorgänge wären also noch zu verkraften.

    Kleine Frage noch:

    Ich habe ein zweidimensonales Array erstellt.

    Was wäre besser? Scheint beides das gleiche zu bewirken. Also einen Pointer auf die selbe Adresse. Oder liege ich da falsch?



  • strncpy ist aber nicht für die Behandlung von nullterminierten Strings gedacht, was man leicht daran erkennt, dass es kein \0 ans Ende setzt, wenn der String "n" Zeichen lang oder länger ist.

    Ich benutze daher gerne strlcpy , das dieses Problem nicht hat. Wenn du allerdings Probleme damit hast, dass der String abgeschnitten werden kann, dann ist strlcpy auch nichts für dich, dann solltest du anders sicherstellen, dass der Speicher groß genug ist (und dann kannst du auch strcpy verwenden).

    Und: die Zahl, die die Größe "n" bzw. "l" angibt, sollte niemals hart kodiert sein, sondern aus sizeof oder einer (möglichst konstanten) Variable stammen.



  • Was ist denn eigentlich eine

    'konstante Variable'?

    SCNR



  • gnorf schrieb:

    Ja.
    (mal abgesehen davon, dass SerialPort und serialPort zwei unterschiedliche Variablen sind (ebenso x und X))

    char*
    serialPort[x][0] ist vom Typ char

    Also zwei ganz unterschiedliche Typen (Zeiger und Ganzzahl)

    Aber **&**serialPort[x][0] ist auch vom Typ char*
    Das geht wieder und hat auch dieselbe Adresse wie serialPort[x]

    strncpy möchte aber ein char* haben

    wob schrieb:

    Ich benutze daher gerne strlcpy,

    Leider nicht im Standard 😞


Log in to reply