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歳独身♀です。
また騙されて独身貴族板に飛ばされたわけだが
私の初体験を話したら、夫が嘔吐し号泣しました
結婚しないけど、恋はしたいだろ?
アミバやジャギを他人とは思えんのだよ
結婚するなら契約結婚
恋って何ですか?愛ってなんですか?