Forum: Compiler & IDEs Code funktioniert nur außerhalb einer Funktion richtig


von Alan (Gast)


Lesenswert?

Dieser Code
1
  _delay_ms(1);
2
  int i = 0;
3
  
4
  int bit;
5
  int byte = 0;
6
  int c = 1;
7
  while(i < 8) {
8
    bit = get_bit();
9
    _delay_ms(1);
10
    byte = byte + bit*c;
11
    i++;
12
    c *= 2;
13
  }
14
  
15
  uart_puts(intToString(byte, 4));
tut auch, was er soll.

Wenn ich aber dies
1
  _delay_ms(1);
2
  int i = 0;
3
  
4
  int bit;
5
  int byte = 0;
6
  int c = 1;
7
  while(i < 8) {
8
    bit = get_bit();
9
    _delay_ms(1);
10
    byte = byte + bit*c;
11
    i++;
12
  }
in eine Funktion packe und dies durch die uart_puts aufrufen lasse, 
kriege ich ein falsches Ergebnis.
PS: Der Code funktioniert auch nur mit den _delay_ms(1); aufrufen 
korrekt :(

von Sven P. (Gast)


Lesenswert?

Vielleicht, weil da "c *= 2" in der Schleife fehlt?

von Alan (Gast)


Lesenswert?

Nee, war nur nen Tippfehler.

Die Funktion sieht so aus:
1
int get_byte(void) {
2
  _delay_ms(1);
3
  int i = 0;
4
  
5
  int bit;
6
  int byte = 0;
7
  int c = 1;
8
  while(i < 8) {
9
    bit = get_bit();
10
    _delay_ms(1);
11
    byte = byte + bit*c;
12
    i++;
13
    c *= 2;
14
  }
15
  
16
17
  return byte;
18
}

von Alan (Gast)


Lesenswert?

Nun? Das Problem wurmt mich und ich finde nicht heraus woran es liegt 
... :(

von Stefan E. (sternst)


Lesenswert?

Dann musst du mal mit deutlich mehr Infos rüberkommen.
Wie äußert sich der Fehler überhaupt, also was erwartest du, und was 
bekommst du stattdessen?
Wie sieht die Funktion get_bit aus?
Wie sieht die Funktion aus, die get_byte aufruft?

> Nee, war nur nen Tippfehler.

Es ist eine schlechte Idee hier Code einzutippen. Poste immer 
Originalcode, also per Cut&Paste hier einfügen.

von Alan (Gast)


Lesenswert?

Alsoo die Funktion get_bit
1
int get_bit(void) {
2
  int bit;
3
  while(get_red_line() && get_white_line()) {
4
    asm volatile ("nop");
5
  }
6
  if(!(get_red_line() == 1)) {
7
    bit = 0;
8
    set_white_line();
9
    while(get_red_line() == 0) {
10
      asm volatile ("nop");
11
    }
12
    clear_white_line();
13
  }
14
  else {
15
    bit = 1;
16
    set_red_line();
17
    while(get_white_line() == 0) {
18
      asm volatile ("nop");
19
    }
20
    clear_red_line();
21
  }
22
  return bit;
23
}
Und so wird die Funktion aufgerufen:
[c]
int main(void) {
  init();
  uart_init();
  _delay_ms(1);
  int i = 0;

  int bit;
  int byte = 0;
  int c = 1;
  while(1) {
    i = 0;
    byte = 0;
    c = 1;
    while(i < 8) {
      bit = get_bit();
      _delay_ms(1);
      byte = byte + bit*c;
      i++;
      c *= 2;
    }

    uart_putc(get_byte());
  }

}
[c]

Das nicht funktionieren äußert sich so, dass schlicht ein falscher Wert 
kommt. Dass der Wert der normalerweise, also bei uart_putc(byte); kommt, 
richtig ist, kann ich versichern.

von Stefan E. (sternst)


Lesenswert?

Ist das, was du da einließt, ein konstanter Wert, oder irgendein 
Datenstrom?
Wenn es ein konstanter Wert ist, dann nenne mal den konkreten Wert von 
Ist und Soll. Wenn es ein Datenstrom ist, liegt das Problem darin, dass 
du das Byte einmal einließt, ohne es zu verwenden, und dann über 
get_byte nochmal. Du gibst also mit uart_putc immer nur jedes 2. Byte 
aus.

von Alan (Gast)


Lesenswert?

Ah Danke :) jetzt scheints zu gehen.

von Stefan E. (sternst)


Lesenswert?

Gut ;-)

Hier noch ein kleiner Extratipp:
1
unsigned char get_byte(void) {
2
  
3
  unsigned char i;
4
  unsigned char byte = 0;
5
6
  for (i=0;i<8;i++)
7
    byte = (byte>>1) + (get_bit() ? 0x80 : 0);
8
9
  return byte;
10
}

von Alan (Gast)


Lesenswert?

Kann mir mal jemand erklären, was das heißen soll? Mit Bitoperatoren in 
C stehe ich noch auf dem Kriegsfuß :S

von Dieter (Gast)


Lesenswert?

Naja, die Gundlagen musste dir schon selber mal anschauen. Wenn du dann 
noch konkrete Fragen hast können wir die gerne weiter helfen :)

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.