2014-01-24 6 views
20

Ich lerne Pthreads. Mein Code wird so ausgeführt, wie ich es möchte, ich kann ihn benutzen. Aber es warnt mich vor der Kompilierung.Warnung: zum/vom Zeiger von/zu Ganzzahl unterschiedlicher Größe zu werfen

ich kompilieren mit:

gcc test.c -o test -pthread 

mit GCC 4.8.1. Und ich bekomme die Warnung

test.c: In function ‘main’: 
test.c:39:46: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 
    pthread_create(&(tid[i]), &attr, runner, (void *) i); 
              ^
test.c: In function ‘runner’: 
test.c:54:22: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
    int threadnumber = (int) param; 
        ^

Dieser Fehler für den folgenden Code kommt:

#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 

#define MAX_THREADS 10 

int sum; /* this data is shared by the thread(s) */ 
void *runner(void * param); 

int main(int argc, char *argv[]) 
{ 
    int num_threads, i; 
    pthread_t tid[MAX_THREADS];  /* the thread identifiers */ 
    pthread_attr_t attr; /* set of thread attributes */ 

    if (argc != 2) { 
    fprintf(stderr, "usage: test <integer value>\n"); 
    exit(EXIT_FAILURE); 
    } 

    if (atoi(argv[1]) <= 0) { 
    fprintf(stderr,"%d must be > 0\n", atoi(argv[1])); 
    exit(EXIT_FAILURE); 
    } 

    if (atoi(argv[1]) > MAX_THREADS) { 
    fprintf(stderr,"%d must be <= %d\n", atoi(argv[1]), MAX_THREADS); 
    exit(EXIT_FAILURE); 
    } 

    num_threads = atoi(argv[1]); 
    printf("The number of threads is %d\n", num_threads); 

    /* get the default attributes */ 
    pthread_attr_init(&attr); 

    /* create the threads */ 
    for (i=0; i<num_threads; i++) { 
    pthread_create(&(tid[i]), &attr, runner, (void *) i); 
    printf("Creating thread number %d, tid=%lu \n", i, tid[i]); 
    } 

    /* now wait for the threads to exit */ 
    for (i=0; i<num_threads; i++) { 
    pthread_join(tid[i],NULL); 
    } 
    return 0; 
} 

/* The thread will begin control in this function */ 
void *runner(void * param) 
{ 
    int i; 
    int threadnumber = (int) param; 
    for (i=0; i<1000; i++) printf("Thread number=%d, i=%d\n", threadnumber, i); 
    pthread_exit(0); 
} 

Wie kann ich diese Warnung zu beheben?

Antwort

34

Eine schnelle könnte hacky fix nur long statt int zu werfen. Auf vielen Systemen sizeof(long) == sizeof(void *).

Eine bessere Idee könnte sein, intptr_t zu verwenden.

int threadnumber = (intptr_t) param; 

und

pthread_create(&(tid[i]), &attr, runner, (void *)(intptr_t)i); 
+0

oder auf 64-Bit-Maschinen/Compilern in 'long long' umgewandelt werden. – thejinx0r

+0

@ thejinx0r Sicher, aber es ist immer noch ein Hack in dem Sinne, dass man sich nicht auf 'sizeof (long long) == sizeof (void *)' verlassen kann. – tangrs

+0

oder werfen Sie es auf 'size_t', das für mich arbeitete. –

1
pthread_create(&(tid[i]), &attr, runner, (void *) i); 

Sie passieren die lokale Variablei als Argument für runner, sizeof(void*) == 8 und sizeof(int) == 4 (64 Bits).

Wenn Sie i übergeben möchten, sollten Sie es als Zeiger oder etwas wickeln:

void *runner(void * param) { 
    int id = *((int*)param); 
    delete param; 
} 

int tid = new int; *tid = i; 
pthread_create(&(tid[i]), &attr, runner, tid); 

Sie nur i wünschen können, und in diesem Fall sollte die folgende sicher sein (aber bei weitem nicht empfohlen) :

void *runner(void * param) { 
    int id = (int)param; 
} 

pthread_create(&(tid[i]), &attr, runner, (void*)(unsigned long long)(i)); 
0

Ich wurde auch die gleiche Warnung bekommen. Um meine Warnung zu lösen, habe ich int zu long konvertiert und dann ist diese Warnung einfach verschwunden. Und über die Warnung "caste to pointer from Integer anderer Größe" können Sie diese Warnung belassen, da ein Zeiger den Wert einer beliebigen Variablen enthalten kann, da der Zeiger in 64x 64 Bit und in 32x 32 Bit hat.

Verwandte Themen