amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Array-Größe durch Variable bestimmen ? [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2005-02-19, 21:47 h

Amaris
Posts: 941
User
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

[ - Answer - Quote - Direct link - ]

2005-02-19, 22:13 h

DariusBrewka
Posts: 899
[Banned user]
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.


[ - Answer - Quote - Direct link - ]

2005-02-19, 22:28 h

Amaris
Posts: 941
User
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

[ - Answer - Quote - Direct link - ]

2005-02-19, 22:40 h

DariusBrewka
Posts: 899
[Banned user]
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.

[ - Answer - Quote - Direct link - ]

2005-02-19, 23:01 h

Kaesebroetchen
Posts: 643
User
@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.

[ - Answer - Quote - Direct link - ]

2005-02-19, 23:13 h

Amaris
Posts: 941
User
@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

[ - Answer - Quote - Direct link - ]

2005-02-19, 23:24 h

Kaesebroetchen
Posts: 643
User
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

[ - Answer - Quote - Direct link - ]

2005-02-19, 23:55 h

DariusBrewka
Posts: 899
[Banned user]
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.

[ - Answer - Quote - Direct link - ]

2005-02-20, 01:15 h

RoKo
Posts: 72
User
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)

[ - Answer - Quote - Direct link - ]

2005-02-20, 10:26 h

DariusBrewka
Posts: 899
[Banned user]
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.

[ - Answer - Quote - Direct link - ]

2005-02-20, 11:01 h

RoKo
Posts: 72
User
Eben, es ging doch gerade darum, new einzuführen ;-)
Wenn es um mehr Dynamik geht, gibt es auch noch den std::vector.

[ - Answer - Quote - Direct link - ]

2005-02-20, 11:23 h

Amaris
Posts: 941
User
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

[ - Answer - Quote - Direct link - ]

2005-02-20, 11:58 h

RoKo
Posts: 72
User
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;

[ - Answer - Quote - Direct link - ]

2005-02-21, 08:49 h

Solar
Posts: 3680
User
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ß. ;) )

[ - Answer - Quote - Direct link - ]

2005-02-21, 14:40 h

Holger
Posts: 8116
User
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.

[ - Answer - Quote - Direct link - ]

2005-02-21, 16:28 h

Amaris
Posts: 941
User
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

[ - Answer - Quote - Direct link - ]

2005-02-22, 02:22 h

obw
Posts: 94
User
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

[ - Answer - Quote - Direct link - ]

2005-02-22, 08:38 h

Solar
Posts: 3680
User
Als Lernbuch kann ich den Breymann empfehlen.

[ - Answer - Quote - Direct link - ]

2005-02-22, 14:10 h

Amaris
Posts: 941
User
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

[ - Answer - Quote - Direct link - ]

2005-02-23, 14:42 h

obw
Posts: 94
User
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

[ - Answer - Quote - Direct link - ]

2005-03-29, 13:45 h

Mad_Dog
Posts: 1944
User
Schaust Du hier:

http://www.norman-interactive.com/C-Kurs_9_1.html


--

http://www.norman-interactive.com

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Array-Größe durch Variable bestimmen ? [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.