ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Array-Größe durch Variable bestimmen ? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
19.02.2005, 21:47 Uhr Amaris Posts: 941 Nutzer |
Hallo Ich habe heute ein C++-Programm geschrieben welches unter Anderem Code-Zeilen nach folgendem Schema enthält: int anzahl; cin>>anzahl; int test[anzahl]; Ich will also ein Array erstellen dessen Größe nicht von vornherein fest steht, sondern durch die Variable anzahl bestimmt wird. Unter GCC funktioniert das auch wunderbar. Jetzt wollte ich mein Programm allerdings unter Windoof mit "Microsoft Visual C++" kompilieren. Dummerweise beschwert er sich jetzt über diese Programmzeilen. Ohne die wird mein Programm aber schwerlich funktionieren. Gibt es da Abhilfe ? *seufz* Amaris -- -Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM -AmigaOne (µA1, G3), 160GB HDD, 256MB RAM [ - Antworten - Zitieren - Direktlink - ] |
19.02.2005, 22:13 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Also Amaris, wenn du wirklich so ne Art Datenverwaltung machen willst, solltest du das mit den Arrays sowieso vergessen dafür nimmt man besser (doppelt-)Verkettete Listen. Da brauchst du nie eine Anzahl vorher eingeben, es wird einfach ein Eintrag hinzugefügt.code:struct MyList { struct MyList *next; char Name[40]; char Vorname[40] . . . }; Das steht aber eigentlich in jedem C(++)Buch drinne als Beispiel. [ - Antworten - Zitieren - Direktlink - ] |
19.02.2005, 22:28 Uhr Amaris Posts: 941 Nutzer |
Sorry, aber ich bin halt noch ein blutiger Anfänger und ein solches Beispiel stand bisher nicht in meinem Buch. Ich bin zwar noch nicht ganz fertig (lese "C++ - Programmieren mit einfach Beispielen" aus dem Martk+Technik-Verlag) aber ich glaube nicht daß sowas noch kommt. Meine Absicht war Folgendes: Es sollen "Bankkonten" verwaltet werden. Ich habe eine Klasse namens "konto" definiert. Ein Bankkonto ist eine Instanz dieser Klasse. Der Benutzer soll die Anzahl der zu erstellenden Konten eingeben können. Das sieht dann so aus: cout<<"Bitte geben Sie die Anzahl der anzulegenden Konten ein: "; cin>>anzahl; cout<<endl; konto konto[anzahl]; Ich könnte natürlich auch einfach die Größe des Arrays auf 50 setzen, oder sowas. Dann könnten eben maximal 50 Konten erstellt werden. Aber das Ideale ist das nicht. Aber ehrlich gesagt...deinen Vorschlag verstehe ich nicht ganz...aber ich werde mir das nochmal durch den Kopf gehen lassen. -- -Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM -AmigaOne (µA1, G3), 160GB HDD, 256MB RAM [ - Antworten - Zitieren - Direktlink - ] |
19.02.2005, 22:40 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Das ganze ist ganz einfach, anstatt eine feste Anzahl an Einträgen zu definieren erstellst du einfach einen Eintrag und trägst in diesen einen Zeiger ein, welcher ggf. auf einen weiteren Zeigt welcher später erzeugt werden kann. Es scheint als ob du nicht nur für AOS dieses machen willst, sonst könntest du dafür auch die AOS Systemfunktionen nehmen. Ich werde mal versuchen, ob ich schnell ein Beispiel schreiben kann. [ - Antworten - Zitieren - Direktlink - ] |
19.02.2005, 23:01 Uhr Kaesebroetchen Posts: 643 Nutzer |
@Amaris Ich weiss nicht ob es dir was hilft, aber hier ist mal ein Link auf ein Kontenverwaltungsprogramm das ich mal geschrieben habe. Das Programm speichert die Daten auf der Festplatte und hat (theoretisch) keine Begrenzung, was die Anzahl der Konten angeht. Das ganze liegt als Visual C++ Projekt vor. [ - Antworten - Zitieren - Direktlink - ] |
19.02.2005, 23:13 Uhr Amaris Posts: 941 Nutzer |
@Kaesebroetchen: Danke, ich werd mir das Programm mal anschauen. @Darius: Ich hab jetzt nochmal etwas in dem Buch geblättert und da ist leider auch nirgendwo von Zeigern dir Rede. Das Thema wird darin wohl nicht behandelt. Ich muß mir das bei Gelegenheit mal anderweitig beibringen. MfG Amaris -- -Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM -AmigaOne (µA1, G3), 160GB HDD, 256MB RAM [ - Antworten - Zitieren - Direktlink - ] |
19.02.2005, 23:24 Uhr Kaesebroetchen Posts: 643 Nutzer |
Zitat: Wirst du (zum Glück) in einem reinen C++ Buch für Einsteiger auch nicht finden... Falls es dich interessiert, guckst du hier [ - Antworten - Zitieren - Direktlink - ] |
19.02.2005, 23:55 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Ok, ich habe meine C(++) Kentnisse aus dem MaxonC++ Handbuch dort wurden Zeiger als auch eine einfache Datanverwaltung beschrieben, IMHO ein sehr schönes Buch. Ansonsten für das Problem einfach nach (doppelt) Verketteten listen über Google suchen. [ - Antworten - Zitieren - Direktlink - ] |
20.02.2005, 01:15 Uhr RoKo Posts: 72 Nutzer |
Verkettete Listen sind zuweilen eine recht langsame Angelegenheit, da für jedes Element neuer Speicher angefordert werden muß - zudem steht man vor der selben Problematik, man muß den Unterschied zwischen Heap und Stack kennenlernen: Der Heap/Freispeicher/wie auch immer ist der ganz normale Speicher, den man für seine Anwendung anfordern kann. Der Stack ist ein Speicherbereich, den man nur implizit benutzt. Der Compiler legt lokale Variablen, Funktionsparameter und Rücksprungadressen darauf ab. Wenn man eine Variable mit int blub; anlegt, landet sie auf dem Stack. Der Stack ist relativ statisch, der Compiler muß genau wissen, wie viel auf dem Stack landet, da er zum Beispiel auch die Rücksprungadressen auf den Stack schiebt. Auch int test[anzahl]; landet auf dem Stack, deswegen muß anzahl eine Konstante sein. Dass GCC Dein Beispiel durchgehen lässt ist eine Vereinfachung von GCC und strenggenommen ein Fehler. Will man zur Laufzeit Speicher anfordern (aus dem Heap also), verwendet man new: int test[] = new int[anzahl]; (es ist übrigens egal, ob man int[] test oder int test[] schreibt) [ - Antworten - Zitieren - Direktlink - ] |
20.02.2005, 10:26 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Jeder Vorteil wird durch einen Nachteil erkauft, so dass eine verkettete Liste sicherich ein wenig langsamer und komplizierter ist. Sie hat aber den Vorteil, dass sie dynamisch, speicherschonender (da jeder Eintrag sich irgendwo einschummeln kann) ist. Was das ganze jetzt aber mit dem Stack zu tun hat sehe ich nicht, schliesslich erzeugt man einen neune Eintrag sicherlich per new oder AllocMem() etc. [ - Antworten - Zitieren - Direktlink - ] |
20.02.2005, 11:01 Uhr RoKo Posts: 72 Nutzer |
Eben, es ging doch gerade darum, new einzuführen ;-) Wenn es um mehr Dynamik geht, gibt es auch noch den std::vector. [ - Antworten - Zitieren - Direktlink - ] |
20.02.2005, 11:23 Uhr Amaris Posts: 941 Nutzer |
Zitat: Hmm...also ich habe das jetzt in allen möglichen Variationen ausprobiert aber ich bekomme jedesmal eine Fehlermeldung. -- -Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM -AmigaOne (µA1, G3), 160GB HDD, 256MB RAM [ - Antworten - Zitieren - Direktlink - ] |
20.02.2005, 11:58 Uhr RoKo Posts: 72 Nutzer |
Huch, muß natürlich int* test = new int[anzahl]; heißen. Pointer hätte ich gerne vermieden - egal, funktioniert schließlich genau so, Du kannst auf den Pointer mit Array-Syntax zugreifen. Gelöscht wird der Speicher am Ende mit delete[] test; [ - Antworten - Zitieren - Direktlink - ] |
21.02.2005, 08:49 Uhr Solar Posts: 3680 Nutzer |
Um die eigentliche Frage zu beantworten: In C++ verwendet man eigentlich grundsätzlich keine Arrays (zumindest nicht ohne sehr guten Grund), sondern Vektoren. Bei denen braucht man keine Größe angeben. #include <vector> vector<int> test; Neue Elemente fügst Du hinzu mit test.push_back(value), die aktuelle Größe bekommst Du mit test.size(), und die Elemente kannst Du mit test[n] ansprechen. Der Rest zu Vektoren findet sich im C++-Buch Deiner Wahl, oder auf dinkumware.com / Library Reference. (Schlagt den armen Kerl doch nicht mit doppelt verketteten Listen o.ä., wenn er erst einmal die Standard-Bibliothek verstehen muß. ) [ - Antworten - Zitieren - Direktlink - ] |
21.02.2005, 14:40 Uhr Holger Posts: 8116 Nutzer |
Zitat:Amiga-Programmierer lieben doppelt-verkettete Listen. Wenn man mit dem Programmieren unter AmigaOS angefangen hat, kann man sich kaum vorstellen, daß es überhaupt noch andere Datenstrukturen geben könnte... Wie heißt es doch so schön: wenn man nur den Hammer kennt, sieht jedes Problem wie ein Nagel aus. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
21.02.2005, 16:28 Uhr Amaris Posts: 941 Nutzer |
Zitat: Hmm...okay, ich werd das mit den Vektoren mal ausprobieren. Aber das ist schon seltsam. In dem Buch das ich verwende gibt es einen Abschnitt über Arrays aber nichts über Vektoren. Siehe hier: http://www.amazon.de/exec/obidos/ASIN/3827265630/qid=1108999336/ref=pd_ka_8/302-3176023-8004032 Seltsam... MfG Amaris -- -Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM -AmigaOne (µA1, G3), 160GB HDD, 256MB RAM [ - Antworten - Zitieren - Direktlink - ] |
22.02.2005, 02:22 Uhr obw Posts: 94 Nutzer |
Zitat: Gar nicht seltsam, Du hast da ein absolutes Anfängerbuch, da will man die Leute nicht sofort mit der STL und ihren 378 Containern verschrecken. Wenn Du einen kompletten Überblick über C++ haben willst, gibt es eigentlich nur ein Buch (zum Lernen ist das aber eher Hardcore ) Die C++-Programmiersprache Ansonsten wirf mal STL und "vector" in Google, die ersten Treffer sind ganz tauglich, wenn man Englisch kann. OBW [ - Antworten - Zitieren - Direktlink - ] |
22.02.2005, 08:38 Uhr Solar Posts: 3680 Nutzer |
Als Lernbuch kann ich den Breymann empfehlen. [ - Antworten - Zitieren - Direktlink - ] |
22.02.2005, 14:10 Uhr Amaris Posts: 941 Nutzer |
Hmm...danke für die Tips. Hab mir jetzt aber mal dieses hier gekauft: http://www.amazon.de/exec/obidos/ASIN/3827268125 Wirds auch tun. -- -Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM -AmigaOne (µA1, G3), 160GB HDD, 256MB RAM [ - Antworten - Zitieren - Direktlink - ] |
23.02.2005, 14:42 Uhr obw Posts: 94 Nutzer |
Zitat: Ich habe persönlich viel gutes über den Josuttis gehört. Der Autor hat auch die deutsche Ausgabe vom Stroustrup mit übersetzt, da weiß er, wo bei dem die Schwächen sind. OBW [ - Antworten - Zitieren - Direktlink - ] |
29.03.2005, 13:45 Uhr Mad_Dog Posts: 1944 Nutzer |
Schaust Du hier: http://www.norman-interactive.com/C-Kurs_9_1.html -- http://www.norman-interactive.com [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Array-Größe durch Variable bestimmen ? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |