pow ersetzen
-
asc schrieb:
Niemals Makros als Funktionsersatz...
Wenn man etwas nicht einsetzen sollte, nur weil man damit Blödsinn machen kann, dürfte man gar nichts verwenden.
-
Fellhuhn schrieb:
Wenn man etwas nicht einsetzen sollte, nur weil man damit Blödsinn machen kann, dürfte man gar nichts verwenden.
Wenn ich aber die Wahl zwischen einer guten und einer schlechten Möglichkeit habe, ein Problem zu lösen, wieso sollte ich die schlechte bevorzugen? Rasierst Du Dich auch mit einer Axt, obwohl ein Rasierer vorhanden ist?

-
Weil es männlicher ist.

-
Fellhuhn schrieb:
asc schrieb:
Niemals Makros als Funktionsersatz...
Wenn man etwas nicht einsetzen sollte, nur weil man damit Blödsinn machen kann, dürfte man gar nichts verwenden.
Das hat nichts mit "Blödsinn machen" zu tun. Das ist einfach eine Frage der korrekten Funktion.
Makros sind eine stumpfe Textersetzung - ohne Rücksicht auf sprachliche Feinheiten wie Scope oder Parameter-Übergaben. Und dadurch mußt du sehr genau aufpassen, was du übergeben kannst.Um mal das Quadrieren als Beispiel zu nehmen - deinem
#define sqr(x) ((x)*(x))kannst du keine Ausdrücke mit Nebeneffekten übergeben und brauchbare Ergebniss erwarten - und ich kenne auch keine Makro-Alternative, um das hinzubekommen. Im Gegensatz dazu hattemplate<typename T> inline T sqr(T val) {return val*val;}die selbe Wirkung, aber keins der Probleme des Makros.
-
LordJaxom schrieb:
Reicht nicht schon das Standardbeispiel min/max zur Abschreckung?
Schlechtes Beispiel. min/max ist nun gerade einer der Fälle, wo ein Macro tatsächlich Vorteile hat. Siehe http://www.ddj.com/cpp/184403774
#include <windows.h> #include <algorithm>=>
#include <windows.h> #undef max #undef min #include <algorithm>Zugegeben, wenn man das nicht weiß, resultieren einige echt eklige Bugs.
-
hmm man soll
#define NOMINMAXnutzen, wobei dann wieder alle anderen Microsoft-Header streiken
Also ist nen bissel doof und am einfachsten wirklich durch #undef NACH allen Microsoft-Headern zu lösen ...
-
Ich kenne die Umgehungsmöglichkeit, wollte auch nur auf das Problem hinweisen. Und das Makro NOMINMAX gab es bestimmt nicht von Anfang an (
Bekämpfung der Symptome)
-
hmpf ich glaub ich hätte besser mal die aufgabenstellung mit gepostet:
Zahlenkonvertierung
Schreiben Sie ein C++-Programm, das positive, ganze Dezimalzahlen in die
entsprechenden Dualzahlen und Oktalzahlen umrechnet.
Hinweise, verbindlich:
- Die Umwandlung in Dualzahlen muss nach der Potenzenmethode, die
Umrechnung in Oktalzahlen nach der Restwertmethode erfolgen.
- Speichern Sie die Ergebnisse in Strings.
- Benutzen Sie einen String-Vektor, um die Ziffern des Oktalsystems zu speichern:
string oktalziffer[8]={"0","1","2","3","4","5","6","7"};
- Der Modulo-Operator % gibt den ganzzahligen Rest der Integer-Division zweier
Zahlen zurück:
11 % 4 = 3
- Die Integer-Division / schneidet die Nachkommastellen des Divisionsergebnisses
ab:
9 / 2 = 4
Testlauf (Eingaben unterstrichen):
Dezimalzahl = ? 255
Umrechnung einer ganzzahligen, positiven Dezimalzahl in
- eine Dualzahl nach der Potenzenmethode : Dualzahl = 11111111
- eine Oktalzahl nach der Restwertmethode: Oktalzahl = 377
Press any key to continue
-
Die Lösung wurde doch schon genannt (auch wenn sie in der anschließenden Diskussion über Makros vs. Inline-Funktionen untergegangen ist). Du brauchst dort nur Potenzen von 2 (
pow(2,i);und dazu reicht der Shift-Operator völlig aus:inline int exp2(int x) { return 1<<x; } ... int i,j;//Gleitkomma-Werte sind hierfür überflüssig ... for(i=0; i<=16; i++) { j = exp2(i);// j = pow(2,i); if(inp_du < j) break; } ...
-
ODer einfach auf die erste Seite auf meine Beiträge achten und mal die anderen gekonnt außer acht lassen ...
-
2^0 ist doch 1, jedenfalls als ich noch Mathe gelernt hab

inline int exp2(unsigned int x) { return (x==0)? (1): (1<<x); }edit: Das ist natürlich Unsinn

-
Badestrand schrieb:
2^0 ist doch 1, jedenfalls als ich noch Mathe gelernt hab

Ja - und 1<<0 ergibt rein zufällig auch 1, also erübrigt sich deine Fallunterscheidung

-
CStoll schrieb:
Badestrand schrieb:
2^0 ist doch 1, jedenfalls als ich noch Mathe gelernt hab

Ja - und 1<<0 ergibt rein zufällig auch 1, also erübrigt sich deine Fallunterscheidung

Ups

Ich hab irgendwie an.. irgendwas anderes gedacht
-
ok, danke ich habs jetzt verstanden und es funktioniert auch.
und viel spaß noch beim diskutieren