xsharp.eu • private variable pased by ref to a method
Page 1 of 1

private variable pased by ref to a method

Posted: Wed Mar 10, 2021 3:21 pm
by jpmoschi
Good morning forum, look this case
When a private variable not change by ref values inside a method but if i change the private declaration with local the problem is resolved. Remember i am testing in 2.6a

private loteprueba
loteprueba:= 10
obj:ArrobaGet(1 , 0+ len("Test Loops:") , @loteprueba, "99999999")
// loteprueba never changed !!!! But inside ArrobaGet i am sure, value is changed!!!

Thanks
Juan

private variable pased by ref to a method

Posted: Wed Mar 10, 2021 4:56 pm
by robert
Juan,

Is obj typed ?
In other words: is this what we call an "early bound" method call or a "late bound" method call ?

Robert

private variable pased by ref to a method

Posted: Thu Mar 11, 2021 9:40 am
by Karl-Heinz
Hi Robert,

i compiled with 2.7 an older sample that uses the Fox dialect and noticed that the caller doesn´t see a changed ref value if the Fox "=" assignment is used . The only way to make it work is to use inside the ref function/method the ":=" assignment.

The only compiler switch i´m using is the /memvar option. I also tryied /lb, but that doesn´t change the ref behaviour of the method call. Looking with ILSpy at the code shows that the ref related "=" code is different than the ":=" code.

Code: Select all

FUNCTION TestByRef( ) AS VOID
LOCAL x2 AS STRING
LOCAL o AS Foo 	

// LOCAL x AS STRING 
LOCAL x 
// PRIVATE x 


x = "old"
? x
o = Foo{}
o:TestUntyped(@x )
? "(Method) must be 'new': " , x 
?  

x = "old"
? x
TestUnTyped ( @x ) 
? "(Function) must be 'new': " , x            
? 

x = "old" 
? x  
TestUnTyped ( x )
? "(Function) must still be 'old': " , x 
? 

x = "old"
? x
DO TestUnTyped WITH x 
? "(Procedure) must be 'new': " , x 	 
? 

x = "old"
? x
DO TestUnTyped WITH (x) 
? "(Procedure) must still be 'old': " , x
? 	

x2 = "old"
? x2
TestTyped ( @x2 )
? "(Typed Func) must be 'new': " , x2   
?
RETURN 

FUNCTION TestUnTyped ( x )
// PARAMETERS x	
    
	IF IsByRef ( x )
		
		// x := "new" // This works !
		
		// note: if the Fox "=" assignment is used 
		// the caller doesn´t see the changes ?
		 
		x = "new"  
		
		
		? "ByRef: change param value" 
		
	ENDIF 	
	
	RETURN  .t.
	

FUNCTION TestTyped ( c REF STRING ) AS LOGIC 
	
	c = "new"  // no problem with the Fox "=" assignment 
	
	RETURN TRUE
	
	
CLASS Foo
	

METHOD TestUntyped ( x ) 
	
	IF IsByRef ( x )
		
		// x := "new" // This works !
		
		// note: if the Fox "=" assignment is used 
		// the caller doesn´t see the changes ?
		
		x = "new"  
		
		? "ByRef: change param value" 
		
	ENDIF 
	
	RETURN
	
END METHOD 		

END CLASS 		
regards
Karl-Heinz

private variable pased by ref to a method

Posted: Thu Mar 11, 2021 10:13 am
by Chris
Hi Karl-Heinz,

I think you are testing with the newer compiler test release, not 2.7, because this seems to work fine in 2.7. But I can indeed reproduce the behavior in the new 2.8 compiler, the by ref param is assigned the new value back only when using the ;= operator, not with =. Will log a test for this, thanks for reporting it!

private variable pased by ref to a method

Posted: Thu Mar 11, 2021 10:44 am
by Karl-Heinz
Hi Chris,

mmmhh ...

no, i don´t use the 2.8 compiler. When i compile the posted sample the XIDE output shows version 2.7.0.0 ?

regards
Karl-Heinz

private variable pased by ref to a method

Posted: Thu Mar 11, 2021 11:00 am
by Chris
Hi Karl-Heinz,

Hmm, that's strange, when I compile with 2.7 here, I get a compiler error for the FUNCTION TestTyped() declaration. If I remove this, then the code runs as expected, but only if /fox2+ is enabled (when it is disabled, I see that indeed the value is not updated).

Anyway, it's not really important what happens with 2.7, I still see some issues in 2.8 so I have logged a sample now.

private variable pased by ref to a method

Posted: Thu Mar 11, 2021 1:17 pm
by jpmoschi
Hi Robert
Obj is defined like this
private Obj
Obj:= MyStartupCode:WinFormOn()
and WinFormOn() is a static method like this
static method WindOmaOn() as WinForm_private // and this one inherit from System.Windows.Forms.Form

Regards
Juan

private variable pased by ref to a method

Posted: Thu Mar 11, 2021 4:11 pm
by robert
Juan,
Ok, so obj is a private memory variable. That means that:
- the call is late bound
- we cannot really pass the address of the variable. There is no location on the stack. So we must pass the value of the variable to the method and when the method returns we must assign the changed value back to the private variable.
I thought we had this working, but apparently there is a problem when the assignment in the method is done with the '=' operator and not with the ':=' operator.

Robert