coolkaiserabc
Goto Top

C 2-Dimensionales ARRAY in funktion übergeben

Hallo,

Ich muss für eine Hausaufgabe in C ein 2-Dimensionalles ARRAY in eine Funktion übergeben und ich check es einfach nicht wie es funktioniert.

int main()
{
    FILE *LadeDatei;
    char pfad[MAX_ZEILEN][18];
    int i,j,;
    char c;

    for(i = 0; i < MAX_ZEILEN; i++) // Array zum Speichern von 001-999
    {
        pfad[i]= 'l';  
        pfad[i][1]= 'o';  
        pfad[i][2]= 'a';  
        pfad[i][3]= 'd';  
        pfad[i][4]= '1';  
        pfad[i][5]= '/';  
        pfad[i][6]= 'A';  
        pfad[i][7]= 'u';  
        pfad[i][8]= 's';  
        pfad[i][9]= 'g';  
        pfad[i][10]= 'a';  
        pfad[i][11]= 'b';  
        pfad[i][12]= 'e';  
        pfad[i][13]= '.';  
        pfad[i][14]= (i/100)+48;                    // Dividiert duch 100 d.h. wenn i == 322 wird der reduziert sich der Wert auf 3 und  wird mit 48 addiert macht dann den ASCII Code für '3' 
        pfad[i][15]= ((i-hundert00(i)) / 10)+48;
        pfad[i][16]= (i-zehn0(i))+48;
        pfad[i][17]= NULL;
    }

Das funktioniert, speichert mir den Pfad und ich kann die Daten so laden.

Ich hab es jetzt mehrfach als Funktion probiert und das sieht dann so aus (funktioniert aber nicht...):
AUS DER MAIN:
ladeOrt(pfad, MAX_ZEILEN);

FUNKTION:
void ladeOrt(char *pfad,int max)
{
    int i,j;

    for(i = 0; i < max; i++) // Array zum Speichern von 001-max
    {
        j = 0;
        (pfad+(i*17)+0) = 'l';  
        (pfad+(i*17)+1) = 'o';  
        (pfad+(i*17)+2) = 'a';  
        (pfad+(i*17)+3) = 'd';  
        (pfad+(i*17)+4) = '1';  
        (pfad+(i*17)+5) = '/';  
        (pfad+(i*17)+6) = 'A';  
        (pfad+(i*17)+7) = 'u';  
        (pfad+(i*17)+8) = 's';  
        (pfad+(i*17)+9) = 'g';  
        (pfad+(i*17)+10) = 'a';  
        (pfad+(i*17)+11) = 'b';  
        (pfad+(i*17)+12) = 'e';  
        (pfad+(i*17)+13) = '.';  


        // strcpy(pfad[i], "load1/Ausgabe."); // funktioniert nicht 

        (pfad+(i*17)+14) = (i/100)+48;
        (pfad+(i*17)+15) = ((i-hundert00(i)) / 10)+48;
        (pfad+(i*17)+16) = (i-zehn0(i))+48;
        (pfad+(i*17)+17) = NULL;

    }
}

Kann mich jemand aufklären.... ich glaub ich hab mich zu sehr verbissen und sehe den Wald vor lauter Bäumen nicht (passiert mir leider öfter) und da ich es bald abgeben muss kann ich auch nicht eine Nacht drüber schlafen....

Bin glücklich über jede Hilfreiche Antwort DANKE

Content-ID: 666608

Url: https://administrator.de/contentid/666608

Ausgedruckt am: 24.11.2024 um 20:11 Uhr

Lochkartenstanzer
Lochkartenstanzer 10.05.2021 aktualisiert um 18:55:04 Uhr
Goto Top
Zitat von @coolkaiserABC:

Kann mich jemand aufklären....

Wenn es denn sein muß:

Von Bienchen und Blümchen. face-smile

ich glaub ich hab mich zu sehr verbissen und sehe den Wald vor lauter Bäumen nicht (passiert mir leider öfter) und da ich es bald abgeben muss kann ich auch nicht eine Nacht drüber schlafen....


In C werden größere Parameter wie z.B. Arrays i.d.R durch Pointer übergeben. Und man sagt dem Pointer, daß es auf ein Array zeigt. Dann kann man ganz normal mit indizes arbeiten.

Siehe z.B. https://www.programiz.com/c-programming/c-arrays-functions (Wild aus der google-Trefferliste herausgegriffen).

lks
coolkaiserABC
coolkaiserABC 10.05.2021 um 20:01:01 Uhr
Goto Top
Ich hab hier schon einen Pointer auf das Array gesetzt?
mit
void ladeOrt(char *pfad,int max)

Damit weiß ich auf das Array weil ich ja die Adresse übergebe.
Lochkartenstanzer
Lochkartenstanzer 10.05.2021 aktualisiert um 20:31:52 Uhr
Goto Top
Zitat von @coolkaiserABC:

Ich hab hier schon einen Pointer auf das Array gesetzt?
mit
void ladeOrt(char *pfad,int max)

Damit weiß ich auf das Array weil ich ja die Adresse übergebe.


Ja, aber Du mußte auch die Dimensionierung des Arrays angeben. Entweder implizit in der Definition oder explizit mit zusätzlichen Parametern.

lks
rubberman
rubberman 10.05.2021 aktualisiert um 21:05:50 Uhr
Goto Top
Ich habs noch nicht ganz verstanden. Ich lese bei dir was von MAX_ZEILEN. Also was übergibst du denn eigentlich? C hat keinen Stringtyp. Ein String wird als Array von char dargestellt, mit dem Zusatz dass das letzte Element '\0'sein muss, um das Stringende zu markieren. Wenn du einen String an eine Funktion übergibst, zerfällt das Array in einen Pointer auf char (char*). Das ist aber nur eine einzelne Zeichenfolge. Ein Array von Zeilen (also von Pointers auf char) ist dann schon doppelte Referenzierung (also char**). Wie du das an eine Funktion übergeben musst, hängt maßgeblich davon ab, wie du dein Array deklariert hast. Nämlich als Array von Pointers auf char, oder als Array von Arrays von char.
In deinem Fall sehe ich die Parameterdeklaration eher als char pfad[18].
Ich hatte da mal Essays drüber geschrieben. Vielleicht hilfreich ...
https://dev-community.de/resources/c-pointer.6/
https://dev-community.de/resources/c-strings-aufbau-missverst%C3%A4ndnis ...

Steffen
coolkaiserABC
coolkaiserABC 10.05.2021 aktualisiert um 21:53:31 Uhr
Goto Top
Ich habs noch nicht ganz verstanden. Ich lese bei dir was von MAX_ZEILEN.

Ich dachte das ist klar das ich das deklariert habe mit, ich wollte aus Gründen der Lesbarkeit nicht den ganzen Sourcecode hier rein posten.
#define MAX_ZEILEN 1000

Zusatz dass das letzte Element '\0'
NULL == \0
Und das hab ich gemacht an der 17. Stelle des Array. (mit NULL)

Wenn du einen String an eine Funktion übergibst, zerfällt das Array in einen Pointer auf char (char*)
Das hab ich in der Funktion so angegeben

hängt maßgeblich davon ab, wie du dein Array deklariert hast.
mit
char pfad[MAX_ZEILEN][LAENGE_LADEPFAD];
Und natürlich deklariert als:
#define MAX_ZEILEN 1000
#define LAENGE_LADEPFAD 18

In deinem Fall sehe ich die Parameterdeklaration eher als char pfad[18].
Das hatt leider auch kein Ergebniss gebracht ....


Danke das lese ich mir durch
coolkaiserABC
coolkaiserABC 10.05.2021 aktualisiert um 21:51:57 Uhr
Goto Top
Ja, aber Du mußte auch die Dimensionierung des Arrays angeben. Entweder implizit in der Definition oder explizit mit zusätzlichen
Parametern.

lks

Ok vlt hab ich es Falsch verstanden denn

(pfad+(i*17)+0) = 'l';  

Hab ich so aufgefasst das "pfad" die adresse ist i (Multiplikator aus der Schleife) * 17 (weil das Array 17 Positionen hat (mit NULL zum schluss) und +"0" die jeweilige position des Array. Meines Verständnisses nach hab ich es so verstanden das hier der Pointer weitergeschoben wird jenachdem wie groß die Adresse ist.
z.B. 6504846004 auf die nächste stelle 6504846000 (weil es ja rückwärts läuft ohne malloc)

Ich hab es noch nicht 100%ig verstanden und gefühlt schon 100 Artikel darüber gelesen aber es wird nicht verständlich für mich. Deshalb frag ich ...
rubberman
rubberman 11.05.2021 aktualisiert um 10:39:37 Uhr
Goto Top
Zitat von @coolkaiserABC:
NULL == \0
Nein NULL ist ein Pointer und '\0' ist ein char. Aber das ist nicht dein Problem denn NULL wird in deinem Code implizit zu '\0' gecastet. Wenn du schön alle Warnmeldungen in deinem Compiler aktiviert hast, bekommst du auch eine entsprechende Meldung...

Keine Ahnung was du da in deiner Funktion versuchst. Die Parameterdeklaration vorausgesetzt, die ich dir vorgekaut habe, solltes du genauso vorgehen können wie du es ohne Funktion getestet hattest. Dein derzeitiges Vorgehen à la
(pfad+(i*17)+0)
kann nur Müll ergeben.
1. pfad ist ein Pointer und wenn du den über Pointerarithmetik vorrückst, bleibt das immer noch ein Pointer. Was soll den passieren wenn du einem Pointer ein char zuweist? Mindestens müsste der resultierende Pointerwert vorher dereferenziert werden.
2. Warum denn i*17? LAENGE_LADEPFAD ist 18.

Steffen
coolkaiserABC
coolkaiserABC 11.05.2021 um 15:31:51 Uhr
Goto Top
Ok das mit 17 hab ich jetzt erst gesehen.... tut mir leid ich hänge schon sehr lange daran und zu viel Kaffee macht mich blind für sowas.

Mein Plan ist es ein Char Array zu schreiben das 2 Dimensionen hat. PFAD soll die Anzal an Dateien sein die ausgegeben werden (und das werden so ca 1000 STK sein deswegen will ich sie automaisch befüllen. und PFAD[n] Soll dann der Pfad sein als "load1/Ausgabe.001" (301 wäre die 302. Datei) (Also wollen tu ich ein String Array aber das gibt es in C ja so nicht)

Ich hab das schon geschafft das es der Main mit einer For Schleife perfekt zu befüllen. (und da hab ich sogar 18 stehen....) Aber ich schaff es nicht diesen Teil über eine Funktion erledigen zu lassen. Unser Lehrer will das solle Aktionen über einen Funktion oder sogar in einer Header Datei stehen. Mir geht das Verständnis ab und ich schaff es nicht Klarheit zu finden. Ich habe gefühlt schon 100 Artikel zu Pointer gelesen und die Aufzeichnung von unseren Unterrichtsstunden mehrfach angesehen aber es macht einfach nicht KLICK.
rubberman
Lösung rubberman 11.05.2021 aktualisiert um 15:56:26 Uhr
Goto Top
#include <stdio.h>

#define LINES_MAX 5
#define STRING_MAX 80

void foo(char arr[STRING_MAX]);

int main(void)
{
  char arr[LINES_MAX][STRING_MAX] = {0};
  foo(arr);
  printf(arr);
  return 0;
}

void foo(char arr[STRING_MAX])
{
  for (int i = 0; i < LINES_MAX; ++i)
  {
    arr[i] = 'a';  
    arr[i][1] = 'b';  
    arr[i][2] = 'c';  
    arr[i][3] = '\0';  
  }
}

Natürlich enhält jetzt arr bis arr[4] jeweils denselben String "abc". Aber das Prinzip sollte nun klar sein, oder?

Steffen
coolkaiserABC
coolkaiserABC 11.05.2021 um 16:25:43 Uhr
Goto Top
Herzlichen Dank

Ich hab es endlich verstanden.