| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
November 19, 2013 Alocating memory depending of a variable value INT variable | ||||
|---|---|---|---|---|
| ||||
Well in C I just declared an array during execution with an array with a multiplied variable for the size of the array.
Since I only need two spaces in the array for each line of process it was multiplied by two.
so it was like this :
scanf("%d", &Num);
int array[Num*2];
When I tried to do this on D, well it says the variable cannot be read at compile time.
I don't know how the C language implements this but the main thing is that it does.
So how can I manage memory depending on the user's input in D ?
Thank you for your attention.
| ||||
November 19, 2013 Re: Alocating memory depending of a variable value INT variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Carlos | On 11/19/2013 03:16 PM, Carlos wrote:> Well in C I just declared an array during execution with an array with a
> multiplied variable for the size of the array.
>
> Since I only need two spaces in the array for each line of process it
> was multiplied by two.
>
> so it was like this :
>
> scanf("%d", &Num);
> int array[Num*2];
That is a VLA.
In D, you would normally use a slice. Below, 'a' and 'b' are two ways of having a slice with valid elements. On the other hand, 'c' is merely reserving space for that many elements:
import std.stdio;
void main()
{
size_t num;
write("How many? ");
readf(" %s", &num);
auto a = new int[num * 2];
int[] b;
b.length = num * 2;
int[] c;
c.reserve(num * 2);
}
Ali
| |||
November 20, 2013 Re: Alocating memory depending of a variable value INT variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Ali Çehreli:
> That is a VLA.
That are currently not present in D. The most common and safe alternatives in D are allocating the memory on the heap with 'new', or over-allocating on the stack a fixed size and then slicing.
If the OP really wants to allocate on the stack, there is the alloca() function (untested, I don't remember the correct name for the memory error):
auto ptr = cast(int*)alloca(num * 2 * int.sizeof);
if (ptr == null)
throw new outOfMemoryError("...");
auto array = ptr[0 .. num * 2];
Bye,
bearophile
| |||
November 20, 2013 Re: Alocating memory depending of a variable value INT variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Tuesday, 19 November 2013 at 23:34:48 UTC, Ali Çehreli wrote:
> On 11/19/2013 03:16 PM, Carlos wrote:> Well in C I just declared an array during execution with an array with a
> > multiplied variable for the size of the array.
> >
> > Since I only need two spaces in the array for each line of
> process it
> > was multiplied by two.
> >
> > so it was like this :
> >
> > scanf("%d", &Num);
> > int array[Num*2];
>
> That is a VLA.
>
> In D, you would normally use a slice. Below, 'a' and 'b' are two ways of having a slice with valid elements. On the other hand, 'c' is merely reserving space for that many elements:
>
> import std.stdio;
>
> void main()
> {
> size_t num;
> write("How many? ");
> readf(" %s", &num);
>
> auto a = new int[num * 2];
>
> int[] b;
> b.length = num * 2;
>
> int[] c;
> c.reserve(num * 2);
> }
>
> Ali
auto array = new int[Num * 2];
Well that works just perfect. Thanks a lot!
| |||
November 20, 2013 Re: Alocating memory depending of a variable value INT variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Wednesday, 20 November 2013 at 00:02:42 UTC, bearophile wrote:
> Ali Çehreli:
>
>> That is a VLA.
>
> That are currently not present in D. The most common and safe alternatives in D are allocating the memory on the heap with 'new', or over-allocating on the stack a fixed size and then slicing.
That's why I use a Stack and a Heap struct in combination with an Array struct:
Heap heap;
Stack stack;
byte[] arr = Array!byte(&stack, &heap).of(Num);
or even more naturally:
byte[] arr = Array!byte(&stack, &heap)[Num];
Stack has a buffer of e.g. 4096 and tries to allocate there, if it fails, it returns null. If this happens, the Heap struct allocates on the GC or C heap.
And if the Stack / Heap struct gets destroyed, the stored memory is freed.
But VLA's were really desirable. :(
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply