Code funktioniert nur außerhalb einer Funktion richtig

Gast #896722
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 :(
Gast
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
}
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.
Gast
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.
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.