Array einen Wert zuweisen
-
Guten Tag zusammen
Entschuldigt bitte meine Anfängerfrage, ich habe bis anhin nur mit C# intensiv gearbeitet.Irgendwie klappt das kopieren eines int Wertes in einen int Array nicht.
Bei mir siehts etwa folgendermassen aus:int* aiMax = new int[10]; int temp = atoi(input); //Funktioniert super, der richtige Wert ist in temp aiMax[index] = temp; //index ist eine variabelDa passiert einfach gar nichts der Array hat weiterhin den Wert 0.
Danke für Eure Hilfe.
-
Hallo,
Da passiert einfach gar nichts der Array hat weiterhin den Wert 0.
An Position index? Btw: Gilt, dass 0 <= index < 10?
Folgender Code-Snippet sollte funktionieren:
#include <iostream> int main() { int* vec = new int[10]; index = 9; input = 18; // oder ein anderer Wert... vec[index] = input; std::cout << "vec[" << index << "] = " << vec[index] << std::endl; delete[] vec; // Speicher auch wieder freigeben! Nicht vergessen. }Gruß Caipi
-
Möchtest du denn den ganzen Array füllen oder nur ein Element?
-
@Caipi: Ja, beim Index z.B. 1. Mein Code Snipped sieht ja etwa gleich aus.
Ich möchte nur eine Array Element füllen.
-
analyzer schrieb:
@Caipi: Ja, beim Index z.B. 1. Mein Code Snipped sieht ja etwa gleich aus.
Dann poste doch mal deinen, in etwa gleichaussehenden, Code-Snippet :).
Gruß, Caipi
-
int iIndex = 0; int temp = atoi(input); aiMax[iIndex] = temp;Ich verwende als Index eine Variabel da die ganze Sache später in einer while - Schleife stehen wird.
std::cout << "vec[" << index << "] = " << vec[index] << std::endl;Dieser Teil Deines Codes verstehe ich nicht, ich denke jedoch, dass dieser nur zur Ausgabe auf der Console ist.
Beim setzen eines Debuggerhaltepunktes hat temp der richtige Wert.
-
Hallo,
Kann in deinen Zeilen keinen Fehler entdecken. Poste doch mal ein compilierbares Minimalbeispiel, in welchem der Fehler reproduzierbar ist.analyzer schrieb:
std::cout << "vec[" << index << "] = " << vec[index] << std::endl;Dieser Teil Deines Codes verstehe ich nicht, ich denke jedoch, dass dieser nur zur Ausgabe auf der Console ist.
Genau richtig gedacht :).
Gruß, Caipi
-
Eventuell mache ich die ganze Sache ein wenig kompliziert

//Input ifstream stream("c:\\file.in"); char input[20]; //Erste Zeile lesen stream >> input; //Erste Zeile ist die Anzahl Datensätze iAnzahlT = atoi(input); //Array mit der maximale Anzahl an Zahlen int* aiMax = new int[iAnzahlT]; int iIndex = 0; while(!stream.eof()) { //Buffer wieder zurücksetzen for (int i = 0; i<20; i++) { input[i] = -52; } stream.getline(input, 20); int temp = atoi(input); aiMax[iIndex] = temp; iIndex++; }Wie schon erwähnt bin ich C++ erst am lernen.
-
Hallo,
Nehmen wir zuerst einmal an, dass in file.in folgender Inhalt steht:3 9 18 27Mit deinem Code erhalte ich jetzt (nachdem ich eine main() drumgeklatscht habe), einen Segmentation-Fault.
int main() { fstream stream("in.txt"); char input[20]; //Erste Zeile lesen stream >> input; //Erste Zeile ist die Anzahl Datensätze int iAnzahlT = atoi(input); //Array mit der maximale Anzahl an Zahlen int* aiMax = new int[iAnzahlT]; int iIndex = 0; while(!stream.eof()) { //Buffer wieder zurücksetzen for (int i = 0; i<20; i++) { input[i] = -52; } stream.getline(input, 20); int temp = atoi(input); aiMax[iIndex] = temp; iIndex++; } cout << endl; }Das liegt daran, dass du in der while Schleife nur auf !stream.eof() testest. eof() liefert aber nur true, wenn das Ende der mit dem Stream assozierten Datei bereits gelesen _wurde_! => Du versuchst in Speicher zu schreiben, der dir nicht gehört! (Siehe dazu auch: hier).
Also änder ich mal den Audruck in der While-Schleife zu.while(stream.good() && iIndex < iAnzahlT).
Desweiteren gebe ich den Speicher mitdelete[] aiMax;auch wieder frei.
Mit diesen Änderungen sieht der Code so aus:
int main() { fstream stream("in.txt"); char input[20]; //Erste Zeile lesen stream >> input; //Erste Zeile ist die Anzahl Datensätze int iAnzahlT = atoi(input); //Array mit der maximale Anzahl an Zahlen int* aiMax = new int[iAnzahlT]; int iIndex = 0; while(stream.good() && iIndex < iAnzahlT) { //Buffer wieder zurücksetzen for (int i = 0; i<20; i++) { input[i] = -52; } stream.getline(input, 20); int temp = atoi(input); aiMax[iIndex] = temp; iIndex++; } delete[] aiMax; }Mit einer Kontroll-Ausgabe (z.B.)
copy(aiMax, aiMax + iAnzahlT, ostream_iterator<int>(cout, ", ")); // benötigt <iterator> und <algorithm>Erhalte ich die Ausgabe:
9, 18, 27,.
So. Jetzt funktioniert der Code-Snippet. Allerdings würde ich ihn Folgendermaßen schreiben:
#include <iostream> #include <fstream> #include <algorithm> #include <iterator> using namespace std; int main() { fstream stream("in.txt"); // Fehlerbehandlung einbauen. if(!stream) return 1; int input; // Wenn du sowieso nur Zahlen einließt, wieso deklarierst du // input dann nicht vom Typ int? //Erste Zeile lesen stream >> input; // Es entfallen die lästigen (und unsicheren) Konvertierungen mittels der Funktion atoi(). int iAnzahlT = input; // Wie soll verfahren werden, wenn input negativ? (In diesem Fall wirft new eine Exception). //Array mit der maximale Anzahl an Zahlen int* aiMax = new int[iAnzahlT]; int iIndex = 0; while(iIndex < iAnzahlT && stream >> aiMax[iIndex]) { // die For-Schleife entfällt. // stream.getline, atoi() und temp ebenfalls. iIndex++; } copy(aiMax, aiMax + iIndex, ostream_iterator<int>(cout, ", ")); // Kontrll-Ausgabe nach cout. delete[] aiMax; // Speicher freigeben! }Gruß, Caipi
-
Danke für Deine Antwort.
Das zuweisen der Werte im Array funktioniert nun.
Im Textfile stehen nun weitere Angaben:1 6 0 1 4 1 8 1 7 0 2 2 3 2 1 5 0 0Ich möchte nun auch die folgenden Zahlen auf einer Zeile sauber auslesen können. Leider gibts da irgendwie ein durcheinander:
6, 1, 1, 1, 0, 2, 2, 5, 0,Aus diesem Grund habe ich vorher getline verwendet.
Man kann von der Korrektheit der Eingaben ausgehen (keine negativen Werte).Danke.