Hilfestellung zu C Funktion

Gast #232982
Lesenswert?

Hi Neuling

Die erste Frage beim Programmieren sollte zwar nach der Lösung gestellt
werden, jedoch noch keine Programmiersprache enthalten. Du must dir also
einen einfachen Alogrithmus überlegen, der in diesem Falle etwa so
aussehen könnte:

- Solange INT stellen hat
  - Ist Stelle X=1?
    - Ja: Zähler i erhöhen
    - Nein:
      - Ist der Zähler i grösser, als er schon mal war(iMax)?
        - Ja: iMax ist nun i
      - Zähler auf 0 zurücksetzen
  - Nächste Stelle X anschauen

Jetzt musst du das nur noch in C festhalten. Stichworte dafür sind
Bedingungen, Schleifen und Bitoperatoren.

HTH

Tom
Gast #232984
Lesenswert?

Ich habe mal die Funktion so programmiert:
DIe Funktion funktioniert noch nicht. Wo könnte da der Fehler sein?




void AnzBitgroup(int wert)
{
 int dez, i, iMax=0;
 int dual[8];
 dez = wert;
 for(i = 0; i < 8; i++)
 {
  dual[i] = 0;           /* Dualzahl löschen */
 }
 i = 0;

 if ((dez >= 0) && (dez <= 255))    /* Wert zulässig? */

    do
      {                               /* sukzessive Division */
       dual[i] = dez % 2;              /* aktuelle Dualstelle speichern
*/
       dez = dez/2;                    /* abdividieren */
       i++;
      }
   while(dez > 0);

  for(int m = 0; m < 8; m++)
  {
   if(dual[i]==1)
   {
    i++;
   }
   if(dual[i]==0)
   {
    if(i>iMax)
  {
   iMax = i;
  }
   }
   i=0;
  }
 printf("Ausgabe:%2d", iMax);
}
#232985
Lesenswert?

nabend

was nun kommt ist im fieberwahn geschrieben und wird nicht so
unwahrscheinlich hilfreich sein

1. du machst kein c sonden c++ da du in der for schleife  m erst
definierst
2. was passiert überhaupt, gibts compilermeldungen?
3. schonmal die stringverarbeitungsmöglichkeiten angeschaut ?
(zumindest in c++ gibt sachen wie Strgtoint();  oä.)
4. schon mal zwischenwerte nach jdem schritt betrachtet?

5. könnte es sein das ein klammer in der letzten for schleife fehlt
weil du dann ja jede runde dein i=0 setzt?

Mischa
#232987
Lesenswert?

so nun hab ich halbwegs gerafft was dein ziel is, 39° um die uhrzeit
sind echt nicht meine welt.
 du solltest in deiner letzten for schleife  nicht i als index nehmen
sonden m  und jedesmal i=0 zu setzten is auch nicht ideal

generell
if (dual[m])
   i++;
  else
  {
     if(i>iMax)
       iMax = i;
     else
       i=0;
   }
sollte es auch tun
aber ohne garantie

Mischa
Gast #232989
Lesenswert?

Wie wäre es so:

int max1Folge(int Zahl)
{
  int i, imax, j;
  i=0;
  imax=0;
  for(j=0;j<8;j++)
  {
    if((Zahl >> j) & 1)
      i++;
    else
    {
      if (imax < i)
        imax = i;
      i = 0;
    };
  };
  if (imax < i)
    imax = i;
  return imax;
}
Gast #232990
Lesenswert?

Die Funktion tut noch immer nicht was ich will.

for(int t = 0; t < 8; t++)
  {
   if(dual[m]==1)
   {
    m++;
   }
   else
   {
    if(iMax<m)
  {
   iMax = m;
  }
  m = 0;
   }
  }
 printf("Ausgabe:%2d", iMax);

Wenn ich als Dez. Zahl 123 vorgebe, dann kommt bei iMax 2 heraus.
Da müsste aber deann 4 erscheinen.
#232992
Lesenswert?

zweiter Versuch...

iMax = 0;
i = 0;
for(t=0;t<=15;t++
{
  if (wert & (1<<t))
  { // an der Stelle steht eine 1
   i++;
  }
  else
  {
   if (i>iMax) iMax = i;
   i = 0;
  }
}

Man vergleicht den Werte mit einer wandernden 1 ("1<<t") und zählt
für jede 1 i hoch. Steht an der Stelle eine 0, wird das Ergebnis des
Vergleichs falsch, und i wird mit iMax verglichen, ob i inzwischen
grösser als iMax ist.
Ausprobiert habe ich es nicht...
Gast #232993
Lesenswert?

Hi Rahul,

ich habe meinen C Code abgeändert. Funktioniert nicht zu 100%.
Wenn ich eine Dez Zahl vorgebe: 210

210 dez = 11010010 binär

Dann bringt mir die Funktion "1" heraus und nicht "2".
Es passiert nur dann, wenn ganz links eine 1 steht.
Angehängte Dateien:
Gast #232994
Lesenswert?

Vermutlich geht es darum, in einem seriell abgetasteten Signal die
Impulslänge zu bestimmen (IR-Code ?).

Da ist es doch am einfachsten, gleich beim Samplen mit zu zählen:

if( bit == 1 )
  count++;
else
  count = 0;


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren