初めて質問させていただきます

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
028el
記事: 17
登録日時: 9年前

初めて質問させていただきます

#1

投稿記事 by 028el » 9年前

プログラミングも初心者でこのような場所で質問させていただくのも初めてなので、質問がわかりにくいかもしれません。ですが藁にもすがる思いです。どなたかお知恵をお貸し下さい。
偽天候センサープログラムを作ってそのデータをメッセージキューで送受するというタスクに取り組んでいます。
送り側のプログラムはコマンドラインでオプションを指定して、道理をわきまえた範囲でランダムな値を発生させて、それを送信します。コマンドライン、ランダムな値の発生までは見よう見まねでなんとか作りましたが、発生させたランダムな数値をどのようにメッセージキューで送信したらよいのかわかりません。具体的に言うと、randtemp関数で発生させた値をどうしたらmsend関数に取り込めるのかわかりません。
少し長くなりますが、作ってみたコードは以下の通りです。

コード:

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

#define SIZE 30

int randtemp(void);
int randpres(void);
int randhum(void);
int chop(int*);
int msend(int *temp);

int main(int argc, char *argv[])
{

int opt;
while((opt=getopt(argc, argv, "TPH")) !=-1
{
 switch(opt)
{
case 'T':
randtemp();
break;

// P,Hは省略

int randtemp(void){
int i;
int aa[256];
srand((unsigned int ) time(NULL));
for(i=0; i<SIZE; i++)
{aa[i]= rand()%(313-233+1)+233);
msend(aa);
i++;
}

return 0;
}

int msend(int *temp)
{
struct msgbuf{
 long mtype;
 int data[256];
};
struct msgbuf message, *p;

int msqid;
key_t key;
p = &message;

p->mtype = getpid();
key = ftok("mrecv", 'a');
msqid = msgget(key, IPC_CREAT|0666);
msgsnd(msqid, p, sizeof(p->data),0);

if (msgctl(msqid, IPC_RMID, NULL)==-1){
perror("msgctl");
exit(1);
}
return 0;
}
 

box
記事: 2002
登録日時: 14年前

Re: 初めて質問させていただきます

#2

投稿記事 by box » 9年前

028el さんが書きました:ですが藁にもすがる思いです。
回答しようとする人たちは藁ですか(苦笑)。
とりあえず、そののんべんだらりとした字下げなしのコードは見づらくてたまりません。
それから、
028el さんが書きました:

コード:

while((opt=getopt(argc, argv, "TPH")) !=-1
コンパイルが通りません。さしあたっては、コンパイルが通るコードを載せていただけますでしょうか。
028el さんが書きました:

コード:

// P,Hは省略
それほど長くないのであれば、省略せずに全部見せていただけますでしょうか。
私が回答できるとは限りませんが…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

028el
記事: 17
登録日時: 9年前

Re: 初めて質問させていただきます

#3

投稿記事 by 028el » 9年前

boxさま
回答ありがとうございます。
コードは完成までには程遠い状態ですので、とりあえずはオプションT(温度)233K(-40)から313K(+40)(課題で定義されています)を完成させてから先に進もうと思っていますが、randtemp関数の値をmsend関数にうまく取り込むことができずにいます。

コード:

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <memory.h>

#define SIZE 15

int randtemp(void);
int randpres(void);
int randhum(void);
int chop(int *);
void msend(int *temp);

int aa[128];


int main(int argc, char *argv[])
{

int opt;

	
	while((opt=getopt(argc, argv, "TPH"))!=-1)
	{
		switch(opt)
		{
		case 'T':
			randtemp();
			break;
			
		case 'P':
			randpres();
			break;
			
		case 'H':
			randhum();
			break;
		}
	}
}

int randtemp(void)
{
int i;
int aa[128];
srand((unsigned int)time(NULL));
for(i=0;i<SIZE;i++){
//printf("%d\n", rand()%(313-233+1)+233);
aa[i] = (rand()%(313-233+1)+233);
//printf("%d\n", aa[i]);
msend(aa);
}

return 0;
}

int randpres(void)
{
int i;
srand((unsigned int)time(NULL));
for(i=0;i<SIZE;i++){
printf("%d\n", rand()%(140000-96000+1)+96000);}
return 0;
}

int randhum(void){
int i;
srand((unsigned int)time(NULL));
for(i=0;i<SIZE;i++){
printf("%d\n", rand()%(100-10+1)+10);}
return 0;
}


void msend(int *temp)
{
struct msgbuf{
long mtype;
int data[128];
};

struct msgbuf message, *p;

int msqid;
key_t key;
p = &message;

for(int i=0; i<SIZE; i++)
	{
		if(*temp != NULL)
		{
		p->data[i]= *temp;
		printf("%d\n", p->data[i]);
		i++;
		temp++;
		}
	}

chop(p->data);
p->mtype = getpid();
key = ftok("mrecv", 'a');
msqid = msgget(key, IPC_CREAT|0666);
msgsnd(msqid, p, sizeof(p->data),0);

msgctl(msqid, IPC_RMID, 0);

return ;
}

int chop(int *s){
	int c;
	int i;
	
	for(i=0; i<256; i++)
	{
		if(s[i]=='\0'&& i>0)
		{
			c = s[i-1];
			s[i-1]= '\0';
			return(c);
		}
	}
	return('\0');
}
 

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 初めて質問させていただきます

#4

投稿記事 by みけCAT » 9年前

028el さんが書きました:プログラミングも初心者でこのような場所で質問させていただくのも初めてなので、質問がわかりにくいかもしれません。
とりあえず、「初めて質問させていただきます」という件名は良くないですね。
件名は質問の内容を簡潔に表したものにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

028el
記事: 17
登録日時: 9年前

Re: 初めて質問させていただきます

#5

投稿記事 by 028el » 9年前

みけCATさま

ありがとうございます。
おっしゃる通りですね。

かずま

Re: 初めて質問させていただきます

#6

投稿記事 by かずま » 9年前

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <memory.h>

#define SIZE 15
#define MTYPE 12345

struct msgbuf {
    long mtype;
    int data[128];
};

int randtemp(void);
void sendeof(void);
void msend(int *temp);
void mrecv(void);

int main(int argc, char *argv[])
{
    int opt;

    while ((opt = getopt(argc, argv, "TPHRE")) != -1) {
        switch (opt) {
        case 'T': randtemp(); break; 
        case 'P': break;
        case 'H': break;
        case 'R': mrecv(); break;
        case 'E': sendeof(); break;
        }
    }
}

int randtemp(void)
{
    int i;
    int aa[128];
    srand((unsigned int) time(NULL));
    for (i = 0; i < SIZE; i++) {
        aa[i] = (rand() % (313 - 233 + 1) + 233);
    }
    aa[i] = 0;
    msend(aa);
    return 0;
}

void sendeof(void)
{
    int aa[1] = { 0 };
    msend(aa);
}

void msend(int *temp)
{
    struct msgbuf message, *p;
    int msqid;
    key_t key;
    int i;

    p = &message;
    for (i = 0;  (p->data[i] = temp[i]) && i < SIZE; i++) ;
    p->mtype = MTYPE;
    key = ftok("mrecv", 'a');
    msqid = msgget(key, IPC_CREAT | 0666);
    msgsnd(msqid, p, sizeof(p->data), 0);
    //msgctl(msqid, IPC_RMID, 0);
}

void mrecv(void)
{
    struct msgbuf message, *p;
    int msqid;
    key_t key;
    int i;

    p = &message;
    key = ftok("mrecv", 'a');
    msqid = msgget(key, IPC_CREAT | 0666);
    while (1) {
        msgrcv(msqid, p, sizeof(p->data), MTYPE, 0);
        if (p->data[0] == 0) break;
        for (i = 0; i < SIZE && p->data[i] != 0; i++)
            printf(" %d", p->data[i]);
        printf("\n");
    }
    msgctl(msqid, IPC_RMID, 0);
}
2つ端末を開いて、一方で ./a.out -R を実行する。
別の端末で、./a.out -T を 何回か実行し、最後に、./a.out -E を実行すると、
受信側の a.out -R が終了します。

028el
記事: 17
登録日時: 9年前

Re: 初めて質問させていただきます

#7

投稿記事 by 028el » 9年前

かずまさま

私一人では何日考えても解決できずにいたので、
思い切って質問させていただいて良かったです。
私の環境でも問題なく動きました。
咀嚼のほうはまだこれからですが勉強させていただきます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る