0

私は現在立ち往生している宿題の問題を抱えています。問題のパラメータは以下の通りです。1.) ユーザーから合計 5 つの整数を受け入れる必要があります。

2.) それぞれ異なる機能 (平均、最小、最大) を実行する 3 つのスレッドが必要です。

私が抱えている問題は、5 つの要素からなるグローバル配列の空の配列を宣言してから、これらの要素を変更することです。segfault が発生するたびに、自分のやり方が間違っていることがわかります。ちなみに、言語は C であり、C++ ではありません (使用は許可されていません)。誰かが私が何が間違っているのかを理解するのを手伝ってくれるなら、私はそれを大いに感謝します. また、それが重複している場合 (私が見たところ、これらの問題に対処するものは何もありませんでした)、対処されている質問または記事を教えてください ありがとうございます。

コード:

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

void *avgWorker(int in[]);
void *minWorker(int in[]);
void *maxWorker(int in[]);

int main(void)
{
  int it, *input;

  int in[5];

  pthread_t tid1,tid2,tid3;
  pthread_attr_t attr1, attr2,attr3;

  for (it = 0; it < 5; ++it)
    {
      printf("Please enter number %d of 5\n", (it + 1));

      input[it] = scanf("%d");
    }

  pthread_attr_init(&attr1);
  pthread_attr_init(&attr2);
  pthread_attr_init(&attr3);

  pthread_create(&tid1, &attr1, avgWorker(in), NULL);
  pthread_create(&tid2, &attr2, minWorker(in), NULL);
  pthread_create(&tid3, &attr3, maxWorker(in), NULL);

  pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);
  pthread_join(tid3,NULL);

  return 0;
}

void *avgWorker(int in[])
{
  int total, avg, it;

  total = 0;

  for (it = 0; it < 5; ++it)
    {
      total += in[it];
    }

  avg = 0;

  avg = total / 5;

  printf("\n The average value is: %d. \n", avg);
}

void *minWorker(int in[])
{
  int min, it;
  min = 99999;

  for (it = 0; it < 5; ++it)
    {
      if (in[it] < min)
    min = in[it];
    }

  printf("The minimum value is: %d\n", min);
}

void *maxWorker(int in[])
{
  int max, it;

  max = -99999;

  for (it = 0; it < 5; ++it)
    {
      if (in[it] > max)
    max = in[it];
    }

   printf("The maximum value is: %d \n", max);
}

最後に、gcc と -lpthread フラグを使用してこのコードをコンパイルしています。提供できる助けをありがとう。

4

2 に答える 2

5

これはクラッシュするはずの場所です:

input[it] = scanf("%d");

scanf読み取ったデータではなく、読み取ったフィールドの数を返します。データを格納する変数のアドレスは、パラメーターとして渡す必要があります。このような:

scanf("%d", &input[it]);

またinput、初期化されていないポインタです。どこも指していません(意味があります)。私はあなたが望んinでいたと思いますinputinput変数はまったく必要ありません。

于 2013-10-18T22:13:30.210 に答える