2012年09月プログラム33: 【初心者歓迎】C/C++室 Ver.80【環境依存OK】 (550) TOP カテ一覧 スレ一覧 2ch元 削除依頼
C#は糞2.0 (802)
C++相談室 part98 (372)
Pythonのお勉強 Part47 (755)
C#は糞2.0 (802)
<XML総合 part="3"/> (756)
【会津】パソコン甲子園2004【若松】 (779)

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


1 :2012/09/21 〜 最終レス :2012/11/02
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.79【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1341052801/
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
NG推奨:◆QZaw55cn4c

2 :
余裕の2ゲットモナ(´∀`)

3 :
>>1


4 :
>>1乙ー
998 名前: 忍法帖【Lv=40,xxxPT】(1+0:5) [sage] 投稿日:2012/09/22(土) 01:28:45.67
蒼樹うめ
1000 名前: 忍法帖【Lv=40,xxxPT】(3+0:5) [sage] 投稿日:2012/09/22(土) 01:29:51.89
うめてんてー
↑うめてんてーって言う埋め方って一般的なもんなの?

5 :
AAもあるよ
                      _ / \ _
                     / /    {┳ }
                     >{、     ,>-<
                   // -\__/ -ヽ \     、_、-‐     1
      ゝ       ┐    .  {  |⊂⊃ i  ⊂⊃|  }       }  、   T¨Τ
     , -―、   {_ノ―、     \ヽ 「 ̄ ̄ フ  / /     、-7 ̄   г¨Τ二7
    ´   }  /∨   }   r─\ ゝ ─ '  厶二⊃       / \    ΓΤ J
      _ノ   ヽハ _ノ      ̄`|  ̄ ̄ ̄ ̄  `ーァ    /    ヽ、    |
                      \       /
                       >、___ イ
                       し′  し′

6 :
>>5
いやひだまらーだしうめ先生は知ってる
C++スレにまで出てくるとか(埋めレスとして)汎用性高杉

7 :
多数がNGワードにしてるワードを>>1 に入れるのやめようや
一部を伏せ字にするとかさ工夫してくれ

8 :
俺はNGNameでNGにしてるから>>1はNGにならない

9 :
NGNameにはしてないけどNGWordにはしてる。

10 :
だから NGName にしとけって暗に言われてるんだろ…

11 :
いや言及してるレスの方が
はるかにウザイから

12 :
たしかにw

13 :
せめて二文字

14 :
>>1をNG除外にしてるから何書かれようと問題ない

15 :
>>14で出てた(当方Jane使い)

16 :
なぁ、C++とかのオブジェクト指向プログラミングって
俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど
要は、親玉(Objectクラス)は、子供(継承したクラス)の
情報をしってて、親玉から子供の情報を知りたい時にキャストして
子供の情報を得る。
ってな感じで良い?
まぁ、オブジェクト指向のなんたるかを語りだすと
色んな人が色んな例えして、どーでも良くなったりすんだけどね。

17 :
VS10 C++ です。
BOOL hoge(CString& sValue)
{
sValue = _T("");
}
CString& sValueは参照変数で空文字で初期化を行なっていますが、MFCの使えない環境で
BOOL hoge(char& sValue)
{
//
}
このような場合のchar& sValueの初期化を行うにはどのように書いたらいいですか。

18 :
お前の言う初期化とはどういう状態になることなんだ

19 :
アホ
どう言うも何も参照で取ってんだから
sprintf(sValue,"");
で十分じゃん

20 :
>>17
文字列を空にしたいってことでしょ?
char*&sValueでsValue[0]="\0";
じゃないかな

21 :
あ、&いらなかった

22 :
>>17ですが、
>>19>>20も全部エラーになるお、やりたいことは>>20と一緒
参照渡しの文字列を空にしたいのですが

23 :
>>22
>>17の通りなら参照渡ししてるのは文字であって文字列では無い
まず引数をchar*sValueにするところから変更しなきゃ

24 :
>>19
いけず

25 :
>>22
hoge厨は初期化しなくていいから回線切れ

26 :
文字(char)なのか文字列(char*)なのかどっちなのか

27 :
文字列だお

28 :
>>17
お前hogeとか使ってて恥ずかしくねーの?
本物のゴミか?

29 :
>>28
しつけーぞhage

30 :
>>17
hogeを覚える暇はあってもコーディングの技術を身に付ける暇はないとかマジでクズ。
お前みたいな奴社会にいらないよ。

31 :
MFCが使える使えないに関わらず、std::stringを使えばいいじゃん。

32 :
#ifdef _UNICODE
typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif

33 :
もしかしてエラーの内容ってcharじゃなくてwchar_t使わなきゃいけない(もっと言えばTCHAR)だけだったりして

34 :
>>17
おい愚図
お前みたいな愚図は学校や職場では
陰でRばいいのにって言われてるんだろうな
本人気づいてないけどうちの職場にもいる

35 :
>>34
ただの悪口なら気付かなくてもいいんだけど、
>>17みたいな基地害は迷惑で言われるんだからさっさと消えて欲しい。

36 :
>>17












hogeとかヴァカじゃねおまえ

37 :
>>22
キチガイが何でこのスレにいるの?

38 :
えっ

39 :
>>22
お前の存在自体がエラーwwwwwwww

40 :
>>17も可哀想な奴だと思うよ。
親がゴミみたいな奴だからロクな教育受けてこなかっだんだろ。
しかも本人自覚ないみたいから余計に可哀想。

41 :
もう全部unicodeで統一してくれないかな

42 :
>>28
本物のの hage が聞くんじゃない

43 :
>>17
ここは池沼用掲示板じゃねーんだよ
養護学校できけ精神異常

44 :
>>42は髪が薄くなり始めてるのに気付いてない。

45 :
散りゆく髪に未練などないさ俺たちは中高年
遠く弾けるドラム缶それが俺たちのオイルショック
吹き飛ばせるわけないだろ
体重計の秤量は 100kg 悪気もなく俺たちを
いぇいぇー ぶげらー

46 :
>>40
>>17みたいな本物のゴミは自覚症状ないからある意味幸せだろ

47 :
生きていたけりゃ 飲むしかないのさ
あいつはいつも俺にそういってた
そんなあいつがホスピスにいやがる
それでもいいさ楽になれたのなら
バイバイ マイ ライバル
バイバイ マイ エネミー
バイバイ マイ ボイド
灰が落ちる そしてまた「明日」はくる
俺は吐き血が混じる
いつかバブルを忘れちまうだろう
それは俺もおなじ
woo woo wooo 只じゃ買えない
家も買えない Rも行けない
woo woo wooo それでも消費税は
申告 せにゃならん おーいぇーべべー
# 銃声

48 :
>>17
hogeとか書いて本当に恥ずかしくないの?

49 :
またhoge嫌厨が沸いたか

50 :
win32スレと同じだな

51 :
こっちのほうがまだマシだな
向こうは常に荒れてるけど
こっちはhoge厨が湧かない限り荒れてない

52 :
やってるやつは同じじゃねぇの?
そっくりなんだが

53 :
同じだろうと同じじゃなかろうとどっちでもいいよ。
Hogeが来なければ荒れないみたいだからそれを祈るばかり。

54 :
piyo厨も入れてやれ

55 :
相変わらずhogeに対する凄まじい憎悪だな
そろそろコテ付けろよww

56 :
hogeをngに入れとけばいいだろ

57 :
それじゃ >>34 >>35 >>37 >>39 >>40 >>43 >>46 は消えねーだろww

58 :
>>57
連鎖あぼーんにすればおk

59 :
>>57
連鎖あぼーんとかない?
ブラウザによるのかな。

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

61 :
>>60
>侮蔑語をNG
「エラー」とか「ゴミ」とかはまだ普通に使う可能性がある単語だろ……

62 :
それはNGしなけりゃいいだろ
それでも目に入る煽りはかなり低減できるだろ
100%クリーンな世界なんてないんだからそのくらいいいと思うけどね
とりあえずHOGE連鎖あぼーんでかなり減ると思うぞ

63 :
>>60
ここに質問に来るような初心者は大抵初見だろw
毎回発狂するキチがコテつけりゃ済む話

64 :
キチガイがコテつければ済む話だがキチガイがわざわざつけてくれるのか?
現実的でない。

65 :
初見と初心者とか感激なくホゲ使っててまともな質問見たことねーな。
全ホゲあぼーんで問題なし。

66 :
できるだけまともな日本語でどうぞ。いや、そもそも個人の感想なんてどうでもいいのだけれど。

67 :
>>66は自分ではまともな日本語で書き込んでると思ってるのかなw

68 :
>>63-65あたりを煽るために
わざと珍妙な日本語で書いてんだろ
お前釣られてんだよ

69 :
スレ住人「あぼんするのでコテつけてください!」→マジキチ「了解です!コテつけます!」
性善説をこじらせるとこういう流れが妄想できるようになるの?

70 :
俺はhoge厨もアンチも両方スルーできるけど、気になる奴はとりあえずNG設定しとけばいいんじゃね
hogeならNG設定しても困らんだろ

71 :
RR

72 :
class Hoge* g_hoge;//クラスのグローバルポインタ
class Hoge
{
public:
virtual void func(){printf("Hoge World!\n");
}
class Fuga : public Hoge
{

73 :
おう間違えた
もういいや、寝る

74 :
なにしとんねん

75 :
VisualStudio2010でプロジェクトをビルドすると
・"Debug\test.unsuccessfulbuild" のタッチ タスクを実行しています
・すべての出力が最新のものです。
・ファイル "Debug\test.unsuccessfulbuild" を削除しています。
という警告メッセージ?がでます。
Explessから移行したばっかなので何がなんだかわからないのですが、どういうものなのでしょうか?

76 :
リモートから見る時unsuccessfulbuildが存在すればビルドに失敗したんだなってわかるようになってる
普通に使ってれば気にしなくていい

77 :
なぜコンストラクタは、returnでエラーをかえせないのですか?
exit()は、できる。

78 :
return値をどうやって受け取るのですか?

79 :
(´・ω・`)知らんがな

80 :
超能力

81 :
>>77
return 先のコード書いてみな

82 :
>>77
returnが無ければ、例外を飛ばせばいいじゃない

83 :
#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 :
必要なのは getCount であって return ではないな
もしかして初期化子を知らないのか?
# 知らなくても代入でどうにでもなるが

85 :
C++でゲームを作っていて、継承について質問です。
スーパークラス
┠サブクラス
┃┠サブサブクラス
┃┗サブサブクラス
┗サブクラス
┠サブサブクラス
┗サブサブクラス
という感じの「継承したクラス」を継承したクラスがあり、
そのインスタンスがあったとして、
スーパークラスのポインタとして受け取ったそのサブサブクラスのアドレスからサブクラスの型を判断するにはどうしたらいいでしょうか?
サブクラスのコンストラクタなどで型の変数を初期化するのではなく内部的な仕組みで出来る方法があれば教えてください。
言葉でうまく説明できないので用途も書きます。
スーパー・・・装備クラス(アイテムスロットを配列で持ちたい)
サブ・・・装備の種類クラス(アサルトライフル~など)
サブサブ・・・装備クラス(M4A1~など)
という感じで表現して、
「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」
という判定をしたいんです。
ゲームスレのほうがいいとは思ったのですが、処理だけ見ればC++に機能そのものなのかなと思いゲームスレではなくこちらで質問させていただきました。
よろしくお願いします。

86 :
基底にvirtual bool IsGun()を作るとか
dynamic_castするとか

87 :
>>85
つtypeid
つdynamic_cast

88 :
typeinfoしか思いつかないなあ

89 :
要するに.NETで言う所のリフレクションみたいな機能が欲しいんだろうと予想するけど
C++11ならdecltypeって使えるな

90 :
使えねーよ

91 :
はっきり言うが設計間違えてるからやり直し

92 :
>>85
特に速度が必要ないならdynamic_castでNULL判定が楽

93 :
>>91
俺もそう思うが、設計スレじゃないし、いいんじゃね?

94 :
>>91
どんな感じにすればいいですか?

95 :
ガチ素人ですがいろいろ聞いていいですか?

96 :
そういうのは、サブクラス側に
bool canEquip(SlotType)
みたいな関数を用意すればいいんじゃね。

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

98 :
まるで頭悪い発言スレだな
>>87 で FA

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

100 :
何のための dynamic_cast や
ダウンキャストしてでも派生した方が良い場合もたまにある
ただ、今回がそれかどうかは別の話だが

101 :
dynamic castするくらいならquery interfaceするわ

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

103 :
具体的な情報が必要な抽象化とかわろす

104 :
query interface は結局 dynamic_cast だろw

105 :
JavaだのC#だのはobjectに値を突っ込んで
ダウンキャストで取り出すなんて日常茶飯事

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

107 :
>>106
言いたいことがさっぱりわからんというかESPしても誤解が誤解を生むだけだから
なんか疑似コードでも書いておくれ

108 :
>>97
アイテムスロットに登録する人、つまり型情報から判定を行う人は誰?
スーパークラス?


109 :
まあ、装備の種類みたいなのはクラスで分けずに
パラメータ化するのが普通じゃね

110 :
http://codepad.org/fp98nlIJ
こんな感じです。
3ウェイハンドシェイクとか忘れてください。

111 :
そうとう重症だなこれは

112 :
>>110
ちょっとぉ、だいぶ>>85のイメージと違うんだけど。。。
ま、それはさておき、そのコードであれば素直に属性として、「種類」や「名称」を持つのが普通かなと思う。
その相互依存はいくない。

113 :
Equipにvirtual int GetSlot();を実装
Equip[tmpWeapon->GetSlot()] = tmpWeapon;
とでもしとけ

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

115 :
メソッドチェイン用に外部に保持されないプロクシを作れないだろうか
// ok
obj.Proxy().Method();
// ng
auto proxy = obj.Proxy();
proxy.Method();

116 :
プロキシクラスのコンストラクタをprivateにしてプロキシを返す関数とかをfriendにすれば

117 :
MinGWでWin32APIを使っての開発を行っています。
http://codepad.org/fDEMyIto
aaa()以降の標準出力が使用できず困っています。
WriteConsole()を_tprintf()としても同様です。
標準エラー出力(STD_ERROR_HANDLE)であれば何故か正常に出力が出来ます。
アドバイスお願いします。

118 :
だって自分で閉じてるじゃん。
何が疑問なのかわからないくらい。

119 :
汚たねぇブロック配置だな

120 :
template <class X> class Bob {
friend class X;
private:
void Fuck();
};
class Alice {
Bob<Alice> bob;
public:
void DoSomething() { bob.Fuck(); }
};
こういうふうにfriendに出来る対象をテンプレートで指定したいんですができません
どうすればうまくいきますか?

121 :
>>117
Windowsでは一般にGetしたものはReleaseするものであってCloseするものじゃない

122 :
お二方アドバイスありがとうございます。
>>118
GetStdHandle()をCreateConsoleScreenBuffer()のような感覚で使っていました。
改めて考えるとおかしいですね。
>>119
お目汚し失礼しました。
C++を学習し始めたばかりですので、お手本お願いできますか?

123 :
>>120
11ではclassを書かずに
friend X
03では適当なクラスを介して
template<class T>
struct friend_template
{
typedef T type;
};
friend class friend_template<X>::type;

124 :
>>123
!!!!!!!!!!!!!!!
!!!ありがとうございます!!!
!!!!!!!!!!!!!!!

125 :
>>115
コピーコンストラクタなどをprivateにしてもauto&&で持つことが出来るよそれ

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

127 :
残念ながらExpressにはリソースエディタがない
リソースファイルはテキストで直接編集するしかない

128 :
Qtを使うのならVisualStudioは要らんな。

129 :
ゲームなら自前で全部描画が基本じゃね

130 :
フリーのリソースエディタ

131 :
任意のEXEから呼出されるDLLで作成する
スレッドとファイバのスタックサイズを
4KB未満に小さくするにはどうすれば良いですか?
SetThreadStackGuaranteeというので最小スタックサイズを
変えられるようですが、小さくできないようだし、
64ビットのみだし。
32ビットXPでできる方法はありませんか?

132 :
ファイバーは知らないけど、スタックはスレッド固有の領域だから
ページサイズ以下には出来ないんじゃないの?
仮に出来てもページサイズ単位になるだろうし

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

134 :
if(((char *) p - (char *) 0) % align == 0) Good();

135 :
なるほど、NULLがアドレス0ならばこれでアドレスを求められるわけですね。目から鱗です。

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

137 :
>>136
何度も議論されてるようにintptr_tではサイズが足りる保証はない

138 :
>>136
それはイテレーター全般の話だろ
ポインタはvalid rangeじゃなくてもオフセットを取得出来る

139 :
つ ptr_diff_t

140 :
>>139
それも同じでサイズが足りる保証はない

141 :
オフセット取得でサイズが足りなくなる例を一個示してくれ
何度も議論された成果を1行で示すくらい、簡単だろう?

142 :
>>141
>>135

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

146 :
>>134 から始まって、最初に規格書から「配列オブジェクト」を持ちだしたのは>>144だろ

147 :
143だった

148 :
それで、結局のところ「安全にアドレスを整数変換できる方法」はどうすればいいんですか?
あなたたちはあれはだめこれはだめというばかりで一向に話を進めようとしないじゃないですか

149 :
俺はuintptr_tに突っ込んでます

150 :
「安全にアドレスを整数変換できる方法」は環境依存しないかぎり存在しない
intptr_tかuintptr_tがあればそれを使うのが安全

151 :
>>146
それが何かおかしい?

152 :
std::sprintf(buf, "%p", p);
if(BigInt::FromString16(buf) % align == 0) Good(); // EXCELLENT!!

153 :
%pでの出力形式は実装定義だからあんまり意味ないな

154 :
if(BigInt::FromBytes((unsigned char *) &p, sizeof(p), ByteOrder::Check()) % align == 0) Good(); // Amazing!!!

155 :
http://www.kouno.jp/home/c_faq/c5.html#17
それだけがんばってもこういう環境ではうまくいかない件

156 :
そんなマニアックな環境はボイコットしろ

157 :
>>133の環境に限定するならUINT_PTRにでもキャストすればいいんだけどな

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

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

160 :
>>158
アライメントの定義は下位ビットでしょ?
問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
キャストできるならその答えは Yes になる
どうせ上司あたりから受け取ったポインタのアライメントを確認するように!と
言われたんだろう。
「x86ならアライメントエラーにならないから平気ですよ」と言い返そう
そのあと「あ、ARMだと例外おきますね。ARMも対応するんですか?なら直してきます」
と言って席に向かおう

161 :
>問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
>キャストできるならその答えは Yes になる
ポインタを整数にキャストできることは保証されているが、それがアドレスか
どうかは規定されてないだろ。

162 :
ARM対応予定はないけどSSE使うから直せとか言われるオチ

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

164 :
VC は alignas ないんだっけ

165 :
ない

166 :
ポインタのアラインメントっていわれると&pのアラインメントを思い浮かべちゃうんだけど

167 :
ん?それでいいんじゃないか?
それともポインタ変数のアライメントのことを言ってるのか?

168 :
void * p; &p;ってことね
アドレスのアラインメントっていってくれたほうがわかりやすい

169 :
プログラミング言語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 :
algorithmのfind()を使えば?
それとc++なら、std::coutを使いましょ

171 :
templeteがまずい

172 :
>>169
×templete
○template
あとsizeof(elems)は配列の要素数を返さないのでそれじゃまともに動かないよ

173 :
>>169
とりあえず初心者はVC++かeclipse使って色付けてもらえよ
そしたらこんなしょうもないエラーに悩まされることはないはずだから

174 :
>>170
多分標準ライブラリがあると思ったのですが、
言語の機能を学びたいとおもいこんなことをやっています。
>>171,172
> ○template
それでした、下らなくてすんません
sizeofは自分もそう思ったのですが、
char[]の配列をいくつか作って試してみた限りでは
きちんと配列の長さを返してくれたのでそのままにしてあります
これって仕様に無い実装依存の挙動だったりするんですか?

175 :
>>174
ttp://ideone.com/7CRnJ
本当に返してるかきちんと調べたか?

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

177 :
>>176
配列は通常の方法では関数に渡せないからね。渡しているのはポインタ。
関数内で配列のサイズを知りたければ、テンプレート引き数として配列を渡す位しか手がないよ。

178 :
>>177
まあそうなんですが
直接書いて長さ返してくれるなら
インラインは最終的に直接書いたのと同じにならないかなー、と思ったんですが
やっぱりこういうのはあんまりやらない方がいいですね

179 :
>やっぱりこういうのはあんまりやらない方がいいですね
バグの温床になるからしない方が良いかと。

180 :
>>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 :
バルバロス「バオーwwwwwwwwwww」

182 :
ルポニ「ランーーwwwwwwwwwwwwww」

183 :
コナニゾ「ムゾコナwwwwwwwwwww」

184 :
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 :
ラゾコンナ「ンババババwwwwwwwwwwwwwwww」

186 :
>>184
send( ), recv( ) の直前でソケットの値表示して、本当に正しいソケットに
対して操作しているか確認しなよ。
もしくは、ソースさらして。

187 :
>>184
えーと、サーバ側アプリを書いているんだよね?
受信したスレッドと送信したスレッドはきちんと把握できている?
ひょっとしたら、メインスレッドで受信してメインスレッドで送信しているんじゃない?

188 :
>>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 :
すみません、ソース書いてる途中に間違って送信してしまいました。
>>1のサイトを使ってもう1回書きます。

190 :
ttp://codepad.org/tzuheXNf
先にも書きましたが、受信データの解析・送信はメインスレッドのあるクラスの関数でおこなっています。
SOCKETを渡して、それをsendに指定しているのですが、もしかしてメインスレッドのクラスでsendしているのが問題なのでしょうか

191 :
>>188
>  CThread* cthread = new CThread( socket2, this );
>  cthread.start();
ホントにソース書いてる?
cthread->start(); じゃなくて?
イメージは間違ってないと思うが、こういう細かいところでミスってるんじゃないのか?
て言うか、人に見てもらうならせめてコンパイルエラーにならないソースを上げてよ…


192 :
実は java という気がします

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

194 :
サブスレッドで受けた後
メインスレッドで処理して
間違ったサブスレッドで送り返していたと


195 :
パゾコナン「マニアwwwwwwwwww」

196 :
>>180
おお、これはすごい
勉強になります
ありがとうございます

197 :
コナニーゾ「ハラバロwwwwwwww」

198 :
uyうぜーよ消えろ

199 :
コナニール「バンバンwwwwwwwwwwwww」

200 :
uyって朝鮮人だってな

201 :
初歩的な質問で申し訳ないのですが、以下のサンプルでひとつ疑問があります。
#include <iostream>
using namespace std;
void f(int *j);
int main()
{
int i;
int *p;
P=&i;
f(p); //ここがわからない
cout <<i
return0;
}
void f(int*j); //ここがわからない
{
*j = 100;
}
というプログラムでなぜ*jにpを入れることができるのか分かりません。
*jはアドレスjにある値で、pはアドレスですよね?
なぜアドレスを値に代入できるのでしょうか?

202 :
R
臭い質問すんなゴミ

203 :
>>201
*j には入れてない
j に入れている

204 :
ナロコロ「バーローwwwwwwwwwwww」

205 :
>>201
関数の引数は代入ではなく変数の宣言と同じ
*j=p; ではなく
int *j=p; と同じ(おおまかには int *j; j=p; と同じ)

206 :
ルポナニ「バロバローwwwwwwwwwwwww」

207 :
>>205
>関数の引数は代入ではなく変数の宣言と同じ
というのがよくわからんのですが、何か良いサイトや本はありませんか?
俺が読んでいる本は標準講座C++(ハーバート・シルト著です。
上記のようなことはざっと見た限り載っていませんでした。

208 :
ナロバリア「バロスwwwwwwwwwww」

209 :
プラニア「ナバルアwwwwwwwwwwwwww」

210 :
>>201 >>207
変数宣言での*と、代入での*は意味が違うってことだと思う
前者は型の一部、後者はポインタ演算子
「int*」型を「int_ptr」型と読み替えると分かりやすいかもしれない

typedef int* int_ptr;
int main()
{
 int i;
 int_ptr p;
 p = &i;
 
 f(p);
}
void f(int_ptr j)
{
 *j = 100;
}

211 :
ある所がわからないってのは、そこより前段階の基礎的な所をわかったつもりでわかってない(間違って理解している)ことが原因のときもあるな

212 :
パルパニア「ニアアwwwwwwwwwwwww」

213 :
ニニル「バーロウwwwwwwwwwwwww」

214 :
コナニ「ウハーwwwwwwwwwwwwwwwww」

215 :
関数中のstatic変数はスタックでしょうかヒープでしょうか?
いわゆるシングルトンもそれと同じになると考えて問題ないですか?

216 :
スタックでもヒープでもない
シングルトンはデータの置き場所としては普通の変数と同じだけど
初期化コードの必要性によって事情が変わる

217 :
スタックでもヒープでもなく、初期化コードの必要性?で変わるとなると一気にわからなくなりました
どう理解すべきでしょうか?

218 :
伝統的なメモリモデルは次の形をとる。
text+data+bss+heap+stack
textはコード
関数中のstaticな変数も含めて生存期間がプログラム実行時と同じ変数はdataかbssに置かれる。
なお実行可能ファイルに含まれるのはtextとdata。
>>216
>初期化コードの必要性によって事情が変わる
というのはdataにおくかbssにおくか、の判別を指すと思う。
適当な参考書籍やurlはよくわからない、すまない。

219 :
データのおき場所は宣言の仕方によってことなる
初期化コードの内容によって宣言の仕方が変わる

220 :
>>219
>初期化コードの内容によって宣言の仕方が変わる
適当な例を思い浮かべられないのだが?

221 :
初期化/終了タイミングがどうでもいいならただのstatic変数、重要ならshared_ptrを使うみたいな感じ

222 :
>>221
破壊のタイミングをしっかり管理したいときになんでshared_ptrなんだよ

223 :
>>215
> 関数中のstatic変数はスタックでしょうかヒープでしょうか?
まず規格上の言語仕様にはスタック領域・ヒープ領域といった実装レベルの概念に対する規定はない
よって全てはコンパイラの実装に依存する
そしていまどきのPC用のコンパイラの実装であれば少なくともスタック領域ではないところに配置されると思っていい
> いわゆるシングルトンもそれと同じになると考えて問題ないですか?
いわゆるがGoF本でのシングルトンパターンのことなら関数中のstatic変数を使って実装することになるので当然同じになる

224 :
>>222
少し考えればわかるよ

225 :
>>224
知りたくもない話だ。

226 :
>>201
*j に p を代入と言うのは、式で書けば *j=p と言う事だが、どこでそんな事をしている?
関数の引数で受けているところは、j=p 相当の処理だぞ?
int* j=p;
と同じね

227 :
大昔の C での関数宣言を思い出したよ・・・
void f(j)
int *j;
{ ...

228 :
そっちの宣言のが便利だよな

229 :
仮引数並びが型情報を持たないことがか?

230 :
>>215 >>217
「C言語 静的領域」でググってみれ
>>221
ねーよ
>>228
ねーよ

231 :
単純にスタック、ヒープ以外の領域がある、という理解でよさそうですね
ありがとうございます

232 :
void Func(typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v1,
typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v2
typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v3) { 〜
このくそったれな宣言が↓これだけですむんだぞ。どうみてもこちらのが便利だろ
void Func(v1, v2, v3)
typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v1, v2, v3; { 〜

233 :
>>232
君の好みに合う世界は金輪際実現しない

234 :
>>232
そのかわり引数のプロトタイプチェックは皆無になる(はず)なのだが

235 :
>>232 typedef は使えないの?

236 :
>>232
苦笑

237 :
遅いレスですみません。
>>226
>関数の引数で受けているところは、j=p 相当の処理だぞ?
というのがわからんのです。
一日無い知恵を絞って考えたんですが、仮引数の宣言に現れる*は、
ポインタ宣言の場合とおなじようにjがポインタ変数であることを示しているだけで、
単項演算子の*とは異なるという認識でよろしいのでしょうか?

238 :
      /  , -''"´     \
  / /  /  ,. ‐'''""~´ ̄ ̄\
 V /   /  /             }
  ∨ /  / ,,.. -一ァ',二二二{
   V  ,..,/ ,.ィ彳 f==<r'二二二{、    | ̄ ̄              __|__ |
   ∨| ヘ`<=''~   弋ッ-ミ'''テ~ナ/    |ー― \/ ´ ̄| 「 ̄`  |   | \/
    〉'| | ト、   i{   ,..`二/ =|/''′     |__ /\ 匚]__ !__,  |_ |  __/
   //ヽヽぅ   ヽ     {   =|
   //匚 ̄]〕       丶,-‐ ,>      ( そ の と お り で ご ざ い ま す )
  /´r┐|__,|ト、       、____`7´
__人..二.」'   l>、    ヽ`,二/
     ´"''ー-論\  ∠三ノ
―-、__        ``ヾニ='′
     `ヽ      /、
       |‐- ...__   /ヽ\_
         \    ̄   `ヽ \

239 :
>>203,205,210そして>>226と最初からみんなそういってたんだけどな

240 :
ただ、紛らわしいことに
int * a, b;
は、aはintのポインタ型だけと、bはintだから注意な
*aがintになる型、と考えるといいのかもね

241 :
>>240
不自然な仕様だよな

242 :
>>240
ポインタは型ではないから後者が正解。

243 :
>>242
typedefできるだろ?

244 :
int* a,b;

245 :
ttp://codepad.org/HDjLuFG3

246 :
やっぱ 
int *a, b;
で何の問題もないじゃん。

247 :
http://www.libjingu.jp/trans/bs_faq2-j.html#whitespace

248 :
わかりやすいのが一番

249 :
http://toro.open2ch.net/tech/
みんなこっち行こうず
IDあるほうがまだマシ

250 :
>>249
そこは「しようず」が多くて気持ち悪い

251 :
突っ込みどころ満載だし
早くも管理人行方不明じゃねーか

252 :
どこの方言?

253 :
2ch

254 :
全員じゃないからな

255 :
なんか偽ブランド品みたいで使いたくないな
アフィブログ用なんでしょ?そこ

256 :
クラスメンバの関数ポインタのvector配列の文ってどうすればいいんですか?
void (Admin::*ElementSelect)();
というのが関数ポインタなんですけど
void vector <(Admin::*ElementSelect)()> ElementSelectAry;
になるんでしょうか?

257 :
vector <void (Admin::*)()> ElementSelectAry;

258 :
>>257
ありがとう

259 :
素直にtypedef使えと

260 :
DLL←→EXE間でクラスのやり取りするにはどないすればええんでっしゃろ?

261 :
>>260
条件を限定しない一般論なら答えようがない
(あえていうなら一般論としてはやるな、になるけど)

262 :
COM使え

263 :
(あえていうなら一般論としてはやるな、になるけど)(キリッ

264 :
std::array< std::array<int, 3>, 3 > MyArray = {
{
{0, 1, 2},
{3, 4, 5},
{6, 7, 8}}
};
wcout << MyArray[2][2] << endl ;
こういう使い方ってしてもいいんですか?

265 :
それはダメですね
かなり危ないコードです

266 :
>>264
添え字の範囲を超えないようにするとかで正しく使うなら何の問題もない

267 :
うそ教えんな

268 :
UDKは世界でダントツに採用の多いエンジン使ってるから
学習材料として使ってるのが多い
アセットを作ること自体意味があって、アセットストア頼りとか真のクソ
あとグラフィックコンテンツ的な作品に使われるのも多い
世界でCEやUnityの10倍以上の使用者がいる つかUnityはゴミみたいな存在
スレッド数 http://www.polycount.com/forum/forumdisplay.php?f=38
UDK 1,330
Crytek Sandbox 134
Unity 67
日本でどうとかいってる低レベルのダニは駆逐されてほしい

269 :
どっちがどっち?

270 :
>>264
初期化の内容が要素数越えたらgccじゃエラーになったよ
別に安全だと思う

271 :
>>270
ありがと

272 :
class bar{}
template<class T>
class foo :public bar{
void func(boost::shared_ptr<T>);
}
このときbar形のポインタにfooのオブジェクトをnewして、
そのポインタからfunk(...)をキャストせずに使うことは出来ますか?

273 :
>>272
無理

274 :
>>273
キャスト必要なんですかね?

275 :
>>272
できません

276 :
>>275
ありがとうございました

277 :
ちょっとひねり加えれば出来るけど?

278 :
まぁ、キャストでもできるけど、普通は仮想関数を使う

279 :
>>278
仮装関数にしたいものの引数にテンプレート変数が入ってるんですよね…
設計ミスな気もします

280 :
>>279
ん?
なるほど、ポイントはそこか

281 :
>>277
無理だから
諦めて

282 :
>>272
どうしてもそれに近いことをしたいなら、
引数を工夫するために宣言を変えてくれ

283 :
>>272
struct a {};
template<class T> struct b : public a {
boost::shared_ptr<T> m;
何か
};
struct bar {
virtual void func(a&) = 0;
}
template<class T> struct foo : public bar {
virtual void func(a&arg) {
boost::shared_ptr<T> ptr = dynamic_cast<b<T>&>(arg).m;
}
}
main() {
b<int> x(何か);
bar* p = new foo;
p->func(x);
}

284 :
やっぱり何か違うな。
a か b に機能を持たせて丸投げすべきか。
そもそもfooもbarも作り直して考え直すのが良いか。

285 :
>>272
ttp://ideone.com/wSkTm
基礎設計はちょっと違うが(呼び出す時点では)キャストせずにfuncを使える
呼び出し側が引数の正当性を保障できるならdynamic_castの代わりにbar_に仮想関数を持たせずにstatic_castを使うこともできる

286 :
>>285
逸脱し過ぎじゃないか?

287 :
error LNK2001: 外部シンボル ""class A * m_ptest" " は未解決です。
fatal error LNK1120: 外部参照 1 が未解決です。
とかいうエラーがが直せません><
宣言はあるけど、定義はどこか分からない、とこういうエラーが出るらしいですけど、
該当部には
class A;前方宣言
extern A* m_ptest;エクスターンなんとか
m_ptest->func();←ここがエラー箇所
としていて、
別の箇所で
m_ptest = new A();
と定義をしているつもりなんですけど、どこか間違っているでしょうか?

288 :
m_ptest->func();
この時点でclass Aの宣言が全部見えてる必要がある

289 :
回答ありがとうございます。
class Aの宣言を書いたヘッダファイルをインクルードしてみたのですがNGでした。

290 :
どっかのcppにA* m_ptest;って書いとく

291 :
質問:今c++を勉強中でbcc developerを使っているのですが以下のコードでエラーが出る理由が分かりません。
エラー E2141 宣言の構文エラー と出ますが int main()の行なので間違いがあるとも思えず、困っています。
#include <iostream>
using namespace std;
int count(char str[], char ch)
int main()
{
char str[100];
char ch;
cout << "文字列を入力して下さい。\n";
cin >> str;
cout << "文字列から探す文字を入力して下さい。\n";
cin >> ch;
int c = count(str, ch);
cout << str << "の中に" << ch << "は" << c << "個あります。\n";

return 0;
}
int count(char str[], char ch)
{
int i = 0;
int c = 0;
while(str[i]){
if(str[i] == ch)
c++;
i++;
}
return c;
}

292 :
レスポンスありがとうございます。
それも別のクラスの宣言部に書いてたのですが、エラーが出てます。
別のクラスBのヘッダファイル中において、データメンバとして
A* m_ptest;
と書いておいて、
そのクラスBのcppファイル中、コンストラクタ内で
m_ptest = new A();
と定義してるつもりでした。
試しにWinMain関数の前にA* m_ptest;と書いたら
エラー無しで問題は解決したのですが、両者の違いが分かりません。
理解を深めるためにもお教えいただけないでしょうか。

293 :
int count(char str[], char ch);

294 :
class B {
A* m_ptest;
};
A* m_ptest;
上の二つは別物です
extern A* m_ptest;
は後者を指してるので定義がないとエラーになります

295 :
>>293 解決しました!見逃していました、ありがとうございます。

296 :
>>294
AはBを構成する部品の一つなので、包含関係かなと思って、
Aのインスタンスm_ptestをBのデータメンバとしていました。
ですが、Aのメンバ関数をBよりも外の箇所で使用したくて、
extern宣言、ヘッダファイルのインクルードなどで、なんとか出来ないかとしていたところ、
上記のエラーが出て困っていました。
全く別物を指していたとは・・・スコープというものでしょうか、
調べてみます。
回答いただきありがとうございました。

297 :
>>279
そういうときはTypeEraserとNonVirtualInterfaceを併用することが多いね
インターフェースにテンプレートメンバ関数ライクな仮想関数を持たせたいときの典型的なパターンね
http://ideone.com/R7LtF

298 :
なぁ、C++とかのオブジェクト指向プログラミングって
俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど
要は、親玉(Objectクラス)は、子供(継承したクラス)の
情報をしってて、親玉から子供の情報を知りたい時にキャストして
子供の情報を得る。
ってな感じで良い?
まぁ、オブジェクト指向のなんたるかを語りだすと
色んな人が色んな例えして、どーでも良くなったりすんだけどね。

299 :
コピペしなくていいよ

300 :
>>298
お前の認識してるオブジェクト指向は全部間違ってる

301 :
コピペは程々にな

302 :
>>298
R初心者

303 :
std::listで後ろの方の要素を前に持ってきたいときはどうすればいいですか?
例えばこんな感じです。
std::list<int> ls;
ls.push_back(1);
ls.push_back(2);
ls.push_back(3);
ls.push_back(4);
ls.push_back(5); 先頭(1)-(2)-(3)-(4)-(5)終わり
となってるところで、先頭(1)-(4)-(2)-(3)-(5)終わり、とやりたいです。
単純にリンクの張替えで出来ると思ったのですが、やり方がわかりません

304 :
insertしてerase

305 :
corutineの実装がいろいろあるけど
(Hamigakiとか)
GPUを使うOpenCVとかと混ぜたらうまく動かないってことでいいのでしょうか

306 :
リンクの張り替えできないんだよね
ダサい仕様だが

307 :
>>298
その方法は基底をホルダーにした型消去であってオブジェクト指向プログラミングと直接の関係はない

308 :
非同期のMessageBoxを作って、タイムアウトしたら自動で閉じるなどの機能を実装しようと思っています。
自分で作ったウィンドウではなく、MessageBox関数を利用します。
そこでMessageBoxのウィンドウハンドルを取得したいのですが
1 CreateThreadで別スレッドを作成
2 別スレッドがMessageBox呼び出し
3 メインスレッドがEnumThreadWindowsで別スレッドのウィンドウを列挙
4 GetWindowTextでタイトル照合
 タイトルが一致するウィンドウがなければ3に戻る
5 取得したウィンドウハンドルは、タイムアウトしたらWM_CLOSEを送るなどに使用
CreateThreadで作成されたスレッドは
IMEが作ったウィンドウや、タイトルのないウィンドウが
あらかじめ作られているようで
タイトルによってはそれらと一致してしまうので
この手段が不確実です。
ウィンドウを列挙したり、文字列を比較するというのも
かなり無駄が多いです。
このような原始的な方法しか思いつかないのですが
他になにか良い方法はないでしょうか。

309 :
>>303
list<int>::iterator i1(ls.begin()), i2(ls.begin());
ls.splice(++i1, ls, ++ ++ ++i2);

310 :
Cのsscanfって、大文字小文字を無視する設定ってできないんでしたっけ?
sscanf(str, "ID%d", &id");
などとするとき、"ID100"からも"Id100"からも100を取り出したいのですが。

311 :
>>308
GetWindowThreadProcessId 使えばいい
ウィンドウクラス名とプロセスID調べれば誤爆はしないでしょ
時間で閉じるメッセージボックスは公開されてないがuser32.dllにあった気がする

312 :
>>310
一応 "%[Ii]%[Dd]%d" ってのはできる

313 :
>>312
"%*[Ii]%*[Dd]%d"と読み飛ばしてしまえば医院で内科医。
>>310
要求仕様が厳密でないなら↑の方法で。
厳密ならば("Id"や"iD"を許容しない)ならsscanf()一回だけでは無理。

314 :
条件分枝構文って
if else
swich
しかないのでしょうか
boostやstlでもっと複雑なことのできる条件分枝はないのでしょうか

315 :
3項演算子もwhile文もdo - whileもある意味条件分岐だろ

316 :
変数の実行時の型で分岐するポリモーフィズムはどうっすか

317 :
質問です。
同じ名前で引数が異なるローカル関数って作れますか?
hoge(enum hoge);
hoge(int hoge);

318 :
作れますよ

では次の方質問があればどうぞ

319 :
>>317
C++では同じ名前で引数が異なる関数は作れますが、ローカル関数が作れません
Cではローカル関数は作れますが、同じ名前で引数が異なる関数が作れません
よって作れません

320 :
どうしたらこのスレに書かれてることを理解できるレベルに到達できますか?
初心者向けの本は勉強したけど、全然わかりません。
やさしいC++をひと通りコード書いて理解しました。
int main(void)
とか、int main の中に何か入ってるものは何を意味してるのか分からないし
operator関数も難しいです。

321 :
>>315
論理演算子もある意味条件分岐。
>>317
C++ならね。

322 :
>>321
C++でも出来ねぇって
C++ 同名で引数が異なる関数 ○
http://ideone.com/Eezsy
C++ ローカル関数
http://ideone.com/UIJwh ×
C 同名で引数が異なる関数
http://ideone.com/kU4Dl ×
C ローカル関数
http://ideone.com/BHHFd

323 :
std::cout << "ほげ";
std::wcout << L"ほげ";
JavaからJNI(Java Native Interface)でc++のコードを使っていて、
デバッグ用にcoutを使ったら文字化けしてしまいました。
もしかしてコーディングが違うのでは?とか思いました。
調べてもよくわからないのですけど、おそらくJavaが用意したコンソールは、UTF16のビッグエンディアンなんじゃないかなと思いました。
なので、L"ほげ"というのをBigエンディアンに出来ないでしょうか?
LってのがLittleだったら、神がかってるなと思って、B"ほげ"にしてみたらやっぱだめでした。
Localeなのかな。
std::wcout.imbue()付近で調べればわかりますかね?

324 :
試しに
char b[] = {0x30, 0x7B, 0x30, 0x52, 0x00, 0x00}; //ほげ UTF-16BE
std::cout << b;
ってしてみたら

325 :
Cでもローカル関数は定義できない
ただしGCCとかの独自拡張ならできる
独自拡張ならば同名で引数が異なるローカル関数が定義できる処理系もあるかもね

326 :
>>320
正直、使ってみないと覚えない。
難しいとよく言われるCのポインタだって、勉強中はサッパリでも
実際に必要な場面を迎えると案外簡単に使えたりする。
あと、このスレに限らず、技術系のコミュニティって、
半分も理解してないけど参加してる、自分が混ざれる話題にだけ混ざるって人は多いよ。

327 :
class Interface {
public:
virtual void Release(void) = 0;
};
class Hoge : public Interface {
public:
void Release(void) { delete this; }
};
extern "C" __declspec(dllexport) IHoge * __stdcall Create(void) {
return new (std::nothrow) IHoge;
}
---------------
extern "C" __declspec(dllimport) IHoge * __stdcall Create(void) ;

これってDLLとEXEでvtableの構成が変わっちゃうかも、とか気にしなくていいの?

328 :
ハンドルとしてクラスのポインタを返す・ハンドルを受けて(中でクラスに戻して)操作
EXE側は ハンドルの中身をほぐしてクラス動作させることはない
という切れ目で DLL化したことはあるけど
class そのもののエクスポートが必要な要求っぽいね
(EXE側で ポインタ参照〜クラスのメソッドを呼び出したい)

329 :
>>327
CreateがIHoge*でなくInterface*を返して、
DLLとEXEでInterfaceを変更しなければ大丈夫じゃね
dllimport側でHogeはincludeしない(使わない)なら
dllexport側のHogeは変更してOK

330 :
#ifdef HAVE_CPP11
とか
#ifdef HAVE_CPP0X
みたいなことってできないの?

331 :
>>330
その処理系が11に対応してれば、オプションで変更可能になってる場合もあるんでね?

332 :
#if 201103L <= __cplusplus で出来ることになってるけど過渡期の現状ではいまいち
boostならBOOST_NO_CXX11_〜系のマクロで機能ごとに判別できる

333 :
vba用のdllをつくっています。C初心者です。
値をdllに渡して処理したあと、グローバル変数に値を入れておいて、
vbaから読み込みのフラグが立ったらその変数を戻すようにしているのですが、
グローバル変数は呼び出し速度が遅い等ネットで見かけます。
グローバル変数を回避して、ローカル変数のみで同様のことをするには
ざっくりどんなことをすればいいのでしょうか

334 :
handle = open();
proc(handle, p1, p2...);
v = get(handle);
close(handle);
的な感じにするとか

335 :
今度はけっこう前のスレからコピペしてきたな

336 :
math.hのsin()を使う場合と、
float fsin = 0;
_asm{FLD DWORD PTR DS:[fsin]
FSIN
FSTP DWORD PTR DS:[fsin]}
を使う場合では、どちらが高速ですか?

337 :
>>336
環境次第。
例えばSSEが使える状況なら、FPUを使うのは高コスト。
また、math.hのsin()ならコンパイラが勝手にFPU版なりSSE版なり使い分けてくれる可能性がある。

338 :
>>303,305,308,310,314,317,320,323,327,330,333,336
何がしたいんだかわからんけど
http://toro.2ch.net/test/read.cgi/tech/1323692486/
全部ここからのコピペだから相手にしなくていいよ

339 :
>>336
そりゃFPUを直接叩けば一番速いだろうけど、ライブラリは少しでも誤差を少なくするために
いろいろ工夫してるから速度と精度は必ずしも両立しないな

340 :
>>338
それでも回答したがる自己顕示欲の強い奴がいかにム板に多いかってことが改めて浮き彫りになったなw

341 :
class Hoge
{
int mHoge;
virtual void hoge(void) = 0;
void test(int Num) {
mHoge = Num;
}
};
みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、
関数testの実体はインスタンスの数だけ存在するのでしょうか?

342 :
コピペだと分かってたら回答してないんじゃないの?

343 :
しばらくは
「みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、」
のような問題文の一部でググってからレスした方が良さそうだね
健気に文言を変えてコピペしてくるかな?

344 :
ローカル関数?
C99にはあるのか?

345 :
>>327
これが正解
// DLL
struct Hoge { void Method(void); } ;
extern "C" __declspec(dllexport) void * WINAPI Hoge_Create(void) { return new (std::nothrow) Hoge(); }
extern "C" __declspec(dllexport) void Hoge_Method(void * obj) { ((Hoge *) obj)->Method(); }
extern "C" __declspec(dllexport) void Hoge_Delete(void * obj) { delete (Hoge *) obj; }
// EXE
extern "C" __declspec(dllimport) void * WINAPI Hoge_Create(void);
extern "C" __declspec(dllimport) void Hoge_Method(void * obj);
extern "C" __declspec(dllimport) void Hoge_Delete(void * obj);
class Hoge {
shared_ptr<void> p;
public:
Hoge(void) : p(Hoge_Create(), Hoge_Delete) {}
void Method(void) { Hoge_Method(p.get()); }
};

346 :
>>319
C++でもローカル関数のようなものは作れる
C++11ならラムダで、これは本当にローカル関数と言っていいもの
C++03でもローカルクラスのstaticメンバ関数くらいなら作れる(ローカル変数に触れないけど)

347 :
コピペにマジレスかっこいい!

348 :
ラムダは関数オブジェクトだから
「本当にローカル関数と言っていい」というほどのものじゃないな

349 :
引数もキャプチャも無しなら関数ポインタに変換はできるが
ローカルクラスのstaticメンバ関数で十分

350 :
>>341,>>345
hoge厨はプログラム以前の問題だから失せろ

351 :
foo, bar, baz

352 :
baka

353 :
どーでも良い

354 :
志が低いのね
いつか英語でソースコードやドキュメントを用意しなければならないとき、
hogeでは、わからないだろ

355 :
hogeが何語かも知らない素人が増えてるよな

356 :
>>354
hogeも翻訳すればいいだろ >>351

357 :
hageは死ぬべき

358 :
>>350
弾幕薄いよ、なにやってんの

359 :
すみません。文章についてなのですが、
メモ帳から読み込んだ文章を、1つの大きなchar配列に入れ、
改行コードの\r\nの代わりに\0を入れています。
(\r\nだと、繋げた時に1行分の長さをstrlenで計れないので\0を。)
これを、1行描画したらstrlenで長さを取り、間仕切り(\0)の分+1して
次の行を描画する  としたいのですが、
strlenで長さは正しく取れるのに、
文字列を取ろうとすると、\0から後ろはおかしな結果になってしまいます。
\0を間仕切りに使うのはかなり不味い事なのでしょうか?
それとも私が何か勘違いしてミスっているのか…。
何かご助言頂けますと幸いです。 

360 :
Rメープルじゃなくてゴールドピアスの方出ろよ

361 :
\r\n の替わりに \0\0 入れとけット。

362 :
#include <cstdio>
int main () {
printf("%d", max(3,5));
}
$ g++ ./test.cc
とすると./test.cc:6: error: `max' was not declared in this scopeと言われてしまいます。
ぐぐるとg++には標準でmax関数は存在するようなのですが、どうしてなのでしょうか?
お知恵を拝借させてください。

363 :
g++は使ったことがないので分からんが、
「標準で用意されている」と「何もインクルードせずに使える」を勘違いしてるんじゃないかと思う。
たぶんalgorithmヘッダ?

364 :
>>351
nyarl, yog, fhtagn

365 :
>>363
できました!
ありがとうございます。

366 :
配列の長さを求める関数を作ったのですが
以下のプログラムをg++ ./test.cc && ./a.outとして実行すると
8 4 2
24 4 6
となってしまいます。どうすればlength関数がうまく要素数を返すように
なるでしょうか?

#include <cstdio>
int length(int ary[]) {
printf("%d %d %d\n", sizeof(ary), sizeof(ary[0]), sizeof(ary)/sizeof(ary[0]));
return sizeof(ary) / sizeof(ary[0]);
}
int main () {
int ary[] = {1,2,3,4,5,6};
length(ary);
printf("%d %d %d\n", sizeof(ary), sizeof(ary[0]), sizeof(ary)/sizeof(ary[0]));
}

367 :
>>362
> ぐぐるとg++には標準でmax関数は存在するようなのですが、
大嘘。
libstdc++にはあるかもしれないが別物。

368 :
>>366
ttp://ideone.com/HjcMvJ

369 :
>>367
std::maxなら標準だぞ

370 :
>>367
03
> // 25.3.7, minimum and maximum
> template<class T> const T& min(const T& a, const T& b);
> template<class T, class Compare>
> const T& min(const T& a, const T& b, Compare comp);
> template<class T> const T& max(const T& a, const T& b);
> template<class T, class Compare>
> const T& max(const T& a, const T& b, Compare comp);
11
> // 25.4.7, minimum and maximum:
> template<class T> const T& min(const T& a, const T& b);
> template<class T, class Compare>
> const T& min(const T& a, const T& b, Compare comp);
> template<class T>
> T min(initializer_list<T> t);
> template<class T, class Compare>
> T min(initializer_list<T> t, Compare comp);
(maxは省略)

371 :
>>370
なにそれ
g++の仕様書?

372 :
g++とlibstdc++についての話だからC++の規格は関係ないよな

373 :
>>368
ありがとうございます!うまく動きます。
template<std::size_t N>
int length(int (&ary)[N])
と書けばNに要素数が入るのですね。
何故そうなるのかわからないです・・・。
int (&ary)[N]とはどういう意味なのでしょうか?

374 :
配列の参照

375 :
既存のものの参照を得る時に&は使って
引数で受け取る時には*を使う物だと思っていました。
何故&なのかよくわからないです。

376 :
画像のサイズをwidth*heightで表示したいのですが
MoveWindow(他, widh,height 他,)とするとウインドウ自体のサイズになってしまうのですが
ウインドウの枠のサイズなどを足し引きしないといけないと思うのですがどうすればいいでしょうか?

377 :
AdjustWindowRect

378 :
末尾再帰の最適化なんですが、以下の2つの関数をg++ 4.4.3 (64bit)で-O2でコンパイルしたところ
func()は最適化されてるのにfunc1()は最適化されませんでした。なんででしょうか。
unsigned long long func(unsigned long long a) {
if (a == 1 || a == 0) { return 1ULL; }
else { return a * func(a - 1ULL); }
}
double func1(double a) {
if (a < 1.001) { return 1.0; }
else { return a * func1(a - 1.0); }
}
最適化されてるかどうかは、アセンブラ読めないんで、ネットを参考にして、それぞれの呼び出しの前後でスタックがどれくらいつかわれてるか
(あらかじめスタックの下の方に0xCCCCCCCCを書いておいて呼び出しが終わった後にそれが残ってるか
をチェック)をしました。
どうかよろしくお願いします。

379 :
>>378
ttp://qarc.info/qa/show-9865-747.html

380 :
関数定義の引数部分でint& などとすると参照渡しになるのですね。
呼び出し側で&hogeではなくhogeでよくなるようでした。
うーん、しかし何故>>366はうまく動かないのでしょうか。
呼び出し元では配列の長さが分かるものの、
関数呼び出し先では配列の長さの情報は消えてしまうのでしょうか?

381 :
エラーについて質問です。
bool Dummy::Hoge(std::vector<BYTE> &buffer){
DWORD ReadByte;
BYTE *pBuffer = &buffer[0];
foo(pBuffer, ReadByte);
if(ReadByte > 0)
{
return true;
}
return false;
}
元のソースから部分だけ引っ張ってきたものですが、
“BYTE *pBuffer = &buffer[0];”の部分で
Expression: vector subscript out of range
というエラーが出てしまいます。
こちらのソース自体が2002年ぐらいに作られたらしく、
Webで同様のエラーを探した際もVS2003までは通ってたという記述がありました。
どうやらvector::operator[]がエラーを出していることまではわかったのですが、
そこから先の対処がわからずにいます。
こちらの関数と同様な形で引数として使うので、
エラーにならないようvector<BYTE>からBYTE*に渡せればいいのですが、
どういった対応がありますでしょうか。
よろしくお願いします。

382 :
>>380
簡単に言うと関数の引数宣言では配列を宣言してもポインタの宣言に変換される
 int length(int ary[])

 int length(int *ary)
になる。
ポインタほもちろんポインタであって配列の長さの情報は含まれない。

383 :
>>362
標準C++のmaxを使うなら
#include <cstdio>
#include <algorithm>
int main () {
printf("%d", std::max(3,5));
}

384 :
>>382
呼び出し元で使われている、その配列の長さの情報はどこに格納されているのでしょうか?

385 :
コンパイラだけが知ってる

386 :
>>381
Hogeとか使ってるクズには無理

387 :
>>364
前に会社で、テストユーザ名にそんなの並んでたわ
こっそり別の神様追加して帰ったけど

388 :
貧乏神でよければ私も追加してください

389 :
>>381はhogeを覚える暇はあっても調べる暇はないマジキチ

390 :
hogeの本当の意味を知らない子供が増えた

391 :
>>384
配列が配列として解釈されるのはコンパイル時点までで、
実行時はただのアドレスとして処理される、だったような。
例えばint a[10];とした時にアドレス0x0100が振られたとして、
配列宣言したaで参照した場合は配列であると解釈されるが、
aというラベル以外で参照した場合(int *pa=a;としたpa)は、
ただのアドレスとして解釈されるので配列サイズとの関連付けがされない。
ほら、ポインタと違って配列宣言した変数のアドレスって途中で変更できないじゃん?a="abc";みたいに。
だから宣言したaは確実に宣言時点の配列をさしてると保障されるから、コンパイラも安心して配列として解釈できると。
実際、int a[10];int *pa=a;printf("%d %d\n", sizeof(a), sizeof(pa));とした場合、結果は"40 4"となる。
その情報がどこに格納されてるかっていうと、コンパイル時点でsizeof(a)は数字の40に変換してexe出力されるので、
実行時点では”配列サイズ”としての情報は保持されてないの。だからコンパイル中の一時記憶でしかないのよ。
先に書いた通りポインタ参照の場合は実行時に変更可能だから40の決め打ちできなくて4にするしかないのね。
sizeofは普通の関数じゃないのね。記述もsizeof aで通るでしょう?
sizeofの括弧は関数の括弧じゃないのよ。これ豆知識ね。

392 :
>>391
君に「読みにくく書く」才能を認める

393 :
>381=基地害hoge厨

394 :
企業内でしか使わない業務用システム。
数少ない正社員プログラマーの一人が
住所入力の都道府県名を格納する文字列変数の
初期値として「hage」を代入するプログラムを書いた。
あとで聞いたら警告を消すためだったそうだ。
そいつは「hoge」と書いたつもりだったらしい。
その後の話は悲惨すぎて省略。

395 :
都道府県が増える可能性を排除しきれないのでxmlから都道府県リストを読み込む仕様とした。

396 :
>>395
都道府県が増減するよりも前に
道州制が導入されて住所の書式が変化すると予想されるため
書式ルールもxmlで指定できる仕様とした。

397 :
合併で減る可能性があっても増える可能性はない
道州制がきたら県合併の価値がさがるので県が減ることはないな
目先の問題は大阪都構想

398 :
大阪が「府」でなくなる
道州制による住所書式変更
合併による都道府県の削減
上から順に優先度が高い

399 :
国際化されたシステムなら「州」や「省」は対応済みで
国ごとの設定で無効化してる
今更やることはない

400 :
東北はいつでも消せるように作らないとな

401 :
福島括りを嫌って会津県で独立する可能性もあるじゃん

402 :
そもそももうしばらくしたら日本は中国韓国ロシアに解体分譲されて無くなるし

403 :
>>387
やっぱり神様の名前からか……
nyarlがニャル子(ニャルラトホテプ)っぽかったから怪しいと思っていたが

404 :
>>391
分かりやすかったです。sizeofはマクロみたいなものなのですね!
template<std::size_t N>
int length(int (&ary)[N])
でlength(ary)と呼び出すだけでNに配列要素数が入る仕組みがよくわかりません。
テンプレート関数の異型
ttp://homepage2.nifty.com/well/Template.html#TEMPLATE_FUNCTION_WITH_INTRINSIC_VARIABLE_PARAMETERS
template<int iV>
int Add(int iValue) {
return iValue + iV;
}
int main() {
int iValue = Add<3>(2); // 2 + 3 が返されます。
printf("iValue = %d\n", iValue); // 答えは 5 になります。
return 0;
}
↑この用法なのかなと思い、length呼び出しは<>の部分が推定されているのかと思いました。
しかし試しにlength<3>(ary)としてみるとno matching function for call to `length(int [4])'と言われてしまいました。

405 :
>>404
> ↑この用法なのかなと思い、length呼び出しは<>の部分が推定されているのかと思いました。
これはそのとおり
> しかし試しにlength<3>(ary)としてみるとno matching function for call to `length(int [4])'と言われてしまいました。
これは配列の参照の初期化と関数のオーバーロード解決が関係する
 int a[4];
 int (&x)[4] = a; // 初期化できる
 int (&y)[3] = a; // 初期化エラー、要素数が合わない
また
 void ary(int (&x)[3]) {} // (1)
 int a[4];
 ary(a); // 引数が初期化できないから(1)のaryはこの呼び出しに対して不適切なので対象にならない
     // 他に適切なaryがなければ呼び出し可能な関数がないのでエラー

406 :
>>391
あまりいい加減な事は言わないように
単に、配列はポインタを必要とする箇所では
ポインタへと暗黙変換が行われるというだけ
それ以外ではそのような変換は行われない
例えば配列へのポインタを使用する場合やsizeofを使う時など
配列は配列のまま扱われる
int a[10];
int (*p)[10] = &a; // 配列へのポインタ
そしてsizeofは演算子
普通の関数じゃないどころか、関数ですらない
あと、型のサイズを取得する場合は括弧が必須ね

407 :
404>391だね

408 :
スレッドを使いたくて
A classのprivateで
DWORD WINAPI ThreadFunc(LPVOID vdParam);
void thread();
として
DWORD WINAPI A::ThreadFunc(LPVOID vdParam){Aのprivateメンバなどを使った処理}
void thread(){CreateThread(NULL,0, &A::ThreadFunc,NULL, 0, &dwThreadId);}
という風にしたのですが
A::ThreadFunc' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。
CreateThread' : 3 番目の引数を 'DWORD (__stdcall A::* )(LPVOID)' から 'LPTHREAD_START_ROUTINE' に変換できません。
となります。どうすれば良いのでしょうか?

409 :
https://www.google.co.jp/search?q=%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89+%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0

410 :
staticにすればいいよ

411 :
>>408
> A::ThreadFunc' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。
こんなレベルの奴がマルチスレッドとかやるなよ…

412 :
4人のチャンコロが4本の箸で飯を食うのは不衛生極まりないことを理解できない奴はマルチスレッドに手を出すべきではない。

413 :
>>412
腹痛でトイレがデッドロックですね。分かりま・・・いや、あいつらなら問題ないか。

414 :
4本…?

415 :
そう、4膳ではなく4本。
つまり、2人が食い続けると2人が飢え死にするわけ。

416 :
>>405
なっるほどー!例が分かりやすかったです。
int (&x)[3]にint a[4]を代入出来ないというのが味噌ですね。
template<std::size_t N>
int length(int (&ary)[N]) {}
で<>を省いた時に、特にその関連性を示しているわけでも無いのに、
aryの要素数が自動でNに格納されるのが不思議だと思いました。
これはもう慣れの話でしょうか。

417 :
前にポインタ宣言について質問した者なのですが、
配列もまた宣言の時の要素数と式中の配列の添え字指定とでは異なるものだと理解してよろしいのでしょうか?
つまり、
int sample[10]という配列があって、
sample[0]が最初の要素の添え字指定で、sample[9]が最後の要素になりますよね?
その場合、sample[10]という要素はありませんよね?
ではなぜ、宣言のところの[]と式の[]は同じ[]を使っているのでしょうか?
ポインタの時もそうでしたが、つい混同してしまいます。。。

418 :
> ではなぜ、宣言のところの[]と式の[]は同じ[]を使っているのでしょうか?
そういう約束だから、そういうもんだと諦める
自分で新しく言語を作るつもりなら 吟味してくれい
宣言は 「利用可能な個数」を指示 (10個)
式中のは (ポインタ主体の思考で) 先頭からのオフセット0〜オフセット9
 sample[offset] → *(sample + offset)

419 :
>>417
http://www.kouno.jp/home/c_faq/c6.html

420 :
開発環境:VC++2008
質問:std::ifstreamのread関数でstd::stringにファイルの読み出しを行いたい
read関数の第一引数(データの受け取り)にchar*を渡す必要があり、
string型でchar*に相当するものを考えると、むしろそのまま変数を渡すくらいかと思ったのですが、
当然型が違うのでコンパイルが通りません。
当たり前かもしれませんが、強引に&string[0]のように渡しても、コンパイルこそ通れどうまく動きません。
const char*に関してはc_str()関数を使えば問題ないのですが
char*を要求されたときstring型で上手く実現する方法を教えていただきたいです。

421 :
>>420
ttp://qarc.info/qa/show-9865-809.html

422 :
横から質問失礼
グローバル変数をやむなく使うというのは例えばどういう状況でしょうか
自分は結構頻繁に使ってましたorz

423 :
>>422
ブロックを抜けたら寿命が尽きても構わない→自動変数
スコープはブロック内で充分→ブロック内静的変数
スコープは関数内で充分→関数内静的変数
スコープは関数外にまで拡げたい→翻訳単位内静的変数
翻訳単位外からは関数経由でアクセスできると言っても納得せず、
どうしても公開せよと迫られる→グローバル変数

424 :
コード記述時は未確定だけど
アプリケーション起動時に(設定ファイル等から)確定する定数とか

425 :
シングルトンでまとめてるけど、広い意味でグローバル変数と同等だと考えてる

426 :
void myPrint(const char *str) // char のポインタを受け取るだけ
{
printf("%s", str);
}
int main()
{
myPrint("ABCDE"); // その1:const 文字"列の先頭"の、アドレスを渡している
char foo[] = "XYZ"; // その2:char 配"列の先頭"の、アドレスを渡している
myPrint(foo);
char *bar = foo; // その3:その2の配"列の先頭のアドレス"を、コピーしてから渡している
myPrint(bar);
myPrint(&(*bar)); // その4:意味は無いがその3のポインタが指す先のアドレスを渡している
// ※その4での動きは、 bar はポインタ変数、*bar はポインタ変数が指している何か、
// &(*bar) は、ポインタ変数が指している何かのアドレス=ポインタ変数に格納されているアドレス
return 0;
}

427 :
>>422
マルチスレッドのプログラムかなぁ

428 :
stdoutやerrnoがグローバル変数であるケースは結構ある。
むしろマルチスレッド対応で関数になってたりするけど。

429 :
C言語ですが、
配列の要素数の宣言に変数は使用できませんよね?
gcc(MinGW?)では可能と聞いたのですが、本当ですか?
またそれによって実行ファイルが環境に依存することはありますか?

430 :
C99では出来るしgccはC99をかなり取り入れてるしgcc独自の拡張もあるし
どれの事を言ってるのかはっきりしないと答えようがない

431 :
C99なら配列の要素数の宣言に変数が使える
それによって実行ファイルが環境に依存することはありえる
まあそんな処理系知らないけど

432 :
>>429
LSI-C試食版でコンパイルできない。

433 :
gcc独自拡張に、配列の添字に変数が使えるようになる機能がある。だから、本当

434 :
C89だと無理だが、gcc独自拡張があればイケる
C99ならどのコンパイラでもいけるがC99非対応のコンパイラじゃ無理

435 :
誰かが大きさを実行時に決められる自動配列はalloca()の糖衣構文だと言っていたなあ

436 :
http://pc12.2ch.net/test/read.cgi/tech/1267775473/626
コピペ元を少しずつ古いスレにしてるのが笑える

437 :
みえない

438 :
>>432
今時そんな骨董品を使う方がどうかしている。

439 :
パソコンとはかぎらない

440 :
C++の拡張子なにつかってる?
cppがデファクトスタンダードだと思うんだがgoogleのスタイルガイドだとccだた

441 :
cpp/cxx/cpはともかくccの2つ目のcはどこから来たんだよ
C with Classes の名残とかだったらいい加減やめようや

442 :
むしろcpp以外になる理由が知りたい

443 :
c++の+を45度回転
cxx

444 :
Cのプログラムのファイルの拡張子は、
.c
.h
C++の拡張子は、いろいろある。
.C
.c++
.cc
.cp
.cpp
.CPP
.cxx
.h
.h++
.hh
.hp
.hpp
.hxx

445 :
Cをインクリメントしたら2つになったとか?
cppはどうしても、プリプロセッサを想像してしまうんだよな。

446 :
プリプロセッサなら.hの方を思い出すのが普通な気も……
>>444
大杉ワロタw

447 :
.c++は見たことないな

448 :
>>446
#include とか #if とかのプリプロセス処理の展開を済ませた中間ファイル的だね って意図じゃない?

449 :
ヘッダファイルでstring型の変数宣言するときに、そのヘッダファイルに#include <string>を書くべきでしょうか?
かなり初歩的な質問ですまん

450 :
stringはよく使うから
プリコンパイルヘッダファイルが使えるなら
そっちでincludeした方がいい
使えないならそのヘッダファイルに書いた方がいい
そのヘッダファイルでincludeしてる別のヘッダファイル内でたまたまincludeされていて
そのヘッダファイルでstringをincludeしなくてもコンパイルが通る事もあるけど、
その別のヘッダファイルの内容が変更される可能性を考えると
自分でincludeした方が無難
(その別のヘッダファイルというのが標準ヘッダファイルであっても、
 コンパイラを変更したらコンパイル通らなくなったとかよくある事)

451 :
>>450
ありがとうございます

452 :
でも明らかにstringを使っていないと破綻するクラスのヘッダをインクルードした場合は
無理に自分でインクルードする必要は無いと思われ

453 :
DOS窓でWriteConsoleOutputを使い文字を出力しています
char c[3] = "▲";
ci[0].Char.AsciiChar = c[0];
ci[1].Char.AsciiChar = c[1];
ci[0].Attributes = 4;
ci[1].Attributes = 0;
みたいに半角ずつ色を変えて表示したいのですが、
winXPではうまくいきますが、win98では両方[0]の色になってしまいます
解決方法がありましたら教えてください

454 :
WriteConsoleOutputW

455 :
>>454
ありがとうございます
それはWriteConsoleOutputのワイド文字版みたいですね
AsciiCharに入力すると、XPでは別の半角文字に変わり、
UnicodeCharに入力すると、XPでは全角+半角の3文字分表示され、
98ではどちらに入力しても表示されませんでした

456 :
98 のテスト環境なんてもう持ってないな
なんでそんなの使ってんの?

457 :
>>456
XPメインで98はテストですね
コンソールゲームは古い技術だと思うので、
古いマシンでも同じように動いて欲しくてテストしています

458 :
ofstreamまたはifstreamでファイルが開けなかった時にcloseする必要ってありますか?
// 例
ofstream ofs("test.txt");
if (ofs.fail()) {
  ofs.close(); // ←これ
}

459 :
>>453
ttp://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/game1/m100.html
まずはこの辺のサンプルが手持ちの98環境で動くか確認してみたら?

460 :
>>453
ごめん、全角1文字を半分ずつ色を変えたいのか。ちゃんと読んでなかったわ。

461 :
>>458
開いてないものを閉じることが出来ると思ってるのか?
まあ開いてないファイルストリームを閉じようとしても失敗するだけなんで別にいいけど

462 :
>>458
その例だと>>461の通りだけど
ttp://ideone.com/ouBVuh
の例1のように既にファイルAを開いているfstream fsに対してファイルBをopenすると
Bのopenに失敗してfsのfailbitは立つけれどAはopenのまま
つまりfail()==trueでもfsがNULLとは限らない
(あまりないだろうけど)fsを使いまわす場合は例3のように
一度closeしてからopenしなければならない
またopen/closeに失敗したときのfailbitのsetstateはfstreamのopen/closeで行なわれるので
例2のようにfs.rdbuf()->open()とbasic_filebufのメンバ関数を呼ぶと失敗しても
failbitは立たない
成否は例にあるように返り値で判断する
例5,6にあるようにis_open()==falseのときcloseは失敗する
これは>>458の例と同じ状況
ここに挙げた例は全て明示的にcloseしているけれど
cout << "ExampleX";
{
...
}
の閉じ括弧でfsはデストラクタでcloseされるので
各々最後のcloseは特別な理由がない限り書かなくてもいい
その他細かい動作は27.5 Stream buffers, 27.8 File-based streamsとコンパイラのマニュアルで確認してくれ

463 :
close()してもclear()しないとfailbitが立ったままなんで気をつけないとな

464 :
つまり使い回すなってことだ

465 :
>>459>>460
いえいえ、ありがとうございます

466 :
どう居た前

467 :
http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/virtual.html
純粋仮想関数を再定義する時、子クラスにもvirtualキーワードをつけないとダメ?
class sub:public super{
public:
void func();//←??
virtual void func();//←??
};

468 :
不要

469 :
ありがとう

470 :
何が仮想関数であるべきかが設計時に判らないのに
あらかじめ基底クラスになるかどうかも判らないクラスに
あらかじめ virtual 書いておかなければならないとか
C++ の最大の欠陥

471 :
で?

472 :
わかってない段階からコーディングするとか、バカすぎ。

473 :
質問させてもらいます。
現在64bit メモリ4Gの環境でプログラムを組んでいます。
動的に大容量のメモリを確保する場合、32bitのOSでは2Gが最大との記述を読みましたが、64bitでは最大確保容量=物理メモリと考えてよいのでしょうか?
また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?

474 :
いいえ

475 :
>>473
> また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?
静的に確保した変数はスタックに取られるわけじゃないぞ。

476 :
>>470
で、全ての関数に virtual がついている言語には欠陥がないとでも言うのか
おまえ自分で考える頭がないのをどこに転嫁しても笑われるだけなのを認識しろよ

477 :
>>476
ご指摘ありがとうございます。
静的な確保の場合は静的領域ですね。

478 :
>>477
おまえ今日は何グラム入れてるの?

479 :
>>473
スタックに取られるのはC系の場合自動変数。
基本的に自動変数であまり大きな領域を取ってはいけない。
Windows APIを使ってメモリ確保した場合は仮想メモリから
取られるので、実メモリ+仮想記憶が許す範囲で取れる。
いろいろ勘違いしてるので基本の学習が先だな。

480 :
基本の学習って、アセンブラでもやれってか?
むしろCで「処理系依存」を毛嫌いしすぎるのが
そういう系の習得を邪魔しているだけなんだが

481 :
>>479
> いろいろ勘違いしてるので基本の学習が先だな。
お前がな。

482 :
64bit系OSでは仮想メモリを使わない設定の場合もある気がする

483 :
て言うか、スタックとか静的領域とかのストレージクラスの話と、
仮想メモリーをごっちゃにしてて、偉そうに何言ってるんだ?
って話だろ。
あと、組み込みとかで仮想記憶使わないシステムなんていくら
でもあるよ。

484 :
メモリ確保量の限界を聞いてるんだから
仮想メモリの話は当然出てくるだろう

485 :
flvのファイルをドロップドラッグしてリストに表示し
ボタンを押すとひとファイルずつキー操作する
みたいなことやりたいんだがヒントくれ。

486 :
ポインタと文字列定数について質問があります。
int main()
{
char *s;
s = "Pointers are fun to use.\n"
cout << s;
return 0;
?
というサンプルコードなんですが、なぜポインタ変数に文字列定数を
代入できるんでしょうか?
また、試しにcout <<*sとしてみると先頭の一文字(P)だけ表示されるのですが、なぜなのでしょうか?


487 :
ドロップドラッグ

488 :
*s = 文字列ポインタの実体の先頭 = P
だからその動作は正しい。
cout << s
なら文字列が表示されるはず。

489 :
もうちょっと詳しく書くと
"Pointers are fun to use.\n"
これはコンパイラが暗黙のうちにメモリのどこかの領域に
文字列を定義しているということ。
s = "Pointers are fun to use.\n"
は、コンパイラが定義した文字列領域の先頭アドレスを
ポインタ変数に代入しているということ。
だから *s つまりポインタの実体(の先頭)を表示すると
Pが表示される。
アドレスから文字列全体を表示する(cout << s)の場合は
文字列全体が表示される。

490 :
google で 「std::string compare」 で検索すると2つ目に出てくる
ttp://www.nilab.info/z3/20111226_03.html
のサイトの説明についてなんですが
  if(c.c_str() == d.c_str()){
    printf("c.c_str() == d.c_str(): true\n");
  }else{
    printf("c.c_str() == d.c_str(): false\n");
  
とか
  // char* : std::string
  if(a == c){
    printf("a == c: true\n");
  }else{
    printf("a == c: false\n");
  }
  if(a == c.c_str()){
    printf("a == c.c_str(): true\n");
  }else{
    printf("a == c.c_str(): false\n");
  }
っておかしいですよね?

491 :
その質問は何が知りたくてどんな答えを求めてるの?
日本語レベルからやり直したほうがいいぞ。

492 :
#include <iostream>
int main()
{
  using namespace std;
  char *s;
  char c[] = "zj";
  cout << c[0] << endl;
  cout << c[1] << endl;
  s = &c[0];
  cout << s << endl;
  c[0] = 'x';
  cout << s << endl;
  s = "zj";
  cout << s[0] << endl;
  cout << s[1] << endl;
  cout << s << endl;
  return 0;
}

493 :
>>490
trueかfalseか確認してるだけだからおかしくはない。
コードにセンスないとは感じるが。

494 :
assert使った方がいいね

495 :
c_str()を比較するとポインタを比較している事になって正しくない
ポインタの比較は同一の配列か同一の文字列内でしか出来ない

496 :
#define BUFFER_SIZE 256
#include <iostream>
#include <string>
int main()
{
  using namespace std;
  const char *s = "zj";
  char c[BUFFER_SIZE];
  string g(s);
  cout << g << endl;
  strcpy(c, s);
  cout << c << endl;
  cout << s[0] << endl;
//  s[0] = 'x';
  return 0;
}

497 :
>>495
だったらNULLとの比較もできないことになるが

498 :
>>495
stringの使い方からするとおかしいが、比較そのものは合法。
論点はどっちだ?

499 :
いやそうじゃないだろ
ポインタが同じところ差してるからと言って
中身が同じとは限らないのが問題なんだろ

500 :
>>495
> ポインタの比較は同一の配列か同一の文字列内でしか出来ない
大小比較は出来ない (と言うか意味ない) けど、一致比較は出来ると思うぞ。

501 :
>大小比較は出来ない (と言うか意味ない) けど、
位置の前後は意味あるんじゃない?
差分もとれるし。
意味ないのは和の方。

502 :
意味あるかないかであれば、どっちも正しいが正しい
char *a = malloc(20);
char *b = malloc(10);
a > b;  /* 意味ないよ! というかどうなるか分からないよ */
char *a = strstr(c, "hello");
char *b = strstr(c, "world");
a > b;  /* 意味あるよ! cが"hello world"か"world hello"か区別つくよ */

503 :
ポインタ値の大小の話がなんで位置の話になるんだよ。

504 :
>>501
> 位置の前後は意味あるんじゃない?
> 差分もとれるし。
だからそれが意味を持つのは、「同一の配列か同一の文字列内」の場合だけでしょ。

505 :
別に任意のポインタを比較したっていい
それが意味を持つかどうかは、要件次第

506 :
>>505
> 別に任意のポインタを比較したっていい
規格上は「ダウト」じゃなかったっけ?

507 :
>>488
レスありがとうございます。
>>489の説明でよくわかりました。

508 :
>506
p == NULL
とか
p == q
とか
また「任意じゃない」とか言い出すんだろうな

509 :
>>488
ところで、なぜポインタ変数に文字列を代入できるんでしょうか?
普通は、アドレス(数値)を代入するのではないでしょうか?
そういう仕様だということで納得するしかないのでしょうか?

510 :
文字列リテラルはその文字列が格納される先頭アドレスを表すから

511 :
>>508
> p == q
p, q が near ポインタだと p == q でも、違うところを指してるケースがあるとか、
なかったっけ?

512 :
>>510
レスありがとうございます。
文字列リテラルの先頭アドレスは &sで出てくる値で正しいのでしょうか?

513 :
sでいい
&sだとポインタ変数のアドレスになっちまう

514 :
>>512
初心者本買って勉強しろ。
そしてR。

515 :
>>513
sのアドレスが見たい時はどうすればよいのでしょうか?

516 :
>>515
std::cout << static_cast<void*>(s) << std::endl;
こういうことか?

517 :
>>516
初心者なのでまだその式の意味がわかりません。
難しい話のようなのでもうちょっと勉強してきます。

518 :
素朴な疑問だが、文字列リテラルってなんで文字定数('A')じゃだめなの?

519 :
null終端じゃないからじゃね

520 :
文字定数が 終端の '\0' を含めて連続配置されたのが文字列リテラル
代入は配列とポインタの関係みたいなもんだな
int a[] = { 1, 2, 3, 4, 0 };
int *p = a;
/* 0 が終端である約束を元に表示する */
while (*p) { printf("%d", *p); p++; }

521 :
>>518
多分コンパイル結果が一定長の命令になるから。
●1文字だけなら文字定数で問題ない("a"を表示するとき)
push 0x61
call printf
●長いのを文字定数で処理すると文字数分の命令長が必要になる("abc"を表示するとき)
push 0x61
push 0x62
push 0x63
call printf
●文字列リテラル=アドレスにすると文字列長に関係なくアドレスサイズの命令長でおk("abc"を表示するとき)
push 0x100
call printf
0x100番地→61 62 63 00
↑は表現が微妙だけど、文字定数で'a','b','c'とか、仮に'abc'とか定義できたとしても、
その情報は結局メモリ上のどこかに保持しないといけないじゃん?
なら"aとbとc"っていう文字データで渡すより、定義先のアドレス1個で渡した方がよくね?ってこと。

522 :
文字が複数個と文字列は、明らかに別物だから、別物になってるだけ
ジェネレートされた命令列は関係ない

523 :
Cは暗黙のうちに定義される動作がわかりにくいんだよな。
紙にメモリと変数領域を自分で書きながら勉強するといいかも。

524 :
馬鹿には無理。
馬鹿でないなら紙に書かなくても理解できる。
紙に書いて理解できたと思っているのは、実は理解できていない馬鹿か、
無駄なことをしていることに気付いていないだけ。

525 :
英単語は書かないとスペル間違うぞ

526 :
自分が判らないからと言って相手も判らないと思い込み
論を語る基地害ってどこから湧いてくるんだろうな

527 :
・「みんなの意見」「他の人もそう思ってる」など、自分の意見なのに他人もそう思ってると力説する人
他人が自分とは違うという事実が受け入れられない人です。自分の意見が通らないとコピペや荒らしなど
無茶をし始めるので見かけたら放置してください。
・根拠もなく、他人を卑下したり、差別したりする人、自分で自分を褒める人
他人を卑下することで自分を慰めようとする人です。実生活で他人に褒めてもらう機会がないが
プライドだけは高いとか、匿名の掲示板しか話し相手のいない人です。可哀想なので放置してください。
・自分の感情だけ書く人
「〜〜がムカツク」とか自分の感情を掲示板に書くことに意味があると思っている人です。
何がどのようにムカツクのか論理的に書いてあれば、他人が読んでも意味のある文章になりますが、
そういった論理的思考の出来ない人です。もうちょっと賢くなるまでは放置してあげてください。

528 :
今日そのコピペ流行ってるな

529 :
×他人を卑下したり
○他人を蔑視したり
自分を卑下します

530 :
WinGWからDirectXって使えますか?

531 :
もちのろん

532 :
MinGWな

533 :
TがUを公開継承していて暗黙変換可能なとき
IHoge<T>を暗黙にIHoge<U>に変換可能にするような書き方ってできますか?

534 :
template <class T> struct IHoge {
T m;
template <class U> IHoge& operator = (const IHoge<U>& r) {
m = r.m;
return *this;
}
};

535 :
template <class T> struct IHoge {
T & get() = 0;
};
struct T : U { };
void Func(IHoge<U> & hoge) {
hoge.get().UMethod();
}
struct Hoge : IHoge<T> {
T o;
T & get() { return o; } };
Func(Hoge());
↑みたいな感じにしたいです

536 :
hoge
禁止!

537 :
>>535
struct U {};
struct T : public U {};
template<class T>
struct IHoge;
template<>
struct IHoge<U>
{
virtual U & get() = 0;
};
template<>
struct IHoge<T> : public IHoge<U> {};
void Func(IHoge<U> & hoge) { hoge.get(); }
struct Hoge : IHoge<T>
{
T o;
T & get() { return o; }
};

538 :
>>537
TとUは一般的なクラスなんで特殊化だけでは対応し切れません

539 :
バイト列をstd::stringで扱うと何か問題ありますか?
ヌルとかがあるとまずいかなと思って今まで
vector<char>でやってました。

540 :
>539
後者が正解

541 :
ちょっと混乱したのでお助けを
const char* p
だと
*p = 0;
これはダメで
p = "hoge";
これは可能
つまりポインタ先の変更は不可能だが、ポインタ自体は変更可能
では
const char** h;
だと・・・?
char*を一つの型として考えて
*hが変更不可能だと思ったのですが実際は
*hに代入ができました
どう考えるべきですか?

542 :
遠い方に効く

543 :
こういう問題があるから前にconstを書くやつはクズ
後ろに書けば明快でよろしい

544 :
何をconstにしたいかによるだろ

545 :
何をコンストにしたいか一目瞭然だから後置がいいんだよ

546 :
>>541
>>542 >>543によると
const char **h;
は char const **h と考えるのがいいとのこと。
http://codepad.org/yAJmxtgd

547 :
色々ありがとうございます
何か自分が単純な思い落としをしていたのかと思ってたのですが
意外に根が深そうですね
もうちょっと自分で整理つけてみます

548 :
最初のうちは変数宣言を日本語訳?するとわかりやすいかもしれない(?)
1. constが一番左のときは右隣の型名と入れ替え
2. 機械的に置き換え
 〜(型名):〜型
 *    :へのポインタ型
 const  :の定数
3. 『型』の直後に『の定数』がなければ『の変数』を挿入
char a
 → char型 a
 → char型 (の変数) a
 → char型の変数a
char * b
 → char型 へのポインタ型 b
 → char型 (の変数) へのポインタ型 (の変数) b
 → char型の変数へのポインタ型の変数b
const char * c
 → char const *c
 → char型 の定数 へのポインタ型 c
 → char型 の定数 へのポインタ型 (の変数) c
 → char型の定数へのポインタ型の変数c
const char ** c
 → char const ** c
 → char型 の定数 へのポインタ型 へのポインタ型 c
 → char型 の定数 へのポインタ型 (の変数) へのポインタ型 (の変数) c
 → char型の定数へのポインタ型の変数へのポインタ型の変数c
・参照外しした場合は右から一つずつ『へのポインタ型の変数・定数』を外していく

549 :
>>541の場合の解釈は
const char* p
・p は『char型の定数へのポインタ型の変数』だから変更できる(変数だから)
・*p は『char型の定数』だから変更できない
const char** h
・h は『char型の定数へのポインタ型の変数へのポインタ型の変数』だから変更できる
・*h は『char型の定数へのポインタ型の変数』だからやはり変更できる
・**h になると『char型の定数』だから変更できない
あるいは
char * const * x だと
 → char型 へのポインタ型 の定数 へのポインタ型 x
 → char型 (の変数) へのポインタ型 の定数 へのポインタ型 (の変数) x
・x は『char型の変数へのポインタ型の定数へのポインタ型の変数』だから変更できる
・*x は『char型の変数へのポインタ型の定数』だから変更できない
・**x は『char型の変数』だから変更できる

550 :2012/11/02
>>541
エキスパートCプログラミングという本を読むといい。
そのへんのことが詳しく書いてある。
TOP カテ一覧 スレ一覧 2ch元 削除依頼
★★ Java の宿題ここで答えます Part 72 ★★ (405)
Gtkプログラミング on Windows!!! (343)
【Intel】OpenCV総合スレ 4画素目【画像処理】 (323)
Win32API質問箱 Build112 (655)
【bzr】Bazaarでバージョン管理 Rev 3 (958)
プログラミング言語 Scala 8冊目 (562)
--log9.info------------------
【PTA】ママさんコーラス総合スレ@【婦人会】 (322)
団塊世代対策室@合唱板  (326)
【もうすぐ】第九を歌う会【年末】 (438)
合唱人なら★朝日作曲賞!★もっとクリエイティブに (831)
【オンデマンド対応楽譜】楽譜の共同購入 (205)
宗教曲総合 (852)
二度と歌いたくない合唱曲 (471)
中高生の定番の合唱曲・2曲目 (266)
●●●アニソンを合唱でも普及させるべき●●● (269)
【人生】合唱(団)を辞めた理由【いろいろ】 (764)
雑談スレ (575)
Nコン課題曲反逆スレ (334)
一部分変えて曲名をおかしくするスレ #2 (571)
静岡県の合唱 (371)
合唱曲「エトピリカ」ってどんな曲? (564)
※☆★新潟県の合唱★☆※ (716)
--log55.com------------------
小学生VS30代女
29歳独身♀です。
また騙されて独身貴族板に飛ばされたわけだが
私の初体験を話したら、夫が嘔吐し号泣しました
結婚しないけど、恋はしたいだろ?
アミバやジャギを他人とは思えんのだよ
結婚するなら契約結婚
恋って何ですか?愛ってなんですか?