I have now this function, as a private member in a Class :
double calculate_lineLength( int i) {
field.rawData [] * rd; // ignore the details, this works;
rd = cast (field.rawData [] *) dataSet; // ignore the details, this works;
auto l = this.allLines[i]; // this is defined as
// int [][] allLines =
// new int [][] (0,0)
// in case of failure, this is empty
double r = 0;
try {
writeln("l ", l); // prints []
writeln("i ", i); // prints i, in this case, i is set to 0
writeln(l.length); // prints 0
writeln("l0 ", l[0]); // segfault - i want it to be caught
write("will print");
writeln("rd", (*rd));
write("will not print...");
auto p0 = (*rd)[l[0]];
auto p1 = (*rd)[l[1]];
r = calculate_geoDistance_vincenty(p0.lat,p1.lat, p0.lon, p1.lon);
} catch (RangeError er) {
writeln("range error");
}
return r;
}
Compile with dub build --compiler=ldc2
. this should enable array bound checking options.
I am debugging with gdb :
gdb ./myprogram
Then, in gdb console :
run arg1 arg2
Result is :
91753
91754
91755
91756
[New Thread 0x7ffff7560640 (LWP 45344)]
[New Thread 0x7fffeffff640 (LWP 45345)]
[New Thread 0x7ffff6d5f640 (LWP 45346)]
[New Thread 0x7ffff655e640 (LWP 45347)]
[New Thread 0x7ffff5d5d640 (LWP 45348)]
[New Thread 0x7ffff555c640 (LWP 45349)]
[New Thread 0x7ffff4d5b640 (LWP 45350)]
[New Thread 0x7fffef7fe640 (LWP 45351)]
[New Thread 0x7fffeeffd640 (LWP 45352)]
[New Thread 0x7fffee7fc640 (LWP 45353)]
[New Thread 0x7fffedffb640 (LWP 45354)]
[New Thread 0x7fffed7fa640 (LWP 45355)]
[New Thread 0x7fffecff9640 (LWP 45356)]
[New Thread 0x7fffbffff640 (LWP 45357)]
[New Thread 0x7fffbf7fe640 (LWP 45358)]
[New Thread 0x7fffbeffd640 (LWP 45359)]
[New Thread 0x7fffbe7fc640 (LWP 45360)]
[New Thread 0x7fffbdffb640 (LWP 45361)]
[New Thread 0x7fffbd7fa640 (LWP 45362)]
getting LINES done
alllines: []
l []
i 0
0
Thread 1 "myprogram" received signal SIGSEGV, Segmentation fault.
_D14analysisEngine9geoEngine20calculate_lineLengthMFiZd (this=<optimized out>, i=0) at source/analysisEngine.d:15526
15526
writeln("l0 ", l[0]);
So, to see what is going on, i use the command bt
:
#0 _D14analysisEngine9geoEngine20calculate_lineLengthMFiZd (this=<optimized out>, i=0) at source/analysisEngine.d:15526
#1 0x00005555555dba40 in _D14analysisEngine9geoEngine13add_turnLinesMFZv (this=<optimized out>) at source/analysisEngine.d:7387
#2 0x00005555555e375a in _D14analysisEngine9geoEngine15analyze_tillageMFZv (this=0x7ffff756a000) at source/analysisEngine.d:5329
#3 0x000055555560d082 in _Dmain (args=...) at source/AI.d:123
Okey, I know where to look for : it's the line asking for writeln("l0 ", l[0]);
.
But should it not be caught by range error ? If I do `print l`in gdb, i find :
$1 = {length = 0, ptr = 0x0}
With print l[0]
i get: Attempt to take address of value not located in memory.
. I believe the array printing syntax is valid; see here.
What absolute rookie mistake am I committing? What does it mean : "Attempt to take address of value not located in memory" ? I am not even calling / accessing a pointer. I am trying to extract a value outside an array bound.
I imagine they all have their addresses. But with the bound checking operation in place, would the bound error be triggered before the attempt to take unavailable address error has a chance to trigger?
Thank you.