/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Flerdimensionelle, dynamiske arrays
Fra : SørenKJ


Dato : 30-09-01 12:03

Hej, jeg har et spørgmål, som jeg ikke har kunnet finde svar på i nogen af
mine C++ bøger, så jeg håber nogen her kan hjælpe. Spørgsmålet er:

Hvorfor kan jeg ikke erklære flerdimensionelle dynamiske arrays med variable
'bounds'?

- f.eks:
hvorfor kan jeg ikke gøre sådan:

int n = 5;
float* a;
a = new float[n][n];

når jeg nu godt kan gøre sådan:

int n = 5;
float* a;
a = new float[n];


Er der en måde, hvorpå jeg kan arbejde uden om dette problem? (hvis jeg nu
gerne vil have at begge dimensioner angives i køretid)

Vh Søren



 
 
Igor V. Rafienko (30-09-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 30-09-01 18:39

[ soekija@teliamail.dk ]

> Hvorfor kan jeg ikke erklære flerdimensionelle dynamiske arrays med
> variable 'bounds'?


Fordi språket er bygd opp på den måten. Men du kan gjøre det slik at
det ser utad klientkoden at du gjør nettopp det.


> - f.eks:
> hvorfor kan jeg ikke gøre sådan:
>
> int n = 5;
> float* a;
> a = new float[n][n];
>
> når jeg nu godt kan gøre sådan:
>
> int n = 5;
> float* a;
> a = new float[n];


[quote 8.3.4, p 3 ]

When several "array of" specifications are adjacent, a
multidimentional array is created; the constant expressions that
specify the bounds of the arrays can be omitted only for the first
member of the sequence.

[/quote]


Språket er laget på denne måten. (Forresten, det er galt å bruke typen
int til angivelsen av ikke-negative størrelser. Bli kvitt denne vanen.
Du vil ha size_t, ikke int).


> Er der en måde, hvorpå jeg kan arbejde uden om dette problem? (hvis
> jeg nu gerne vil have at begge dimensioner angives i køretid)


Ja. Det lureste er å ikke bruke arrays i det hele tatt (med mindre det
finnes overveldende argumenter _for_ å gjøre nettopp det):

size_t n1, n2;
std::cout << "dimensions:";
std::cin >> n1 >> n2;

std::vector< std::vector< float > > v( n1,
             std::vector< float >( n2, 0.0f )
             );

v er (konseptuelt sett) en array av n1 elementer der hvert element er
en array av n2 floats, og hele strukturen er initialisert til 0.0[*].
Det burde duge i en rekke tilfeller, men om det ikke er tilstrekkelig,
pakker man en vanlig float** (evt. float*) i en klasse og lager sin
egen operator[]. Fungerer som en drøm.





ivr
[*] Denne strukturen vil mange iallfall en (numerisk sett) viktig
egenskap: elementene vil ikke bli lagret i "row-major order". Men, som
sagt, der det trenges, finnes det andre løsninger.
--
Ehh... I'll have a McRudolf menu, please.

SørenKJ (01-10-2001)
Kommentar
Fra : SørenKJ


Dato : 01-10-01 21:29

jeg spekulerer stadig om der ikke er en 'dybere' grund til at det er sådan..

men de vectorer ser ud at gøre jobbet godt. (har det noget at gøre med at
det er en templateklasse..?)

tak.

hilsen Søren



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste