Hallo,
nach Lesen des Threads Beitrag ""Zeiger" auf struct-Element"
stellt sich mir die Frage, ob der untenstehende Code empfehlenswert ist?
Speziell der Cast auf (TFilterStruct*).
Ein ähnlicher Code läuft auf einem 8Bit-µC, nur habe ich dort ein Array
aus TFilterStruct erstellt und rufe die einzelnen Arrayelemente über
einen Index (Enum) auf. Das funktioniert problemlos, nur ist es beim
Debuggen immer sehr umständlich, weil ich da nur Zahlen als Index sehe.
Dann muss ich erst immer nachzusehen, welcher "sprechende" Enum-Wert
denn der Zahl entspricht.
Ich habe den Code abgeändert und ein kleines C-Programm für den PC zur
besseren Evaluierung erstellt.
Ich verwende jetzt ein Struct bestehend aus Structs.
Ich möchte sowohl auf bestimmte Elemente zugreifen können (wie bei der
Dummy-Initialisierung) als iterieren (wie in der for-Schleife).
Weiterhin stellt sich mir die Frage: Könnte man die for-Schleife zwecks
Optimierung des Speicherverbrauchs (kleiner µC!) gleich den Pointer
initialisieren bzw. iterieren?
Man beachte übrigens auch die Dummy-Werte, von oben nach unten gelesen.
:-D
Grüße
Third Eye
Der Code ist nicht sicher. Es ist meiner Meinung nach nicht garantiert,
dass zwischen den TFilterStructs keine Füllbytes angelegt werden. (Und
damit springt der Ptr++ zu kurz).
Warum legst Du kein Array mit TFilterStructs an?
Direkt im Speicher herumzumachen und als Nebenwirkung die passenden
(oder wie hier dank Padding die nicht passenden) Daten zu erwischen ist
ein Wartungsalptraum. Bei Miniprogrammen wie hier geht das notfalls,
aber sobald es etwas komplexer wird, baut man sich Bugs ein.
Third E. schrieb:> Könnte man die for-Schleife zwecks> Optimierung des Speicherverbrauchs (kleiner µC!) gleich den Pointer> initialisieren bzw. iterieren?
Das sind Probleme, über die man am Ende nachdenkt, wenn das Projekt
fertig ist, aber 2 Byte Speicher fehlen und in der geplanten
Serienproduktion der nächstgrößere uC zu teuer wäre.
Tom schrieb:> for (enum eFilterName i = 0; i < NUM_O
Was ich damit sagen wollte:
Zumindest mit QT Creator wird beim Debuggen der Wert von i als
Bezeichnung des enums und als Zahl angezeigt, wenn man i als enum
deklariert. Andere IDEs habe ich nicht ausprobiert.
> Man beachte übrigens auch die Dummy-Werte, von oben nach unten gelesen.
Solche Initialisierungen funktionieren nur korrekt mit den Werten 0xDEAD
0xBEEF 0x1D107 0x7353.
A. H. schrieb:> Warum willst Du denn überhaupt unbedingt iterieren?
Der Einwurf ist berechtigt bei gerade mal vier Struct-Elementen. War
eher eine allgemeine Frage, denn es könnten ja auch sehr viel mehr
Elemente sein, auf die man iterierbar zugreifen möchte.
Zuerst gebe ich zu, ich habe dein Anliegen nicht ganz durchleuchtet,
noch alle obigen Beiträge gelesen.
Ich beschäftige mich gerade mit dem Gaphischen Framework "GrLib" von TI
für die TIVA-C Serie. Das arbeitet mit einer Architektur in C, die es
erlaubt binäre Bäume aus verschiedenen Struct-Typen aufzubauen, von
einem Parser durchitterrieren zu lassen und die in den Structs
befindlichen Daten von einem spezifischen C-File bearbeiten zu lassen.
Das ist von der Idee her ähnlich wie die Grafischen Sachen auch .NET
oder Qt. Also Buttons, Slider, Checkboxen etc. Das ganze dann mit
Touchdisplay.
Das ist echt interessant, wie das über defines von Parameterlisten im
Header und so einer Art sinngemäßen Basisklasse gelöst ist (nennt sich
"tWidget"). Die Idee ist, das in der Basisklasse u.a. Zeiger auf Parent,
Next und Child existieren, mit denen ein Parser durch einen Binären Baum
verschiedener Instanzen und Hierachien itterieren kann. Der Zeiger der
"Basisklasse" wird dann im C-File Code in einer standadisierten Funktion
deren Signatur in allen Files gleich ist auf den spezifischen Typ
umgecastet. Bei dem Funktionsaufruf wird auch ein Argument übergen, was
die Zielfunktion machen soll. Daüber lassen sich dann wiederum
spezifische Aktion im jeweiligen C-File realisieren. Erinnert stark an
den OOP-Interface Gedanken.
Was ich damit beschrieben will ist, dass das die Möglichkeit bietet,
Daten und "Methoden" auch in C relativ nah an einander zu binden. UND du
kannst sogar Stucts verschiedener Typen wegen der "Basisklasse"
hintereinander packen. Also du musst nicht zwingend in Arrays von
Structs eines bestimmten Typs denken.
Das SW Package wo die GrLib drin ist wäre z.B. TivaWare - wenn du es dir
tatsächlich ansehen willst. Es gibt sie auch für andere Prozessorfamilen
von TI wie MSP und AM335 - was dich aber Zwecks Verstehen und Reverse
Engineering vom FW nicht interessieren braucht.
Dumdi D. schrieb:> Der Code ist nicht sicher. Es ist meiner Meinung nach nicht garantiert,> dass zwischen den TFilterStructs keine Füllbytes angelegt werden. (Und> damit springt der Ptr++ zu kurz
Wo sollen die unterschiedlichen Füllbytes denn herkommen? Wenn Ptr von
selben Typ ist wie die einzelnen Struct-Elemente dann gelten auch die
selben Alignment-Regeln.