csv to array

Nullterminierung?
Nein - auch ein paar chars sind nicht automatisch ein String in C

Auch du wirst sicherlich erkannt haben, dass mogbo in seinem Array an der Position X-Y bis zu 39 Zeichen speichern will und nicht einen Buchstaben. Und vermutlich will er mit den 39 Zeichen auch was anfangen. Was genau liegt nicht an mir, aber der Rat auf Nullterminierung zu achten ist ratsam, wenn man die string-Funktionen von C benutzen möchte.
 
Auch du wirst sicherlich erkannt haben, dass mogbo in seinem Array an der Position X-Y bis zu 39 Zeichen speichern will und nicht einen Buchstaben. Und vermutlich will er mit den 39 Zeichen auch was anfangen. Was genau liegt nicht an mir, aber der Rat auf Nullterminierung zu achten ist ratsam, wenn man die string-Funktionen von C benutzen möchte.
39 beinhaltet das Semicolon bis (ohne) das nächste Semicolon (oder newline). Die 39+1 sollte mein '\0' werden
rows + 1 und cells + 1 macht vorerst keinen Sinn, sollte nur dazu dienen, dass ich keinen Fehler durch einen Denkfehler beim Zählen habe :)

Die 39 ist einfach das maximal größte Textfeld der csv, da ich mir vorstellen könnte das eine einzelne auszählung zwar RAM spart, aber die Rechenzeit deutlich erhöht.

Wenn ich nun alles in einen 2D-Array packe werden aus 16,45mb "nur" 6,xx mb (theoretisch auf etwas weniger wie 3 mb reduzierbar, wenn ich gezielte Textstellen gesondert ablege).


-> Könnte ich mich 24/7 mit beschäftigen :)


PS.: Offtopic
Ich bin mit Virtualbox gezwungen in VM alles Offline zu erledigen, gibts irgendwelche Linux-Distros die ohne Download und Konfiguration auch einen C-Compiler + libc liefern? Dachte bis vor 2 Std noch, dass gcc der absolute Standart wäre (natürlich ist Python immer vorhanden.....) - die Logik dahinter ist mir klar, aber irgendwie Sack dämlich.

Arbeite gerade mit einem fertig Gentoo, gefällt mir aber dank der Softwareauswahl kein Millimeter
 
Reicht doch, wenn du wenigstens einen Compiler hast. Ob da nun gcc oder llvm rumliegt, ist doch total egal für dein Projekt.

Rob
Jo, Problem ist nur das Fehlen jeglicher C-Compiler und libc. Verwende gerade eine Live-Distro mit einem ungewohnten Editor und Schreibrechten auf einen Unterordner in C:\

Ein Linux-Mint (Ubuntu, ... ) wäre mir deutlich lieber gewesen, liefert nur leider ohne C-Compiler und libc
 
Slackware installiert als rundum Sorglospaket auch einen compiler in der full-installation. Einfach DVD-ISO herunterladen und dann in der vbox installieren.
 
Wenn ich nun alles in einen 2D-Array packe werden aus 16,45mb "nur" 6,xx mb (theoretisch auf etwas weniger wie 3 mb reduzierbar, wenn ich gezielte Textstellen gesondert ablege).

Dein Speicherverbrauch müsste sich ohne jegliche Optimierung in etwa an der Größe deiner CSV-Datei orientieren + der Pointer Overhead für jedes Element/Zelle. Dein Pointer-Overhead müsste Spalten*Zeilen*64bit sein (oder 32bit, falls du die Anwendung 32bit kompilierst).

Der C-Compiler macht aus deinem 2D Array vermutlich eh ein 1D Array intern.
 
Dein Speicherverbrauch müsste sich ohne jegliche Optimierung in etwa an der Größe deiner CSV-Datei orientieren + der Pointer Overhead für jedes Element/Zelle.
Wenns der Compiler optimiert ja, nach meinem jetzigen Modell ist jede Zeile völlig gleich lang, da jede Zeile den gleichen malloc(letters * sizeof(char)) verwendet, glaube das sind immer ~156 byte + '\0'. Werds privat mal mit anderen Lösungen testen, denke das lässt sich ganz einfach optimieren

Der C-Compiler macht aus deinem 2D Array vermutlich eh ein 1D Array intern.
Hoffentlich, der Array soll nur mir als Vereinfachung dienen, die Blackbox-Magic dahinter verstehe ich ohnehin (noch) nicht
 
Hoffentlich, der Array soll nur mir als Vereinfachung dienen, die Blackbox-Magic dahinter verstehe ich ohnehin (noch) nicht

Das ist nicht mal Blackbox-Magie, sondern ganz simpel:
Statt ein 2D-Array array[cols][rows] anzulegen, kann man auch ein 1D-Array array[cols*rows] anlegen. Der Zugriff erfolgt dann mittels array[width * row + col] = value. Wenn man sich da mal ein Blatt Papier nimmt und sich das mal kurz vorrechnet ist das alles ziemlich simpel. Man packt einfach die Zeilen nebeneinander in ein Array, da hier die Spaltenanzahl fest ist .
 
Statt ein 2D-Array array[cols][rows] anzulegen, kann man auch ein 1D-Array array[cols*rows] anlegen. Der Zugriff erfolgt dann mittels array[width * row + col] = value. Wenn man sich da mal ein Blatt Papier nimmt und sich das mal kurz vorrechnet ist das alles ziemlich simpel. Man packt einfach die Zeilen nebeneinander in ein Array, da hier die Spaltenanzahl fest ist
So hab ich mir 2D-Arrays vorgestellt :) dachte das System weiß einfach ab welcher Position im Speicher die 2. Dimension weitergezählt wird
 
C-Programmieren unter Windows ist eigentlich gar nicht so übel, so lange man einen vernünftigen Compiler hat. Der von Microsoft ist für normales C ziemlich scheiße (mangelnde Standardunterstützung u.a.). Cygwin halte ich persönlich für eine deutlich schlechtere Lösung als zum Beispiel einen nativen clang.

Für den Anfang, solange keine Windows Executable rausfallen muss: LXSS mit Clang oder GCC.
 
Um das in diesem Thread entstandene Thema 'mehrdimensionale Arrays in C' nun mal ohne Vermutungen und Theorien
abzuschliessen, habe ich mal in der von Prof.Dr. Schreiner und Dr. Janisch bearbeiteten deutschen Übersetzung der Bibel
-also Kernighan&Ritchie, 2.Ausgabe- nachgelesen:

Im Anhang A der C-Sprachbeschreibung ( Ansi C ) steht da u.a. sinngemäss folgendes:
int x3d[3][5][7] -> vereinbart ein dreidimensionales Array von int-Werten
detailiert:
x3d ist ein Array mit 3 Elementen, jedes Element ist ein Array aus 5 Arrays und jedes dieser letzteren Arrays hat 7 inte Elemente
folgende Ausdrücke sind bei diesem Beispiel legal:
x3d ' Typ Array '
x3d[h] ' Typ Array '
x3d[h][j] ' Typ Array '
x3d[h][j][k] ' Typ int '

Mit anderen Worten wird hier zum Ausdruck gebracht, dass es in diesem Kontext (eigentlich) gar keine
mehrdimensionalen Arrays gibt, sondern vielmehr ist es so, dass ein Array entweder Daten eines bestimmten Datentyps
- oder ein (weiteres) Array enthält.

weiter heisst es:
E1[E2] ist identisch mit *(E1+E2)
daraus folgt also für das x3d-Beispiel:

x3d[h][j][k] ist äquivalent zu *(x3d[h][j]+k)

der Teilausdruck x3d[h][j] ist also ein Pointer auf Array vom Typ int und zeigt auf einen Speicherbereich der Groesse,
der sich aufgrund des Multiplikators [k] ergibt.

Daraus folgt: Zitat:" .. dass Vektoren zeilenweise gespeichert werden ..."


Frohe Weihnachten!
 
Kaum hab ich mir die Arbeit in C gemacht (Lösung über structs), wusste ich wie ich VBA optimieren konnte, nun braucht VBA statt 20 Sekunden auch nurnoch 2-3. Paar Stunden Arbeit umsonst, da bei Auswahl ohnehin keiner mein C-Tool nutzt...
 
Richtig, dem kann ich nur zustimmen. mogbo sagt es ja auch schon in seiner Signatur. :-)

Wer wirklich programmieren lernen und verstehen will, sollte meiner Meinung nach »SICP« lesen. Das ist u.a. auch Pflichtlektuere am MIT und kostenlos im Netz lesbar:

https://mitpress.mit.edu/sicp/sicp.html

Die Beispiele sind in Scheme geschrieben, also einem Lisp Dialekt. Allerdings wird dadurch ein tieferes Verstaendnis vermittelt und man kann spaeter das gelernte Wissen auch in anderen Sprachen umsetzen. Scheme wird nebenbei natuerlich mit erlernt.
 
Ein weiteres gutes Beispiel dafür, wie wichtig das Gebiet "Algorithmen und Datenstrukturen" aus der theoretischen Informatik ist.
Ich denke nächstes mal gleich darüber nach wie ichs in C machen würde, da würd ich auch nicht auf die Idee kommen die Funktion fprintf() für jeden char einzeln aufzurufen, dann neu in arrays zu lesen um mit atoi() weiterzuarbeiten :)

EDIT: So schlimm wie sichs jetzt liest wars natürlich nicht
 
Zurück
Oben