Forum: PC-Programmierung kann jemand mir diese C codestück überprüfen ?


von Ralph R. (batcheu)


Lesenswert?

Hallo,
kannst du bitte in meinem untenstehenden schauen , ob es so gut laufen 
wird ?
 Für Gegenvorschlag , oder korrektur werde ich mich freuen

eine ungefilterte temperatur bekomme ich von einem sensor ständig, und 
möchte es filtern

-->Eingangswert begrenzen
-->Temperatur mittelwert der erste sekunke möchte ich frieren
--> und dann alle 5 sekunden temperaturmittelwert berechnen und 
vergleichen mit anfangstemp(der ersten sekunde) wenn 1 ° höher und fzg 
geschw über 20 kmh will ich anfangstemp  um 1 grad erhöhen
wenn um mindestens 1° kleiner reduziere ich es um 1° sonst behalte ich 
die alte anfangstemp.

freue mich auf schnelle antwort.

Grüß





//sampling time 100 msec
// aussen_temp eingangssignal temperatur
u8 k = 0;
u8 l = 0;
si16 temp_start = 0;
si8 temp_old = 0;
si16 temp_middle = 0;
si16 temp_middle_5s = 0;
si8 temp_array1[10];  //  werte für das erste sekunde
si8 temp_array2[50];  // werte für 5 sekunden (50 * 100 msec loop)
u8 temp_cnt1 = 0;
u8 temp_cnt2 = 0;
bool_T counter_valid = TRUE;
si8  aussen_temp_filt = 0;



//sampling time 100 msec
{
// eingangsdaten begrenzen
   if(aussen_temp  < -10)
   {
     aussen_temp = -10;
   }
   if(aussen_temp > 40)
   {
     aussen_temp = 40;
   }
// Calculation of temperature middle value at start , just for the first 
second.
   if((temp_cnt1 < 11)&&(counter_valid))
   {
      for(k=1; k<11; k++)
      {
         temp_array1[k] = aussen_temp;
         temp_start = (temp_start + temp_array1[k])/k;
      }
      temp_cnt1++;
   }
   else
   {
      counter_valid = FALSE;
   }

// Calculation of temperature middle value for every five second 
(continuously)
   if( temp_cnt2 < 50)
   {
      for( l=0; l<50; l++)
      {
         temp_array2[l] = aussen_temp;
         temp_array2[l + 1] = temp_array2[l];

         temp_middle = temp_middle + temp_array2[l];
      }
      temp_cnt2++;
   }
   else
   {
      temp_middle_5s = temp_middle/50;
      temp_cnt2 = 0;
   }

//increasing - decreasing of the temperature ( filtered)
   if(temp_middle_5s >(temp_start + 1))
   {
      if(geschw_kmh > 20)
      {
        temp_start = temp_start + 1;
      }
   }
   else if (temp_middle_5s <(temp_start - 1))
   {
      temp_start = temp_start + 1;
   }
   else
   {
      temp_start = temp_start;
   }

 aussen_temp_filt = temp_start;
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ralph Ralph wrote:
> Hallo,
> kannst du bitte in meinem untenstehenden schauen , ob es so gut laufen
> wird ?

Es wird nicht gut laufen. Es wird überhaupt nicht laufen.

>  Für Gegenvorschlag , oder korrektur werde ich mich freuen

Die fehlenden Teile einfügen insbesondere den Funktionsnamen und die 
benutzten Variablen ohne Definition.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

> freue mich auf schnelle antwort.

Morgen Abgabetermin an der Uni?

Das Ding würde bei mir schon wegen Formalien durchfallen. Zu viele 
Magic-Numbers im eigentlichen Quelltext:
1
temp_cnt1 < 11)&&(counter_valid))
2
   {
3
      for(k=1; k<11;
etc.
Gemisch aus deutsch-englischen Variablennamen (Bsp.: temp_middle, aber 
aussen_temp oder geschw_kmh) und Kommentaren
1
// werte für 5 sekunden
2
/*** Calculation of temperature middle value

Wenn schon Kommentare in Deutsch, dann wenigstens in anständiger Groß- 
und Kleinschreibung ("Werte" und "Sekunden", nicht "werte" und 
"sekunden"). Insgesamt sieht der Quelltext so aus, als ob von irgendwo 
kopiert und dann "verbessert" wurde.

Wie gesagt, schon deshalb könntest du bei mir damit wieder gehen.

Dann kämen in der nächsten Runde die Programmierfehler. temp_array1 und 
temp_array2 laufen über. Damit Note 5.0, tschüss.

von Ralph R. (batcheu)


Lesenswert?

Danke für dein antwort Stefan

es geht eigentlich um die tatsächlichen kodierung
Funktionsname ist im moment nicht sehr wichtig

Kannst du bitte drin schauen mir bescheid sagen ?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ralph Ralph wrote:
> Danke für dein antwort Stefan
>
> es geht eigentlich um die tatsächlichen kodierung
> Funktionsname ist im moment nicht sehr wichtig
>
> Kannst du bitte drin schauen mir bescheid sagen ?

Worin?

Ich sehe keine verbesserte Version von dir.

Wichtig:
Auch die Fehler und Unschönheiten verbessern, die Hannes Jaeger gefunden 
hat!

von Ralph R. (batcheu)


Lesenswert?

Hallo , danke für gegenvorschläge

ich sehe diese Überlaufe nicht. kannst du mir sie
korrigieren ?

Danke im Voraus

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Ich kann sie korrigieren, werde das aber nicht. Das ist deine Arbeit die 
du vermutlich morgen abgeben musst, gell?

Ich weiß auch, das sich hier schon ein Trottel finden wird, der das 
mach. Doch ich mache es nicht.

Warum ich das nicht mache? Schon mal mit unfähigen Leuten arbeiten 
müssen? Es ist kein Spaß mit Leuten arbeiten zu müssen, die zwar auf dem 
Papier irgendwas können (z.B. C Programmieren) aber die ihren Schein nur 
deshalb bekommen haben, weil andere ihre Programme geschrieben haben. Da 
darf man  deren Arbeit zusätzlich machen und mit Überstunden deren 
Fehler ausbessern.

Unsere Branche ist voll von Leuten, die da nicht rein gehören (HTML 
"Programmierer"), aber alle Papiere haben, dass sie angeblich 
programmieren können. Irgendwann reicht es einem da.

von Ralph R. (batcheu)


Lesenswert?

Hallo,
ich sehe hier nicht wie ich meinem Dokument bearbeiten  kann.

wo ist es zu klicken ?

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Mach einen Anhang in deiner nächsten Nachricht s.o.

von Ralph R. (batcheu)


Lesenswert?

Hallo,

 kann ich es nicht zentral lösen ?
ich möchte es schon für alle diese überarbeitung machen...

versteh  mich  ich bin neu hier...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Geschrieben ist geschrieben.

Änderungen im Original würden eine darauf basierende Diskussion sinnlos 
machen.

Verbessere deine Fehler und stelle den verbesserten Code neu ins Forum. 
Und vielleicht bekommst du dazu weitere Hinweise. So machen es alle 
hier.

von Ralph R. (batcheu)


Angehängte Dateien:

Lesenswert?

Hallo,

danke für Antwort.
kannst du mir bitte erklären wieso laufen temp_array1 und temp_array2?

Ich bin am lernen und brauche hilfe!!!
 deswegen bin ich hier zum erstem mal heute.

Grüß

von Ralph R. (batcheu)


Angehängte Dateien:

Lesenswert?

Danke,

 es ist mir jetzt klar wie es hier läuft...

hier das Dokument

Danke nochmals

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Wenn du die Dateiendung .c abschneidest, kann der Compiler nichts damit 
anfangen. Also solltest du das hier auch nicht machen.

OK. Das ist also fast das Original. Fast, weil die Includedatei mit den 
Typedefs für u8, si8, bool_T und si16 noch fehlt.

> kannst du mir bitte erklären wieso laufen temp_array1 und temp_array2?

Wieviele Elemente haben temp_array1 und temp_array2 laut Definition und 
wie werden Elemente in Arrays in C indiziert?
1
si8 temp_array1[10];  //  data for the first second
2
si8 temp_array2[50];  //  data for 5 seconds (50 * 100 msec loop)

Und welche Elemente werden hier angesprochen, wenn k = 10 ist oder l = 
49 ist?
1
      for(k=1; k<11; k++)
2
      {
3
         temp_array1[k] = outer_temp;
4
                     ^
5
         temp_start = (temp_start + temp_array1[k])/k;
6
                                                ^
7
8
      for( l=0; l<50; l++)
9
      {
10
         temp_array2[l + 1] = temp_array2[l];
11
                     ^^^^^

von Ralph R. (batcheu)


Lesenswert?

Hallo

für includes ist alles klar, woanders behandelt...

temp_array1 soll 10 elemente haben ( 1 sekunde lang a 100msec. sampling)
temp_array2 soll 50 elemente haben ( 5 sekunde lang a 100msec. sampling)


hier wollte ich eigentlich Mittelwert berechnen und verhindern dass ich 
durch 0 dividiere(erste Durchlauf.....)
      for(k=1; k<11; k++)
      {
         temp_array1[k] = outer_temp;
                     ^
         temp_start = (temp_start + temp_array1[k])/k;
      }
ist das richtig?
      for(k=0; k<10; k++)
      {
         temp_array1[k] = outer_temp;
                     ^
         if(k!=0) temp_start = (temp_start + temp_array1[k])/k;
      }


                                                ^
ja, hier stimmt auch nicht...
      for( l=0; l<50; l++)
      {
         temp_array2[l + 1] = temp_array2[l];
      }

ist das richtig jetzt?
      for( l=0; l<49; l++)
      {
         temp_array2[l + 1] = temp_array2[l];
      }

Mfg.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ralph Ralph wrote:

> hier wollte ich eigentlich Mittelwert berechnen und verhindern dass ich
> durch 0 dividiere(erste Durchlauf.....)
> ...
> ist das richtig?
>       for(k=0; k<10; k++)
>       {
>          temp_array1[k] = outer_temp;
>                      ^
>          if(k!=0) temp_start = (temp_start + temp_array1[k])/k;
>       }

Formal ja, um die Division durch 0 zu umgehen.

Von der Rechenvorschrift aus nicht. Du beziehst ein Element 
(temp_array1[0]) nicht in die Mittelwertbildung ein. Du gewichtest also 
temp_start stärker und den aktuellen Messwert outer_temp schwächer als 
vorher.

Ich würde das so machen:
1
      for(k=0; k<10; k++)
2
      {
3
         temp_array1[k] = outer_temp;
4
         temp_start = (temp_start + temp_array1[k])/(k+1);
5
      }

> ist das richtig jetzt?
>       for( l=0; l<49; l++)
>       {
>          temp_array2[l + 1] = temp_array2[l];
>       }

Formal findet in diesen Zeilen kein Arrayüberlauf mehr statt. Für dein 
Programm fehlen ein paar Codezeilen.

Selbst mit den vorher vorhandenen Zeilen und Korrektur der 
Variablennamen, kann ich die Rechenvorschrift dahinter nicht sehen.

Wann wird temp_middle zurückgesetzt? Es kann ja nicht sinnvoll sein, 
dass temp_middle endlos aufaddiert wird.

Welchen Wert hat temp_middle_5s in den ersten 5s und ist das sinnvoll?

Ich vermute, dass du bei den Variablendefinitionen globale Variablen mit 
lokalen Variablen der Funktion temp_filter() gemischt hast.

von Ralph R. (batcheu)


Lesenswert?

Hi,
danke für den ersten Vorschlag
klar verstanden...

für das zweites teil will ich eigentlich alle 5 sekunden ein Wert 
berechnen und für die letzte phase in temp_middle_5s schreiben und durch 
50 dividieren.
meine interne Berechnung muss ich dann zurücksetzen, damit ich für die 
nächste 5 s eine neue mittelwert berechne... das zurücksetzen von 
temp_middle  hat gefehlt

wäre es so ok ?
   if( temp_cnt2 < 50)
   {
      for( l=0; l<50; l++)
      {
         temp_array2[l] = aussen_temp;
         temp_array2[l + 1] = temp_array2[l];

         temp_middle = temp_middle + temp_array2[l];
      }
      temp_cnt2++;
   }
   else
   {
      temp_middle_5s = temp_middle/50;
      temp_cnt2 = 0;
      temp_middle = 0;//neue zeile
   }

von Ralph R. (batcheu)


Lesenswert?

Hi Stefan,

ich habe noch einem besseren vorschlag
mit werte für temp_middle_5s bei t < 5s
und reset von temp_middle

bitte schau es mal und melde dich


   /*** Calculation of temperature middle value for every five 
second.***/
   if( A2OUT_temp_cnt2 < 50)
   {
      for( l=0; l<49; l++)
      {
         temp_array2[l] = A2OUT_aussen_temp;
         temp_array2[l + 1] = temp_array2[l];

         temp_middle = (temp_middle + temp_array2[l]);
      }
      if(erste_five_min)// value for the first 5 sec.
      {
         temp_middle_5s = temp_start;
      }
      A2OUT_temp_cnt2++;
   }
   else
   {
      temp_middle_5s = temp_middle/50;
      A2OUT_temp_cnt2 = 0;
      erste_five_min = FALSE;
      temp_middle = 0; // zurücksetzen nach 5 sec.
   }

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Erstmal Sorry!

Der Code mit temp_start ist nicht OK. Ich hatte mich nur an deiner 
Umgehung von Div/0 orientiert und was formal besseres formuliert. Er ist 
aber nicht richtig, um einen Mittelwert zu bilden.

Der neue Code gefällt mir nicht.

Ich befürchte, die Codebearbeitung artet in Fummelei aus, ohne dass die 
Aufgabenstellung durchdacht ist. Ein Anzeichen dafür ist immer, wenn 
mehr und mehr Spezialvariablen und if-Abfragen in den Code einfliessen.

Ich verstehe nicht, welchen Mittelwert du berechnen willst und warum du 
Arrays verwendest.

Angenommen du hast diese Temperaturen

10 11 12 10 11 15

und wenn man man grundsätzlich ein Arithmetisches Mittel 
(http://de.wikipedia.org/wiki/Mittelwert) nimmt, gibt es verschiedene 
Varianten:

Variante 1:
 - Initialisierung des alten Mittelwerts mit 0
 - Neuer Mittelwert = (Alter Mittelwert + Messwert)/2
(0+10/2)  (5+11)/2 (8+12)/2     (10+10)/2    (10+11)/2     (10,5+15)/2
M=5       8         10          10           10,5          12,75

Variante 2:
 - Initialisierung des alten Mittelwerts mit erstem Messwert
 - Neuer Mittelwert = (Alter Mittelwert + Messwert)/2
(10+10)/2 (10+11/2) (10,5+12)/2 (11,25+10)/2 (10,625+11)/2 
(10,8125+15)/2
M=10      10,5      11,25       10,625       10,8125       12,91

Variante 3:
 - Initialisierung des Mittelwerts unwichtig
 - Mittelwert = (Summe Messwerte)/(Anzahl Messwerte)
 - Beispiel
(10+11+12+10+11+15)/6
M=11,5

Variante 3 ist stur der Mittelwert aus den 6 Messungen. Die zeitliche 
Folge wird nicht berücksichtigt. Jede andere Reihenfolge mit den 
gleichen 6 Zahlen ergäbe den gleichen Mittelwert.

Variante 1 und 2 berücksichtigen die zeitliche Abfolge. Variante 1 
nähert sich allerdings ganz langsam und erst bei genug Messungen dem 
Mittelwert, weil die 0 aus der Initialisierung lange das Ergebnis 
beeinflusst.

Bsp. umgekehrte Messfolge bei Variante 2
15 11 10 12 11 10
(15+11/2) (13+10)/2 (11,5+12)/2 (11,75+11)/2 (11,375+10)/2
M=13      11,5      11,75       11,375       10,6875

Arrays können ins Spiel kommen, wenn du mehr als einen Messwert 
gleichzeitig in die Mittelwertberechnung einbeziehen willst 
(http://de.wikipedia.org/wiki/Gleitender_Mittelwert)

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.