PDA

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

for_ro
20.07.2010, 23:46
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.

Kampi
20.07.2010, 23:51
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:)

PicNick
21.07.2010, 09:32
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

PicNick
21.07.2010, 12:37
"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