Forum: Mikrocontroller und Digitale Elektronik Wert wird nicht im Array[i] gespeichert.


von Studi (Gast)


Lesenswert?

Hallo,

ich bin hier gerade am Verzweifeln, weil ich nicht weiß warum der Wert 
nicht im Array gespeichert wird.
Was mache ich denn falsch?
1
int   _array[98];
2
int   f = 300;
3
int   x = 100;
4
//...
5
6
void __init()
7
{
8
//...
9
berechne();
10
//...
11
}
12
13
void berechne_delays(){
14
   int i = 0;
15
   for(i=0;i<97;i++){
16
     _array[i] = ((((1/f)/4)/x)*(10^7))*8);
17
   }  
18
}

Wenn ich einen Breakpoint setze um zu schauen, welchen Wert der Array an 
der Stelle i hat, steht dort immer nur zB '_array[2] = 0x0000'... aber 
da kommt nicht '0' raus.

Wäre super, wenn mir jemand sagen könnte, was ich falsch mache.
Danke

von Studi (Gast)


Lesenswert?

also in __init() wird natürlich 'berechne_delays()' aufgerufen

von Floh (Gast)


Lesenswert?

Studi schrieb:
> _array[i] = ((((1/f)/4)/x)*(10^7))*8);

Die Berechnung ist für int total daneben.
Rechne mal alles mit ganzen Zahlen von Hand aus.
:-)

von Martin (Gast)


Lesenswert?

Wie es so aussieht, kommt immer 0 bei deiner Berechnung raus.

1 geteilt durch 300 ergibt 0, da nur int-Werte beteiligt sind.

von Studi (Gast)


Lesenswert?

1
#include <round.h>
2
3
int   _array[98];
4
int   f = 300;
5
int   x = 100;
6
//...
7
8
void __init()
9
{
10
//...
11
berechne();
12
//...
13
}
14
15
void berechne_delays(){
16
   int i = 0;
17
   for(i=0;i<97;i++){
18
     _array[i] = (fround((((1/f)/4)/x),0))*(10^7)*8;
19
   }  
20
}

Mit Runden kommt man da auch nicht weit. Also rechnet er von Anfang an 
mit int Zahlen, ich verstehe....

Wenn ich ' float _array[98]' schreibe, gibt er mir eine Fehlermeldung :(
Wie deklariert man denn einen 'Float-Array' ?

von apas (Gast)


Lesenswert?

_array[i] = ... (10^7) ...;

Meinst du wirklich 0b00001010 XOR 0b00000111 = 0b00001101?

von Studi (Gast)


Lesenswert?

Nein, sollte ich es auschreiben?
1
void berechne_delays(){
2
3
   int i = 0;
4
   float r = 0.000000000000;
5
6
   for(i=0;i<97;i++){
7
     r = ((((1/f)/4)/x))*8;
8
     _array[i] = fround(f,0);
9
   }
10
}

Jetzt sollte es doch eigentlich funktionieren,oder?
Das Ergebnis für r ist allerdings 0.0000000  :(

von Studi (Gast)


Lesenswert?

fround(r,0);

von Studi (Gast)


Lesenswert?

Habs rausgefunden, falls es mal irgendwann, irgendjemand braucht :)
1
r = ((((1.0000/f)/4)/x))*8*10000000;

von Norbert (Gast)


Lesenswert?

Nur mal so nebenbei...
Du hast die array Elemente [0] .. [97] zur Verfügung,
initialisierst aber nur [0] .. [96].

In der for Schleife entweder i<98 oder i<=97.

von Frank B. (foobar)


Lesenswert?

Studi schrieb:
>
1
> #include <round.h>
2
> 
3
> int   _array[98];
4
> int   f = 300;
5
> int   x = 100;
6
> //...
7
> 
8
> void __init()
9
> {
10
> //...
11
> berechne();
12
> //...
13
> }
14
> 
15
> void berechne_delays(){
16
>    int i = 0;
17
>    for(i=0;i<97;i++){
18
>      _array[i] = (fround((((1/f)/4)/x),0))*(10^7)*8;
19
>    }
20
> }
21
>
>
> Mit Runden kommt man da auch nicht weit. Also rechnet er von Anfang an
> mit int Zahlen, ich verstehe....
>
> Wenn ich ' float _array[98]' schreibe, gibt er mir eine Fehlermeldung :(
> Wie deklariert man denn einen 'Float-Array' ?

Wie lautet denn die Fehlermeldung? Normalerweise geht das schon, aber 
vielleicht unterstützt dein Compiler keine floats, was allerdings 
merkwürdig ist, da du in deiner letzten Lösung ja welche für die 
Berechnung verwendet hast. Vielleicht zuwenig Speicher, falls float 4 
Bytes braucht und int ggf. 2 Bytes groß ist?

1/f gibt für f>1 immer 0 als Ergebnis bei int-Variablen, da eine 
Ganzzahldivision durchgeführt wird. 10^7 ist in C was anders, als eine 
Potenz (xoder, wie schon geschrieben wurde), du müsstest du dann pow(10, 
7) nehmen, oder einfach 1e7 schreiben.

Es geht aber auch durch umstellen der Gleichung rein mit 
Ganzzahloperationen: 20000000/f/x = ((((1/f)/4)/x)*(10^7))*8).

von Lehrmann M. (ubimbo)


Lesenswert?

apas schrieb:
> _array[i] = ... (10^7) ...;

Das ist eine XOR Verknüpfung von 10 und 7! Wenn du 10 hoch 7 meinst 
heißt das

pow(10,7)

Zum Thema int vs. float:

C nimmt immer den höchstwertigen Typ also

int/int = int (Nachkomma abgeschnitten)
int/float = float
double/int = double
float/double = double

Stichwort typcast!

von Jörg G. (joergderxte)


Lesenswert?

>> _array[i] = ... (10^7) ...;
>
>Das ist eine XOR Verknüpfung von 10 und 7! Wenn du 10 hoch 7 meinst
>heißt das
>
>pow(10,7)

Wenn's 'ne Konstante ist, tut's auch: 10e7
(Das 'E' steht da für 'Exponent' - hat NICHTS mit der Euler-Zahl zu tun)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.