PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array an Funktion übergeben



Che Guevara
02.05.2013, 18:14
Hi,

ich möchte einen String nach bestimmten Zeichen durchsuchen. Da ich aber wenig Zeit dafür verwenden kann / darf, möchte ich mir selbst eine Funktion schreiben. Dazu lege ich ein Byte-Array als Overlay über einen String, bis hierhin ja noch kein Problem. Jetzt brauche ich eine Funktion, die mir die Position dieses Zeichens als Byte zurückgibt, das hab ich auch schon:


Function Searchstring(byval Strar As Byte , Byval Strsearch As Byte) As Byte

Local I As Byte

Searchstring = 0

For I = 1 To 255 Step 1
If Strar(i) = 10 Then 'Lf
Exit For
End If
If Strar(i) = Strsearch Then
Searchstring = I
Exit For
End If
Next I


End Function

Der Code ist noch nicht optimiert, aber das mache ich erst, wenns funktioniert. Das Problem ist, wenn ich die Funktion aufrufe:


Tmp = Searchstring(gps_ovl(1) , 58)

arbeitet er nur mit dem ersten Byte des Arrays, weils eben übergeben wurde. Ich möchte aber das ganze Array übergeben. Wie geht das? Bzw. geht das in Bascom überhaupt?
Ich hab schon dran gedacht, die Speicheradresse des ersten Bytes zu übergeben und dann immer zu inkrementieren, aber die Lösung gefällt mir nicht so gut...
Byref kann ich fürs Array nicht nutzen, da ich dann für jeden String eine eigene Funktion bräuchte und das zuviel Platz verbrauchen würde, den ich nicht habe.
Ich hoffe ihr versteht mein Problem und jemand kann mir helfen?! :D

Vielen Dank & Gruß
Chris

for_ro
02.05.2013, 18:49
Hallo Chris,
wenn du wenig Zeit hast, dann geht ByVal eigentlich gar nicht, denn dann würde der ganze String in den Frame kopiert, was unendlich Zeit benötigt. Wieso du dann für jeden String eine eigene Funktion brauchst, verstehe ich nicht.

Wenn du die Funktion so deklarierst:
Declare Function Searchstring(Strar() as byte, strsearch as byte) as byte
dann funktioniert die Übergabe als Array.

Che Guevara
02.05.2013, 19:09
Hi,

ich weiß, aber anders weiß ich momentan nicht, wie ichs machen soll!?
Wenn ich es so deklariere und dann so aufrufe:


Tmp = Searchstring(gps_ovl(1) , 58)

gibts einen Fehler: "Byval should be used" weil eben gps_ovl() nicht in der Funktionsdeklaration drinnen ist.
Mit Byref greife ich ja auf den schon vorhandenen String zu, d.h. ich muss schon beim Programm schreiben festlegen, welchen String ich verwenden will. Wenn ich jetzt 5 Strings habe (wie in meinem Fall), dann bräuchte ich doch 5 Funktionen, wenn ich Byref verwende, oder verstehe ich da was falsch?

Gruß
Chris

for_ro
02.05.2013, 19:16
Hallo Chris,
den ByVal Hinweis bekommst du für die 58, weil er die ja nicht per ByRef übergeben kann.
In der Funktionsdeklaration ist natürlich ein lokales Array drin, nicht das Argument des Aufrufs. Daher brauchst du keine 5 Funktionen.

Declare Function Searchstring(Strar() as byte, byVal strsearch as byte) as byte
Tmp = Searchstring(gps_ovl(1) , 58)

Che Guevara
02.05.2013, 19:26
Hi,

ok, der Fehler ist schonmal weg, danke!
Ich dachte immer, mit Byref arbeitet man quasi mit einem Pointer, aber da war ich wohl falsch informiert.
Jetzt meckert er aber wieder:


$sim
$regfile = "xm32a4def.dat"
$crystal = 32000000
$framesize = 100
$hwstack = 100
$swstack = 100

$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014


Config Osc = Disabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1


Declare Function Searchstring(strar() As Byte , Strsearch As Byte) As Byte



Dim Gpsdata As String * 100
Dim Gps_ovl(100) As Byte At Gpsdata Overlay

Dim Tmp As Byte



Gpsdata = "asdfkjadshfb:lasdfjha:lasdj:laksdfj:"



Do


Tmp = 58 'Asc( ":")
Tmp = Searchstring(gps_ovl(1) , Tmp)
Print Tmp


Loop

End


Function Searchstring(strar() As Byte , Strsearch As Byte) As Byte

Local I As Byte


Searchstring = 0 'Vorbelegung, wenn Zeichen nicht gefunden

For I = 1 To 255 Step 1
If Strar(i) = 10 Then 'Lf
'Exit For
End If
If Strar(i) = Strsearch Then
Searchstring = I
'Exit For
End If
Print Asc(strar(i)) ; ":" ;
Next I


End Function

Bei der Zeile "If Strar(i) = 10 Then" ....

Gruß
Chris

for_ro
02.05.2013, 19:30
Arbeitest du vielleicht mit einer älteren Version des Compilers?
Irgendwann wurde das mal umgestellt. Bei mir (2.0.7.6) meckert er nicht.

Che Guevara
02.05.2013, 19:42
Ja, ich hab hier auf dem PC noch die 2.0.7.3 drauf... Wie wars den vorher? Mein I-net hier ist nicht so der Hit.

Gruß
Chris

for_ro
02.05.2013, 19:51
In der alten Version ging es so, wie du es anfangs geschrieben hattest, also einfach strar ohne Klammern.
Allerdings hast du bei genauerem Hinsehen noch andere Fehler drin.
Dies hier
Tmp = Searchstring(gps_ovl(1) , Tmp)
wird nicht gehen, weil du gleich zu Anfang den Funktionswert auf 0 setzt und damit wird Tmp auch auf 0 gesetzt.
Zum Testen hast du wohl noch dies drin
Print Asc(strar(i))
in strar(i) steht ja schon der ASCII Wert der Stringzeichen, die Funktion Asc ist also unnötig.

Che Guevara
02.05.2013, 20:51
Ja, danke jetzt passts!
Hab gerade in der Hilfe gelesen, dass wenn ich den Wert einer Funktion verändere, die restliche Funktion nicht mehr ausgeführt wird.. WTF?!
Das sollte wohl eigentlich ein Chr anstelle des Asc sein und ich hab mich noch gewundert, warum der mir da mehrstellige Zahlen ausgibt.
Gibts in Bascom die Möglichkeit, einen Parameter optional zu übergeben?

Gruß
Chris

for_ro
02.05.2013, 21:14
Hab gerade in der Hilfe gelesen, dass wenn ich den Wert einer Funktion verändere, die restliche Funktion nicht mehr ausgeführt wird.. WTF?!

Ich denke, dass du da die Hilfe missverstanden hast.
Es wird nur gesagt, dass du nach dem letzten Setzen des Funktionswertes keine weiteren Befehle mehr ausführen sollst. Das aber auch nur, wenn du den Funktionswert nicht direkt einer Variablen zuweist, sondern in einer anderen Weise verwendest.
Ist bei dir also kein Problem.

Ich halte ByRef für so ähnlich wie einen Pointer. Ein Pointer ist ja eine Adresse und du musst explizit sagen, dass du den Wert an dieser Adresse haben willst und nicht die Adresse selber. Pointer kannst ja auch inkrementieren um das nächste Speicherelement zu bekommen. Eine ByRef Variable zeigt aber immer auf den Inhalt und gibt die nicht die Adresse. Da ist das Ergebnis der VarPtr() Funktion schon ähnlicher.
Im SWStack steht immer die Adresse des übergebenen Parameters, also entweder in die globalen Variablen im SRAM, wenn mit ByRef übergeben wurde oder in den Frame bei Übergabe mittels ByVal.

Optionale Übergabe wüsste ich nicht.

Che Guevara
02.05.2013, 21:23
Hm das hab ich dann wohl wirklich falsch verstanden.
Ja, ein richtiger Pointer scheints nicht zu sein, aber ich werds trotzdem weiterhin so benennen :D
Ok, alles klar! Danke für deine kompetente Hilfe.

Gruß
Chris