Probleme mit Array in C

Gast #1355790
Hallöchen!
Und schon wieder hab ich ein Problem....
...was ziemlich unangenehm ist: Ich habe ein Array von unsigned char, in 
der Größenordnung array[16][8]. Wenn ich auf das array einfach zugreife
1
FoundROM[numDev][i] = ROM_NO[i];
, gibt es keine Auffälligkeit. Nutze ich das array aber in der 
for-Schleife
1
    numDev=0;
2
    for (i = 0; i<8; i++)
3
            FoundROM[numDev][i] = ROM_NO[i];
, so blinkt die LED an einem Timer-Ausgang des AN2131 viel zu schnell.
Fällt jemandem ein, an was das liegen könnte? Falls nicht, was für 
berüchtigte oder oft Vorkommende Probleme oder Fehler gibt es bei der 
Verwendung von (mehrdimensionalen) Arrays?

Viele Grüße,
elko
Gast
Also: Das ist ein Ausschnitt aus einer Funktion, die aus einem 
Temperatursensor die in dessen ROM abgespeicherte Seriennummer auslesen 
soll und danach vom Puffer ROM_NO in den Speicher FoundROM ablegen soll.
Die LED ist an einen Ausgang des µC (nicht an den Temperatursensor) 
angeschlossen und wird durch auslösen des Timerinterrupts im µC ein- 
bzw. ausgeschaltet, wodurch sich ein Blinken ergibt.

Hier die komplette Funktion:
1
//--------------------------------------------------------------------------
2
// Find all present devices.
3
// Return value  : number of present devices
4
//
5
unsigned char OWFindAll(){
6
  unsigned char numDev, rslt, i, j; 
7

8
  numDev=0;
9
  // reset search-state (no found roms)
10
  for (i = 0; i < NUM_OF_ROMCODES; i++)
11
    for (j = 0; j < 8; j++)
12
      FoundROM[i][j] = 0;
13
  
14
  // begin search
15
  rslt = OWFirst();
16
  if (!OWVerify()) rslt = OWVerify(); // Try to verify presence of ROM_NO; after 2 failed attempts resign
17

18
  while (rslt)
19
  {         
20
          numDev=0;
21
          for (i = 0; i<8; i++)  // Store found ROM-number of ROM_NO-buffer in FoundROM
22
      FoundROM[numDev][i] = ROM_NO[i];
23
    numDev++;
24
    rslt = OWNext();
25
    if (!OWVerify()) rslt = OWVerify();
26
  }
27
  return numDev;
28
}

Viele Grüße,
elko
Okay, dann hier auch noch die Interrupt-Fkt...
1
static void T0_isr (void) interrupt 1
2
{
3
  TL0 = 0xC0;    // L-Register laden insgesamt: 0xF831
4
  TH0 = 0xA0;    // H-Register laden
5
  if (LED_BLINK)
6
  {
7
    if (LED_COUNT-- == 0)  // Zähler zurücksetzen
8
    {  LED_COUNT = 50;    // Schleifenzähler neu setzen
9
      OUTA ^= 0x10;    // LED umschalten
10
    }
11
  }
12
}

Jetzt kann ich höchstens noch das gesamte Programm posten ;-) (dagegen 
hab ich nichts ;-))

EDIT:
Was ich vergessen habe zu erwähnen: Eben die Tatsache, dass die 
Interrupt-Fkt. eigentlich nichts mit der "FindAll()" funktion zu tun 
hat, macht das ganze so komisch...
Gast
Ist der Rest des Codes so geheim?
Die Einrückungen verwirren etwas.
Und zuletzt find ich es persönlicher entspannter wenn die geschweiften 
Klammern eingesetzt werden.

Reduzier deinen Code doch mal soweit bis das Problem noch auftritt und 
es ein Helfender bei sich compilieren kann.
In
1
 while (rslt)
2
  {         
3
      numDev=0;
4
      for (i = 0; i<8; i++)
5
          FoundROM[numDev][i] = ROM_NO[i];
6
      numDev++;
7
      rslt = OWNext();
8
      if (!OWVerify()) rslt = OWVerify();
9
  }
kann ja wohl nie was anderes als numdev=1 rauskommen, oder 0 wenn gleich 
abgewiesen.

Und wenn du das soweit repariert hast, dann fehlt der Test auf Überlauf 
von numDev.
Eine Möglichkeit für die LED-Sache wäre, dass LED_COUNT durch 
irgendeinen falschen Index überschrieben wird. Das ist aus dem hier 
gezeigten Code aber nicht ersichtlich.

Dazu ist es nützlich, im Mapfile nachzusehen, was um LED_COUNT herum an 
Daten im RAM liegt.
Hier eine Einschränkung meines Problems:
Variante 1:
1
while(1){
2
  numDev=0;
3
  rslt = OWFirst() & OWVerify();
4

5
  while (rslt)
6
  {
7
    numDev++;
8
      rslt = OWNext() & OWVerify();
9
  }   
10
  var0=numDev;
11

12
}

Variante 2:
1
while(1){      
2
  numDev=0;
3
  if(OWFirst()){
4
    rslt=OWVerify();
5
    while (rslt)
6
    {
7
      numDev++;
8
        OWNext();
9
      rslt = OWVerify();
10
    }   
11
  }
12

13
}

Zur Erläuterung: OWNext() und OWFirst() liefern bei Erfolg "1", 
ansonsten "0" zurück. OWVerify() überprüft den Erfolg von den beiden 
Funktionen und liefert bei Bestätigung des Erfolges "1", ansonsten "0" 
zurück.
Obwohl beide Codes meiner Meinung nach das gleiche bewirken müssten und 
keinen Einfluss auf das Blinken der LED haben dürften, fängt bei 
Variante 1 die LED wie verrückt an zu blinken (DAS ist seltsam). Ich 
hoffe, das beschreibt mein Problem ganz gut ;-)

VG,
Stefan

PS: Im Anhang ist das komplette Programm.

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.