Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

1

19.09.2015, 07:52

C++ Grundlagen: Konstante Werte sowie Array und Vektor

Hallo

Ich habe Verständnisprobleme mit Arrays und Vektoren und möchte um Hilfe bitten Licht ins Dunkle zu bringen.

1.)
Wenn ich im Header setze:

C-/C++-Quelltext

1
#define ADSIZE 20


und in der main Funktion:

C-/C++-Quelltext

1
2
3
int Sequenz[ADSIZE];
for(il=0; il<ADSIZE; il++){Sequenz[il]=il;}
for(il=0; il<ADSIZE; il++){cout << Sequenz[il];}


Dann wird mir auf der Konsole ein Array von 0 bis 19 angezeigt.

Wenn ich allerdings nicht ADSIZE im Header definiere, sondern in der main Funktion

C-/C++-Quelltext

1
2
const int ADSIZE;
ADSIZE = 20;


dann erhalte ich den Compiler Fehler:

Quellcode

1
2
error: uninitialized const ‘ADSIZE’
error: assignment of read-only variable ‘ADSIZE’


Bin ich damit also verpflichtet feste Variableninhalte immer mit define zu verwenden? Mir ist es wichtig, dass absolut gesichert ist, dass die Größe ADSIZE niemals von dem C++ Programm geändert werden darf, unter keinen Umständen.


2.)
Wenn ich bis jetzt einen Vektor benötige, dann habe ich ein Array erstellt und dieses dann in einen Vektor umgewandelt. Das finde ich unschön und würde lieber direkt den Vektor definieren. Mein Problem ist nun, dass

C-/C++-Quelltext

1
2
vector<int> sequenz;
for(il=0; il<ADSIZE; il++){sequenz[il]=il;}


zu einem Compiler Fehler führt:

Quellcode

1
Segmentation fault


Ich habe das Programm mit gdb ausführen lassen und dieses sagt mir:

Quellcode

1
2
3
Program received signal SIGSEGV, Segmentation fault.
0x00000000004007e3 in main () at test.cpp:31
31  for(il=0; il<ADSIZE; il++){sequenz[il]=il;}


aber abgesehen davon, dass in der for Schleife was nicht zu stimmen scheint, weiss ich das nicht weiter zu interpretieren.

Also wie kann ich mein Array 0 bis ADSIZE-1 direkt als Vektor deklarieren?

Danke für Hilfe und Grüße

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »eisenmad« (19.09.2015, 07:59)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

19.09.2015, 08:51

C-/C++-Quelltext

1
#define ADSIZE 20

Ist ein Befehl für den Präprozessor. Der sorgt dafür dass alle darauffolgenden ADSIZE durch 20 ersetzt werden. Als wenn du selbst den Code durch gehst und an jeder Stelle an welcher ADSIZE steht schreibst du 20 hin.

C-/C++-Quelltext

1
const int ADSIZE

ist eine C++ Konstante. Diese muss mit einem Wert initialisiert werden, deshalb der erste Fehler. Danach darf der Wert nicht geändert werden, da du aber eine Zuweisung machst kommt dein zweiter Fehler. Richtig wäre:

C-/C++-Quelltext

1
const int ADSIZE = 20;

Was deinen std::vector angeht, da hast du mehrere Möglichkeiten. Einerseits gibt es die Funktion push_back:

C-/C++-Quelltext

1
2
3
4
5
const int VECTOR_SIZE = 20;
std::vector<int> vec;
for(int i = 0; i < VECTOR_SIZE; i++) {
    vec.push_back(i);
}

Außerdem kannst du einen std::vector mit einem Standardwert initialisieren:

C-/C++-Quelltext

1
2
const int VECTOR_SIZE = 20;
std::vector<int> vec(VECTOR_SIZE, 15); // erzeugt einen std::vector der Größe VECTOR_SIZE wobei alle Elemente den Wert 15 bekommen

Was du aber auch machen kannst:

C-/C++-Quelltext

1
std::vector<int> vec =  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // erzeugt einen std::vector der Größe 10 mit den Werten 1 bis 10, die Größe wird hier automatisch vergeben


Einem std::vector kannst du mit push_back immer ein Element am Ende anhängen. std::vector hat noch viele weitere Methoden die für die Arbeit sinnvoll sind. Eine kleine Anmerkung noch zur Variante mit der Schleife oben. C++ 11 führt das auto Schlüsselwort ein. Vereinfacht gesagt musst du Typen die der Compiler zuweisen kann nicht explizit angeben. Hierfür gelten aber einige bestimmte Regeln. Was du dir aber für den Anfang merken kannst, anstatt:

C-/C++-Quelltext

1
for(int i = 0; i < 42; i++) {}

kannst du folgendes schreiben:

C-/C++-Quelltext

1
for(auto i = 0; i < 42; i++) {}

Für den Anfang wirkt das erst mal nicht vorteilhaft. Das funktioniert aber zum Beispiel auch für Iteratoren und für viele andere Dinge. Benutz es vielleicht schon mal für diese Version der Schleifen. Mit der Zeit wirst du dann vermutlich lernen wann du es warum einsetzen kannst. Das hier genauer zu erklären würde aber den Rahmen sprengen und vermutlich noch nicht verstanden werden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

19.09.2015, 09:01

Du musst die konstante direkt bei der deklaration initialisieren, da du diese ja nicht mehr ändern kannst:

Quellcode

1
const int g = 4;

Btw kannst du auch direkt die arraygröße mit einem zahlenliteral setzen:

Quellcode

1
int a[7];

Rohe array werden eher selten benutzt, da man in den meisten fällen keine statische anzahl von elementen benutzt.
#define solltest du übrigens nie für konstanten oder makros benutzen, dafür gibt es schließlich oben stehende Konstanten und Funktionen.

Ein Vector ist eine Art dynamisches Array. Am anfang ist es leer, weshalb der Zugriff auf nicht vorhande elemente zu undefiniertem verhalten führt. Hier kommt die meldung, dass du versuchst, auf speicherbereiche zuzugreifen, die nicht für dein Programm bestimmt sind (=segmentation fault oder acces violation, was auch kein compilerfehler ist, da das programm ja schon am laufen ist; die meldung kommt vom Betriebssystem)
Die lösung wäre die größe dieses vector mit resize zu ändern oder mit push_back ein neues ans ende zu tun. Weiter erfährst du mit der suchmaschine deiner wahl ;)

eisenmad

Treue Seele

  • »eisenmad« ist der Autor dieses Themas

Beiträge: 84

Wohnort: Heute hier, morgen dort

Beruf: Denker

  • Private Nachricht senden

4

19.09.2015, 19:47

Das hat mir sehr geholfen. Vor allem dein Beitrag Schorsch. Danke sehr dafür :)

Anbei, heute hat die Post mein Buch der C++ Programmierer geliefert. Macht einen tollen Eindruck. Ich hab mal geguckt von wann meine Quelle war aus der ich bis jetzt Infos genommen habe: 1997, altes Teil. Das werde ich weg werfen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

20.09.2015, 04:27

Weg werfen brauchst du das sicherlich nicht. Ich würde davon ausgehen dass alles was in dem Buch steht auch immer noch gilt. Manchmal ist es sinnvoll mehr als ein Buch zum Verständnis zu haben. Der C++ Programmierer ist für den Anfang nicht unbedingt einfach. Wenn du dort etwas nicht verstehst kannst du das Thema in deinem "alten" Buch noch mal nachlesen. Viele Themen haben sich im Bezug auf C++ in der Zwischenzeit nicht geändert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige