Jump to page: 1 2 3
Thread overview
Dynamic memory
Jul 24, 2015
Binarydepth
Jul 24, 2015
Adam D. Ruppe
Jul 24, 2015
Binarydepth
Jul 24, 2015
Adam D. Ruppe
Jul 28, 2015
Binarydepth
Jul 28, 2015
Adam D. Ruppe
Jul 28, 2015
Binarydepth
Jul 28, 2015
anonymous
Jul 28, 2015
Binarydepth
Jul 28, 2015
Binarydepth
Jul 28, 2015
anonymous
Jul 28, 2015
Binarydepth
Jul 28, 2015
Binarydepth
Jul 28, 2015
Binarydepth
Jul 29, 2015
anonymous
Jul 29, 2015
Binarydepth
Jul 28, 2015
Ali Çehreli
Jul 28, 2015
CraigDillabaugh
Jul 28, 2015
CraigDillabaugh
Jul 24, 2015
Binarydepth
July 24, 2015
How do we get dynamic memory in D ?

I want to use memory based on user input. In this case declare a bi-dimensional array (int[2][var]), var being the user input.
July 24, 2015
On Friday, 24 July 2015 at 15:22:15 UTC, Binarydepth wrote:
> I want to use memory based on user input. In this case declare a bi-dimensional array (int[2][var]), var being the user input.

Declare:

int[2][] your_array;

your_array.length = var;


The runtime will handle the dynamic memory allocation for you when you set the length on a slice.
July 24, 2015
On Friday, 24 July 2015 at 15:26:27 UTC, Adam D. Ruppe wrote:
> On Friday, 24 July 2015 at 15:22:15 UTC, Binarydepth wrote:
>> I want to use memory based on user input. In this case declare a bi-dimensional array (int[2][var]), var being the user input.
>
> Declare:
>
> int[2][] your_array;
>
> your_array.length = var;
>
>
> The runtime will handle the dynamic memory allocation for you when you set the length on a slice.

this is what I did :

int liCases [2][];
        readf(" %d\n", &num);//Number of cases input
        liCases.length = num;

And I get this error :

prime1.d:26: error: constant liCases.length is not an lvalue
July 24, 2015
On Friday, 24 July 2015 at 15:26:27 UTC, Adam D. Ruppe wrote:
> On Friday, 24 July 2015 at 15:22:15 UTC, Binarydepth wrote:
>> I want to use memory based on user input. In this case declare a bi-dimensional array (int[2][var]), var being the user input.
>
> Declare:
>
> int[2][] your_array;
>
> your_array.length = var;
>
>
> The runtime will handle the dynamic memory allocation for you when you set the length on a slice.

Ok, Sorry I was declaring the array in C style also. It compiled after chaging it. :D

TY
July 24, 2015
On Friday, 24 July 2015 at 15:33:45 UTC, Binarydepth wrote:
> int liCases [2][];

Those brackets are in the wrong place, you should write that as

int[2][] liCases;


The syntax you used there is a deprecated C compatibility feature. in C, arrays are defined differently and the dimensions go in the opposite direction than in D. (So int a[2][] in C means int[][2] in D - that's why the length doesn't change in that format.)

But write it the D style for most consistency and it will work out. Just be aware that what I wrote is a dynamic array of two elements, not a two element group of dynamic arrays. So indexing is

liCases[i][0] and liCases[i][1] rather than swapping those.
July 28, 2015
Here is what I'm trying to do :

import std.stdio : readf, writef;
void main()	{
	int[2][] nam;
	int num;
	readf(" %d", &num);
	nam.length = num;
	foreach(nim; 0..num)	{
		readf(" %d %d", &nam[0][num], &nam[1][num]);
	}
	foreach(nim; 0..num)	{
		writef(" %d %d\n", &nam[0][num], &nam[1][num]);
	}
}

And here is the output I get when running the program :

core.exception.RangeError@code.d(8): Range violation
----------------
0x406cfb _Dmain
	???:0
0x415fde void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll().void __lambda1()
	../../../../src/libphobos/libdruntime/rt/dmain2.d:408
0x41624e void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())
	../../../../src/libphobos/libdruntime/rt/dmain2.d:383
0x4164a8 void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll()
	../../../../src/libphobos/libdruntime/rt/dmain2.d:408
0x41624e void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())
	../../../../src/libphobos/libdruntime/rt/dmain2.d:383
0x4163d5 _d_run_main
	../../../../src/libphobos/libdruntime/rt/dmain2.d:416
0x7f51eb84ea3f __libc_start_main
	???:0
0x406088 _start
	???:0
0xffffffffffffffff ???
	???:0
----------------------------------------------------------------------------------

I just want to read and print data depending on user input.
July 28, 2015
On Tuesday, 28 July 2015 at 16:09:46 UTC, Binarydepth wrote:
> 		readf(" %d %d", &nam[0][num], &nam[1][num]);
> 	}
> 	foreach(nim; 0..num)	{
> 		writef(" %d %d\n", &nam[0][num], &nam[1][num]);

Those indexes are backwards. And you really shouldn't need & on write. so try:

 		readf(" %d %d", &nam[num][0], &nam[num][1]);

and

 		writef(" %d %d\n", nam[num][0], nam[num][1]);
July 28, 2015
On Tuesday, 28 July 2015 at 16:12:28 UTC, Adam D. Ruppe wrote:
> On Tuesday, 28 July 2015 at 16:09:46 UTC, Binarydepth wrote:
>> 		readf(" %d %d", &nam[0][num], &nam[1][num]);
>> 	}
>> 	foreach(nim; 0..num)	{
>> 		writef(" %d %d\n", &nam[0][num], &nam[1][num]);
>
> Those indexes are backwards. And you really shouldn't need & on write. so try:
>
>  		readf(" %d %d", &nam[num][0], &nam[num][1]);
>
> and
>
>  		writef(" %d %d\n", nam[num][0], nam[num][1]);

I declared : int[2][] nam;

For real it is backwards ? nam[0][num]
July 28, 2015
On Tuesday, 28 July 2015 at 16:09:46 UTC, Binarydepth wrote:
> Here is what I'm trying to do :
>
> import std.stdio : readf, writef;
> void main()	{
> 	int[2][] nam;
> 	int num;
> 	readf(" %d", &num);
> 	nam.length = num;
> 	foreach(nim; 0..num)	{
> 		readf(" %d %d", &nam[0][num], &nam[1][num]);
> 	}
> 	foreach(nim; 0..num)	{
> 		writef(" %d %d\n", &nam[0][num], &nam[1][num]);
> 	}
> }


In addition to Adam:
there are typos (num instead of nim) - since num is the array length and the indices are 0-based, num is out of bounds...

	foreach(nim; 0..num)	{
		readf(" %d %d", &nam[nim][0], &nam[nim][1]);
	}
	foreach(nim; 0..num)	{
		writef(" %d %d\n", nam[nim][0], nam[nim][1]);
	}
works fine.

July 28, 2015
On Tuesday, 28 July 2015 at 16:24:39 UTC, anonymous wrote:
> On Tuesday, 28 July 2015 at 16:09:46 UTC, Binarydepth wrote:
>> Here is what I'm trying to do :
>>
>> import std.stdio : readf, writef;
>> void main()	{
>> 	int[2][] nam;
>> 	int num;
>> 	readf(" %d", &num);
>> 	nam.length = num;
>> 	foreach(nim; 0..num)	{
>> 		readf(" %d %d", &nam[0][num], &nam[1][num]);
>> 	}
>> 	foreach(nim; 0..num)	{
>> 		writef(" %d %d\n", &nam[0][num], &nam[1][num]);
>> 	}
>> }
>
>
> In addition to Adam:
> there are typos (num instead of nim) - since num is the array length and the indices are 0-based, num is out of bounds...
>
> 	foreach(nim; 0..num)	{
> 		readf(" %d %d", &nam[nim][0], &nam[nim][1]);
> 	}
> 	foreach(nim; 0..num)	{
> 		writef(" %d %d\n", nam[nim][0], nam[nim][1]);
> 	}
> works fine.

Damn! my first typo! Thanks :D
« First   ‹ Prev
1 2 3