Forum: Compiler & IDEs AtMega8 C-Array-Problem


von Claus W. (Firma: keine) (klausi)


Lesenswert?

Hallo liebe User-Gemeinde

ich habe mit dem nachfolgenden Code:
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <stdlib.h>
4
#include <string.h>
5
#include "tastatur.h" // beinhaltet _delay_msXX
6
#include "lcd.h"
7
#define delay_us(us) _delay_loop_2(((F_CPU/4000)*us)(1000)
8
int j;
9
int main (void) {
10
int tab[] ={-12,15,-20};
11
int *ptab;
12
int i;
13
int buf[25];
14
DDRC |= (1<<PC0) | (1<<PC1); {
15
lcd_init(LCD_DISP_ON);
16
lcd_gotoxy(0,0);
17
lcd_puts("EING:-12,15,-20");
18
19
 for(;;)
20
   
21
 if (j >0){
22
23
  for(i=0;i<=2;i++){
24
  ptab =&tab[i];
25
   PORTC = PORTC | (1<<PC1);
26
    for(j=*(ptab);j>=0;j--) {
27
 {
28
   PORTC |= (1<<PC1);
29
    PORTC = PINC ^(1<<PC0);
30
     _delay_ms(1000);
31
 }
32
  itoa(j,buf,10);
33
  lcd_gotoxy(0,1);
34
  lcd_puts(buf);
35
   _delay_ms(1000);
36
   }
37
  }
38
 }
39
  else
40
41
   for(i=0;i<=2;i++){
42
    ptab =&tab[i];
43
     PORTC = PORTC & ~ (1<<PC1);
44
      for(j=*(ptab);j<=0;j++){
45
   {
46
     PORTC = PINC ^(1<<PC0);
47
    _delay_ms(1000);
48
   }
49
 itoa(j,buf,10);
50
 lcd_gotoxy(0,1);
51
 lcd_puts(buf);
52
 _delay_ms(1000);
53
 
54
        }
55
       }
56
   }
57
  }


es sollen die Zahlen im Array in der richtigen Reihenfolge ausgegeben 
werden. Zudem sollen je nach Vorzeichen eine Led leuchten +/- und eine 
andere Led bei jeder Dekrementierung toggeln.

Frage:
Warum gibt der µC die Zahlen -12;15;-20 nicht in der richtigen 
Reihenfolge aus?
je nach if-Abfrage gint er zuerst die positive Zahl und dann die zwei 
negativen Zahlen hintereinander auf dem Display aus.

Wo liegt der Denkfehler?? Ums gleich vorweg zunehmen ich besitze 2 
C-Bücher und hab den Fehler nicht gefunden!
Ich seh den Wald vor lauter Bäumen nicht mehr, bitte darum um eure 
Hilfe!!!

mfg

klausi

von ich (Gast)


Lesenswert?

"Warum gibt der µC die Zahlen -12;15;-20 nicht in der richtigen
Reihenfolge aus?"

Jo, was heißt richtig?
Code ist schlecht lesbar. Kommentare? Struktur? Lesbarkeit erhöhen?

von Karl H. (kbuchegg)


Lesenswert?

definiere 'richtige Reihenfolge'

Aber ich denke, ich hab rausgelesen, dass die richtige Reihenfolge ganz 
einfach die Abfolge im Array ist. Zuerst dachte ich nämlich do wolltes 
das irgendwie sortiert haben.

Zum Code:
jetzt lehnst du dich erst mal zurück und überarbeitest den Code
Einrückungen richtigstellen, ev. überlegen was in einer eigenen Funktion 
Sinn machen könnte, den Pointer rausschmeissen (den braucht in 
Wirklichkeit nämlich kein Mensch) und dann ...

darüber nachdenken, ob der Unterschied zwischen negativen und positiven 
Zahlen wirklich so gravierend ist, dass man da den kompletten Code mehr 
oder weniger duplizieren muss. Eine simple Beobachtung: Wenn eine Zahl 
negativ ist, dann kann man das mit einem if registrieren, die Zahl ganz 
einfach negieren und hat dann in weiterer Folge auf jeden Fall immer 
eine positive Zahl, die man behandeln kann.


   if( Zahl ist negativ )
     Led für Minus einschalten; Led für Plus aus
     Zahl = -Zahl
   else
     Led für Plus einschalten; Led für Minus aus

   for( k = 0; k < Zahl; ++i )
     generiere einen Puls

Und schon schrumpft dein Programm um mindestens 1/3 seiner Größe. Und 
kleinere Programme bedeuten auch, dass man nicht so leicht den Überblick 
verliert.


Und wenn du das hast, und dein Programm funktioniert, dann überlegst du 
dir mal, was du hier ...
1
lcd_puts("EING:-12,15,-20");
2
3
 for(;;)
4
   
5
 if (j >0){
eigentlich getestet hast und welchen Wert j an dieser Stelle überhaupt 
hatte

von Claus W. (Firma: keine) (klausi)


Lesenswert?

Danke für die schnellen Antworten!

Hab das Programm jetzt zum laufen bekommen!!

Hab
1
for(i=0;i<=2;i++){
2
  ptab =&tab[i];
zwischen
1
for(;;)
2
   
3
 if (j >0){
eingefügt und bei der if und else Funktion rausgenommen! Hatte auch noch 
eine geschweifte Klamme bei else vergessen! nachdem ich das geändert 
hatte lief das Programm wie gewollt!
Die "richtige Reihenfolge" ist die Reihenfolge im Array!

klausi

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.