2015-06-04 17 views
0

編寫接收爲參數詞的程序。對於命令行中的每個單詞,它會創建一個線程來檢查單詞是否是迴文。如果單詞是迴文,它會增加一個全局變量(在線程中)。使用線程檢查命令行參數是否爲迴文詞

這就是我所做的: 它不起作用,因爲類型在函數迴文中不兼容。我能做什麼?我可以通過其他方式傳遞命令行參數嗎(不是使用myStruct)?

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

int var_global = 0; 
pthread_mutex_t mtx; 
typedef struct{ 
    char* word; 
}myStruct; 

int palindrome(myStruct aux){ 
    int k = strlen(aux); 
    int i; 
    for (i=0; i<k/2; i++) { 
     if(aux[i] != aux[k-i]) 
      return 0; 
    } 
    return 1; 
} 

void* f(void* w){ 
    myStruct aux; 
    aux=*(myStruct*)w; 

    if (palindrom(aux)==1){ 
     pthread_mutex_lock(&mtx); 
     var_global++; 
     pthread_mutex_unlock(&mtx); 
    } 
} 
int main(int argc, char *argv[]){ 
    int i; 
    pthread_t threads[argc]; 
    pthread_mutex_init(&mtx, NULL); 

    myStruct s[argc]; 
    for (i=1;i<argc;i++){ 
     s[i].word = argv[i]; 
     pthread_create(&threads[i], NULL, f, &s[i]); 
    } 

    for (i =1; i<argc; ++i) 
     pthread_join(threads[i], NULL); 

    printf("the global variable has the value: %d \n", var_global); 
    pthread_mutex_destroy(&mtx); 

    return 0; 
} 
+0

你有沒有爲你使用的字符串分配內存? ('s [i] .word = argv [i];')其中'char * word;'是struct myStruct的成員 – ryyker

回答

1

你是否從2個不同的程序中竊取代碼並試圖將它們粉碎到一起或什麼?

GCC說:

/usr/include/string.h:395:15:注:應爲 '爲const char *',但參數的類型爲 'MYSTRUCT'

雖然穿線代碼非常糟糕,編寫代碼的人可能會知道該做什麼。

但我今天心情好我,所以:

int var_global = 0; 

這已經是零。可怕的非描述性名稱。

pthread_mutex_t mtx; 
typedef struct{ 
    char* word; 
}myStruct; 

可怕的間距。

int palindrome(myStruct aux){ 

爲什麼?如何傳遞字符串?

int k = strlen(aux); 

顯然,strlen需要一個const char *,而不是'myStruct'。

int i; 
for (i=0; i<k/2; i++) { 

可怕的間距。最好是:「for(i = 0; i < k/2; i ++){」。

if(aux[i] != aux[k-i]) 

錯誤。讓我們考慮一下字符串「廢話」。 strlen是4,因此指的是索引爲4的元素給了我們終止'\ 0'。因此,您總是將第一個元素與終止'\ 0'進行比較。

 return 0; 
    } 
    return 1; 
} 

void* f(void* w){ 
    myStruct aux; 
    aux=*(myStruct*)w; 

爲什麼過度複製?如何回合myStruct * aux = w;

if (palindrome(aux)==1){ 

爲什麼顯式比較?只傳遞字符串。

 pthread_mutex_lock(&mtx); 
     var_global++; 
     pthread_mutex_unlock(&mtx); 
    } 
} 

缺少return語句。

int main(int argc, char *argv[]){ 
    int i; 
    pthread_t threads[argc]; 

不正確。讓我們考慮一個參數的調用。這給了argc 2,表格過大了。

 pthread_mutex_init(&mtx, NULL); 

    myStruct s[argc]; 

同樣在這裏。

 for (i=1;i<argc;i++){ 

可怕的間距,也與先前可怕的間距不一致。

ARGC應該遞減,並且這個循環應該從0

 s[i].word = argv[i]; 
     pthread_create(&threads[i], NULL, f, &s[i]); 

缺少錯誤檢查開始。

 } 

    for (i =1; i<argc; ++i) 
     pthread_join(threads[i], NULL); 

    printf("the global variable has the value: %d \n", var_global); 
    pthread_mutex_destroy(&mtx); 

    return 0; 
} 
相關問題