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.
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...):
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 666608
Url: https://administrator.de/contentid/666608
Ausgedruckt am: 24.11.2024 um 20:11 Uhr
10 Kommentare
Neuester Kommentar
Wenn es denn sein muß:
Von Bienchen und Blümchen.
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
Zitat von @coolkaiserABC:
Ich hab hier schon einen Pointer auf das Array gesetzt?
mit
Damit weiß ich auf das Array weil ich ja die Adresse übergebe.
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
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
In deinem Fall sehe ich die Parameterdeklaration eher als
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
'\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
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
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
Steffen
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
#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