-         

Ergebnis 1 bis 7 von 7

Thema: Variablen in Funktionen

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    22
    Beiträge
    661

    Variablen in Funktionen

    Anzeige

    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
    MfG Martinius

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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.

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    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

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    22
    Beiträge
    661
    Zitat Zitat von PicNick
    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
    MfG Martinius

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    "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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    22
    Beiträge
    661
    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
    MfG Martinius

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •