PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sub /Funktion u.s.w ?????



Roberto
26.01.2006, 11:24
Hallo

Probiere gerade Code mit Sub, Funktion u.s.w..

Leider blicke ich da nicht ganz durch :-(
Im Forum finde ich leider auch nicht viel..

Vielleicht könnt Ihr mir ein paar Fagen beantworten :-)

*Was bringt mir eine Sub gegenüber einem Gosub?

* Kann ich mit Sub, mir auch einen Wert zurückgeben lassen, oder brauche ich dazu die "Funktion" ?

*Vertehe das nicht mit den Byval und Byvar ...

* Gib es zu Sub und Funktion.. wo eine verständliche Erklärung/en?


Könnte mir jemand bitte helfen ? :-)

l.G. Roberto

PicNick
26.01.2006, 11:31
SUb & function lassen argumente zu, gosub nicht
call sub ( Arg1, Arg2)
funtion kann auch einen Werte zurückgeben
seppel = function( Arg1, Arg2)

Ein bißchen was gibt's da
https://www.roboternetz.de/wissen/index.php/Bascom_Inside

Rage_Empire
26.01.2006, 11:32
*Was bringt mir eine Sub gegenüber einem Gosub?


Das habe ich mich am Anfang auch gefragt, jetzt weiß ichs....Es bringt den Vorteil, das du die Subs und Functionen wie Befehle aufrufen kannst, was eine saubere sache ist. Gerade, wenn du in Bausteinen programmierst (wie ich inzwischen ;-) ) und diese mit Include zusammensetzt, kannst du die ganzen Unterroutinen wie ein Befehl abrufen. Das macht das Programmieren übersichtlicher und strukturierter. VB wir übrigends fast nur mit Subs und Funcs programmiert.

Roberto
26.01.2006, 11:40
Hallo Rage_Empire

Habe schon ein paar Beiträge von dir zu diesem Thema gelesen :-)

Wo hast Du dich zu den Thema schlau gemacht ?

Bekomme ich mit Sub auch einen Wert zurück ? oder nur mit Funktion ?

(Die Hilfe gibt leider nicht viel her :-( )

Wird der Code durch Sub auch kleiner oder blaibt es gleich ?

PicNick
26.01.2006, 11:48
Die Variante seppel = func(arg1, arg2) geht nur mit function.

Du kannst aber auch folgendes machen:


declare sub subb (byref ergebnis as word, byval arg1 as byte, byval arg2 as byte) ' beachte byref

call subb(seppel, 3, 6) ' aufruf
print str(seppel)

end

sub subb (byref ergebnis as word, byval arg1 as byte, byval arg2 as byte)
ergebnis = arg1 * arg2
end sub


das funzt dann wie eine function, vom generierten Code her isses dasselbe.

Sowas macht man vor allem dann, wenn eine sub mehrere ergebnisse liefern soll.


PS Nochwas: bei sub und function kannst du auch "LOCAL" definieren, bei gosubs nicht

Roberto
26.01.2006, 11:55
Hallo Robert

Für was ist byval und byref ?
(die Beschreibung der Hilfe kapiere ich nicht)

Als erster will ich mal eine Tastenmatrix abfragen.
Kann ich da jetzt Sub nehmen oder eher Funktion ?

Rage_Empire
26.01.2006, 11:55
Funktionen benutze ich meistens bei Rechnerischen operationen oder bei Eingaben (z.B. ADC). Subs hingegen nehme ich Hauptsächlich um Unterprogramme etwas ausführen zu lassen. Schlau bin ich erst draus geworden, als ich damit rumexperementiert hab, da mir irgendwann das ganze gosub...return und goto..hin...goto...her zu unübersichtlich wurde. Sieht Anfangs komplizierter aus, als es ist. Naja, die Bascomhilfe hat mir dabei am wenigsten geholfen.

Noch was: Byref bezieht die Variabeln als Referenz, wird also direkt auf die Speicherzelle der Variable verwiesen. Bei Byval wird die Variable aus dem Speicher kopiert.

PicNick, korrigier' mich wenn ich hier was falsches erzähl ;-)

PicNick
26.01.2006, 12:42
SUB oder FUNCTION ist viel Geschmackssache dabei.
Nachteil von function ist der, daß du den Rückgabewert beim Aufruf auch immer angeben mußt, auch wenn er dich an der Stelle garnicht interessiert. (Laß mich das jetzt nicht erklären)
@Rage, stimmt eh so.
Byref (=> by reference => "durch die Adresse" ) ist eben die Adresse einer Variable,
byval ist aber die Addresse einer (temporären) Kopie der Variablen. Das ist zusätzlich Arbeit & Code. Die brauchst du aber aus zwei Gründen: entweder weil du nicht willst, daß die Sub/function die Variable unabsichtlich verändert, oder, wenn du KONSTANTEN übergeben willst, die es ja physisch garnicht gibt.

Roberto
26.01.2006, 14:27
Hallo

Habe jetzt mal probiert (Ein Beispiel von c.Kühnel)




.
.
.
Declare Function Taste() As Byte
.
.
.
Do
Lcd Taste()
Loop
end


'------------------Function: Tasten von einer 4*3 Matrix auslesen----------------
' 3 Spalten auf Portd.5-7
' 4 Zeilen auf Portc.0-3

Config Portd = Output
Config Portc = Input
Portc = &B00001111

Function Taste() As Byte

Local Spalte As Byte
Local Zeile As Byte
Local Taste_x As Byte


Taste_x = 0

For Spalte = 1 To 3
Portd = &B11100000 ' Portd.5-7 auf High
If Spalte = 1 Then Reset Portd.5
If Spalte = 2 Then Reset Portd.6
If Spalte = 3 Then Reset Portd.7
For Zeile = 1 To 4
Select Case Zeile
Case 1 : Debounce Pinc.0 , 0 , Taste_auswerten , Sub
Case 2 : Debounce Pinc.1 , 0 , Taste_auswerten , Sub
Case 3 : Debounce Pinc.2 , 0 , Taste_auswerten , Sub
Case 4 : Debounce Pinc.3 , 0 , Taste_auswerten , Sub
End Select
Next Zeile
Next Spalte
Taste = Taste_x


End Function

Taste_auswerten:
Select Case Zeile
Case 1 : Taste_x = Spalte + 1
Case 2 : Taste_x = Spalte + 4
Case 3 : Taste_x = Spalte + 7
Case 4 : Taste_x = Spalte + 10
End Select
Return


Wollte nur Locale Variablen, geht aber nicht so. :-(
Wenn ich die Variablen: Taste_x, Zeile, Spalte mit Dim deklariere, schreit er nicht :-(

Es ist zum Mäuse melken :-(

PicNick
26.01.2006, 14:48
"end function" erst NACH den subs. Die gehören ja dazu


...
Next Spalte
Taste = Taste_x

exit function ' function verlassen

Taste_auswerten:
Select Case Zeile
Case 1 : Taste_x = Spalte + 1
Case 2 : Taste_x = Spalte + 4
Case 3 : Taste_x = Spalte + 7
Case 4 : Taste_x = Spalte + 10
End Select
Return

End Function ' jetzt is aus

Ratber
27.01.2006, 01:00
*Was bringt mir eine Sub gegenüber einem Gosub?


Das habe ich mich am Anfang auch gefragt, jetzt weiß ichs....Es bringt den Vorteil, das du die Subs und Functionen wie Befehle aufrufen kannst, was eine saubere sache ist. Gerade, wenn du in Bausteinen programmierst (wie ich inzwischen ;-) ) und diese mit Include zusammensetzt, kannst du die ganzen Unterroutinen wie ein Befehl abrufen. Das macht das Programmieren übersichtlicher und strukturierter. VB wir übrigends fast nur mit Subs und Funcs programmiert.


Ja dem kann ich zustimmen,ist übersichtlicher.
Aber einen Pferdefuß bzw. zwei hat die Sache aber dennoch.

Zum einen kostets etwas Performance und zum anderen kostets mehr Speicher denn im gegensatz zum PC ist Speicher im Controller "immer" Knapp.
Wer also schon am Limmit rennt und aus Kostengründen nicht einfach auf nen größeren Controller umsteigen kann der muß dann wieder beim Italiener Spagetti bestellen. :wink:

Rage_Empire
27.01.2006, 07:25
Ja ratber, leider, wobei hier hauptsächlich der Compiler dran schuld ist.

Roberto
27.01.2006, 07:40
Hallo

Wie viel mehr (in %) braucht den ca. die Sub oder Function ?

Probiere gerade mit Function und das eine funktioniert ganz gut.

Aber vermutlich komme ich an die Speicher-Grenze vom Mega8 und überlege mir, ob ich jetzt so weitermache (Sub und Functionen verwenden..)

Roberto
27.01.2006, 07:50
Habs gerade probiert.

mit Function = 2094 Byte
mit Gosub = 2014 Byte

Das sind dann ca. 4 % mehr, was eine Function braucht!!!

Gut zu wissen :-)

Rage_Empire
27.01.2006, 08:03
Du kannst versuchen Locals und Byvals zu vermeiden wenns geht. das kann hier schon einiges ausmachen.

PicNick
27.01.2006, 08:46
Dort, wo's geht (keine rekursionen), auf globale Variable umsteigen.
Nach Möglichkeit Byte-Variable
Arrays vermeiden
Schleifen immer hinterfragen, ob nicht auch Spaghetticode geht (meist kürzer)
Konversionen str() val() sind teuer
Bit-setzen /Abfragen ( if Portb.3 = porta.1 ) sind schweineteuer
blabla

Ratber
27.01.2006, 14:59
Ja,genau.

Auch Fließzahlen möglichst vermeiden.

Eine Rechnung mit Long ala "A/1.78" kostet satte runde 300 Bytes.

Mit

A = A * 50
A = A / 89

sind es nur 30

Das ist dann schon fett wenn man nur auf nem 1-2K Controller arbeiten will.