Array in einer while Schleife
-
Guten Tag.
Ich lerne anhand eines Buches C++, und dort ist folgendes beispiel .
Eine "while Schleife" mit "array".#include <iostream> using namespace std; int main() { int anzahl, i = 1; cout << "Wie viele Werte m\224chten Sie eingeben? "; cin >> anzahl; int array[anzahl]; while (i <= anzahl) { cout << "Geben Sie den " << i << ". Wert ein: "; cin >> array[i - 1]; i++; } }
Aber Visual Studio zeigt immer den Fehler an das in Zeile 9 die "[anzahl]" ein Konstantenwert haben muss.
Ich selber weiß keine lösung.
Im vorherigen beispiel im Buch wurde ein fester Wert in der Kammer genannt. Jetzt soll ja durch der "cin" Eingabe der Wert vom Nutzer selbst bestimmt werden. Was aber leider nicht funktioniert.
-
@Dpascalm sagte in Array in einer while Schleife:
Aber Visual Studio zeigt immer den Fehler an das in Zeile 9 die "[anzahl]" ein Konstantenwert haben muss.
Da hat VS recht. Wenn das Buch das so zeigt, solltest du es in die Altpapiertonne werfen.
Für dies Aufgabe gibt es std::vector. Wenn das Buch mit Arrays anfängt, solltest du es in die Altpapiertonne werfen.
Mit Forentechnik hat die Frage aber ganz bestummt nichts zu tun.
-
Erstmal Danke für die schnelle Antwort.
Wieso was sind an Array schlecht dran?
in welchen Foren hätte ich es denn reinschreiben sollen?
Hier ein Link zum Buch
https://www.amazon.de/Programmieren-Einsteiger-leichte-Experten-Einfach-ebook/dp/B07H4M5GML/ref=sr_1_2?__mk_de_DE=ÅMÅŽÕÑ&keywords=michael+bonacina&qid=1575042571&sr=8-2
-
@Dpascalm sagte in Array in einer while Schleife:
Wieso was sind an Array schlecht dran?
Offensichtlich funktioniert der Code doch nicht. Ist das schlecht genug? Für konstante Grö0en kannst du so ein Array zwar nehmen, aber in C++ gibt es da auch
std::array
für. Dann kannst du z.B. auch gleich mit.size
die Länge bekommen.Für genau diesen Zweck (Speicheranforderung von einer Anzahl Elementen, die erst zur Laufzeit bekannt ist) gibt es
std::vector
. Siehe https://en.cppreference.com/w/cpp/container/vector - schau dir da am besten gleich mal das Beispiel an. Wenn das Buch dir was anderes beibringt, das noch nicht einmal kompiliert, ist es offenbar schlecht.
-
@Dpascalm
Was du benutzt sind VLA (variable length array).
Die sind gemäß C++ Standard verboten, aber (leider) Bestandteil vom C99 Standard. (eine der wenigen Sachen, die in C++ konsequenter gehandhabt werden als in C). Als nicht-standardkonforme Extension erlauben das manche Compiler, probier mal "-pedantic-errors" als Compiler-Option.
Werfe dein C++ Buch weg und beschwere dich bei Autor. Der hat keine Ahnung.
Und benutzte - wenn du wirklich weißt, dass du C++ und nicht C Code schreiben willst - vector.
vector ist in C++ geschaffen worden für Leute, die keine Ahnung von C haben aber trotzdem behaupten wollen, sie könnten programmieren.
-
Warum stellst du diese Frage in Forentechnik?
Zum Thema: Doppelt schlimm. Selbst in C wäre die Angabe von VLA-Größen durch Benutzer hochriskant und nicht der Anwendungsfall, für den VLAs vorgesehen sind. Der Autor kann also auch kein C, sondern hat wahrscheinlich einfach nur rumprobiert bis bei ihm Zuhause sein Beispiel zufällig funktioniert hat, ohne es selber zu verstehen. Schöner Experte.
-
@wob sagte in Array in einer while Schleife:
Wenn das Buch dir was anderes beibringt, das noch nicht einmal kompiliert, ist es offenbar schlecht.
Oder hoffnungslos veraltet. Ich tippe mal dass das Buch bzw. die Stelle vor C++11 entstanden ist. Damals gab es noch kein std::array.
Und genau das könnte die Ursache für den Fehler sein. Der Compiler möchte hier ein std::array instanziieren.
@Dpascalm
Schau dir mal die Doku zu std::vector an
-
@Quiche-Lorraine sagte in Array in einer while Schleife:
Der Compiler möchte hier ein std::array instanziieren.
WTF?
-
@Quiche-Lorraine sagte in Array in einer while Schleife:
@wob sagte in Array in einer while Schleife:
Wenn das Buch dir was anderes beibringt, das noch nicht einmal kompiliert, ist es offenbar schlecht.
Oder hoffnungslos veraltet. Ich tippe mal dass das Buch bzw. die Stelle vor C++11 entstanden ist. Damals gab es noch kein std::array.
Nein, VLAs waren noch nie richtig, in keinem C++-Standard.
std::array
ist hier auch das falsche Mittel, weil es eben nicht dynamisch ist.std::vector
ist korrekt und den gibt es seit dem 1. Standard.
-
@SeppJ sagte in Array in einer while Schleife:
Nein, VLAs waren noch nie richtig, in keinem C++-Standard.
std::array
ist hier auch das falsche Mittel, weil es eben nicht dynamisch ist.std::vector
ist korrekt und den gibt es seit dem 1. Standard.Kann man ein std::array denn nicht mit
int i; std::cin >> i; std::array<int, i> arr;
erstellen?
-
Nein, denn ein Template-Parameter muß ja eine Compilezeit-Konstante sein.
-
Ach jo ... manchmal hat man aber auch ein Brett vor dem Kopf ...
-
@Mechanics
Sorry, hast recht. Habe es gerade überprüft. Ich habe da wohl etwas durcheinandergebracht.