Wieso erlaubt c89/99 keine | ^ & operatoren auf zeiger?
-
Oder auch einfach nur um zum Beispiel Basis-Adressen zu ermitteln.
-
Was spricht dagegen zu casten? (Wenn du eh schon so rumhackst...)
-
Famer schrieb:
Was spricht dagegen zu casten? (Wenn du eh schon so rumhackst...)
und auf was sollte man dann zeiger casten (ptrdiff_t evtl.?)? das eine sind "hacks" und das andere unsaubere programmierung.
-
ptrdiff_t wäre zumindest mein erster Einfall gewesen.
Und wie genau unterscheiden sich Hacks von unsauberer Programmierung?
-
Famer schrieb:
Was spricht dagegen zu casten? (Wenn du eh schon so rumhackst...)
Was hat das mit rumhacken zu tun? Du weißt das der Speicherbereich an einer bestimmten Adresse beginnt und willst jetzt beispielsweise ermitteln, zu welchem Segment die Adresse gehört. Oder willst eine andere Adresse des gleichen Segmentes ansprechen.
-
Sich selbst irgendwelche Speicheradressen aus dem selben Segment zu holen ist also kein Hack? Das ist wohl Ansichtssache
Für mich ist das auf jeden Fall ein wenig holprig.
-
Famer schrieb:
Sich selbst irgendwelche Speicheradressen aus dem selben Segment zu holen ist also kein Hack? Das ist wohl Ansichtssache
Wohl eher Anwendungssache. Wenn du eine API hast, die dir alle Funktionen zur Verfügung stellt, dann sollte man die auch nutzen. Oder besser gesagt, man muss diese nutzen, um nicht unerwünschte Nebeneffekte zu provozieren. Wenn es diese Zwischenschicht aber nicht gibt oder du selber die Zwischenschicht bist, musst du direkt auf den Ressourcen aufsetzen. Irgendwo musst du ja mal anfangen.
Famer schrieb:
Für mich ist das auf jeden Fall ein wenig holprig.
Wen man weiß was man macht ist daran gar nichts holprig. Ich finde es davon unabhängig aber auch holprig Funktionen zu rufen, deren Funktion man nicht kennt.
-
Da haste wohl Recht
-
Famer schrieb:
Und wie genau unterscheiden sich Hacks von unsauberer Programmierung?
hack:
int x = 0x11; int y = 0x22; x^=y; y^=x; x^=y; printf("%x\n",x); printf("%x\n",y);
unsauber:
void *x = (void*)0x11; void *y = (void*)0x22; long xx = (long)x; long yy = (long)y; xx ^= yy; yy ^= xx; xx ^= yy; x = (void*)xx; y = (void*)yy; printf("%p\n",x); printf("%p\n",y);
-
Dein erstes Beispiel als Hack zu bezeichnen, ich weiß nicht. Aber ich will mich ja nicht an Begrifflichkeiten aufhängen.
Für mich impliziert "Hack" irgendwie auch "unsauber", bis zu einem gewissen Maß. Andersrum gilt das natürlich nicht.
-
Ich würde sagen "unsauber" ist halt, nun ja, unsauber (wie soll man das beschreiben^^) und ein Hack ist unsauberer Code, der aber irgendwie genial ist. Also praktisch ein geniales Stück unsauberer Code.