Forum: Mikrocontroller und Digitale Elektronik Hilfestellung zu C Funktion


von Neuling (Gast)


Lesenswert?

Hallo ich möchte mit ANSI C eine Funktion erstellen,
der ich einen INT Wert übergebe und die dann die Anzahl der BITS der
größten Gruppe nebeneinander stehender 1-Bits zurück gibt.

z.B. 111000111100

Ergebnis: 4

Wie kann man so etwas in C lösen?

von Tom (Gast)


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

von Neuling (Gast)


Lesenswert?

Danke für den Tipp.
Ich hab da Probleme jetzt das in C zu realisieren.

von Neuling (Gast)


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);
}

von Mischa W. (luchs2a)


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

von crazy horse (Gast)


Lesenswert?

mich würde interessieren, wofür man das gebrauchen kann?

von Mischa W. (luchs2a)


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

von Mischa W. (luchs2a)


Lesenswert?

besser wäre
     if(i=>iMax)
ansonsten würdest du bei gleicher größe das ganze ja wieder nullen
ps: schade das editieren hier nicht geht

von Ast (Gast)


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;
}

von Neuling (Gast)


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.

von Rahul D. (rahul)


Lesenswert?

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;

von Rahul D. (rahul)


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...

von Neuling (Gast)


Angehängte Dateien:

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.

von Peter Dannegger (Gast)


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

von Ast (Gast)


Lesenswert?

Du must am Ende noch einma imax mit i vergleichen, da du ansonsten am
Ende den größten wert in i hast, aber wenn dann keine Null mehr kommt,
dieser nicht mehr in imax geschrieben wird.

von Rahul D. (rahul)


Lesenswert?

Hast du denn meine Version mal ausprobiert?
Deine sieht ziemlich umständlich aus.
Jetzt habe ich meinen Code mal unter AVRStudio ausprobiert, aber
irgendwie stellt das nicht mal ne normale for-Schleife richtig dar.

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.