Hallo Leute,
ich hätte eine Frage bzw. ein Verständnis-Problem und zwar bekomme ich
immer diese Warnung: "assignment makes pointer from integer without a
cast".
Ich vermute, dass es ein sehr banaler Fehler ist aber irgendwie stehe
ich hier komplett auf der Leitung und hoffe, dass Ihr mir da weiter
helfen könnt.
Der Quellcode diesbezüglich ist hier angeführt (bitte nicht böse sein,
ist ein Probierbeispiel damit ich die Pointer sowie strtok Funktion
verstehe):
Welcher Compiler? VS, GCC und Clang schlucken das hier ohne Warnung.
Sehe jetzt auch kein grobes Problem. Der Cast bei "(char *)p_array" ist
natürlich unnötig, denn p_array ist ja schon ein char*.
string.h nicht inkludiert. Compiler kennt Prototyp der Funktion strtok
daher nicht und geht per default von Return-Typ int aus. Du weist diesen
int einem Pointer zu, daher die Warnung.
Das hat man davon wenn man den string.h Header einfach ergänzt...
Ansonsten nächste mal auch alle Warnungen durchlesen. Vor den genannten
Warnungen gibt GCC noch das hier aus:
strtok.c:14:9: warning: implicit declaration of function 'strtok'
[-Wimplicit-function-declaration]
Wie ich finde eins der schlimmsten Verbrechen von C sowas als gültigen
Code durchgehen zu lassen. Wenn ich mit C arbeite dann schalte ich
sofort die -Werror-implicit-function-declaration GCC Option ein um
solche Fehler wie oben gar nicht erst compilieren zu lassen.
In keiner der von Dir eingebundenen Headerdateien ist strtok
deklariert.
Damit geht der Compiler von einer Funktion mit dem Rückgabetyp "int" aus
- und die Zuweisung eines "int" an "char *" führt zur Warnung.
Du müsstet auch eine Warnung erhalten, daß strtok unbekannt ist.
Wenn Du <string.h> einbindest, wird sich das Verhalten ändern.
Ja funktioniert wirklich, wie konnte ich das nur vergessen. Vielen Dank
:) Hätte es eigentlich funktioniert, wenn ich einen integer-Pointer
genommen hätte bzw. auf so den Typecast vollzogen hätte:
1
ptr=(int*)ptr;
Ich will nicht nervig sein, nur damit ich es verstehe.
Lg
Johannes H. schrieb:> Hätte es eigentlich funktioniert, wenn ich einen integer-Pointer> genommen hätte
Hallo,
hast Du die Antworten von Stefan Ernst und Rufus Τ. Firefly
gelesen (und verstanden)?
Da Du
1
#include<string.h>
vergessen hast, geht der Compiler davon aus, dass
1
strtok
einen
1
int
zurück gibt. Nur bei
1
inti=strtok(...)
würde fälschlicherweise keine Compilermeldung kommen, aber der code
wäre falsch.
Johannes H. schrieb:> ptr = (int *) ptr;
Hä ???
Du hattest schlichtweg nirgendwo eine Definition von
strtok
Mit dem Einbinden von <string.h> wird auch "irgendwo" der entsprechende
Code hinzugelinkt (niemand kennt deine IDE oder dein Makefile).
Johannes H. schrieb:> Hätte es eigentlich funktioniert, wenn ich einen integer-Pointer> genommen hätte bzw. auf so den Typecast vollzogen hätte:
Nein die Warnung sagt etwas anderes. Die Warnung spricht davon das ein
Integer zu einem Pointer wird ohne Cast. Also etwa sowas:
1
intx;
2
char*c=x;
Dort würde die zweite Zeile die gleiche Warnung produzieren. Wenn man
die Warnung loswerden will muss man explizit zu einem Pointer casten
also hier jetzt:
1
char*c=(char*)x;
Integer zu missbrauchen um darin Pointer zu speichern ist aber
schlechter Stil und fehleranfällig, da die Größe von einem int nicht der
Größe eines Pointers entsprechen muss.
Hallo liebe Forenbesucher,
wie schon im Betreff angegeben, habe ich immense Schwierigkeiten mit der
strtoke Funktion und inzwischen so verzweifelt, dass ich ich euch um Rat
bitten muss.
Also meine Idee ist es, ein empfangenes Frame (z.B: 1,50000) auf seinen
Inhalt zu prüfen und aus dem Grund verwende ich strtok, um das Frame zu
zertrennen. Nur habe ich das Problem, dass ich beim zweiten Charakter
(in dem Fall "50000") irgendwas anderes erhalte. Beim ersten Charakter
läuft es solange gut, solange es nur ein Zeichen ist aber sobald ich
z.B: '10' empfange, kontrolliert er mir nur die '1' und nicht '10' als
ganzes.
Der Quellcode diesbezüglich ist unten angegeben:
Ich hoffe, der angeführte Quellcode ist verständlich. Also parallel zu
Framezerlegung, lasse ich innerhalb einer Switch case Anweisung die
Richtigkeit des Frames überprüfen. Im ersten Durchgang wird der erste
Charakter überprüft und im zweiten wird geschaut, ob das enthaltene
Charakter innerhalb des festgelegten Rahmens ist (hier zwischen 0-999).
Dazu verwende ich die Funktion atoi, um daraus eben einen Integer zu
machen.
Ich hoffe Ihr könnt mir hier weiterhelfen.
Lg
Johannes H. schrieb:> Klar, da gehört char delimiter, da ist mir anscheinend beim kopieren ein> fehler passiert. Aber leider löst das mein Problem noch immer nicht ;(
dann debugge doch einfach, dann sieht man doch wo er etwas anderes macht
als man erwartet.
Johannes H. schrieb:> Gedebuggt habe ich eh auch schon...beim zweiten teil also bei 500000> nimmt er mir nur die 5 statt die 500000
strtok nimmt überhaupt nichts, er liefert nur einen Pointer. Der hat
keine länge. Die frage ist wo strtok as 0 Byte einfügt. (ja strtok
ändert das Orginal)