Forum: PC-Programmierung while Schleife in C


von Buns T. (buns)


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)
1
int32 *zeiger;
2
...
3
int32 y;
4
int16 *x;
5
x= (int16*)&y;
6
while((x[0] != 0x002e) && (x[1] != 0x002e))
7
{
8
   zeiger ++;
9
  //
10
   y = *zeiger;
11
   //obwohl mein programm immer noch laeuft
12
  //aber an dieser Stelle habe ich nur manchmal eine warnung bekommen
13
}
es wäre sehr nett wenn ihr meinen Fehler zeigen könnt

von Rolf Magnus (Gast)


Lesenswert?

> //aber an dieser Stelle habe ich nur manchmal eine warnung bekommen

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

von Stefan B. (stefan) Benutzerseite


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.

von Buns T. (buns)


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?

von Buns T. (buns)


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

von Stefan B. (stefan) Benutzerseite


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?

von Karl H. (kbuchegg)


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.

von Buns T. (buns)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Buns T. (buns)


Lesenswert?

alles klar. Ich habe das geschafft. Danke für euere Hilfe

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.