-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);
}

コマンドラインに数値のリストを入力し、それらの数値をリストに保存してから、それらすべての数値の合計を見つけられるようにしたいと考えています。

、誰かがこれを行う正しい方法を教えてもらえますか?

4

2 に答える 2

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引数処理でそれを行うことができるのに対し、文字列から整数を抽出するロジックを追加する必要があります (たとえば、 を使用)。

第二に、あなたのプログラムはここに少なくとも 6 つの整数を期待し、最初の整数もスキップします (あなたi0:

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

上限に関しては、整数の数とその文字列を一緒に伝える 1 つの方法は、構造体を使用することです。

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);
}
于 2013-03-11T00:50:43.957 に答える
1

スレッド化されたプログラムを作成できるのに、次のことを知らなかったことに困惑しています。

文字列の配列をパースして int の配列にキャストすることはできません。合計ループ中に、キャストを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);
}

inargv+1ではなくargv[1]、渡す必要もあります。pthread_createmain

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

// the thread creation
pthread_create(&tid,&attr,(void *(*)(void *))(runner),(void *)(argv+1));
于 2013-03-10T22:26:59.947 に答える