[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 10/10 05:02 / Filesize : 47 KB / Number-of Response : 201
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.80【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2012/09/21(金) 02:15:05.41 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.79【環境依存OK】
toro.2ch.net/test/read.cgi/tech/1341052801/

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

NG推奨:◆QZaw55cn4c

87 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 00:41:47.86 ]
>>85
つtypeid
つdynamic_cast

88 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 00:43:16.44 ]
typeinfoしか思いつかないなあ

89 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 00:46:35.27 ]
要するに.NETで言う所のリフレクションみたいな機能が欲しいんだろうと予想するけど

C++11ならdecltypeって使えるな

90 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 00:47:14.91 ]
使えねーよ

91 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 00:50:04.04 ]
はっきり言うが設計間違えてるからやり直し

92 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 01:01:12.06 ]
>>85
特に速度が必要ないならdynamic_castでNULL判定が楽

93 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 01:19:46.33 ]
>>91
俺もそう思うが、設計スレじゃないし、いいんじゃね?

94 名前:デフォルトの名無しさん [2012/09/28(金) 08:36:55.73 ]
>>91
どんな感じにすればいいですか?

95 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 09:42:12.28 ]
ガチ素人ですがいろいろ聞いていいですか?



96 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 12:49:39.57 ]
そういうのは、サブクラス側に
bool canEquip(SlotType)
みたいな関数を用意すればいいんじゃね。

97 名前:85 [2012/09/28(金) 18:51:14.63 ]
「設計を間違えている」というのが気になります。
後学のためにも教えてくれると本当に助かります。
やっぱりスーパークラスのメンバ変数をサブクラスのコンストラクタで初期化する、というのが最適なのでしょうか?
質問スレの域を脱してる、と言われたら謝ります。

98 名前:デフォルトの名無しさん [2012/09/28(金) 18:59:06.86 ]
まるで頭悪い発言スレだな
>>87 で FA

99 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 20:47:58.38 ]
大体派生にしかない情報がほしくなる時点でポリモーフィック失敗してんだよ
インターフェース通じてやりたいこと全部出来るようなら(たぶん)成功した設計
ひとつでも出来ないことがあれば失敗設計

100 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 20:57:57.65 ]
何のための dynamic_cast や
ダウンキャストしてでも派生した方が良い場合もたまにある

ただ、今回がそれかどうかは別の話だが

101 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 21:02:35.97 ]
dynamic castするくらいならquery interfaceするわ

102 名前:85 mailto:sage [2012/09/28(金) 21:06:21.59 ]
>>99
>>85でいうスーパークラスはインターフェースクラス?なのかどうかは知りませんが
virtualの装飾がついた関数しかありません。
use()=0とかdrop()=0とかpick()=0とか・・・

103 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 21:07:54.40 ]
具体的な情報が必要な抽象化とかわろす

104 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 21:24:09.55 ]
query interface は結局 dynamic_cast だろw

105 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 21:26:40.73 ]
JavaだのC#だのはobjectに値を突っ込んで
ダウンキャストで取り出すなんて日常茶飯事



106 名前:85 mailto:sage [2012/09/28(金) 21:27:21.03 ]
>>103
ということは、>>85でいえば
「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」
という判定がしたい時は
逆に銃から3ウェイハンドシェイクみたいなやり取りを開始すれば完全に抽象化できるということでしょうか?

107 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 21:47:54.71 ]
>>106
言いたいことがさっぱりわからんというかESPしても誤解が誤解を生むだけだから
なんか疑似コードでも書いておくれ

108 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 21:52:09.68 ]
>>97
アイテムスロットに登録する人、つまり型情報から判定を行う人は誰?
スーパークラス?



109 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 21:56:32.68 ]
まあ、装備の種類みたいなのはクラスで分けずに
パラメータ化するのが普通じゃね

110 名前:85 mailto:sage [2012/09/28(金) 22:49:22.65 ]
codepad.org/fp98nlIJ
こんな感じです。
3ウェイハンドシェイクとか忘れてください。

111 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 23:03:22.83 ]
そうとう重症だなこれは

112 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 23:20:37.91 ]
>>110
ちょっとぉ、だいぶ>>85のイメージと違うんだけど。。。

ま、それはさておき、そのコードであれば素直に属性として、「種類」や「名称」を持つのが普通かなと思う。

その相互依存はいくない。


113 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 23:20:46.27 ]
Equipにvirtual int GetSlot();を実装

Equip[tmpWeapon->GetSlot()] = tmpWeapon;

とでもしとけ


114 名前:デフォルトの名無しさん mailto:sage [2012/09/28(金) 23:28:57.41 ]
>>112
ごめん、見間違えた。
そのコードならいいんじゃね?
俺ならこうするってのはあるけど、それほどおかしくはないと思う。
強いて言えば、タイプをキーにして配列やマップに結びつけるかな。


115 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 11:36:37.73 ]
メソッドチェイン用に外部に保持されないプロクシを作れないだろうか

// ok
obj.Proxy().Method();

// ng
auto proxy = obj.Proxy();
proxy.Method();




116 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 12:30:54.25 ]
プロキシクラスのコンストラクタをprivateにしてプロキシを返す関数とかをfriendにすれば

117 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 19:30:44.75 ]
MinGWでWin32APIを使っての開発を行っています。

codepad.org/fDEMyIto

aaa()以降の標準出力が使用できず困っています。
WriteConsole()を_tprintf()としても同様です。
標準エラー出力(STD_ERROR_HANDLE)であれば何故か正常に出力が出来ます。

アドバイスお願いします。


118 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 19:41:33.53 ]
だって自分で閉じてるじゃん。
何が疑問なのかわからないくらい。

119 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 20:39:33.01 ]
汚たねぇブロック配置だな

120 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 21:45:43.59 ]
template <class X> class Bob {
friend class X;
private:
void Fuck();
};

class Alice {
Bob<Alice> bob;
public:
void DoSomething() { bob.Fuck(); }
};

こういうふうにfriendに出来る対象をテンプレートで指定したいんですができません
どうすればうまくいきますか?

121 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 22:04:53.87 ]
>>117
Windowsでは一般にGetしたものはReleaseするものであってCloseするものじゃない

122 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 22:19:24.47 ]
お二方アドバイスありがとうございます。

>>118
GetStdHandle()をCreateConsoleScreenBuffer()のような感覚で使っていました。
改めて考えるとおかしいですね。

>>119
お目汚し失礼しました。
C++を学習し始めたばかりですので、お手本お願いできますか?


123 名前:デフォルトの名無しさん mailto:sage [2012/09/29(土) 23:31:47.07 ]
>>120
11ではclassを書かずに

friend X

03では適当なクラスを介して

template<class T>
struct friend_template
{
typedef T type;
};
friend class friend_template<X>::type;

124 名前:デフォルトの名無しさん [2012/09/29(土) 23:34:58.93 ]
>>123
!!!!!!!!!!!!!!!
!!!ありがとうございます!!!
!!!!!!!!!!!!!!!


125 名前:デフォルトの名無しさん mailto:sage [2012/09/30(日) 08:25:09.20 ]
>>115
コピーコンストラクタなどをprivateにしてもauto&&で持つことが出来るよそれ



126 名前:デフォルトの名無しさん mailto:sage [2012/09/30(日) 17:07:55.29 ]
現在C++をVisualStudio2010Expressでゲームを作っていますが、C#のようにいわゆるポトペタでGUI部品やスプライトを配置して中身をC++で書けるような技術はありますでしょうか?
Qtを調べたのですがゲームにはあまり向いていないと書いてありました。

127 名前:デフォルトの名無しさん mailto:sage [2012/09/30(日) 17:46:39.17 ]
残念ながらExpressにはリソースエディタがない
リソースファイルはテキストで直接編集するしかない

128 名前:デフォルトの名無しさん mailto:sage [2012/09/30(日) 18:14:35.99 ]
Qtを使うのならVisualStudioは要らんな。

129 名前:デフォルトの名無しさん mailto:sage [2012/09/30(日) 18:23:18.96 ]
ゲームなら自前で全部描画が基本じゃね

130 名前:デフォルトの名無しさん mailto:sage [2012/09/30(日) 23:25:32.80 ]
フリーのリソースエディタ

131 名前:デフォルトの名無しさん mailto:sage [2012/10/01(月) 15:52:51.27 ]
任意のEXEから呼出されるDLLで作成する
スレッドとファイバのスタックサイズを
4KB未満に小さくするにはどうすれば良いですか?

SetThreadStackGuaranteeというので最小スタックサイズを
変えられるようですが、小さくできないようだし、
64ビットのみだし。

32ビットXPでできる方法はありませんか?

132 名前:デフォルトの名無しさん mailto:sage [2012/10/01(月) 16:14:38.57 ]
ファイバーは知らないけど、スタックはスレッド固有の領域だから
ページサイズ以下には出来ないんじゃないの?
仮に出来てもページサイズ単位になるだろうし

133 名前:デフォルトの名無しさん mailto:hage [2012/10/06(土) 09:02:38.89 ]
VS2008 C++です。
ライブラリ等外部から取得したポインタのアライメントを確認するには
どのような方法がよいでしょうか?
今はintにキャストしてbit andをとっていますが、これが動作保証されているのか
わからないのと、Windows環境で適切なAPIがあればそちらを使いたいと思っています。

134 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 10:04:45.03 ]
if(((char *) p - (char *) 0) % align == 0) Good();


135 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 10:24:06.85 ]
なるほど、NULLがアドレス0ならばこれでアドレスを求められるわけですね。目から鱗です。



136 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 13:35:32.67 ]
ところがだ、連続していることが保証されていないポインタ同士の減算は未定義だから巧くないんだな。
で、どうせ環境依存になるんだからintptr_tにキャストすればOK。

137 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 13:38:32.52 ]
>>136
何度も議論されてるようにintptr_tではサイズが足りる保証はない

138 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 13:40:21.78 ]
>>136
それはイテレーター全般の話だろ
ポインタはvalid rangeじゃなくてもオフセットを取得出来る

139 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 14:00:22.33 ]
つ ptr_diff_t

140 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 14:10:00.90 ]
>>139
それも同じでサイズが足りる保証はない

141 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 14:14:36.17 ]
オフセット取得でサイズが足りなくなる例を一個示してくれ
何度も議論された成果を1行で示すくらい、簡単だろう?

142 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 14:16:29.60 ]
>>141
>>135

143 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 14:33:15.52 ]
ISO/IEC 14882:2011
Unless both pointers point to elements of the same array object, or one past the last element of the array object, the behavior is undefined.
JISX3014:2003
両方のポインタが同じ配列オブジェクトの要素又は最終要素の一つ先を指していない場合の動作は、未定義とする。

というわけで少なくともC++では未定義
ptrdiff_tなら標準にあるけどptr_diff_tはない
そもそもptrdiff_tでポインタのサイズに足りる保証はない
intptr_tなら保証されるが定義されている保証はない

144 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 14:55:31.15 ]
>>143
なるほど、型に保証が無いのは分かったが、
if the expression P points either to an element of an array object or one past the last element of
an array object, and the expression Q points to the last element of the same array object,
なので、同じchar配列要素の場合で最終要素も超えないので、OKかと。

最終要素を超えるの意味はわかってるよね?
>>134のpがintだろうがdoubleだろうがchar*にキャストされた時点で
それらの最終要素より先をポイントしようがないよ?
charが2バイトの環境で、とか言い出されたら、もうハイハイとしか言いようがないけども

145 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:06:35.67 ]
俺は>>143しかレスしてないが・・・
まあ>>134が同じ配列オブジェクトの要素だと強弁するならそれでいいんじゃないの
百歩譲っても(char*)0が配列オブジェクトの要素を指してるなんてありえないと思うけど



146 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:17:48.27 ]
>>134 から始まって、最初に規格書から「配列オブジェクト」を持ちだしたのは>>144だろ

147 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:18:29.08 ]
143だった

148 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:23:59.43 ]
それで、結局のところ「安全にアドレスを整数変換できる方法」はどうすればいいんですか?
あなたたちはあれはだめこれはだめというばかりで一向に話を進めようとしないじゃないですか

149 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:25:20.34 ]
俺はuintptr_tに突っ込んでます

150 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:29:42.29 ]
「安全にアドレスを整数変換できる方法」は環境依存しないかぎり存在しない
intptr_tかuintptr_tがあればそれを使うのが安全

151 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:40:19.14 ]
>>146
それが何かおかしい?

152 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:45:24.94 ]
std::sprintf(buf, "%p", p);
if(BigInt::FromString16(buf) % align == 0) Good(); // EXCELLENT!!

153 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 15:55:52.11 ]
%pでの出力形式は実装定義だからあんまり意味ないな

154 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 16:09:32.37 ]
if(BigInt::FromBytes((unsigned char *) &p, sizeof(p), ByteOrder::Check()) % align == 0) Good(); // Amazing!!!

155 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 16:33:19.07 ]
www.kouno.jp/home/c_faq/c5.html#17
それだけがんばってもこういう環境ではうまくいかない件



156 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 16:38:05.76 ]
そんなマニアックな環境はボイコットしろ

157 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 16:39:47.31 ]
>>133の環境に限定するならUINT_PTRにでもキャストすればいいんだけどな

158 名前:133 mailto:sage [2012/10/06(土) 16:57:53.35 ]
自分としてはWindows(VC)限定でいいんですが、その環境でポインタを整数に
キャストしたとき下位ビットがアライメントを表すことが保証されているかどうか、
それだけです。

159 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 18:21:42.78 ]
2の整数乗にしかならないから下位ビットを見ればいいのはあってるけど
struct type1{ char a[10]; }; この型のアライメントは1
struct type2{ DECLSPEC_ALIGN(1024) char a;} この型のアライメントは1024
というようなことを判別する必要があるなら
(UINT_PTR)p % TYPE_ALIGNMENT(T) == 0 が真っ当な方法

160 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 19:02:42.60 ]
>>158
アライメントの定義は下位ビットでしょ?
問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
キャストできるならその答えは Yes になる

どうせ上司あたりから受け取ったポインタのアライメントを確認するように!と
言われたんだろう。
「x86ならアライメントエラーにならないから平気ですよ」と言い返そう
そのあと「あ、ARMだと例外おきますね。ARMも対応するんですか?なら直してきます」
と言って席に向かおう

161 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 19:17:04.09 ]
>問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
>キャストできるならその答えは Yes になる

ポインタを整数にキャストできることは保証されているが、それがアドレスか
どうかは規定されてないだろ。

162 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 19:21:27.24 ]
ARM対応予定はないけどSSE使うから直せとか言われるオチ

163 名前:133 mailto:sage [2012/10/06(土) 20:06:49.56 ]
>>162
まさに、受け取ったデータをSSEで処理したいんですが16byte alignmentを要求するので
そのチェックをしたいということです。
他の環境に移植し得るようなプログラムでポインタのアライメントをチェックしなければ
ならないような場面なんて逆に思いつかないです。

164 名前:デフォルトの名無しさん [2012/10/06(土) 20:13:57.58 ]
VC は alignas ないんだっけ

165 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 21:02:33.91 ]
ない



166 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 21:50:36.98 ]
ポインタのアラインメントっていわれると&pのアラインメントを思い浮かべちゃうんだけど

167 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 21:56:01.43 ]
ん?それでいいんじゃないか?
それともポインタ変数のアライメントのことを言ってるのか?

168 名前:デフォルトの名無しさん mailto:sage [2012/10/06(土) 22:30:27.72 ]
void * p; &p;ってことね
アドレスのアラインメントっていってくれたほうがわかりやすい


169 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 06:28:21.41 ]
プログラミング言語C++第三版を読んでC++の勉強をしています。
テンプレートという機能がある事を知ったので、
ある要素配が列に含まれるか調べる関数をテンプレートで書いてみました。こんなのです。
#include <stdio.h>

const char chars[] = {'a', 'b', 'c', 'd', 'e', 'f'};

templete<class T> inline bool memberOf(T x, const T elems[]) {
 for(int i=0;i < sizeof(elems);i++)
  if (x == elems[i]) return true;
 return false; };

int main(){
if (memberOf('a', chars)) return printf("found!!\n");
return printf("not found.\n"); }
しかしgcc4.2.1は
error: expected constructor, destructor, or type conversion before '<' token
というエラーを吐いてコンパイルが出来ません。いったい何がまずいのでしょうか。

170 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 06:40:26.51 ]
algorithmのfind()を使えば?
それとc++なら、std::coutを使いましょ

171 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 06:43:55.38 ]
templeteがまずい

172 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 06:44:15.83 ]
>>169
×templete
○template
あとsizeof(elems)は配列の要素数を返さないのでそれじゃまともに動かないよ

173 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 08:26:40.90 ]
>>169
とりあえず初心者はVC++かeclipse使って色付けてもらえよ
そしたらこんなしょうもないエラーに悩まされることはないはずだから

174 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 08:28:09.60 ]
>>170
多分標準ライブラリがあると思ったのですが、
言語の機能を学びたいとおもいこんなことをやっています。

>>171,172
> ○template
それでした、下らなくてすんません
sizeofは自分もそう思ったのですが、
char[]の配列をいくつか作って試してみた限りでは
きちんと配列の長さを返してくれたのでそのままにしてあります
これって仕様に無い実装依存の挙動だったりするんですか?

175 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 08:43:31.39 ]
>>174
ttp://ideone.com/7CRnJ
本当に返してるかきちんと調べたか?



176 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 08:56:18.78 ]
>>173
emacsを使ってますが色の意味が分かりませんでした……

>>175
sizeofの結果を直接printfした場合にはちゃんと長さを返してくれてたんですが、
memberOfから呼ぶとだめみたいですね。
やっぱりsizeofじゃダメみたいですね。

177 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 09:01:31.25 ]
>>176
配列は通常の方法では関数に渡せないからね。渡しているのはポインタ。
関数内で配列のサイズを知りたければ、テンプレート引き数として配列を渡す位しか手がないよ。

178 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 09:05:46.23 ]
>>177
まあそうなんですが
直接書いて長さ返してくれるなら
インラインは最終的に直接書いたのと同じにならないかなー、と思ったんですが
やっぱりこういうのはあんまりやらない方がいいですね

179 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 09:38:10.37 ]
>やっぱりこういうのはあんまりやらない方がいいですね
バグの温床になるからしない方が良いかと。

180 名前:デフォルトの名無しさん mailto:sage [2012/10/07(日) 10:55:28.91 ]
>>178
template <class T, int N>
inline bool memberOf(const T& x, const T (&elems)[N]){
for(int i=0;i <N;i++)
:
}
とすればうまくいくはずです。

const char chars[] = {'a', 'b', 'c', 'd', 'e', 'f'};
memberOf('a', chars);
の場合、Nには6が設定されます。

以前同じ問題で悩んだことがあったので
参考までに。


181 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 15:47:59.92 ]
バルバロス「バオーwwwwwwwwwww」

182 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 15:49:24.24 ]
ルポニ「ランーーwwwwwwwwwwwwww」

183 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 16:02:19.90 ]
コナニゾ「ムゾコナwwwwwwwwwww」

184 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 21:40:15.02 ]
Winsockを使ったTCPで複数クライアントと接続するソフトを作りたいのですがうまくいきません。
サーバ側はacceptで待機し、接続があれば新規スレッドを作成し
acceptの戻り値のSOCKETだけ新規スレッドに渡して、ループでaccept待機に戻ります。
新規スレッド内では渡されたSOCKETを用いて送受信処理をおこなっているのですが、
 クライアント@接続→クライアントA接続→@のSOCKETからデータ受信→@のSOCKETへデータ送信→Aに届く
といった結果になってしまいます。
SOCKETをsend関数の第1引数に指定するだけでは送り先を変えることはできないのでしょうか?

Javaですが、以下のページと同じように作っています。
ttp://www.cs26.scitec.kobe-u.ac.jp/~kamada/students/textK/net2_sample0.html

185 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 21:45:15.74 ]
ラゾコンナ「ンババババwwwwwwwwwwwwwwww」



186 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 22:39:33.65 ]
>>184
send( ), recv( ) の直前でソケットの値表示して、本当に正しいソケットに
対して操作しているか確認しなよ。

もしくは、ソースさらして。

187 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 22:41:47.22 ]
>>184
えーと、サーバ側アプリを書いているんだよね?
受信したスレッドと送信したスレッドはきちんと把握できている?
ひょっとしたら、メインスレッドで受信してメインスレッドで送信しているんじゃない?

188 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 23:25:28.29 ]
>>186
ソケットの値も確認しました。recvで@のソケットで受信していて、sendで@のソケットを指定しているのにAに送信されます
スレッド開始など省いていますが、以下のようなソースです。事情があって受信したデータの解析・送信はメインスレッドのクラスにある関数を使っています。
CServer::mainthread(){
 while(1){
  socket2 = accept( socket1, &addr, &length );
  CThread* cthread = new CThread( socket2, this );
  cthread.start();
 }
}
CServer::Send( SOCKET socket ){
CThread::CThread( SOCKET socket2 ){
 Socket = socket2; //メンバ変数
}
CThread::subthread(){
 JUSINDATA data;
 int length;
 while(1){
  length = recv( Socket, &data, sizeof(data) );
  if( length == sizeof(data) ){
   send( Socket, &data, length );
  }
 }
}
>>187
上記ソースで言うとsubthreadで送り返しているのですが、実際にはsend関数は


189 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 23:26:54.96 ]
すみません、ソース書いてる途中に間違って送信してしまいました。
>>1のサイトを使ってもう1回書きます。

190 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 23:34:41.84 ]
ttp://codepad.org/tzuheXNf
先にも書きましたが、受信データの解析・送信はメインスレッドのあるクラスの関数でおこなっています。
SOCKETを渡して、それをsendに指定しているのですが、もしかしてメインスレッドのクラスでsendしているのが問題なのでしょうか

191 名前:デフォルトの名無しさん mailto:sage [2012/10/08(月) 23:53:19.41 ]
>>188
>  CThread* cthread = new CThread( socket2, this );
>  cthread.start();

ホントにソース書いてる?

cthread->start(); じゃなくて?

イメージは間違ってないと思うが、こういう細かいところでミスってるんじゃないのか?

て言うか、人に見てもらうならせめてコンパイルエラーにならないソースを上げてよ…




192 名前:デフォルトの名無しさん mailto:sage [2012/10/09(火) 01:35:08.28 ]
実は java という気がします

193 名前:デフォルトの名無しさん mailto:sage [2012/10/09(火) 01:37:01.29 ]
>>191
すみません、他にもいろいろ間違ってますね。
1回間違って書き込んで無意味に焦ってしまいました。

>メインスレッドで受信してメインスレッドで送信しているんじゃない?
というのを受けてもう一度ソースを見なおしたところ、スレッドの扱いは合っていたのですが
別のところで問題があることがわかりました。
TCPがどうとかいう以前の問題でしたので、全体的にソースを見直すことにします。
ご回答して下さった方々、ありがとうございました。

194 名前:デフォルトの名無しさん mailto:sage [2012/10/09(火) 06:46:12.36 ]
サブスレッドで受けた後
メインスレッドで処理して
間違ったサブスレッドで送り返していたと



195 名前:デフォルトの名無しさん mailto:sage [2012/10/09(火) 23:35:01.10 ]
パゾコナン「マニアwwwwwwwwww」



196 名前:デフォルトの名無しさん mailto:sage [2012/10/09(火) 23:36:11.75 ]
>>180
おお、これはすごい
勉強になります
ありがとうございます

197 名前:デフォルトの名無しさん mailto:sage [2012/10/09(火) 23:40:12.58 ]
コナニーゾ「ハラバロwwwwwwww」

198 名前:デフォルトの名無しさん mailto:sage [2012/10/10(水) 00:00:03.89 ]
uyうぜーよ消えろ

199 名前:デフォルトの名無しさん mailto:sage [2012/10/10(水) 00:09:00.78 ]
コナニール「バンバンwwwwwwwwwwwww」

200 名前:デフォルトの名無しさん mailto:sage [2012/10/10(水) 00:42:56.19 ]
uyって朝鮮人だってな






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<47KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef