Probleme mit Array in C

Gast #1355790
Lesenswert?

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 #1355982
Lesenswert?

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
#1355995
Lesenswert?

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 #1355999
Lesenswert?

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.
#1356029
Lesenswert?

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.
#1356113
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren