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

Content-Key: 666608

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

Ausgedruckt am: 17.06.2021 um 20:06 Uhr

Mitglied: Lochkartenstanzer
Lochkartenstanzer aktualisiert am 10.05.2021
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
Mitglied: coolkaiserABC
coolkaiserABC am 10.05.2021
Ich hab hier schon einen Pointer auf das Array gesetzt?
mit

Damit weiß ich auf das Array weil ich ja die Adresse übergebe.
Mitglied: Lochkartenstanzer
Lochkartenstanzer aktualisiert am 10.05.2021
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.


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

lks
Mitglied: rubberman
rubberman aktualisiert am 10.05.2021
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
Mitglied: coolkaiserABC
coolkaiserABC aktualisiert am 10.05.2021
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.

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
Und natürlich deklariert als:

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
Mitglied: coolkaiserABC
coolkaiserABC aktualisiert am 10.05.2021
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


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 ...
Mitglied: rubberman
rubberman aktualisiert am 11.05.2021
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
Mitglied: coolkaiserABC
coolkaiserABC am 11.05.2021
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.
Mitglied: rubberman
Lösung rubberman aktualisiert am 11.05.2021
1Love

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

Steffen
Mitglied: coolkaiserABC
coolkaiserABC am 11.05.2021
Herzlichen Dank

Ich hab es endlich verstanden.
Heiß diskutierte Beiträge
Backup
Backupstrategie
Xaero1982Vor 1 TagFrageBackup38 Kommentare

Nabend Zusammen, wir bekommen es ja leider alle immer wieder mal mit, dass es auch große Firmen gibt, die von irgendwelchen Verschlüsselungstrojanern verseucht werden. Aktuell ...

Internet Domänen
Domaine Join via VPN
SpryceeVor 1 TagFrageInternet Domänen4 Kommentare

Hallo, ich bin gerade dabei die namen einiger rechner umzubenennen dabei verwende ich ein Powershell script welches auf dem rechner ausgeführt wird. Jetzt gibt es ...

Windows Server
Durchgeschliffener Drucker funktioniert auf dem Server nicht
Disse1987Vor 1 TagFrageWindows Server12 Kommentare

Hallo zusammen, wieder einmal muss ich mich an euch wenden da wir mit unserem Latein am Ende sind. Seid ein paar Tagen hat eine Kundin ...

Hardware
PC und Monitor über Entfernung verbinden
gelöst ben1300Vor 12 StundenFrageHardware14 Kommentare

Guten Morgen :) folgende IST Situation: Ich habe einen Gaming PC, welchen meine Freundin gerne nutzt, z.B. für das "legendäre" Spiel Sims 4 ;) Normalerweise ...

Windows Server
Auf Active Directory Benutzer und Computer von Windows 10 zugreifen
RealThoreVor 1 TagFrageWindows Server9 Kommentare

Hallo zusammen, da wir in der Abteilung (10 Leute) uns regelmäßig um die RDP Sessions auf unseren DCs (2012 R2) prügeln, wolle ich mal nachfragen, ...

Sicherheit
Windows Server und Callback Server
gelöst samreinVor 1 TagFrageSicherheit4 Kommentare

Moin zusammen, heute Nacht wurde unser öffentlicher IP Addressbereich angegriffen. Auf einem Windows 2016 Gateway Server der ausschliesslich über Port 443 erreichbar ist sprang sogar ...

Netzwerke
Internetprobleme seit Serverinstallation
beepboopVor 5 StundenFrageNetzwerke13 Kommentare

Guten Tag zusammen Bei einem Kunden habe ich ein sehr merkwürdiges Problem. Wir haben vor zwei Wochen einen Server beim Kunden installiert. Vorher waren nur ...

Sonstige Systeme
Womit ist eine Nextcloud am Besten zu betreiben. Linux-PC oder RaspiPI
gelöst frosch2Vor 7 StundenFrageSonstige Systeme15 Kommentare

Hallo, wieder einmal möchte ich eure Meinungen. Es soll eine nextcloud in einer produktiven Umgebung eingesetzt werden. Ca. 6 Aussendienst- und 7 Innendienstmitarbeiter. Zusammen 13 ...