2013-03-10 2 views
-1

В настоящее время моя программа должна взять список номеров, введенных пользователем в командной строке, а затем найти сумму этих номеров и распечатать ее. Мой код следующий, я знаю, чтобы сохранить один номер, введенный пользователем, но что, если я хочу список чисел, разделенных пробелом?Как сохранить список входов для многопоточного программирования

#include <pthread.h> 
#include <stdio.h> 
int sum; /* this data is shared by the thread(s) */ 
void *runner(char **); /* threads call this function */ 
int main(int argc, char *argv[]) 
{ 
pthread_t tid; /* the thread identifier */ 
pthread_t tid2; 

pthread_attr_t attr; /* set of thread attributes */ 

if (argc != 2) { 
fprintf(stderr,"usage: a.out <integer values>\n"); 
return -1; 
} 

pthread_attr_init(&attr); 

pthread_create(&tid,&attr,(void(*)(void *))(runner),(void *)(argv+1)); 

pthread_join(tid,NULL); 

printf("sum = %d\n",sum); 
} 
/* The thread will begin control in this function */ 
void *runner(char **param) 
{ 
int i; 
sum = 0; 
for (i = 1; i <= 5; i++) 
    sum = sum + atoi(param[i]); 

pthread_exit(0); 
} 

Я хочу, чтобы иметь возможность ввести список номеров в командной строке, и сохранить эти номера в списке, а затем найти сумму всех этих чисел.

, может кто-нибудь сказать мне, что является правильным способом для этого?

+0

вы не должны изменить содержание вопроса, как люди дают корректировку ... – didierc

ответ

1

Некоторые проблемы здесь:

if (argc != 2) 

Это означает, что вы ожидали целые значения, чтобы быть цитируется, т.е. a.out "1 2 3 4 5". Если вы так поступаете, цифры представляются в виде одной строки, то есть argv[1] := "1 2 3 4 5".

Легче проверить на argc < 2 и принять аргументы как a.out 1 2 3 4 5. Таким образом, каждый аргумент получает свою собственную строку, то есть argv[1] := "1", argv[2] := "2" и т. Д.

Вы можете, конечно, использовать цитируемый список вместо этого, но тогда у вас есть дополнительная логика для извлечения целых чисел из строки (например, с помощью strtok), тогда как обработка аргументов может сделайте это для вас.

Во-вторых, программа ожидает, по крайней мере, шесть целых здесь, а также пропускает первый один (вы хотите i идти от 0:

for (i = 1; i <= 5; i++) 
    sum = sum + atoi(param[i]); 

Что касается верхнего предела, то один из способов передать количество целые числа, вместе со своими струнами использовать:-структуру

struct arg_struct { 
    int argc; 
    char **argv; 
}; 

, а затем использовать такой-структуру при вызове pthread_create, т.е.

struct arg_struct args = { argc-1, argv+1 }; 
pthread_create(&tid,&attr,(void(*)(void *))(runner),(void *)(&args)); 

и изменить runner соответственно:

void *runner(struct arg_struct *param) 
{ 
int i; 
sum = 0; 
for (i = 0; i < param->argc; i++) 
    sum = sum + atoi(param->argv[i]); 

pthread_exit(0); 
} 

Вот код, со всеми изменениями:

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

struct arg_struct { 
    int argc; 
    char **argv; 
}; 

int sum; /* this data is shared by the thread(s) */ 
void *runner(struct arg_struct *); /* threads call this function */ 
int main(int argc, char *argv[]) 
{ 
pthread_t tid; /* the thread identifier */ 
pthread_t tid2; 

pthread_attr_t attr; /* set of thread attributes */ 

struct arg_struct args = { argc-1, argv+1 }; 

if (argc < 2) { 
fprintf(stderr,"usage: a.out <integer values>\n"); 
return -1; 
} 

pthread_attr_init(&attr); 

pthread_create(&tid,&attr,(void *(*)(void *))(runner),(void *)(&args)); 

pthread_join(tid,NULL); 

printf("sum = %d\n",sum); 
} 
/* The thread will begin control in this function */ 
void *runner(struct arg_struct *param) 
{ 
int i; 
sum = 0; 
for (i = 0; i < param->argc; i++) 
    sum = sum + atoi(param->argv[i]); 

pthread_exit(0); 
} 
+0

Прежде всего, большое спасибо за помощь и объяснение. Могу я задать еще один вопрос? Как получить доступ к списку номеров, введенных пользователем? Потому что я хочу сделать что-то еще с этим списком чисел. Я хочу создать еще один поток, чтобы найти минимальный номер этого списка. У меня есть algothrim, чтобы найти min, 'int smallest = INT_MAX; для (i = 0; i < param-> argc; i ++) { if (atoi (param-> argv [i]) <наименьший) { sum = atoi (param-> argv [i]); } 'Но, как вы видите, я пытаюсь просмотреть список и сравнить каждое введенное число и посмотреть, является ли оно наименьшим. – PhoonOne

1

Это озадачивает меня, что вы могли бы написать резьбовую программу, но не знал, что:

вы не можете бросить разобрать массив строки в массив междунар. вы должны делать листы разбора по одному во время цикла суммирования.

/* The thread will begin control in this function */ 
void *runner(char **param) 
{ 
int i; 

sum = 0; 
for (i = 1; i <= upper; i++) 
    sum = sum + atoi(param[i]); 
pthread_exit(0); 
} 

Вы также должны пройти argv+1 и не argv[1] к pthread_create в main:

// the runner function declaration 
void *runner(char **); 

// the thread creation 
pthread_create(&tid,&attr,(void *(*)(void *))(runner),(void *)(argv+1)); 
+0

спасибо, но я получил неверную ошибку инициализатора в 'char * list [] = (char **) param;' – PhoonOne

+0

, это старый C (я думаю). попробуйте мой обновленный ответ. – didierc

+0

У меня возникли конфликтующие типы для ошибки бегуна, бегун потока, который равен – PhoonOne

Смежные вопросы