Forum: Mikrocontroller und Digitale Elektronik Bascom - Overload bei Funktionen


von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Hallo,

hab gerade folgendes Problem in Bascom:
1
dim lngReadPointer as long
2
dim lngWritePointer as long
3
dim lngReadPointerBytes(4) as byte at lngreadPointer overlay
4
dim lngWritePointerBytes(4) as byte at lngWritePointer overlay
5
6
declare sub Test(byref lngPointer as long)
7
do
8
  ...
9
  call test(lngReadPointer)
10
  ...
11
  call test(lngWritePointer)
12
  ...
13
loop
14
15
16
sub Test(byref lngPointer as long)
17
'hier möchte ich auf Byte 1-4 zugreifen
18
'wie kann ich hier eine Overlay-Variable definieren?
19
'es kann ja Read- oder Writepointer sein
20
end sub

Wer weiß da mehr?

Danke
von mue-c (Gast)


Lesenswert?

Overlay kannst du in der Sub nicht nutzen.
Aber du kannst das Array übergeben anstelle der Long Variablen.
von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Hab ich so befürchtet... ist aber "traurig", dass das nicht anders geht
oder gibts doch eine andere Idee


dim lngReadPointer as long
dim lngWritePointer as long
dim lngReadPointerBytes(4) as byte at lngreadPointer overlay
dim lngWritePointerBytes(4) as byte at lngWritePointer overlay

declare sub Test(byref arrBytes as byte)
do
  ...
  call test(lngReadPointerBytes(1))
  ...
  call test(lngWritePointerBytes(1))
  ...
loop


sub Test(byref arrBytes as byte)
print arrBytes(1)
print arrBytes(2)
..
'hier möchte ich auf Byte 1-4 zugreifen
'wie kann ich hier eine Overlay-Variable definieren?
'es kann ja Read- oder Writepointer sein
end sub
von mue-c (Gast)


Lesenswert?

Warum gefällt dir das nicht?
Du willst auf die Bytes zugreifen und übergibst dazu die Bytes. Das 
Overlay hast du global.
von xfred343 (Gast)


Lesenswert?

hi,

das ist es ja was mich so stoert, wenn ich global 100 Variablen habe, 
muss ich 100mal die overlays deklarieren, sinnvoller wäre es, wenn ich 
in der Subroutine den Overlay auf die Variable definiere, vielleicht 
geht es Irgendwie mit varptr und Zugriff auf den Speicherbereich
von Karl H. (kbuchegg)


Lesenswert?

xfred343 schrieb:
> hi,
>
> das ist es ja was mich so stoert, wenn ich global 100 Variablen habe,
> muss ich 100mal die overlays deklarieren, sinnvoller wäre es, wenn ich
> in der Subroutine den Overlay auf die Variable definiere, vielleicht
> geht es Irgendwie mit varptr und Zugriff auf den Speicherbereich

Na ja.
Du brauchst nicht unbedingt 100 Overlays, sondern nur eines.
Dem weist du den fraglichen Wert zu und holst ihn dir Byteweise wieder 
ab.

BASCOM hat eben auch seine Grenzen. Bei eigenen Datentypen ist Ende der 
Fahnenstange.
von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

Danke für die Antworten, jetzt dachte ich mir, vielleicht die Overlay in 
die Funktionen zu verlegen - das wird aber recht gemein...
Folgendes ist syntaktisch korrekt und kann problemlos im Bascom-Emulator 
gestartet werden.
1
$baud = 19200
2
Declare Sub Test1(byval Lng As Long)
3
Declare Sub Test2(byref Lng As Long)
4
Dim Lng As Long
5
Dim Lng2 As Long
6
Lng = 12345678
7
Lng2 = 87654321
8
Call Test1(lng)
9
Call Test1(lng2)
10
Call Test2(lng)
11
Call Test2(lng2)
12
Return
13
14
Sub Test1(byval Lng As Long)
15
Dim Lngbytes(4) As Byte At Lng Overlay 'geht auf die globale lng!!!!!
16
Print Lngbytes(1)
17
Print Lngbytes(2)
18
Print Lngbytes(3)
19
Print Lngbytes(4)
20
End Sub
21
22
Sub Test2(byref Lng2 As Long)
23
Dim Lng2bytes(4) As Byte At Lng2 Overlay 'geht auf die globale lng2!!!!!
24
Print Lng2bytes(1)
25
Print Lng2bytes(2)
26
Print Lng2bytes(3)
27
Print Lng2bytes(4)
28
End Sub

Die Overlays beziehen sich jetzt (klarerweise?!) auf die Speicherplätze 
der globalen Variablen LNG und LNG2 des Hauptprogrammes. Ganz zufrieden 
bin ich mit solchen Ergebnissen vor allem punkto strukturierter 
Programmierung nicht ... werd wohl auf die Byteslösung ausweichen oder 
eine globale Hilfsvariable mit Byte-Overlay verwenden.

So funktionierts meines Erachtens am Klarsten (mit globaler 
Hilfsvariable x):
1
$baud = 19200
2
Declare Sub Test(byref Lng As Long)
3
Dim Lng As Long
4
Dim Lng2 As Long
5
Dim X As Long
6
Dim Xbytes(4) As Byte At X Overlay
7
Lng = 12345678
8
Lng2 = 87654321
9
Call Test(lng)
10
Call Test(lng2)
11
Return
12
13
Sub Test(byref Lng As Long)
14
X = Lng
15
Print Xbytes(1)
16
Print Xbytes(2)
17
Print Xbytes(3)
18
Print Xbytes(4)
19
End Sub


Bascom ist halt so schön zu programmieren, weil es so total ähnlich zu 
VBA und .NET ist, allerdings bei der durchstrukturierten Programmierung 
muss man sich umstellen und Abstriche in Kauf nehmen.. sonst wärs ja C
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.