Initialisierung von Arrays
-
In einen Buch habe ich folgenden Programmcode gesehen:
struct form { char h; char b; int data[4][4]; }; const form s_01_1 = {2, 3, {{1,1,1}, {0,1,0}}};
mich würde jetzt interessieren mit welchen Wert z. B. s_01_1.data[3][3] belegt ist – das wurde ja nicht explizit festgelegt – belegt das der Compiler automatisch (implizit) mit dem Wert 0? Meiner Meinung nach kann da alles stehen – da das aber jemand geschrieben hat von dem ich glaube, dass er sich ein wenig damit auskennt möchte ich hier noch einmal nachfragen..
-
Für jedes form element wird der standard konstruktor aufgeführt, das struct form
müsste also in einem Konstruktor (ohne parameter) die werte von seinen membern definieren.
-
> Für jedes form element wird der standard konstruktor aufgeführt
der Standard Konstruktor hat doch keine Auswirkungen auf das data Array, also ist mir das egal
> das struct form müsste also in einem Konstruktor (ohne parameter) die werte von seinen membern definieren.
???
-
Hi,
na ja, was ist denn die standardmäßige Initialisierung von einer gewöhnlichen Variablen?
int a;
denke in deinem Beispiel wird es genau so sein.
MfG Eisflamme
-
> das struct form müsste also in einem Konstruktor (ohne parameter) die werte von seinen membern definieren.
aso - manchmal dauert es halt mal länger
- ich behaupte jetzt einfach es liegt an der Uhrzeit - ich bin sicherlich übermüdet oder so...
(Hilfe! jetzt bin ich ein gefundenes Fressen für TGGC
)
-
#include <iostream> using namespace std; struct form { char h; char b; double data[4][4]; }; const form s_01_1 = {2, 3, {{1,1,1}, {0,1,0}}}; int main() { cout<<"Hallo Welt"<<endl; for(int y = 0; y < 4; y++) { for(int x = 0; x < 4; x++) { cout<<s_01_1.data[x][y]; } cout<<endl; } double x; cout<<x<<endl; }
Ausgabe dazu:
Hallo Welt 1000 1100 1000 0000 -9.25596e+061 Press any key to continue
Erstaunlicher Weiße stehen aber im Array immer sinnvolle Werte? liegt das an meinem Compiler?
-
obiger code wurde mit MSVC 6.0 unter WinXP ausgeführt
unter Linux mit g++ bekomm ich ähnliche Ergebnisse:Ausgabe:
Hallo Welt 1000 1100 1000 0000 9.66126
liegts jetzt am Compiler - ist es einfach nur Zufall - oder verlangt das der C++ Standard so?
-
Wenn ich den Code mit MSVC 7.1 ausführe bekomme ich eine Schutzverletzung:
Run-Time Check Failure #3 - The variable 'x' is being used without being defined.
-
was sind den bitte sinnvolle werte ?
ein int kann nur einen int wert haben. also wird ein int immer int sein...
haste jetzt erwartet, dass dein int wert mit einem string gefüllt wird ?
ich würd sagen die variable hat den wert, den dieser speicherbereich hat. speicher wird ja nicht auf 0 zurückgesetzt, wenn dieser freigegeben wird.
-
> Wenn ich den Code mit MSVC 7.1 ausführe bekomme ich eine Schutzverletzung:
was passiert wenn du x weg läßt?
> was sind den bitte sinnvolle werte?
bei einem numerischen Typ wäre für mich als Initialisierungswert 0 sinnvoll (aus der sicht meines Programmes wäre 0 sinnvoll - ob das bei anderen Programmen auch sinnvoll ist weiß ich nicht)
> ich würd sagen die variable hat den wert, den dieser speicherbereich hat. speicher wird ja nicht auf 0 zurückgesetz
also du sagst das ist zufall - und das hat der Compiler intern nicht irgendwie mit 0 initialisiet - bzw. der C++ Standard verlangt es auch nicht so
das komische dabei ist halt das die Double Werte im Array, sinnvolle Werte enthalten, obwohl sie nicht initialisiert wurden - und ein einzelner double Wert eigentlich immer irgendwelchen Unsinn (Wert ungleich 0) enthält
-
wie gesagt, was ist sinnvoll ?
bei einem Sprite (DirectX) object ist es nicht sinnvoll die skalierung auf 0 zu haben. weil dann ist size * 0 = 0 und der object wird nicht angezeigt und man wundert sich wieso.
es war halt zufall das die werte auf speicherbereiche erstellt worden sind die 0 waren. wenn du den pc über tage laufen lässt müsste die wahrscheinlichkeit gegen 0 sinken.
-
> waren. wenn du den pc über tage laufen lässt müsste die wahrscheinlichkeit gegen 0 sinken.
naja... da ich Student bin habe ich Zugriff auf das Rechenzentrum - die PCs dort werden eigentlich nie ausgeschaltet - nur wenn Stromausfall ist
- auf dem hab ich das Programm auch laufen lassen mit gleichen Ergebnissen
auf meinem Heimrechner nach etwa 2 Tagen gab es auch keine anderen Ergebnisse (für die Werte des Arrays - für x ist iregendein beliebiger Wert herausgekommen)
aber ich kann jetzt mal festhalten
const form s_01_1 = {2, 3, {{1,1,1}, {0,1,0}}};
ist was anderes wie:
const form s_01_1 = {2, 3, {{1,1,1,0}, {0,1,0,0}, {0,0,0,0}, {0,0,0,0}}};
da das gleiche dabei rauskommt ist reiner zufall - bzw. vielleicht liegts ja wirklich am Compiler - auf jeden Fall ist das erste Codefragment nicht mit dem zweiten Codefragment in der Wirkung gleich nach dem C++ Standard - ich dachte da der C++ Standard auch definiert wie Compiler so etwas handhaben, könnte es vielleicht sein das beides die gleiche Wirkung hat...