|
| 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
| |
|
|