mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfestellung zu C Funktion


Autor: Neuling (Gast)
Datum:

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

Autor: Tom (Gast)
Datum:

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

Autor: Neuling (Gast)
Datum:

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

Autor: Neuling (Gast)
Datum:

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

Autor: Mischa W. (luchs2a)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mich würde interessieren, wofür man das gebrauchen kann?

Autor: Mischa W. (luchs2a)
Datum:

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

Autor: Mischa W. (luchs2a)
Datum:

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

Autor: Ast (Gast)
Datum:

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

Autor: Neuling (Gast)
Datum:

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

Autor: Rahul Der trollige (rahul)
Datum:

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

Autor: Rahul Der trollige (rahul)
Datum:

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

Autor: Neuling (Gast)
Datum:
Angehängte Dateien:

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

Autor: Peter Dannegger (Gast)
Datum:

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

Autor: Ast (Gast)
Datum:

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

Autor: Rahul Der trollige (rahul)
Datum:

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

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.