Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen in Funktionen
Martinius11
20.07.2010, 22:51
Hi,
ich versuche gerad mir Bascom beizubringen und hab das ein Tutorial auf
Microcontroller.net gefunden von Gerold Penz : http://halvar.at/elektronik/kleiner_bascom_avr_kurs/
Da gibts den Tag: Label, Unterprozeduren und Funktionen dort wird im letzten Beispiel ein Sub mit einem Wert deklariert :
Declare Sub Set_led(byval Led_id As Byte)
Nun etwas später bei dem Tag: Ausgänge mit Computer steuern
wirds dann so gemacht:
Declare Sub Do_get_command(cmd_output As String)
nun ist meine Frage wo ist da genau der unterschied ?
Danke
Hallo Martinius,
dass im ersten Fall ein Byte und im zweiten ein String übergeben wird, hast du wahrscheinlich bemerkt.
Ein zusätzlicher Unterschied ist, dass das Byte als Wert übergeben wird, während der String nur referenziert wird. Während vom Byte praktisch eine Kopie in einem speziellen Speicherbereich (Frame) erstellt wird, wird vom String nur die Speicheradresse des ersten Zeichens im Stack abgelegt.
Das macht man bei Strings häufig, weil sonst der ganze String kopiert werden müsste, was zum Einen Zeit, zum Anderen auch doppelt soviel Speicher braucht.
Da der String nun als Original verwendet wird, kannst du ihn in der SUB oder FUNCTION tatsächlich auch ändern. Bei dem Byte änderst du nur die Kopie.
In der Bascom Hilfe steht folgendes:
Byval:
Use BYVAL to pass a copy of the variable.
D.h. du erstellst eine Kopie der Variable
Und bei cmd_output as string da deklarierst du die Variable komplett neu.
In beiden Fällen gilt die Variable glaub ich nur für dieses eine Unterprogramm. Bei dem ersten erstellst du für die Subroutine eine Kopie einer bereits exestierenden Variable (z.B. wenn du im Hauptprogramm die Variable X = 1 hast und nicht möchtest das sie im Hauptprogramm verändert werden soll. Aber trotzdem willst du mit dieser Variable in einem Unterprogramm rechnen. Dann erstellst du eine Kopie der Variable.
Und bei dem zweiten deklarierst du eine Variable komplett neu.
Ich hoffe das ist so einigermaßen verständlich und richtig rüber gebracht
O:)
Es wird IMMER eine Adresse über den Softstack übergeben
Byref die Adresse der Variablen selbst
byval die adresse einer Kopie der Variablen
welcher typ die variable ist, ist egal.
declare sub _nixis ( byval arg as irgendwas) ---> Kopie
declare sub _nixis ( byref arg as irgendwas) ---> direkt
"Byref" nimmt Bascom als default an, wenn nix angegeben wird
bedeutet:
das erstellen der Kopie ist ein Overhead (bei Literalen aber notwendig, denn vorher gibt's ja nix zum adressieren)
sub/func-Argumente, die mit "byref" übergeben werden, können auch von der Sub verändert werden
umgekehrt:
sub/func-Argumente, die mit "byval" übergeben werden, können von der Sub hemmungslos für private Zwecke vernudelt werden, ohne dass die eigentliche Variable verändert wird.
btw: Für die Kopien wird das "Frame" verwendet.
http://www.rn-wissen.de/index.php/Bascom_Inside
Martinius11
21.07.2010, 11:24
Es wird IMMER eine Adresse über den Softstack übergeben
Byref die Adresse der Variablen selbst
byval die adresse einer Kopie der Variablen
welcher typ die variable ist, ist egal.
declare sub _nixis ( byval arg as irgendwas) ---> Kopie
declare sub _nixis ( byref arg as irgendwas) ---> direkt
"Byref" nimmt Bascom als default an, wenn nix angegeben wird
bedeutet:
das erstellen der Kopie ist ein Overhead (bei Literalen aber notwendig, denn vorher gibt's ja nix zum adressieren)
sub/func-Argumente, die mit "byref" übergeben werden, können auch von der Sub verändert werden
umgekehrt:
sub/func-Argumente, die mit "byval" übergeben werden, können von der Sub hemmungslos für private Zwecke vernudelt werden, ohne dass die eigentliche Variable verändert wird.
btw: Für die Kopien wird das "Frame" verwendet.
http://www.rn-wissen.de/index.php/Bascom_Inside
nun ja kopie und orginal aber im ersten beispiel ist ja nichts zu kopieren
und wo ist dann der unterschied von a as bite und byref a as byte ?
PicNick du hast es wahrscheinlichlich erklärt aber leider verstehe ich die Fachsprache nicht ganz
"led_id" ist mit
CONST led_id = 4 (z.b.)
definiert, also nur ein Symbol.
Zum adressieren brauch Bascom aber eine Variable im Schreib-lesespeicher.
Daher MUSS Bascom beim aufruf eine temporäres
DIM argbyte AS BYTE
machen, dann
argbyte = led_id
reinschreiben
und dann die Adresse von argbyte an die SUB weitergeben.
Martinius11
21.07.2010, 13:37
Es wird schon klarer aber kann mir mal jemand eine Funktion z.B für Servo stellzeiten machen und da zeigen warum gerade das hernehmen muss und das andere nicht?
Danke
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.