Pass a variable (class) to a function without using ByRef

  1. 2 weeks ago

    Hello,
    The subject has already been discussed but I did not understand anything and I do not find the solution to my problem.
    The solution is certainly here in this forum but I did not find it.
    I hope my question will be clear because I have a little trouble explaining it.
    When I pass a variable (class) to a function without using ByRef the variable returns modified.
    First I do not understand this principle and secondly how to return the variable unchanged?
    How to assign my variable again to its starting value?

    Exemple:

    Class
    Ptxy
    x As Integer
    y As Integer
    ----------------------------------------
    Call
    Dim Pt As Ptxy
    Dim i As Integer
    Pt = New Ptxy
    Pt.x = 1
    Pt.y = 2
    
    i = Method(Pt)
    ----------------------------------------
    Method( Pt As Ptxy ) Integer
    
    Dim Pt1 As Ptxy
    
    Pt1 = Pt
    
    Pt1.x = 5
    Pt1.y = 10
    
    i = 5
    Return i

    Pt changes in the call function in (5,10) while I want to keep (1,2)
    Where and how to keep the starting value (1,2)?
    Thanks for your help.
    BB

  2. Tim H

    Aug 8 Pre-Release Testers Portland, OR USA

    When you pass an object to a method, you pass the actual object, not a copy of it. If you want it to not be modified, you will have to create a copy of it in the method and act on that copy instead of the original.

  3. Thank you Tim but the original is changing when I work on the copy.
    As in my example Pt1 is a copy of Pt and Pt is modified.

  4. Julian S

    Aug 8 Pre-Release Testers, Xojo Pro UK
    Edited 2 weeks ago

    When you

    Pt1 = Pt

    you are essentially pointing Pt1 to Pt, no new copy is made

    If you do this instead

    Pt1 = New Ptxy

    Pt1 is now a new Ptxy where x and y have not been set to anything

    so you can do this

    Pt1 = New Ptxy
    Pt1.x = Pt.x // actually copy x
    Pt1.y = Pt.y // actually copy y

    You can now work on Pt1 without changing values in Pt

    You might ask why

    Pt1.x = Pt.x

    acts differently to

    Pt1 = px

    because x is an intrinsic type (integer) and not an object, the value is copied across rather than pointing one to the other as happened right at the top of this post.

    I hope that helps a little :)

  5. Douglas H

    Aug 8 Pre-Release Testers, Xojo Pro

    And just for the sake of those not aware, arrays are also passed by reference even when you don't use ByRef. More information is available by looking at the Xojo docs for ByRef and ByVal .

  6. Norman P

    Aug 8 Pre-Release Testers, Xojo Pro great-white-software.com/blog
    Edited 2 weeks ago

    No arrays are NOT passed by reference
    They are a reference type
    There's a HUGE difference
    https://blog.xojo.com/2019/01/23/byref-vs-reference-types/
    https://blog.xojo.com/2019/01/24/some-follow-up-regarding-byref/

  7. Thank you friends,
    I chose a simple example to ask the question but in reality my variable is an array (15,15).
    I read this topic in the documentation but I hoped I could get around this problem.
    Isn't there a more elegant solution because there I have to make 225 intialization operations of my variable and this function is called hundreds of times?

  8. Kem T

    Aug 8 Pre-Release Testers, Xojo Pro, XDC Speakers Connecticut

    No, you must duplicate your array.

  9. last week

    Kevin G

    Aug 8 Pre-Release Testers, Xojo Pro Gatesheed, England

    @BenoîtBouillon Thank you friends,
    I chose a simple example to ask the question but in reality my variable is an array (15,15).
    I read this topic in the documentation but I hoped I could get around this problem.
    Isn't there a more elegant solution because there I have to make 225 intialization operations of my variable and this function is called hundreds of times?

    Can you provide a bit more information about your array and what you are doing with it in the method that requires you to clone it?

  10. In fact, I'm translating a program that I wrote few years ago in another language from the well-known words game.
    For example, one of my variables is the grid of the game which is an array (15,15) of information from the grid where I test all possible words.
    So now I memorize each variable (there is a lot) in simple variable before their call and then I reinject them into the called variable after processing the method.
    That makes the program heavier and increases the calculation time; if you have another solution I am more than interrested!

  11. Beatrix W

    Aug 12 Pre-Release Testers Europe (Germany)

    You need to make a strategy which object is responsible for which action. You need to include how the data flows into the objects and out again. Then you need to take into consideration what makes your app fast and what makes it slow. In OO each object should be responsible for it's own data. That is usually bad for speed.

    My own application handles a lot of data. It has a central repository for the main data - a class as property of the app. The operations on the app property are done byref which avoids copying the data into a new variable. This gives a very nice speed gain over the "proper" OO approach.

    You need to be aware of the OO rules and when to break them.

or Sign Up to reply!