Atmel Studio 7 bug?

OP #4971533
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?
OP #4971566
@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!
Gast #4971571
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).
(Firma: Vescomp) #4971577
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...
Moderator (Firma: Titel) Persönliche Seite #4971581
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".
Angehängte Dateien:
OP #4971605
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?
OP #4971804
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.
Gast #4971826
> 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.
OP #4972653
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.
Beitrag #4972670 wurde von einem Moderator gelöscht.
Beitrag #4972686 wurde von einem Moderator gelöscht.

Antwort schreiben

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