Forum: Mikrocontroller und Digitale Elektronik Rechenproblem


von Harald U. (cm-rex)


Lesenswert?

Hallo Leute,

Ich steh leider mal wieder auf der Leitung.
Kann mir einer sagen was daran falsch ist ?
1
void calculate(char f, int *xgrad, int *ygrad, int *zgrad, int *bilder)
2
{
3
  xgrad=0;
4
  ygrad=0;
5
  zgrad=0;
6
  bilder=0;
7
  float atan_wert;
8
  if (f=="l")
9
    atan_wert=pgm_read_float(&laenge[sens]);/Sensorwert einlesen
10
  else
11
    atan_wert=pgm_read_float(&hoehe[sens]);//Sensorwert einlesen
12
  uint16_t sens_wert=pgm_read_word(&bnw_mm[objektiv]);/Objektivwert einlesen
13
  float winkel = (2*atan(sens_wert/(2*objektiv)))/(2*M_PI/360);  //Blickwinkel berechnen und von Rad auf Grad umrechnen
14
  float calc= 360/winkel+1;  //Bilderanzahl berechnen und um eins erhöhen 
15
    //--------
16
  if (calc-(int)(calc) >= 0.01)  //Bilderanzahl ab 0,01 Aufrunden sonst Abrunden
17
    calc=(int)(calc+1);
18
  else
19
    calc=(int)(calc);  
20
  float grad_ts= 400 / calc;  //Anzahl der Tatsächlich benötigten Bilder, Da eine Umdrehung 400 Schritte anstelle von 360 hat
21
  zgrad=(int)(grad_ts);
22
  if (grad_ts-(int)(grad_ts) >= 0.01)  // ab 0,1 Aufrunden sonst Abrunden
23
    bilder=(int)(grad_ts+1);
24
  else
25
    bilder=(int)(grad_ts);
26
  return;
27
}

Der Wert für zgrad und bilder passen von forn bis hinten nicht  :-(
Die Werte die er momentan einlesen sollte von den Arrays sind:
atan_wert=50
sens_wert=36


Wäre super wenn einer eine Idee hat :-)

von Hanswurst (Gast)


Lesenswert?

Unklar gestellte Frage. Bitte noch einmal formulieren. Zur Hilfe siehe 
Netiquette.

von g457 (Gast)


Lesenswert?

> Kann mir einer sagen was daran falsch ist ?

Syntaxfehler, z.B. in Zeile 9. Das hätte Dir aber auch der Compiler 
gesagt.

von Zustimmer (Gast)


Lesenswert?

Da stimme ich meinem Vorredner zu! Solche Anfragen sollten schon 
vernünftig gestellt werden.
-Ziel möglichst genau beschreiben(Soll)
-Ist Situation beschreiben(Code gepostet, na immerhin)
-Probleme/Abweichungen vom Soll möglichst genau beschreiben.

Wenn du dir die Mühe gemacht hast, mache ich mir die Mühe, dir zu 
erklären, in welchen Zeilen es hakt.

von Harald U. (cm-rex)


Lesenswert?

Also: Ich Schreibe mit dem Atmel Studio V7.0, und verwende den Combiler, 
der dabei ist. der Code sollte auf einem ATMEGA 32 laufen. Das 
Combilieren funktioniert. Beim Ausführen jedoch kommen offensichtlich 
falsche Werte raus. Ich habe aber keine Idee woran es liegen könnte. 
Vieleicht sieht ja einer mit einem geübten Auge etwas Problematisches an 
dem Cood.

von Hannes J. (pnuebergang)


Lesenswert?

Schon die ersten paar Zeilen, die Initialisierungen der Pointer mit 0, 
sind Bockmist. Entweder ist das nicht der Code den du wirklich 
verwendest, oder es fehlen Grundkenntnisse.

von resse kopi (Gast)


Lesenswert?

>Beim Ausführen jedoch kommen offensichtlich
>falsche Werte raus. Ich habe aber keine Idee woran es liegen könnte.

Du solltest Dich gründlich mit einem C-Buch beschäftigen, bevor Du hier
wieder aufschlägst.

von Harald U. (cm-rex)


Lesenswert?

Hi,

Erstens, fehlen sicher Grundkenntnisse, sonst würde ich nicht um Hilfe 
Bitten.
Zweitens, sind die anderen Rückgabewerte derweil noch nicht 
ausprogrammiert,


Aber danke für ein paar Nutzlose Zeilen

Wünsche allen noch ein schönes Leben

von Harald U. (cm-rex)


Lesenswert?

PS. Kann man hier nicht de eigenen Threat löschen ? egal....

von Hannes J. (pnuebergang)


Lesenswert?

Du lernst nur was wenn du selber in deinen Code rein siehst, nicht wenn 
du uns als Hilfskodierer rekrutierst, die dir den Karren aus dem Dreck 
ziehen.

Du hast schon einen klaren Hinweis bekommen wo du gucken musst. Dein 
Problem wenn du nicht gucken willst.

von Carl D. (jcw2)


Lesenswert?

Wenn die 4 übergeben Zeiger zuerst auf NULL gesetzt werden, dann sind 
sie unbrauchbar.

C-Tutorial/Buch lesen:

"Was macht ein '*' vor einer Variablen?"

Auf einem AVR zeigt (int*)0 übrigens auf R0:R1. Da gibt es kein 
C0000005-Fehler/SegmentViolantion, denn 0 ist eine gültige RAM-Adresse.
Nur was so ein Programm macht, das ist eher Zufall.

von Ralf G. (ralg)


Lesenswert?

Harald U. schrieb:
> Erstens, fehlen sicher Grundkenntnisse,

Hannes J. schrieb:
> Du hast schon einen klaren Hinweis bekommen wo du gucken musst.
Hannes J. schrieb:
> Schon die ersten paar Zeilen, die Initialisierungen der Pointer mit 0,
> sind Bockmist.

@Harald
Dann schau mal in dein C-Buch (Pointer-Kapitel). Was passiert hier?:
1
  xgrad=0;
2
  ygrad=0;
3
  zgrad=0;
4
  bilder=0;

Was passiert hier?:
1
if (grad_ts-(int)(grad_ts) >= 0.01)  // ab 0,1 Aufrunden sonst Abrunden
2
  bilder=(int)(grad_ts+1);
3
else
4
  bilder=(int)(grad_ts);

von Harald U. (cm-rex)


Lesenswert?

Erstmal danke für die Hinweise.

Nachdem ich mich wieder beruhigt habe, Ich habe keine Ahnung was der * 
davor bedeutet. Ich "programmiere" seit 4 Monaten C. Bei den 1330 
restlichen Zeilen meiner zwei Miniprogramme (wahrscheinlich für 99% von 
euch nur Lachhaft) habe ich das nicht gebraucht. Ein C Buch besitze ich 
nicht. Bis jetzt hab ich mir bis auf eine andere Frage hier im Forum 
alles selbst beigebracht und er recherchiert. Ich finde es schade wenn 
in Foren gleich solche Kommentare kommen, wobei auch sicher meiner Seits 
etwas überreagiert wurde. Ich bin auch keine 16 mehr.
Nach einer gewissen Zeit vorm Computer sieht man einfache Sachen, sofern 
man sie überhaupt kennt, nicht mehr.
Dennoch Danke fürs darauf schauen.

von Walter S. (avatar)


Lesenswert?

Paplick Fjuer schrieb im Beitrag #4634819:
> Bei Dir scheint's wohl eher an der weichen Birne zu liegen. Wenn ich
> irgendwas von Dir lese, dann ist immer die Schnauze weit auf.

Hannes hat als Erster den Hinweis auf das Nullsetzen der Zeiger 
geliefert,
das ist 100x nützlicher als dein Beitrag.
Warum gibst DU dem TO keine Hilfe?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Harald U. schrieb:
> Wäre super wenn einer eine Idee hat :-)
Du könnest selber die C-Tags um deinen Code machen, dann muss ich 
das nicht tun...

Über jeder Eingabebox steht das hier:
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
    ...
4
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
5
6
Formatierung (mehr Informationen...)
7
    [c]C-Code[/c]
8
    ...

von Wolfgang (Gast)


Lesenswert?

Harald U. schrieb:
> Kann mir einer sagen was daran falsch ist ?

Harald U. schrieb:
> Beim Ausführen jedoch kommen offensichtlich
> falsche Werte raus. Ich habe aber keine Idee woran es liegen könnte.

Der µC wird richtig rechnen - ist doch kein Pentium.
Vermutlich ist deine Erwartungshaltung an die Funktion des von dir in 
den Compiler gefütterten Codes und an das Ergebnis falsch.

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.