VC++2005にて下記サイトを参考にパイプを用いたプロセス間通信を行うプログラムを作成しています。

猫でもわかるプログラミング
(1)第242章 匿名パイプ(サーバー側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_242.htm
(2)第243章 匿名パイプ(クライアント側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_243.htm

サーバー側からWriteFileでデータを送信する際に、
char型配列に入ったバッファデータ「szBuf」を送信し、
クライアント側のReadFileで同じく「szBuf」で受信していますが、
構造体Data
==================
typedef TypeData{
int a;
int b;
char c[10];
}Data;
==================
のオブジェクトdataを送信するには、WriteFile及びReadFileの箇所は
どのように実装すれば良いのでしょうか?
MSDNにはWriteFileの引数の型はLPCVOIDとあるため、
可能だと思うのですが。。。
もし解決策をご存知の方おられましたら、ご教示お願い致します。

「パイプを用いたプロセス間通信について」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>Data* data;


>ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
構造体の実体はmalloc()等で作ってありますか?
補足のコードのままだとすると、dataの中身はNULL(あるいはゴミ)になっているのでエラーになって当然です。
////////
Data* data;
data = malloc(sizeof(data));
ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
////////
あるいは、ポインタを使わずに次のようにしてもいいです。
Data data;
ReadFile(hRead, (LPVOID)&data, sizeof(data), &dwResult, NULL);
※WriteFileの方も、dataはポインタではないと思うのですが...
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教示頂いた内容を参考に、作成し直したいと思います。

お礼日時:2009/05/31 15:53

(LPCVOID)data



(LPCVOID)&data
としてみて下さい。

この回答への補足

ご回答ありがとうございます。
(LPCVOID)data
⇒(LPCVOID)&data
とすることでWrite側はコンパイルが通りました。
しかしRead側で
Data* data;
ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
とポインタで受け取ろうと思ったのですが、画像の様なエラーが出てしまい、
データを受け取れません。。
聞いてばかりで本当に申し訳ありませんが、Read側でどのような実装で
データを受け取れば良いのか、ご教示お願いできませんでしょうか?

補足日時:2009/05/24 13:24
    • good
    • 0

普通のファイルI/O同様に扱えます。


Dataにキャストすれば問題ないと思います。

この回答への補足

typedef TypeData{
⇒typedef struct TypeData{
ですね。すみません。。
こちらのURLの方が分かりやすかったので、参考にしてキャストしてみました。
http://www2m.biglobe.ne.jp/~yasutaka/intro2/no_1 …

WriteFile(hWrite, szBuf, sizeof(szBuf), &dwResult, NULL)
の箇所を
Data data;
WriteFile(hWrite, (LPCVOID)data, sizeof(data), &dwResult, NULL)
にキャストし、実行しましたが下記エラーが発生しました。
>2 番目の引数を 'Data' から 'LPVOID' に変換できません。
キャストの仕方が悪いのでしょうか?お手数ですが、具体的な解決策についてご教示お願いできませんでしょうか。

補足日時:2009/05/24 00:00
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q単管パイプのクランプの強度について

単管パイプのクランプにかかる力に関して質問です。

例えば、垂直クランプのカタログを見ると、せん断強度は500kgと書かれています。

これは、文字通りクランプ自体に500kgかけると壊れてしまうという意味だと思いますが、

垂直クランプで縦、横にパイプを組み、横向きのパイプに力をかけると、

クランプ自体にも力がかかりますが、クランプが壊れる前に、

縦のパイプを掴む力の限界を超えて横パイプがずり落ちてしまうように思えて心配です。

この500kgという数字は、適正なトルクでボルトを締め込んだ際に、

ずり落ちない限界の重さという意味も含んでいるのでしょうか?

もし含んでいない場合には、ずれずに縦パイプを掴んでいられる荷重はどのくらいなのでしょうか?

Aベストアンサー

質問の垂直クランプは直交クランプの事でしょうかね。
クランプ1個当たりの強度を云々される前に単管足場の
スパン当たり積載荷重が400kgと規制されています。
(足場板が4m且つ3点支持が原則ですので1スパン約1.8m)
単管本足場では2スパン取り出すとクランプは6個、真ん中の建地では
2個のクランプがあることになり両側のスパンの荷重の半分ずつを負担するので
荷重は400kg、クランプ1個当たり200kgと規制されている事となります。
以下参考に足場の積載荷重資料です。
尚、現場で見ている限り締め付けはインパクトレンチですので100~140Nでしょう。
あまり締めるとパイプが変形していきます。
http://www.okg-gr.com/pdf/kensetsu_ashiba.pdf

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Q足場用のパイプより少し細いパイプとクランプを欲しい

 パイプベッドを自作したいのですが、足場用のパイプでは重いし太すぎるので、
もう少し細い物を探しています。でも、イレクターでは細すぎて心配です。足場用
のパイプはホームセンターなどで良くあるのですが、その7割位の径のパイプとこ
れ用の各種クランプを製作/販売している会社を教えて下さい。

 実は、あるホームセンターでの商品棚としてそのパイプを使っていたので、それ
を欲しいと注文したところ、扱っていないと言われました。直交クランプや自在ク
ランプ等もこのサイズ用の物がありました。

 以上、よろしくお願いします。

Aベストアンサー

売り場で使われていたということは、たぶん店舗屋さんルートの什器ですね。

店舗屋さんは、店舗の内装・什器の専門店ですから、通常は一般客とは取引しませんが、探して、相談してみると分けて頂けるかもしれません。
後は、工芸屋・鋼材店・工務店関係にも、訊いてみるとよろしいかと思います。
ステンレスパイプの直径や長さを、はっきり指定すれば話は早いかと思います。

●店舗屋さん:
http://www.uni-net.ne.jp/koujiya/bhome/tennpoyasann.html

参考URL:http://www.uni-net.ne.jp/koujiya/bhome/tennpoyasann.html

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

Q単管パイプで棚作り。直交クランプの締め付けについて

雨水をためるタンクを乗せる棚を、単管パイプを使って作ろうと思います。
直交クランプの締め付けトルクが、どこかに出ていたのですが、
そのページに行かれなくなりました。

どのくらいの締め付けをしたらよいか教えてください。
20N・m~110N・mのトルクレンチを購入してあります。

雨水用のタンクは、約160L入るタンクを使います
3個ずつ、2段にして、6個乗せます。

6本の単管パイプを支柱とします。
1段で最大480Lの水を支えることになりますが、
6個の直交クランプで、足りると考えています。
この点についても教えてください。

Aベストアンサー

https://www.katagiri-g.com/nikken/catalog/pk_clg/pdf/07/07_01_all.pdf#search='%E7%9B%B4%E4%BA%A4%E3%82%AF%E3%83%A9%E3%83%B3%E3%83%97+%E5%BC%B7%E5%BA%A6'

クランプの標準締付トルクは350 kg・cm程度(あるメーカーでは3.43KN・cm)とありました。
(片手の専用道具で普通の力くらいですね)

支柱の上下にも周りの囲い状の単管をつけて下さいね。 もし、クランプの縦のピッチが
タンクの高さの1.5倍以上も出来るようなら、横巻きを追加した方が良いでしょう。

御健闘を祈ります。

Qchar *data[20]; のデータの行方

ファイルからデータを1行ずつ読み取り、
その行をコンマで分割して
1行毎の一時保管にこのchar型ポインタの配列を使っているのですが、

この場合データはどうなるのでしょうか?

以前、
>char *p = "文字列";
>等とすると、そのデータはメモリのどこかに静的に置かれてしまう
>constを付けて保護しなければならない。
的な注意を見たのですが

1.この使い方は危険なのでしょうか?
2.ポインタで受け取ると、全ファイル分のデータが静的メモリとして
  どこかに漂ってしまったりするのでしょうか?

わかる方、いらっしゃいましたら教えて下さると幸いです。

Aベストアンサー

#3のzwiですが、心配した通りポインタとメモリ実体の把握が曖昧な様です。
token = strtok_s(buff, DELIMITER, &nexttoken);
で得るtokenですが、あくまでも文字列のポインタだけです。
なので、実際の文字列は
char buff[256];
のbuffに記録されいます。
で、
data[count] = token;
と代入していますが
data配列に記憶されるのも文字列のポインタだけで実体はbuff上です。
問題なのは、
/* ここでdata[n]を別の受け皿へ代入し、保存しています */
とありますが、data配列の中身をコピーしただけでは文字列の実体はそのままbuffに残されていますので、次にfgetsされた場合はbuffの内容は書き換わりますので、保存しておいた前のdata[n]が指すべき文字列は上書きされて無くなってしまいます。

なのでデータとして保存するには、
#define KEEPLINE 2000/*保存行数を2000行と仮定*/
char *keepdata[KEEPLINE][20];//tokenの保存。
int keepcount[KEEPLINE];//カウントの保存。
int keepdata_num = 0;
int i;
/* ここでdata[n]を別の受け皿へ代入し、保存しています */
for( i=0 ; i<count ; i++ ) {
//文字列コピー用のバッファのサイズを求める。
int mojilen=strlen(data[i])+1;//一を足すのは文字列の終端コード(\0)の分。
//まず文字列をコピーするメモリを確保。mallocしたメモリはプログラム終了時に必ずfreeする事。
keepdata[keepdata_num][i] = (char*)malloc(mojilen);
//文字列をコピーする。
strcpy_s(keepdata[keepdata_num][i],mojilen,data[i];
}
keepcount[keepdata_num] = count;
keepdata_num++;
以上です。

あとバグですが、countをfgets毎にクリアしてくださいね。

#3のzwiですが、心配した通りポインタとメモリ実体の把握が曖昧な様です。
token = strtok_s(buff, DELIMITER, &nexttoken);
で得るtokenですが、あくまでも文字列のポインタだけです。
なので、実際の文字列は
char buff[256];
のbuffに記録されいます。
で、
data[count] = token;
と代入していますが
data配列に記憶されるのも文字列のポインタだけで実体はbuff上です。
問題なのは、
/* ここでdata[n]を別の受け皿へ代入し、保存しています */
とありますが、data配列の中身をコピーしただけでは...続きを読む

Q単管パイプ 防錆

単管パイプで柵を作ろうと購入したのですが、パイプとクランプに
どのように防錆施工を施せばよいのか教えてください。

ウチにある何十年も前に購入したと思われる単管パイプおよびクランプは赤錆がものすごいです。

亜鉛メッキが施されているということですが、いつかは錆びてしまうのでしょうか。
ホームセンターには紫外線や雨、錆から守るカラー塗装が売られていましたがこういうものを使えばいいのでしょうか。
10年以上持たせたいと思っています。

ちなみに単管パイプには以下の文字が印刷されています。
MARUICHI-T (JIS) QA0308013 STK500-E-G 48.6×2.4 '08 PZ

ご教授よろしくお願いいたします。

Aベストアンサー

 単管パイプであっても、溶融亜鉛メッキが施されていれば、10年は持つはずです。
いくつかポイントがあります。
★クランプも同じ溶融亜鉛メッキがのぞましい。
 亜鉛は鉄よりもイオン化電位がひくい--高校で言うとイオン化傾向が大きい--ため、傷がついても、亜鉛と鉄との間の電位差のため亜鉛が溶けて鉄を錆びさせない・・亜鉛がある限り近傍の鉄は錆びません。溶融亜鉛メッキ--いわゆるどぶ付けは亜鉛の層が厚くて寿命が長い

 クランプは、普通は電解(クローム)メッキなので、上と逆です。イオン化電位の高いクロムで覆われているため、傷がつくと鉄が急速に腐蝕します。クロム自体は不働態皮膜(緻密な酸化皮膜)をつくり、丈夫なのですが、それは傷が一切ないときの話です。

 トタン(屋根やバケツ)は傷がついてもすぐには錆びませんが、ブリキ(缶詰)の内側は錫メッキなので傷をつけたらすぐ錆びるでしょ。

 いずれにしても、全体をローバル( http://www.roval.co.jp/ )などの常温亜鉛メッキ塗料を使用するのがよいでしょう。別名ジンクリッチ塗料とも言う。
★基本的に上塗りはしません。むき出しになってこそ効果がある塗料です。
★下塗り用の亜鉛末塗料(エポローバルなど)もあります。--エポキシ樹脂です--

 私が子供の頃(何十年も前)から、著名な船舶や電柱金物に使用されている塗料です。

 単管パイプであっても、溶融亜鉛メッキが施されていれば、10年は持つはずです。
いくつかポイントがあります。
★クランプも同じ溶融亜鉛メッキがのぞましい。
 亜鉛は鉄よりもイオン化電位がひくい--高校で言うとイオン化傾向が大きい--ため、傷がついても、亜鉛と鉄との間の電位差のため亜鉛が溶けて鉄を錆びさせない・・亜鉛がある限り近傍の鉄は錆びません。溶融亜鉛メッキ--いわゆるどぶ付けは亜鉛の層が厚くて寿命が長い

 クランプは、普通は電解(クローム)メッキなので、上と逆です。イオン化電...続きを読む

Q※int nyuuryoku_kosuu = 0; ※の部分は何を宣言しているのでしょうか?

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
data [nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
 
以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_ kosuu {
  構造体名
int tanka;
int kosuu;         型 構造体のメンバ(変数名)
int kingaku;
};
int main()
{
struct tanka_kosuu data [10];
構造体宣言 構造体名  変数名 値・・10を代入
      struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
               型 構造体メンバ(変数名)の初期化
※int nyuuryoku_kosuu = 0;
以上※の部分は何を宣言しているのでしょうか?
while(kari_nyuuryoku.tanka != 0){
scanf("%d ...続きを読む

Aベストアンサー

※のところでnyuuryoku_kousuuの初期値を0と置くことで、data[nyuuryoku_kosuu]=kari_nyuuryoku;でkari_nyuuryokuの値をnyuuryoku_kosuuに正しく入れるための宣言だと思います

Q単管の直交クランプの分解方法について

単管パイプに看板を固定したいと考えています。

ネットで調べるとパイプに看板を固定したりする用途ように「穴あきクランプ」というものが存在するようですが
近所のホームセンターでは売っていませんでした。

パイプ同士を直角に連結させる直交クランプは1つ300円程度で売っていますので、
それを分解して同じようなものを作りたいのですがリベットで強烈に固定されていて分解する方法がわかりません。

グラインダーでは歯が届きそうにないですから、
ドリルでリベットを揉むか、リューターで削り取るしかないのでしょうか?

なにか分解するのに有益な方法があれば教えて下さい。

ちなみに水道管?を固定する金具でも代用出来るのは知っていますが、
後学のことも踏まえて質問させていただきました。よろしくお願いします。

Aベストアンサー

貴殿のお考え通りです。(タガネでもきつい)
現物を前にしておりませんので恐縮ですが、自在クランプを「鋸歯」が入ればカット出来ませんかね。=出来ても穴が大きすぎかな

Qint i, int i[1];

C++で、
 int i;
と、
 int i[1];
は、どっちで宣言をしても、iは同じ振るまいですか?

Aベストアンサー

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス値(またはアドレス式)です。
代入式の右に配置可能な値を右辺値といいます。

代入式の左に配置出来るのは『領域』です。
変数であっても良いし、配列要素でもかまいません。
また、領域を示す式(int i[1]のときの*iなど)でもかまいません。
配列名(int i[1]のときのi)や定数は領域を持たないため、左辺に配置することが出来ません。
代入式の左に配置可能な領域を左辺値といいます。

int i[1] ;
この形で宣言されたiは右辺値に利用できます。
int *a ;
a = i ;
しかし、iだけでは領域を持たないため左辺値になりえません。
i = 1 ; //コンパイルエラーが出る。

コンパイル時に「有効な左辺値でない」と言う意味のエラーが出るのは「領域を示さない値を左辺値として使っている時」です。

どちらかと言うと「基礎理論」の部類なのでプログラム言語の本などには書いてないのですが、実は最も大切なのが「基礎理論」です。
頑張って勉強してください。

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング