Dynamisches Array ohne new?
-
Das Problem ist nicht, dass es nicht möglich ist (construktors sind wirklich kein Argument schon mal was von einer Schleife gehört?) sondern, dass es einen Grösseren overheat erzeugt als auto_ptr. Ein grösseres teschnisches Problem ist (ich glaub das hat Stoustrup gemeint als er von constructoren gesprochen hat) dass in C++ die Variablen nicht erschaffen werden können wenn der Scope geöffnet wird da sie nicht da definirt werden müssen. Wenn die Gösse at compiletime bekannt ist spielt es keine Rolle in welcher Reienfolge die Arrays auf den Stack kommen jedoch bei Variablen Grössen schon. Um den C/C++ effective zu halten muss man die Addressen der localen Variablen (per ebp offset) hardcoden. Wenn man nun ein array hat mit unbestimmter Größe muss man ein Pointer hardcoden auf den Array. Also das:
int a; int b; int c[a]; int d[b]; int e;
wird als pseudocode:
int a; int b; int*c; int*d; int e; asm {mov dword[_c] esp} asm{push a} for(int i=0;i<a;i++) asm {push 0} asm {mov dword[_d] esp} asm{push b} for(int i=0;i<b;i++) asm {push 0}
Somit ist die Address von e bekannt. In C++ kann man allerdings die Definitionen nicht so hin und her schieben. Die einzige effective Alternative ist der Heap und das geht mit auto_ptr. Allerdings kann man (und ich würde es begrüssen) auto_ptr in den Syntax einbauen um somit C compatible zu sein.
Und das mit sizeof in C ist ganz einfach. Oben hab ich ja als allererstes sie Grösse des Arrays auf den Stack gepusht und sizeof liest einfach die Variable aus.
Ach und der Code oben dient nur als Beispiel (mn könnte noch viel optimiziren) und es ist wie ich es implementiren würd.
-
@Irgendwer:
In C darf man aber die Variablen auch dort definieren wo man will:#include <stdio.h> int main() { puts("Hello World\n"); int i; scanf("%d",&i); printf("%d\n", i); return 0; }
ist legales C
-
@irgendwer
Was willst du eigentlich immer mit den auto_ptrn? auto_ptr und Arrays vertragen sich nicht. Insofern verstehe ich den Zusammenhnag mit dem Thread nicht.In C darf man aber die Variablen auch dort definieren wo man will
Krass. Diese Neuerung von C99 war mir bisher gar nicht bewusst. Endlich mal was, das mir auch gefällt
-
In C darf man aber die Variablen auch dort definieren wo man will
Krass. Diese Neuerung von C99 war mir bisher gar nicht bewusst. Endlich mal was, das mir auch gefällt
Das ist eben C_Shade :p
-
Es wurde nur eines an den Variablendeklarationen geändert und das ist die Deklaration
in der for-schleife.
-
SirLant schrieb:
Es wurde nur eines an den Variablendeklarationen geändert und das ist die Deklaration
in der for-schleife.Major changes from the previous edition |
include:
[...]
-- mixed declarations and code |
-
SirLant schrieb:
Es wurde nur eines an den Variablendeklarationen geändert und das ist die Deklaration
in der for-schleife.Wo hast du denn den Käse her?
-
Aus C Ent-packt, also von Herbert Schildt
-
Das erklärt natürlich einiges
-
SirLant schrieb:
Aus C Ent-packt, also von Herbert Schildt
Ich hab C Ent-Packt auch - ist nicht wirklich gut. Stecken voller kleiner Fehler.
zB steht auf Seite 244 nix von der Mischung Code <-> Deklarationen, erst auf seite 249 wirst du fündig.
Mein rat: Lieber K&R lesen - zwar nicht Standardkonform, dafür läuft man nicht gefahr auf solche sachen reinzufallen.
Schildt ist nicht gerade beliebt in der Community (aus verständlichen gründen)