How to include arrays in type/class

New to FreeBASIC? Post your questions here.
Post Reply
rnbas
Posts: 35
Joined: Jul 22, 2019 18:54

How to include arrays in type/class

Post by rnbas »

I am new to freebasic and find it very simple and impressive at the same time. Presently, I am trying to create a class with 2 arrays: one of string (program names) and another of integers (program numbers):

Code: Select all

' class: 
Type rndict 
	public: 
		prognames() as string
		prognums() as integer
		declare sub showitems()
end type

sub rndict.showitems
	for i as integer =0 to ubound(prognames) 
		print prognames(i), prognums(i)
	next
end sub


'MAIN: 
Dim As rndict progdict

redim progdict.prognames(2)
redim progdict.prognums(2)

progdict.prognames(0) = "aa"
progdict.prognums(0) = 1

progdict.prognames(1) = "bb"
progdict.prognums(1) = 3

progdict.prognames(2) = "cc"
progdict.prognums(2) = 10

progdict.showitems
However, I am getting following error:

Code: Select all

soq_rndict.bas(5) error 9: Expected expression, found ')' in 'prognames() as string'
soq_rndict.bas(6) error 9: Expected expression, found ')' in 'prognums() as integer'
soq_rndict.bas(20) error 54: Expected var-len array, before '(' in 'redim progdict.prognames(2)'
soq_rndict.bas(21) error 54: Expected var-len array, before '(' in 'redim progdict.prognums(2)'
soq_rndict.bas(23) error 181: Invalid assignment/conversion in 'progdict.prognames(0) = "aa"'
soq_rndict.bas(26) error 181: Invalid assignment/conversion in 'progdict.prognames(1) = "bb"'
soq_rndict.bas(29) error 181: Invalid assignment/conversion in 'progdict.prognames(2) = "cc"'
I found that there is no problem with following code which has static arrays:

Code: Select all

Type rndict 
	public: 
		prognames(1024) as string
		prognums(1024) as integer
		declare sub showitems()
end type
How can I include dynamic arrays in type/class?
What are other errors in above code?
Thanks for your help.
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: How to include arrays in type/class

Post by MrSwiss »

You are currently using "fixed size" array's.

Code: Select all

' var size array's (aka: dynamic array)
Dim As String blah(Any)
ReDim blah(0 To 9)	' 10 elements
rnbas
Posts: 35
Joined: Jul 22, 2019 18:54

Re: How to include arrays in type/class

Post by rnbas »

Yes, "prognames(any) as string" works. Thanks.

Outside of Type block (in main part of any freebasic program), I find that "prognames() as string" also works (without "any" keyword). Is that how it is?
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: How to include arrays in type/class

Post by MrSwiss »

rnbas wrote:Is that how it is?
Whenever you want to know, how something is exactly,
consult the FreeBASIC Manual (reference section), e.g.: Arrays
Lost Zergling
Posts: 534
Joined: Dec 02, 2011 22:51
Location: France

Re: How to include arrays in type/class

Post by Lost Zergling »

Just a question ?

Code: Select all

' class:
Type rndict
   public:
      prognames(Any) as string
      prognums(Any) as integer
      declare sub showitems()
end type
...

Code: Select all

redim progdict.prognames(2) ' or any
Dim pnames(Any) as string
redim pnames(2) ' or any
' Swap rndict.prognames, pnames  => Is "Illegal non-static member access" when swap attempt on "Any" a desirable feature ?
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: How to include arrays in type/class

Post by MrSwiss »

Lost Zergling wrote:Swap rndict.prognames, pnames => Is "Illegal non-static member access" when swap attempt on "Any" a desirable feature ?
No, it doesn't make any sense to SWAP, when one side is "uninitialized" (aka: Any).
fxm
Moderator
Posts: 12081
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: How to include arrays in type/class

Post by fxm »

Anyway, Swap does not work with arrays but only with array elements.

But otherwise we can do that:

Code: Select all

type rndict
   public:
      prognames(Any) as string
      prognums(Any) as integer
end type

dim as rndict rndict1, rndict2

redim rndict1.prognums(1)
redim rndict2.prognames(2)

swap rndict1, rndict2
Lost Zergling
Posts: 534
Joined: Dec 02, 2011 22:51
Location: France

Re: How to include arrays in type/class

Post by Lost Zergling »

@fxm. Certes, certes. mais cela montre que quelqu'un est capable de faire des posts valant les miens :-)
aloberoger
Posts: 507
Joined: Jan 13, 2009 19:23

Re: How to include arrays in type/class

Post by aloberoger »

? Why a bug

type rndict
public:
prognames(Any) as string
prognums(Any) as integer
end type

Dim as rndict rndict1, rndict2

redim rndict1.prognums(1)
redim rndict2.prognames(2)


rndict1.prognums(0)=300
rndict2.prognums(0)=200


rndict1.prognames(1)="Azerty"
rndict2.prognames(1)="Qwerty"


swap rndict1, rndict2


Print rndict1.prognums(0), rndict2.prognums(0)
Print rndict1.prognames(1),rndict2.prognames(1)




Sleep
fxm
Moderator
Posts: 12081
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: How to include arrays in type/class

Post by fxm »

The arrays 'rndict2.prognums()' and 'rndict1.prognames()' are not sized.
(only 2 over 4)
aloberoger
Posts: 507
Joined: Jan 13, 2009 19:23

Re: How to include arrays in type/class

Post by aloberoger »

according to fxm
The arrays 'rndict2.prognums()' and 'rndict1.prognames()' are not sized.
(only 2 over 4)

? what does this represent

redim rndict1.prognums(1)
redim rndict2.prognames(2)
fxm
Moderator
Posts: 12081
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: How to include arrays in type/class

Post by fxm »

Code: Select all

redim rndict1.prognums(1)   '' resizes the array 'prognums' of the instance 'rndict1',
'                           ''     equivalent to 'redim (rndict1.prognums)(0 to 1)'

redim rndict2.prognames(2)  '' resizes the array 'prognames' of the instance 'rndict1',
'                           ''     equivalent to 'redim (rndict2.prognames)(0 to 2)'
aloberoger
Posts: 507
Joined: Jan 13, 2009 19:23

Re: How to include arrays in type/class

Post by aloberoger »

on that one, I know what redim means, it was you who said that:
The arrays 'rndict2.prognums()' and 'rndict1.prognames()' are not sized.

redim rndict1.prognums(1)
redim rndict2.prognames(2)

means the opposite of what you said
fxm
Moderator
Posts: 12081
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: How to include arrays in type/class

Post by fxm »

aloberoger wrote:it was you who said that:
The arrays 'rndict2.prognums()' and 'rndict1.prognames()' are not sized.

redim rndict1.prognums(1)
redim rndict2.prognames(2)

means the opposite of what you said
2 instances ('rndict1', 'rndict2') x 2 arrays ('prognames()', 'prognums()') => 4 'Redim' expressions

Perhaps a better explanation with a working code:

Code: Select all

type rndict
    public:
        prognames(Any) as string
        prognums(Any) as integer
end type

Dim as rndict rndict1, rndict2

redim rndict1.prognums(1)
redim rndict2.prognames(2)
redim rndict2.prognums(1)   '' 'rndict2.prognums()' must be also sized
redim rndict1.prognames(2)  '' 'rndict1.prognames()' must be also sized

rndict1.prognums(0)=300
rndict2.prognums(0)=200

rndict1.prognames(1)="Azerty"
rndict2.prognames(1)="Qwerty"

swap rndict1, rndict2

Print rndict1.prognums(0), rndict2.prognums(0)
Print rndict1.prognames(1),rndict2.prognames(1)
aloberoger
Posts: 507
Joined: Jan 13, 2009 19:23

Re: How to include arrays in type/class

Post by aloberoger »

thanks

sometimes something is next to us, but we think differently
Post Reply