2016-04-11 10 views
1

Ich versuche, Threads für Collatz Vermutung zu verwenden, die angibt, ob eine Zahl gerade ist, wird es durch 2 geteilt, aber wenn die Zahl ungerade ist, wird die Zahl mit 3 multipliziert und dann um eins addiert. Schließlich wird die Zahl gleich Null sein. Ich benutze Linux und VI und C. Mein Problem ist, bekomme ich einen undefinierten Verweis auf Läufer im Hauptfunktionsfehler. Mein Code:Undefinierter Verweis auf Läufer in PThreads

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

int num; 
void *runner(void *); 
struct pt{ 
long num[100]; 
int size; 
}shared; 

int main(int argc, char **argv) { 
pthread_t tid; 
pthread_attr_t attr; 

struct pt *shared_info = &shared; 

if(argc != 2) { 
fprintf(stderr, "usage: a.out <integer value>\n"); 
    return -1; 
} 
if(atoi(argv[1]) <= 0) { 
    fprintf(stderr, "%d must be > 0\n", atoi(argv[1])); 
    return -2; 
} 

shared_info -> size = atoi(argv[1]); 
pthread_attr_init(&attr); 
pthread_create(&tid, &attr, runner, (void *)shared_info); 
pthread_join (tid,NULL); 

int i; 
for(i = 0; i < (*shared_info).size - 1; i++) 
    printf("%ld,",(*shared_info).num[i]); 
printf("%d\n", (*shared_info).num[(*shared_info).size - 1]); 
return 0; 

void *runner(void *param) { 
    struct pt * shared_info = (struct pt*) param; 
    int x = shared_info -> size; 
    int i = 0; 

    while((shared_info -> num[i-1]) != 1) { 
     if(x % 2 ==0) { 
      x /= 2; 
     } 
     else { 
      x = x * 3 + 1; 

     } 
    } 
    shared_info -> size = i; 
    pthread_exit(0); 
} 
} 

Antwort

1

Sie haben missplaced ein „}“, Sie haben am Ende einer von denen zu bewegen, um nach „0 zurück;“

Und auch du bist Schleife wird unendlich sein, weil Sie es bis "1" gehen, wenn es bis "0" sein sollte.

+1

Sie haben Recht. Ich brauchte ein anderes Augenpaar. – Robert