29. marts 2008 - 07:50Der er
12 kommentarer og 1 løsning
Dynamisk array i stacken
Jeg sidder og roder i noget kode jeg ikke selv har skrevet, og som ikke er super godt struktureret.
Der bliver oprettet en hel del arrays af forskellige typer. De er alle defineret med "magic numbers". e.g.
float measurements[95];
De 95 går igen 1000 steder (næsten) i kode, men alt efter hvad der skal måles på, er der måske kun 5 pladser der skal bruges i arrayet.
Jeg vil gerne lave størrelsen af arrayet dynamisk for at undgå det voldsomme overhead. Følgende vil løse mine problemer.
unsigned int arraySize = 95; float *measurement = new float[arraySize];
Men så bliver det jo oprettet i på heapen, og så skal jeg huske at ryde op efter mig selv. Problemet ved det er igen, at koden ikke er specielt godt struktureret, og der er adskillige muligheder for hvor der er returns.
Jeg ved godt en mulighed er at lave en label i bunde af funktionen, hvor efter alt oprydning og return findes, men hvis jeg gerne vil undgå det, kan jeg så ikke oprette en array af dynamisk størrelse, som ikke ligger på heapen ?
I mange tilfælde vil du kunne opnå det ved at bruge en std::vector i stedet. Den opfører sig på mange måder som et array, størrelsen kan sættes dynamisk og den rydder selv op efter sig.
Jeg synes nu ikke det er så stort et problem at allokere ting på hoben - men du kunne vel lave en lokal variable i main - den vil dermed blive allokeret på stacken, og så vil du kunne bruge den indtil dit program terminerer...
Jeg valgte ikke at rette uhensigtsmæssighederne i den originale kode, og begyndte i stedet for helt for fra, og fik sat lidt styr på alle de andre ting der ikke virkede optimalt.
Bertel, du skal ha points for at komme med et konkret løsnings forslag. Kom med et svar.
Arne, du skal ha mange tak for at gi en god forklaring på hvad man kan med hvilke versioner af c.
Jeg har forresten lige et tillægsspørgsmål der er meget tæt relateret.
Hvis nu jeg har oprettet et array af flere dimenssioner, og skal sende det til en funktion. Jeg bliver vel nødvendigvis nødt til at skuklle cast størrelsen, men hvordag?
Følgende virker ikke, men kan måske gi en bedre ide om hvad det er jeg prøver at gøre: void f(int **a, int b, int h) { int c = ((int[b][h])a)[1][1];
Jeg er ikke helt med, tangerende at jeg for første gang i historien ikke helt tror på dig arne_v ;-)
Med følgende kode vil c da temmelig sikkert ikke blive 5 (måske 4). void f(int **a, int b, int h) { int c = a[1][1]; } void main() { int a={{1, 2, 3},{4, 5, 6},{7, 8, 9}}; f(a, 3, 3); }
Men det vil virke hvis f bliver rettet til void f(int a[3][3], int b, int h)
Jeg har lige læst dit svar et pat gange mere, og tror måske jeg forstår lidt mere hvad du mener, er det noget i stil med at hvis jeg bruger: void f(int a[3][], int b, int h) behøver jeg ikke at caste, men i dit oprindelige exempel skal jeg caste?
Uanset hvad er der ved at være kød nok på tillægsspørgsmålet til at lave et nyt spørgsmål, så jeg vi må hellere stoppe det her :)
Undskyld jeg endnu en gang vender sent tilbage. hvis ikke bertelbrander vil ha points bliver du nødt til det arne_v, det har også gjort så rigeligt en indsat for det :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.