Forum: Mikrocontroller und Digitale Elektronik Atmel Studio 7 bug?


von Attila C. (attila)


Lesenswert?

Vielleicht hab ich aber auch ein Brett vor dem Kopf.

Folgendes :
1
while (j<=50)
2
{
3
   i++;
4
   if (data[i]!=',')
5
   j++;
6
}

ergibt für i den Wert 62 was 12 Kommata im Array entsprechen.

Dies wiederum:
1
while (j<=12)
2
{
3
   i++;
4
   if (data[i]==',')
5
   j++;
6
}

ergibt für i den Wert 16346 und nicht wie zu erwarten wäre: 62

Woran könnte das liegen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Attila C. schrieb:
> ergibt für i den Wert 16346 und nicht wie zu erwarten wäre: 62
Welchen Wert haben j und i vor dem Start? Oder anders: das Problem liegt 
nicht in den geposteten Zeilen, wie sieht der gesamte Code aus?

BTW: bitte die [c] Tokens für Quellcode verwenden.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Attila C. schrieb:
> ergibt für i den Wert 16346 und nicht wie zu erwarten wäre: 62

 Wieso wäre da 62 zu erwarten ?


> Woran könnte das liegen?

 Am Brett ?

von Attila C. (attila)


Lesenswert?

Was sind [c] Tokens?

Der Code ist eine Funktion. i und j sind beim Aufruf dieser Funktion 0.

von Attila C. (attila)


Lesenswert?

@Marc: Wenn in einem Array nach 62 Zeichen 50 "Nicht-Kommata" übrig 
bleiben kann man davon ausgehen dass 12 von den 62 Zeichen ein Komma 
waren.

Wenn man innerhalb des gleichen Arrays nach 12 Kommata sucht ist zu 
erwarten das diese nach 62 Zeichen alle aufgefunden sein sollten.

Oder etwa nicht? Verwirrend!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Attila C. schrieb:
> Was sind...

1
[c]
2
 Dein gepostetes C-Code
 [/c]

von Toni Tester (Gast)


Lesenswert?

Attila C. schrieb:
> Was sind [c] Tokens?

C-Code in Forenbeiträgen bitte in solche Tags einschließen (siehe 
Abschnitt "Formatierung" in der Beschreibung über dem Textfeld).

> Der Code ist eine Funktion. i und j sind beim Aufruf dieser Funktion 0.
Und wie sieht data aus?

Attila C. schrieb:
> ergibt für i den Wert 16346 und nicht wie zu erwarten wäre: 62

Warum wäre das zu erwarten; wie sind die Variablen definiert (Datentyp), 
wie sind diese vorher belegt etc?

> Woran könnte das liegen?
Können wir so nicht beurteilen.

=> Bitte vollständigen Code posten (bzw. ein für sich compilierbares 
Minimalbeispiel, das das beschriebene Verhalten zeigt).

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Attila C. schrieb:
> @Marc: Wenn in einem Array nach 62 Zeichen 50 "Nicht-Kommata" übrig
> bleiben kann man davon ausgehen dass 12 von den 62 Zeichen ein Komma
> waren.

 LOL.
 Da wird nirgendwo auf die Arraygrenze geprüft - mit diesem Code
 kannst du genausogut nur 3 Komma im Array haben, aber dafür  4 Mal
 durch den ganzen Array (und den Rest der RAM, falls es sich um
 Integer handelt) durchpfeifen...

 Falls es aber uint8_t sind, wird dein Array solange von 0 bis 255
 abgefragt, bis 12 Komma zusammenkommen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Attila C. schrieb:
> Was sind [c] Tokens?
Das wird direkt über jeder Eingabebox beschreiben. Gleich nach
*Wichtige Regeln - erst lesen dann posten!*

Attila C. schrieb:
> Wenn man innerhalb des gleichen Arrays nach 12 Kommata sucht ist zu
> erwarten das diese nach 62 Zeichen alle aufgefunden sein sollten.
> Oder etwa nicht?
Was, wenn das unbekannte Array 1234567 Zeichen aufnehmen kann? Nur du 
kennst bisher dein Array? Wie soll dir da irgendwer sonst helfen 
könnnen? Du musst schon ausführliche und brauchbare Informationen 
beisteuern.

> Re: Atmel Studio 7 bug?
Die Antwort auf diese Frage lautet "Sicherlich einige. Aber nicht in 
diesem Fall".

von Immerdiesestudiobugs (Gast)


Lesenswert?

Lothar M. schrieb:
>> Re: Atmel Studio 7 bug?
> Was ziemlich sicher ist: die Antwort auf diese Frage lautet "Nein".

Richtig. Und wenn schon ein Bug, dann wäre es ein GCC (exemplarisch)
Bug, aber niemals ein Atmel Studio bug.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Attila C. schrieb:
> while (j<=12)
> {
>    i++;
>    if (data[i]==',')
>    j++;
> }
>
> ergibt für i den Wert 16346 und nicht wie zu erwarten wäre: 62

Ich sehe keine Endbedingung für i ... Angenommen, es wäre ein 
0-terminierter String in C würde das ewig weiter laufen ...

Mach mal eine Abbruchbedingung rein ála if (!data[i]) break;

von Attila C. (attila)


Lesenswert?

Es handelt sich um ein NMEA Protokoll. Wenn ich nicht auf Kommata prüfe 
und es so mache........
1
while (i<62)
2
{
3
  test[k]=data[i];
4
  i++;
5
  k++;
6
}

(So richtig mit den Tokens?)

.......dann sehe ich auf dem Display die korrekten Daten.

Ich verstehe nicht warum die Array-Größe oder Array-Grenze eine Rolle 
spielt. Die Prüfung auf nicht-Komma ist korrekt. Das Array enthält 
innerhalb der 62 Zeichen 12 Kommata und 50 nicht-Kommata. Warum ergibt 
dann die Prüfung auf 12 Kommata einen solch absurden Wert?

von Attila C. (attila)


Lesenswert?

Ach so: test[] ist für die Ausgabe auf dem Display.

von Attila C. (attila)


Lesenswert?

@Mampf: Wenn j größer 12 ist wird i nicht weiter hochgezählt. Reicht das 
nicht als Abbruchbedingung?

von Felix F. (wiesel8)


Lesenswert?

Attila C. schrieb:
> @Mampf: Wenn j größer 12 ist wird i nicht weiter hochgezählt. Reicht das
> nicht als Abbruchbedingung?
j wird aber erst größer 12, nachdem das 13te Komma gefunden wurde.

mfg

von Attila C. (attila)


Lesenswert?

@Felix: Hast recht!

von Immerdiesestudiobugs (Gast)


Lesenswert?

Also doch ein echter Atmel Studio 7 Bug.

Ich hab's ja gleich gewusst.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Felix F. schrieb:
> j wird aber erst größer 12, nachdem das 13te Komma gefunden wurde.

Jau genau ... :)

von Attila C. (attila)


Lesenswert?

So:Nach 3 Tagen funktioniert dieses völlig kranke Konstrukt:
1
void fetchGPS (char datensatz)
2
{
3
  int i=0,j=0,k=0;
4
  float wert=0;
5
  char test[100];
6
  
7
  while (j<=datensatz)
8
  {
9
    i++;
10
    if (gpsdata[i]==',')
11
    j++;
12
  
13
    if (j==datensatz)
14
    {
15
      i++;
16
      while(j==datensatz)
17
      {
18
        test[k]=gpsdata[i];
19
        k++;
20
        i++;
21
          if (gpsdata[i]==',')
22
          j++;
23
      }
24
    }
25
  }
26
string(test);
27
cursorhome();
28
}

Warum , z.B. in der letzten while Schleife ein "while (gpsdata[i]!=',') 
partout nicht funktionieren will erschleisst sich mir nicht. Nur der 
Umweg über j führt zum Ergebnis.

von DraconiX (Gast)


Lesenswert?

Nimm dir mal dein Debugger zur Hand und Steppe das mal durch ;-) Dann 
wirst du schon selbst auf deinen Fehler kommen.

von Attila C. (attila)


Lesenswert?

Debugger? Das habe ich noch nie gemacht.

von Stefan F. (Gast)


Lesenswert?

> Debugger? Das habe ich noch nie gemacht.

Dann wird es jetzt Zeit, das zu lernen. Kannst du auch mit dem Simulator 
machen, wenn du keine Debugger-Hardware hast.

Für genau solche Probleme ist ein Debugger und das Durch-Steppen ideal.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Attila C. schrieb:
> Warum , z.B. in der letzten while Schleife ein "while (gpsdata[i]!=',')
> partout nicht funktionieren will erschleisst sich mir nicht.

 Und mir erschliesst sich nicht warum du es nicht mit strtok() oder
 strtok_r() versuchst.

von Attila C. (attila)


Lesenswert?

ich wäre dann mal wieder mit meinem Latein am Ende:
1
float fetchGPS (char datensatz)
2
{
3
  int i=0,j=0,k=0;
4
  float wert=0.0;
5
  char nmea[20];
6
7
  while (j<=datensatz)
8
  {
9
    i++;
10
    if (gpsdata[i]==',')
11
    j++;
12
  
13
    if (j==datensatz)
14
    {
15
      i++;
16
      while(j==datensatz)
17
      {
18
        nmea[k]=gpsdata[i];
19
        k++;
20
        i++;
21
          if (gpsdata[i]==',')
22
          j++;
23
      }
24
    }
25
  }
26
  
27
  wert=atof(nmea);
28
  
29
      //string(nmea);
30
      //cursorhome();
31
      
32
  if (nmea=='A')
33
  wert=123.45;
34
  
35
  return wert;
36
}

Lasse ich mir den auskommentierten string anzeigen steht da ein "A". 
Lasse ich mir den return Wert anzeigen steht da 0.00. Numerische return 
Werte werden ansonsten korrekt angezeigt.

von Attila C. (attila)


Lesenswert?

AUA! Blöd!  if (nmea[0]=='A')

So funktioniert es!

Beitrag #4972670 wurde von einem Moderator gelöscht.
Beitrag #4972686 wurde von einem Moderator gelöscht.
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.