Tömb lehet-e függvény paraméter

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 180
Csatlakozott: 2012. január 22. vasárnap, 7:00

Tömb lehet-e függvény paraméter

Hozzászólás Szerző: aaszabo »

Sziasztok!

Lehet függvény paraméterként tömböt átadni?

Lenne egy függvényem, aminek az egyik paramétere egy byte tömb. Deklarálni is lehet, meg is írtam a függvényt, de a fordító a függvényen belüli első tömbhasználatnál hibát ad:
Error 242 Source variable does not match the target variable[0]
A Kódban jelzett ( ITT VAN A HIBA) soron

A függvény egyébként a LOOKDOWN-t valósítja meg, de tömbön és nem Data-val megadott adatsoron. Ha a LOOKDOWN-t rá lehetne venni, hogy tömbön is működjön, akkor ebben a speciális esetben megoldaná a problémámat. De akkor is kérdés számomra, hogayn lehet tömböt átadni, használni függvény paraméterként.

Kód: Egész kijelölése

Function Findbyte(byref Arg_array As Byte , Byval Arg_array_length As Byte , Byval Arg_value As Byte , Byval Arg_offset As Byte) As Integer
   Local Poi As Byte
   Poi = 1
   Local B_value As Byte
   Local B_offset As Byte
   B_offset = Arg_offset

   If Arg_offset < 1 Then Arg_offset = 1

   If Arg_offset > Arg_array_length Then
      Findbyte = -1
      Return
   End If

   For Poi = B_offset To Arg_array_length
      B_value = Arg_array(poi)   '<-----ITT VAN A HIBA!!!
      If B_value = Arg_value Then
         Findbyte = Poi
         Return
      End If
   Next Poi

   'Did not find the value expected
   Findbyte = 0
End Function
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Azt nem tudom, hogy lehet e???
De ez a program részlet több sebből is vérzik!
1 byref Arg_array As Byte << Nem is tömböt adsz át??
2 Mik ezek a : Findbyte = -1 : Return
Igy nem lehet elhagyni a rutint!
Old meg másképen!
:wink:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Függvényparaméter lehet tömb. Ekkor tömbként kell definiálni.
Fontos! Az átadott tömb ha másolatban lesz használva (byval/byref), akkor nehogy kilógjon a stack/frame területről!
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 180
Csatlakozott: 2012. január 22. vasárnap, 7:00

Hozzászólás Szerző: aaszabo »

A mutatott kód nem az eredeti változat, ezért jogos az észrevétel. Valahol egy német oldalon találtam hasonló problémára megoldásként ezt a verziót, de nem működött. Az eredeti változatban a paraméter tömbként van a deklarációban is és a függvényfejben is megadva. Ahogy most itt látszik. Nincs byref sem hozzá, hiszen alapból minden byref. Csak próbálkoztam, hátha segít.

Miért nem lehet return-val elhagyni a rutint, ha előtte megadtam a visszatérési értéket?

Eredeti problémás kód:

Kód: Egész kijelölése

Function Findbyte(Arg_array() As Byte , Byval Arg_array_length As Byte , Byval Arg_value As Byte , Byval Arg_offset As Byte) As Integer
   Local Poi As Byte
   Poi = 1
   Local B_value As Byte
   Local B_offset As Byte
   B_offset = Arg_offset

   If Arg_offset < 1 Then Arg_offset = 1

   If Arg_offset > Arg_array_length Then
      Findbyte = -1
      Return
   End If

   For Poi = B_offset To Arg_array_length
      B_value = Arg_array(poi)   '<-----ITT VAN A HIBA!!!
      If B_value = Arg_value Then
         Findbyte = Poi
         Return
      End If
   Next Poi

   'Did not find the value expected
   Findbyte = 0
End Function 

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Kilépés a sub-ból:

Kód: Egész kijelölése

exit sub
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Tömb lehet-e függvény paraméter

Hozzászólás Szerző: kapu48 »

Valaki legyen, szíves világosítson már fel!

Bemásolom a Bascom help-ből a Subrutin > tömb átadás rutinjukat és nekem nem fogadja el az értékátadásokat?
http://avrhelp.mcselec.com/index.html?l ... entals.htm
DECLARE SUB:

Kód: Egész kijelölése

'  TestArray2.bas

$regfile = "m1280def.dat"                                   ' specify the used micro
$crystal = 16000000                                         ' used crystal frequency
$hwstack = 100                                              ' hardware stack
$swstack = 100                                              ' SW stack
$framesize = 150                                            ' frame space

$baud = 9600

'(
ARRAYS

Arrays can be passed by reference only. You need to add  empty parenthesis() after the variable to indicate that you pass an array.

Inside the sub/function you also need to use () when accessing the variable.

Let's have a look at an example.

')

Declare Sub Testarray(Ar() As Byte , Byval B As Byte)

Dim A(10) As Byte , Q As Byte

A(1) = 5
A(2) = 10
A(3) = 15
Q = 3

Testarray A(1) , Q

End                                                         'end program

'(
As you can see, we add () after the variable to indicate that it is an array we pass.

When we call the sub program, we pass the first address or the base address of the array. That is a(1) in this case.

Inside the sub module, we also refer to the variable using ().
')


Sub Testarray(Ar() As Byte , Byval B As Byte)
   Local C As Byte

   'MIÉRT HIBÁSAK AZ ALÁBBI SOROK???
   C = Ar(1)
   Ar(4) = C

   print ar(1)

   print ar(b)

End Sub

:?: :?: :?: :oops: :oops: :?: :?: :?:
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2014. február 12. szerda, 22:26-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Tömb lehet-e függvény paraméter

Hozzászólás Szerző: Robert »

Melyik Bascom verziót használod?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Tömb lehet-e függvény paraméter

Hozzászólás Szerző: kapu48 »

Bascom ver.: 2.0.7.3 és, vagy Bascom ver.: 2.0.7.5 detó!
:evil:
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 180
Csatlakozott: 2012. január 22. vasárnap, 7:00

Re: Tömb lehet-e függvény paraméter

Hozzászólás Szerző: aaszabo »

A Help azt is írja, hogy régebben nem használták a zárójelet a tömb esetén a subrutin deklarációban sem és a fejrészben sem.
És akkor nekem működik.
Vagyis:
Declare Sub Testarray(ar As Byte , Byval B As Byte)

És a subrutin sora:
Sub Testarray(ar As Byte , Byval B As Byte)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Tömb lehet-e függvény paraméter

Hozzászólás Szerző: kapu48 »

Köszönöm!

Ezek a fránya ()-jelek!

Na meg az angoltudásom?
:oops:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Tömb lehet-e függvény paraméter

Hozzászólás Szerző: kapu48 »

(Kihagytam pár Bascomos 2.0.7.3 hónapot! És most kellenének felvilágosítások, mért nem működnek a régi jól bevált dolgok?)
Például az Overlay?

Kód: Egész kijelölése

'  TestArray2.bas
$regfile = "m2561def.dat"
'$regfile = "m1280def.dat"                                   ' specify the used micro

$crystal = 16000000                                         ' used crystal frequency
$hwstack = 100                                              ' hardware stack
$swstack = 100                                              ' SW stack
$framesize = 150                                            ' frame space

$baud = 9600


Dim Szam As Word
Dim Also At Szam As Byte Overlay
Dim Felso At Szam + 1 As Byte Overlay

End
Miért hibás?:
Error : 26 Line : 15 AS expected [ALSO] , in File : K:\AVR\LCD\4dsystems\PICASO Processor by 4D\PICASO_BASCOM\TestArray2.bas
Error : 26 Line : 16 AS expected [FELSO] , in File : K:\AVR\LCD\4dsystems\PICASO Processor by 4D\PICASO_BASCOM\TestArray2.bas
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Tömb lehet-e függvény paraméter

Hozzászólás Szerző: kapu48 »

Bocsi!
Rossz helyről puskáztam!
A helyes alkalmazás:

Kód: Egész kijelölése

Dim Szam As Word
Dim Also As Byte At Szam Overlay
Dim Felso As Byte At Szam + 1 Overlay
:?
Válasz küldése