下記の条件のプログラムを作成しております。
・スレッドはメッセージ表示、end入力、イベント送信の3つ
・入力したメッセージを3秒ごとに通常表示、逆から表示を交互にすること
・関数ポインタでメッセージ表示を交互に切り替えること
現在できない点は一つ
関数ポインタを使って切り替えて、メッセージを交互に表示させるということができません。
初心者ですが、何卒ご指摘助言よろしくお願いいたします。
コードを書き込ませていただきます。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
//宣言
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t flag = PTHREAD_COND_INITIALIZER;
//構造体の宣言
struct Data {
int timer;
char message[256];
// 関数ポインタ
void (*print)(const char *msg);
};
//そのまま表示
void normal_print(const char *msg)
{
puts(msg);
}
//逆から表示
void reverse_print(const char *msg)
{
//文字列長さ取得
int n = strlen(msg);
while (--n >= 0) putchar(msg[n]);
putchar('\n');
}
// 関数ポインタ配列
void (*func[])() = { normal_print, reverse_print };
//イベント処理スレッド
void *timer_thread(void *arg)
{
struct Data *pp = (struct Data *)arg;
int i;
//ポインタ演算子-> 左から右
while (pp->timer) {
// 3秒待ち
for (i = 0; i < 3; i++) {
// 1秒毎に終了チェック
sleep(1);
if (!pp->timer) break;
}
// イベント送信
pthread_cond_signal(&flag);
}
return NULL;
}
//表示スレッド
void *output_thread(void *arg)
{
struct Data *pp = (struct Data *)arg;
//printf("output_thread 開始");
do {
//メッセージ表示
int j=0;
if(j % 2 == 0){
printf( func[0]);
}
else{
printf( func[1]);
}
j++;
// イベント待ち
pthread_cond_wait(&flag, &lock);
return 0;
}
// 終了チェック
while (pp->timer);
return NULL;
}
int main(void)
{
struct Data data;
pthread_t th1, th2;
char buf[256], *p;
printf("メッセージは何にしますか?\n");
fgets(data.message, sizeof data.message, stdin);
if ((p = strchr(data.message, '\n'))) *p = 0;
printf("終了する場合はendを入力してください\n");
data.timer = 1;
//スレッド作成
pthread_create(&th1, NULL, timer_thread, &data);
pthread_create(&th2, NULL, output_thread, &data);
//終了処理
while (fgets(buf, sizeof buf, stdin) && strncmp(buf, "end", 3))
printf("終了する場合はendを入力してください\n");
data.timer = 0;
//スレッドの破棄
pthread_join(th1, NULL);
pthread_join(th2, NULL);
return 0;
}
関数ポインタ配列を使った切り替えを一行で作れるからそうしろと言われ、全くできず・・・
どうかよろしくお願いいたします。