amiga-news 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:
Original von Amaris:

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.



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:
Original von RoKo:
int test[] = new int[anzahl];
(es ist übrigens egal, ob man int[] test oder int test[] schreibt)


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:
Original von Solar:
Schlagt den armen Kerl doch nicht mit doppelt verketteten Listen o.ä., wenn er erst einmal die Standard-Bibliothek verstehen muß. ;)

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:
Original von Solar:

In C++ verwendet man eigentlich grundsätzlich keine Arrays (zumindest nicht ohne sehr guten Grund), sondern Vektoren.
Der Rest zu Vektoren findet sich im C++-Buch Deiner Wahl,...



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:
Original von Amaris:
Zitat:
Original von Solar:

In C++ verwendet man eigentlich grundsätzlich keine Arrays (zumindest nicht ohne sehr guten Grund), sondern Vektoren.
Der Rest zu Vektoren findet sich im C++-Buch Deiner Wahl,...



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...


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. 8)

Wenn Du einen kompletten Überblick über C++ haben willst, gibt es eigentlich nur ein Buch (zum Lernen ist das aber eher Hardcore :rotate: )
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:
Original von Solar:
Als Lernbuch kann ich den Breymann empfehlen.



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.
.