Mehrdimensionale Arrays Schleife
-
Moin zusammen!
Das Array "variable" wird vor dem Aufruf der Funktion mit Werten beschrieben. Außerdem ist die Anzahl der Werte unterschiedlich.
Bei dem Aufruf der Funktion wird (wie auch anders erwartet :o alle Werte bis zu dem Letzten und ein Wert mehr ausgegeben).
Wie kann man in der Hinsicht das Ausgeben der "letzten" Variablen bzw verhindern, dass das nächste des Arrays (was leer ist) ausgegeben wird?
P.S. Bitte keine Äußerungen hinsichtlich wie weit ich beim Erlernen von c++ bin. Als Anfänger darf man dies Fragen

string variable[1000][100]; int limit; int limit2; int func() { for(loop2=0;loop2<=limit2;loop2++) { for(loop=0;loop<=limit;loop++) { cout << variable[loop2][loop] << endl; } } }Vielen Dank im Voraus!
Grüße
user_1992
-
< statt <=. So sehen dann praktisch alle Schleifen aus, mit denen du in C++ über ein Feld läufst (gerne auch mit != statt <, das ist dann noch allgemeiner).
P.S.: Globale Variablen: Pfui! Sofort sein lassen, bevor du es dir angewöhnst. Falls du dich fragst, wie du ein 2D-Array einfach in eine Funktion bekommst: Da böte sich eine Kapselung in eine schöne Klasse an, zum Beispiel eine der vielen Klassen der Standardbibliothek, die bereits dafür gemacht sind, Daten zu halten. Rohe Arrays hat man in C++ fast nie. Und rohe mehrdimensionale Arrays benutzt man noch seltener.
-
Danke für die schnelle Antwort!
Auf die Antwort hätte man auch kommen können

Diese Funktion wollte ich gerne in folgendem Source-Code einsetzen:
#include <iostream> #include <fstream> #include <dirent.h> // for folder list using namespace std; DIR *hdir; // for folder list struct dirent *entry; // for folder list char path[ ] = "c:\\"; // for folder list int loop; int loop2; int loop3; int contents_folder_int; int contents_folder_int2; string contents_folder[1000][100]; string name_of_file = "report.txt"; // for write file ofstream write_file; // for write file int func_folder_list() { hdir = opendir(path); do { entry = readdir(hdir); if (entry) { contents_folder[contents_folder_int2][contents_folder_int] = entry->d_name; cout << path << contents_folder[contents_folder_int2][contents_folder_int] << endl; contents_folder_int++; } // if (entry) { } while (entry); closedir(hdir); } // int func_folder_list() { int func_write_folder_contents() { write_file.open(name_of_file.c_str(), ios_base::out); if(!write_file) { cout << "can not open file"; cout << endl; return -1; } // if(!dat_aus) { else { for(loop2=0;loop2<contents_folder_int2;loop2++) { for(loop=0;loop<contents_folder_int;loop++) { cout << path << contents_folder[loop2][loop] << endl; write_file << path << contents_folder[loop2][loop] << endl; } // for(loop=0;loop<=contents_folder_int;loop++) { } // for(loop2=0;loop2<=contents_folder_int2;loop2++) { } // else { } // int func_write_folder_contents() { int main() { func_folder_list(); func_write_folder_contents(); getchar(); return 0; } // int main() {Wie man vielleicht schon erkennen kann, soll das Programm den Ordnerinhalt auslesen und anschließend in eine Datei schreiben.
Selbstverständlich könnte man die Funktionen auch zusammenlegen, aber ich möchte das Array andersweitig nutzen.
Grüße
user_1992
-
Du könntest dir die meisten Leerzeilen sparen, dann sieht der Code schon mal besser aus.
Ein Fan von den Kommentaren bei den Schleifen-Enden ('}') bin ich auch nicht, aber das ist ja dein Kaffee
Mein Frage zum Code, wird die Variable contents_folder_int2 irgendwann mal initialisiert?
In folgender Zeile ist ihr ja noch gar kein Wert zugewiesen worden, was soll also hier drinnen stehen?contents_folder[contents_folder_int2][contents_folder_int] = entry->d_name;Edit: contents_folder_int wird auch nicht initialisiert, aber nach dem ersten Durchlauf inkrementiert..Fehler?!
-
Eigentlich war das so angedacht, das aus der Funktion "func_folder_list()" die einzelnen Ordnernamen in dem Array "contents_folder" abgespeichert werden. (return-befehl vergessen?
)Und dann soll der Inhalt des Arays in die Datei abgespeichert werden (ohne, wie oben beschrieben, ohne "übers Ziel hinaus zu schiessen")
@SeppJ: Danke für den Hinweis hinsichtlich der globalen Variablen und des mehrdimensionale Arrays. Werde ich mir für meine zukünftigen Programme merken.
-
user_1992 schrieb:
@SeppJ: Danke für den Hinweis hinsichtlich der globalen Variablen und des mehrdimensionale Arrays. Werde ich mir für meine zukünftigen Programme merken.
Der richtige Zeitpunkt zur Umstellung ist gestern. Du solltest dein aktuelles Programm auch umstellen. Mindestens die globalen Variablen müssen weg.
-
user_1992 schrieb:
Eigentlich war das so angedacht, das aus der Funktion "func_folder_list()" die einzelnen Ordnernamen in dem Array "contents_folder" abgespeichert werden. (return-befehl vergessen?
)contents_folderist 2D,d_namejedoch nur eindimensional.Wenn du (angenommen) die zwei Integer initialisierst.
int contents_folder_int = 0; int contents_folder_int2 = 0;Würde der erste Durchlauf deiner Schleife in "func_folder_list()" so aussehen:
contents_folder[0][0] = entry->d_name;(Wobei die Nullen natürlich durch die Variablen ersetzt werden müssten, hier stehen sie nur zur Veranschaulichung.)
Dann hast du also in der zweiten Dimension des Arrays contents_folder[0][0] den Namen des Verzeichnisses gespeichert.
Dann inkrementierst du, aus [0][0] wird [0][1].
In die [1] kommt der nächste entry->d_name;
Du bräuchstest also gar keinen 2D-Array, eine Dimension reicht auch aus.
Der reservierte Speicher für die zweite Dimension [100] ist also vergebens, der wird doch nie verwendet.user_1992 schrieb:
Und dann soll der Inhalt des Arays in die Datei abgespeichert werden (ohne, wie oben beschrieben, ohne "übers Ziel hinaus zu schiessen")
Dieser Teil des Programmes dürfte funktionieren, hald auf eine Dimension reduziert.
Hab deinen Code mal ein wenig überarbeitet, kann natürlich noch um einiges verbessert werden, muss aber weg.
Nur mal um zu veranschaulichen, dass eine Dimension ausreicht.#include <stdio.h> #include <iostream> #include <fstream> #include <string> #include <dirent.h> // for folder list using namespace std; int folder_count = 0; string folder_list[1000]; void func_folder_list() { DIR *dir; struct dirent *entry; dir = opendir("c:/"); if(!dir) return; while(entry = readdir(dir)) { folder_list[folder_count] = entry->d_name; ++folder_count; } closedir(dir); } void func_write_folder_contents() { string fileName = "file.txt"; ofstream write_file; write_file.open(fileName.c_str(), ios_base::out); if(!write_file) { cout << "can not open file" << endl; return; } for(int i = 0; i <= folder_count; ++i) { write_file << path << folder_list[i] << endl; } } int main() { func_folder_list(); func_write_folder_contents(); system("PAUSE"); return 0; }
-
Danke für den Code phanzy.
Der funktionert einwandfrei

Vielen Dank nochmal