[Gambas-user] Recursion does not work

Demosthenes Koptsis demosthenesk at ...626...
Thu Jan 21 16:35:26 CET 2010


i found that

Also, the contents of object
<http://gambasdoc.org/help/def/object?view>datatypes (array types,
collections, objects) are always passed by reference
in both languages!
from http://gambasdoc.org/help/doc/diffvb?view

i think this is the problem!

How to pass an Array byval in a function?

i want to write something like that

Private Function anag(ByVal iStart As Integer, ByVal iLen As Integer, ByVal
sArray As Variant)  'VB5

PRIVATE FUNCTION anag(iStart AS Integer, iLen AS Integer, sArray AS Array)
'Gambas

?


2010/1/21 Demosthenes Koptsis <demosthenesk at ...626...>

> Hi,
>
> i use ubuntu 9.10 and Gambas 2.13
>
> i create an anagram application port from phpAG
> http://phpag.sourceforge.net/
>
> i completed the same app with VB5 and now i make it also in Gmabas
>
> To make anagrams i use recursion
> i face up with a problem of recursion.
>
> i call anag() function from
> PUBLIC SUB Button1_Click()
> ....
>  anag(0, iLen, sArray)            'Make anagrams
> ....
> END
>
>
> And the function is this
>
> PRIVATE FUNCTION anag(iStart AS Integer, iLen AS Integer, sArray AS Array)
> 'vars are ByVal by default
> 'Port code from phpAG code
> ' / * FOR ($j = $start; $j < $len; + + $j)
> '     {
> '       IF ($j == $start || $array[$j] != $array[$start])
> '       {
> '         $tmp = $array[$j];
> '         $array[$j] = $array[$start];
> '         $array[$start] = $tmp;
> '         anag($array, $start + 1, $len);
> '       }
> '     }
> ' * /
>
> DIM j AS Integer
> DIM tmp AS String
> DIM word AS String
>
>      IF iStart < iLen THEN
>          j = iStart
>          WHILE (j < iLen)
>
>              IF (j = iStart OR sArray[j] <> sArray[iStart]) THEN
>                  tmp = sArray[j]
>                  sArray[j] = sArray[iStart]
>                  sArray[iStart] = tmp
>                  anag((iStart + 1), iLen, sArray) 'recursion does not work
> properly
>              END IF
>
>          j = j + 1
>          WEND
>
>      ELSE
>          word = implode(sArray)
>          TextArea1.Text = TextArea1.Text & word & gb.NewLine
>   'Vb5       PRINT #2, word 'write to anagram.tmp the result
>   '
>    END IF
>
> END
>
>
> PRIVATE FUNCTION implode(sArray AS Array) AS String
> 'This function makes a string from the elements of a string array
> DIM i AS Integer
> DIM word AS String
>
> FOR i = 0 TO (sArray.Length - 1)
> word = word & sArray[i]
> NEXT
>
> RETURN word
> END
>
> ---------------
>
> So if user enter the letters "abc" must have all the combinations as
>
> abc
> acb
> cab
> cba
> bca
> bac
>
> The same code works for vb5 like this
>
> Private Function anag(ByVal iStart As Integer, ByVal iLen As Integer, ByVal
> sArray As Variant)
> 'Port code from phpAG
>
>     If iStart < iLen Then
>         j = iStart
>         While (j < iLen)
>
>             If j = iStart Or sArray(j) <> sArray(iStart) Then
>                 tmp = sArray(j)
>                 sArray(j) = sArray(iStart)
>                 sArray(iStart) = tmp
>                 Call anag((iStart + 1), iLen, sArray)
>             End If
>
>         j = j + 1
>         Wend
>     Else
>         word = implode(sArray)
>         Text2.Text = Text2.Text & word & vbNewLine
>         Print #2, word 'write to anagram.tmp the result
>
>   End If
>
> End Function
>
>
> in Gambas i get wrong results i get
> abc
> acb
> cab
> cba
> abc
> acb
>
> This means recursion does not work properly.
> In VB5 it was needed to pass values BYVAL i read that this is the defaut in
> Gambas. But does not work.
> Why?
>
> i attach my program for whoever want to help.
>
>
>
>
> --
>
> Γεια χαρα σε όλους!!!
>
> Regards,
>
> Demosthenes Koptsis
>



-- 

Γεια χαρα σε όλους!!!

Regards,

Demosthenes Koptsis



More information about the User mailing list