【初心者歓迎】C/C++室 Ver.80【環境依存OK】
2 :
デフォルトの名無しさん :2012/09/21(金) 19:16:51.17
余裕の2ゲットモナ(´∀`)
>>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
うめてんてー
↑うめてんてーって言う埋め方って一般的なもんなの?
AAもあるよ _ / \ _ / / {┳ } >{、 ,>-< // -\__/ -ヽ \ 、_、-‐ 1 ゝ ┐ . { |⊂⊃ i ⊂⊃| } } 、 T¨Τ , -―、 {_ノ―、 \ヽ 「 ̄ ̄ フ / / 、-7 ̄ г¨Τ二7 ´ } /∨ } r─\ ゝ ─ ' 厶二⊃ / \ ΓΤ J _ノ ヽハ _ノ  ̄`|  ̄ ̄ ̄ ̄ `ーァ / ヽ、 | \ / >、___ イ し′ し′
>>5 いやひだまらーだしうめ先生は知ってる
C++スレにまで出てくるとか(埋めレスとして)汎用性高杉
多数がNGワードにしてるワードを
>>1 に入れるのやめようや
一部を伏せ字にするとかさ工夫してくれ
俺はNGNameでNGにしてるから
>>1 はNGにならない
NGNameにはしてないけどNGWordにはしてる。
だから NGName にしとけって暗に言われてるんだろ…
いや言及してるレスの方が はるかにウザイから
たしかにw
せめて二文字
>>1 をNG除外にしてるから何書かれようと問題ない
なぁ、C++とかのオブジェクト指向プログラミングって 俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど 要は、親玉(Objectクラス)は、子供(継承したクラス)の 情報をしってて、親玉から子供の情報を知りたい時にキャストして 子供の情報を得る。 ってな感じで良い? まぁ、オブジェクト指向のなんたるかを語りだすと 色んな人が色んな例えして、どーでも良くなったりすんだけどね。
17 :
デフォルトの名無しさん :2012/09/23(日) 19:51:10.92 BE:3607405867-2BP(0)
VS10 C++ です。 BOOL hoge(CString& sValue) { sValue = _T(""); } CString& sValueは参照変数で空文字で初期化を行なっていますが、MFCの使えない環境で BOOL hoge(char& sValue) { // } このような場合のchar& sValueの初期化を行うにはどのように書いたらいいですか。
お前の言う初期化とはどういう状態になることなんだ
アホ どう言うも何も参照で取ってんだから sprintf(sValue,""); で十分じゃん
>>17 文字列を空にしたいってことでしょ?
char*&sValueでsValue[0]="\0";
じゃないかな
あ、&いらなかった
22 :
デフォルトの名無しさん :2012/09/23(日) 20:10:49.55 BE:1546031063-2BP(0)
>>22 >>17 の通りなら参照渡ししてるのは文字であって文字列では無い
まず引数をchar*sValueにするところから変更しなきゃ
24 :
デフォルトの名無しさん :2012/09/23(日) 20:33:19.12
>>22 hoge厨は初期化しなくていいから回線切れ
文字(char)なのか文字列(char*)なのかどっちなのか
文字列だお
>>17 お前hogeとか使ってて恥ずかしくねーの?
本物のゴミか?
>>17 hogeを覚える暇はあってもコーディングの技術を身に付ける暇はないとかマジでクズ。
お前みたいな奴社会にいらないよ。
MFCが使える使えないに関わらず、std::stringを使えばいいじゃん。
#ifdef _UNICODE typedef std::wstring tstring; #else typedef std::string tstring; #endif
もしかしてエラーの内容ってcharじゃなくてwchar_t使わなきゃいけない(もっと言えばTCHAR)だけだったりして
34 :
デフォルトの名無しさん :2012/09/23(日) 21:13:02.76
>>17 おい愚図
お前みたいな愚図は学校や職場では
陰で氏ねばいいのにって言われてるんだろうな
本人気づいてないけどうちの職場にもいる
>>34 ただの悪口なら気付かなくてもいいんだけど、
>>17 みたいな基地害は迷惑で言われるんだからさっさと消えて欲しい。
えっ
39 :
デフォルトの名無しさん :2012/09/23(日) 21:26:44.75
>>17 も可哀想な奴だと思うよ。
親がゴミみたいな奴だからロクな教育受けてこなかっだんだろ。
しかも本人自覚ないみたいから余計に可哀想。
もう全部unicodeで統一してくれないかな
42 :
デフォルトの名無しさん :2012/09/23(日) 22:25:43.80
>>17 ここは池沼用掲示板じゃねーんだよ
養護学校できけ精神異常
44 :
デフォルトの名無しさん :2012/09/23(日) 22:27:43.51
45 :
デフォルトの名無しさん :2012/09/23(日) 22:39:37.79
散りゆく髪に未練などないさ俺たちは中高年 遠く弾けるドラム缶それが俺たちのオイルショック 吹き飛ばせるわけないだろ 体重計の秤量は 100kg 悪気もなく俺たちを いぇいぇー ぶげらー
47 :
デフォルトの名無しさん :2012/09/23(日) 22:56:21.13
生きていたけりゃ 飲むしかないのさ あいつはいつも俺にそういってた そんなあいつがホスピスにいやがる それでもいいさ楽になれたのなら バイバイ マイ ライバル バイバイ マイ エネミー バイバイ マイ ボイド 灰が落ちる そしてまた「明日」はくる 俺は吐き血が混じる いつかバブルを忘れちまうだろう それは俺もおなじ woo woo wooo 只じゃ買えない 家も買えない ラブホも行けない woo woo wooo それでも消費税は 申告 せにゃならん おーいぇーべべー # 銃声
>>17 hogeとか書いて本当に恥ずかしくないの?
またhoge嫌厨が沸いたか
win32スレと同じだな
こっちのほうがまだマシだな 向こうは常に荒れてるけど こっちはhoge厨が湧かない限り荒れてない
やってるやつは同じじゃねぇの? そっくりなんだが
同じだろうと同じじゃなかろうとどっちでもいいよ。 Hogeが来なければ荒れないみたいだからそれを祈るばかり。
piyo厨も入れてやれ
相変わらずhogeに対する凄まじい憎悪だな そろそろコテ付けろよww
hogeをngに入れとけばいいだろ
>>57 連鎖あぼーんとかない?
ブラウザによるのかな。
>>55 まあここまで叩かれるの分かっていてhoなんとか使うのは初見か荒らしだろうな
>>57 侮蔑語をNGすればOK
>>58 >連鎖あぼーん
Janeだとそういった設定は無いんだが……別の専ブラならできるの?
>>60 >侮蔑語をNG
「エラー」とか「ゴミ」とかはまだ普通に使う可能性がある単語だろ……
それはNGしなけりゃいいだろ それでも目に入る煽りはかなり低減できるだろ 100%クリーンな世界なんてないんだからそのくらいいいと思うけどね とりあえずHOGE連鎖あぼーんでかなり減ると思うぞ
>>60 ここに質問に来るような初心者は大抵初見だろw
毎回発狂するキチがコテつけりゃ済む話
キチガイがコテつければ済む話だがキチガイがわざわざつけてくれるのか? 現実的でない。
初見と初心者とか感激なくホゲ使っててまともな質問見たことねーな。 全ホゲあぼーんで問題なし。
できるだけまともな日本語でどうぞ。いや、そもそも個人の感想なんてどうでもいいのだけれど。
>>66 は自分ではまともな日本語で書き込んでると思ってるのかなw
>>63-65 あたりを煽るために
わざと珍妙な日本語で書いてんだろ
お前釣られてんだよ
スレ住人「あぼんするのでコテつけてください!」→マジキチ「了解です!コテつけます!」 性善説をこじらせるとこういう流れが妄想できるようになるの?
俺はhoge厨もアンチも両方スルーできるけど、気になる奴はとりあえずNG設定しとけばいいんじゃね hogeならNG設定しても困らんだろ
71 :
デフォルトの名無しさん :2012/09/24(月) 22:17:57.88
うんこちんちん
class Hoge* g_hoge;//クラスのグローバルポインタ class Hoge { public: virtual void func(){printf("Hoge World!\n"); } class Fuga : public Hoge {
おう間違えた もういいや、寝る
なにしとんねん
75 :
デフォルトの名無しさん :2012/09/25(火) 21:16:05.24
VisualStudio2010でプロジェクトをビルドすると ・"Debug\test.unsuccessfulbuild" のタッチ タスクを実行しています ・すべての出力が最新のものです。 ・ファイル "Debug\test.unsuccessfulbuild" を削除しています。 という警告メッセージ?がでます。 Explessから移行したばっかなので何がなんだかわからないのですが、どういうものなのでしょうか?
リモートから見る時unsuccessfulbuildが存在すればビルドに失敗したんだなってわかるようになってる 普通に使ってれば気にしなくていい
77 :
デフォルトの名無しさん :2012/09/27(木) 15:53:06.57
なぜコンストラクタは、returnでエラーをかえせないのですか? exit()は、できる。
return値をどうやって受け取るのですか?
(´・ω・`)知らんがな
80 :
デフォルトの名無しさん :2012/09/27(木) 17:24:33.50
超能力
81 :
デフォルトの名無しさん :2012/09/27(木) 17:32:10.12
>>77 returnが無ければ、例外を飛ばせばいいじゃない
#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 :
デフォルトの名無しさん :2012/09/27(木) 22:32:26.94
必要なのは getCount であって return ではないな もしかして初期化子を知らないのか? # 知らなくても代入でどうにでもなるが
85 :
デフォルトの名無しさん :2012/09/28(金) 00:34:03.06
C++でゲームを作っていて、継承について質問です。 スーパークラス ┠サブクラス ┃┠サブサブクラス ┃┗サブサブクラス ┗サブクラス ┠サブサブクラス ┗サブサブクラス という感じの「継承したクラス」を継承したクラスがあり、 そのインスタンスがあったとして、 スーパークラスのポインタとして受け取ったそのサブサブクラスのアドレスからサブクラスの型を判断するにはどうしたらいいでしょうか? サブクラスのコンストラクタなどで型の変数を初期化するのではなく内部的な仕組みで出来る方法があれば教えてください。 言葉でうまく説明できないので用途も書きます。 スーパー・・・装備クラス(アイテムスロットを配列で持ちたい) サブ・・・装備の種類クラス(アサルトライフル~など) サブサブ・・・装備クラス(M4A1~など) という感じで表現して、 「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」 という判定をしたいんです。 ゲームスレのほうがいいとは思ったのですが、処理だけ見ればC++に機能そのものなのかなと思いゲームスレではなくこちらで質問させていただきました。 よろしくお願いします。
基底にvirtual bool IsGun()を作るとか dynamic_castするとか
>>85 つtypeid
つdynamic_cast
typeinfoしか思いつかないなあ
要するに.NETで言う所のリフレクションみたいな機能が欲しいんだろうと予想するけど C++11ならdecltypeって使えるな
使えねーよ
はっきり言うが設計間違えてるからやり直し
>>85 特に速度が必要ないならdynamic_castでNULL判定が楽
>>91 俺もそう思うが、設計スレじゃないし、いいんじゃね?
94 :
デフォルトの名無しさん :2012/09/28(金) 08:36:55.73
ガチ素人ですがいろいろ聞いていいですか?
そういうのは、サブクラス側に bool canEquip(SlotType) みたいな関数を用意すればいいんじゃね。
97 :
85 :2012/09/28(金) 18:51:14.63
「設計を間違えている」というのが気になります。 後学のためにも教えてくれると本当に助かります。 やっぱりスーパークラスのメンバ変数をサブクラスのコンストラクタで初期化する、というのが最適なのでしょうか? 質問スレの域を脱してる、と言われたら謝ります。
98 :
デフォルトの名無しさん :2012/09/28(金) 18:59:06.86
大体派生にしかない情報がほしくなる時点でポリモーフィック失敗してんだよ インターフェース通じてやりたいこと全部出来るようなら(たぶん)成功した設計 ひとつでも出来ないことがあれば失敗設計
何のための dynamic_cast や ダウンキャストしてでも派生した方が良い場合もたまにある ただ、今回がそれかどうかは別の話だが
dynamic castするくらいならquery interfaceするわ
102 :
85 :2012/09/28(金) 21:06:21.59
>>99 >>85 でいうスーパークラスはインターフェースクラス?なのかどうかは知りませんが
virtualの装飾がついた関数しかありません。
use()=0とかdrop()=0とかpick()=0とか・・・
具体的な情報が必要な抽象化とかわろす
query interface は結局 dynamic_cast だろw
JavaだのC#だのはobjectに値を突っ込んで ダウンキャストで取り出すなんて日常茶飯事
106 :
85 :2012/09/28(金) 21:27:21.03
>>103 ということは、
>>85 でいえば
「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」
という判定がしたい時は
逆に銃から3ウェイハンドシェイクみたいなやり取りを開始すれば完全に抽象化できるということでしょうか?
>>106 言いたいことがさっぱりわからんというかESPしても誤解が誤解を生むだけだから
なんか疑似コードでも書いておくれ
>>97 アイテムスロットに登録する人、つまり型情報から判定を行う人は誰?
スーパークラス?
まあ、装備の種類みたいなのはクラスで分けずに パラメータ化するのが普通じゃね
110 :
85 :2012/09/28(金) 22:49:22.65
そうとう重症だなこれは
>>110 ちょっとぉ、だいぶ
>>85 のイメージと違うんだけど。。。
ま、それはさておき、そのコードであれば素直に属性として、「種類」や「名称」を持つのが普通かなと思う。
その相互依存はいくない。
Equipにvirtual int GetSlot();を実装 Equip[tmpWeapon->GetSlot()] = tmpWeapon; とでもしとけ
>>112 ごめん、見間違えた。
そのコードならいいんじゃね?
俺ならこうするってのはあるけど、それほどおかしくはないと思う。
強いて言えば、タイプをキーにして配列やマップに結びつけるかな。
メソッドチェイン用に外部に保持されないプロクシを作れないだろうか // ok obj.Proxy().Method(); // ng auto proxy = obj.Proxy(); proxy.Method();
プロキシクラスのコンストラクタをprivateにしてプロキシを返す関数とかをfriendにすれば
MinGWでWin32APIを使っての開発を行っています。
http://codepad.org/fDEMyIto aaa()以降の標準出力が使用できず困っています。
WriteConsole()を_tprintf()としても同様です。
標準エラー出力(STD_ERROR_HANDLE)であれば何故か正常に出力が出来ます。
アドバイスお願いします。
だって自分で閉じてるじゃん。 何が疑問なのかわからないくらい。
汚たねぇブロック配置だな
template <class X> class Bob { friend class X; private: void Fuck(); }; class Alice { Bob<Alice> bob; public: void DoSomething() { bob.Fuck(); } }; こういうふうにfriendに出来る対象をテンプレートで指定したいんですができません どうすればうまくいきますか?
>>117 Windowsでは一般にGetしたものはReleaseするものであってCloseするものじゃない
お二方アドバイスありがとうございます。
>>118 GetStdHandle()をCreateConsoleScreenBuffer()のような感覚で使っていました。
改めて考えるとおかしいですね。
>>119 お目汚し失礼しました。
C++を学習し始めたばかりですので、お手本お願いできますか?
>>120 11ではclassを書かずに
friend X
03では適当なクラスを介して
template<class T>
struct friend_template
{
typedef T type;
};
friend class friend_template<X>::type;
124 :
デフォルトの名無しさん :2012/09/29(土) 23:34:58.93
>>123 !!!!!!!!!!!!!!!
!!!ありがとうございます!!!
!!!!!!!!!!!!!!!
>>115 コピーコンストラクタなどをprivateにしてもauto&&で持つことが出来るよそれ
現在C++をVisualStudio2010Expressでゲームを作っていますが、C#のようにいわゆるポトペタでGUI部品やスプライトを配置して中身をC++で書けるような技術はありますでしょうか? Qtを調べたのですがゲームにはあまり向いていないと書いてありました。
残念ながらExpressにはリソースエディタがない リソースファイルはテキストで直接編集するしかない
Qtを使うのならVisualStudioは要らんな。
ゲームなら自前で全部描画が基本じゃね
フリーのリソースエディタ
任意のEXEから呼出されるDLLで作成する スレッドとファイバのスタックサイズを 4KB未満に小さくするにはどうすれば良いですか? SetThreadStackGuaranteeというので最小スタックサイズを 変えられるようですが、小さくできないようだし、 64ビットのみだし。 32ビットXPでできる方法はありませんか?
ファイバーは知らないけど、スタックはスレッド固有の領域だから ページサイズ以下には出来ないんじゃないの? 仮に出来てもページサイズ単位になるだろうし
VS2008 C++です。 ライブラリ等外部から取得したポインタのアライメントを確認するには どのような方法がよいでしょうか? 今はintにキャストしてbit andをとっていますが、これが動作保証されているのか わからないのと、Windows環境で適切なAPIがあればそちらを使いたいと思っています。
if(((char *) p - (char *) 0) % align == 0) Good();
なるほど、NULLがアドレス0ならばこれでアドレスを求められるわけですね。目から鱗です。
ところがだ、連続していることが保証されていないポインタ同士の減算は未定義だから巧くないんだな。 で、どうせ環境依存になるんだからintptr_tにキャストすればOK。
>>136 何度も議論されてるようにintptr_tではサイズが足りる保証はない
>>136 それはイテレーター全般の話だろ
ポインタはvalid rangeじゃなくてもオフセットを取得出来る
つ ptr_diff_t
オフセット取得でサイズが足りなくなる例を一個示してくれ 何度も議論された成果を1行で示すくらい、簡単だろう?
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なら保証されるが定義されている保証はない
>>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バイトの環境で、とか言い出されたら、もうハイハイとしか言いようがないけども
俺は
>>143 しかレスしてないが・・・
まあ
>>134 が同じ配列オブジェクトの要素だと強弁するならそれでいいんじゃないの
百歩譲っても(char*)0が配列オブジェクトの要素を指してるなんてありえないと思うけど
143だった
それで、結局のところ「安全にアドレスを整数変換できる方法」はどうすればいいんですか? あなたたちはあれはだめこれはだめというばかりで一向に話を進めようとしないじゃないですか
俺はuintptr_tに突っ込んでます
「安全にアドレスを整数変換できる方法」は環境依存しないかぎり存在しない intptr_tかuintptr_tがあればそれを使うのが安全
std::sprintf(buf, "%p", p); if(BigInt::FromString16(buf) % align == 0) Good(); // EXCELLENT!!
%pでの出力形式は実装定義だからあんまり意味ないな
if(BigInt::FromBytes((unsigned char *) &p, sizeof(p), ByteOrder::Check()) % align == 0) Good(); // Amazing!!!
そんなマニアックな環境はボイコットしろ
>>133 の環境に限定するならUINT_PTRにでもキャストすればいいんだけどな
158 :
133 :2012/10/06(土) 16:57:53.35
自分としてはWindows(VC)限定でいいんですが、その環境でポインタを整数に キャストしたとき下位ビットがアライメントを表すことが保証されているかどうか、 それだけです。
2の整数乗にしかならないから下位ビットを見ればいいのはあってるけど struct type1{ char a[10]; }; この型のアライメントは1 struct type2{ DECLSPEC_ALIGN(1024) char a;} この型のアライメントは1024 というようなことを判別する必要があるなら (UINT_PTR)p % TYPE_ALIGNMENT(T) == 0 が真っ当な方法
>>158 アライメントの定義は下位ビットでしょ?
問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
キャストできるならその答えは Yes になる
どうせ上司あたりから受け取ったポインタのアライメントを確認するように!と
言われたんだろう。
「x86ならアライメントエラーにならないから平気ですよ」と言い返そう
そのあと「あ、ARMだと例外おきますね。ARMも対応するんですか?なら直してきます」
と言って席に向かおう
>問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、 >キャストできるならその答えは Yes になる ポインタを整数にキャストできることは保証されているが、それがアドレスか どうかは規定されてないだろ。
ARM対応予定はないけどSSE使うから直せとか言われるオチ
163 :
133 :2012/10/06(土) 20:06:49.56
>>162 まさに、受け取ったデータをSSEで処理したいんですが16byte alignmentを要求するので
そのチェックをしたいということです。
他の環境に移植し得るようなプログラムでポインタのアライメントをチェックしなければ
ならないような場面なんて逆に思いつかないです。
164 :
デフォルトの名無しさん :2012/10/06(土) 20:13:57.58
VC は alignas ないんだっけ
ない
ポインタのアラインメントっていわれると&pのアラインメントを思い浮かべちゃうんだけど
ん?それでいいんじゃないか? それともポインタ変数のアライメントのことを言ってるのか?
void * p; &p;ってことね アドレスのアラインメントっていってくれたほうがわかりやすい
プログラミング言語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 というエラーを吐いてコンパイルが出来ません。いったい何がまずいのでしょうか。
algorithmのfind()を使えば? それとc++なら、std::coutを使いましょ
templeteがまずい
>>169 ×templete
○template
あとsizeof(elems)は配列の要素数を返さないのでそれじゃまともに動かないよ
>>169 とりあえず初心者はVC++かeclipse使って色付けてもらえよ
そしたらこんなしょうもないエラーに悩まされることはないはずだから
>>170 多分標準ライブラリがあると思ったのですが、
言語の機能を学びたいとおもいこんなことをやっています。
>>171 ,172
> ○template
それでした、下らなくてすんません
sizeofは自分もそう思ったのですが、
char[]の配列をいくつか作って試してみた限りでは
きちんと配列の長さを返してくれたのでそのままにしてあります
これって仕様に無い実装依存の挙動だったりするんですか?
>>173 emacsを使ってますが色の意味が分かりませんでした……
>>175 sizeofの結果を直接printfした場合にはちゃんと長さを返してくれてたんですが、
memberOfから呼ぶとだめみたいですね。
やっぱりsizeofじゃダメみたいですね。
>>176 配列は通常の方法では関数に渡せないからね。渡しているのはポインタ。
関数内で配列のサイズを知りたければ、テンプレート引き数として配列を渡す位しか手がないよ。
>>177 まあそうなんですが
直接書いて長さ返してくれるなら
インラインは最終的に直接書いたのと同じにならないかなー、と思ったんですが
やっぱりこういうのはあんまりやらない方がいいですね
>やっぱりこういうのはあんまりやらない方がいいですね バグの温床になるからしない方が良いかと。
>>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が設定されます。
以前同じ問題で悩んだことがあったので
参考までに。
バルバロス「バオーwwwwwwwwwww」
ルポニ「ランーーwwwwwwwwwwwwww」
コナニゾ「ムゾコナwwwwwwwwwww」
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
ラゾコンナ「ンババババwwwwwwwwwwwwwwww」
>>184 send( ), recv( ) の直前でソケットの値表示して、本当に正しいソケットに
対して操作しているか確認しなよ。
もしくは、ソースさらして。
>>184 えーと、サーバ側アプリを書いているんだよね?
受信したスレッドと送信したスレッドはきちんと把握できている?
ひょっとしたら、メインスレッドで受信してメインスレッドで送信しているんじゃない?
>>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関数は
すみません、ソース書いてる途中に間違って送信してしまいました。
>>1 のサイトを使ってもう1回書きます。
ttp://codepad.org/tzuheXNf 先にも書きましたが、受信データの解析・送信はメインスレッドのあるクラスの関数でおこなっています。
SOCKETを渡して、それをsendに指定しているのですが、もしかしてメインスレッドのクラスでsendしているのが問題なのでしょうか
>>188 > CThread* cthread = new CThread( socket2, this );
> cthread.start();
ホントにソース書いてる?
cthread->start(); じゃなくて?
イメージは間違ってないと思うが、こういう細かいところでミスってるんじゃないのか?
て言うか、人に見てもらうならせめてコンパイルエラーにならないソースを上げてよ…
実は java という気がします
>>191 すみません、他にもいろいろ間違ってますね。
1回間違って書き込んで無意味に焦ってしまいました。
>メインスレッドで受信してメインスレッドで送信しているんじゃない?
というのを受けてもう一度ソースを見なおしたところ、スレッドの扱いは合っていたのですが
別のところで問題があることがわかりました。
TCPがどうとかいう以前の問題でしたので、全体的にソースを見直すことにします。
ご回答して下さった方々、ありがとうございました。
サブスレッドで受けた後 メインスレッドで処理して 間違ったサブスレッドで送り返していたと
パゾコナン「マニアwwwwwwwwww」
>>180 おお、これはすごい
勉強になります
ありがとうございます
コナニーゾ「ハラバロwwwwwwww」
uyうぜーよ消えろ
コナニール「バンバンwwwwwwwwwwwww」
uyって朝鮮人だってな
初歩的な質問で申し訳ないのですが、以下のサンプルでひとつ疑問があります。 #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はアドレスですよね? なぜアドレスを値に代入できるのでしょうか?
死ね 臭い質問すんなゴミ
203 :
デフォルトの名無しさん :2012/10/10(水) 09:15:55.61
>>201 *j には入れてない
j に入れている
ナロコロ「バーローwwwwwwwwwwww」
>>201 関数の引数は代入ではなく変数の宣言と同じ
*j=p; ではなく
int *j=p; と同じ(おおまかには int *j; j=p; と同じ)
ルポナニ「バロバローwwwwwwwwwwwww」
207 :
201 :2012/10/10(水) 16:47:46.04
>>205 >関数の引数は代入ではなく変数の宣言と同じ
というのがよくわからんのですが、何か良いサイトや本はありませんか?
俺が読んでいる本は標準講座C++(ハーバート・シルト著です。
上記のようなことはざっと見た限り載っていませんでした。
ナロバリア「バロスwwwwwwwwwww」
プラニア「ナバルアwwwwwwwwwwwwww」
>>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;
}
ある所がわからないってのは、そこより前段階の基礎的な所をわかったつもりでわかってない(間違って理解している)ことが原因のときもあるな
パルパニア「ニアアwwwwwwwwwwwww」
ニニル「バーロウwwwwwwwwwwwww」
コナニ「ウハーwwwwwwwwwwwwwwwww」
関数中のstatic変数はスタックでしょうかヒープでしょうか? いわゆるシングルトンもそれと同じになると考えて問題ないですか?
スタックでもヒープでもない シングルトンはデータの置き場所としては普通の変数と同じだけど 初期化コードの必要性によって事情が変わる
スタックでもヒープでもなく、初期化コードの必要性?で変わるとなると一気にわからなくなりました どう理解すべきでしょうか?
伝統的なメモリモデルは次の形をとる。
text+data+bss+heap+stack
textはコード
関数中のstaticな変数も含めて生存期間がプログラム実行時と同じ変数はdataかbssに置かれる。
なお実行可能ファイルに含まれるのはtextとdata。
>>216 >初期化コードの必要性によって事情が変わる
というのはdataにおくかbssにおくか、の判別を指すと思う。
適当な参考書籍やurlはよくわからない、すまない。
データのおき場所は宣言の仕方によってことなる 初期化コードの内容によって宣言の仕方が変わる
>>219 >初期化コードの内容によって宣言の仕方が変わる
適当な例を思い浮かべられないのだが?
初期化/終了タイミングがどうでもいいならただのstatic変数、重要ならshared_ptrを使うみたいな感じ
>>221 破壊のタイミングをしっかり管理したいときになんでshared_ptrなんだよ
>>215 > 関数中のstatic変数はスタックでしょうかヒープでしょうか?
まず規格上の言語仕様にはスタック領域・ヒープ領域といった実装レベルの概念に対する規定はない
よって全てはコンパイラの実装に依存する
そしていまどきのPC用のコンパイラの実装であれば少なくともスタック領域ではないところに配置されると思っていい
> いわゆるシングルトンもそれと同じになると考えて問題ないですか?
いわゆるがGoF本でのシングルトンパターンのことなら関数中のstatic変数を使って実装することになるので当然同じになる
>>201 *j に p を代入と言うのは、式で書けば *j=p と言う事だが、どこでそんな事をしている?
関数の引数で受けているところは、j=p 相当の処理だぞ?
int* j=p;
と同じね
大昔の C での関数宣言を思い出したよ・・・ void f(j) int *j; { ...
そっちの宣言のが便利だよな
229 :
デフォルトの名無しさん :2012/10/11(木) 07:35:11.67
仮引数並びが型情報を持たないことがか?
231 :
215 :2012/10/11(木) 10:17:03.90
単純にスタック、ヒープ以外の領域がある、という理解でよさそうですね ありがとうございます
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; { 〜
>>232 そのかわり引数のプロトタイプチェックは皆無になる(はず)なのだが
237 :
201 :2012/10/12(金) 19:40:15.08
遅いレスですみません。
>>226 >関数の引数で受けているところは、j=p 相当の処理だぞ?
というのがわからんのです。
一日無い知恵を絞って考えたんですが、仮引数の宣言に現れる*は、
ポインタ宣言の場合とおなじようにjがポインタ変数であることを示しているだけで、
単項演算子の*とは異なるという認識でよろしいのでしょうか?
/ , -''"´ \ / / / ,. ‐'''""~´ ̄ ̄\ V / / / } ∨ / / ,,.. -一ァ',二二二{ V ,..,/ ,.ィ彳 f==<r'二二二{、 | ̄ ̄ __|__ | ∨| ヘ`<=''~ 弋ッ-ミ'''テ~ナ/ |ー― \/ ´ ̄| 「 ̄` | | \/ 〉'| | ト、 i{ ,..`二/ =|/''′ |__ /\ 匚]__ !__, |_ | __/ //ヽヽぅ ヽ { =| //匚 ̄]〕 丶,-‐ ,> ( そ の と お り で ご ざ い ま す ) /´r┐|__,|ト、 、____`7´ __人..二.」' l>、 ヽ`,二/ ´"''ー-論\ ∠三ノ ―-、__ ``ヾニ='′ `ヽ /、 |‐- ...__ /ヽ\_ \  ̄ `ヽ \
ただ、紛らわしいことに int * a, b; は、aはintのポインタ型だけと、bはintだから注意な *aがintになる型、と考えるといいのかもね
int* a,b;
やっぱ int *a, b; で何の問題もないじゃん。
わかりやすいのが一番
突っ込みどころ満載だし 早くも管理人行方不明じゃねーか
どこの方言?
2ch
全員じゃないからな
なんか偽ブランド品みたいで使いたくないな アフィブログ用なんでしょ?そこ
クラスメンバの関数ポインタのvector配列の文ってどうすればいいんですか? void (Admin::*ElementSelect)(); というのが関数ポインタなんですけど void vector <(Admin::*ElementSelect)()> ElementSelectAry; になるんでしょうか?
257 :
デフォルトの名無しさん :2012/10/13(土) 10:58:19.58
vector <void (Admin::*)()> ElementSelectAry;
素直にtypedef使えと
DLL←→EXE間でクラスのやり取りするにはどないすればええんでっしゃろ?
>>260 条件を限定しない一般論なら答えようがない
(あえていうなら一般論としてはやるな、になるけど)
COM使え
263 :
デフォルトの名無しさん :2012/10/14(日) 13:30:18.27
(あえていうなら一般論としてはやるな、になるけど)(キリッ
std::array< std::array<int, 3>, 3 > MyArray = { { {0, 1, 2}, {3, 4, 5}, {6, 7, 8}} }; wcout << MyArray[2][2] << endl ; こういう使い方ってしてもいいんですか?
それはダメですね かなり危ないコードです
>>264 添え字の範囲を超えないようにするとかで正しく使うなら何の問題もない
うそ教えんな
UDKは世界でダントツに採用の多いエンジン使ってるから
学習材料として使ってるのが多い
アセットを作ること自体意味があって、アセットストア頼りとか真のクソ
あとグラフィックコンテンツ的な作品に使われるのも多い
世界でCEやUnityの10倍以上の使用者がいる つかUnityはゴミみたいな存在
スレッド数
http://www.polycount.com/forum/forumdisplay.php?f=38 UDK 1,330
Crytek Sandbox 134
Unity 67
日本でどうとかいってる低レベルのダニは駆逐されてほしい
どっちがどっち?
>>264 初期化の内容が要素数越えたらgccじゃエラーになったよ
別に安全だと思う
class bar{} template<class T> class foo :public bar{ void func(boost::shared_ptr<T>); } このときbar形のポインタにfooのオブジェクトをnewして、 そのポインタからfunk(...)をキャストせずに使うことは出来ますか?
ちょっとひねり加えれば出来るけど?
まぁ、キャストでもできるけど、普通は仮想関数を使う
>>278 仮装関数にしたいものの引数にテンプレート変数が入ってるんですよね…
設計ミスな気もします
>>272 どうしてもそれに近いことをしたいなら、
引数を工夫するために宣言を変えてくれ
>>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);
}
やっぱり何か違うな。 a か b に機能を持たせて丸投げすべきか。 そもそもfooもbarも作り直して考え直すのが良いか。
>>272 ttp://ideone.com/wSkTm 基礎設計はちょっと違うが(呼び出す時点では)キャストせずにfuncを使える
呼び出し側が引数の正当性を保障できるならdynamic_castの代わりにbar_に仮想関数を持たせずにstatic_castを使うこともできる
error LNK2001: 外部シンボル ""class A * m_ptest" " は未解決です。 fatal error LNK1120: 外部参照 1 が未解決です。 とかいうエラーがが直せません>< 宣言はあるけど、定義はどこか分からない、とこういうエラーが出るらしいですけど、 該当部には class A;前方宣言 extern A* m_ptest;エクスターンなんとか m_ptest->func();←ここがエラー箇所 としていて、 別の箇所で m_ptest = new A(); と定義をしているつもりなんですけど、どこか間違っているでしょうか?
m_ptest->func(); この時点でclass Aの宣言が全部見えてる必要がある
回答ありがとうございます。 class Aの宣言を書いたヘッダファイルをインクルードしてみたのですがNGでした。
どっかのcppにA* m_ptest;って書いとく
質問:今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; }
レスポンスありがとうございます。 それも別のクラスの宣言部に書いてたのですが、エラーが出てます。 別のクラスBのヘッダファイル中において、データメンバとして A* m_ptest; と書いておいて、 そのクラスBのcppファイル中、コンストラクタ内で m_ptest = new A(); と定義してるつもりでした。 試しにWinMain関数の前にA* m_ptest;と書いたら エラー無しで問題は解決したのですが、両者の違いが分かりません。 理解を深めるためにもお教えいただけないでしょうか。
int count(char str[], char ch);
class B { A* m_ptest; }; A* m_ptest; 上の二つは別物です extern A* m_ptest; は後者を指してるので定義がないとエラーになります
>>293 解決しました!見逃していました、ありがとうございます。
>>294 AはBを構成する部品の一つなので、包含関係かなと思って、
Aのインスタンスm_ptestをBのデータメンバとしていました。
ですが、Aのメンバ関数をBよりも外の箇所で使用したくて、
extern宣言、ヘッダファイルのインクルードなどで、なんとか出来ないかとしていたところ、
上記のエラーが出て困っていました。
全く別物を指していたとは・・・スコープというものでしょうか、
調べてみます。
回答いただきありがとうございました。
なぁ、C++とかのオブジェクト指向プログラミングって 俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど 要は、親玉(Objectクラス)は、子供(継承したクラス)の 情報をしってて、親玉から子供の情報を知りたい時にキャストして 子供の情報を得る。 ってな感じで良い? まぁ、オブジェクト指向のなんたるかを語りだすと 色んな人が色んな例えして、どーでも良くなったりすんだけどね。
コピペしなくていいよ
>>298 お前の認識してるオブジェクト指向は全部間違ってる
コピペは程々にな
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)終わり、とやりたいです。 単純にリンクの張替えで出来ると思ったのですが、やり方がわかりません
insertしてerase
corutineの実装がいろいろあるけど (Hamigakiとか) GPUを使うOpenCVとかと混ぜたらうまく動かないってことでいいのでしょうか
リンクの張り替えできないんだよね ダサい仕様だが
>>298 その方法は基底をホルダーにした型消去であってオブジェクト指向プログラミングと直接の関係はない
非同期のMessageBoxを作って、タイムアウトしたら自動で閉じるなどの機能を実装しようと思っています。 自分で作ったウィンドウではなく、MessageBox関数を利用します。 そこでMessageBoxのウィンドウハンドルを取得したいのですが 1 CreateThreadで別スレッドを作成 2 別スレッドがMessageBox呼び出し 3 メインスレッドがEnumThreadWindowsで別スレッドのウィンドウを列挙 4 GetWindowTextでタイトル照合 タイトルが一致するウィンドウがなければ3に戻る 5 取得したウィンドウハンドルは、タイムアウトしたらWM_CLOSEを送るなどに使用 CreateThreadで作成されたスレッドは IMEが作ったウィンドウや、タイトルのないウィンドウが あらかじめ作られているようで タイトルによってはそれらと一致してしまうので この手段が不確実です。 ウィンドウを列挙したり、文字列を比較するというのも かなり無駄が多いです。 このような原始的な方法しか思いつかないのですが 他になにか良い方法はないでしょうか。
>>303 list<int>::iterator i1(ls.begin()), i2(ls.begin());
ls.splice(++i1, ls, ++ ++ ++i2);
Cのsscanfって、大文字小文字を無視する設定ってできないんでしたっけ? sscanf(str, "ID%d", &id"); などとするとき、"ID100"からも"Id100"からも100を取り出したいのですが。
>>308 GetWindowThreadProcessId 使えばいい
ウィンドウクラス名とプロセスID調べれば誤爆はしないでしょ
時間で閉じるメッセージボックスは公開されてないがuser32.dllにあった気がする
>>310 一応 "%[Ii]%[Dd]%d" ってのはできる
>>312 "%*[Ii]%*[Dd]%d"と読み飛ばしてしまえば医院で内科医。
>>310 要求仕様が厳密でないなら↑の方法で。
厳密ならば("Id"や"iD"を許容しない)ならsscanf()一回だけでは無理。
条件分枝構文って if else swich しかないのでしょうか boostやstlでもっと複雑なことのできる条件分枝はないのでしょうか
3項演算子もwhile文もdo - whileもある意味条件分岐だろ
変数の実行時の型で分岐するポリモーフィズムはどうっすか
質問です。 同じ名前で引数が異なるローカル関数って作れますか? hoge(enum hoge); hoge(int hoge);
作れますよ では次の方質問があればどうぞ
>>317 C++では同じ名前で引数が異なる関数は作れますが、ローカル関数が作れません
Cではローカル関数は作れますが、同じ名前で引数が異なる関数が作れません
よって作れません
どうしたらこのスレに書かれてることを理解できるレベルに到達できますか? 初心者向けの本は勉強したけど、全然わかりません。 やさしいC++をひと通りコード書いて理解しました。 int main(void) とか、int main の中に何か入ってるものは何を意味してるのか分からないし operator関数も難しいです。
std::cout << "ほげ"; std::wcout << L"ほげ"; JavaからJNI(Java Native Interface)でc++のコードを使っていて、 デバッグ用にcoutを使ったら文字化けしてしまいました。 もしかしてコーディングが違うのでは?とか思いました。 調べてもよくわからないのですけど、おそらくJavaが用意したコンソールは、UTF16のビッグエンディアンなんじゃないかなと思いました。 なので、L"ほげ"というのをBigエンディアンに出来ないでしょうか? LってのがLittleだったら、神がかってるなと思って、B"ほげ"にしてみたらやっぱだめでした。 Localeなのかな。 std::wcout.imbue()付近で調べればわかりますかね?
試しに char b[] = {0x30, 0x7B, 0x30, 0x52, 0x00, 0x00}; //ほげ UTF-16BE std::cout << b; ってしてみたら
Cでもローカル関数は定義できない ただしGCCとかの独自拡張ならできる 独自拡張ならば同名で引数が異なるローカル関数が定義できる処理系もあるかもね
>>320 正直、使ってみないと覚えない。
難しいとよく言われるCのポインタだって、勉強中はサッパリでも
実際に必要な場面を迎えると案外簡単に使えたりする。
あと、このスレに限らず、技術系のコミュニティって、
半分も理解してないけど参加してる、自分が混ざれる話題にだけ混ざるって人は多いよ。
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の構成が変わっちゃうかも、とか気にしなくていいの?
ハンドルとしてクラスのポインタを返す・ハンドルを受けて(中でクラスに戻して)操作 EXE側は ハンドルの中身をほぐしてクラス動作させることはない という切れ目で DLL化したことはあるけど class そのもののエクスポートが必要な要求っぽいね (EXE側で ポインタ参照〜クラスのメソッドを呼び出したい)
>>327 CreateがIHoge*でなくInterface*を返して、
DLLとEXEでInterfaceを変更しなければ大丈夫じゃね
dllimport側でHogeはincludeしない(使わない)なら
dllexport側のHogeは変更してOK
#ifdef HAVE_CPP11 とか #ifdef HAVE_CPP0X みたいなことってできないの?
>>330 その処理系が11に対応してれば、オプションで変更可能になってる場合もあるんでね?
#if 201103L <= __cplusplus で出来ることになってるけど過渡期の現状ではいまいち boostならBOOST_NO_CXX11_〜系のマクロで機能ごとに判別できる
vba用のdllをつくっています。C初心者です。 値をdllに渡して処理したあと、グローバル変数に値を入れておいて、 vbaから読み込みのフラグが立ったらその変数を戻すようにしているのですが、 グローバル変数は呼び出し速度が遅い等ネットで見かけます。 グローバル変数を回避して、ローカル変数のみで同様のことをするには ざっくりどんなことをすればいいのでしょうか
handle = open(); proc(handle, p1, p2...); v = get(handle); close(handle); 的な感じにするとか
今度はけっこう前のスレからコピペしてきたな
math.hのsin()を使う場合と、 float fsin = 0; _asm{FLD DWORD PTR DS:[fsin] FSIN FSTP DWORD PTR DS:[fsin]} を使う場合では、どちらが高速ですか?
>>336 環境次第。
例えばSSEが使える状況なら、FPUを使うのは高コスト。
また、math.hのsin()ならコンパイラが勝手にFPU版なりSSE版なり使い分けてくれる可能性がある。
>>303 ,305,308,310,314,317,320,323,327,330,333,336
何がしたいんだかわからんけど
http://toro.2ch.net/test/read.cgi/tech/1323692486/ 全部ここからのコピペだから相手にしなくていいよ
>>336 そりゃFPUを直接叩けば一番速いだろうけど、ライブラリは少しでも誤差を少なくするために
いろいろ工夫してるから速度と精度は必ずしも両立しないな
>>338 それでも回答したがる自己顕示欲の強い奴がいかにム板に多いかってことが改めて浮き彫りになったなw
class Hoge { int mHoge; virtual void hoge(void) = 0; void test(int Num) { mHoge = Num; } }; みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、 関数testの実体はインスタンスの数だけ存在するのでしょうか?
コピペだと分かってたら回答してないんじゃないの?
しばらくは 「みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、」 のような問題文の一部でググってからレスした方が良さそうだね 健気に文言を変えてコピペしてくるかな?
ローカル関数? C99にはあるのか?
>>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()); }
};
>>319 C++でもローカル関数のようなものは作れる
C++11ならラムダで、これは本当にローカル関数と言っていいもの
C++03でもローカルクラスのstaticメンバ関数くらいなら作れる(ローカル変数に触れないけど)
コピペにマジレスかっこいい!
ラムダは関数オブジェクトだから 「本当にローカル関数と言っていい」というほどのものじゃないな
引数もキャプチャも無しなら関数ポインタに変換はできるが ローカルクラスのstaticメンバ関数で十分
350 :
デフォルトの名無しさん :2012/10/19(金) 23:32:31.06
foo, bar, baz
baka
どーでも良い
志が低いのね いつか英語でソースコードやドキュメントを用意しなければならないとき、 hogeでは、わからないだろ
355 :
デフォルトの名無しさん :2012/10/20(土) 01:20:32.65
hogeが何語かも知らない素人が増えてるよな
357 :
デフォルトの名無しさん :2012/10/20(土) 02:28:51.06
hageは死ぬべき
すみません。文章についてなのですが、 メモ帳から読み込んだ文章を、1つの大きなchar配列に入れ、 改行コードの\r\nの代わりに\0を入れています。 (\r\nだと、繋げた時に1行分の長さをstrlenで計れないので\0を。) これを、1行描画したらstrlenで長さを取り、間仕切り(\0)の分+1して 次の行を描画する としたいのですが、 strlenで長さは正しく取れるのに、 文字列を取ろうとすると、\0から後ろはおかしな結果になってしまいます。 \0を間仕切りに使うのはかなり不味い事なのでしょうか? それとも私が何か勘違いしてミスっているのか…。 何かご助言頂けますと幸いです。
Rメープルじゃなくてゴールドピアスの方出ろよ
\r\n の替わりに \0\0 入れとけット。
#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関数は存在するようなのですが、どうしてなのでしょうか? お知恵を拝借させてください。
g++は使ったことがないので分からんが、 「標準で用意されている」と「何もインクルードせずに使える」を勘違いしてるんじゃないかと思う。 たぶんalgorithmヘッダ?
配列の長さを求める関数を作ったのですが 以下のプログラムを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 :
デフォルトの名無しさん :2012/10/20(土) 19:34:51.18
>>362 > ぐぐるとg++には標準でmax関数は存在するようなのですが、
大嘘。
libstdc++にはあるかもしれないが別物。
>>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 :
デフォルトの名無しさん :2012/10/20(土) 21:44:06.60
g++とlibstdc++についての話だからC++の規格は関係ないよな
>>368 ありがとうございます!うまく動きます。
template<std::size_t N>
int length(int (&ary)[N])
と書けばNに要素数が入るのですね。
何故そうなるのかわからないです・・・。
int (&ary)[N]とはどういう意味なのでしょうか?
配列の参照
既存のものの参照を得る時に&は使って 引数で受け取る時には*を使う物だと思っていました。 何故&なのかよくわからないです。
画像のサイズをwidth*heightで表示したいのですが MoveWindow(他, widh,height 他,)とするとウインドウ自体のサイズになってしまうのですが ウインドウの枠のサイズなどを足し引きしないといけないと思うのですがどうすればいいでしょうか?
AdjustWindowRect
末尾再帰の最適化なんですが、以下の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を書いておいて呼び出しが終わった後にそれが残ってるか をチェック)をしました。 どうかよろしくお願いします。
関数定義の引数部分でint& などとすると参照渡しになるのですね。
呼び出し側で&hogeではなくhogeでよくなるようでした。
うーん、しかし何故
>>366 はうまく動かないのでしょうか。
呼び出し元では配列の長さが分かるものの、
関数呼び出し先では配列の長さの情報は消えてしまうのでしょうか?
エラーについて質問です。 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*に渡せればいいのですが、 どういった対応がありますでしょうか。 よろしくお願いします。
>>380 簡単に言うと関数の引数宣言では配列を宣言してもポインタの宣言に変換される
int length(int ary[])
が
int length(int *ary)
になる。
ポインタほもちろんポインタであって配列の長さの情報は含まれない。
>>362 標準C++のmaxを使うなら
#include <cstdio>
#include <algorithm>
int main () {
printf("%d", std::max(3,5));
}
>>382 呼び出し元で使われている、その配列の長さの情報はどこに格納されているのでしょうか?
コンパイラだけが知ってる
386 :
デフォルトの名無しさん :2012/10/21(日) 00:22:31.69
>>364 前に会社で、テストユーザ名にそんなの並んでたわ
こっそり別の神様追加して帰ったけど
貧乏神でよければ私も追加してください
>>381 はhogeを覚える暇はあっても調べる暇はないマジキチ
390 :
デフォルトの名無しさん :2012/10/21(日) 03:22:08.04
hogeの本当の意味を知らない子供が増えた
>>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 :
デフォルトの名無しさん :2012/10/21(日) 04:20:40.19
393 :
デフォルトの名無しさん :2012/10/21(日) 04:39:15.40
>381=基地害hoge厨
企業内でしか使わない業務用システム。 数少ない正社員プログラマーの一人が 住所入力の都道府県名を格納する文字列変数の 初期値として「hage」を代入するプログラムを書いた。 あとで聞いたら警告を消すためだったそうだ。 そいつは「hoge」と書いたつもりだったらしい。 その後の話は悲惨すぎて省略。
都道府県が増える可能性を排除しきれないのでxmlから都道府県リストを読み込む仕様とした。
>>395 都道府県が増減するよりも前に
道州制が導入されて住所の書式が変化すると予想されるため
書式ルールもxmlで指定できる仕様とした。
397 :
デフォルトの名無しさん :2012/10/21(日) 05:49:38.26
合併で減る可能性があっても増える可能性はない 道州制がきたら県合併の価値がさがるので県が減ることはないな 目先の問題は大阪都構想
398 :
デフォルトの名無しさん :2012/10/21(日) 05:51:35.12
大阪が「府」でなくなる 道州制による住所書式変更 合併による都道府県の削減 上から順に優先度が高い
399 :
デフォルトの名無しさん :2012/10/21(日) 05:53:48.75
国際化されたシステムなら「州」や「省」は対応済みで 国ごとの設定で無効化してる 今更やることはない
東北はいつでも消せるように作らないとな
福島括りを嫌って会津県で独立する可能性もあるじゃん
そもそももうしばらくしたら日本は中国韓国ロシアに解体分譲されて無くなるし
>>387 やっぱり神様の名前からか……
nyarlがニャル子(ニャルラトホテプ)っぽかったから怪しいと思っていたが
404 :
366 :2012/10/21(日) 08:14:56.26
>>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])'と言われてしまいました。
>>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がなければ呼び出し可能な関数がないのでエラー
>>391 あまりいい加減な事は言わないように
単に、配列はポインタを必要とする箇所では
ポインタへと暗黙変換が行われるというだけ
それ以外ではそのような変換は行われない
例えば配列へのポインタを使用する場合やsizeofを使う時など
配列は配列のまま扱われる
int a[10];
int (*p)[10] = &a; // 配列へのポインタ
そしてsizeofは演算子
普通の関数じゃないどころか、関数ですらない
あと、型のサイズを取得する場合は括弧が必須ね
407 :
デフォルトの名無しさん :2012/10/21(日) 11:37:54.91
404>391だね
スレッドを使いたくて 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' に変換できません。 となります。どうすれば良いのでしょうか?
staticにすればいいよ
>>408 > A::ThreadFunc' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。
こんなレベルの奴がマルチスレッドとかやるなよ…
4人のチャンコロが4本の箸で飯を食うのは不衛生極まりないことを理解できない奴はマルチスレッドに手を出すべきではない。
>>412 腹痛でトイレがデッドロックですね。分かりま・・・いや、あいつらなら問題ないか。
4本…?
そう、4膳ではなく4本。 つまり、2人が食い続けると2人が飢え死にするわけ。
416 :
366 :2012/10/21(日) 16:46:08.27
>>405 なっるほどー!例が分かりやすかったです。
int (&x)[3]にint a[4]を代入出来ないというのが味噌ですね。
template<std::size_t N>
int length(int (&ary)[N]) {}
で<>を省いた時に、特にその関連性を示しているわけでも無いのに、
aryの要素数が自動でNに格納されるのが不思議だと思いました。
これはもう慣れの話でしょうか。
前にポインタ宣言について質問した者なのですが、 配列もまた宣言の時の要素数と式中の配列の添え字指定とでは異なるものだと理解してよろしいのでしょうか? つまり、 int sample[10]という配列があって、 sample[0]が最初の要素の添え字指定で、sample[9]が最後の要素になりますよね? その場合、sample[10]という要素はありませんよね? ではなぜ、宣言のところの[]と式の[]は同じ[]を使っているのでしょうか? ポインタの時もそうでしたが、つい混同してしまいます。。。
> ではなぜ、宣言のところの[]と式の[]は同じ[]を使っているのでしょうか? そういう約束だから、そういうもんだと諦める 自分で新しく言語を作るつもりなら 吟味してくれい 宣言は 「利用可能な個数」を指示 (10個) 式中のは (ポインタ主体の思考で) 先頭からのオフセット0〜オフセット9 sample[offset] → *(sample + offset)
開発環境:VC++2008 質問:std::ifstreamのread関数でstd::stringにファイルの読み出しを行いたい read関数の第一引数(データの受け取り)にchar*を渡す必要があり、 string型でchar*に相当するものを考えると、むしろそのまま変数を渡すくらいかと思ったのですが、 当然型が違うのでコンパイルが通りません。 当たり前かもしれませんが、強引に&string[0]のように渡しても、コンパイルこそ通れどうまく動きません。 const char*に関してはc_str()関数を使えば問題ないのですが char*を要求されたときstring型で上手く実現する方法を教えていただきたいです。
横から質問失礼 グローバル変数をやむなく使うというのは例えばどういう状況でしょうか 自分は結構頻繁に使ってましたorz
>>422 ブロックを抜けたら寿命が尽きても構わない→自動変数
スコープはブロック内で充分→ブロック内静的変数
スコープは関数内で充分→関数内静的変数
スコープは関数外にまで拡げたい→翻訳単位内静的変数
翻訳単位外からは関数経由でアクセスできると言っても納得せず、
どうしても公開せよと迫られる→グローバル変数
コード記述時は未確定だけど アプリケーション起動時に(設定ファイル等から)確定する定数とか
シングルトンでまとめてるけど、広い意味でグローバル変数と同等だと考えてる
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; }
stdoutやerrnoがグローバル変数であるケースは結構ある。 むしろマルチスレッド対応で関数になってたりするけど。
C言語ですが、 配列の要素数の宣言に変数は使用できませんよね? gcc(MinGW?)では可能と聞いたのですが、本当ですか? またそれによって実行ファイルが環境に依存することはありますか?
C99では出来るしgccはC99をかなり取り入れてるしgcc独自の拡張もあるし どれの事を言ってるのかはっきりしないと答えようがない
C99なら配列の要素数の宣言に変数が使える それによって実行ファイルが環境に依存することはありえる まあそんな処理系知らないけど
>>429 LSI-C試食版でコンパイルできない。
gcc独自拡張に、配列の添字に変数が使えるようになる機能がある。だから、本当
C89だと無理だが、gcc独自拡張があればイケる C99ならどのコンパイラでもいけるがC99非対応のコンパイラじゃ無理
誰かが大きさを実行時に決められる自動配列はalloca()の糖衣構文だと言っていたなあ
みえない
>>432 今時そんな骨董品を使う方がどうかしている。
パソコンとはかぎらない
C++の拡張子なにつかってる? cppがデファクトスタンダードだと思うんだがgoogleのスタイルガイドだとccだた
cpp/cxx/cpはともかくccの2つ目のcはどこから来たんだよ C with Classes の名残とかだったらいい加減やめようや
むしろcpp以外になる理由が知りたい
c++の+を45度回転 cxx
Cのプログラムのファイルの拡張子は、 .c .h C++の拡張子は、いろいろある。 .C .c++ .cc .cp .cpp .CPP .cxx .h .h++ .hh .hp .hpp .hxx
Cをインクリメントしたら2つになったとか? cppはどうしても、プリプロセッサを想像してしまうんだよな。
プリプロセッサなら.hの方を思い出すのが普通な気も……
>>444 大杉ワロタw
.c++は見たことないな
>>446 #include とか #if とかのプリプロセス処理の展開を済ませた中間ファイル的だね って意図じゃない?
ヘッダファイルでstring型の変数宣言するときに、そのヘッダファイルに#include <string>を書くべきでしょうか? かなり初歩的な質問ですまん
stringはよく使うから プリコンパイルヘッダファイルが使えるなら そっちでincludeした方がいい 使えないならそのヘッダファイルに書いた方がいい そのヘッダファイルでincludeしてる別のヘッダファイル内でたまたまincludeされていて そのヘッダファイルでstringをincludeしなくてもコンパイルが通る事もあるけど、 その別のヘッダファイルの内容が変更される可能性を考えると 自分でincludeした方が無難 (その別のヘッダファイルというのが標準ヘッダファイルであっても、 コンパイラを変更したらコンパイル通らなくなったとかよくある事)
でも明らかにstringを使っていないと破綻するクラスのヘッダをインクルードした場合は 無理に自分でインクルードする必要は無いと思われ
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]の色になってしまいます 解決方法がありましたら教えてください
WriteConsoleOutputW
>>454 ありがとうございます
それはWriteConsoleOutputのワイド文字版みたいですね
AsciiCharに入力すると、XPでは別の半角文字に変わり、
UnicodeCharに入力すると、XPでは全角+半角の3文字分表示され、
98ではどちらに入力しても表示されませんでした
98 のテスト環境なんてもう持ってないな なんでそんなの使ってんの?
>>456 XPメインで98はテストですね
コンソールゲームは古い技術だと思うので、
古いマシンでも同じように動いて欲しくてテストしています
ofstreamまたはifstreamでファイルが開けなかった時にcloseする必要ってありますか? // 例 ofstream ofs("test.txt"); if (ofs.fail()) { ofs.close(); // ←これ }
460 :
459 :2012/10/26(金) 20:09:15.29
>>453 ごめん、全角1文字を半分ずつ色を変えたいのか。ちゃんと読んでなかったわ。
>>458 開いてないものを閉じることが出来ると思ってるのか?
まあ開いてないファイルストリームを閉じようとしても失敗するだけなんで別にいいけど
>>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とコンパイラのマニュアルで確認してくれ
close()してもclear()しないとfailbitが立ったままなんで気をつけないとな
つまり使い回すなってことだ
どう居た前
不要
ありがとう
何が仮想関数であるべきかが設計時に判らないのに あらかじめ基底クラスになるかどうかも判らないクラスに あらかじめ virtual 書いておかなければならないとか C++ の最大の欠陥
で?
わかってない段階からコーディングするとか、バカすぎ。
質問させてもらいます。 現在64bit メモリ4Gの環境でプログラムを組んでいます。 動的に大容量のメモリを確保する場合、32bitのOSでは2Gが最大との記述を読みましたが、64bitでは最大確保容量=物理メモリと考えてよいのでしょうか? また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?
いいえ
>>473 > また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?
静的に確保した変数はスタックに取られるわけじゃないぞ。
476 :
デフォルトの名無しさん :2012/10/27(土) 18:14:35.49
>>470 で、全ての関数に virtual がついている言語には欠陥がないとでも言うのか
おまえ自分で考える頭がないのをどこに転嫁しても笑われるだけなのを認識しろよ
>>476 ご指摘ありがとうございます。
静的な確保の場合は静的領域ですね。
478 :
デフォルトの名無しさん :2012/10/27(土) 18:56:50.16
>>473 スタックに取られるのはC系の場合自動変数。
基本的に自動変数であまり大きな領域を取ってはいけない。
Windows APIを使ってメモリ確保した場合は仮想メモリから
取られるので、実メモリ+仮想記憶が許す範囲で取れる。
いろいろ勘違いしてるので基本の学習が先だな。
480 :
デフォルトの名無しさん :2012/10/27(土) 19:48:16.98
基本の学習って、アセンブラでもやれってか? むしろCで「処理系依存」を毛嫌いしすぎるのが そういう系の習得を邪魔しているだけなんだが
>>479 > いろいろ勘違いしてるので基本の学習が先だな。
お前がな。
64bit系OSでは仮想メモリを使わない設定の場合もある気がする
て言うか、スタックとか静的領域とかのストレージクラスの話と、 仮想メモリーをごっちゃにしてて、偉そうに何言ってるんだ? って話だろ。 あと、組み込みとかで仮想記憶使わないシステムなんていくら でもあるよ。
メモリ確保量の限界を聞いてるんだから 仮想メモリの話は当然出てくるだろう
flvのファイルをドロップドラッグしてリストに表示し ボタンを押すとひとファイルずつキー操作する みたいなことやりたいんだがヒントくれ。
ポインタと文字列定数について質問があります。 int main() { char *s; s = "Pointers are fun to use.\n" cout << s; return 0; ? というサンプルコードなんですが、なぜポインタ変数に文字列定数を 代入できるんでしょうか? また、試しにcout <<*sとしてみると先頭の一文字(P)だけ表示されるのですが、なぜなのでしょうか?
ドロップドラッグ
*s = 文字列ポインタの実体の先頭 = P だからその動作は正しい。 cout << s なら文字列が表示されるはず。
もうちょっと詳しく書くと "Pointers are fun to use.\n" これはコンパイラが暗黙のうちにメモリのどこかの領域に 文字列を定義しているということ。 s = "Pointers are fun to use.\n" は、コンパイラが定義した文字列領域の先頭アドレスを ポインタ変数に代入しているということ。 だから *s つまりポインタの実体(の先頭)を表示すると Pが表示される。 アドレスから文字列全体を表示する(cout << s)の場合は 文字列全体が表示される。
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");
}
っておかしいですよね?
その質問は何が知りたくてどんな答えを求めてるの? 日本語レベルからやり直したほうがいいぞ。
#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; }
>>490 trueかfalseか確認してるだけだからおかしくはない。
コードにセンスないとは感じるが。
assert使った方がいいね
c_str()を比較するとポインタを比較している事になって正しくない ポインタの比較は同一の配列か同一の文字列内でしか出来ない
#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; }
>>495 だったらNULLとの比較もできないことになるが
>>495 stringの使い方からするとおかしいが、比較そのものは合法。
論点はどっちだ?
いやそうじゃないだろ ポインタが同じところ差してるからと言って 中身が同じとは限らないのが問題なんだろ
>>495 > ポインタの比較は同一の配列か同一の文字列内でしか出来ない
大小比較は出来ない (と言うか意味ない) けど、一致比較は出来ると思うぞ。
>大小比較は出来ない (と言うか意味ない) けど、 位置の前後は意味あるんじゃない? 差分もとれるし。 意味ないのは和の方。
意味あるかないかであれば、どっちも正しいが正しい 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"か区別つくよ */
ポインタ値の大小の話がなんで位置の話になるんだよ。
>>501 > 位置の前後は意味あるんじゃない?
> 差分もとれるし。
だからそれが意味を持つのは、「同一の配列か同一の文字列内」の場合だけでしょ。
別に任意のポインタを比較したっていい それが意味を持つかどうかは、要件次第
>>505 > 別に任意のポインタを比較したっていい
規格上は「ダウト」じゃなかったっけ?
507 :
486 :2012/10/28(日) 13:38:38.48
>506 p == NULL とか p == q とか また「任意じゃない」とか言い出すんだろうな
509 :
486 :2012/10/28(日) 14:04:45.39
>>488 ところで、なぜポインタ変数に文字列を代入できるんでしょうか?
普通は、アドレス(数値)を代入するのではないでしょうか?
そういう仕様だということで納得するしかないのでしょうか?
文字列リテラルはその文字列が格納される先頭アドレスを表すから
>>508 > p == q
p, q が near ポインタだと p == q でも、違うところを指してるケースがあるとか、
なかったっけ?
512 :
486 :2012/10/28(日) 14:34:05.93
>>510 レスありがとうございます。
文字列リテラルの先頭アドレスは &sで出てくる値で正しいのでしょうか?
sでいい &sだとポインタ変数のアドレスになっちまう
514 :
デフォルトの名無しさん :2012/10/28(日) 14:59:08.72
>>512 初心者本買って勉強しろ。
そして死ね。
515 :
486 :2012/10/28(日) 14:59:53.40
>>513 sのアドレスが見たい時はどうすればよいのでしょうか?
>>515 std::cout << static_cast<void*>(s) << std::endl;
こういうことか?
>>516 初心者なのでまだその式の意味がわかりません。
難しい話のようなのでもうちょっと勉強してきます。
素朴な疑問だが、文字列リテラルってなんで文字定数('A')じゃだめなの?
null終端じゃないからじゃね
文字定数が 終端の '\0' を含めて連続配置されたのが文字列リテラル 代入は配列とポインタの関係みたいなもんだな int a[] = { 1, 2, 3, 4, 0 }; int *p = a; /* 0 が終端である約束を元に表示する */ while (*p) { printf("%d", *p); p++; }
>>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個で渡した方がよくね?ってこと。
文字が複数個と文字列は、明らかに別物だから、別物になってるだけ ジェネレートされた命令列は関係ない
Cは暗黙のうちに定義される動作がわかりにくいんだよな。 紙にメモリと変数領域を自分で書きながら勉強するといいかも。
馬鹿には無理。 馬鹿でないなら紙に書かなくても理解できる。 紙に書いて理解できたと思っているのは、実は理解できていない馬鹿か、 無駄なことをしていることに気付いていないだけ。
英単語は書かないとスペル間違うぞ
自分が判らないからと言って相手も判らないと思い込み 論を語る基地害ってどこから湧いてくるんだろうな
・「みんなの意見」「他の人もそう思ってる」など、自分の意見なのに他人もそう思ってると力説する人 他人が自分とは違うという事実が受け入れられない人です。自分の意見が通らないとコピペや荒らしなど 無茶をし始めるので見かけたら放置してください。 ・根拠もなく、他人を卑下したり、差別したりする人、自分で自分を褒める人 他人を卑下することで自分を慰めようとする人です。実生活で他人に褒めてもらう機会がないが プライドだけは高いとか、匿名の掲示板しか話し相手のいない人です。可哀想なので放置してください。 ・自分の感情だけ書く人 「〜〜がムカツク」とか自分の感情を掲示板に書くことに意味があると思っている人です。 何がどのようにムカツクのか論理的に書いてあれば、他人が読んでも意味のある文章になりますが、 そういった論理的思考の出来ない人です。もうちょっと賢くなるまでは放置してあげてください。
今日そのコピペ流行ってるな
×他人を卑下したり ○他人を蔑視したり 自分を卑下します
WinGWからDirectXって使えますか?
もちのろん
MinGWな
TがUを公開継承していて暗黙変換可能なとき IHoge<T>を暗黙にIHoge<U>に変換可能にするような書き方ってできますか?
534 :
デフォルトの名無しさん :2012/11/01(木) 09:06:41.82
template <class T> struct IHoge { T m; template <class U> IHoge& operator = (const IHoge<U>& r) { m = r.m; return *this; } };
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()); ↑みたいな感じにしたいです
hoge 禁止!
>>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; }
};
>>537 TとUは一般的なクラスなんで特殊化だけでは対応し切れません
バイト列をstd::stringで扱うと何か問題ありますか? ヌルとかがあるとまずいかなと思って今まで vector<char>でやってました。
>539 後者が正解
ちょっと混乱したのでお助けを const char* p だと *p = 0; これはダメで p = "hoge"; これは可能 つまりポインタ先の変更は不可能だが、ポインタ自体は変更可能 では const char** h; だと・・・? char*を一つの型として考えて *hが変更不可能だと思ったのですが実際は *hに代入ができました どう考えるべきですか?
遠い方に効く
こういう問題があるから前にconstを書くやつはクズ 後ろに書けば明快でよろしい
何をconstにしたいかによるだろ
何をコンストにしたいか一目瞭然だから後置がいいんだよ
色々ありがとうございます 何か自分が単純な思い落としをしていたのかと思ってたのですが 意外に根が深そうですね もうちょっと自分で整理つけてみます
最初のうちは変数宣言を日本語訳?するとわかりやすいかもしれない(?) 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 ・参照外しした場合は右から一つずつ『へのポインタ型の変数・定数』を外していく
>>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型の変数』だから変更できる
>>541 エキスパートCプログラミングという本を読むといい。
そのへんのことが詳しく書いてある。
csvを読み込むソースください。 自分で実装しようと思ったけど、"とか改行とか考えるとめんどくさくなった
csvにも仕様が色々ありすぎてどうしようもない
excelで出力したやつ
ならまずその仕様を明確に調査してくれ
そこまでするなら自分で作ります
CSVってガチにやると凄ぇ面倒くさかった気がする。
基本カンマ区切りだけど、""内は文字列として扱う、だけじゃ駄目か
>>557 で、""でくくられると、くくられた文字列ないには大抵改行が入ってるのな
a,"b1,b2",c とかも考慮したりするとめんどいな
560 :
デフォルトの名無しさん :2012/11/03(土) 09:59:54.47
プログラミング作法にけっこう解説あるけど、そういうの読むのは面倒?
abc,"def , "" , ghi",jkl,"mno pqr" なんてのも扱えないといけないよ
改行がCRLFのときに""内にCRだけの改行が入ってたり
>>562 これは無理なのでは。
""で囲まれたセンテンスの中にさらに " があった場合、これが終わりをしめすのか更なる""センテンスを示すのかはどうやって決定すればいい?
人間はどう解釈している?
状態遷移図書いてみろや 書けなかったらその構文では無理って事だ
" " 内の "" は " という文字のエスケープシーケンスだろ、この場合
"abc" "def , \" , ghi" "jkl" "mno\npqr" だろ
>>569 ごめん
いまいちルールが理解できないわ
カンマとダブルクォーテーションは、どちらが優先的に解析されるのだ?
ダブルクォーテーションが優先されなかったら 何の為に書くんだよw
正直な話、RFC読んで実装をさっくり諦めるくらいの規模ではあるよな
,"x,x"xx"x,x", と来たらどうするのかとか ,x"x,x"x, と来たらどうするのかとか 改行までを読み込んだり特定文字列で分割して配列に詰め込むことが サポートされてる言語使い程度には扱えないよねw
>>541 ではないが"エキスパートCプログラミング"を購入した
256倍本もまた販売してほしくなった
昔、accessとexeclでCSVの解釈が違ってたが、もう直ったのかな
CSVって方言多いんじゃないの
Excelを標準にするのが妥当でしょ abc,d"e とか abc,"d"e みたいなのはパーズエラーで、どうにでもすればよろし
parse 【pɑ'ːrs】 濁りません
579 :
デフォルトの名無しさん :2012/11/03(土) 22:48:22.33
577 は考えるのをやめた
[p?'?z] 濁る発音もあるよ!
>>577 > Excelを標準にするのが妥当でしょ
その使用ってどっかにあるのか?
って話だと思うが。
正式な奴があるなら、俺も欲しい。
583 :
557 :2012/11/04(日) 00:31:19.91
>>558 あれって行単位で扱うもんじゃないの?
>>559 俺のやり方だと「a,"b1」と「b2",c」に分かれるんだが、駄目なん?
(文字列内に,があったら""で囲む。"があったらエスケープする的な)
でも
>>577 のようなパターンもあるのか……
デファクトスタンダード的にはExcelに合わせるべきなんだろうが、嫌な話だな
>>583 > あれって行単位で扱うもんじゃないの?
たいていの人はそう思うと思うんだけど、デファクトの Excel が改行を入れてくるから。
CSVを1行ずつ読み取って解析しようと考える奴は ExcelはAlt+Enterでセル内に改行を入れられることを 知らないことが多くない?w
まず一般人でそのことを知らない人について統計をとれ その後でCSVを1行ずつ読み取って解析しようと考える奴についてそのことを知らないかどうかの統計をとれ 結果に有意な差が出たらお前のことを認めてやる
いや、1行ずつ読み取って解析しようと考える奴とそうでないやつとで比べないと・・・
588 :
583 :2012/11/04(日) 08:53:12.74
>>584-586 ぐぬぬ……
それを知ってしまったら、対策用コードを新たに考えなくちゃならんじゃなイカ!
Windows.hのGetPrivateProfileStringって引数が LPCTSTR lpAppName, // セクション名 LPCTSTR lpKeyName, // キー名 LPCTSTR lpDefault, // 既定の文字列 LPTSTR lpReturnedString, // 情報が格納されるバッファ DWORD nSize, // 情報バッファのサイズ LPCTSTR lpFileName // .ini ファイルの名前 な感じの奴なんですけど、この >LPTSTR lpReturnedString, // 情報が格納されるバッファ というのをstd::stringで受け取りたいんですけど、どうしたらいいですか?
>>589 cpp11なら&str[0]を引数に渡す
そうじゃないならテンポラリバッファを渡す
591 :
デフォルトの名無しさん :2012/11/04(日) 09:54:29.27
>>589 void func(std::string s) {}
int main()
{
LPTSTR lpReturnedString;
func(lpReturnedString);
}
>>590 cppのバージョンがよくわからないです。。
vs2010だとテンポラリバッファのほうを使うしかないですか?
またテンポラリバッファってvectorでもいいんでしょうか?
文字列の長さが決まってないんですが、予め255文字文newするというのはできるだけしたくないです。
連投ですいません。
>>584-585 1行をCRLFまでと考えれば
セル内の改行はLFのみだから
正しく処理出来るんだけどなぁ
>>585 じゃあお前ならどうやる?
何行読む必要あるかは、中身解析しないとわからないから、
一行ずつ読み込んで解析して、継続行の読み込みが必要か
を見ていくのが普通だと思うが。
>>592 vector でも構わないけど
>予め255文字文newする
これと同じことは必要
>594 >593
>>595 ありがとうございます
&str[0]はやめて一時変数と割りきって余分に確保します・・
動的確保にへんな苦手意識持つ若者が増えてきてるよね ジジイが執筆した時代に逆行したクソみたいな参考書がヒープ確保は高コストだから控えようみたいな脅しかけるからかな
C++使うからには資源管理を徹底したいじゃないですか(´・ω・`)
動的確保のコストの話と、資源管理の徹底の話をごっちゃにするなよ…
602 :
デフォルトの名無しさん :2012/11/04(日) 13:25:11.21
>>597 厳密にやりたいならリトライ機能を作り込むしかないよ
サイズはこちらからAPIに教えてあげるんだし、確か書き込まれたサイズも取れたよね?
やってみてダメなら大きいサイズを確保してリトライするって感じね
C++で質問です。 ゲームを作っていて、戦闘、移動などをシーンクラスで実装しようとしています。 メインループ内において、シーンを遷移するかの判定を行っており、遷移判定が真ならシーンオブジェクトを破棄して、 遷移後のシーンオブジェクトを生成します。 現在、 ダンジョン内の移動シーン→敵に遭遇→戦闘シーンへ遷移→戦闘に勝利→ダンジョン内の移動シーンに遷移 を実装しようとしています。 しかし、遷移後の移動シーンにダンジョン内の位置情報を渡す方法が判らず、戦闘が終わると毎回ダンジョンの入り口に 戻ってしまいます。 そこで質問です。 クラスのコンストラクタに何かデータを渡して、データメンバを初期化する方法はありますでしょうか?
メンバ初期化子
構造体で typedef struct _abc { int a; int b; int c; } abc; があるとき、 abc x = {1, 2, 3}; と初期化出来ますが、 その後 x = {4, 5, 6}; と代入しようとしてもエラーになります。 x = abc(4, 5, 6); とすると引数ありのコンストラクタが定義されていないと言われます。 コンストラクタを書けば解決するのは判りますが、 コンストラクタは書かずに、 x.a = 4; とかメンバごとに代入するのもせずに、 x = {4, 5, 6}; のように効率的に書く方法はありますか?
代入演算子を定義する
ああそうですね。 >コンストラクタは書かずに、 の理由が、 構造体の定義があるのが他人の書いたヘッダなので、勝手に書き換えられないんです。
void Copyabc(abc* p, int a, int b, int c) { p->a = a; p->b = b; p->c = c; }
typedef struct _def : public abc { _def(int x, int y, int z) { a = x, b = y, c = z; } } def; abc x = {1, 2, 3}; x = def(4, 5, 6);
612 :
デフォルトの名無しさん :2012/11/06(火) 20:41:35.51
C++難しすぎなのですが、皆さんはどのようにマスターしたのですか? プログラムを書きまくれ!とおっしゃる方がいらっしゃいますが、 どのようなプログラムをどのような思考法で書いたのか教えていただけるとありがたいです。
概念的な問題はコード書けばわかるってものではない。 個人的にはC++の勉強をする前にJavaとデザインパターンの 勉強をすすめる。
なぜJavaとデザインパターン?
Javaの利点 ・暴走しにくい ・多重継承が禁止されている(多重継承はC++で学べばよい) ・C++のような無理やりCを拡張した形ではないので構造がシンプル もちろん欠点もあるけどね。
なぜデザインパターン?
引き出しを増やすため、か?
結城本がJavaだしなあ
>>612 マスターしてるか不明だが、仕事でC++書いているので俺の方法を書いてみる。
C言語のプログラムは脱初心者レベル(宿題スレの問題がサクっと解ける)を前提として、
C++の薄い本をなんでもいいから1週間くらいで一冊読む。厚い本は避ける。
この時点で、中身を完全に覚えようとは思わない。こんな風に書くんだ程度の認識でOK。
次にC++で書かれた動くコードを実際に読んでみる。仕事で使うコードならそれでOK。
仕事で使ってないけど勉強のためならCppUnitのコードがおすすめ。
コードを眺めながら、player::setnameの::って何だ?とか、コンストラクタって何だっけ?、インスタンスって何?とか、
class kodomo : public oyaji, public ofukuro {... の : って何やってんだ?とか疑問が出たら随時調べていく。
本で分からなければWebで調べる。それでもって、似たようなコードを自分で書いてみる。
次にオブジェクト指向の第一歩として、それぞれのクラスが他のクラスとどういうやり取りをしているか把握する。
絵に書いたり、文字にしたり。いまいちつかめないなら、なんでも良いので自分でコードを書いてみる。
例えば、お店に行って何か物を買うというプログラムを書いてみる。人がいて、俺がいて、店員がいて、
物を選ぶ、お金を払うという動作が俺にはできる。店員はお釣りを渡すという動作ができる。などなど。
慣れてきたらコードを読む。眺めるのではなくて読む。このクラスは何をしているのか。
他のクラスとどういうやり取りをしているのか。 これを続けていくとコード全体が見えてくる。
時間はかかるけど、俺はこんな風に手間暇かけてやっていった。
コードを書いてて、どんなコードを書くときも似たような方法で書くなと感じたらデザインパターンを見る。
C++書いてるけど、効率悪いなと感じたら、Effective C++を読む。
一応、これだけできたら普通のプログラマレベルにはなってると思う。
>>619 C含めておすすめのC++の本教えてくれ。
>>620 エキスパートCプログラミングはすべてのC初学者に読んでほしい。
623 :
デフォルトの名無しさん :2012/11/06(火) 23:00:40.93
エキスパートCプログラミングの前に読むべき本は?
K&R2
>>621 C++の薄い本をなんでもいいから眺めながら、
かいてみたら、なにやってんだ?とか疑問が出た
最終的にはちゃんとした厚い入門書は読んでおかないと 端々で知識が怪しくなるぞ
>>620 では読んだ本だけ。アーキテクトさん、学者さんが見たらなめんなと思われるかもしれないが。
後は実コードを見ながらにらめっこ。
C:
C実践プログラミング 第3版
C言語ポインタ完全制覇
定本 Cプログラマのためのアルゴリズムとデータ構造
C++:
C++実践プログラミング 第2版
C++クラスと継承完全制覇
オブジェクト指向における再利用のためのデザインパターン
Effective C++ 第3版
その他:
オブジェクト指向における再利用のためのデザインパターン
プログラミング作法
珠玉のプログラミング
>>621 C++どう動いてるか理解して
自分でコード読んで書いて
めげずに頑張れ
>>611 型が違うのに代入出来るんですね。
すげー
計算式で、 テンポラリバッファを用意したほうが速いのかGetメソッドを使って毎回呼び出したほうが速いのか どっちのほうが速いんでしょうか? 勿論、最初の方はGetのほうが速いんでしょうけど、どれくらいから逆転するか・・・
コードでおk
某シューティングゲーム作成サイトでC++使わされて今に至る ポインタやSTLのイテレータとか使えれば新卒ならどや顔できるよね?(´・ω・`)
実測しろ 終わり
>>630 printf("%d",GetNum());
を100回繰り返したのと
int i = GetNum();
としておいて
printf("%d",i);
を100回繰り返したのではどっちが速いのかなーと、
予想では最初は前者が早くてあとから後者のコードが追いつくって思うんだけど、どれくらいで逆転するのか
>>633 GetNum()とやらの実装はわからんが、関数なら、2回目から後者が速い。
オブジェクトの内部の値を外部に渡す方法って get以外にありますか? int CSample::get() { return m_num; }
int CSample::kure() { return m_num; }
あっ
639 :
636 :2012/11/07(水) 23:40:53.85
他のやり方ありますでしょうか?
コールバック与えたら、そいつに値を付けて呼び返してくれるとか
publicにするとか
はぁ... swtich(){ case 0: ... case default: break; }
class CSampleBase{ union{ int m_num; const int num; }; }; class CSample : CSampleBase{ public: using CSampleBase::num; }; VC以外でできるのか知らんけど。
>>588 CSVリーダ作ってて発見したんだが、エクセルノセルにテキストエディタでコピーした
内容をペーストすると、任意の改行コードを混在させられる。
""でくくられるからいいんだけど、解析側が知らないとえらいことになるよ。
シフト演算って、動的に値が0となった場合にも演算コストかかるのでしょうか? たとえば、int arr[4] = {0, 4, 8, 12,}としていて、 static x; // どこかでxに値が入る func(int i) { x >>= arr[i]; } となっているとき、func(0)としたときとしたときとfunc(1)としたときで演算時間に差が生じるでしょうか? 差が生じないのであれば、arr[4] = {4, 8, 12, 16}としたいと思っているので、気になっています。
すみません脱字が。static int x、void func(int i)でした。 この演算はプログラムの中で最も多く(億単位で)呼び出されるものなので少しでも時間を削りたいと思っています。
>>646 それ環境依存だね
バレルシフタを使用しているハードウェアならほとんど差はない
それより億単位で呼び出されるならインライン化かマクロ化した方が 効果が大きいんじゃね CALL/RETによるパイプラインバブルの発生はコストが大きいぞ 頭の良いCPUなら投機実行してくれるけど
いやむしろ関数に入る時にいくつかの破壊されるレジスタの内容をを退避/復帰させる時間が 馬鹿にならない
ついでに言えば、 staic const int arr[] = {0, 4, 8, 12, 16, }; x >>= arr[i]; なら x >>= (i * 4); とした方が最適化されやすい。
早速ありがとうございます。
>>648 そんなのがあるのですね。
実行環境はCore i5 2500Kです。
それと申し訳ないのですが、上の例はいい加減で、実際にはunsigned __int64 arr[4] = {0, 13, 26, 39}でした。
また、xは実際にはクラスメンバで、unsigned __int64 x;です。
>>649 >>650 ちょっと書くのが面倒で上のように書きましたが、インライン化はしています。
実際にはfuncの中に他の処理も入っていて、私の場合はインライン化で1割くらい実行時間が減りました。
ちょっと面倒でもやはり(arr[4] = {0, 13, 26, 39}とarr[4] = {13, 26, 39, 52}とで)計測するのが一番なんですかね。
今は計測にtime.hのclock()を使っているのですが、どうも実行するごとにコンマ数秒程度は値がずれたりしてていまいち信用できず面倒に感じてしまっています。
ある程度のずれは、割り込み等や他タスクの関係で当然だが rdtscを使って、かつそれほどループ回数を多くしなければ、 大抵は比較的ぶれの少ない数値になるはず。
>>652 >どうも実行するごとにコンマ数秒程度は値がずれたりして
え!?あたりまえじゃん
YOU!compiler intrinsics 使っちゃいなYO!
ずれを小さくするにはSetPriorityClass()使えよ ただし、REALTIME_PRIORITY_CLASSを指定するとデバイスドライバまでロックされて もしプログラムが停止しない場合リセットするしか方法がなくなるんで注意 HIGH_PRIORITY_CLASSあたりがいいかも
皆さんありがとうございます。 自分の計測は随分といい加減なやり方だったようです。 HIGH_PRIORITY_CLASSにしてrdtsc (intrin.h) 使うなどしてみます。
QueryPerformanceCounter()とQueryPerformanceFrequency()使うと楽だけどな OSのAPIには結構美味しい物が揃っている
CPUクロックが可変だったりして。
CPU Load 100%で仕事をさせれば平気だろ RDTSCが一番確実だけど
値が0だろうが1だろうが全bitをずらすのがシフトだから 演算そのものは実行されるだろう。 結果が変わるかどうかは演算には関係のない話。
1bitずらすより31bitずらす方が 時間掛かるような気がするが 最近のCPUはそうでもないのか
Model View Controller - Wikipedia
http://ja.wikipedia.org/wiki/Model_View_Controller MVCパターンで疑問があります。
動画プレイヤー的なGUIアプリをWin32APIで構築してみたんですが、
ViewとControllerを分離する利点がいまいち理解できません。
Modelに関しては表示や入力に関する処理から切り離すことができて、
本質的な処理(ファイルから動画を読みだしたりフィルタ処理をかけたり)だけ
記述できてスッキリしましたし、GUIを変えたくなってもModelは一切手を加えずに済みます。
しかし、ViewとControllerはいずれもModelをコンポジションしている、
つまり、Modelに依存している点で同じです。
強いて違いを挙げるなら、
「ViewはModelの状態を参照するメソッド(フィルタ処理された最終イメージを参照)をコールする」、
「ControllerはModelの状態や動作を変化させるメソッド(ファイルを開く/再生/停止)をコールする」、
という点だと思いますが、
Modelのメソッドをコールするという点では同じですし、
特にモジュール結合度の点で有利というわけではありません。
ViewとControllerを分離する意義は
何に見出せるのでしょうか??
>>662 おまえは質問の意味がわかってない。
>>648 で答えが出てるから、そもそもレス自体無意味だし。
>>664 モジュール分割すること自体の意義と、それをMVCに分類することの意義をごっちゃにしている。
モジュール分割を行うにあたって、MVCそれぞれの役割に分類することで結合度を比較的
低く抑えられるという、多分に経験則的な設計指針であって、ダイアグラムだけ見てそれが
良いか悪いかと言えるような性質のものではない。
極端な話、モジュール分割を行わなければ「モジュール結合度」は高くならんわけだし。
>>663 そもそも1ビットだけずらす機械語命令があるのかと
668 :
デフォルトの名無しさん :2012/11/09(金) 21:54:52.62
あるよ余裕で
669 :
663 :2012/11/09(金) 21:55:16.92
ごめん、なんか1bitを勘違いしてた(´・ω・`)
670 :
667 :2012/11/09(金) 22:00:44.62
自演しすぎるとそうなる
672 :
664 :2012/11/09(金) 23:18:11.12
>>666 なるほど。
一般的にView&Controllerをいっしょこたにしたものはコード規模が大きく複雑になりがち。
そこでモジュール分割したいわけだが、
経験則的に結合度が低くなる傾向にあるのが
ViewとControllerという分け方、ということですね。
あと、思ったのですが、Viewはアプリの面構えに関する処理の責務を負うわけで、
例えばWin32APIのGUIパーツでなく、DirectXやOpenGLを使った
3DでクールなGUIを構築するということもできると。
そういった見た目の変更をしたいときにはViewだけを変更すればいいわけで
Controllerは一切手を加えずに済みます。
はっきりとした責務、コードの見通しの良さ、変更の容易性など、
これらのバランスが良くなる一つの例がMVCであるということですね。
673 :
664 :2012/11/10(土) 00:17:20.23
もう一つ、ViewとControllerを分ける良い点がWebで見つかりました。 同じアプリでも、管理者向けのフル機能のGUIと、 ユーザー向けに必要十分な機能のGUIとが求められることがあり (実際、自分の会社でもこういった要求がありました)、 Controllerはフル機能に対して作ったものを、 機能限定版のGUIに対して一切手を加えずに共有できるというものです。 とても納得がいきました。
当たり前すぎる
vector<kurasu> list; list.push_back(kurasu1); ってやったときコピーコンストラクタは呼ばれますか? このpush_backってインスタンスのコピーを追加するんですよね??
人間その当たり前をせずにどれだけ苦労してきたか
677 :
デフォルトの名無しさん :2012/11/10(土) 11:36:29.96
kurasuクラスにint型のGetSetがあるとして kurasu* kurasu1 = new kurasu(); kurasu1->SetInt(123); vector<kurasu> list; list.push_back(*kurasu1); としたかったんですが値がコピーされません。(list[0].GetInt()でぬるぽエラー コピーコンストラクタを定義したせいでしょうか?
upされてない部分について聞かれても答えようが無いであります
list[list.size()-1].GetInt()
684 :
デフォルトの名無しさん :2012/11/10(土) 12:30:45.45
きっと reserve したかっただけなのに resize しちゃったんだろうと E. S. P.
ごめんなさい、コピーコンストラクタの質問でした。 kurasu::kurasu(){ this.flag=false; this.num=456; } kurasu::SetNum(int tmp){ this.Num=tmp; } kurasu::kurasu(const kurasu&){ this.flag=true; } こんな感じで、 kurasu* kurasu1 = new kurasu(); kurasu1->SetNum(123); kurasu* kurasu2 = kurasu1; と処理した時に kurasu2.Numが456 kurasu2.flagがtrue って・・・
ぬるぽ関係ねえ
>>685 何がやりたいのか分からないけど、numの値をコピーしたいなら
kurasu::kurasu(const kurasu& rhs){
this->flag=true;
this->num=rhs.num;
}
こんな感じに修正して
kurasu kurasu1;
kurasu1.SetNum(123);
kurasu kurasu2 = kurasu1;
こう
>>685 この部分
> kurasu* kurasu2 = kurasu1;
ここは、kurasu1のポインタをkurasu2にコピーしている。したがってkurasu1とkurasu2は同じオブジェクトを指す様になるのであります。
そこでkurasu1のポインタで指したオブジェクトをSetNumで変更すれば、同じオブジェクトを指すkurasu2のオブジェクトを変更したことになるのです。
この代入はポインターをコピーしているだけでコピーコンストラクタは呼ばれていないのです。
関数内で頻繁にエラー値をチェックしてエラーが出た時点でエラー値を返す関数があるんですが この関数のどこでエラーが発生したかを調べたいのですがなにかいい方法は思いつきますか? 関数の入り口で適当なクラスを作って、デストラクタが__LINE__マクロを受け取る事が出来れば楽なのですが そういった方法ってありますでしょうか?
適当に戻り値をassertでチェックすればいいんじゃね
>>690 エラー値を返すの「エラー値」が有無を示すプリミティブ値の
場合は戻り値を工夫すればいいんじゃないの。
たとえばエラーならtrue/エラーなしならfalseを返す関数なら
true/falseで返すのをやめて0-nの整数値で返すとか。
それなら return __LINE__; して0の時が成功でいいんじゃ
return __LINE__; で0が返ることってあったっけ?
ああエラーの時だけラインを返すって意味か。
それなら__FILE__も欲しいわな。
697 :
デフォルトの名無しさん :2012/11/11(日) 16:39:02.07
例外処理を知らないバカ共w
例外処理で自慢とか (w
で、その例外処理とやら、どう実装されてんの?
700 :
デフォルトの名無しさん :2012/11/12(月) 00:31:01.14
C#でいうところのstatic classのようなものをC++で実現するにはどのようにしますか? 目的は ・インスタンス化できなくする ・staticメンバー関数・メンバー変数のみにする。 適当な純粋仮想関数を用意する?
>>700 コンストラクタを private にする
あるいは、別解として無名名前空間に static 関数などを定義する
>>700 たかだか8文字書き加えるか1行移動するだけで実現できるが、お前には無理。
eclipseで「hello world c++ project」を実行すると 「nothing to build for project test」と表示され、実行できません。 原因は何でしょうか? Pleiades-eclipse-4.2&MinGWを使っています。 「hello world c project」の方では何とか実行できました。
>>703 あなたの環境固有の問題はほかの誰にも知ることはできません。
vectorの削除系メンバ関数について、以下の認識で合っているでしょうか? remove:指定要素が取り除かれるように要素をコピーしていく(メモリ領域は解放されない) pop_back:最後の要素のメモリ領域が解放される erase:指定範囲の要素のメモリ領域が解放される clear:全要素のメモリ領域が解放される いずれも、削除された分だけsize()で得られる要素数が減らされる。
vectorにremoveなんてあったっけ
>>706 pop_back:要素数が減る。メモリ領域は解放されない
erase:指定範囲の後ろの要素が前に詰められ、要素数が減る。メモリ領域は解放されない
clear:要素数が0になる。メモリ領域は解放されない。
pop_backは要素数がひとつ減るだった。あと消える要素はデストラクタが呼ばれるな
710 :
706 :2012/11/12(月) 21:07:12.73
>>707 すみません、vectorにはremoveはありませんでした(汗)
>>708 え!?
メモリ領域解放されないんですか??
覚えておきます!
>>709 デストラクタが呼ばれるんですね。
ありがとうございました。
>>710 C++11には確かスワップ技法を使わなくてもメモリを完全に解放するメンバ関数が加わったはずだけど
ど忘れした
shrink_to_fit()
>>712 ありがとう
これが出来て助かるんですよね
714 :
706 :2012/11/13(火) 00:23:27.67
>>714 vector<T> array;
array.push_back(T());
array.push_back(T());
//C++11未対応なら、以下のスワップ技法で。
vector<T> (array).swap(array);
shrink_to_fit は拘束力の無い要件なので、実装依存なんだよね まぁ、大抵はちゃんと領域を適切にしてくれるだろうけれど
717 :
706 :2012/11/13(火) 20:50:04.41
>>715 じつにクレバーな手法ですね!
shrink_to_fitが使えたとしても、
あえて使いたくなるかっこよさですw
>>716 覚えておきます!
>>717 Effective STLに書いてあるよ
719 :
706 :2012/11/14(水) 00:16:16.84
>>718 その本、持ってました・・・(汗)
たしか1年半ほど前に目を通したはずなんですが、
swap技法、ぜんぜん覚えてませんでした(汗)
付箋貼っておきました!
自分の書いたコードのバグを疑わない時点でおかしいでしょ。
>>721 再現可能な最小のケースまで切り詰めたコードで
代入と三項条件演算子とprintf()しか使っていないのですが、
具体的にどこがバグっているのか教えていただけないでしょうか。
gccでは問題ないことを確認しています。
非常に短いので、一応ここにもコードを貼りますが、 uint64_t value = ~0ULL; uint64_t x = (value == ~0ULL ? ~0ULL : (value / 2.0 + .5)); MSVCコンパイラでコンパイルするると、xに~0ULLが代入されません。
>>720 unsigned long long が 64bit を超えるようだと (uint64_t)~0ULL != ~0ULL になるだろうな。
MSVC10 の仕様は知らんけど。アセンブリコードでも出してみれば?
>>724 MSVC10でのunsigned long longは64bitです。
同値の内容をif文で書けば問題はありませんし、三項演算子の最後の項の式を
もっと単純な整数値式にすればバグらなくなります。
~0ULL と (value / 2.0 + .5) の型が一致してないのが原因だろうからキャストしろ
>>725 ifと?:でアセンブリコード貼って
最適化なしの場合も
>>720 ,723
>>726 がいってるように
>>723 は
uint64_t x = static_cast<uint64_t>( (value == ~0ULL ? static_cast<double>( ~0ULL ) : (value / 2.0 + .5)) );
と等価で~0ULLがdoubleで表現しきれず精度が欠落してる
gccで正常に動いているように見えるのは実数->整数の変換で表現しきれないときの処理の違いかな
ttp://ideone.com/S0ZbD6
おうかぶった
明解C言語、写経しながら進めるのって意外と大変
楽をしても身に付かない
プログラミング言語も言葉だからね
エラーは友達 パソコンサンデー
コンパイルエラーの体験も含めて勉強だから
人間関係は壊れるとほとんど修復不可能だけど、 パソコンは買い換えれば済むからな。
Mr.パソコンのご冥福をお祈りいたします。
死んだのか 合掌
MrじゃなくてDrだったか。
1つのスレッドを、特定のコアに結びつけずに100%回すと、コアあたり(100/コア数)%使用しますよね こういう場合、このスレッドがボトルネックになっていることを知る方法はありますか?
よくある常駐監視ソフトでコア毎の使用率見ればいいんでねーの?
スレッドごとに知りたいってことじゃないの? 方法知らないけど
知ったところで対策はできないし意味はないと思うけど 知りたい気持ちはわかるな。
TLB使いまわし出来る程に柔軟なスケジューラを備えたOSなんてあるの?
TLBを使い回すってどういうこと?
んー、CPU使用率は分からんがどこにどれだけ時間がかかってるかとか、処理の頭にデバッグ文とか 入れての推定ならある程度は可能かな
751 :
743 :2012/11/16(金) 12:11:19.08
ありがとうございます。 ProcessExplorerと、プロファイラなど見てみます。
2GB以上のファイルを読み込むプログラムを書く場合、 64bit用プログラムとしてコンパイルすれば size_t fread(void *buf, size_t size, size_t n, FILE *fp); size_tが64bitになり、対応できるのですが、 int fseek(FILE *fp, long offset, int origin); fseekの場合はlong型なので、32bitのままで、2GB以上の位置にシークできません。 どうすればよいのでしょうか?
754 :
752 :2012/11/18(日) 00:19:34.05
>>753 助かりました!
ありがとうございました!
正の重みがあるエッジでノードが接続されているグラフ構造で、エッジの重みから各ノード間の 距離がエッジの重みに準ずるようなノードの最適な配置(座標)を求めたいのですが、 Boost::Graphにそういったものはありますか? それかまたは簡単に実装できるライブラリなどありますか? JavaでいうJungみたいなのがあればいいのですが
757 :
デフォルトの名無しさん :2012/11/19(月) 16:56:06.99
ビット演算について教えていただけますでしょうか。 下記のような構造体があります struct SampleStruct { unsigned status : 4 unsigned channel : 5 //4ではなく5 unsigned data : 8 } この構造体が保持しているデータを出力させると下記のようになるとします。 (QtというGUIフレームワークを使用しているのでデバッグにqDebug()を使っています) // st はSampleStructのオブジェクト qDebug("%x", st.status); // 9と表示される qDebug("%x", st.channel); // bと表示される qDebug("%x", st.data); // 64と表示される ここまでは意図通りです。 次に statusとchannelを合わせて8ビットで表現させるために以下を行います qDebug("%x", (midi_command.status<<4) | midi_command.channel); // 9bと表示される これも意図通りです。 しかし次の動作を行うと意図通りに行きませんでした。
758 :
757 :2012/11/19(月) 16:57:11.97
char c = (midi_command.status<<4) | midi_command.channel; qDebug("%x", c); // ffffff9b と出力される。本当は 9b を得たい。 ffffffのような文字が表示されてしまいました。 これはオーバーフローしてしまっている、という状態なのでしょうか。 char c に変わらず0x9bが代入されている状態にしたいのですが、 どのように書けば実現できますでしょうか。 char c = st.data; qDebug("%x", c); ですと、意図通り 64 が出力されますので、 ビット演算の辺りが怪しいと思っているのですが・・ 環境は $gcc --version gcc.exe (TDM-1 mingw32) 4.4.0 です 教えていただけますと嬉しいです。
759 :
757 :2012/11/19(月) 17:00:45.58
一点間違いがありました。 SampleStructの定義ですが、 unsigned channel : 5 ではなく signed channel : 5 でした。 よろしくお願い致します。
761 :
757 :2012/11/19(月) 17:13:57.59
レスありがとうございます。 代入先の変数がcharになっていまして、unsigned charが使えないんです。 なんとかしてchar cにうまく入れる方法はないものでしょうか。
可変長引数(printf の第二引数移行の箇所)に渡す過程で 最上位ビットがたってる 0x9c が int に拡張する際に符号を維持して拡張されただけ printf("%x", (unsigned int)c); qDebug("%x", (unsigned int)c); こうすればどうだい?
charをunsigned charにキャストしとけば符号ビットが拡張される事はないだろ C言語256倍でも嫁
C言語256倍読みたい
char c=0x9a;printf(…,(unsigned)c);は printf(…,(unsigned)(signed)c);だからな
768 :
忍法帖【Lv=40,xxxPT】(1+0:5) :2012/11/20(火) 00:09:31.26
printf("%x", (unsigned int)c&0xff );
769 :
757 :2012/11/20(火) 00:14:39.02
レスありがとうございます。
http://codepad.org/pAcflg6F など、いろいろ試したのですがやはりうまくいきません。
qDebug("%x", (st.status<<4) | st.channel);
のところで、5bitの st.statusを左に4つシフトしてしまっているのは
うまくいかないのに何か関係があったりするのでしょうか?
(9bitになってしまう気がしますので)
char型に0x9b を代入しようとすると 0x9bが10進数の127を超えていますが、
2の補数表現のようなものでマイナスを表しているわけでもないですよね・・?
1ではなくffffffになっていますし・・
おいおい、この数レスちゃんと読めよ
771 :
デフォルトの名無しさん :2012/11/20(火) 00:39:44.63
すみませんわかりません。。 ちなみに char c = ((st.status<<4) | st.channel); qDebug("%x", c&0xff); このようにすると、9bの出力を得れることを確認したのですが、 出力時に9bになればよいというわけではなく、c に0x9bが入っている状態にしたいのです char c = st.data; qDebug("%x", c); で64が出力されるのと同様に、 char c = (st.status<<4) | st.channel; qDebug("%x", c); でffffff9bではなく9bを得たいという感じになります
c が charであれば データサイズが8bitしかないんだから そもそも0x9b以外に入るわけがないんだけど。
ていうかqDebugでプリントする時にintに符号拡張されてるだけだ。 c に入ってる値はまぎれもない0x9bだから。
強いて解決法をあげるとすれば qDebug("%02x", c); でいいんじゃないの?
デバッガ位使えるんだろ? いい加減、初心者過ぎませんか?
上をちょろっと読んで、 printf("%x\n", (unsigned int)c); printf("%x\n", (unsigned int)(unsigned char)c); とか出てこないもんかな
Cを勉強し始めたんだが、多重ループを使って*でピラミッド作ったりするときに どの変数や数を使ってどう回すのっていう のが全然思いつけないんだけど、これは慣れなの?
まずは入門書を3冊ぐらい買って、出ているプログラムを 自分で入力して動作を確かめるところから。
割りとマジで慣れしかない。逆に慣れれば、 「ここはiとjの2変数をこういう条件でループさせよう」 といったことが浮かんでくるようになる
慣れ(経験による知識の蓄積と応用)だけで乗り切ってる人もいるけど本当に持つべきは本質的な概念を理解する力とそれを(プログラミング)言語化する能力
慣れてくれば、打ち合わせ中に頭の中でコードを書いてる。 きっと俺だけじゃない…筈。
>>756 ありがとうございます。
BoostにWikipediaの力学モデル (グラフ描画アルゴリズム)のアルゴリズムがあるんですね。
引数の準備が面倒そうだけど汎用性を考えてboostの方を使ってみます。
>777 馬鹿には無理
785 :
757 :2012/11/20(火) 11:23:48.11
レスありがとうございます。色々初心者でお恥ずかしいです。 なるほど、出力時に変な表示になるだけで実際には0x9bが入ってるんですね。符号拡張というのについて勉強してみます。ありがどうございましたm(__)m
>>778 ・お題: *でピラミッドを作る。
↓
*を横にある程度並べて、その上にそれより少ない数並べて天辺まで並べるとピラミッドに見えるだろう。
↓
縦に並べるにはループ制御変数にiyを、横に並べるにはixを使おう(別にi, jでもいいけど)。
↓
外側のループはfor (int iy = 0; iy < height; ++iy)で、
内側のループはfor (int ix = 0; ix < width; ++ix)だな。
↓
コンソールに出力するには上からのほうが都合がいいな。
等幅フォントで積み上げることを考えると、天辺は*が1個、その下は3個。つまり、width = iy * 2 + 1になるな。
↓
for (int iy = 0; iy < height; ++iy) {
int width = iy * 2 + 1;
for (int ix = 0; ix < width; ++ix) putchar('*');
putchar('\n');
}
おっと、*の列をセンタリングするために左側の空白も出力しなくちゃ。
例えばheightが2なら1個と0個か。つまり、width = height - iy - 1だ。
↓
i/fはheightだけでいいな。
↓
void printPyramid(int height)
{
for (int iy = 0; iy < height; ++iy) {
int width = height - iy - 1;
for (int ix = 0; ix < width; ++ix) putchar(' ');
width = iy * 2 + 1;
for (int ix = 0; ix < width; ++ix) putchar('*');
putchar('\n');
}
みなさんありがとうございます。 慣れと知識が圧倒的に足りてないようですね。 頑張ってみます。 フローチャートみたいなのありがとうございました。参考にします。
プログラムうんぬんではなくて 物を観察して作る能力が欠けてる 高機能障害の疑いがあるから 病院に行ったほうがいい
789 :
デフォルトの名無しさん :2012/11/20(火) 22:43:16.00
肛門のピラミッドかw
普通のCとEmbedded C++って言語仕様的にどっちが優れてますか?
Embedded C++に比べたらCのほうが100倍まし
配列を宣言時、0に限って以下のような記述が可能です。 int Val[ 10 ] = { 0 }; 意味としては「確保した領域のビットを全て0で埋める」という意味かと思っていたのですが、 float変数配列に適用したところ、 float fVal[ 10 ] = { 0 }; 各要素は0.0fになっていました。 浮動小数点フォーマットでビットが全て0というのは0.0fではないため、 上記解釈は間違っており、「各要素を値0で初期化する」という意味であることが分かります。 これは_aligned_recalloc(アライメント付き動的メモリ領域確保&0初期化)でも同様でした。 コンパイラはVisualC++2008ですが、 このような挙動はコンパイラ依存なのでしょうか? それともC++の仕様なのでしょうか?
仕様
値 0 になるのは仕様 ところで、 int Val[10] = {}; でいいはずだが、VC++2008 はこの書き方ではダメなのか?
>>792 > 浮動小数点フォーマットでビットが全て0というのは0.0fではないため、
IEEE754では全ビット0 = 0.0fだよ
「そうとは限らない」という意味では正しいけど
> これは_aligned_recalloc(アライメント付き動的メモリ領域確保&0初期化)でも同様でした。 まで含めるならコンパイラ依存だね
>>791 それは優劣を比較するたぐいの話ではない。
>>794 問題ない。Cの癖でつい書いちゃうんだろう。
799 :
792 :2012/11/21(水) 22:39:09.70
ありがとうございます。
>>794 {}でいいんですね。
知りませんでした。
>>795 全ビット0で0.0fだったとは・・・
失礼しました。
符号部、指数部、仮数部ともに 0 のときは +0 を表すよう仕様を調整したともいえる
801 :
792 :2012/11/21(水) 23:34:33.92
実にグッドな調整ですね!
コンパイラは限定されるが メンバ変数ポインタで確認するのが一番だよ
>800 0の0乗は1だから 数学的には1が正しくね?
0の0乗は未定義 指数部仮数部の話はベースが2だから、0のほげ乗と無関係 しかも、指数部が0は、0乗の意味でもない
int Val[10] = {}; で0で初期化されるのか知らんかった。毎回memsetしてたわ こんなのどこで知るの?
コーディングミスなのか意図的なのか分かり辛いし 警告出るコンパイラもあるから memsetしてるわ
パフォーマンスは同じ?
整数(char, int, ...)ならOKじゃなかったっけ?
>なので、memset を使うべきかどうかはコンパイラ任せにすればよいのです。 なんでこうなるの?
>>809 人のすることに難癖つけてるだけだな、こんなのは
好きにしたらええよ
memsetしたあとに 各フィールドに代入してるコードは 確かに間抜けだと思う
>>811 memsetで正しく動作するアーキテクチャかどうかは、
プログラマに確実にわかると限らないから
環境依存OKなスレなんだしmemsetが有益な環境なら好きに使えばいいよ
全bitを0にしても数値として0になるとは限らないと言っておいて 0を代入して「こうすればいいのです」って矛盾しまくりだな。
どこが矛盾? 0を代入すればコンパイラがよきにはからってくれるんだよ
>>816 値の0と、(memset()で代入される)ビット0では意味が違うのよ。
>>813 TCP/IP を扱うのであれば当たり前
まあ配列ならstd::fill使うんだけどな
ビッグエンディアンがどうとかじゃねーの
つまり、float fVal[ 3 ] = {} は fVal[ 0 ] = 0.0f; fVal[ 1 ] = 0.0f; fVal[ 2 ] = 0.0f; と等価であることがC++の仕様として保障されるけど、 memsetで0フィルする場合はコンパイラ依存の恐れがあると。 VC++では0.0fが各要素に代入される。
std::fill 使えよ
互換性のために仕方ない
うるさくいえば代入でなく初期化で初期化子は整数の0だけどな 特にポインタの場合に全ビットの0フィルでなく整数の0での初期化であることが重要になる
829 :
826 :2012/11/22(木) 23:21:08.69
>>827 互換性のためですか・・・
他にも、64bitなのにSystem32を使ったりと、違和感バリバリですね(汗)
気にしてもしょうがないので、気にしないようにします。
ありがとうございました。
>>822 socket() を呼び出す前準備、 struct sockaddr_in の陽に設定しない各メンバは bzero()等で0クリアしておく。
これを忘れるとはまる。
最近のコンパイラだと、fill, fill_n, memset, = {} で全部同じコード吐くのな
クラス内に静的メンバ変数をprivateで宣言するのと、 実装側のファイルにグローバル変数を宣言して使うのとでは、 名前空間で括られるかどうか以外に違いはあるのでしょうか??
>>831 POD型の配列のときは特殊化してんだろ
>>833 当たり前だが実装側ファイルのグローバル変数は
そのファイルに他のクラスのメンバやその他の関数が定義されてればそれらからもアクセスできる
>>830 struct sockaddr_in foo = {0} でいいよね。
837 :
833 :2012/11/23(金) 01:44:53.74
>>835 なるほど。
たしかに。
まぁ、1ファイル(翻訳単位)につき1クラスの実装しかしないようにするなら問題ないですね。
そもそも、極力、クラスには静的メンバ変数を使いたくないのですが、
Win32APIのOPENFILENAME構造体のlpstrFileメンバのための文字列配列確保を
ローカル変数や普通のメンバ変数にすると、
GetOpenFileName呼び出しが失敗します。
やむを得ず、グローバル変数にしていますが、何かスマートな方法はないものか・・・
839 :
デフォルトの名無しさん :2012/11/23(金) 01:53:50.19
末尾に\0が2つ要る グローバル静的だと0初期化でたまたま動いてるんじゃね?
普通にローカルだろうがメンバ変数だろうが動いてるけど
>>839 の言うとおりちゃんと初期化してないんだろう
841 :
833 :2012/11/23(金) 02:01:44.68
そういうことでしたか! 来週、会社で直します! ありがとうございました!
>>836 厳密には否。
それは厳密には0クリアではない、メンバの中にポインタがあったり double があったりしたら。
自動変数を「代入のような書き方で」初期化するのも気にいらない、実際にはコードが生成されるのだから。
失礼。
>>842 はねじれているね。
>>836 で正しいのかも。
しかし、自動変数を「代入のような書き方で」初期化するのはやはり気に入らない。
>>843 Cで変数を初期化する構文は = ... によるものしかないんだが、
これが気に入らないとするとどんな初期化なら良いと言うの?
>>844 K&R1 に染まりきってしまい、それ以後に拡張された書き方に心理的抵抗があるだけ、ということでしょうね。
たとえば、K&R2 では関数から構造体そのものを返すことができるようになりましたが、私は今でも構造体のポインタを返す書き方にします。
同様に、配列の初期化については
static int array[100] = {0};
は抵抗なくかけるのですが、
auto into array[100] = {0};
は避けています、心理的に。いや、
auto int a = 1;
すら書かない、書くなら
int a;
...
a = 1;
でしょう。すなわち趣味の問題。
これが c++ だったら平気のへいざで書きようが変わるところが、あー、我ながら矛盾していますね。
>>845 最後の int a; ... a = 1; は趣味の問題では済まない、明らかな害悪だろ。
使うところで宣言して初期化しろ。してください。
>>843 「ゼロによる初期化」と捉えるから数値のゼロなのかビットパターンのゼロなのか混乱するのであって、
「組み込み型の初期値による初期化」と捉えれば混乱はないよね。
>>846 宣言と同時に初期化するのは相応のメリットがあるのでしょうね。ときどきいらぬトラブルに巻き込まれるのもそのせいですね。納得です。
>>847 組み込み型の初期値による初期化とビットパターン零による初期化がたまたま等価であったから bzero() を使った初期化でOKだったわけですね。
しかしビットパターン零による初期化は可能な限り避けたほうがいい。
とすれば
>>836 が正解ですね。
考察が深まりました。ありがとうございました。
849 :
847 :2012/11/23(金) 06:18:35.47
まあ、言葉遊びだけどね。
850 :
デフォルトの名無しさん :2012/11/23(金) 07:04:32.15
>>841 お金を貰ってやってる仕事を2chで解決しようとするバカは死ねよ。
別にいいと思うよ。こっちもヒントを貰うこともあるから回答しているんだし。 問題を一般化し、問題点を絞り込んで、人に聞く。その過程だけでもいい訓練になるから 他人に聞くことはどんどん少なくなるものだし。
2chは無断ビジネス禁止
結論:仕事だとはいちいち言わなくていい
聞かれてもいないのに目的を言う必要はない。 技術的に興味を惹かれるネタなら答える人も現れるかも知れない。 上手に回答を釣るのも2chの醍醐味。
855 :
デフォルトの名無しさん :2012/11/23(金) 12:37:40.44
趣味でプログラムやってる奴の質問なんて全体の5%もない。 できないのにできますとか言ってプログラマとして就職しちゃった基地害土方が できなくて焦ってこの板できいてる。 だから質問のレベルも数年前に比べて格段に落ちた。 もう質問スレじゃなくて基地害土方の助け合いスレに変更すべき。
教えることが、最良の勉強になる。
857 :
デフォルトの名無しさん :2012/11/23(金) 14:13:11.40
教えるのは馬鹿のためじゃない 自分のため
情けは人の為ならず。 己の為。
>>854 確かにね。
相手が興味を持ちそうなストーリーを添える、ってのも仕事・ブライベートに限らず、重要なスキルだからな。
忘れるから
昔はfj.*やcomp.*などのネットニュースでやってたことを、時代とともにその場が かわっただけで禁止にしちゃいかんよね
864 :
デフォルトの名無しさん :2012/11/23(金) 17:13:07.41
売名ができない点が、発言の内容に大きく影響している ★は売名がよほど成功してからだし
楠楠
>>846 使うところで宣言、初期化したって関数の冒頭でまとめてやったっていいじゃない
言語仕様は自由だ、だから余計に縛っちゃいやんでござる
別に初期化を忘れるのは問題じゃない スコープが無駄に伸びて不必要なアクセスが生じる可能性を恐れているんだよ
言語の先生に 使ってない変数を宣言するな (使ってたとしても要らなくなったら宣言したまま放っとくな) と言われましたが そういうもんなんでしょうか?
そういうもんです 目の前にあるゴミは少ないほうがいいだろう
871 :
デフォルトの名無しさん :2012/11/24(土) 10:31:55.11
あとで使うつもりで残しておいたのでなければ、 消しておいた方が良いね。
ソースコードにはできるかぎり価値のないものは書かないようにする あまりに意味のないコメントもそう i++; // i をインクリメントする
>>873 精度はいまいち。bcc32とgccそれぞれに見落としがあることを経験している。javac は完璧。
>>872 書くのなら、なんでインクリメントするのかを処理の塊で解説を頭に書いた方がスッキリするね
Cあがりの人が冒頭で変数宣言してるの超うざい 初期化漏れが不安で仕方が無い
コピーコンストラクタでなく代入演算子が動くのも問題
>>876 逆からみれば、必要になるまで宣言しないことは、最初から無計画に思いつきで書いてるように
みえちゃったりするわけよ
>>879 んなこたーない
冒頭で書く事にこだわってバグを増やしたんじゃ世話ない
テーブル使って
static const int arr[10] = {13, 13, 13, 13, 26, 26, 26, 26, 26, 26};
int y = x*arr[x]; // xは0〜9の整数値を取る変数
とするのと、
テーブル使わずに
int y = x*(13 >> (((x
>>3 ) | (x
>>2 )) & 1));
とするのとでは、どっちが速いですかね?
あるいは、中間を取って
static const int arr[3] = {11, 22, 22};
int y = x*arr[x
>>2 ];
とか、どうするのがいいでしょう?
すみません、下の段落はarr[3] = {13,26,26}でした
あ、もう一つ間違いが。
int y = x*(13 << (((x
>>3 ) | (x
>>2 )) & 1));ですね。最初のシフトの向きが間違ってました
実際にclock()とか使って数万回ループで計測してみれば? どれも大差はなさそうだけど、保守性の良さで決めれば
そうですね、実際測ってみるつもりなのですが、勉強目的でコードを書いているので、 何か速度の差を生む要因など分かる方がいれば参考にさせて欲しいなあと思ってます
テーブル使うならxをかけた結果のテーブルを作って int y = arr[x]; だろ
なるほど、それが一番テーブルを生かしたコードですね。 サイズ100のテーブルか純粋な演算か、どちらがいいのだろう。
すみません、勘違いでした。サイズは変わらず10ですね。純粋に改善されたコードでした。
必要なところの直前で変数を宣言できる仕様は C++で最も素晴らしい拡張であると言っても過言ではない。 これができないだけで生C言語はイヤだ。
>>881 int y = (x < 4 ? 13 : 26); が早い
mov, cmp, cmovl の3命令で済む
って、さらにxかけるのね int y = x * (x < 4 ? 13 : 26); だな
>>890 そっちの方が速いんですか。
自分がそう思わなかったのは、if文は遅いということからの勘違い(アセンブラの知識が無いため)だと思うのですが、
?を使った文の場合はjmp命令が無いからif文とは全然違うもので、高速に動作するという解釈でいいのでしょうか
>>892 jmp命令があれば遅くなるけどcmovcc命令を使えば速い(ccには比較方法が入る)
cmovccは条件が満たされる時のみ代入するというもの
cmovcc命令は後から導入されたため大昔の最適化ガイドだと「比較は使うな」と書いてあるかもしれないが、
既に導入された時期が大昔になったため使われる事を期待して全く問題なし
三項演算子マンセー
もちろんCPUに依存する事は言うまでもないので 他のCPUを使ってる時はとりあえず実測しろ
昔のCPU使ってる人は切り捨てるので大丈夫です!
>>893 そんな命令があるんですね
大変勉強になりました。三項演算子を見直しました
ありがとうございます
x < 4 ? 13 : 26 は例えばこんな風にコンパイルされると思われる mov eax, 13 cmp x, 4 cmovl eax, 26 実際には x は掛け算でも使うので 一旦レジスタに入れられるだろうけどね (レジスタの余り具合にもよるだろうけど)
なるほど、わかりやすいです
これからは三項演算子ガンガン使います!
ごめん、数値逆だった mov eax, 26 cmp x, 4 cmovl eax, 13
「条件演算子」って言えよ。
関係・比較演算子と紛らわしいから三項演算子の方が齟齬が無くていいよ
ということにしたいのですね。
もったいないのでわたしにください。
ハテナコロンはダメですか?
口頭で聞いたときは「"参考"演算子」だと思ってた。 式を解釈(参考に)して結果を選択するからかぁと納得。
三項演算子の起源?はなんだろう、なんでこんな演算子というかからくりを組み込んだんだろう?
そりゃわざわざifを使うのは冗長でいけてない状況が多いからだろう 記述が多ければ間違う可能性も多い。これは真理
ifだと戻り値が返せないのがな。 ifに戻り値つけろよ。 あとvoidも変数の型に格上げしてテンプレートの引数で voidとそれ以外を作る手間を省けるようにすべき。 typedefと同じ機能で前方参照にも使える typeclassみたいなのも作ってくれ。
構文と式の違いだろ 戻り値ってなんぞ
bool hoge; if(bool = fuga == hage) 的なことじゃないの
ifより三項演算子のほうがわずかに高速なコンパイラがあったな。 特定CPU向けでCPUの特性にあわせてるんだろうけど。
915 :
デフォルトの名無しさん :2012/11/25(日) 01:58:53.28
>>913 hoge厨がしゃしゃり出てくるんじゃねーよ
異常者は書き込むな
913のダメさ加減は識別子以前の問題だと思うがね
hoge使ってる時点でどんなに正しいことを言ってても相手にされない。 頭の悪さが強烈に滲み出てるようなものだからね。 内容以前の問題。
hogeに反応する奴はハゲ
ん、if ((a = b) == c) じゃなくてif (a = b == c) でいいのか……
論点が違っている。
つか、多項式ならswitchを拡張する方がいいと思うけどな、先輩のCOBOLなんて たぶん理想的な綺麗で求めてるような素直で簡潔なEVALUATEというものがある
>>922 そういうの欲しいね。
代入じゃなくて、初期化で分岐させたいときがあって、
2分岐なら ?: でいいが、多分岐をその構文で行うとわかりづらい。
const string str(val == 1 ? "one" : val == 2 ? "two" : "invalid");
ラムダで switch 使えるけれど、さらに見づらいし、かなり遅くなるんだよね。
const string str([val](){switch (val) {case 1: return "one"; /*略*/}());
またhoge厨とアンチか
もういい加減ウザいから
>>1 に禁止って書いとけよ
こう書けばシンプルで分かりやすいテーブルになる const string str(val == 1 ? "one" : val == 2 ? "two" : "invalid");
hogeより素晴らしい意味の無いものを示す識別子てあるんですか?
printfを自分で作りたいのですが、参考になるソースコードを教えて下さい。
glibcのソースコードは見たんですけど、訳がわかりませんでした・・・
ウィキ (
http://en.wikipedia.org/wiki/BIOS_interrupt_call ) によると、
mov ah, 0x0e
mov al, '!'
int 0x10
で一文字表示できるようなので、これを駆使すればprintfを実装できそうな気がします。
どなたか、参考になる簡単なソースコード、もしくはサイトを知ってたら教えて下さい。
環境が分からんことには答えようがないと思うが
いまどき全然関係ないところを探し当てる、その程度の知識でprintfを実装とか 宿題としか思えない。 どうせ可変引数の練習だろうに、素直に1にwriteしとけ。
931 :
928 :2012/11/25(日) 16:47:24.33
いくらなんでもスレ違いだろう
>>931 ここはC/C++のスレ。アセンブラを書きたいなら他に行け。
つーか、そのレベルでprintf()の実装なんて一ヶ月かけても無理だよ。
printf()の実装か‥‥一度はてをつけてもいいかも
935 :
デフォルトの名無しさん :2012/11/25(日) 17:33:06.78
>>934 昔、組み込み機器用にサブセットを実装したなぁ…
>>936 俺もやったw
つーか、標準ライブラリ使用禁止な仕事だったから標準ライブラリ互換の関数を幾つも作ったが、これは勉強になった。
かれこれ20年前の話。
>>926 みたいな基地害って英語の情報を調べたことがないんだろうな
世界各国でhogeがメジャーに使われてるとでも思ってんのか
マジで頭おかしいわこいつ
939 :
デフォルトの名無しさん :2012/11/25(日) 18:33:25.85
>>909 「やってやる」ってノリ
単項と2項だけじゃ殺風景だから3項が必要な演算は何かないかとか
代入も単純代入だけじゃ殺風景だから演算付き代入も入れとこうとか
判断も if else だけじゃ殺風景だから switch case も入れとこうみたいのは
色んなコンパイラがこぞってやっていた
ちなみにビットと論理を区別しようといった次の瞬間 true は int の 1 みたいな糞ルールが生じた
>>937 それ何のために禁止してんの?信頼性は自作のほうが落ちてるよね?
既存のものはバグがある、俺が金を出して作らせたものにはバグはない と言うバカスタマーせい
メモリ使用量が多すぎたりROM化しにくかったりで標準関数が 使えないまたは使うのが難しい環境はあるんだよ。
組み込み系だと、標準出力の概念がなかったりね。
hogeは、米国発祥
だから鬼畜米英なんだよ
>>940 組み込み系の場合は標準関数が用意されていない事もあるからそういう事じゃね
コンパイルは通るけど、何も起こらないとか結構あるみたいね。 中身からっぽの関数が用意されてる感じで。
標準入出力の概念自体がなかったりとか
ARMCにはstringをバッファとして渡せるprintfとか入ってるんだよな。 いつかテンプレートで型セーフなprintfを作ろうかと思ってたが、作る手間はぶけたわ。 はよ標準にしてくれ。
標準にするなら可変個引数テンプレートを使ったもので
fooとかbarはここでも使っていいんですか
はい
hageは死ぬべき。
955 :
デフォルトの名無しさん :2012/11/27(火) 11:00:25.39
boost::container::stringを使ってます std::getlineだと弾かれるみたいなので boost::container::getlineを使いたいのですが std::stringstreamに該当するものが何なのか分かりません (つまり、boost版のstring文字列を、行ごとに処理したいのでgetlineを使いたいが、つまづいています。) 具体的にはどうすればよいでのしょうか
行ごとに切り分ける処理だけ自分で書けばいいんじゃないかな
>>955 boostでそろえてboost.iostreams使えばいいんじゃないか
#include <iostream>
#include <boost/container/string.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/array.hpp>
int main()
{
boost::container::string s("abc\ndef\n"), d;
boost::iostreams::stream<boost::iostreams::array_source> st(s.c_str(), s.size());
while (st) {
boost::container::getline(st, d);
std::cout << ":" << d << std::endl;
}
}
>>957 おおおぉぉおぉぉおおぉお!!
できました!!!!!
本当にありがとうございます。
クラスの初期化について。 class Hoge { public: int type; bool skip; Hoge() { type = 1; skip = true; } Hoge(int other) { } // ←ここ Hoge(char* str) { } // ←ここ } 上のようなクラスで、「←ここ」となっている場所でも、 Hoge()と同じ挙動(type = 1, skip = true)を勝手にやってほしいなと思うのですが 同じように処理をコピペする以外に何かいい方法はあったりしますか?
Init()とか作って投げる
Hoge(int other) :Hoge(){ }
Hoge(int other) { Hoge tmp; *this = tmp; // 以下、エキサイトなコード }
963 :
デフォルトの名無しさん :2012/11/28(水) 16:34:20.99
Visual Studio 2012でC++を使ってます。 "huge_array.h" static const int huge_array[5948375] = {342, 2435, 235987, 894, ...(略)}; をインクルードしてコンパイルすると、コンパイルに時間がかかってしまうのですが このように巨大な配列だと仕方のないことなのでしょうか? 初回コンパイル時だけでなく、"huge_array.h"をインクルードしているヘッダファイルを更新してからコンパイルする場合も遅くなるので困っています。
cppに分けりゃいいんじゃね
>>959 何をもって「いい」と判断するのかにもよるけど、
社会の不利益を減らすって意味ならお前が回線切って吊るのが一番いい。
967 :
デフォルトの名無しさん :2012/11/28(水) 17:44:24.24
>959=ゴミw
>>965 ありがとうございます
extern宣言を使って配列のデータをcppに移したらコンパイルの重さが解消しました
hogeとかプログラミングにまでガラバゴス化を持ち込もうとしてる屑は何なの?
日本企業がIT関係でガラバゴス化やって散々な目にあったのにまだ分からないんだな
>>959 みたいにガラバゴス化を持ち込もうとする屑がいる限り日本の産業に未来はない
>>959 はマジで生きてるだけで迷惑
hogeを覚える暇はあってもコーディングについて調べる暇はないとか終わってるな
971 :
デフォルトの名無しさん :2012/11/28(水) 18:59:10.89
>>969 ガラバゴスじゃないよ、自分が間違ってんじゃん。ガラバルスだよ。
相手にするなよ
973 :
デフォルトの名無しさん :2012/11/28(水) 20:51:42.85
一々hogeがどうたらと荒らし回るなよ、と というか、じゃあなにを使ってほしいんだ?
>>959 =
>>972 Hogeとか使うくらいだから根性腐りきってるんだろ
根性腐ってる奴が自演してても特別不思議な印象は受けないな
ウゼえなまたか。 もうホゲ禁止ってテンプレ入れとけよ。
椅子でもビアマグでも好きに使えばいい。
ハゲを使えって話とは違うの?
981 :
デフォルトの名無しさん :2012/11/28(水) 22:16:13.40
あ
>>964 そんな巨大な配列は外部ファイルにして
動的に読み出すのが普通
984 :
デフォルトの名無しさん :2012/11/28(水) 22:50:39.13
にしてもhoge使う奴には知能の低い奴しかいないな
知識不足とか経験不足とかそういうレベルじゃない
根本的に知能の低い奴しかいない
>>959 も例外じゃなかった
>>983 が言いたいことを言ってくれた
そろそろ次スレ立てるべきかね?
hoge huga piyo全部禁止にしてくれ。 毎回毎回荒れてかなわん。
>>986 メタ変数はfooとかbarとかを使えという掲示なのだよ……
>>983 組み込み系だとそうもいかないときもあるけどね
アンチhoge厨共は一応英語は分かってるみたいだなwhugeに食い付くだろうと思って見てたけど食い付かなかったw
template<class hage> hoge{ ... }
>>988 でも4*5948375≒23Mバイトも使える組み込みって……
>>991 そもそもファイルという概念がない事もある
ある一線越えてRAMが別チップになるとギガビット単位になるからね
hugearreyがなんなのかきになるわ
またhoge厨が沸いてたのか ほんと糞だな
まだ埋まってなかったのか
hogeに過敏に反応してるのがいるけど、禿なのか日本が大嫌いな隣の国の人なのかどっちなんだろうな 禿の人はそこまで心狭くないと思うけど
Itenium を使う組み込みなんてのもある
_ \ヽ, ,、 `''|/ノ .| _ | \`ヽ、| \, V `L,,_ |ヽ、) .| / ,、 / ヽYノ .| r''ヽ、.| | `ー-ヽ|ヮ | `| ヽ, ,r .| ヽ,r'''ヽ!'-‐'''''ヽ、ノ ,,,..---r'",r, , 、`ヽ、 ヾ ヽ、__/ ./ハレハ i`ヽ、 `''r`ミ_ .レ//r,,,、 レ'レハヾ, L,,_ `ヽ、 "レ, l;;;l l;;;l`i.リレ' リ ̄~~ ヽ、 ワ `"/-'`'`' `''''''''" ┼ヽ -|r‐、. レ | d⌒) ./| _ノ __ノ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。