- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: DDR und PORT in einem Struct

  1. #11
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Anzeige

    Powerstation Test
    Code:
    ...
    #define Led_2_An() SetBit(PORTA,PA1)
    ...
    Dazu ne Anmerkung bzw. meine Überlegungen. Einige meiner #defines habe ich ohne Klammern für die Parameterliste geschrieben, siehe oben - einfach um diese von Funktionsaufrufen deutlich zu unterscheiden. Sprich (siehe oben)
    #define Taste1_an .. IsBitClr (PrtTAST, Tst_1) ........ statt
    #define Taste1_an () IsBitClr (PrtTAST, Tst_1) ......,
    bzw. in Deinem Fall würde ich schreiben
    Led_2_An ...... statt
    Led_2_An () ...... .

    Für mich macht das Sinn wegen der besseren Lesbarkeit, da diese Schreibweise deutlich den Unterschied zum Funktionsaufruf mit leerer Parameterliste zeigt. Und der Compiler meckert es nicht an. Wie weit ein Profi das gut findet, weiß ich aber nicht.

    Vielleicht kannst Du später auch Deine struct-Geschichte nach Erprobung vorstellen?
    Ciao sagt der JoeamBerg

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    01.07.2013
    Beiträge
    12
    Hi oberallgeier,
    schau dir das mal an:
    Code:
    #define SetBit(ADDR,BIT) (ADDR |= (1<<BIT))
    
    #define WasBinIch_1 42
    #define WasBinIch_2 SetBit(PORTA,PA0)
    #define WasBinIch_3() SetBit(PORTA,PA1)
    
    
    void main()
    {
    	int x = WasBinIch_1;	// Hier ist klar, das du eine Variable/einen Wert verwendest
    	WasBinIch_3();		// Hier ist klar, dass was passiert (es sieht wie ein Funktionsaufruf aus)
    	
    	WasBinIch_2;	// Was ist das?
    			// Geh' mal von einem Programm aus wo du grade in Zeile 1580
    			// ließt und nicht das #define-Statement im Blick hast ... ;-)
    }
    In der stdio.h findest du unteranderem diese Zeile:
    "#define getchar() fgetc(stdin)", vermutlich aus den selben Gründen wie oben.

    [EDIT] Kleiner Nachtrag: IBM schreibt hierzu: "An empty formal parameter list is legal: such a macro can be used to simulate a function that takes no arguments." http://publib.boulder.ibm.com/infoce...rc09cpxmac.htm

    Wenn ich Zeit habe, bastel ich mal ein kleines Beispiel wie ich das mit den Structs meinte

    -Crazy
    Geändert von CrazyMetal (02.07.2013 um 14:50 Uhr)

  3. #13
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Auch wenn der Thread schon geschlossen ist.

    Nur mal so als Anregung zum struct. Wenn du das konsequent durchziehen möchtest, wäre es von der Lesbarkeit doch sicher noch besser, wenn du init oder zB Zustandsänderungen auch gleich als Funktionen im struct ablegst.
    Ein Aufruf led1.init oder led1.switch(1), led1.switch(0) sollte fürs OOP Verständnis nachvollziehbar sein. Vielleicht kapselst du die Variablen für Port Pin usw auch und baust ein create dazu. Bin mal auf dein Beispiel gespannt.

    sast (der findet, dass structs unterschätzt werden)

    雅思特史特芬
    开发及研究

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    01.07.2013
    Beiträge
    12
    Zitat Zitat von sast Beitrag anzeigen
    Nur mal so als Anregung zum struct. Wenn du das konsequent durchziehen möchtest,
    wäre es von der Lesbarkeit doch sicher noch besser, wenn du init oder zB
    Zustandsänderungen auch gleich als Funktionen im struct ablegst.
    Jepp, genau das hatte ich geplan. Der Code ist plakativ, damit Funktionspointer nicht unnötig das Beispiel aufblähen.

    Zitat Zitat von sast Beitrag anzeigen
    sast (der findet, dass structs unterschätzt werden)
    Könnte man hier voten: +1

  5. #15
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von sast Beitrag anzeigen
    Nur mal so als Anregung zum struct. Wenn du das konsequent durchziehen möchtest, wäre es von der Lesbarkeit doch sicher noch besser, wenn du init oder zB Zustandsänderungen auch gleich als Funktionen im struct ablegst.
    Ein Aufruf led1.init oder led1.switch(1), led1.switch(0) sollte fürs OOP Verständnis nachvollziehbar sein. Vielleicht kapselst du die Variablen für Port Pin usw auch und baust ein create dazu.
    Ich finde es einigermaßen sinnfrei, OOP in C "nachzumachen", wenn man statt dessen auch gleich eine richtige OO-Sprache verwenden könnte, z.B. C++.
    MfG
    Stefan

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    01.07.2013
    Beiträge
    12
    Hallo Stefan,
    Zitat Zitat von sternst Beitrag anzeigen
    Ich finde es einigermaßen sinnfrei, OOP in C "nachzumachen", wenn man statt dessen auch gleich eine richtige OO-Sprache verwenden könnte, z.B. C++.
    es geht nicht um die Nachbildung einer OOP-Funktionalität. Sast schrieb was von
    Zitat Zitat von sast Beitrag anzeigen
    (...) sollte fürs OOP Verständnis nachvollziehbar sein.
    und eine OOP-Denke kann hierbei vom Vorteil sein, muss aber nicht.

    Ich sehe den Vorteil von Funktionspointern in der Flexibilität die ich dadurch bekomme, es geht mir nicht um Pseudo-OOP. Vielmehr kann ich so unterschiedliche Funktionen (respektive Verhalten) einem Struct zuordnen (z.B. wann was wie schalten soll..)

    Um bei dem LED-Beispiel zu bleiben: Eine LED soll schalten, wenn ein Signal an einem Pin anliegt, die andere soll bei dem Erreichen eines bestimmten ADC-Wert ausgehen. Dafür kann ich einen Funktionspointer mit einer "Aus/An"-Funktion und einen anderen mit "Bedingung erfüllt?"-Funktion verwenden, zudem könnte ich dem Controller über eine Serielle-Verbindung sagen "Wenn der Pin so ist, dann mach mit dem Pin mal das...".

  7. #17
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von CrazyMetal Beitrag anzeigen
    Ich sehe den Vorteil von Funktionspointern in der Flexibilität die ich dadurch bekomme, es geht mir nicht um Pseudo-OOP. Vielmehr kann ich so unterschiedliche Funktionen (respektive Verhalten) einem Struct zuordnen (z.B. wann was wie schalten soll..)
    Es mag dir nicht darum gehen, aber das ändert nichts daran, dass es nun mal Pseudo-OOP ist.

    Deine Struct mit den Funktionspointern darin ist nichts anderes als eine Klasse mit virtuellen Methoden. Dann erzeugst du für die LEDs einzelne Instanzen der Struct wobei die Funktionspointer auf unterschiedliche Funktionen zeigen. Das ist wiederum nichts anderes, als konkrete Klassen von der virtuellen Basisklasse abzuleiten, die die virtuellen Methoden unterschiedlich implementieren.

    Davon abgesehen geht das, was sast schrieb (und an den ging mein Kommentar schließlich) noch viel eindeutiger in Richtung OOP (Kapselung, Konstruktor, etc).

    Und meine Meinung dazu ist eben:
    Wenn man OOP machen will und eine OO-Sprache zur Verfügung steht, dann finde ich es nicht sinnvoll, sich dafür zu entscheiden, die OOP in der nicht-OO-Spache nachzubilden. Das ist ein bisschen so, als würde man einen Nagel mit der Wasserpumpenzange in die Wand schlagen (was auch irgendwie geht) weil man diese gerade in der Hand hatte, obwohl doch ein richtig schöner Hammer in Griffweite gelegen hat.
    MfG
    Stefan

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    01.07.2013
    Beiträge
    12
    Zitat Zitat von sternst Beitrag anzeigen
    Davon abgesehen geht das, was sast schrieb (und an den ging mein Kommentar schließlich)
    Hab nix gesagt


    Zitat Zitat von sternst Beitrag anzeigen
    als würde man einen Nagel mit der Wasserpumpenzange in die Wand schlagen (...) obwohl doch ein richtig schöner Hammer in Griffweite gelegen hat.
    Nun ja, aber damit kannst du ihn nicht gleich wieder raus ziehen.

    Viele Grüße,
    Crazy

  9. #19
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von CrazyMetal Beitrag anzeigen
    Nun ja, aber damit kannst du ihn nicht gleich wieder raus ziehen.
    Oh, hatte ich etwa vergessen zu erwähnen, dass das ein Hammer mit Klaue war?
    MfG
    Stefan

  10. #20
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Es ist natürlich richtig, dass man eine Programmiersprache nicht verbiegen muss, um eine andere nachzubilden. Aber es ist doch auch nicht falsch die Möglichkeiten einer Sprache zu nutzen. Und ein struct ist im Prinzip die Urform der Klasse. So sehe ich das jedenfalls. Zur OOP gehört noch ein bisschen mehr als nur alles in ein struct zu bündeln.

    Wenn schon ein Gleichnis herhalten muss, dann sind das wohl beides Hämmer. Der eine hat nur einen ergonomischen Griff und ist bunt und der andere ist einfach nur ein Hammer mit geradem Stiel. Und wenn man ihn nun auch etwas bunt macht, ist es trotzdem immer noch ein Hammer.

    Ich weise gern darauf hin, dass ein struct nicht nur eine Ansammlung von Variablen sein muss. Und ich werde mich auch weiterhin nicht dafür schähmen, dass ich das auch kund tue.
    Und die Wortwahl in Richtung Kapselung und Konstruktoren war durchaus absichtlich gewählt, um genau auf diese Ähnlichkeiten hinzudeuten.

    PS: Ich bin davon ausgegangen, dass der C++ Hammer eine Klaue hat.

    sast

    雅思特史特芬
    开发及研究

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Zeiger auf Struct in einer Struct
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 11.11.2009, 15:42
  2. Antworten: 8
    Letzter Beitrag: 30.06.2008, 21:54
  3. Fragen zum Wiki. Pin. Port und DDR
    Von Lordcyber im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 22.03.2008, 10:29
  4. RS232 Empfang UND Versand auf einem Port?
    Von RHS im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 22.01.2007, 19:02
  5. Bascom Port,Pin,DDR
    Von Baui im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 07.12.2004, 14:20

Berechtigungen

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

Solar Speicher und Akkus Tests