|
Post by carlos45 on Aug 18, 2024 19:22:47 GMT
Good afternoon, Bplus. Sometimes I'm embarrassed to create posts because my codes are always the same, unlike you and the other members, who post something different every day. I made a SUB that works very well with 'GenerateNumbersDeck', but in functions that seem more complex, I always get lost. Even so, I want to try, together with you and the forum members, to call this function. See the attached image: I did the debugging and, inside the function, everything is fine; outside the function, I've tried everything and I can't call it. Even declaring the variable numbers as global, it doesn't call it. I'll also post the SUB that works correctly. Carlos Const False = 0 Const True = Not False
Dim i As Integer ReDim Shared numeros(1 To 15) As Integer Dim TempArray(1 To 15) As Integer ReDim TempJogos(1 To 2, 1 To 15) As Integer Open "Debug.txt" For Output As #1 For i = 1 To 2 TempArray = GerarNumerosdeck(i)
For k = 1 To 15
TempJogos(i, k) = TempArray(k)
Print #1, "Number calls function"; k; ": "; TempJogos(i, k)
Print TempJogos(i, k) Sleep Next k Print #1, "" Next i Close #1 Function GerarNumerosdeck (deckOfNumbers As Integer) Randomize Timer Dim deckOfNumbers(25) As Integer Dim i As Integer, e As Integer Dim count As Integer For i = 1 To 25 deckOfNumbers(i) = i Next For i = 25 To 2 Step -1 Swap deckOfNumbers(i), deckOfNumbers(Int(Rnd * i) + 1) Next ReDim order(1 To 25) As Integer For i = 1 To 15 order(deckOfNumbers(i)) = True Next count = 0 For e = 1 To 25 If order(e) Then count = count + 1 numeros(count) = e End If Next For i = 1 To 15 Print #1, "Number inside the function "; i; " : "; numeros(i) Next i GerarNumerosdeck = numeros End Function
Attachments:
|
|
|
Post by carlos45 on Aug 18, 2024 19:27:20 GMT
Sub GerarNumerosRND (numeros() As Integer) Dim deckOfNumbers(25) As Integer Dim order(25) As Integer Dim i As Integer, e As Integer Dim count As Integer For i = 1 To 25 deckOfNumbers(i) = i Next For i = 25 To 2 Step -1 Swap deckOfNumbers(i), deckOfNumbers(Int(Rnd * i) + 1) Next ReDim order(1 To 25) As Integer For i = 1 To 15 order(deckOfNumbers(i)) = True Next count = 0 For e = 1 To 25 If order(e) Then count = count + 1 numeros(count) = e End If Next End Sub
For i = 1 To 2 GerarNumerosRND NUMEROS() For k = 1 To 15 TempJogos(i, k) = NUMEROS(k) Next k Next i
|
|
|
Post by bplus on Aug 18, 2024 23:46:03 GMT
@carlos remind me what you were doing before you tried to put this stuff in a Sub.
tell you what, lets start with something very simple.
Input "Please enter your name ";name$ Print "Hello ";names;" welcome to my world."
that's the whole program, now we make a sub about the Print part.
Input "Please enter your name ";name$ Hello name$, "welcome to the world of Subs!"
Sub Hello (yourNamehere$, message$) Print "Hello ";yourNameHere$;" ";message$ end sub
|
|
|
Post by bplus on Aug 19, 2024 0:23:25 GMT
How about we make a deck a n cards
Shuffle n cards
Pick first 15 cards from deck
Then order those cards NOT all in one sub.
|
|
|
Post by bplus on Aug 19, 2024 0:23:48 GMT
' How about we make a deck a n cards Dim deck(1 To 25) MakeDeck deck()
' Shuffle n cards ShuffleDeck deck()
' Pick first 15 cards from deck and order those cards PrintOrder deck(), 15
Sub MakeDeck (cards()) 'assume base 1, cards start at 1 For i = 1 To UBound(cards) cards(i) = i Next
' debugg check shuffle 'For i = 1 To UBound(cards) ' Print cards(i); 'Next 'Print End Sub
Sub ShuffleDeck (cards()) 'assume base 1, cards start at 1 For i = UBound(cards) To 2 Step -1 Swap cards(i), cards(Int(Rnd * i) + 1) Next ' debugg check shuffle 'For i = 1 To UBound(cards) ' Print i; "="; cards(i); 'Next 'Print: Print End Sub
Sub PrintOrder (cards(), ncards) For i = 1 To UBound(cards) For j = 1 To ncards If cards(j) = i Then count = count + 1 If count > ncards Then Exit Sub Print cards(j); End If Next Next End Sub
It's easier to understand whats going on when main code is broken into small self contained segments.
|
|
|
Post by carlos45 on Aug 19, 2024 0:37:32 GMT
Bplus, thanks for replying. SUB is working fine. I'm trying to put it inside a function. See the image: I managed to call the function, but it's being called 15 times instead of two. Carlos. Dim i As Integer ReDim Shared deckOfNumbers(1 To 25) As Integer Dim TempArray(1 To 15) As Integer ReDim TempJogos(1 To 2, 1 To 15) As Integer Open "Debug.txt" For Output As #1 For i = 1 To 2
For k = 1 To 15 ' TempArray = GerarNumerosdeck(i) TempJogos(i, k) = GerarNumerosdeck(i) Print #1, "Number calls function"; k; ": "; TempJogos(i, k) Print TempJogos(i, k), k Sleep Next k Print #1, "" Next i Close #1 Function GerarNumerosdeck (deckOfNumbers As Integer) Randomize Timer 'Dim deckOfNumbers(25) As Integer Dim i As Integer, e As Integer Dim count As Integer Dim numeros(1 To 15) As Integer For i = 1 To 25 deckOfNumbers(i) = i Next For i = 25 To 2 Step -1 Swap deckOfNumbers(i), deckOfNumbers(Int(Rnd * i) + 1) Next ReDim order(1 To 25) As Integer For i = 1 To 15 order(deckOfNumbers(i)) = True Next count = 0 For e = 1 To 25 If order(e) Then count = count + 1 numeros(count) = e End If Next For i = 1 To 15 Print #1, "Number inside the function "; i; " : "; numeros(i) Next i GerarNumerosdeck = deckOfNumbers() End Function
Attachments:
|
|
|
Post by bplus on Aug 19, 2024 1:33:30 GMT
Function GerarNumerosdeck (deckOfNumbers As Integer) ' <<< this function is setup to return a default single type Randomize Timer 'Dim deckOfNumbers(25) As Integer Dim i As Integer, e As Integer Dim count As Integer Dim numeros(1 To 15) As Integer For i = 1 To 25 deckOfNumbers(i) = i Next For i = 25 To 2 Step -1 Swap deckOfNumbers(i), deckOfNumbers(Int(Rnd * i) + 1) Next ReDim order(1 To 25) As Integer For i = 1 To 15 order(deckOfNumbers(i)) = True Next count = 0 For e = 1 To 25 If order(e) Then count = count + 1 numeros(count) = e End If Next For i = 1 To 15 Print #1, "Number inside the function "; i; " : "; numeros(i) Next i GerarNumerosdeck = deckOfNumbers() ' <<<< in QB64 you can not assign an array to a function End Function
You can't pass arrays through Function Names* in QB64. Names* has been edited in after misunderstanding, sorry. EDIT 2 (2024-08-19 8:53 AM Eastern Standard Time) To be super technically correct, You can't ASSIGN Arrays to Function Names. "Pass" was the wrong word to use. Again I am sorry carlos45 if this caused misunderstanding between us. Assign means setting a Type of Value to a variable and Function Names do act as a kind of variable that has a Type ie you can Print a function name providing the arguments it needs, you can not Print a sub name even if you provide it's arguments. I am trying to tell you carlos45 to learn subs and functions, you need to play around with less complex things, you are trying to jam a programs worth of code into a function. Your function above can't possibly work. Functions are usually returning something and if you don't want a default single Type to be return put an % at end of Function name for an Integer, or "&" at end for a Long Integer or an $ at the end of name for a String or a # for a Double Type, and once again you can't pass arrays of any type through the function name. Once again I think you want a Sub not a Function. Subs can change Shared arrays and you dont have to pass arrays around as arguments, allot easier.
|
|
|
Post by carlos45 on Aug 19, 2024 1:53:39 GMT
Function GerarNumerosdeck (deckOfNumbers As Integer) ' <<< this function is setup to return a default single type Randomize Timer 'Dim deckOfNumbers(25) As Integer Dim i As Integer, e As Integer Dim count As Integer Dim numeros(1 To 15) As Integer For i = 1 To 25 deckOfNumbers(i) = i Next For i = 25 To 2 Step -1 Swap deckOfNumbers(i), deckOfNumbers(Int(Rnd * i) + 1) Next ReDim order(1 To 25) As Integer For i = 1 To 15 order(deckOfNumbers(i)) = True Next count = 0 For e = 1 To 25 If order(e) Then count = count + 1 numeros(count) = e End If Next For i = 1 To 15 Print #1, "Number inside the function "; i; " : "; numeros(i) Next i GerarNumerosdeck = deckOfNumbers() ' <<<< in QB64 you can not assign an array to a function End Function
You can't pass arrays through Functions in QB64. I am trying to tell you carlos45 to learn subs and functions, you need to play around with less complex things, you are trying to jam a programs worth of code into a function. Your function above can't possibly work. Functions are usually returning something and if you don't want a default single Type to be return put an % at end of Function name for an Integer, or "&" at end for a Long Integer or an $ at the end of name for a String or a # for a Double Type, and once again you can't pass arrays of any type through the function name.
|
|
|
Post by carlos45 on Aug 19, 2024 1:55:10 GMT
|
|
|
Post by bplus on Aug 19, 2024 1:57:08 GMT
You can pass arrays as arguments to functions, you can't Return Arrays like: FunctionName = Array()
like you tried here: GerarNumerosdeck = deckOfNumbers() ' <<<< in QB64 you can not assign an array to a function
|
|
|
Post by carlos45 on Aug 19, 2024 2:00:49 GMT
Bplus, does that mean there is no way to call this number generating block with a function? Is that it?
GerarNumerosdeck% = deckOfNumbers% End Function
|
|
|
Post by bplus on Aug 19, 2024 2:03:07 GMT
Why don't you study the code I wrote up. I gotta go for tonight...
Once again, you probably want a sub not a function do you know the difference?
|
|
|
Post by carlos45 on Aug 19, 2024 2:13:08 GMT
Bplus, I understand that there may be confusion between SUB and function. What I really need is to manipulate array inside a function, not a SUB. The difference is that a function returns a value and can be used in expressions, while a SUB just executes a block of code without returning a value. I'm trying to use a function to manipulate and return results from an array, and not just execute code. Could you help me understand how to implement this correctly?
|
|
|
Post by carlos45 on Aug 19, 2024 3:17:22 GMT
Bplus, I'm experiencing unexpected behavior with this code example in QB64 and I would like your help to understand what is happening. In my code, I'm using a function to generate random numbers and store them in a global array. However, even with the limitation that QB64 does not allow functions to return arrays directly, the code seems to work as if it were returning the array. You made it very clear that, even knowing that I can't pass arrays as arguments to functions, nor return arrays directly like "GerarNumerosdeck = deckOfNumbers()", the code is exhibiting strange behavior. It seems that the array deckOfNumbers is being updated and accessed correctly, as if the function could return the array directly. Question: How is it possible that the array deckOfNumbers is being correctly updated and accessed, even though QB64 does not allow arrays to be returned directly from functions? Why am I observing this behavior? Thank you for your help! Carlos Const False = 0 Const True = Not False
Dim i As Integer ReDim Shared deckOfNumbers(1 To 25) As Integer Dim TempArray(1 To 15) As Integer ReDim TempJogos(1 To 2, 1 To 15) As Integer Open "Debug.txt" For Output As #1 For i = 1 To 2
For k = 1 To 15 ' TempArray = GerarNumerosdeck(i) TempJogos(i, k) = GerarNumerosdeck(k) Print #1, "Number calls function"; k; ": "; TempJogos(i, k) Print TempJogos(i, k), k Sleep Next k Print #1, "" Next i Close #1
Function GerarNumerosdeck (deckOfNumbers As Integer) Randomize Timer 'Dim deckOfNumbers(25) As Integer Dim i As Integer, e As Integer Dim count As Integer Dim numeros(1 To 15) As Integer For i = 1 To 25 deckOfNumbers(i) = i Next For i = 25 To 2 Step -1 Swap deckOfNumbers(i), deckOfNumbers(Int(Rnd * i) + 1) Next ReDim order(1 To 25) As Integer For i = 1 To 15 order(deckOfNumbers(i)) = True Next count = 0 For e = 1 To 25 If order(e) Then count = count + 1 numeros(count) = e End If Next For i = 1 To 15 ' Print #1, "Number inside the function "; i; " : "; numeros(i) Next i GerarNumerosdeck = deckOfNumbers()
End Function
Attachments:
Debug.txt (317 B)
|
|
|
Post by bplus on Aug 19, 2024 3:51:27 GMT
Once AGAIN you CAN PASS ARRAYS TO FUNCTIONS!!!
If you pass an array to a function the function can work with updating it and back in the main code it will be updated but might as well do all that with a Sub as I show below. A function typically returns something with its name:
MyFunctionToldMe& = MyFunction&(myArrayIPassedToMyFunction())
getting MyFunctionToldMe& is the whole point of making a Function and NOT a SUB.
What is wrong with this, a sub from your first post, you said it worked but did not show it with code working, I fixed so it works with code:
Dim Numbers(1 To 25) As Integer For i = 1 To 5 GerarNumerosRND Numbers() For k = 1 To 15 Print Numbers(k); Next k Print: Print Next
Sub GerarNumerosRND (numeros() As Integer) Dim deckOfNumbers(25) As Integer Dim order(25) As Integer Dim i As Integer, e As Integer Dim count As Integer For i = 1 To 25 deckOfNumbers(i) = i Next For i = 25 To 2 Step -1 Swap deckOfNumbers(i), deckOfNumbers(Int(Rnd * i) + 1) Next ReDim order(1 To 25) As Integer For i = 1 To 15 order(deckOfNumbers(i)) = -1 Next count = 0 For e = 1 To 25 If order(e) Then count = count + 1 numeros(count) = e End If Next End Sub
|
|