AtMega8 C-Array-Problem

OP (Firma: keine) #1127344
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
Gast
"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?
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
OP (Firma: keine)
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.