- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Parameter von Funktionen in Funktionen

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2009
    Beiträge
    26
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Noch eine kleine Anmerkung zur Laufzeit von Pointer vs. "Normal"

    Bei der übergabe "by reference", also per Pointer, ist zu beachten dass man in der Regel nur einen Performance-Gewinn hat, wenn keine sog. primitiven Datentype wie int, char o.ä. übergeben werden. Z.B. ist bei einem 32 Bit System der Pointer auch immer 32 Bit. Daher macht es hierbei keinen unterschied. Zumindest in Bezug auf die Performance.

    Allerdings sollten z.B. Strukturen immer "by reference" übergeben werden. Da ansonsten die gesamte Struktur auf den Stack kopiert werden muss. Und das kostet Zeit und Speicherplatz.

    Soll eine Funktion aber z.B. mehr als einen Rückgabewert besitzten, so muss dies über Pointer oder in C++ über Referenzen geschene. Mit einem C++ Compiler wäre es auch möglich, eine "const reference" zu übergeben. Dadurch verhindert man ein unbeabsichtiges Verändern eines übergebene Parameters.

    In jedem Fall kann z.B. ein Blick in den vom C-compiler erzeugten ASM-Code nicht schaden. Es Test mit einem Parameter "by value" (also "normal") und "by reference" sollte die unterschiede klar machen. Den erzeugten ASM Code kann man sich über einen Command-Line-Switch vom Compiler erzeugen lassen.

    Gruß
    Andy

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2009
    Beiträge
    26
    Noch eine kleine Anmerkung:

    Ich müsst mich jetzt schwer irren aber ich mache das seit Jahren so und meinte dies auch so gelernt zu haben?
    Wenn du wirklich im .H File die DEFINITION der Variable, also "uint8 someVar;" stehen hast, dann ist das eher sehr ungünstig. In einem Header-File sollte immer nur die DEKLARATION einer Variable stehen.

    Das heißt:
    im .c File steht
    uint8 someVar;

    imt .h File steht:
    extern uint8 someVar;

    Damit ist die Variable im C-File DEFINIERT und im H-File DEKLARIERT. Dann sind Compiler und Linker glüklich und man hat sauberen Code der keine Probleme macht. Es kann schnell passieren, wenn die Variable im h-File Definiert wird, dass man Fehlermeldung über doppelt definierte variablen bekommt. Das mag meistens der Linker nicht.

    Gruß
    Andy

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    38
    Beiträge
    388
    hm, dann mach ich das ja wirklich falsch

    Aber meist hab ich ja nur definitionen wie uint8_t var;
    was kommt den in den Header ausser der Funktionsprototypen?

    z.B. volatile deklarationen?

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2009
    Beiträge
    26
    Wie du schon selbst geschrieben hast "...deklarationen"

    In einem Header File sollten immer nur Deklarationen stehen. Dabei ist es egal, ob es sich um Funktions-, Klassen-, Struktur-, Typ-, oder Variablen-Deklarationen handelt.

    Aber auch Konstanten und Präprozesormakros kommen in ein h. File. Alles andere sollte in ein .c File.

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    38
    Beiträge
    388
    uiuiui, ich hab mir gerade ein paar meiner Uraltcodes angesehen.
    Dort hab ichs richtig gemacht. 4Jahre C abstinenz waren doch nicht so klug.

    Vielen dank für den Hinweis

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Ich stimme CodeBrowser zu, mit der Anmerkung, dass die Übergabe eines Pointers auf einem AVR länger dauert, also die Übergabe eines 8-Bit-Primitives (uint8_t, char, ...), denn die Pointer sind 16bit breit.

    @Hosti
    Außerden Funktionsprototypen kommt in den Header noch allerlei Definitionen:
    - defines
    - extern-variablen
    - einbindung anderer Header.

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2009
    Beiträge
    26
    Das mit dem AVR und 16-Bit Pointer wusste ich nicht, da ich bisher die AVR Controller nicht verwendet habe. Aber spätestens bei der Analyse des ASM Codes hätte man das gesehen

  8. #18
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    38
    Beiträge
    388
    Ich habe jetzt einmal einen Teil angepasst.
    Doch es kommt eine Fehlermeldung das die Konstante a zweimal definiert ist.

    funk.h
    Code:
    const unsigned short a = 1234;
    Im Sourcefile wird a einfach als Parameter übergeben.

    Ist die definition/deklaration im header falsch?

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2009
    Beiträge
    26
    Da sollte noch ein extern davor.
    Ich bin mir jetzt mit dem Syntax bei Konstanten nicht so sicher, aber ich glaube das müsste so ein:

    .h File
    extern const unsigned short a; // Deklaration

    und im C-File
    const unsigned short a = 1234; // Definition

  10. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    02.05.2004
    Alter
    38
    Beiträge
    388
    Das extern ist kein muss oder?, nur wen ich es in einer Funktion ohne Parameter übergabe verwenden will, oder hab ich das falsch verstanden?

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test