ページ 1 / 1
初めて質問させていただきます
Posted: 2016年5月18日(水) 09:13
by 028el
プログラミングも初心者でこのような場所で質問させていただくのも初めてなので、質問がわかりにくいかもしれません。ですが藁にもすがる思いです。どなたかお知恵をお貸し下さい。
偽天候センサープログラムを作ってそのデータをメッセージキューで送受するというタスクに取り組んでいます。
送り側のプログラムはコマンドラインでオプションを指定して、道理をわきまえた範囲でランダムな値を発生させて、それを送信します。コマンドライン、ランダムな値の発生までは見よう見まねでなんとか作りましたが、発生させたランダムな数値をどのようにメッセージキューで送信したらよいのかわかりません。具体的に言うと、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;
}
Re: 初めて質問させていただきます
Posted: 2016年5月18日(水) 21:57
by box
028el さんが書きました:ですが藁にもすがる思いです。
回答しようとする人たちは藁ですか(苦笑)。
とりあえず、そののんべんだらりとした字下げなしのコードは見づらくてたまりません。
それから、
028el さんが書きました:
コード:
while((opt=getopt(argc, argv, "TPH")) !=-1
コンパイルが通りません。さしあたっては、コンパイルが通るコードを載せていただけますでしょうか。
それほど長くないのであれば、省略せずに全部見せていただけますでしょうか。
私が回答できるとは限りませんが…。
Re: 初めて質問させていただきます
Posted: 2016年5月18日(水) 23:08
by 028el
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');
}
Re: 初めて質問させていただきます
Posted: 2016年5月18日(水) 23:29
by みけCAT
028el さんが書きました:プログラミングも初心者でこのような場所で質問させていただくのも初めてなので、質問がわかりにくいかもしれません。
とりあえず、「初めて質問させていただきます」という件名は良くないですね。
件名は質問の内容を簡潔に表したものにするといいでしょう。
Re: 初めて質問させていただきます
Posted: 2016年5月19日(木) 03:33
by 028el
みけCATさま
ありがとうございます。
おっしゃる通りですね。
Re: 初めて質問させていただきます
Posted: 2016年5月19日(木) 04:24
by かずま
コード:
#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 が終了します。
Re: 初めて質問させていただきます
Posted: 2016年5月19日(木) 06:43
by 028el
かずまさま
私一人では何日考えても解決できずにいたので、
思い切って質問させていただいて良かったです。
私の環境でも問題なく動きました。
咀嚼のほうはまだこれからですが勉強させていただきます。
ありがとうございました。