Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktionen in bascom deklarieren?
Lunarman
06.06.2007, 14:46
Hallo,
mein problem ist, dass ich C aufgrund der Möglichkeit der Funktionen geil finde, aber mit dem ganzen Bitgeschubse (rofl) nicht klar komme. Bascom wiederum hat das problem, dass man schwierig Funktionen reinbringen kann.
Meine Frage: Kann mir jemand vielleicht zwei Codeschnipsel zum verständnis schreiben (und kommentieren), indem a) in einer eigenen Datei ne Funktion deklariert wird, die die übergebenen Werte x und y multipliziert und b) im Programm selbst die Funktion aufgerufen wird, die Werte übergeben werden und z (das produkt von x und y) abgerufen wird?
Ich hab mir das zwar in der Bascomhilfe angeguckt, blick das aber nicht.
Wichtig wäre für mich, dass alles in Basic (also kein Assembler) geproggt wird, da ich nicht sehr viel Lust hätte, dafür jetzt noch extra Assembler zu lernen. Wenn das jemand für mich machen könnte, wäre das supernett!
'--------------------------- deklaration ------------------
Declare Function Multiplizieren(x As Byte , Y As Byte) As Word
Dim Wert1 As Byte
Dim Wert2 As Byte
Dim Ergebnis As Word
DO
wert1 = 125
wert2 = 48
ergebnis = multiplizieren(wert1, wert2) ' Aufruf
print ergebnis
LOOP
END
'--------------------------- die funktion selbst------------------
Function Multiplizieren(x As Byte , Y As Byte) As Word
Multiplizieren = X * Y
end function
Lunarman
06.06.2007, 19:44
Danke. Diese
Declare Function Multiplizieren(x As Byte , Y As Byte) As Word
muss das mit in mein Hauptprogramm oder kann ich das auch in der externen Datei hinschreiben?
danke fuer die antwort.. das wollte ich auch grade fragen .. :)
und noch ne frage... wie kann ich eine funktion declarieren, die nur aufgerufen wird,und dann ein paar ports setzt oder aehnliches, ohne irgendwelche werte zuruckzugeben.... also ohne dieses As Integer oder sowas in der art...
Als
Sub Ohneworte()
Gento
Hallo,
eine "Funktion", die etwas tut, aber keinen Wert zurückgibt, heißt Prozedur oder Unterprogramm, in Bascom mit SUB ... ENDSUB realisiert.
Prozeduren können wie Funktionen auch Parameter besitzen, die an die Prozedur übergeben werden (und ggf. von der Prozedur verändert werden können).
Das Verständnis von Prozeduren mit oder ohne Parametern ist wichtig, wenn man ein Programm modular aufbauen möchte (oder arbeitsteilig vorgeht). Es lohnt sich also, darüber nachzudenken, viele Programme und Algorithmen werden dadurch erst gut realisierbar und verständlich.
Prozeduren und Funktionen gibt es in jeder besseren (Hoch-)Sprache!
MfG
ok. das mit den subs hab ich jetz verstanden.. allerdings hab ich da noch irgednwie syntaxprobleme... folgendes beispiel:
Declare Sub Greifer_auf()
Sub Greifer_auf()
M_5_v = 1
M_5_e = 1
M_5_r = 0
End Sub
'################################################# ######################
Do
B = Waitkey(#4) 'Motor 6'
Select Case B
Case "a" :
Greifer_auf
Case "d"
......
wenn ich das so schriebe wird die sub immer ausgeführt auch wenn kein "a" eingegeben wird....
der ursprüngliche code war so:
Do
B = Waitkey(#4) 'Motor 6'
Select Case B
Case "a" :
M_5_v = 1
M_5_e = 1
M_5_r = 0
Case "d" :
.....
im prinzip is das doch das gleiche oder was hab ich falsch gemacht...
beim ursprünglichen beisiel werden die ports nur gesetzt wenn man die taste drückt, bei der variante mit sub tut er es sobald man das programm auf den controller ueberspielt... wo is mein denkfehler ?? danke shcon mal...
Holla !
De Sub selbst muß irgendwo hinten (nach "END") stehen.
declare sub subfunc()
DO
subfunc() ' AUFRUF sub
LOOP
END
sub subfunc()
.. tu was
end sub
Lunarman
08.06.2007, 14:46
Genau genommen kann man mit ner SUB durchaus Werte zurückerhalten. Ich kann die Sub ja einfach ne Variable verändern lassen und die danach mit dem Hauptprogramm oder ner anderen Sub aufrufen. Aber was ich noch nicht ganz verstanden habe, kann ich den Code
Sub Greifer_auf()
M_5_v = 1
M_5_e = 1
M_5_r = 0
End Sub
, also die eigentliche Funktionsanweisung (was macht meine Funktion) auch in eine externe Datei (lib oder bas???) reinschreiben wie in c?
Beides geht. Nur LIB bzw. LBX ist Assembler. das wirst du nicht wollen.
Schreib am besten 2 externe Dateien:
EIne mit der Declare .......,
und eine mit der Sub selbst.
#----------------------------------------
'das steht ganz vorne im Hauptprogramm
$include "Meine_deklarationen.bas"
' und das dann irgendwo hinten, nach "END"
$include "Meine_funktionen.bas"
> Genau genommen kann man mit ner SUB durchaus Werte zurückerhalten. Ich kann die Sub ja einfach ne Variable verändern lassen
Ja. Bei einer Funktion kannst Du aber an eine Variable zuweisen, bei einer Prozedur (SUB) nicht. Daher haben beide ihre Berechtigung ..
a= f(x) geht, wenn man eine Funktion f(x) definiert hat (wie in Mathe ..)
Lunarman
08.06.2007, 16:28
@Netbird: Stimmt ,ist mir gar nicht aufgefallen, dass das sogar die gleiche Syntax ist.
@PicNick: Das wäre dann ja original wie in C, mit der header (declares) und der x.c (mit den Funktionen)
..original wie in C,
Ja, ist so. An der Stelle, wo "$include" steht, fügen Bascom und C diese File direkt ein, wo auch immer.
Zusatz: die "DIM" Anweisungen kannst du auch machen, wo du willst. Hauptsache, BEVOR du sie ansprichst.
Und beim Include sind auch File-Pfadangaben möglich, d.h. du kannst dir in irgendeinem Directory sowas wie eine allgemeine Library einrichten.
Lunarman
08.06.2007, 17:29
Also ist Bascom doch gar nicht so doof! Cool! Danke!
Das wird jetzt offtopic, aber zumindest bascomspezifisch - könntest du mir bitte deine I2C lib n bisschen idiotenfreundlich erklären? meinetwegen auch per pn. Ich steig durch deinen wiki-artikel gar nicht durch. Es ist das erstemal, dass ich I2C benutze, und ich möchte einen Atmega8 (Sklave) mit der RN-Control (der meister) verbinden. Eigentlich ist i2c dafür vielleicht oversized, denn ich möchte nur strings versenden, und das sogar nur einseitig. Vielleicht könntest du mir da ein kleines Programm für beide Seiten schreiben oder mir dein I2C erklären, was man damit machen kann und was nicht.
Hinweis: der atmega8 schleicht mit einem mhz durch die weltgeschichte. geht das damit dann überhaupt mit ner akzeptablen Geschwindigkeit?
Hallo,
ja, Bascom wird gerne unterschätzt ...
Beispiele mit Erklärungen findest du im Bascom-Kursus von P.Dams, z.B.
- Ansteuerung eines PCF8574 (8Bit IO- Erweiterung)
- Ansteuerung eines DS1621 Temperaturbausteins
Ist zwar in Niederländisch, aber mit Schaltung+ Programmtext und für Deutsche auch zu verstehen ...
Quelle: www.mcselec.com, dann Application Notes, dort AN110; ist eine PDF-Datei + Anhangsatei mit BAS- Progs.
Weiteres Beispiel: Ansteuerung eines I2C- EEPROM- Speichers bei C.Kühnel, AVR RISC .. mit BASCOM .., 2. Auflage mit Programm + Erklärungen.
MfG
P.S.: ... Erklärungen zu I2C sind natürlich gemeint ...
ist zwar nicht das, was Du machen möchtest, aber vielleicht hilft es zum Verständnis ..
Lunarman
08.06.2007, 19:25
Gucks mir gleich mal an, aber was ich halt vor allem brauche ist Code fürn Sklaven.
will einer sub nen wert uebergeben: was ist hierdran falsch: ?
habs hcon die hilfe gelesn...
Declare Sub Hand_drehen_links(v As Byte)
Do
Call Hand_drehen_links(40)
Loop
End
Sub Hand_drehen_links(v As Byte)
M_5_v = 1
Compare1b = V
M_5_r = 0
Led = 1
End Sub
der meckert irgednwas wegen byval ?? was soll das sein?
Lunarman
27.06.2007, 19:04
welche Zeile denn?
die:
Call Hand_drehen_links(40)
ohne call gehts auch net...
fehler:
byval should be used in declaration...
Lunarman
27.06.2007, 19:41
kann ne Sub keine variablen übernehmen??? Wär mir ja ganz neu!
Du gibts beim call ja das "40" als literal an, daher das "byval"
bei "byref" (also so wie bei deinem declare) muß das argument in einer variablen stehen
anders:
Declare Sub Hand_drehen_links(v As Byte)
dim varia as byte
Do
varia = 40
Call Hand_drehen_links(varia)
Loop
End
Sub Hand_drehen_links(v As Byte)
M_5_v = 1
Compare1b = V
M_5_r = 0
Led = 1
End Sub
Konkret heißt das, bei "byval" übergibt er der sub eine KOPIE des wertes, daher kann sie auch im Porgrammspeicher stehen.
Bei "byref" (oder nix) übergibt er die (SRAM-) adresse der Variablen
Klaro ? :-)
Lunarman
27.06.2007, 20:44
Heißt also, er meckert gar nicht über die Zeile, sondern eigentlich darüber, dass in der Deklaration ix angegeben wird?
Hallo, hier ein praktisches Beispiel:
Ich möchte für einen Schrittmotor die Prozedur Vorwärts1(Schritte) haben, der Wert für die Schrittzahl soll im im Kopf übergeben werden. Ich deklariere die Prozedur Vw1 so:
1. Declare Sub Vw1(byval Schritte As Word)
2. Am Ende des Programms (nach END!) steht die Definition der Prozedur, damit Bascom weiß was abzuarbeiten ist:
Sub Vw1(by Val Schritte As Byte) 'Schrittmotor links drehen
For J = 1 To Schritte
Portb.4 = 1 : Portb.5 = 1 : Waitms 3
Portb.5 = 0 : Waitms 5
Next
End Sub
3. Im Programm rufe ich die Prozedur z.B. auf mit
Call Vw1(50)
Dann dreht der Motor 50 Schritte weit.
jipp klappt danke fuer die hilfe...
@lunarman: bingo, genau
Guck mal da
https://www.roboternetz.de/wissen/index.php/Bascom_Inside#Call_Sub_.26_Function
Tip: "byval" ist püraktisch, weil man variable UND Festwerte gemischt übergeben kann
aaaaaaber:
Das Kopieren kommt bei jedem "Call"-Argument dann dazu, das frißt FRAMESIZE + Programmspeicher + Code
(bei einem String ist das ganzschön)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.