C++ dynamisches Array mit new klappt nicht

strohhaar

Lt. Junior Grade
Registriert
Nov. 2009
Beiträge
410
Hallo,

ich möchte zur laufzeit ein feld anlegen. scheinbar mache ich etwas falsch? es gibt keine fehlermeldung, sondern es wird einfach kein feld angelegt. ich arbeite mit vs10.

Code:
y=10;

int *x = new int [y];
 
Und was genau funktioniert daran nicht?
 
Könntest du bitte ein komplettes (Minimal)Programm inklusive Fehlermeldung posten?
 
Ich würde behaupten,

"y = 10;"

ist schon einmal falsch,

du solltest zumindestens einen typen zuweisen.

Aja was das Array betrifft solltest du wirklich mehr Code posten, das Anlegen ist vollkommen richtig bis auf das y ;). Aber so kann man da rein gar keine Fehlerquelle erkennen!
 
es gibt doch nichts besseres als gutes altes C

int y=10;

int *x = ( int * ) malloc( sizeof( int ) * y );

ähm das funzt auch unter C++ ( vs10 )
 
BadMadMax: bringt aber nichts, da die Fragestellung war wieso es mit new nicht geht.

TE: mehr Code bitte und genauere Informationen.
 
das war/ist mir schon klar.

int main( void )
{
int y=10;

int *x = new int [ y ];

return ( 0);
}

Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.

Array.c
Array.c(5) : error C2065: 'new' : undeclared identifier
Array.c(5) : warning C4047: 'initializing' : 'int *' differs in levels of indirection from 'int'
Array.c(5) : error C2143: syntax error : missing ';' before 'type'
Array.c(5) : error C2143: syntax error : missing ';' before '['
 
BadMadMax schrieb:
es gibt doch nichts besseres als gutes altes C



ähm das funzt auch unter C++ ( vs10 )

Man sollte aber keinen C-Code verwenden, wenn man C++ benutzt. Auch wenn das möglich ist.
Wenn man malloc/free anstatt new/delete in C++ benutzt wird man nämlich ziemlich bald auf die Schnauze fliegen. free() ruft nämlich keinen Destruktor von Klassen auf, wenn sie zerstört werden, was delete hingegen schon macht.

An den TE:
Wo genau tritt der Fehler auf? Compile-fehler oder Laufzeit-Fehler? Welches Verhalten tritt auf? Welche Fehlermeldung?

zu deiner Fehlermeldung:
Code:
Array.c(5) : error C2065: 'new' : undeclared identifier
Visual C++ kompiliert automatisch im "C-Modus", wenn die Datei mit ".c" endet. Benenn die Datei mal in irgenwdas mit ".cpp" um
 
Zuletzt bearbeitet:
ups ;D

u. im falle eines simplen int wohl ist kein Konstruktor/Destruktor nötig. wobei intern sicher sowas wie "malloc + x.konstruktor()" gemacht wird - aber egal.
 
Ja, das ist mir schon klar, dass man bei Integern auch malloc/free benutzen könnte. Allerdings sollte man sich diese "schlechten Angewohnheiten" von Anfang an abgewöhnen. Irgendwann benutzt er dann eine Klasse anstatt einem Integer und wundert sich dann, warum ihm alles um die Ohren fliegt.
 
^^

aber hey gut aufgepasst das mit dem Array."c"
 
Wenn in C++ Arrays mit einer zur Kompilierzeit nicht feststehenden Größe benötigt werden, sollte man wo immer möglich std::vector den Vorzug geben.

Code:
#include <vector>

int main()
{
	// erstellt vector mit 10 Integerelementen (werden alle mit 0 initialisiert).
	std::vector< int > myVector( 10 );
	
	// Zugriff geht mit [], wie man's von Arrays gewohnt ist.
	myVector[ 0 ] = 3453;
	
	// Zugriff per at() ist aber sicherer (wirft exception, wenn Index falsch).
	myVector.at( 0 ) = 242;
	
	// vector kann sogar vergrößert werden
	myVector.resize( 40 );
}
 
sorry, für die späte rückmeldung. es gibt keine fehlermeldung, er baut einfach kein feld auf.

wenn ich einen haltepunkt setze, dann habe ich für z ein schönes feld, man kann sich schön den inhalt ansehen, bzw. den index.
bei x ist nichts zu sehen. wenn ich mir den inhalt, bzw. index ansehen möchte (auf "+" drücke) steht bloß -842.... da.


bsp.:

neues projekt:

Code:
int main()
{

int z[5];

int y=10;

int *x = new int [y];

delete[] x;

return 0;

}
 
Das ist bloß eine Unzulänglichkeit des Debuggers. :) Dein Array existiert. Belege doch einfach mal in einer for-Schleife jedes Element mit einem Wert und gibt die Werte dann in einer anderen for-Schleife aus, nur um deine Nerven zu beruhigen. ;)
 
da muss ich dir mal wieder danken. schande über mein haupt! :(
 
Wenn in C++ Arrays mit einer zur Kompilierzeit nicht feststehenden Größe benötigt werden, sollte man wo immer möglich std::vector den Vorzug geben.

Ich glaube nicht das man vector immer den Vorzug geben sollte, vorallem wenn man in der Lernphase ist sollte man sich erst einmal damit auseinander setzen wie man selber so etwas schreiben könnte, außerdem ist es in manchen Fällen nicht wirklich schneller bzw. sinnvoller vector zu verwenden, meiner Meinung nach lohnt sich diese Blasse nur wenn du das Array im nachhinein in seiner Größe verändern willst!
 
HerzogDeXtEr schrieb:
meiner Meinung nach lohnt sich diese Blasse nur wenn du das Array im nachhinein in seiner Größe verändern willst!
antred schrieb:
Wenn in C++ Arrays mit einer zur Kompilierzeit nicht feststehenden Größe benötigt werden, sollte man wo immer möglich std::vector den Vorzug geben.
Ich sehe nichts gegenteilig behauptetes.
HerzogDeXtEr schrieb:
außerdem ist es in manchen Fällen nicht wirklich schneller bzw. sinnvoller vector zu verwenden
array <-> vector: https://www.computerbase.de/forum/threads/performance-von-c-aktueller-stand.846385/

Nimmt sich kaum etwas, wenn du vorher Platz reservierst.
 
HerzogDeXtEr schrieb:
vorallem wenn man in der Lernphase ist sollte man sich erst einmal damit auseinander setzen wie man selber so etwas schreiben könnte

Wie, du meinst, der OP sollte sich aus Lernzwecken seinen eigenen vector-Ersatz schreiben? Das hätte sicherlich einen hohen Lehrwert, würde ihn aber auch stark von seinem eigentlichen Ziel ablenken - sein Programm zum funktionieren zu bringen.

Oder schlägst du stattdessen vor, der OP sollte weder vector noch einen eigenen Ersatz verwenden sondern einfach weiterhin 'nackte' Arrays benutzen? Dem müßte ich genau so widersprechen.

Man kann nie zu früh damit anfangen, sich mit der Standard C++ Bibliothek vertraut zu machen. Einige Programmierer bleiben, wenn sie diesen wichtigen Schritt zu lange vor sich her schieben, für immer und ewig in ihrer C-mit-Klassen Welt gefangen.
Ich selbst kenne einen ganzen Haufen C++-Programmierer, die auch nach 15 Jahren und mehr Erfahrung mit C++ in Sachen C++ Standardbibliothek noch immer von Tuten und Blasen keine Ahnung haben. Da wird dann eben (wahrscheinlich bis ans Ende ihrer Karriere) weiter fröhlich mit nackten Arrays hantiert und schiefen Pointern geschossen.

Gerade als Neuling sollte man sich vom Compiler und der Standardbibliothek so viel Arbeit wie möglich abnehmen lassen. Das erlaubt einem, sich auf die eigentliche Problematik des Programmierens zu konzentrieren anstatt sich mit all den Ecken und Kanten der Sprache C++ rumzuschlagen - davon gibt es nämlich selbst mit vector & co noch mehr als genug.
 
Zurück
Oben