xsharp.eu • FOR NEX issue
Page 1 of 1

FOR NEX issue

Posted: Wed Sep 05, 2018 8:48 pm
by boonnam
m_dibs is private variable:

C#
private System.IntPtr[] m_dibs;

or

X#
private m_dibs as IntPtr[]

In the constructor for the class:

m_dibs = new System.IntPtr[0];

or

m_dibs := IntPtr[]{0}

Here is my C# sample code:

Code: Select all

//int x = m_dibs.Length;

for (int i = 0; i < m_dibs.Length; i++)
{
      EZTwain.DIB_Free(m_dibs[i]);
}
Here is my X# translation:

Code: Select all

x := self:m_dibs.Length
            
for i := 0 upto self:m_dibs.Length
     EZTwain.DIB_Free(self:m_dibs[i])
next
In the C#, since the length is 0 when the class is first instantiated, the code inside the for next loop doesn't run. But in the X#, the line inside the for next loop get executed, which resulted in index out of range error. I also use "to" instead of "upto".

I know I can prevent this by first checking if the length is > 0 before running the for next loop or perhaps initialize i := 1.

I am using Core dialect. "Use Zero Base Arrays" is false at first. I also tried setting to true. Same result.

Is there a similar code for X#?. I thought the index in Core dialect is zero base like C#.


Thanks,
Boonnam

FOR NEX issue

Posted: Wed Sep 05, 2018 9:11 pm
by Chris
Hi Boonam,

Are you using zero-based arrays in X#? If yes, then your iteration should be upto length - 1:

Code: Select all

for i := 0 upto self:m_dibs.Length - 1
If you think about it, it's the same tha c# does, with the "i < m_dibs.Length" segment in the for command. It uses "<", not "<=", so "i" never reaches "m_dibs.Length".

With the above correction, the loop will not execute at all also in X# for an empty array.

If you're not using zero-based arrays, then (unlike in c# which does not support 1-based array indexing) you'd need to start the loop from element "1":

Code: Select all

for i := 1 upto self:m_dibs.Length
In both cases, the result will now be the expected one.

Chris

FOR NEX issue

Posted: Wed Sep 05, 2018 10:27 pm
by boonnam
Thank you very much!