mikrocontroller.net

Forum: PC-Programmierung while Schleife in C


Autor: Buns Tsuko (buns)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr,

ich habe einen Datenfluss gelsen und eine neue Nachricht fängt immer mit 
0x002e an. Ich benutze eine 32bit Zeiger in meinem Programm.

Also damit ich den Anfang finden kann, benutze ich noch eine 
2.Zeiger(16bit)

int32 *zeiger;
...
int32 y;
int16 *x;
x= (int16*)&y;
while((x[0] != 0x002e) && (x[1] != 0x002e))
{
   zeiger ++;
  //
   y = *zeiger;
   //obwohl mein programm immer noch laeuft
  //aber an dieser Stelle habe ich nur manchmal eine warnung bekommen
}

es wäre sehr nett wenn ihr meinen Fehler zeigen könnt

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> //aber an dieser Stelle habe ich nur manchmal eine warnung bekommen

Wie "nur manchmal? Und WELCHE Warnung?
Was ist überhaupt deine Frage?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Buns Tsuko

Du hast keine Erkennung drin, ob du am Ende deines Datenstroms 
angekommen bist.

Wenn im Datenstrom kein 0x002e002e oder 0x002e**** oder 0x****002e 
vorkommt, erhöhst du zeiger bis zum Nimmerleinstag bzw. bis du einen 
Speicherzugriffsfehler zur Laufzeit bekommst.

Autor: Buns Tsuko (buns)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan "stefb" B. wrote:
> @ Buns Tsuko
>
> Du hast keine Erkennung drin, ob du am Ende deines Datenstroms
> angekommen bist.
>
Wie kann ich diese Erkennung festlegen?

Autor: Buns Tsuko (buns)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus wrote:
>> //aber an dieser Stelle habe ich nur manchmal eine warnung bekommen
>
> Wie "nur manchmal? Und WELCHE Warnung?

Segmentation fault

> Was ist überhaupt deine Frage?

meine Frage ist wie ich diese Warnung verhindern kann

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Segmentation fault
also
>> Speicherzugriffsfehler zur Laufzeit

Das ist keine Warnung, das ist der GAU.

Kann ich so nicht entscheiden, was du da machen kannst.

Was hast du denn an Informationen über den Datenstrom bzw. den Puffer 
auf dem oder in dem der zeiger arbeitet?

Weisst du was über die aktuelle oder maximale Grösse des Puffers?

Hast du ausser dem zeiger vielleicht auch die AnZahl der eingelesenen 
Elemente?

Oder gibt es eine absolute Endekennung im Datenstrom ähnlich zu dem 
0x002e?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Buns Tsuko wrote:
> Rolf Magnus wrote:
>>> //aber an dieser Stelle habe ich nur manchmal eine warnung bekommen
>>
>> Wie "nur manchmal? Und WELCHE Warnung?
>
> Segmentation fault

Das ist der Scherz des Jahrhunderts:
'Segmentation fault' als Warnung zu bezeichnen.

'Segmentation fault' oder was dem gleichkommt 'Access violation'
ist DER Supergau schlechthin. Es bedeutet, daß die Kacke
mächtig am dampfen ist.

> > Du hast keine Erkennung drin, ob du am Ende deines Datenstroms
> > angekommen bist.
> >
> Wie kann ich diese Erkennung festlegen?

Das kommt auf deinen Datenstrom an, bzw. den Teil den
du bis jetzt gelesen hast. Irgend etwas in diesem
Datenstrom, bzw. deinem Buffer, wird dir ja wohl sagen
wie gross der jetzt ist.

Autor: Buns Tsuko (buns)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich denn wissen, auf welche Stelle in Array meine Zeiger gerade 
zeigt?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Buns Tsuko wrote:
> wie kann ich denn wissen, auf welche Stelle in Array meine Zeiger gerade
> zeigt?

Indem du die Differenz zum Start des Arrays berechnest.

Meist macht man das aber anders rum:
Man arbeitet mit 2 Pointern.
Einer am Anfang des Arrays (das ist der der dann in der
Schleife ständig erhöht wird)
Einer am Ende des Arrays

Ist der laufende Pointer gleich dem Ende-Pointer, dann
hat man klarerweise das Array durch.

Anderer Ansatz:
Wir wissen ja, dass das Array zb. 10 Einträge lang ist.
In der Schleife braucht man daher nur mitzählen, wie oft
man erhöht hat. Ist die 10 erreicht, dann ist man mit dem
Array durch.

Möglichkeiten gibt es viele. Must halt ein bischen kreativ
sein.

Autor: Buns Tsuko (buns)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar. Ich habe das geschafft. Danke für euere Hilfe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.