Verständnisprobleme bezüglich Pointer

Gast #4955070
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):
1
#include <stdio.h>
2
#include <stdlib.h>
3

4
int main()
5
{
6
    char   delimiter[] = ",";
7
    char  *ptr = NULL;
8
    char        *p_array = NULL;
9

10
    char msg[] = "hallo,wer,bist,du";
11
    p_array = &msg[0];
12

13
   ptr = strtok((char *)p_array, delimiter);         //Warnung
14
  while(ptr != NULL){
15
        printf("%s\n", ptr);
16
  ptr = strtok(NULL, delimiter);      //Warnung
17
  }
18
}
#4955084
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.
Persönliche Seite #4955085
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.
Gast #4955112
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
#4955126
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
int i = strtok(...)
würde fälschlicherweise keine Compilermeldung kommen, aber der code
wäre falsch.
#4955129
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
int x;
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.
Gast #4955224
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:
1
int   msg_receive;
2
  int  i = 0;
3
  int  var = 0;
4
  int   delimiter[] = ",";
5
  char  *ptr = NULL;
6
  char  msg[] = "1,10000";
7

8
  ptr = strtok(msg, delimiter);
9
  while(ptr != NULL){
10
    switch (i){
11
      case 0: if (((*ptr >= '1') &&  (*ptr <= '3')) || ((*ptr >= 'S') && (*ptr <= 'R'))){
12
            msg_receive = 1; break;
13
          }
14
          else{
15
            msg_receive = 0; break;
16
          }
17
      case 1: var = atoi(ptr);
18
          if (var > 0 && var <= 999){
19
            msg_receive = 1; break;
20
          }
21
          else{
22
            msg_receive = 0; break;
23
          }
24
      default: msg_receive = 0; break;
25
      }
26
    ptr = strtok(NULL, delimiter);
27
    i++;
28
    if (msg_receive != 1)
29
          break;
30
  }

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
Gast #4955242
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 ;(
Gast #4955246
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.
Gast #4955288
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)

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.