2015-06-04 86 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; 
} 
相关问题