Funktion ausführen



  • Hallo Leute,

    hoffe jemand kann mir einen Tip geben was ich falsch
    mache, habe erst angefangen C zu programmieren.
    Ich möchte in einem Unterprogramm verschiedene Werte
    aus einem Byte ausmaskieren. Ich kann das Programm
    zwar compilieren aber beim debuggen führt er die
    Funktion nicht aus! Hab ich etwas vergessen?

    Danke Stefan
    -----------------------------------------------------

    #include <avr/io.h>

    void split(char Byte_eins)
    {

    unsigned char Adresse;
    unsigned char R_W;
    unsigned char Ident;

    // Ausmaskieren
    Adresse = ((0x70) & Byte_eins);

    R_W = ((0x08) & Byte_eins);
    R_W = (R_W >> 3);

    Ident = ((0x07) & Byte_eins);

    }

    int main(void)
    {
    while(1)
    {
    split(0xFF);
    }
    return(0);
    }



  • Vielleicht ist der Compiler so schlau, dass er erkennt, dass deine Funktion nichts tut. Deshalb optimiert er sie weg. </spekulation>



  • Das ist möglich, aber warum macht meine Funktion nichts?
    Läßt sich das vielleicht mit "volatile" lösen?

    Stefan



  • Naja, was soll sie denn machen? Sie berechnet ein paar Sachen und wirft die Ergebnisse weg. Hat am Ende den gleichen Effekt als wär sie gar nicht aufgerufen worden.



  • Hab jetzt versucht ein Programm zu schreiben
    das structs zurückliefert.

    Allerdings bringt mir der Compiler Fehlermeldungen
    aus denen ich nicht schlau werde. Vielleicht hat jemand einen
    Tip was ich vergessen hab!

    Danke Stefan

    +++++++++++++++++++++++++++++++++++

    [cpp]#include <avr/io.h>

    struct Byte_eins_werte
    {
    unsigned char Slave_Adresse;
    unsigned char R_W;
    unsigned char Ident;
    };

    struct split(char Byte_eins)
    // ????? split.c:10: error: parse error before "char"

    {
    struct Byte_eins_werte byte_daten;

    // Ausmaskieren
    byte_daten.Slave_Adresse = ((0x70) & Byte_eins);
    byte_daten.Slave_Adresse = (Slave_Adresse >> 4);

    byte_daten.R_W = ((0x08) & Byte_eins);
    byte_daten.R_W = (R_W >> 3);

    byte_daten.Ident = ((0x07) & Byte_eins);

    return byte_daten;
    }

    int main(void)
    {

    struct Byte_eins_werte byte_werte;

    while(1)
    {
    byte_werte = split(0xFF);
    //split.c: In function main': // ????? split.c:35: warning: implicit declaration of functionsplit'
    // ????? split.c:35: error: incompatible types in assignment
    }
    return(0);
    }



  • Du musst dem Computer sagen, was für eine Struktur die Funktion split zurückgeben soll. Ein allgemeines "struct" reicht da nicht.



  • Das mit dem "parse error before char"
    hat sich jetzt erledigt. Aber der Compiler meckert
    weiter rum!

    Er schreibt die Variablen Slave_Adresse & R_W
    sind nicht deklariert. Was will er von mir, ich hab das
    doch schon im struct deklariert?

    Was hat es bei den structs mit diesem "->" Operator
    auf sich, muß ich den verwenden?

    Danke für die Hilfe!

    Stefan

    #include <avr/io.h>
    
    struct Byte_eins_werte
    {
      unsigned char Slave_Adresse;
      unsigned char R_W;
      unsigned char Ident;
    };
    
    struct Byte_eins_werte split(char Byte_eins)
    {
    struct Byte_eins_werte byte_daten;
    
    // Ausmaskieren
    byte_daten.Slave_Adresse = ((0x70) & Byte_eins);
    byte_daten.Slave_Adresse = (Slave_Adresse >> 4);
    // split.c:16: error: `Slave_Adresse' undeclared (first use in this function)
    // split.c:16: error: (Each undeclared identifier is reported only once
    // split.c:16: error: for each function it appears in.)
    
    byte_daten.R_W = ((0x08) & Byte_eins);
    byte_daten.R_W = (R_W >> 3);
    // split.c:22: error: `R_W' undeclared (first use in this function)
    
    byte_daten.Ident = ((0x07) & Byte_eins);
    
    return byte_daten;
    }
    
    int main(void)
    {
    
    struct Byte_eins_werte byte_werte;
    
    while(1)
      {
      byte_werte = split(0xFF);	  
      }
    return(0);
    }
    


  • Das Problem in den Zeilen, in denen der Fehler auftritt, ist, dass Du R_W und Slave_Address auf der rechten Seite der Zuweisung als eigenständige Variablen verwendest - was sie ja gar nicht sind. (R_W und byte_daten.R_W sind nicht das selbe)


Anmelden zum Antworten