www.mikrocontroller.net

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


Autor: Studi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
int   _array[98];
int   f = 300;
int   x = 100;
//...

void __init()
{
//...
berechne();
//...
}

void berechne_delays(){
   int i = 0;
   for(i=0;i<97;i++){
     _array[i] = ((((1/f)/4)/x)*(10^7))*8);
   }  
}


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

Autor: Studi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also in __init() wird natürlich 'berechne_delays()' aufgerufen

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:-)

Autor: Martin (Gast)
Datum:

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

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

Autor: Studi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <round.h>

int   _array[98];
int   f = 300;
int   x = 100;
//...

void __init()
{
//...
berechne();
//...
}

void berechne_delays(){
   int i = 0;
   for(i=0;i<97;i++){
     _array[i] = (fround((((1/f)/4)/x),0))*(10^7)*8;
   }  
}

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' ?

Autor: apas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
_array[i] = ... (10^7) ...;

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

Autor: Studi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, sollte ich es auschreiben?
void berechne_delays(){

   int i = 0;
   float r = 0.000000000000;

   for(i=0;i<97;i++){
     r = ((((1/f)/4)/x))*8;
     _array[i] = fround(f,0);
   }
}

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

Autor: Studi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fround(r,0);

Autor: Studi (Gast)
Datum:

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

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Studi schrieb:
>
> #include <round.h>
> 
> int   _array[98];
> int   f = 300;
> int   x = 100;
> //...
> 
> void __init()
> {
> //...
> berechne();
> //...
> }
> 
> void berechne_delays(){
>    int i = 0;
>    for(i=0;i<97;i++){
>      _array[i] = (fround((((1/f)/4)/x),0))*(10^7)*8;
>    }
> }
> 
>
> 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).

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.