【初心者歓迎】C/C++室 Ver.80【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.80【環境依存OK】 - 暇つぶし2ch50:デフォルトの名無しさん
12/09/24 00:06:59.72
win32スレと同じだな

51:デフォルトの名無しさん
12/09/24 00:32:58.38
こっちのほうがまだマシだな

向こうは常に荒れてるけど
こっちはhoge厨が湧かない限り荒れてない

52:デフォルトの名無しさん
12/09/24 00:34:49.28
やってるやつは同じじゃねぇの?
そっくりなんだが

53:デフォルトの名無しさん
12/09/24 01:22:20.62
同じだろうと同じじゃなかろうとどっちでもいいよ。
Hogeが来なければ荒れないみたいだからそれを祈るばかり。

54:デフォルトの名無しさん
12/09/24 10:09:38.93
piyo厨も入れてやれ

55:デフォルトの名無しさん
12/09/24 10:15:18.46
相変わらずhogeに対する凄まじい憎悪だな
そろそろコテ付けろよww

56:デフォルトの名無しさん
12/09/24 10:37:12.54
hogeをngに入れとけばいいだろ

57:デフォルトの名無しさん
12/09/24 10:53:27.13
それじゃ >>34 >>35 >>37 >>39 >>40 >>43 >>46 は消えねーだろww

58:デフォルトの名無しさん
12/09/24 11:22:46.70
>>57
連鎖あぼーんにすればおk

59:デフォルトの名無しさん
12/09/24 11:57:18.32
>>57
連鎖あぼーんとかない?
ブラウザによるのかな。

60:デフォルトの名無しさん
12/09/24 12:17:36.40
>>55
まあここまで叩かれるの分かっていてhoなんとか使うのは初見か荒らしだろうな
>>57
侮蔑語をNGすればOK
>>58
>連鎖あぼーん
Janeだとそういった設定は無いんだが……別の専ブラならできるの?

61:デフォルトの名無しさん
12/09/24 12:21:36.79
>>60
>侮蔑語をNG
「エラー」とか「ゴミ」とかはまだ普通に使う可能性がある単語だろ……

62:デフォルトの名無しさん
12/09/24 12:36:08.08
それはNGしなけりゃいいだろ
それでも目に入る煽りはかなり低減できるだろ
100%クリーンな世界なんてないんだからそのくらいいいと思うけどね

とりあえずHOGE連鎖あぼーんでかなり減ると思うぞ

63:デフォルトの名無しさん
12/09/24 12:50:37.67
>>60
ここに質問に来るような初心者は大抵初見だろw
毎回発狂するキチがコテつけりゃ済む話

64:デフォルトの名無しさん
12/09/24 13:17:37.13
キチガイがコテつければ済む話だがキチガイがわざわざつけてくれるのか?
現実的でない。

65:デフォルトの名無しさん
12/09/24 13:21:32.43
初見と初心者とか感激なくホゲ使っててまともな質問見たことねーな。

全ホゲあぼーんで問題なし。

66:デフォルトの名無しさん
12/09/24 13:30:54.19
できるだけまともな日本語でどうぞ。いや、そもそも個人の感想なんてどうでもいいのだけれど。

67:デフォルトの名無しさん
12/09/24 13:42:17.91
>>66は自分ではまともな日本語で書き込んでると思ってるのかなw

68:デフォルトの名無しさん
12/09/24 13:51:00.04
>>63-65あたりを煽るために
わざと珍妙な日本語で書いてんだろ
お前釣られてんだよ

69:デフォルトの名無しさん
12/09/24 16:04:19.42
スレ住人「あぼんするのでコテつけてください!」→マジキチ「了解です!コテつけます!」

性善説をこじらせるとこういう流れが妄想できるようになるの?

70:デフォルトの名無しさん
12/09/24 17:55:10.54
俺はhoge厨もアンチも両方スルーできるけど、気になる奴はとりあえずNG設定しとけばいいんじゃね
hogeならNG設定しても困らんだろ

71:デフォルトの名無しさん
12/09/24 22:17:57.88
うんこちんちん

72:デフォルトの名無しさん
12/09/24 23:20:48.87
class Hoge* g_hoge;//クラスのグローバルポインタ

class Hoge
{
public:
virtual void func(){printf("Hoge World!\n");
}

class Fuga : public Hoge
{

73:デフォルトの名無しさん
12/09/24 23:21:35.58
おう間違えた

もういいや、寝る

74:デフォルトの名無しさん
12/09/25 12:01:33.54
なにしとんねん

75:デフォルトの名無しさん
12/09/25 21:16:05.24
VisualStudio2010でプロジェクトをビルドすると
・"Debug\test.unsuccessfulbuild" のタッチ タスクを実行しています
・すべての出力が最新のものです。
・ファイル "Debug\test.unsuccessfulbuild" を削除しています。

という警告メッセージ?がでます。
Explessから移行したばっかなので何がなんだかわからないのですが、どういうものなのでしょうか?

76:デフォルトの名無しさん
12/09/25 21:27:10.57
リモートから見る時unsuccessfulbuildが存在すればビルドに失敗したんだなってわかるようになってる
普通に使ってれば気にしなくていい

77:デフォルトの名無しさん
12/09/27 15:53:06.57
なぜコンストラクタは、returnでエラーをかえせないのですか?
exit()は、できる。

78:デフォルトの名無しさん
12/09/27 17:14:02.83
return値をどうやって受け取るのですか?

79:デフォルトの名無しさん
12/09/27 17:22:27.59
(´・ω・`)知らんがな

80:デフォルトの名無しさん
12/09/27 17:24:33.50
超能力

81:デフォルトの名無しさん
12/09/27 17:32:10.12
>>77
return 先のコード書いてみな

82:デフォルトの名無しさん
12/09/27 17:39:54.69
>>77
returnが無ければ、例外を飛ばせばいいじゃない

83:デフォルトの名無しさん
12/09/27 22:26:12.35
#define SETTING_TEXT "setting.txt"
#include <fstream>
#include <iostream>
using namespace std;

class Setting {
  int count;
public:
  Setting() {
    ifstream in(SETTING_TEXT);
    if(in) {
      in >> count;
    } else {
     cerr << SETTING_TEXT << ": " << strerror(errno) << endl;
      exit(1);
    }
    in.close();
  }
  ~Setting(){}
  int getCount() const
  {
    return count;
  }
};

int main() {
  Setting s;
  cout << s.getCount() << endl;
  return 0;
}

84:デフォルトの名無しさん
12/09/27 22:32:26.94
必要なのは getCount であって return ではないな
もしかして初期化子を知らないのか?

# 知らなくても代入でどうにでもなるが

85:デフォルトの名無しさん
12/09/28 00:34:03.06
C++でゲームを作っていて、継承について質問です。

スーパークラス
┠サブクラス
┃┠サブサブクラス
┃┗サブサブクラス
┗サブクラス
┠サブサブクラス
┗サブサブクラス

という感じの「継承したクラス」を継承したクラスがあり、
そのインスタンスがあったとして、
スーパークラスのポインタとして受け取ったそのサブサブクラスのアドレスからサブクラスの型を判断するにはどうしたらいいでしょうか?
サブクラスのコンストラクタなどで型の変数を初期化するのではなく内部的な仕組みで出来る方法があれば教えてください。

言葉でうまく説明できないので用途も書きます。

スーパー・・・装備クラス(アイテムスロットを配列で持ちたい)
サブ・・・装備の種類クラス(アサルトライフル~など)
サブサブ・・・装備クラス(M4A1~など)
という感じで表現して、
「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」
という判定をしたいんです。

ゲームスレのほうがいいとは思ったのですが、処理だけ見ればC++に機能そのものなのかなと思いゲームスレではなくこちらで質問させていただきました。
よろしくお願いします。

86:デフォルトの名無しさん
12/09/28 00:38:49.01
基底にvirtual bool IsGun()を作るとか
dynamic_castするとか

87:デフォルトの名無しさん
12/09/28 00:41:47.86
>>85
つtypeid
つdynamic_cast

88:デフォルトの名無しさん
12/09/28 00:43:16.44
typeinfoしか思いつかないなあ

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

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

90:デフォルトの名無しさん
12/09/28 00:47:14.91
使えねーよ

91:デフォルトの名無しさん
12/09/28 00:50:04.04
はっきり言うが設計間違えてるからやり直し

92:デフォルトの名無しさん
12/09/28 01:01:12.06
>>85
特に速度が必要ないならdynamic_castでNULL判定が楽

93:デフォルトの名無しさん
12/09/28 01:19:46.33
>>91
俺もそう思うが、設計スレじゃないし、いいんじゃね?

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

95:デフォルトの名無しさん
12/09/28 09:42:12.28
ガチ素人ですがいろいろ聞いていいですか?

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

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

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

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

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

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

101:デフォルトの名無しさん
12/09/28 21:02:35.97
dynamic castするくらいならquery interfaceするわ

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

103:デフォルトの名無しさん
12/09/28 21:07:54.40
具体的な情報が必要な抽象化とかわろす

104:デフォルトの名無しさん
12/09/28 21:24:09.55
query interface は結局 dynamic_cast だろw

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

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

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

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



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

110:85
12/09/28 22:49:22.65
URLリンク(codepad.org)
こんな感じです。
3ウェイハンドシェイクとか忘れてください。

111:デフォルトの名無しさん
12/09/28 23:03:22.83
そうとう重症だなこれは

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

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

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


113:デフォルトの名無しさん
12/09/28 23:20:46.27
Equipにvirtual int GetSlot();を実装

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

とでもしとけ


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


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

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

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


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

117:デフォルトの名無しさん
12/09/29 19:30:44.75
MinGWでWin32APIを使っての開発を行っています。

URLリンク(codepad.org)

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

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


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

119:デフォルトの名無しさん
12/09/29 20:39:33.01
汚たねぇブロック配置だな

120:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/09/29 22:04:53.87
>>117
Windowsでは一般にGetしたものはReleaseするものであってCloseするものじゃない

122:デフォルトの名無しさん
12/09/29 22:19:24.47
お二方アドバイスありがとうございます。

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

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


123:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/09/29 23:34:58.93
>>123
!!!!!!!!!!!!!!!
!!!ありがとうございます!!!
!!!!!!!!!!!!!!!


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

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

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

128:デフォルトの名無しさん
12/09/30 18:14:35.99
Qtを使うのならVisualStudioは要らんな。

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

130:デフォルトの名無しさん
12/09/30 23:25:32.80
フリーのリソースエディタ

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

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

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

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

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

134:デフォルトの名無しさん
12/10/06 10:04:45.03
if(((char *) p - (char *) 0) % align == 0) Good();


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

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

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

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

139:デフォルトの名無しさん
12/10/06 14:00:22.33
つ ptr_diff_t

140:デフォルトの名無しさん
12/10/06 14:10:00.90
>>139
それも同じでサイズが足りる保証はない

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

142:デフォルトの名無しさん
12/10/06 14:16:29.60
>>141
>>135

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

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

147:デフォルトの名無しさん
12/10/06 15:18:29.08
143だった

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

149:デフォルトの名無しさん
12/10/06 15:25:20.34
俺はuintptr_tに突っ込んでます

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

151:デフォルトの名無しさん
12/10/06 15:40:19.14
>>146
それが何かおかしい?

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

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

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

155:デフォルトの名無しさん
12/10/06 16:33:19.07
URLリンク(www.kouno.jp)
それだけがんばってもこういう環境ではうまくいかない件

156:デフォルトの名無しさん
12/10/06 16:38:05.76
そんなマニアックな環境はボイコットしろ

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

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

159:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/10/06 19:02:42.60
>>158
アライメントの定義は下位ビットでしょ?
問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
キャストできるならその答えは Yes になる

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

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

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

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

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

164:デフォルトの名無しさん
12/10/06 20:13:57.58
VC は alignas ないんだっけ

165:デフォルトの名無しさん
12/10/06 21:02:33.91
ない

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

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

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


169:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/10/07 06:40:26.51
algorithmのfind()を使えば?
それとc++なら、std::coutを使いましょ

171:デフォルトの名無しさん
12/10/07 06:43:55.38
templeteがまずい

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

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

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

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

175:デフォルトの名無しさん
12/10/07 08:43:31.39
>>174
URLリンク(ideone.com)
本当に返してるかきちんと調べたか?

176:デフォルトの名無しさん
12/10/07 08:56:18.78
>>173
emacsを使ってますが色の意味が分かりませんでした……

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

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

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

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

180:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/10/08 15:47:59.92
バルバロス「バオーwwwwwwwwwww」

182:デフォルトの名無しさん
12/10/08 15:49:24.24
ルポニ「ランーーwwwwwwwwwwwwww」

183:デフォルトの名無しさん
12/10/08 16:02:19.90
コナニゾ「ムゾコナwwwwwwwwwww」

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

Javaですが、以下のページと同じように作っています。
URLリンク(www.cs26.scitec.kobe-u.ac.jp)

185:デフォルトの名無しさん
12/10/08 21:45:15.74
ラゾコンナ「ンババババwwwwwwwwwwwwwwww」

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

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

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

188:デフォルトの名無しさん
12/10/08 23:25:28.29
>>186
ソケットの値も確認しました。recvで①のソケットで受信していて、sendで①のソケットを指定しているのに②に送信されます
スレッド開始など省いていますが、以下のようなソースです。事情があって受信したデータの解析・送信はメインスレッドのクラスにある関数を使っています。
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:デフォルトの名無しさん
12/10/08 23:26:54.96
すみません、ソース書いてる途中に間違って送信してしまいました。
>>1のサイトを使ってもう1回書きます。

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

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

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

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

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

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




192:デフォルトの名無しさん
12/10/09 01:35:08.28
実は java という気がします

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

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

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



195:デフォルトの名無しさん
12/10/09 23:35:01.10
パゾコナン「マニアwwwwwwwwww」

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

197:デフォルトの名無しさん
12/10/09 23:40:12.58
コナニーゾ「ハラバロwwwwwwww」

198:デフォルトの名無しさん
12/10/10 00:00:03.89
uyうぜーよ消えろ

199:デフォルトの名無しさん
12/10/10 00:09:00.78
コナニール「バンバンwwwwwwwwwwwww」

200:デフォルトの名無しさん
12/10/10 00:42:56.19
uyって朝鮮人だってな


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch