hi, aus meiner schatzkiste ...
wird bei mir verwendet in meiner eeprom wear-leaving lib um mit einer
function im eeprom uint32_t und float read/write zu realisieren!
braucht c99 support
one more, replacement of do{...}while(0), weil do/while hat ein PROBLEM
mit ablauf control statements im block, e.g. bei break und die version
hier nicht!
Gibt es eigentlich eine "offizielle" Möglichkeit, float ins EEPROM zu
bringen? Eine temporäre Kopie mit memcpy() in ein uint8_t Array? Oder
eeprom_write (void *value, size_t size)?
> one more, replacement of do{...}while(0), weil do/while hat ein PROBLEM> mit ablauf control statements im block, e.g. bei break
Naja, vielleicht sollte man seltsame Konstruktionen wie do{...}while(0)
garnicht erst verwenden, dann müsste man sie nicht durch noch schlechter
lesbare ersetzen?
Bauform B. schrieb:> Gibt es eigentlich eine "offizielle" Möglichkeit,
ja,
eeprom_read/write/update_byte/word/dword/float/block(...)
schau vielleicht auch mal in avr/eeprom.h nach!
ich benutzte dank dem macro nur die dword variante.
Bauform B. schrieb:> Naja, vielleicht sollte man seltsame Konstruktionen wie do{...}while(0)> garnicht erst verwenden
nix seltsam, block instruction macros sind sehr nützlich, aber sicher
nichts für macro hasser oder newbies.
mt
Jim M. schrieb:> Dirk K. schrieb:>> Warum benutzt man sowas?>> Als GOTO Ersatz:> do {>> if (a) { foo(); break; }> if (b) { bar(); break;}> baz();>> } while(0);
Ja, ok, aber warum tut man sich und anderen sowas an? Oder ist das der
erste Versuch für den Obfuscated C Code Contest? Wenn es als
schlechtes Beispiel dienen soll, sollte man das aber deutlicher dazu
schreiben.
Dirk K. schrieb:> Warum benutzt man sowas?
wenn du ein macro haben willst , das mehrere beliebige anweisungen
beinhaltet würde dieses unerwünschte seiteneffekte haben in if/else,
for/while ...
mit der "umrahmung" do/while(0) oder besser if(1)/else wird aus dieser
sequenz von anweisungen ein block, der diese seiteneffekte verhindert.
while/do hat aber e.g. das problem, wenn in dem block eine for schleife
mit einer break condition steht, dass dieses break zum do/while rahmen
zugeordnet wird und nicht wie beabsichtigt zur for schleife.
Jim M. schrieb:> Als GOTO Ersatz:
verstehe/kenne ich nicht?!
mt
Cyblord -. schrieb:> Solche Makro-Monster führen direkt in die Hölle.
weichei!
ich habe noch mehr zauberwaffen macros!
z.b. für non-blocking timed (periodic, x-times, single shot) instruction
blocks
die conv macros finde ich sehr schlau!
sind aber auch nicht von mir, bin da nur ein ideen-verwerter.
mt
DPA schrieb:> #define UNPACK(...) __VA_ARGS__
äh, hier fehlt doch was?
die concat und str macros sind basic, container_of sieht interessant
aus!
mein link oben führt zur p99 macro library, da gibt es irre macros. da
verstehe ich bis jetzt nur bahnhof. sogar rekursion, unroll functions
habe ich dort gesehen.
just hardcore and magic!
hier mal noch ein leckerli ... für arduino jünger und andere
//macros for a non blocking wait, periodic or x-times repeated
intruction block!
//needs millis() or micros() system function
//should be located inside a fast loop
//usage:
// PERIODIC(MSEC,T2B,500) {digitalWrite(LED_PIN,
digitalRead(LED_PIN)^1); //...} //blinky led
1
//options
2
#define USEC micros() //timer tick base
3
#define MSEC millis()
4
#define T2B uint16_t //timer data type
5
#define T4B uint32_t
6
7
//create an unique name from given parameter and line number
Apollo M. schrieb:> while/do hat aber e.g. das problem, wenn in dem block eine for schleife> mit einer break condition steht, dass dieses break zum do/while rahmen> zugeordnet wird und nicht wie beabsichtigt zur for schleife.
Äh, nein, umgedreht. Das break bezieht sich auf die innerste Schleife,
also hier wie beabsichtigt auf die for-Schleife.
Das Problem ist vielmehr, daß man im Block kein break verwenden kann,
das sich auf ein Konstrukt außerhalb des Makros bezieht, eben weil es
auf die while-Schleife bezogen wird.
Andererseits sollte man das ohnehin nicht tun, weil das Macro dann
starke Annahmen über die Umgebung machen muß, in der es aufgerufen wird.
Apollo M. schrieb:> ich versteh das anders, lese mal hier ...
Da ist die for-Schleife aber nicht innerhalb des Macros, sondern ein
Konstrukt außerhalb.
Nop schrieb:> das Problem ist vielmehr, daß man im Block kein break verwenden kann,> das sich auf ein Konstrukt außerhalb des Makros bezieht, eben weil es> auf die while-Schleife bezogen wird.
danke, auch dieser hinweis passt!
ich habe jetzt jedenfalls do/while abgeschworen und nutze das if/else
macro.
bin vorher auch garnicht auf die idee gekommen das als macro zu
verpacken, sondern habe immer händisch do/while gecodet.
mt
hinweis, interessant ist, was in den timed_block macros in dem if
statement alles so abgeht ... via co-logic/short cut/circuit logic
1. periodic tmr abgelaufen?
2. repeat cnt abgelaufen?
3. repeat cnt dec, periodic tmr restart, if(true)