Hallo,
ich sitze bestimmt schon 60 Minuten an diesem Problem und bekomme es
nicht gelöst. Vielleicht kann mir einer von euch helfen. Dazu erst
einmal folgende Code-Zeilen:
Headerdatei:
1 | typedef struct {
|
2 | ...
|
3 | unsigned int step_delay;
|
4 | ...
|
5 | } speedRampData;
|
6 |
|
7 | #define T1_FREQ 250000
|
8 | #define SPR 200
|
9 | #define ALPHA (2*3.14159/SPR)
|
10 | #define T1_FREQ_148 (int)((T1_FREQ*0.676)/100)
|
11 | #define A_SQ (long)(ALPHA*2*10000000000)
|
C-Code Datei:
1 | speedRampData srd;
|
2 |
|
3 | char buffer[10];
|
4 |
|
5 | srd.step_delay = (T1_FREQ_148 * sqrt_Taylor(A_SQ / 100))/100;
|
6 |
|
7 | uart_puts("step_delay: ");
|
8 | itoa(srd.step_delay, buffer, 10);
|
9 | uart_puts(buffer);
|
sqrt_Taylor() ist eine Funktion mit folgendem Prototypen:
1 | unsigned long sqrt_Taylor(unsigned long x);
|
Diese gibt einfach die Wurzel der übergebenen Zahl zurück. In diesem
Beispiel gibt sie 2507 zurück. Das habe ich auch mit Abfragen überprüft.
Der Code ergibt so wenig Sinn, habe auch viel der Einfachheit halber mit
Zahlen ersetzt, damit er besser verständlich ist.
Problem ist, so wie der Code oben steht, sendet er folgende Zeichen ans
Terminal:
Er soll aber:
zurückgeben! Was auch passt, wenn es keinen Überlauf geben würde. Wieso
kommt es zu dem Überlauf? Wieso kann der Compiler eine negative Zahl in
einer als unsigned int deklarierten Variable abspeichern?
Ich komme da nicht drauf. Ich hoffe, mir kann jemand behilflich sein.
Vielen Dank im voraus