【初心者歓迎】C/C++室 Ver.80【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2012/09/21(金) 02:15:05.41ただしその場合、質問者は必ず環境を書きましょう。
※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
0002デフォルトの名無しさん
2012/09/21(金) 19:16:51.170003デフォルトの名無しさん
2012/09/21(金) 20:57:49.50乙
0004デフォルトの名無しさん
2012/09/22(土) 22:39:55.29998 名前: 忍法帖【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
うめてんてー
↑うめてんてーって言う埋め方って一般的なもんなの?
0005デフォルトの名無しさん
2012/09/22(土) 22:53:11.18_ / \ _
/ / {┳ }
>{、 ,>-<
// -\__/ -ヽ \ 、_、-‐ 1
ゝ ┐ . { |⊂⊃ i ⊂⊃| } } 、 T¨Τ
, -―、 {_ノ―、 \ヽ 「 ̄ ̄ フ / / 、-7 ̄ г¨Τ二7
´ } /∨ } r─\ ゝ ─ ' 厶二⊃ / \ ΓΤ J
_ノ ヽハ _ノ  ̄`|  ̄ ̄ ̄ ̄ `ーァ / ヽ、 |
\ /
>、___ イ
し′ し′
0006デフォルトの名無しさん
2012/09/22(土) 22:59:46.49いやひだまらーだしうめ先生は知ってる
C++スレにまで出てくるとか(埋めレスとして)汎用性高杉
0007デフォルトの名無しさん
2012/09/23(日) 13:35:32.90一部を伏せ字にするとかさ工夫してくれ
0008デフォルトの名無しさん
2012/09/23(日) 14:05:41.170009デフォルトの名無しさん
2012/09/23(日) 14:26:22.260010デフォルトの名無しさん
2012/09/23(日) 14:49:48.910011デフォルトの名無しさん
2012/09/23(日) 14:50:44.32はるかにウザイから
0012デフォルトの名無しさん
2012/09/23(日) 14:52:02.670013デフォルトの名無しさん
2012/09/23(日) 15:22:48.540014デフォルトの名無しさん
2012/09/23(日) 15:39:09.050015デフォルトの名無しさん
2012/09/23(日) 16:52:18.400016デフォルトの名無しさん
2012/09/23(日) 16:59:09.68俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど
要は、親玉(Objectクラス)は、子供(継承したクラス)の
情報をしってて、親玉から子供の情報を知りたい時にキャストして
子供の情報を得る。
ってな感じで良い?
まぁ、オブジェクト指向のなんたるかを語りだすと
色んな人が色んな例えして、どーでも良くなったりすんだけどね。
BOOL hoge(CString& sValue)
{
sValue = _T("");
}
CString& sValueは参照変数で空文字で初期化を行なっていますが、MFCの使えない環境で
BOOL hoge(char& sValue)
{
//
}
このような場合のchar& sValueの初期化を行うにはどのように書いたらいいですか。
0018デフォルトの名無しさん
2012/09/23(日) 19:58:38.830019デフォルトの名無しさん
2012/09/23(日) 20:01:07.28どう言うも何も参照で取ってんだから
sprintf(sValue,"");
で十分じゃん
0020デフォルトの名無しさん
2012/09/23(日) 20:01:07.81文字列を空にしたいってことでしょ?
char*&sValueでsValue[0]="\0";
じゃないかな
0021デフォルトの名無しさん
2012/09/23(日) 20:02:06.310023デフォルトの名無しさん
2012/09/23(日) 20:14:08.69>>17の通りなら参照渡ししてるのは文字であって文字列では無い
まず引数をchar*sValueにするところから変更しなきゃ
0024デフォルトの名無しさん
2012/09/23(日) 20:33:19.12いけず
0025デフォルトの名無しさん
2012/09/23(日) 20:36:37.69hoge厨は初期化しなくていいから回線切れ
0026デフォルトの名無しさん
2012/09/23(日) 20:43:34.860027デフォルトの名無しさん
2012/09/23(日) 20:50:36.190028デフォルトの名無しさん
2012/09/23(日) 20:53:13.55お前hogeとか使ってて恥ずかしくねーの?
本物のゴミか?
0029デフォルトの名無しさん
2012/09/23(日) 20:56:46.87しつけーぞhage
0030デフォルトの名無しさん
2012/09/23(日) 20:56:52.69hogeを覚える暇はあってもコーディングの技術を身に付ける暇はないとかマジでクズ。
お前みたいな奴社会にいらないよ。
0031デフォルトの名無しさん
2012/09/23(日) 20:58:27.460032デフォルトの名無しさん
2012/09/23(日) 21:01:35.88typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif
0033デフォルトの名無しさん
2012/09/23(日) 21:06:12.070034デフォルトの名無しさん
2012/09/23(日) 21:13:02.76おい愚図
お前みたいな愚図は学校や職場では
陰で氏ねばいいのにって言われてるんだろうな
本人気づいてないけどうちの職場にもいる
0035デフォルトの名無しさん
2012/09/23(日) 21:16:27.82ただの悪口なら気付かなくてもいいんだけど、
>>17みたいな基地害は迷惑で言われるんだからさっさと消えて欲しい。
0036デフォルトの名無しさん
2012/09/23(日) 21:18:04.57hogeとかヴァカじゃねおまえ
0037デフォルトの名無しさん
2012/09/23(日) 21:21:32.22キチガイが何でこのスレにいるの?
0038デフォルトの名無しさん
2012/09/23(日) 21:23:46.660039デフォルトの名無しさん
2012/09/23(日) 21:26:44.75お前の存在自体がエラーwwwwwwww
0040デフォルトの名無しさん
2012/09/23(日) 21:29:08.28親がゴミみたいな奴だからロクな教育受けてこなかっだんだろ。
しかも本人自覚ないみたいから余計に可哀想。
0041デフォルトの名無しさん
2012/09/23(日) 22:02:01.860042デフォルトの名無しさん
2012/09/23(日) 22:25:43.80本物のの hage が聞くんじゃない
0043デフォルトの名無しさん
2012/09/23(日) 22:25:48.12ここは池沼用掲示板じゃねーんだよ
養護学校できけ精神異常
0044デフォルトの名無しさん
2012/09/23(日) 22:27:43.510045デフォルトの名無しさん
2012/09/23(日) 22:39:37.79遠く弾けるドラム缶それが俺たちのオイルショック
吹き飛ばせるわけないだろ
体重計の秤量は 100kg 悪気もなく俺たちを
いぇいぇー ぶげらー
0046デフォルトの名無しさん
2012/09/23(日) 22:41:57.58>>17みたいな本物のゴミは自覚症状ないからある意味幸せだろ
0047デフォルトの名無しさん
2012/09/23(日) 22:56:21.13あいつはいつも俺にそういってた
そんなあいつがホスピスにいやがる
それでもいいさ楽になれたのなら
バイバイ マイ ライバル
バイバイ マイ エネミー
バイバイ マイ ボイド
灰が落ちる そしてまた「明日」はくる
俺は吐き血が混じる
いつかバブルを忘れちまうだろう
それは俺もおなじ
woo woo wooo 只じゃ買えない
家も買えない ラブホも行けない
woo woo wooo それでも消費税は
申告 せにゃならん おーいぇーべべー
# 銃声
0048デフォルトの名無しさん
2012/09/23(日) 22:59:33.53hogeとか書いて本当に恥ずかしくないの?
0049デフォルトの名無しさん
2012/09/24(月) 00:04:33.520050デフォルトの名無しさん
2012/09/24(月) 00:06:59.720051デフォルトの名無しさん
2012/09/24(月) 00:32:58.38向こうは常に荒れてるけど
こっちはhoge厨が湧かない限り荒れてない
0052デフォルトの名無しさん
2012/09/24(月) 00:34:49.28そっくりなんだが
0053デフォルトの名無しさん
2012/09/24(月) 01:22:20.62Hogeが来なければ荒れないみたいだからそれを祈るばかり。
0054デフォルトの名無しさん
2012/09/24(月) 10:09:38.930055デフォルトの名無しさん
2012/09/24(月) 10:15:18.46そろそろコテ付けろよww
0056デフォルトの名無しさん
2012/09/24(月) 10:37:12.540058デフォルトの名無しさん
2012/09/24(月) 11:22:46.70連鎖あぼーんにすればおk
0059デフォルトの名無しさん
2012/09/24(月) 11:57:18.32連鎖あぼーんとかない?
ブラウザによるのかな。
0060デフォルトの名無しさん
2012/09/24(月) 12:17:36.40まあここまで叩かれるの分かっていてhoなんとか使うのは初見か荒らしだろうな
>>57
侮蔑語をNGすればOK
>>58
>連鎖あぼーん
Janeだとそういった設定は無いんだが……別の専ブラならできるの?
0061デフォルトの名無しさん
2012/09/24(月) 12:21:36.79>侮蔑語をNG
「エラー」とか「ゴミ」とかはまだ普通に使う可能性がある単語だろ……
0062デフォルトの名無しさん
2012/09/24(月) 12:36:08.08それでも目に入る煽りはかなり低減できるだろ
100%クリーンな世界なんてないんだからそのくらいいいと思うけどね
とりあえずHOGE連鎖あぼーんでかなり減ると思うぞ
0063デフォルトの名無しさん
2012/09/24(月) 12:50:37.67ここに質問に来るような初心者は大抵初見だろw
毎回発狂するキチがコテつけりゃ済む話
0064デフォルトの名無しさん
2012/09/24(月) 13:17:37.13現実的でない。
0065デフォルトの名無しさん
2012/09/24(月) 13:21:32.43全ホゲあぼーんで問題なし。
0066デフォルトの名無しさん
2012/09/24(月) 13:30:54.190067デフォルトの名無しさん
2012/09/24(月) 13:42:17.910068デフォルトの名無しさん
2012/09/24(月) 13:51:00.04わざと珍妙な日本語で書いてんだろ
お前釣られてんだよ
0069デフォルトの名無しさん
2012/09/24(月) 16:04:19.42性善説をこじらせるとこういう流れが妄想できるようになるの?
0070デフォルトの名無しさん
2012/09/24(月) 17:55:10.54hogeならNG設定しても困らんだろ
0071デフォルトの名無しさん
2012/09/24(月) 22:17:57.880072デフォルトの名無しさん
2012/09/24(月) 23:20:48.87class Hoge
{
public:
virtual void func(){printf("Hoge World!\n");
}
class Fuga : public Hoge
{
0073デフォルトの名無しさん
2012/09/24(月) 23:21:35.58もういいや、寝る
0074デフォルトの名無しさん
2012/09/25(火) 12:01:33.540075デフォルトの名無しさん
2012/09/25(火) 21:16:05.24・"Debug\test.unsuccessfulbuild" のタッチ タスクを実行しています
・すべての出力が最新のものです。
・ファイル "Debug\test.unsuccessfulbuild" を削除しています。
という警告メッセージ?がでます。
Explessから移行したばっかなので何がなんだかわからないのですが、どういうものなのでしょうか?
0076デフォルトの名無しさん
2012/09/25(火) 21:27:10.57普通に使ってれば気にしなくていい
0077デフォルトの名無しさん
2012/09/27(木) 15:53:06.57exit()は、できる。
0078デフォルトの名無しさん
2012/09/27(木) 17:14:02.830079デフォルトの名無しさん
2012/09/27(木) 17:22:27.590080デフォルトの名無しさん
2012/09/27(木) 17:24:33.500081デフォルトの名無しさん
2012/09/27(木) 17:32:10.12return 先のコード書いてみな
0082デフォルトの名無しさん
2012/09/27(木) 17:39:54.69returnが無ければ、例外を飛ばせばいいじゃない
0083デフォルトの名無しさん
2012/09/27(木) 22:26:12.35#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;
}
0084デフォルトの名無しさん
2012/09/27(木) 22:32:26.94もしかして初期化子を知らないのか?
# 知らなくても代入でどうにでもなるが
0085デフォルトの名無しさん
2012/09/28(金) 00:34:03.06スーパークラス
┠サブクラス
┃┠サブサブクラス
┃┗サブサブクラス
┗サブクラス
┠サブサブクラス
┗サブサブクラス
という感じの「継承したクラス」を継承したクラスがあり、
そのインスタンスがあったとして、
スーパークラスのポインタとして受け取ったそのサブサブクラスのアドレスからサブクラスの型を判断するにはどうしたらいいでしょうか?
サブクラスのコンストラクタなどで型の変数を初期化するのではなく内部的な仕組みで出来る方法があれば教えてください。
言葉でうまく説明できないので用途も書きます。
スーパー・・・装備クラス(アイテムスロットを配列で持ちたい)
サブ・・・装備の種類クラス(アサルトライフル~など)
サブサブ・・・装備クラス(M4A1~など)
という感じで表現して、
「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」
という判定をしたいんです。
ゲームスレのほうがいいとは思ったのですが、処理だけ見ればC++に機能そのものなのかなと思いゲームスレではなくこちらで質問させていただきました。
よろしくお願いします。
0086デフォルトの名無しさん
2012/09/28(金) 00:38:49.01dynamic_castするとか
0087デフォルトの名無しさん
2012/09/28(金) 00:41:47.86つtypeid
つdynamic_cast
0088デフォルトの名無しさん
2012/09/28(金) 00:43:16.440089デフォルトの名無しさん
2012/09/28(金) 00:46:35.27C++11ならdecltypeって使えるな
0090デフォルトの名無しさん
2012/09/28(金) 00:47:14.910091デフォルトの名無しさん
2012/09/28(金) 00:50:04.040092デフォルトの名無しさん
2012/09/28(金) 01:01:12.06特に速度が必要ないならdynamic_castでNULL判定が楽
0093デフォルトの名無しさん
2012/09/28(金) 01:19:46.33俺もそう思うが、設計スレじゃないし、いいんじゃね?
0094デフォルトの名無しさん
2012/09/28(金) 08:36:55.73どんな感じにすればいいですか?
0095デフォルトの名無しさん
2012/09/28(金) 09:42:12.280096デフォルトの名無しさん
2012/09/28(金) 12:49:39.57bool canEquip(SlotType)
みたいな関数を用意すればいいんじゃね。
009785
2012/09/28(金) 18:51:14.63後学のためにも教えてくれると本当に助かります。
やっぱりスーパークラスのメンバ変数をサブクラスのコンストラクタで初期化する、というのが最適なのでしょうか?
質問スレの域を脱してる、と言われたら謝ります。
0098デフォルトの名無しさん
2012/09/28(金) 18:59:06.86>>87 で FA
0099デフォルトの名無しさん
2012/09/28(金) 20:47:58.38インターフェース通じてやりたいこと全部出来るようなら(たぶん)成功した設計
ひとつでも出来ないことがあれば失敗設計
0100デフォルトの名無しさん
2012/09/28(金) 20:57:57.65ダウンキャストしてでも派生した方が良い場合もたまにある
ただ、今回がそれかどうかは別の話だが
0101デフォルトの名無しさん
2012/09/28(金) 21:02:35.97010285
2012/09/28(金) 21:06:21.59>>85でいうスーパークラスはインターフェースクラス?なのかどうかは知りませんが
virtualの装飾がついた関数しかありません。
use()=0とかdrop()=0とかpick()=0とか・・・
0103デフォルトの名無しさん
2012/09/28(金) 21:07:54.400104デフォルトの名無しさん
2012/09/28(金) 21:24:09.550105デフォルトの名無しさん
2012/09/28(金) 21:26:40.73ダウンキャストで取り出すなんて日常茶飯事
010685
2012/09/28(金) 21:27:21.03ということは、>>85でいえば
「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」
という判定がしたい時は
逆に銃から3ウェイハンドシェイクみたいなやり取りを開始すれば完全に抽象化できるということでしょうか?
0107デフォルトの名無しさん
2012/09/28(金) 21:47:54.71言いたいことがさっぱりわからんというかESPしても誤解が誤解を生むだけだから
なんか疑似コードでも書いておくれ
0108デフォルトの名無しさん
2012/09/28(金) 21:52:09.68アイテムスロットに登録する人、つまり型情報から判定を行う人は誰?
スーパークラス?
0109デフォルトの名無しさん
2012/09/28(金) 21:56:32.68パラメータ化するのが普通じゃね
011085
2012/09/28(金) 22:49:22.65こんな感じです。
3ウェイハンドシェイクとか忘れてください。
0111デフォルトの名無しさん
2012/09/28(金) 23:03:22.830112デフォルトの名無しさん
2012/09/28(金) 23:20:37.91ちょっとぉ、だいぶ>>85のイメージと違うんだけど。。。
ま、それはさておき、そのコードであれば素直に属性として、「種類」や「名称」を持つのが普通かなと思う。
その相互依存はいくない。
0113デフォルトの名無しさん
2012/09/28(金) 23:20:46.27Equip[tmpWeapon->GetSlot()] = tmpWeapon;
とでもしとけ
0114デフォルトの名無しさん
2012/09/28(金) 23:28:57.41ごめん、見間違えた。
そのコードならいいんじゃね?
俺ならこうするってのはあるけど、それほどおかしくはないと思う。
強いて言えば、タイプをキーにして配列やマップに結びつけるかな。
0115デフォルトの名無しさん
2012/09/29(土) 11:36:37.73// ok
obj.Proxy().Method();
// ng
auto proxy = obj.Proxy();
proxy.Method();
0116デフォルトの名無しさん
2012/09/29(土) 12:30:54.250117デフォルトの名無しさん
2012/09/29(土) 19:30:44.75http://codepad.org/fDEMyIto
aaa()以降の標準出力が使用できず困っています。
WriteConsole()を_tprintf()としても同様です。
標準エラー出力(STD_ERROR_HANDLE)であれば何故か正常に出力が出来ます。
アドバイスお願いします。
0118デフォルトの名無しさん
2012/09/29(土) 19:41:33.53何が疑問なのかわからないくらい。
0119デフォルトの名無しさん
2012/09/29(土) 20:39:33.010120デフォルトの名無しさん
2012/09/29(土) 21:45:43.59friend class X;
private:
void Fuck();
};
class Alice {
Bob<Alice> bob;
public:
void DoSomething() { bob.Fuck(); }
};
こういうふうにfriendに出来る対象をテンプレートで指定したいんですができません
どうすればうまくいきますか?
0121デフォルトの名無しさん
2012/09/29(土) 22:04:53.87Windowsでは一般にGetしたものはReleaseするものであってCloseするものじゃない
0122デフォルトの名無しさん
2012/09/29(土) 22:19:24.47>>118
GetStdHandle()をCreateConsoleScreenBuffer()のような感覚で使っていました。
改めて考えるとおかしいですね。
>>119
お目汚し失礼しました。
C++を学習し始めたばかりですので、お手本お願いできますか?
0123デフォルトの名無しさん
2012/09/29(土) 23:31:47.0711ではclassを書かずに
friend X
03では適当なクラスを介して
template<class T>
struct friend_template
{
typedef T type;
};
friend class friend_template<X>::type;
0124デフォルトの名無しさん
2012/09/29(土) 23:34:58.93!!!!!!!!!!!!!!!
!!!ありがとうございます!!!
!!!!!!!!!!!!!!!
0125デフォルトの名無しさん
2012/09/30(日) 08:25:09.20コピーコンストラクタなどをprivateにしてもauto&&で持つことが出来るよそれ
0126デフォルトの名無しさん
2012/09/30(日) 17:07:55.29Qtを調べたのですがゲームにはあまり向いていないと書いてありました。
0127デフォルトの名無しさん
2012/09/30(日) 17:46:39.17リソースファイルはテキストで直接編集するしかない
0128デフォルトの名無しさん
2012/09/30(日) 18:14:35.990129デフォルトの名無しさん
2012/09/30(日) 18:23:18.960130デフォルトの名無しさん
2012/09/30(日) 23:25:32.800131デフォルトの名無しさん
2012/10/01(月) 15:52:51.27スレッドとファイバのスタックサイズを
4KB未満に小さくするにはどうすれば良いですか?
SetThreadStackGuaranteeというので最小スタックサイズを
変えられるようですが、小さくできないようだし、
64ビットのみだし。
32ビットXPでできる方法はありませんか?
0132デフォルトの名無しさん
2012/10/01(月) 16:14:38.57ページサイズ以下には出来ないんじゃないの?
仮に出来てもページサイズ単位になるだろうし
0133デフォルトの名無しさん
2012/10/06(土) 09:02:38.89ライブラリ等外部から取得したポインタのアライメントを確認するには
どのような方法がよいでしょうか?
今はintにキャストしてbit andをとっていますが、これが動作保証されているのか
わからないのと、Windows環境で適切なAPIがあればそちらを使いたいと思っています。
0134デフォルトの名無しさん
2012/10/06(土) 10:04:45.030135デフォルトの名無しさん
2012/10/06(土) 10:24:06.850136デフォルトの名無しさん
2012/10/06(土) 13:35:32.67で、どうせ環境依存になるんだからintptr_tにキャストすればOK。
0137デフォルトの名無しさん
2012/10/06(土) 13:38:32.52何度も議論されてるようにintptr_tではサイズが足りる保証はない
0138デフォルトの名無しさん
2012/10/06(土) 13:40:21.78それはイテレーター全般の話だろ
ポインタはvalid rangeじゃなくてもオフセットを取得出来る
0139デフォルトの名無しさん
2012/10/06(土) 14:00:22.330140デフォルトの名無しさん
2012/10/06(土) 14:10:00.90それも同じでサイズが足りる保証はない
0141デフォルトの名無しさん
2012/10/06(土) 14:14:36.17何度も議論された成果を1行で示すくらい、簡単だろう?
0142デフォルトの名無しさん
2012/10/06(土) 14:16:29.60>>135
0143デフォルトの名無しさん
2012/10/06(土) 14:33:15.52Unless 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なら保証されるが定義されている保証はない
0144デフォルトの名無しさん
2012/10/06(土) 14:55:31.15なるほど、型に保証が無いのは分かったが、
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バイトの環境で、とか言い出されたら、もうハイハイとしか言いようがないけども
0145デフォルトの名無しさん
2012/10/06(土) 15:06:35.67まあ>>134が同じ配列オブジェクトの要素だと強弁するならそれでいいんじゃないの
百歩譲っても(char*)0が配列オブジェクトの要素を指してるなんてありえないと思うけど
0146デフォルトの名無しさん
2012/10/06(土) 15:17:48.270147デフォルトの名無しさん
2012/10/06(土) 15:18:29.080148デフォルトの名無しさん
2012/10/06(土) 15:23:59.43あなたたちはあれはだめこれはだめというばかりで一向に話を進めようとしないじゃないですか
0149デフォルトの名無しさん
2012/10/06(土) 15:25:20.340150デフォルトの名無しさん
2012/10/06(土) 15:29:42.29intptr_tかuintptr_tがあればそれを使うのが安全
0151デフォルトの名無しさん
2012/10/06(土) 15:40:19.14それが何かおかしい?
0152デフォルトの名無しさん
2012/10/06(土) 15:45:24.94if(BigInt::FromString16(buf) % align == 0) Good(); // EXCELLENT!!
0153デフォルトの名無しさん
2012/10/06(土) 15:55:52.110154デフォルトの名無しさん
2012/10/06(土) 16:09:32.370155デフォルトの名無しさん
2012/10/06(土) 16:33:19.07それだけがんばってもこういう環境ではうまくいかない件
0156デフォルトの名無しさん
2012/10/06(土) 16:38:05.760157デフォルトの名無しさん
2012/10/06(土) 16:39:47.310158133
2012/10/06(土) 16:57:53.35キャストしたとき下位ビットがアライメントを表すことが保証されているかどうか、
それだけです。
0159デフォルトの名無しさん
2012/10/06(土) 18:21:42.78struct type1{ char a[10]; }; この型のアライメントは1
struct type2{ DECLSPEC_ALIGN(1024) char a;} この型のアライメントは1024
というようなことを判別する必要があるなら
(UINT_PTR)p % TYPE_ALIGNMENT(T) == 0 が真っ当な方法
0160デフォルトの名無しさん
2012/10/06(土) 19:02:42.60アライメントの定義は下位ビットでしょ?
問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
キャストできるならその答えは Yes になる
どうせ上司あたりから受け取ったポインタのアライメントを確認するように!と
言われたんだろう。
「x86ならアライメントエラーにならないから平気ですよ」と言い返そう
そのあと「あ、ARMだと例外おきますね。ARMも対応するんですか?なら直してきます」
と言って席に向かおう
0161デフォルトの名無しさん
2012/10/06(土) 19:17:04.09>キャストできるならその答えは Yes になる
ポインタを整数にキャストできることは保証されているが、それがアドレスか
どうかは規定されてないだろ。
0162デフォルトの名無しさん
2012/10/06(土) 19:21:27.240163133
2012/10/06(土) 20:06:49.56まさに、受け取ったデータをSSEで処理したいんですが16byte alignmentを要求するので
そのチェックをしたいということです。
他の環境に移植し得るようなプログラムでポインタのアライメントをチェックしなければ
ならないような場面なんて逆に思いつかないです。
0164デフォルトの名無しさん
2012/10/06(土) 20:13:57.580165デフォルトの名無しさん
2012/10/06(土) 21:02:33.910166デフォルトの名無しさん
2012/10/06(土) 21:50:36.980167デフォルトの名無しさん
2012/10/06(土) 21:56:01.43それともポインタ変数のアライメントのことを言ってるのか?
0168デフォルトの名無しさん
2012/10/06(土) 22:30:27.72アドレスのアラインメントっていってくれたほうがわかりやすい
0169デフォルトの名無しさん
2012/10/07(日) 06:28:21.41テンプレートという機能がある事を知ったので、
ある要素配が列に含まれるか調べる関数をテンプレートで書いてみました。こんなのです。
#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
というエラーを吐いてコンパイルが出来ません。いったい何がまずいのでしょうか。
0170デフォルトの名無しさん
2012/10/07(日) 06:40:26.51それとc++なら、std::coutを使いましょ
0171デフォルトの名無しさん
2012/10/07(日) 06:43:55.380172デフォルトの名無しさん
2012/10/07(日) 06:44:15.83×templete
○template
あとsizeof(elems)は配列の要素数を返さないのでそれじゃまともに動かないよ
0173デフォルトの名無しさん
2012/10/07(日) 08:26:40.90とりあえず初心者はVC++かeclipse使って色付けてもらえよ
そしたらこんなしょうもないエラーに悩まされることはないはずだから
0174デフォルトの名無しさん
2012/10/07(日) 08:28:09.60多分標準ライブラリがあると思ったのですが、
言語の機能を学びたいとおもいこんなことをやっています。
>>171,172
> ○template
それでした、下らなくてすんません
sizeofは自分もそう思ったのですが、
char[]の配列をいくつか作って試してみた限りでは
きちんと配列の長さを返してくれたのでそのままにしてあります
これって仕様に無い実装依存の挙動だったりするんですか?
0175デフォルトの名無しさん
2012/10/07(日) 08:43:31.39ttp://ideone.com/7CRnJ
本当に返してるかきちんと調べたか?
0176デフォルトの名無しさん
2012/10/07(日) 08:56:18.78emacsを使ってますが色の意味が分かりませんでした……
>>175
sizeofの結果を直接printfした場合にはちゃんと長さを返してくれてたんですが、
memberOfから呼ぶとだめみたいですね。
やっぱりsizeofじゃダメみたいですね。
0177デフォルトの名無しさん
2012/10/07(日) 09:01:31.25配列は通常の方法では関数に渡せないからね。渡しているのはポインタ。
関数内で配列のサイズを知りたければ、テンプレート引き数として配列を渡す位しか手がないよ。
0178デフォルトの名無しさん
2012/10/07(日) 09:05:46.23まあそうなんですが
直接書いて長さ返してくれるなら
インラインは最終的に直接書いたのと同じにならないかなー、と思ったんですが
やっぱりこういうのはあんまりやらない方がいいですね
0179デフォルトの名無しさん
2012/10/07(日) 09:38:10.37バグの温床になるからしない方が良いかと。
0180デフォルトの名無しさん
2012/10/07(日) 10:55:28.91template <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が設定されます。
以前同じ問題で悩んだことがあったので
参考までに。
0181デフォルトの名無しさん
2012/10/08(月) 15:47:59.920182デフォルトの名無しさん
2012/10/08(月) 15:49:24.240183デフォルトの名無しさん
2012/10/08(月) 16:02:19.900184デフォルトの名無しさん
2012/10/08(月) 21:40:15.02サーバ側は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
0185デフォルトの名無しさん
2012/10/08(月) 21:45:15.740186デフォルトの名無しさん
2012/10/08(月) 22:39:33.65send( ), recv( ) の直前でソケットの値表示して、本当に正しいソケットに
対して操作しているか確認しなよ。
もしくは、ソースさらして。
0187デフォルトの名無しさん
2012/10/08(月) 22:41:47.22えーと、サーバ側アプリを書いているんだよね?
受信したスレッドと送信したスレッドはきちんと把握できている?
ひょっとしたら、メインスレッドで受信してメインスレッドで送信しているんじゃない?
0188デフォルトの名無しさん
2012/10/08(月) 23:25:28.29ソケットの値も確認しました。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関数は
0189デフォルトの名無しさん
2012/10/08(月) 23:26:54.96>>1のサイトを使ってもう1回書きます。
0190デフォルトの名無しさん
2012/10/08(月) 23:34:41.84先にも書きましたが、受信データの解析・送信はメインスレッドのあるクラスの関数でおこなっています。
SOCKETを渡して、それをsendに指定しているのですが、もしかしてメインスレッドのクラスでsendしているのが問題なのでしょうか
0191デフォルトの名無しさん
2012/10/08(月) 23:53:19.41> CThread* cthread = new CThread( socket2, this );
> cthread.start();
ホントにソース書いてる?
cthread->start(); じゃなくて?
イメージは間違ってないと思うが、こういう細かいところでミスってるんじゃないのか?
て言うか、人に見てもらうならせめてコンパイルエラーにならないソースを上げてよ…
0192デフォルトの名無しさん
2012/10/09(火) 01:35:08.280193デフォルトの名無しさん
2012/10/09(火) 01:37:01.29すみません、他にもいろいろ間違ってますね。
1回間違って書き込んで無意味に焦ってしまいました。
>メインスレッドで受信してメインスレッドで送信しているんじゃない?
というのを受けてもう一度ソースを見なおしたところ、スレッドの扱いは合っていたのですが
別のところで問題があることがわかりました。
TCPがどうとかいう以前の問題でしたので、全体的にソースを見直すことにします。
ご回答して下さった方々、ありがとうございました。
0194デフォルトの名無しさん
2012/10/09(火) 06:46:12.36メインスレッドで処理して
間違ったサブスレッドで送り返していたと
0195デフォルトの名無しさん
2012/10/09(火) 23:35:01.100196デフォルトの名無しさん
2012/10/09(火) 23:36:11.75おお、これはすごい
勉強になります
ありがとうございます
0197デフォルトの名無しさん
2012/10/09(火) 23:40:12.580198デフォルトの名無しさん
2012/10/10(水) 00:00:03.890199デフォルトの名無しさん
2012/10/10(水) 00:09:00.780200デフォルトの名無しさん
2012/10/10(水) 00:42:56.190201デフォルトの名無しさん
2012/10/10(水) 09:08:12.03#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はアドレスですよね?
なぜアドレスを値に代入できるのでしょうか?
0202デフォルトの名無しさん
2012/10/10(水) 09:14:34.59臭い質問すんなゴミ
0203デフォルトの名無しさん
2012/10/10(水) 09:15:55.61*j には入れてない
j に入れている
0204デフォルトの名無しさん
2012/10/10(水) 09:16:20.760205デフォルトの名無しさん
2012/10/10(水) 10:25:05.11関数の引数は代入ではなく変数の宣言と同じ
*j=p; ではなく
int *j=p; と同じ(おおまかには int *j; j=p; と同じ)
0206デフォルトの名無しさん
2012/10/10(水) 12:13:40.690207201
2012/10/10(水) 16:47:46.04>関数の引数は代入ではなく変数の宣言と同じ
というのがよくわからんのですが、何か良いサイトや本はありませんか?
俺が読んでいる本は標準講座C++(ハーバート・シルト著です。
上記のようなことはざっと見た限り載っていませんでした。
0208デフォルトの名無しさん
2012/10/10(水) 16:48:21.120209デフォルトの名無しさん
2012/10/10(水) 16:49:01.830210デフォルトの名無しさん
2012/10/10(水) 18:17:55.45変数宣言での*と、代入での*は意味が違うってことだと思う
前者は型の一部、後者はポインタ演算子
「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;
}
0211デフォルトの名無しさん
2012/10/10(水) 18:29:54.160212デフォルトの名無しさん
2012/10/10(水) 19:18:09.110213デフォルトの名無しさん
2012/10/10(水) 19:30:47.950214デフォルトの名無しさん
2012/10/10(水) 22:29:08.140215デフォルトの名無しさん
2012/10/11(木) 00:20:02.72いわゆるシングルトンもそれと同じになると考えて問題ないですか?
0216デフォルトの名無しさん
2012/10/11(木) 00:28:08.08シングルトンはデータの置き場所としては普通の変数と同じだけど
初期化コードの必要性によって事情が変わる
0217デフォルトの名無しさん
2012/10/11(木) 00:34:38.68どう理解すべきでしょうか?
0218デフォルトの名無しさん
2012/10/11(木) 01:00:33.00text+data+bss+heap+stack
textはコード
関数中のstaticな変数も含めて生存期間がプログラム実行時と同じ変数はdataかbssに置かれる。
なお実行可能ファイルに含まれるのはtextとdata。
>>216
>初期化コードの必要性によって事情が変わる
というのはdataにおくかbssにおくか、の判別を指すと思う。
適当な参考書籍やurlはよくわからない、すまない。
0219デフォルトの名無しさん
2012/10/11(木) 01:02:53.24初期化コードの内容によって宣言の仕方が変わる
0220デフォルトの名無しさん
2012/10/11(木) 01:19:45.99>初期化コードの内容によって宣言の仕方が変わる
適当な例を思い浮かべられないのだが?
0221デフォルトの名無しさん
2012/10/11(木) 01:27:16.130222デフォルトの名無しさん
2012/10/11(木) 01:39:39.13破壊のタイミングをしっかり管理したいときになんでshared_ptrなんだよ
0223デフォルトの名無しさん
2012/10/11(木) 01:46:39.77> 関数中のstatic変数はスタックでしょうかヒープでしょうか?
まず規格上の言語仕様にはスタック領域・ヒープ領域といった実装レベルの概念に対する規定はない
よって全てはコンパイラの実装に依存する
そしていまどきのPC用のコンパイラの実装であれば少なくともスタック領域ではないところに配置されると思っていい
> いわゆるシングルトンもそれと同じになると考えて問題ないですか?
いわゆるがGoF本でのシングルトンパターンのことなら関数中のstatic変数を使って実装することになるので当然同じになる
0224デフォルトの名無しさん
2012/10/11(木) 02:05:48.90少し考えればわかるよ
0225デフォルトの名無しさん
2012/10/11(木) 02:15:29.60知りたくもない話だ。
0226デフォルトの名無しさん
2012/10/11(木) 06:35:58.65*j に p を代入と言うのは、式で書けば *j=p と言う事だが、どこでそんな事をしている?
関数の引数で受けているところは、j=p 相当の処理だぞ?
int* j=p;
と同じね
0227デフォルトの名無しさん
2012/10/11(木) 07:06:56.28void f(j)
int *j;
{ ...
0228デフォルトの名無しさん
2012/10/11(木) 07:11:41.020229デフォルトの名無しさん
2012/10/11(木) 07:35:11.670230デフォルトの名無しさん
2012/10/11(木) 09:50:47.44「C言語 静的領域」でググってみれ
>>221
ねーよ
>>228
ねーよ
0231215
2012/10/11(木) 10:17:03.90ありがとうございます
0232デフォルトの名無しさん
2012/10/12(金) 01:29:06.33typename 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; { 〜
0233デフォルトの名無しさん
2012/10/12(金) 01:45:41.39君の好みに合う世界は金輪際実現しない
0234デフォルトの名無しさん
2012/10/12(金) 02:55:15.25そのかわり引数のプロトタイプチェックは皆無になる(はず)なのだが
0235デフォルトの名無しさん
2012/10/12(金) 07:23:00.470236デフォルトの名無しさん
2012/10/12(金) 19:34:51.55苦笑
0237201
2012/10/12(金) 19:40:15.08>>226
>関数の引数で受けているところは、j=p 相当の処理だぞ?
というのがわからんのです。
一日無い知恵を絞って考えたんですが、仮引数の宣言に現れる*は、
ポインタ宣言の場合とおなじようにjがポインタ変数であることを示しているだけで、
単項演算子の*とは異なるという認識でよろしいのでしょうか?
0238デフォルトの名無しさん
2012/10/12(金) 19:42:29.85/ / / ,. ‐'''""~´ ̄ ̄\
V / / / }
∨ / / ,,.. -一ァ',二二二{
V ,..,/ ,.ィ彳 f==<r'二二二{、 | ̄ ̄ __|__ |
∨| ヘ`<=''~ 弋ッ-ミ'''テ~ナ/ |ー― \/ ´ ̄| 「 ̄` | | \/
〉'| | ト、 i{ ,..`二/ =|/''′ |__ /\ 匚]__ !__, |_ | __/
//ヽヽぅ ヽ { =|
//匚 ̄]〕 丶,-‐ ,> ( そ の と お り で ご ざ い ま す )
/´r┐|__,|ト、 、____`7´
__人..二.」' l>、 ヽ`,二/
´"''ー-�論\ ∠三ノ
―-、__ ``ヾニ='′
`ヽ /、
|‐- ...__ /ヽ\_
\  ̄ `ヽ \
0239デフォルトの名無しさん
2012/10/12(金) 21:33:28.190240デフォルトの名無しさん
2012/10/12(金) 21:44:35.24int * a, b;
は、aはintのポインタ型だけと、bはintだから注意な
*aがintになる型、と考えるといいのかもね
0241デフォルトの名無しさん
2012/10/12(金) 22:21:11.43不自然な仕様だよな
0242デフォルトの名無しさん
2012/10/12(金) 22:23:11.11ポインタは型ではないから後者が正解。
0243デフォルトの名無しさん
2012/10/12(金) 23:03:25.34typedefできるだろ?
0244デフォルトの名無しさん
2012/10/12(金) 23:07:13.710245デフォルトの名無しさん
2012/10/12(金) 23:21:30.160246デフォルトの名無しさん
2012/10/13(土) 00:25:09.42int *a, b;
で何の問題もないじゃん。
0247デフォルトの名無しさん
2012/10/13(土) 00:32:21.470248デフォルトの名無しさん
2012/10/13(土) 00:54:20.580249デフォルトの名無しさん
2012/10/13(土) 01:27:06.70みんなこっち行こうず
IDあるほうがまだマシ
0250デフォルトの名無しさん
2012/10/13(土) 02:06:24.78そこは「しようず」が多くて気持ち悪い
0251デフォルトの名無しさん
2012/10/13(土) 02:13:12.18早くも管理人行方不明じゃねーか
0252デフォルトの名無しさん
2012/10/13(土) 02:15:22.270253デフォルトの名無しさん
2012/10/13(土) 02:26:48.690254デフォルトの名無しさん
2012/10/13(土) 02:57:37.440255デフォルトの名無しさん
2012/10/13(土) 10:23:46.53アフィブログ用なんでしょ?そこ
0256デフォルトの名無しさん
2012/10/13(土) 10:48:56.47void (Admin::*ElementSelect)();
というのが関数ポインタなんですけど
void vector <(Admin::*ElementSelect)()> ElementSelectAry;
になるんでしょうか?
0257デフォルトの名無しさん
2012/10/13(土) 10:58:19.580258デフォルトの名無しさん
2012/10/13(土) 11:23:35.53ありがとう
0259デフォルトの名無しさん
2012/10/13(土) 11:42:51.670260デフォルトの名無しさん
2012/10/14(日) 12:44:11.910261デフォルトの名無しさん
2012/10/14(日) 13:08:50.66条件を限定しない一般論なら答えようがない
(あえていうなら一般論としてはやるな、になるけど)
0262デフォルトの名無しさん
2012/10/14(日) 13:25:53.170263デフォルトの名無しさん
2012/10/14(日) 13:30:18.270264デフォルトの名無しさん
2012/10/14(日) 17:04:33.67{
{0, 1, 2},
{3, 4, 5},
{6, 7, 8}}
};
wcout << MyArray[2][2] << endl ;
こういう使い方ってしてもいいんですか?
0265デフォルトの名無しさん
2012/10/14(日) 17:22:52.69かなり危ないコードです
0266デフォルトの名無しさん
2012/10/14(日) 18:54:05.17添え字の範囲を超えないようにするとかで正しく使うなら何の問題もない
0267デフォルトの名無しさん
2012/10/14(日) 19:13:20.710268デフォルトの名無しさん
2012/10/14(日) 19:43:11.07学習材料として使ってるのが多い
アセットを作ること自体意味があって、アセットストア頼りとか真のクソ
あとグラフィックコンテンツ的な作品に使われるのも多い
世界でCEやUnityの10倍以上の使用者がいる つかUnityはゴミみたいな存在
スレッド数 http://www.polycount.com/forum/forumdisplay.php?f=38
UDK 1,330
Crytek Sandbox 134
Unity 67
日本でどうとかいってる低レベルのダニは駆逐されてほしい
0269デフォルトの名無しさん
2012/10/14(日) 19:44:04.920270デフォルトの名無しさん
2012/10/14(日) 20:19:26.45初期化の内容が要素数越えたらgccじゃエラーになったよ
別に安全だと思う
0271デフォルトの名無しさん
2012/10/14(日) 20:28:38.18ありがと
0272デフォルトの名無しさん
2012/10/15(月) 21:05:31.24template<class T>
class foo :public bar{
void func(boost::shared_ptr<T>);
}
このときbar形のポインタにfooのオブジェクトをnewして、
そのポインタからfunk(...)をキャストせずに使うことは出来ますか?
0273デフォルトの名無しさん
2012/10/15(月) 21:12:31.49無理
0274デフォルトの名無しさん
2012/10/15(月) 21:16:31.01キャスト必要なんですかね?
0275デフォルトの名無しさん
2012/10/15(月) 21:17:36.99できません
0276デフォルトの名無しさん
2012/10/15(月) 21:20:19.05ありがとうございました
0277デフォルトの名無しさん
2012/10/15(月) 21:26:14.110278デフォルトの名無しさん
2012/10/15(月) 21:39:00.540279デフォルトの名無しさん
2012/10/15(月) 22:16:34.58仮装関数にしたいものの引数にテンプレート変数が入ってるんですよね…
設計ミスな気もします
0280デフォルトの名無しさん
2012/10/15(月) 22:21:59.98ん?
なるほど、ポイントはそこか
0281デフォルトの名無しさん
2012/10/15(月) 23:31:42.40無理だから
諦めて
0282デフォルトの名無しさん
2012/10/15(月) 23:32:36.59どうしてもそれに近いことをしたいなら、
引数を工夫するために宣言を変えてくれ
0283デフォルトの名無しさん
2012/10/15(月) 23:40:42.78struct 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);
}
0284デフォルトの名無しさん
2012/10/15(月) 23:41:54.37a か b に機能を持たせて丸投げすべきか。
そもそもfooもbarも作り直して考え直すのが良いか。
0285デフォルトの名無しさん
2012/10/16(火) 10:31:34.38ttp://ideone.com/wSkTm
基礎設計はちょっと違うが(呼び出す時点では)キャストせずにfuncを使える
呼び出し側が引数の正当性を保障できるならdynamic_castの代わりにbar_に仮想関数を持たせずにstatic_castを使うこともできる
0286デフォルトの名無しさん
2012/10/16(火) 12:45:48.03逸脱し過ぎじゃないか?
0287デフォルトの名無しさん
2012/10/16(火) 15:17:00.72fatal error LNK1120: 外部参照 1 が未解決です。
とかいうエラーがが直せません><
宣言はあるけど、定義はどこか分からない、とこういうエラーが出るらしいですけど、
該当部には
class A;前方宣言
extern A* m_ptest;エクスターンなんとか
m_ptest->func();←ここがエラー箇所
としていて、
別の箇所で
m_ptest = new A();
と定義をしているつもりなんですけど、どこか間違っているでしょうか?
0288デフォルトの名無しさん
2012/10/16(火) 15:45:58.25この時点でclass Aの宣言が全部見えてる必要がある
0289デフォルトの名無しさん
2012/10/16(火) 15:50:21.01class Aの宣言を書いたヘッダファイルをインクルードしてみたのですがNGでした。
0290デフォルトの名無しさん
2012/10/16(火) 15:51:44.180291デフォルトの名無しさん
2012/10/16(火) 16:03:48.68エラー 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;
}
0292デフォルトの名無しさん
2012/10/16(火) 16:03:50.28それも別のクラスの宣言部に書いてたのですが、エラーが出てます。
別のクラスBのヘッダファイル中において、データメンバとして
A* m_ptest;
と書いておいて、
そのクラスBのcppファイル中、コンストラクタ内で
m_ptest = new A();
と定義してるつもりでした。
試しにWinMain関数の前にA* m_ptest;と書いたら
エラー無しで問題は解決したのですが、両者の違いが分かりません。
理解を深めるためにもお教えいただけないでしょうか。
0293デフォルトの名無しさん
2012/10/16(火) 16:08:04.170294デフォルトの名無しさん
2012/10/16(火) 16:10:30.87A* m_ptest;
};
A* m_ptest;
上の二つは別物です
extern A* m_ptest;
は後者を指してるので定義がないとエラーになります
0295デフォルトの名無しさん
2012/10/16(火) 16:12:21.010296デフォルトの名無しさん
2012/10/16(火) 16:30:15.84AはBを構成する部品の一つなので、包含関係かなと思って、
Aのインスタンスm_ptestをBのデータメンバとしていました。
ですが、Aのメンバ関数をBよりも外の箇所で使用したくて、
extern宣言、ヘッダファイルのインクルードなどで、なんとか出来ないかとしていたところ、
上記のエラーが出て困っていました。
全く別物を指していたとは・・・スコープというものでしょうか、
調べてみます。
回答いただきありがとうございました。
0297デフォルトの名無しさん
2012/10/17(水) 09:42:10.60そういうときはTypeEraserとNonVirtualInterfaceを併用することが多いね
インターフェースにテンプレートメンバ関数ライクな仮想関数を持たせたいときの典型的なパターンね
http://ideone.com/R7LtF
0298デフォルトの名無しさん
2012/10/18(木) 20:02:12.02俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど
要は、親玉(Objectクラス)は、子供(継承したクラス)の
情報をしってて、親玉から子供の情報を知りたい時にキャストして
子供の情報を得る。
ってな感じで良い?
まぁ、オブジェクト指向のなんたるかを語りだすと
色んな人が色んな例えして、どーでも良くなったりすんだけどね。
0299デフォルトの名無しさん
2012/10/18(木) 20:37:13.280300デフォルトの名無しさん
2012/10/18(木) 20:41:45.86お前の認識してるオブジェクト指向は全部間違ってる
0301デフォルトの名無しさん
2012/10/18(木) 20:58:48.490302デフォルトの名無しさん
2012/10/18(木) 21:53:45.36死ね初心者
0303デフォルトの名無しさん
2012/10/18(木) 22:22:31.14例えばこんな感じです。
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)終わり、とやりたいです。
単純にリンクの張替えで出来ると思ったのですが、やり方がわかりません
0304デフォルトの名無しさん
2012/10/18(木) 23:09:33.760305デフォルトの名無しさん
2012/10/18(木) 23:13:17.63(Hamigakiとか)
GPUを使うOpenCVとかと混ぜたらうまく動かないってことでいいのでしょうか
0306デフォルトの名無しさん
2012/10/18(木) 23:13:46.92ダサい仕様だが
0307デフォルトの名無しさん
2012/10/18(木) 23:57:18.99その方法は基底をホルダーにした型消去であってオブジェクト指向プログラミングと直接の関係はない
0308デフォルトの名無しさん
2012/10/19(金) 00:03:16.48自分で作ったウィンドウではなく、MessageBox関数を利用します。
そこでMessageBoxのウィンドウハンドルを取得したいのですが
1 CreateThreadで別スレッドを作成
2 別スレッドがMessageBox呼び出し
3 メインスレッドがEnumThreadWindowsで別スレッドのウィンドウを列挙
4 GetWindowTextでタイトル照合
タイトルが一致するウィンドウがなければ3に戻る
5 取得したウィンドウハンドルは、タイムアウトしたらWM_CLOSEを送るなどに使用
CreateThreadで作成されたスレッドは
IMEが作ったウィンドウや、タイトルのないウィンドウが
あらかじめ作られているようで
タイトルによってはそれらと一致してしまうので
この手段が不確実です。
ウィンドウを列挙したり、文字列を比較するというのも
かなり無駄が多いです。
このような原始的な方法しか思いつかないのですが
他になにか良い方法はないでしょうか。
0309デフォルトの名無しさん
2012/10/19(金) 00:07:26.41list<int>::iterator i1(ls.begin()), i2(ls.begin());
ls.splice(++i1, ls, ++ ++ ++i2);
0310デフォルトの名無しさん
2012/10/19(金) 00:14:34.04sscanf(str, "ID%d", &id");
などとするとき、"ID100"からも"Id100"からも100を取り出したいのですが。
0311デフォルトの名無しさん
2012/10/19(金) 00:37:42.79GetWindowThreadProcessId 使えばいい
ウィンドウクラス名とプロセスID調べれば誤爆はしないでしょ
時間で閉じるメッセージボックスは公開されてないがuser32.dllにあった気がする
0312デフォルトの名無しさん
2012/10/19(金) 07:05:22.00一応 "%[Ii]%[Dd]%d" ってのはできる
0313デフォルトの名無しさん
2012/10/19(金) 12:28:53.91"%*[Ii]%*[Dd]%d"と読み飛ばしてしまえば医院で内科医。
>>310
要求仕様が厳密でないなら↑の方法で。
厳密ならば("Id"や"iD"を許容しない)ならsscanf()一回だけでは無理。
0314デフォルトの名無しさん
2012/10/19(金) 13:26:19.97if else
swich
しかないのでしょうか
boostやstlでもっと複雑なことのできる条件分枝はないのでしょうか
0315デフォルトの名無しさん
2012/10/19(金) 13:37:41.160316デフォルトの名無しさん
2012/10/19(金) 13:49:48.850317デフォルトの名無しさん
2012/10/19(金) 13:55:52.82同じ名前で引数が異なるローカル関数って作れますか?
hoge(enum hoge);
hoge(int hoge);
0318デフォルトの名無しさん
2012/10/19(金) 13:58:56.78では次の方質問があればどうぞ
0319デフォルトの名無しさん
2012/10/19(金) 14:28:42.25C++では同じ名前で引数が異なる関数は作れますが、ローカル関数が作れません
Cではローカル関数は作れますが、同じ名前で引数が異なる関数が作れません
よって作れません
0320デフォルトの名無しさん
2012/10/19(金) 14:44:40.03初心者向けの本は勉強したけど、全然わかりません。
やさしいC++をひと通りコード書いて理解しました。
int main(void)
とか、int main の中に何か入ってるものは何を意味してるのか分からないし
operator関数も難しいです。
0321デフォルトの名無しさん
2012/10/19(金) 14:44:58.51論理演算子もある意味条件分岐。
>>317
C++ならね。
0322デフォルトの名無しさん
2012/10/19(金) 14:49:36.51C++でも出来ねぇって
C++ 同名で引数が異なる関数 ○
http://ideone.com/Eezsy
C++ ローカル関数
http://ideone.com/UIJwh ×
C 同名で引数が異なる関数
http://ideone.com/kU4Dl ×
C ローカル関数
http://ideone.com/BHHFd ○
0323デフォルトの名無しさん
2012/10/19(金) 14:49:49.61std::wcout << L"ほげ";
JavaからJNI(Java Native Interface)でc++のコードを使っていて、
デバッグ用にcoutを使ったら文字化けしてしまいました。
もしかしてコーディングが違うのでは?とか思いました。
調べてもよくわからないのですけど、おそらくJavaが用意したコンソールは、UTF16のビッグエンディアンなんじゃないかなと思いました。
なので、L"ほげ"というのをBigエンディアンに出来ないでしょうか?
LってのがLittleだったら、神がかってるなと思って、B"ほげ"にしてみたらやっぱだめでした。
Localeなのかな。
std::wcout.imbue()付近で調べればわかりますかね?
0324デフォルトの名無しさん
2012/10/19(金) 15:00:33.84char b[] = {0x30, 0x7B, 0x30, 0x52, 0x00, 0x00}; //ほげ UTF-16BE
std::cout << b;
ってしてみたら
0325デフォルトの名無しさん
2012/10/19(金) 15:13:18.13ただしGCCとかの独自拡張ならできる
独自拡張ならば同名で引数が異なるローカル関数が定義できる処理系もあるかもね
0326デフォルトの名無しさん
2012/10/19(金) 15:13:25.90正直、使ってみないと覚えない。
難しいとよく言われるCのポインタだって、勉強中はサッパリでも
実際に必要な場面を迎えると案外簡単に使えたりする。
あと、このスレに限らず、技術系のコミュニティって、
半分も理解してないけど参加してる、自分が混ざれる話題にだけ混ざるって人は多いよ。
0327デフォルトの名無しさん
2012/10/19(金) 15:32:45.86public:
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の構成が変わっちゃうかも、とか気にしなくていいの?
0328デフォルトの名無しさん
2012/10/19(金) 16:38:16.98EXE側は ハンドルの中身をほぐしてクラス動作させることはない
という切れ目で DLL化したことはあるけど
class そのもののエクスポートが必要な要求っぽいね
(EXE側で ポインタ参照〜クラスのメソッドを呼び出したい)
0329デフォルトの名無しさん
2012/10/19(金) 16:44:05.10CreateがIHoge*でなくInterface*を返して、
DLLとEXEでInterfaceを変更しなければ大丈夫じゃね
dllimport側でHogeはincludeしない(使わない)なら
dllexport側のHogeは変更してOK
0330デフォルトの名無しさん
2012/10/19(金) 16:53:10.19とか
#ifdef HAVE_CPP0X
みたいなことってできないの?
0331デフォルトの名無しさん
2012/10/19(金) 17:00:55.05その処理系が11に対応してれば、オプションで変更可能になってる場合もあるんでね?
0332デフォルトの名無しさん
2012/10/19(金) 17:07:01.56boostならBOOST_NO_CXX11_〜系のマクロで機能ごとに判別できる
0333デフォルトの名無しさん
2012/10/19(金) 17:18:30.55値をdllに渡して処理したあと、グローバル変数に値を入れておいて、
vbaから読み込みのフラグが立ったらその変数を戻すようにしているのですが、
グローバル変数は呼び出し速度が遅い等ネットで見かけます。
グローバル変数を回避して、ローカル変数のみで同様のことをするには
ざっくりどんなことをすればいいのでしょうか
0334デフォルトの名無しさん
2012/10/19(金) 17:26:40.62proc(handle, p1, p2...);
v = get(handle);
close(handle);
的な感じにするとか
0335デフォルトの名無しさん
2012/10/19(金) 17:26:57.060336デフォルトの名無しさん
2012/10/19(金) 17:37:23.39float fsin = 0;
_asm{FLD DWORD PTR DS:[fsin]
FSIN
FSTP DWORD PTR DS:[fsin]}
を使う場合では、どちらが高速ですか?
0337デフォルトの名無しさん
2012/10/19(金) 17:41:32.98環境次第。
例えばSSEが使える状況なら、FPUを使うのは高コスト。
また、math.hのsin()ならコンパイラが勝手にFPU版なりSSE版なり使い分けてくれる可能性がある。
0338デフォルトの名無しさん
2012/10/19(金) 17:41:36.73何がしたいんだかわからんけど
http://toro.2ch.net/test/read.cgi/tech/1323692486/
全部ここからのコピペだから相手にしなくていいよ
0339デフォルトの名無しさん
2012/10/19(金) 17:43:07.52そりゃFPUを直接叩けば一番速いだろうけど、ライブラリは少しでも誤差を少なくするために
いろいろ工夫してるから速度と精度は必ずしも両立しないな
0340デフォルトの名無しさん
2012/10/19(金) 17:52:23.79それでも回答したがる自己顕示欲の強い奴がいかにム板に多いかってことが改めて浮き彫りになったなw
0341デフォルトの名無しさん
2012/10/19(金) 17:53:02.70{
int mHoge;
virtual void hoge(void) = 0;
void test(int Num) {
mHoge = Num;
}
};
みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、
関数testの実体はインスタンスの数だけ存在するのでしょうか?
0342デフォルトの名無しさん
2012/10/19(金) 18:05:53.600343デフォルトの名無しさん
2012/10/19(金) 18:08:17.26「みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、」
のような問題文の一部でググってからレスした方が良さそうだね
健気に文言を変えてコピペしてくるかな?
0345デフォルトの名無しさん
2012/10/19(金) 20:57:11.80これが正解
// 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()); }
};
0346デフォルトの名無しさん
2012/10/19(金) 21:00:22.01C++でもローカル関数のようなものは作れる
C++11ならラムダで、これは本当にローカル関数と言っていいもの
C++03でもローカルクラスのstaticメンバ関数くらいなら作れる(ローカル変数に触れないけど)
0347デフォルトの名無しさん
2012/10/19(金) 21:30:19.620348デフォルトの名無しさん
2012/10/19(金) 21:37:27.68「本当にローカル関数と言っていい」というほどのものじゃないな
0349デフォルトの名無しさん
2012/10/19(金) 21:41:31.38ローカルクラスのstaticメンバ関数で十分
0351デフォルトの名無しさん
2012/10/19(金) 23:48:29.860352デフォルトの名無しさん
2012/10/20(土) 00:15:02.230353デフォルトの名無しさん
2012/10/20(土) 00:31:47.370354デフォルトの名無しさん
2012/10/20(土) 01:11:27.83いつか英語でソースコードやドキュメントを用意しなければならないとき、
hogeでは、わからないだろ
0355デフォルトの名無しさん
2012/10/20(土) 01:20:32.650356デフォルトの名無しさん
2012/10/20(土) 01:23:47.49hogeも翻訳すればいいだろ >>351
0357デフォルトの名無しさん
2012/10/20(土) 02:28:51.060358デフォルトの名無しさん
2012/10/20(土) 09:12:21.20弾幕薄いよ、なにやってんの
0359デフォルトの名無しさん
2012/10/20(土) 15:09:45.88メモ帳から読み込んだ文章を、1つの大きなchar配列に入れ、
改行コードの\r\nの代わりに\0を入れています。
(\r\nだと、繋げた時に1行分の長さをstrlenで計れないので\0を。)
これを、1行描画したらstrlenで長さを取り、間仕切り(\0)の分+1して
次の行を描画する としたいのですが、
strlenで長さは正しく取れるのに、
文字列を取ろうとすると、\0から後ろはおかしな結果になってしまいます。
\0を間仕切りに使うのはかなり不味い事なのでしょうか?
それとも私が何か勘違いしてミスっているのか…。
何かご助言頂けますと幸いです。
0360デフォルトの名無しさん
2012/10/20(土) 15:10:57.180361デフォルトの名無しさん
2012/10/20(土) 15:54:29.330362デフォルトの名無しさん
2012/10/20(土) 18:20:45.76int main () {
printf("%d", max(3,5));
}
$ g++ ./test.cc
とすると./test.cc:6: error: `max' was not declared in this scopeと言われてしまいます。
ぐぐるとg++には標準でmax関数は存在するようなのですが、どうしてなのでしょうか?
お知恵を拝借させてください。
0363デフォルトの名無しさん
2012/10/20(土) 18:33:35.79「標準で用意されている」と「何もインクルードせずに使える」を勘違いしてるんじゃないかと思う。
たぶんalgorithmヘッダ?
0364デフォルトの名無しさん
2012/10/20(土) 18:36:09.55nyarl, yog, fhtagn
0365デフォルトの名無しさん
2012/10/20(土) 19:09:24.92できました!
ありがとうございます。
0366デフォルトの名無しさん
2012/10/20(土) 19:28:13.35以下のプログラムを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]));
}
0367デフォルトの名無しさん
2012/10/20(土) 19:34:51.18> ぐぐるとg++には標準でmax関数は存在するようなのですが、
大嘘。
libstdc++にはあるかもしれないが別物。
0368デフォルトの名無しさん
2012/10/20(土) 19:36:23.10ttp://ideone.com/HjcMvJ
0369デフォルトの名無しさん
2012/10/20(土) 19:57:17.92std::maxなら標準だぞ
0370デフォルトの名無しさん
2012/10/20(土) 20:49:12.6503
> // 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は省略)
0371デフォルトの名無しさん
2012/10/20(土) 21:44:06.60なにそれ
g++の仕様書?
0372デフォルトの名無しさん
2012/10/20(土) 21:48:51.810373デフォルトの名無しさん
2012/10/20(土) 22:01:04.76ありがとうございます!うまく動きます。
template<std::size_t N>
int length(int (&ary)[N])
と書けばNに要素数が入るのですね。
何故そうなるのかわからないです・・・。
int (&ary)[N]とはどういう意味なのでしょうか?
0374デフォルトの名無しさん
2012/10/20(土) 22:27:22.990375デフォルトの名無しさん
2012/10/20(土) 22:44:55.05引数で受け取る時には*を使う物だと思っていました。
何故&なのかよくわからないです。
0376デフォルトの名無しさん
2012/10/20(土) 22:47:50.27MoveWindow(他, widh,height 他,)とするとウインドウ自体のサイズになってしまうのですが
ウインドウの枠のサイズなどを足し引きしないといけないと思うのですがどうすればいいでしょうか?
0377デフォルトの名無しさん
2012/10/20(土) 22:49:14.420378デフォルトの名無しさん
2012/10/20(土) 22:51:18.61func()は最適化されてるのに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を書いておいて呼び出しが終わった後にそれが残ってるか
をチェック)をしました。
どうかよろしくお願いします。
0379デフォルトの名無しさん
2012/10/20(土) 22:53:09.95ttp://qarc.info/qa/show-9865-747.html
0380デフォルトの名無しさん
2012/10/20(土) 23:11:11.86呼び出し側で&hogeではなくhogeでよくなるようでした。
うーん、しかし何故>>366はうまく動かないのでしょうか。
呼び出し元では配列の長さが分かるものの、
関数呼び出し先では配列の長さの情報は消えてしまうのでしょうか?
0381デフォルトの名無しさん
2012/10/20(土) 23:14:56.08bool 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*に渡せればいいのですが、
どういった対応がありますでしょうか。
よろしくお願いします。
0382デフォルトの名無しさん
2012/10/20(土) 23:48:13.56簡単に言うと関数の引数宣言では配列を宣言してもポインタの宣言に変換される
int length(int ary[])
が
int length(int *ary)
になる。
ポインタほもちろんポインタであって配列の長さの情報は含まれない。
0383デフォルトの名無しさん
2012/10/20(土) 23:54:29.79標準C++のmaxを使うなら
#include <cstdio>
#include <algorithm>
int main () {
printf("%d", std::max(3,5));
}
0384デフォルトの名無しさん
2012/10/21(日) 00:04:47.32呼び出し元で使われている、その配列の長さの情報はどこに格納されているのでしょうか?
0385デフォルトの名無しさん
2012/10/21(日) 00:05:46.250386デフォルトの名無しさん
2012/10/21(日) 00:22:31.69Hogeとか使ってるクズには無理
0387デフォルトの名無しさん
2012/10/21(日) 00:31:52.05前に会社で、テストユーザ名にそんなの並んでたわ
こっそり別の神様追加して帰ったけど
0389デフォルトの名無しさん
2012/10/21(日) 03:18:19.410390デフォルトの名無しさん
2012/10/21(日) 03:22:08.040391デフォルトの名無しさん
2012/10/21(日) 03:50:21.59配列が配列として解釈されるのはコンパイル時点までで、
実行時はただのアドレスとして処理される、だったような。
例えば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の括弧は関数の括弧じゃないのよ。これ豆知識ね。
0392デフォルトの名無しさん
2012/10/21(日) 04:20:40.19君に「読みにくく書く」才能を認める
0393デフォルトの名無しさん
2012/10/21(日) 04:39:15.400394デフォルトの名無しさん
2012/10/21(日) 05:01:48.73数少ない正社員プログラマーの一人が
住所入力の都道府県名を格納する文字列変数の
初期値として「hage」を代入するプログラムを書いた。
あとで聞いたら警告を消すためだったそうだ。
そいつは「hoge」と書いたつもりだったらしい。
その後の話は悲惨すぎて省略。
0395デフォルトの名無しさん
2012/10/21(日) 05:43:12.710396デフォルトの名無しさん
2012/10/21(日) 05:47:00.18都道府県が増減するよりも前に
道州制が導入されて住所の書式が変化すると予想されるため
書式ルールもxmlで指定できる仕様とした。
0397デフォルトの名無しさん
2012/10/21(日) 05:49:38.26道州制がきたら県合併の価値がさがるので県が減ることはないな
目先の問題は大阪都構想
0398デフォルトの名無しさん
2012/10/21(日) 05:51:35.12道州制による住所書式変更
合併による都道府県の削減
上から順に優先度が高い
0399デフォルトの名無しさん
2012/10/21(日) 05:53:48.75国ごとの設定で無効化してる
今更やることはない
0400デフォルトの名無しさん
2012/10/21(日) 06:04:51.710401デフォルトの名無しさん
2012/10/21(日) 06:51:15.780402デフォルトの名無しさん
2012/10/21(日) 07:05:01.440403デフォルトの名無しさん
2012/10/21(日) 07:42:17.55やっぱり神様の名前からか……
nyarlがニャル子(ニャルラトホテプ)っぽかったから怪しいと思っていたが
0404366
2012/10/21(日) 08:14:56.26分かりやすかったです。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])'と言われてしまいました。
0405デフォルトの名無しさん
2012/10/21(日) 10:11:55.44> ↑この用法なのかなと思い、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がなければ呼び出し可能な関数がないのでエラー
0406デフォルトの名無しさん
2012/10/21(日) 10:36:31.80あまりいい加減な事は言わないように
単に、配列はポインタを必要とする箇所では
ポインタへと暗黙変換が行われるというだけ
それ以外ではそのような変換は行われない
例えば配列へのポインタを使用する場合やsizeofを使う時など
配列は配列のまま扱われる
int a[10];
int (*p)[10] = &a; // 配列へのポインタ
そしてsizeofは演算子
普通の関数じゃないどころか、関数ですらない
あと、型のサイズを取得する場合は括弧が必須ね
0407デフォルトの名無しさん
2012/10/21(日) 11:37:54.910408デフォルトの名無しさん
2012/10/21(日) 11:57:53.60A 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' に変換できません。
となります。どうすれば良いのでしょうか?
0409デフォルトの名無しさん
2012/10/21(日) 12:03:44.010410デフォルトの名無しさん
2012/10/21(日) 13:09:42.890411デフォルトの名無しさん
2012/10/21(日) 14:57:45.61> A::ThreadFunc' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。
こんなレベルの奴がマルチスレッドとかやるなよ…
0412デフォルトの名無しさん
2012/10/21(日) 15:15:57.900413デフォルトの名無しさん
2012/10/21(日) 15:19:01.68腹痛でトイレがデッドロックですね。分かりま・・・いや、あいつらなら問題ないか。
0414デフォルトの名無しさん
2012/10/21(日) 15:20:07.670415デフォルトの名無しさん
2012/10/21(日) 15:44:15.72つまり、2人が食い続けると2人が飢え死にするわけ。
0416366
2012/10/21(日) 16:46:08.27なっるほどー!例が分かりやすかったです。
int (&x)[3]にint a[4]を代入出来ないというのが味噌ですね。
template<std::size_t N>
int length(int (&ary)[N]) {}
で<>を省いた時に、特にその関連性を示しているわけでも無いのに、
aryの要素数が自動でNに格納されるのが不思議だと思いました。
これはもう慣れの話でしょうか。
0417デフォルトの名無しさん
2012/10/22(月) 09:22:31.19配列もまた宣言の時の要素数と式中の配列の添え字指定とでは異なるものだと理解してよろしいのでしょうか?
つまり、
int sample[10]という配列があって、
sample[0]が最初の要素の添え字指定で、sample[9]が最後の要素になりますよね?
その場合、sample[10]という要素はありませんよね?
ではなぜ、宣言のところの[]と式の[]は同じ[]を使っているのでしょうか?
ポインタの時もそうでしたが、つい混同してしまいます。。。
0418デフォルトの名無しさん
2012/10/22(月) 09:31:16.91そういう約束だから、そういうもんだと諦める
自分で新しく言語を作るつもりなら 吟味してくれい
宣言は 「利用可能な個数」を指示 (10個)
式中のは (ポインタ主体の思考で) 先頭からのオフセット0〜オフセット9
sample[offset] → *(sample + offset)
0419デフォルトの名無しさん
2012/10/22(月) 14:39:00.07http://www.kouno.jp/home/c_faq/c6.html
0420デフォルトの名無しさん
2012/10/22(月) 14:47:24.77質問:std::ifstreamのread関数でstd::stringにファイルの読み出しを行いたい
read関数の第一引数(データの受け取り)にchar*を渡す必要があり、
string型でchar*に相当するものを考えると、むしろそのまま変数を渡すくらいかと思ったのですが、
当然型が違うのでコンパイルが通りません。
当たり前かもしれませんが、強引に&string[0]のように渡しても、コンパイルこそ通れどうまく動きません。
const char*に関してはc_str()関数を使えば問題ないのですが
char*を要求されたときstring型で上手く実現する方法を教えていただきたいです。
0421デフォルトの名無しさん
2012/10/22(月) 14:49:24.29ttp://qarc.info/qa/show-9865-809.html
0422デフォルトの名無しさん
2012/10/22(月) 15:28:51.47グローバル変数をやむなく使うというのは例えばどういう状況でしょうか
自分は結構頻繁に使ってましたorz
0423デフォルトの名無しさん
2012/10/22(月) 15:35:11.94ブロックを抜けたら寿命が尽きても構わない→自動変数
スコープはブロック内で充分→ブロック内静的変数
スコープは関数内で充分→関数内静的変数
スコープは関数外にまで拡げたい→翻訳単位内静的変数
翻訳単位外からは関数経由でアクセスできると言っても納得せず、
どうしても公開せよと迫られる→グローバル変数
0424デフォルトの名無しさん
2012/10/22(月) 15:36:07.51アプリケーション起動時に(設定ファイル等から)確定する定数とか
0425デフォルトの名無しさん
2012/10/22(月) 15:38:54.900426デフォルトの名無しさん
2012/10/22(月) 15:51:19.75{
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;
}
0427デフォルトの名無しさん
2012/10/22(月) 16:28:08.65マルチスレッドのプログラムかなぁ
0428デフォルトの名無しさん
2012/10/22(月) 16:39:44.10むしろマルチスレッド対応で関数になってたりするけど。
0429デフォルトの名無しさん
2012/10/22(月) 17:26:55.06配列の要素数の宣言に変数は使用できませんよね?
gcc(MinGW?)では可能と聞いたのですが、本当ですか?
またそれによって実行ファイルが環境に依存することはありますか?
0430デフォルトの名無しさん
2012/10/22(月) 17:29:38.65どれの事を言ってるのかはっきりしないと答えようがない
0431デフォルトの名無しさん
2012/10/22(月) 17:54:00.33それによって実行ファイルが環境に依存することはありえる
まあそんな処理系知らないけど
0432デフォルトの名無しさん
2012/10/22(月) 23:14:18.88LSI-C試食版でコンパイルできない。
0433デフォルトの名無しさん
2012/10/22(月) 23:16:58.110434デフォルトの名無しさん
2012/10/23(火) 00:30:33.69C99ならどのコンパイラでもいけるがC99非対応のコンパイラじゃ無理
0435デフォルトの名無しさん
2012/10/23(火) 00:38:15.000436デフォルトの名無しさん
2012/10/23(火) 03:10:44.27コピペ元を少しずつ古いスレにしてるのが笑える
0437デフォルトの名無しさん
2012/10/23(火) 09:20:43.080438デフォルトの名無しさん
2012/10/23(火) 10:42:13.71今時そんな骨董品を使う方がどうかしている。
0439デフォルトの名無しさん
2012/10/23(火) 11:11:56.070440デフォルトの名無しさん
2012/10/23(火) 23:10:58.59cppがデファクトスタンダードだと思うんだがgoogleのスタイルガイドだとccだた
0441デフォルトの名無しさん
2012/10/23(火) 23:27:17.32C with Classes の名残とかだったらいい加減やめようや
0442デフォルトの名無しさん
2012/10/23(火) 23:29:41.300443デフォルトの名無しさん
2012/10/23(火) 23:33:12.36cxx
0444デフォルトの名無しさん
2012/10/23(火) 23:34:32.70.c
.h
C++の拡張子は、いろいろある。
.C
.c++
.cc
.cp
.cpp
.CPP
.cxx
.h
.h++
.hh
.hp
.hpp
.hxx
0445デフォルトの名無しさん
2012/10/23(火) 23:35:19.51cppはどうしても、プリプロセッサを想像してしまうんだよな。
0446デフォルトの名無しさん
2012/10/23(火) 23:37:19.56>>444
大杉ワロタw
0447デフォルトの名無しさん
2012/10/24(水) 00:10:38.800448デフォルトの名無しさん
2012/10/24(水) 10:10:10.45#include とか #if とかのプリプロセス処理の展開を済ませた中間ファイル的だね って意図じゃない?
0449デフォルトの名無しさん
2012/10/25(木) 23:42:52.63かなり初歩的な質問ですまん
0450デフォルトの名無しさん
2012/10/25(木) 23:59:28.40プリコンパイルヘッダファイルが使えるなら
そっちでincludeした方がいい
使えないならそのヘッダファイルに書いた方がいい
そのヘッダファイルでincludeしてる別のヘッダファイル内でたまたまincludeされていて
そのヘッダファイルでstringをincludeしなくてもコンパイルが通る事もあるけど、
その別のヘッダファイルの内容が変更される可能性を考えると
自分でincludeした方が無難
(その別のヘッダファイルというのが標準ヘッダファイルであっても、
コンパイラを変更したらコンパイル通らなくなったとかよくある事)
0451デフォルトの名無しさん
2012/10/26(金) 00:01:40.77ありがとうございます
0452デフォルトの名無しさん
2012/10/26(金) 00:30:54.93無理に自分でインクルードする必要は無いと思われ
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]の色になってしまいます
解決方法がありましたら教えてください
0454デフォルトの名無しさん
2012/10/26(金) 10:38:30.81ありがとうございます
それはWriteConsoleOutputのワイド文字版みたいですね
AsciiCharに入力すると、XPでは別の半角文字に変わり、
UnicodeCharに入力すると、XPでは全角+半角の3文字分表示され、
98ではどちらに入力しても表示されませんでした
0456デフォルトの名無しさん
2012/10/26(金) 14:02:32.55なんでそんなの使ってんの?
XPメインで98はテストですね
コンソールゲームは古い技術だと思うので、
古いマシンでも同じように動いて欲しくてテストしています
0458デフォルトの名無しさん
2012/10/26(金) 18:46:38.87// 例
ofstream ofs("test.txt");
if (ofs.fail()) {
ofs.close(); // ←これ
}
0459デフォルトの名無しさん
2012/10/26(金) 20:07:24.70ttp://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/game1/m100.html
まずはこの辺のサンプルが手持ちの98環境で動くか確認してみたら?
0461デフォルトの名無しさん
2012/10/27(土) 01:36:09.35開いてないものを閉じることが出来ると思ってるのか?
まあ開いてないファイルストリームを閉じようとしても失敗するだけなんで別にいいけど
0462デフォルトの名無しさん
2012/10/27(土) 03:13:53.30その例だと>>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とコンパイラのマニュアルで確認してくれ
0463デフォルトの名無しさん
2012/10/27(土) 03:56:13.180464デフォルトの名無しさん
2012/10/27(土) 06:57:40.950466デフォルトの名無しさん
2012/10/27(土) 07:20:03.080467デフォルトの名無しさん
2012/10/27(土) 15:48:05.69純粋仮想関数を再定義する時、子クラスにもvirtualキーワードをつけないとダメ?
class sub:public super{
public:
void func();//←??
virtual void func();//←??
};
0468デフォルトの名無しさん
2012/10/27(土) 15:53:30.200469デフォルトの名無しさん
2012/10/27(土) 16:06:05.980470デフォルトの名無しさん
2012/10/27(土) 16:20:39.97あらかじめ基底クラスになるかどうかも判らないクラスに
あらかじめ virtual 書いておかなければならないとか
C++ の最大の欠陥
0471デフォルトの名無しさん
2012/10/27(土) 16:46:49.470472デフォルトの名無しさん
2012/10/27(土) 17:31:54.490473デフォルトの名無しさん
2012/10/27(土) 17:45:24.76現在64bit メモリ4Gの環境でプログラムを組んでいます。
動的に大容量のメモリを確保する場合、32bitのOSでは2Gが最大との記述を読みましたが、64bitでは最大確保容量=物理メモリと考えてよいのでしょうか?
また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?
0474デフォルトの名無しさん
2012/10/27(土) 17:57:49.610475デフォルトの名無しさん
2012/10/27(土) 17:58:27.66> また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?
静的に確保した変数はスタックに取られるわけじゃないぞ。
0476デフォルトの名無しさん
2012/10/27(土) 18:14:35.49で、全ての関数に virtual がついている言語には欠陥がないとでも言うのか
おまえ自分で考える頭がないのをどこに転嫁しても笑われるだけなのを認識しろよ
0477デフォルトの名無しさん
2012/10/27(土) 18:36:54.14ご指摘ありがとうございます。
静的な確保の場合は静的領域ですね。
0478デフォルトの名無しさん
2012/10/27(土) 18:56:50.16おまえ今日は何グラム入れてるの?
0479デフォルトの名無しさん
2012/10/27(土) 19:34:32.45スタックに取られるのはC系の場合自動変数。
基本的に自動変数であまり大きな領域を取ってはいけない。
Windows APIを使ってメモリ確保した場合は仮想メモリから
取られるので、実メモリ+仮想記憶が許す範囲で取れる。
いろいろ勘違いしてるので基本の学習が先だな。
0480デフォルトの名無しさん
2012/10/27(土) 19:48:16.98むしろCで「処理系依存」を毛嫌いしすぎるのが
そういう系の習得を邪魔しているだけなんだが
0481デフォルトの名無しさん
2012/10/27(土) 20:25:45.28> いろいろ勘違いしてるので基本の学習が先だな。
お前がな。
0482デフォルトの名無しさん
2012/10/27(土) 20:57:46.660483デフォルトの名無しさん
2012/10/27(土) 21:14:11.82仮想メモリーをごっちゃにしてて、偉そうに何言ってるんだ?
って話だろ。
あと、組み込みとかで仮想記憶使わないシステムなんていくら
でもあるよ。
0484デフォルトの名無しさん
2012/10/27(土) 21:19:49.94仮想メモリの話は当然出てくるだろう
0485デフォルトの名無しさん
2012/10/28(日) 08:55:18.71ボタンを押すとひとファイルずつキー操作する
みたいなことやりたいんだがヒントくれ。
0486デフォルトの名無しさん
2012/10/28(日) 09:12:26.01int main()
{
char *s;
s = "Pointers are fun to use.\n"
cout << s;
return 0;
?
というサンプルコードなんですが、なぜポインタ変数に文字列定数を
代入できるんでしょうか?
また、試しにcout <<*sとしてみると先頭の一文字(P)だけ表示されるのですが、なぜなのでしょうか?
0487デフォルトの名無しさん
2012/10/28(日) 09:38:02.980488デフォルトの名無しさん
2012/10/28(日) 10:01:56.56だからその動作は正しい。
cout << s
なら文字列が表示されるはず。
0489デフォルトの名無しさん
2012/10/28(日) 10:05:15.79"Pointers are fun to use.\n"
これはコンパイラが暗黙のうちにメモリのどこかの領域に
文字列を定義しているということ。
s = "Pointers are fun to use.\n"
は、コンパイラが定義した文字列領域の先頭アドレスを
ポインタ変数に代入しているということ。
だから *s つまりポインタの実体(の先頭)を表示すると
Pが表示される。
アドレスから文字列全体を表示する(cout << s)の場合は
文字列全体が表示される。
0490デフォルトの名無しさん
2012/10/28(日) 10:10:40.86ttp://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");
}
っておかしいですよね?
0491デフォルトの名無しさん
2012/10/28(日) 10:14:01.72日本語レベルからやり直したほうがいいぞ。
0492デフォルトの名無しさん
2012/10/28(日) 10:15:17.41int 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;
}
0493デフォルトの名無しさん
2012/10/28(日) 10:16:27.61trueかfalseか確認してるだけだからおかしくはない。
コードにセンスないとは感じるが。
0494デフォルトの名無しさん
2012/10/28(日) 10:18:29.920495デフォルトの名無しさん
2012/10/28(日) 10:29:25.76ポインタの比較は同一の配列か同一の文字列内でしか出来ない
0496デフォルトの名無しさん
2012/10/28(日) 10:33:35.40#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;
}
0497デフォルトの名無しさん
2012/10/28(日) 10:38:20.86だったらNULLとの比較もできないことになるが
0498デフォルトの名無しさん
2012/10/28(日) 10:42:09.72stringの使い方からするとおかしいが、比較そのものは合法。
論点はどっちだ?
0499デフォルトの名無しさん
2012/10/28(日) 10:47:13.45ポインタが同じところ差してるからと言って
中身が同じとは限らないのが問題なんだろ
0500デフォルトの名無しさん
2012/10/28(日) 10:52:38.59> ポインタの比較は同一の配列か同一の文字列内でしか出来ない
大小比較は出来ない (と言うか意味ない) けど、一致比較は出来ると思うぞ。
0501デフォルトの名無しさん
2012/10/28(日) 10:59:49.58位置の前後は意味あるんじゃない?
差分もとれるし。
意味ないのは和の方。
0502デフォルトの名無しさん
2012/10/28(日) 11:18:42.69char *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"か区別つくよ */
0503デフォルトの名無しさん
2012/10/28(日) 11:18:57.500504デフォルトの名無しさん
2012/10/28(日) 11:20:27.12> 位置の前後は意味あるんじゃない?
> 差分もとれるし。
だからそれが意味を持つのは、「同一の配列か同一の文字列内」の場合だけでしょ。
0505デフォルトの名無しさん
2012/10/28(日) 11:31:08.31それが意味を持つかどうかは、要件次第
0506デフォルトの名無しさん
2012/10/28(日) 11:38:23.13> 別に任意のポインタを比較したっていい
規格上は「ダウト」じゃなかったっけ?
0508デフォルトの名無しさん
2012/10/28(日) 13:41:31.85p == NULL
とか
p == q
とか
また「任意じゃない」とか言い出すんだろうな
0509486
2012/10/28(日) 14:04:45.39ところで、なぜポインタ変数に文字列を代入できるんでしょうか?
普通は、アドレス(数値)を代入するのではないでしょうか?
そういう仕様だということで納得するしかないのでしょうか?
0510デフォルトの名無しさん
2012/10/28(日) 14:22:24.890511デフォルトの名無しさん
2012/10/28(日) 14:24:53.16> p == q
p, q が near ポインタだと p == q でも、違うところを指してるケースがあるとか、
なかったっけ?
0513デフォルトの名無しさん
2012/10/28(日) 14:38:49.02&sだとポインタ変数のアドレスになっちまう
0514デフォルトの名無しさん
2012/10/28(日) 14:59:08.72初心者本買って勉強しろ。
そして死ね。
0516デフォルトの名無しさん
2012/10/28(日) 15:01:39.18std::cout << static_cast<void*>(s) << std::endl;
こういうことか?
0517デフォルトの名無しさん
2012/10/28(日) 15:06:04.80初心者なのでまだその式の意味がわかりません。
難しい話のようなのでもうちょっと勉強してきます。
0518デフォルトの名無しさん
2012/10/28(日) 15:20:17.650519デフォルトの名無しさん
2012/10/28(日) 15:25:05.040520デフォルトの名無しさん
2012/10/28(日) 15:40:15.95代入は配列とポインタの関係みたいなもんだな
int a[] = { 1, 2, 3, 4, 0 };
int *p = a;
/* 0 が終端である約束を元に表示する */
while (*p) { printf("%d", *p); p++; }
0521デフォルトの名無しさん
2012/10/28(日) 16:15:24.47多分コンパイル結果が一定長の命令になるから。
●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個で渡した方がよくね?ってこと。
0522デフォルトの名無しさん
2012/10/28(日) 18:43:25.86ジェネレートされた命令列は関係ない
0523デフォルトの名無しさん
2012/10/28(日) 20:56:54.27紙にメモリと変数領域を自分で書きながら勉強するといいかも。
0524デフォルトの名無しさん
2012/10/29(月) 12:33:01.67馬鹿でないなら紙に書かなくても理解できる。
紙に書いて理解できたと思っているのは、実は理解できていない馬鹿か、
無駄なことをしていることに気付いていないだけ。
0525デフォルトの名無しさん
2012/10/29(月) 13:44:07.470526デフォルトの名無しさん
2012/10/29(月) 14:19:55.30論を語る基地害ってどこから湧いてくるんだろうな
0527デフォルトの名無しさん
2012/10/29(月) 14:22:50.07他人が自分とは違うという事実が受け入れられない人です。自分の意見が通らないとコピペや荒らしなど
無茶をし始めるので見かけたら放置してください。
・根拠もなく、他人を卑下したり、差別したりする人、自分で自分を褒める人
他人を卑下することで自分を慰めようとする人です。実生活で他人に褒めてもらう機会がないが
プライドだけは高いとか、匿名の掲示板しか話し相手のいない人です。可哀想なので放置してください。
・自分の感情だけ書く人
「〜〜がムカツク」とか自分の感情を掲示板に書くことに意味があると思っている人です。
何がどのようにムカツクのか論理的に書いてあれば、他人が読んでも意味のある文章になりますが、
そういった論理的思考の出来ない人です。もうちょっと賢くなるまでは放置してあげてください。
0528デフォルトの名無しさん
2012/10/29(月) 18:15:44.150529デフォルトの名無しさん
2012/10/29(月) 19:50:36.07○他人を蔑視したり
自分を卑下します
0530デフォルトの名無しさん
2012/10/31(水) 09:15:54.270531デフォルトの名無しさん
2012/10/31(水) 09:19:14.220532デフォルトの名無しさん
2012/10/31(水) 20:03:31.800533デフォルトの名無しさん
2012/11/01(木) 08:23:34.87IHoge<T>を暗黙にIHoge<U>に変換可能にするような書き方ってできますか?
0534デフォルトの名無しさん
2012/11/01(木) 09:06:41.82T m;
template <class U> IHoge& operator = (const IHoge<U>& r) {
m = r.m;
return *this;
}
};
0535デフォルトの名無しさん
2012/11/01(木) 09:43:32.82T & 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());
↑みたいな感じにしたいです
0536デフォルトの名無しさん
2012/11/01(木) 13:04:53.20禁止!
0537デフォルトの名無しさん
2012/11/01(木) 13:08:21.66struct 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; }
};
0538デフォルトの名無しさん
2012/11/01(木) 13:10:32.31TとUは一般的なクラスなんで特殊化だけでは対応し切れません
0539デフォルトの名無しさん
2012/11/01(木) 18:55:51.58ヌルとかがあるとまずいかなと思って今まで
vector<char>でやってました。
0540デフォルトの名無しさん
2012/11/01(木) 19:22:05.22後者が正解
0541デフォルトの名無しさん
2012/11/01(木) 21:50:05.73const char* p
だと
*p = 0;
これはダメで
p = "hoge";
これは可能
つまりポインタ先の変更は不可能だが、ポインタ自体は変更可能
では
const char** h;
だと・・・?
char*を一つの型として考えて
*hが変更不可能だと思ったのですが実際は
*hに代入ができました
どう考えるべきですか?
0542デフォルトの名無しさん
2012/11/01(木) 21:55:42.300543デフォルトの名無しさん
2012/11/01(木) 22:42:09.13後ろに書けば明快でよろしい
0544デフォルトの名無しさん
2012/11/01(木) 22:47:17.990545デフォルトの名無しさん
2012/11/01(木) 22:48:22.55>>542 >>543によると
const char **h;
は char const **h と考えるのがいいとのこと。
http://codepad.org/yAJmxtgd
0547デフォルトの名無しさん
2012/11/01(木) 23:23:58.14何か自分が単純な思い落としをしていたのかと思ってたのですが
意外に根が深そうですね
もうちょっと自分で整理つけてみます
0548デフォルトの名無しさん
2012/11/02(金) 02:05:15.461. 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
・参照外しした場合は右から一つずつ『へのポインタ型の変数・定数』を外していく
0549デフォルトの名無しさん
2012/11/02(金) 02:06:50.30const 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型の変数』だから変更できる
0550デフォルトの名無しさん
2012/11/02(金) 04:26:23.28エキスパートCプログラミングという本を読むといい。
そのへんのことが詳しく書いてある。
0551デフォルトの名無しさん
2012/11/03(土) 02:42:50.43自分で実装しようと思ったけど、"とか改行とか考えるとめんどくさくなった
0552デフォルトの名無しさん
2012/11/03(土) 02:51:43.530553デフォルトの名無しさん
2012/11/03(土) 02:55:06.200554デフォルトの名無しさん
2012/11/03(土) 03:00:37.390555デフォルトの名無しさん
2012/11/03(土) 03:37:04.360556デフォルトの名無しさん
2012/11/03(土) 07:39:08.980557デフォルトの名無しさん
2012/11/03(土) 09:27:12.490558デフォルトの名無しさん
2012/11/03(土) 09:46:47.58で、""でくくられると、くくられた文字列ないには大抵改行が入ってるのな
0559デフォルトの名無しさん
2012/11/03(土) 09:50:17.72とかも考慮したりするとめんどいな
0560デフォルトの名無しさん
2012/11/03(土) 09:59:54.47死ね
0561デフォルトの名無しさん
2012/11/03(土) 11:01:17.320562デフォルトの名無しさん
2012/11/03(土) 11:05:58.89pqr"
なんてのも扱えないといけないよ
0563デフォルトの名無しさん
2012/11/03(土) 11:12:03.16これは無理なのでは。
""で囲まれたセンテンスの中にさらに " があった場合、これが終わりをしめすのか更なる""センテンスを示すのかはどうやって決定すればいい?
人間はどう解釈している?
0565デフォルトの名無しさん
2012/11/03(土) 11:31:03.59書けなかったらその構文では無理って事だ
0566デフォルトの名無しさん
2012/11/03(土) 11:34:32.510567デフォルトの名無しさん
2012/11/03(土) 15:57:05.271文字先読みするだけだろ
0568デフォルトの名無しさん
2012/11/03(土) 16:02:19.56期待するパース結果も書いてくれ
0569デフォルトの名無しさん
2012/11/03(土) 16:09:28.70"def , \" , ghi"
"jkl"
"mno\npqr"
だろ
0570デフォルトの名無しさん
2012/11/03(土) 16:34:24.87ごめん
いまいちルールが理解できないわ
カンマとダブルクォーテーションは、どちらが優先的に解析されるのだ?
0571デフォルトの名無しさん
2012/11/03(土) 18:37:29.40何の為に書くんだよw
0572デフォルトの名無しさん
2012/11/03(土) 20:06:41.180573デフォルトの名無しさん
2012/11/03(土) 20:35:21.85,x"x,x"x, と来たらどうするのかとか
改行までを読み込んだり特定文字列で分割して配列に詰め込むことが
サポートされてる言語使い程度には扱えないよねw
0574デフォルトの名無しさん
2012/11/03(土) 20:58:46.76256倍本もまた販売してほしくなった
0575デフォルトの名無しさん
2012/11/03(土) 21:14:14.170576デフォルトの名無しさん
2012/11/03(土) 21:21:27.370577デフォルトの名無しさん
2012/11/03(土) 22:32:53.28abc,d"e
とか
abc,"d"e
みたいなのはパーズエラーで、どうにでもすればよろし
0578デフォルトの名無しさん
2012/11/03(土) 22:47:27.31濁りません
0579デフォルトの名無しさん
2012/11/03(土) 22:48:22.330580デフォルトの名無しさん
2012/11/03(土) 22:49:56.460581デフォルトの名無しさん
2012/11/03(土) 23:49:29.58> Excelを標準にするのが妥当でしょ
その使用ってどっかにあるのか?
って話だと思うが。
正式な奴があるなら、俺も欲しい。
0582デフォルトの名無しさん
2012/11/03(土) 23:59:35.95boost.spiritで
ttp://codepad.org/GBr4mdKx
0583557
2012/11/04(日) 00:31:19.91あれって行単位で扱うもんじゃないの?
>>559
俺のやり方だと「a,"b1」と「b2",c」に分かれるんだが、駄目なん?
(文字列内に,があったら""で囲む。"があったらエスケープする的な)
でも>>577のようなパターンもあるのか……
デファクトスタンダード的にはExcelに合わせるべきなんだろうが、嫌な話だな
0584デフォルトの名無しさん
2012/11/04(日) 00:48:33.65> あれって行単位で扱うもんじゃないの?
たいていの人はそう思うと思うんだけど、デファクトの Excel が改行を入れてくるから。
0585デフォルトの名無しさん
2012/11/04(日) 02:59:40.94ExcelはAlt+Enterでセル内に改行を入れられることを
知らないことが多くない?w
0586デフォルトの名無しさん
2012/11/04(日) 03:02:21.43その後でCSVを1行ずつ読み取って解析しようと考える奴についてそのことを知らないかどうかの統計をとれ
結果に有意な差が出たらお前のことを認めてやる
0587デフォルトの名無しさん
2012/11/04(日) 03:05:25.780589デフォルトの名無しさん
2012/11/04(日) 09:31:44.41LPCTSTR lpAppName, // セクション名
LPCTSTR lpKeyName, // キー名
LPCTSTR lpDefault, // 既定の文字列
LPTSTR lpReturnedString, // 情報が格納されるバッファ
DWORD nSize, // 情報バッファのサイズ
LPCTSTR lpFileName // .ini ファイルの名前
な感じの奴なんですけど、この
>LPTSTR lpReturnedString, // 情報が格納されるバッファ
というのをstd::stringで受け取りたいんですけど、どうしたらいいですか?
0590デフォルトの名無しさん
2012/11/04(日) 09:48:39.56cpp11なら&str[0]を引数に渡す
そうじゃないならテンポラリバッファを渡す
0591デフォルトの名無しさん
2012/11/04(日) 09:54:29.27void func(std::string s) {}
int main()
{
LPTSTR lpReturnedString;
func(lpReturnedString);
}
0592デフォルトの名無しさん
2012/11/04(日) 10:13:02.73cppのバージョンがよくわからないです。。
vs2010だとテンポラリバッファのほうを使うしかないですか?
またテンポラリバッファってvectorでもいいんでしょうか?
文字列の長さが決まってないんですが、予め255文字文newするというのはできるだけしたくないです。
連投ですいません。
0593デフォルトの名無しさん
2012/11/04(日) 10:13:31.361行をCRLFまでと考えれば
セル内の改行はLFのみだから
正しく処理出来るんだけどなぁ
0594デフォルトの名無しさん
2012/11/04(日) 10:16:47.47じゃあお前ならどうやる?
何行読む必要あるかは、中身解析しないとわからないから、
一行ずつ読み込んで解析して、継続行の読み込みが必要か
を見ていくのが普通だと思うが。
0595デフォルトの名無しさん
2012/11/04(日) 10:17:41.79vector でも構わないけど
>予め255文字文newする
これと同じことは必要
0596デフォルトの名無しさん
2012/11/04(日) 10:19:16.68>593
0597デフォルトの名無しさん
2012/11/04(日) 10:49:21.04ありがとうございます
&str[0]はやめて一時変数と割りきって余分に確保します・・
0598デフォルトの名無しさん
2012/11/04(日) 10:59:15.33ジジイが執筆した時代に逆行したクソみたいな参考書がヒープ確保は高コストだから控えようみたいな脅しかけるからかな
0599デフォルトの名無しさん
2012/11/04(日) 11:11:23.320600デフォルトの名無しさん
2012/11/04(日) 11:15:58.75だからもうそういう時代じゃないし
0601デフォルトの名無しさん
2012/11/04(日) 12:24:05.010602デフォルトの名無しさん
2012/11/04(日) 13:25:11.21おまえが時代から置いてかれただけ
0603デフォルトの名無しさん
2012/11/04(日) 13:57:20.04厳密にやりたいならリトライ機能を作り込むしかないよ
サイズはこちらからAPIに教えてあげるんだし、確か書き込まれたサイズも取れたよね?
やってみてダメなら大きいサイズを確保してリトライするって感じね
0604デフォルトの名無しさん
2012/11/06(火) 10:59:19.43ゲームを作っていて、戦闘、移動などをシーンクラスで実装しようとしています。
メインループ内において、シーンを遷移するかの判定を行っており、遷移判定が真ならシーンオブジェクトを破棄して、
遷移後のシーンオブジェクトを生成します。
現在、
ダンジョン内の移動シーン→敵に遭遇→戦闘シーンへ遷移→戦闘に勝利→ダンジョン内の移動シーンに遷移
を実装しようとしています。
しかし、遷移後の移動シーンにダンジョン内の位置情報を渡す方法が判らず、戦闘が終わると毎回ダンジョンの入り口に
戻ってしまいます。
そこで質問です。
クラスのコンストラクタに何かデータを渡して、データメンバを初期化する方法はありますでしょうか?
0605デフォルトの名無しさん
2012/11/06(火) 11:18:49.700606デフォルトの名無しさん
2012/11/06(火) 11:33:05.92ゲーム製作技術@2ch掲示板
http://toro.2ch.net/gamedev/
0607デフォルトの名無しさん
2012/11/06(火) 11:52:47.95typedef 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}; のように効率的に書く方法はありますか?
0608デフォルトの名無しさん
2012/11/06(火) 11:55:14.180609デフォルトの名無しさん
2012/11/06(火) 11:57:17.69>コンストラクタは書かずに、
の理由が、
構造体の定義があるのが他人の書いたヘッダなので、勝手に書き換えられないんです。
0610デフォルトの名無しさん
2012/11/06(火) 12:03:43.090611デフォルトの名無しさん
2012/11/06(火) 12:31:29.83_def(int x, int y, int z) { a = x, b = y, c = z; }
} def;
abc x = {1, 2, 3};
x = def(4, 5, 6);
0612デフォルトの名無しさん
2012/11/06(火) 20:41:35.51プログラムを書きまくれ!とおっしゃる方がいらっしゃいますが、
どのようなプログラムをどのような思考法で書いたのか教えていただけるとありがたいです。
0613デフォルトの名無しさん
2012/11/06(火) 20:47:25.56個人的にはC++の勉強をする前にJavaとデザインパターンの
勉強をすすめる。
0614デフォルトの名無しさん
2012/11/06(火) 20:51:57.650615デフォルトの名無しさん
2012/11/06(火) 20:56:27.63・暴走しにくい
・多重継承が禁止されている(多重継承はC++で学べばよい)
・C++のような無理やりCを拡張した形ではないので構造がシンプル
もちろん欠点もあるけどね。
0616デフォルトの名無しさん
2012/11/06(火) 20:59:56.680617デフォルトの名無しさん
2012/11/06(火) 21:50:51.990618デフォルトの名無しさん
2012/11/06(火) 21:53:09.870619デフォルトの名無しさん
2012/11/06(火) 22:11:52.84マスターしてるか不明だが、仕事でC++書いているので俺の方法を書いてみる。
C言語のプログラムは脱初心者レベル(宿題スレの問題がサクっと解ける)を前提として、
C++の薄い本をなんでもいいから1週間くらいで一冊読む。厚い本は避ける。
この時点で、中身を完全に覚えようとは思わない。こんな風に書くんだ程度の認識でOK。
次にC++で書かれた動くコードを実際に読んでみる。仕事で使うコードならそれでOK。
仕事で使ってないけど勉強のためならCppUnitのコードがおすすめ。
コードを眺めながら、player::setnameの::って何だ?とか、コンストラクタって何だっけ?、インスタンスって何?とか、
class kodomo : public oyaji, public ofukuro {... の : って何やってんだ?とか疑問が出たら随時調べていく。
本で分からなければWebで調べる。それでもって、似たようなコードを自分で書いてみる。
次にオブジェクト指向の第一歩として、それぞれのクラスが他のクラスとどういうやり取りをしているか把握する。
絵に書いたり、文字にしたり。いまいちつかめないなら、なんでも良いので自分でコードを書いてみる。
例えば、お店に行って何か物を買うというプログラムを書いてみる。人がいて、俺がいて、店員がいて、
物を選ぶ、お金を払うという動作が俺にはできる。店員はお釣りを渡すという動作ができる。などなど。
慣れてきたらコードを読む。眺めるのではなくて読む。このクラスは何をしているのか。
他のクラスとどういうやり取りをしているのか。 これを続けていくとコード全体が見えてくる。
時間はかかるけど、俺はこんな風に手間暇かけてやっていった。
コードを書いてて、どんなコードを書くときも似たような方法で書くなと感じたらデザインパターンを見る。
C++書いてるけど、効率悪いなと感じたら、Effective C++を読む。
一応、これだけできたら普通のプログラマレベルにはなってると思う。
0620デフォルトの名無しさん
2012/11/06(火) 22:17:07.99C含めておすすめのC++の本教えてくれ。
0621デフォルトの名無しさん
2012/11/06(火) 22:19:51.16三行でおk
0622デフォルトの名無しさん
2012/11/06(火) 22:56:05.57エキスパートCプログラミングはすべてのC初学者に読んでほしい。
0623デフォルトの名無しさん
2012/11/06(火) 23:00:40.930624デフォルトの名無しさん
2012/11/06(火) 23:02:40.140625デフォルトの名無しさん
2012/11/06(火) 23:47:42.66C++の薄い本をなんでもいいから眺めながら、
かいてみたら、なにやってんだ?とか疑問が出た
0626デフォルトの名無しさん
2012/11/07(水) 00:00:15.45端々で知識が怪しくなるぞ
0627デフォルトの名無しさん
2012/11/07(水) 08:13:42.94では読んだ本だけ。アーキテクトさん、学者さんが見たらなめんなと思われるかもしれないが。
後は実コードを見ながらにらめっこ。
C:
C実践プログラミング 第3版
C言語ポインタ完全制覇
定本 Cプログラマのためのアルゴリズムとデータ構造
C++:
C++実践プログラミング 第2版
C++クラスと継承完全制覇
オブジェクト指向における再利用のためのデザインパターン
Effective C++ 第3版
その他:
オブジェクト指向における再利用のためのデザインパターン
プログラミング作法
珠玉のプログラミング
>>621
C++どう動いてるか理解して
自分でコード読んで書いて
めげずに頑張れ
0628デフォルトの名無しさん
2012/11/07(水) 09:40:57.52型が違うのに代入出来るんですね。
すげー
0629デフォルトの名無しさん
2012/11/07(水) 21:53:10.07テンポラリバッファを用意したほうが速いのかGetメソッドを使って毎回呼び出したほうが速いのか
どっちのほうが速いんでしょうか?
勿論、最初の方はGetのほうが速いんでしょうけど、どれくらいから逆転するか・・・
0630デフォルトの名無しさん
2012/11/07(水) 21:55:49.450631デフォルトの名無しさん
2012/11/07(水) 21:55:57.20ポインタやSTLのイテレータとか使えれば新卒ならどや顔できるよね?(´・ω・`)
0632デフォルトの名無しさん
2012/11/07(水) 21:57:45.58終わり
0633デフォルトの名無しさん
2012/11/07(水) 22:00:48.03printf("%d",GetNum());
を100回繰り返したのと
int i = GetNum();
としておいて
printf("%d",i);
を100回繰り返したのではどっちが速いのかなーと、
予想では最初は前者が早くてあとから後者のコードが追いつくって思うんだけど、どれくらいで逆転するのか
0634デフォルトの名無しさん
2012/11/07(水) 22:01:34.46だれかもうしてるなら見たい
0635デフォルトの名無しさん
2012/11/07(水) 22:03:07.74GetNum()とやらの実装はわからんが、関数なら、2回目から後者が速い。
0636デフォルトの名無しさん
2012/11/07(水) 23:03:50.20get以外にありますか?
int CSample::get()
{
return m_num;
}
0637デフォルトの名無しさん
2012/11/07(水) 23:04:43.98{
return m_num;
}
0638デフォルトの名無しさん
2012/11/07(水) 23:05:00.540639636
2012/11/07(水) 23:40:53.850640デフォルトの名無しさん
2012/11/07(水) 23:46:17.870641デフォルトの名無しさん
2012/11/08(木) 00:58:02.790642デフォルトの名無しさん
2012/11/08(木) 10:47:38.75swtich(){
case 0:
...
case default:
break;
}
0643デフォルトの名無しさん
2012/11/08(木) 10:50:46.86オブザーバーパターンが便利だよ
0644デフォルトの名無しさん
2012/11/08(木) 12:30:32.25union{
int m_num;
const int num;
};
};
class CSample : CSampleBase{
public:
using CSampleBase::num;
};
VC以外でできるのか知らんけど。
0645デフォルトの名無しさん
2012/11/09(金) 01:30:25.11CSVリーダ作ってて発見したんだが、エクセルノセルにテキストエディタでコピーした
内容をペーストすると、任意の改行コードを混在させられる。
""でくくられるからいいんだけど、解析側が知らないとえらいことになるよ。
0646デフォルトの名無しさん
2012/11/09(金) 12:53:46.27たとえば、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}としたいと思っているので、気になっています。
0647デフォルトの名無しさん
2012/11/09(金) 12:57:30.99この演算はプログラムの中で最も多く(億単位で)呼び出されるものなので少しでも時間を削りたいと思っています。
0648デフォルトの名無しさん
2012/11/09(金) 13:05:03.42それ環境依存だね
バレルシフタを使用しているハードウェアならほとんど差はない
0649デフォルトの名無しさん
2012/11/09(金) 13:06:34.11効果が大きいんじゃね
CALL/RETによるパイプラインバブルの発生はコストが大きいぞ
頭の良いCPUなら投機実行してくれるけど
0650デフォルトの名無しさん
2012/11/09(金) 13:10:54.69馬鹿にならない
0651デフォルトの名無しさん
2012/11/09(金) 13:21:53.63staic const int arr[] = {0, 4, 8, 12, 16, };
x >>= arr[i];
なら
x >>= (i * 4);
とした方が最適化されやすい。
0652デフォルトの名無しさん
2012/11/09(金) 13:28:54.42>>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()を使っているのですが、どうも実行するごとにコンマ数秒程度は値がずれたりしてていまいち信用できず面倒に感じてしまっています。
0653デフォルトの名無しさん
2012/11/09(金) 13:29:24.48なるほど。勉強になります
0654デフォルトの名無しさん
2012/11/09(金) 13:39:07.67rdtscを使って、かつそれほどループ回数を多くしなければ、
大抵は比較的ぶれの少ない数値になるはず。
0655デフォルトの名無しさん
2012/11/09(金) 13:39:59.34>どうも実行するごとにコンマ数秒程度は値がずれたりして
え!?あたりまえじゃん
0656デフォルトの名無しさん
2012/11/09(金) 13:50:28.890657デフォルトの名無しさん
2012/11/09(金) 13:54:17.26ただし、REALTIME_PRIORITY_CLASSを指定するとデバイスドライバまでロックされて
もしプログラムが停止しない場合リセットするしか方法がなくなるんで注意
HIGH_PRIORITY_CLASSあたりがいいかも
0658デフォルトの名無しさん
2012/11/09(金) 14:10:54.92自分の計測は随分といい加減なやり方だったようです。
HIGH_PRIORITY_CLASSにしてrdtsc (intrin.h) 使うなどしてみます。
0659デフォルトの名無しさん
2012/11/09(金) 14:45:30.36OSのAPIには結構美味しい物が揃っている
0660デフォルトの名無しさん
2012/11/09(金) 15:11:32.740661デフォルトの名無しさん
2012/11/09(金) 15:43:42.83RDTSCが一番確実だけど
0662デフォルトの名無しさん
2012/11/09(金) 20:12:41.36演算そのものは実行されるだろう。
結果が変わるかどうかは演算には関係のない話。
0663デフォルトの名無しさん
2012/11/09(金) 20:14:50.63時間掛かるような気がするが
最近のCPUはそうでもないのか
0664デフォルトの名無しさん
2012/11/09(金) 20:35:38.53http://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を分離する意義は
何に見出せるのでしょうか??
0665デフォルトの名無しさん
2012/11/09(金) 20:38:56.56おまえは質問の意味がわかってない。
>>648で答えが出てるから、そもそもレス自体無意味だし。
0666デフォルトの名無しさん
2012/11/09(金) 21:35:52.62モジュール分割すること自体の意義と、それをMVCに分類することの意義をごっちゃにしている。
モジュール分割を行うにあたって、MVCそれぞれの役割に分類することで結合度を比較的
低く抑えられるという、多分に経験則的な設計指針であって、ダイアグラムだけ見てそれが
良いか悪いかと言えるような性質のものではない。
極端な話、モジュール分割を行わなければ「モジュール結合度」は高くならんわけだし。
0667デフォルトの名無しさん
2012/11/09(金) 21:54:14.49そもそも1ビットだけずらす機械語命令があるのかと
0668デフォルトの名無しさん
2012/11/09(金) 21:54:52.620669663
2012/11/09(金) 21:55:16.920671デフォルトの名無しさん
2012/11/09(金) 22:39:10.860672664
2012/11/09(金) 23:18:11.12なるほど。
一般的にView&Controllerをいっしょこたにしたものはコード規模が大きく複雑になりがち。
そこでモジュール分割したいわけだが、
経験則的に結合度が低くなる傾向にあるのが
ViewとControllerという分け方、ということですね。
あと、思ったのですが、Viewはアプリの面構えに関する処理の責務を負うわけで、
例えばWin32APIのGUIパーツでなく、DirectXやOpenGLを使った
3DでクールなGUIを構築するということもできると。
そういった見た目の変更をしたいときにはViewだけを変更すればいいわけで
Controllerは一切手を加えずに済みます。
はっきりとした責務、コードの見通しの良さ、変更の容易性など、
これらのバランスが良くなる一つの例がMVCであるということですね。
0673664
2012/11/10(土) 00:17:20.23同じアプリでも、管理者向けのフル機能のGUIと、
ユーザー向けに必要十分な機能のGUIとが求められることがあり
(実際、自分の会社でもこういった要求がありました)、
Controllerはフル機能に対して作ったものを、
機能限定版のGUIに対して一切手を加えずに共有できるというものです。
とても納得がいきました。
0674デフォルトの名無しさん
2012/11/10(土) 03:17:23.520675デフォルトの名無しさん
2012/11/10(土) 11:18:26.12list.push_back(kurasu1);
ってやったときコピーコンストラクタは呼ばれますか?
このpush_backってインスタンスのコピーを追加するんですよね??
0676デフォルトの名無しさん
2012/11/10(土) 11:34:37.500677デフォルトの名無しさん
2012/11/10(土) 11:36:29.96http://www.ruby-lang.org/ja/news/2012/11/09/ruby19-hashdos-cve-2012-5371
0678デフォルトの名無しさん
2012/11/10(土) 11:39:14.84ok
0679デフォルトの名無しさん
2012/11/10(土) 11:53:41.92ありがとう
0680デフォルトの名無しさん
2012/11/10(土) 12:08:51.38kurasu* kurasu1 = new kurasu();
kurasu1->SetInt(123);
vector<kurasu> list;
list.push_back(*kurasu1);
としたかったんですが値がコピーされません。(list[0].GetInt()でぬるぽエラー
コピーコンストラクタを定義したせいでしょうか?
0681デフォルトの名無しさん
2012/11/10(土) 12:20:54.180682デフォルトの名無しさん
2012/11/10(土) 12:22:11.130683デフォルトの名無しさん
2012/11/10(土) 12:30:19.23kurasuの中身を書いた方が早い
0684デフォルトの名無しさん
2012/11/10(土) 12:30:45.450685デフォルトの名無しさん
2012/11/10(土) 12:35:21.81kurasu::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
って・・・
0686デフォルトの名無しさん
2012/11/10(土) 12:38:53.700687デフォルトの名無しさん
2012/11/10(土) 12:40:46.68入門書くらい買えよ、ハゲ。
0688デフォルトの名無しさん
2012/11/10(土) 12:45:13.58何がやりたいのか分からないけど、numの値をコピーしたいなら
kurasu::kurasu(const kurasu& rhs){
this->flag=true;
this->num=rhs.num;
}
こんな感じに修正して
kurasu kurasu1;
kurasu1.SetNum(123);
kurasu kurasu2 = kurasu1;
こう
0689デフォルトの名無しさん
2012/11/10(土) 18:03:23.96この部分
> kurasu* kurasu2 = kurasu1;
ここは、kurasu1のポインタをkurasu2にコピーしている。したがってkurasu1とkurasu2は同じオブジェクトを指す様になるのであります。
そこでkurasu1のポインタで指したオブジェクトをSetNumで変更すれば、同じオブジェクトを指すkurasu2のオブジェクトを変更したことになるのです。
この代入はポインターをコピーしているだけでコピーコンストラクタは呼ばれていないのです。
0690デフォルトの名無しさん
2012/11/11(日) 01:02:34.08この関数のどこでエラーが発生したかを調べたいのですがなにかいい方法は思いつきますか?
関数の入り口で適当なクラスを作って、デストラクタが__LINE__マクロを受け取る事が出来れば楽なのですが
そういった方法ってありますでしょうか?
0691デフォルトの名無しさん
2012/11/11(日) 01:04:09.140692デフォルトの名無しさん
2012/11/11(日) 02:09:24.24エラー値を返すの「エラー値」が有無を示すプリミティブ値の
場合は戻り値を工夫すればいいんじゃないの。
たとえばエラーならtrue/エラーなしならfalseを返す関数なら
true/falseで返すのをやめて0-nの整数値で返すとか。
0693デフォルトの名無しさん
2012/11/11(日) 04:40:18.080694デフォルトの名無しさん
2012/11/11(日) 11:29:36.64で0が返ることってあったっけ?
0695デフォルトの名無しさん
2012/11/11(日) 11:30:02.400697デフォルトの名無しさん
2012/11/11(日) 16:39:02.070698デフォルトの名無しさん
2012/11/11(日) 16:49:05.060699デフォルトの名無しさん
2012/11/11(日) 16:53:25.890700デフォルトの名無しさん
2012/11/12(月) 00:31:01.14目的は
・インスタンス化できなくする
・staticメンバー関数・メンバー変数のみにする。
適当な純粋仮想関数を用意する?
0701デフォルトの名無しさん
2012/11/12(月) 00:57:40.96コンストラクタを private にする
あるいは、別解として無名名前空間に static 関数などを定義する
0702デフォルトの名無しさん
2012/11/12(月) 01:03:04.57たかだか8文字書き加えるか1行移動するだけで実現できるが、お前には無理。
0703デフォルトの名無しさん
2012/11/12(月) 01:28:06.17「nothing to build for project test」と表示され、実行できません。
原因は何でしょうか?
Pleiades-eclipse-4.2&MinGWを使っています。
「hello world c project」の方では何とか実行できました。
0704デフォルトの名無しさん
2012/11/12(月) 01:48:37.20あなたの環境固有の問題はほかの誰にも知ることはできません。
0705デフォルトの名無しさん
2012/11/12(月) 02:05:25.31こちらを参考にしました
http://absolutearea.blogspot.jp/2010/07/eclipse-cdt-mingw64bit.html
もし同じ症状が出た方は参考にしてみてください(いないと思いますが)
0706デフォルトの名無しさん
2012/11/12(月) 20:55:35.34remove:指定要素が取り除かれるように要素をコピーしていく(メモリ領域は解放されない)
pop_back:最後の要素のメモリ領域が解放される
erase:指定範囲の要素のメモリ領域が解放される
clear:全要素のメモリ領域が解放される
いずれも、削除された分だけsize()で得られる要素数が減らされる。
0707デフォルトの名無しさん
2012/11/12(月) 20:58:09.920708デフォルトの名無しさん
2012/11/12(月) 21:01:01.54pop_back:要素数が減る。メモリ領域は解放されない
erase:指定範囲の後ろの要素が前に詰められ、要素数が減る。メモリ領域は解放されない
clear:要素数が0になる。メモリ領域は解放されない。
0709デフォルトの名無しさん
2012/11/12(月) 21:04:30.440710706
2012/11/12(月) 21:07:12.73すみません、vectorにはremoveはありませんでした(汗)
>>708
え!?
メモリ領域解放されないんですか??
覚えておきます!
>>709
デストラクタが呼ばれるんですね。
ありがとうございました。
0711デフォルトの名無しさん
2012/11/12(月) 23:22:10.13C++11には確かスワップ技法を使わなくてもメモリを完全に解放するメンバ関数が加わったはずだけど
ど忘れした
0712デフォルトの名無しさん
2012/11/12(月) 23:32:29.400713デフォルトの名無しさん
2012/11/13(火) 00:19:50.83ありがとう
これが出来て助かるんですよね
0715デフォルトの名無しさん
2012/11/13(火) 11:16:11.64vector<T> array;
array.push_back(T());
array.push_back(T());
//C++11未対応なら、以下のスワップ技法で。
vector<T> (array).swap(array);
0716デフォルトの名無しさん
2012/11/13(火) 19:21:45.19まぁ、大抵はちゃんと領域を適切にしてくれるだろうけれど
0717706
2012/11/13(火) 20:50:04.41じつにクレバーな手法ですね!
shrink_to_fitが使えたとしても、
あえて使いたくなるかっこよさですw
>>716
覚えておきます!
0718デフォルトの名無しさん
2012/11/13(火) 22:41:16.69Effective STLに書いてあるよ
0719706
2012/11/14(水) 00:16:16.84その本、持ってました・・・(汗)
たしか1年半ほど前に目を通したはずなんですが、
swap技法、ぜんぜん覚えてませんでした(汗)
付箋貼っておきました!
0720デフォルトの名無しさん
2012/11/14(水) 01:05:19.75このコードをVisual Studio 2010 のVC10 CLコンパイラでコンパイルすると
意図した動作にならないんですが、コンパイラのバグでしょうか?
xには~0ULLが代入されるはずだと思うのですが、そうなりません。
0721デフォルトの名無しさん
2012/11/14(水) 01:54:44.480722デフォルトの名無しさん
2012/11/14(水) 01:59:18.09再現可能な最小のケースまで切り詰めたコードで
代入と三項条件演算子とprintf()しか使っていないのですが、
具体的にどこがバグっているのか教えていただけないでしょうか。
gccでは問題ないことを確認しています。
0723デフォルトの名無しさん
2012/11/14(水) 02:02:14.19uint64_t value = ~0ULL;
uint64_t x = (value == ~0ULL ? ~0ULL : (value / 2.0 + .5));
MSVCコンパイラでコンパイルするると、xに~0ULLが代入されません。
0724デフォルトの名無しさん
2012/11/14(水) 02:02:57.45unsigned long long が 64bit を超えるようだと (uint64_t)~0ULL != ~0ULL になるだろうな。
MSVC10 の仕様は知らんけど。アセンブリコードでも出してみれば?
0725デフォルトの名無しさん
2012/11/14(水) 02:05:14.23MSVC10でのunsigned long longは64bitです。
同値の内容をif文で書けば問題はありませんし、三項演算子の最後の項の式を
もっと単純な整数値式にすればバグらなくなります。
0726デフォルトの名無しさん
2012/11/14(水) 05:50:29.11http://codepad.org/sOv4x56w
http://codepad.org/2a372NsZ
この差はなんだんでしょうか?うーん
0728デフォルトの名無しさん
2012/11/14(水) 06:14:26.940729デフォルトの名無しさん
2012/11/14(水) 07:25:51.89ifと?:でアセンブリコード貼って
最適化なしの場合も
0730デフォルトの名無しさん
2012/11/14(水) 09:34:43.55http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/7b2be75f-3990-4316-930e-99bb32793162
(uint64_t)(value == ~0ULL ? (double)~0ULL : (value / 2.0 + .5))
と同じ式になるので、doubleキャストの時点で精度が失われて~0ULLが
得られないのですね。よく理解できました。
0731デフォルトの名無しさん
2012/11/14(水) 09:36:06.76>>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
0732デフォルトの名無しさん
2012/11/14(水) 09:36:44.670733デフォルトの名無しさん
2012/11/15(木) 06:55:27.800734デフォルトの名無しさん
2012/11/15(木) 08:45:57.730735デフォルトの名無しさん
2012/11/15(木) 10:20:17.720736デフォルトの名無しさん
2012/11/15(木) 12:47:16.700737デフォルトの名無しさん
2012/11/15(木) 13:32:14.500738デフォルトの名無しさん
2012/11/15(木) 13:33:37.08パソコンは買い換えれば済むからな。
0739デフォルトの名無しさん
2012/11/15(木) 14:12:54.610740デフォルトの名無しさん
2012/11/15(木) 15:53:33.890741デフォルトの名無しさん
2012/11/15(木) 18:55:36.150742デフォルトの名無しさん
2012/11/15(木) 18:56:26.32これだね。
0743デフォルトの名無しさん
2012/11/15(木) 19:06:01.80こういう場合、このスレッドがボトルネックになっていることを知る方法はありますか?
0744デフォルトの名無しさん
2012/11/15(木) 19:16:27.750745デフォルトの名無しさん
2012/11/15(木) 21:11:31.36方法知らないけど
0746デフォルトの名無しさん
2012/11/15(木) 21:39:32.23知りたい気持ちはわかるな。
0747デフォルトの名無しさん
2012/11/15(木) 22:17:09.66Process Explorer とかで見ればいいんじゃね?
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
>>746
> 知ったところで対策はできないし意味はないと思うけど
当然自分が作ったソフトの話だと思うけど。
0748デフォルトの名無しさん
2012/11/15(木) 22:48:53.750749デフォルトの名無しさん
2012/11/15(木) 23:23:37.600750デフォルトの名無しさん
2012/11/16(金) 08:39:58.45入れての推定ならある程度は可能かな
0751743
2012/11/16(金) 12:11:19.08ProcessExplorerと、プロファイラなど見てみます。
0752デフォルトの名無しさん
2012/11/18(日) 00:04:17.8964bit用プログラムとしてコンパイルすれば
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以上の位置にシークできません。
どうすればよいのでしょうか?
0753デフォルトの名無しさん
2012/11/18(日) 00:06:14.96http://d.hatena.ne.jp/shiku_otomiya/20091117/p1
0755デフォルトの名無しさん
2012/11/19(月) 04:56:19.93距離がエッジの重みに準ずるようなノードの最適な配置(座標)を求めたいのですが、
Boost::Graphにそういったものはありますか?
それかまたは簡単に実装できるライブラリなどありますか?
JavaでいうJungみたいなのがあればいいのですが
0756デフォルトの名無しさん
2012/11/19(月) 08:50:05.97>Boost::Graphにそういったものはありますか?
ドキュメント見ろよ。
使ったこと無いけど、
http://www.boost.org/doc/libs/1_52_0/libs/graph/doc/kamada_kawai_spring_layout.html
2頂点間に重みの二乗分の1に比例する強さのバネがあるとしてエネルギー最小化してレイアウトするそうな。
(重みが小さいほどバネが強い→伸ばしにくい→近くなる)
あるいは DOT で出力して Graphviz (http://www.graphviz.org ) の neato, fdp に食わせるとか。
neato が使ってるアルゴリズムが↑の Kamada-Kawai みたいだけど。
0757デフォルトの名無しさん
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と表示される
これも意図通りです。
しかし次の動作を行うと意図通りに行きませんでした。
0758757
2012/11/19(月) 16:57:11.97qDebug("%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
です
教えていただけますと嬉しいです。
0759757
2012/11/19(月) 17:00:45.58SampleStructの定義ですが、
unsigned channel : 5
ではなく
signed channel : 5
でした。
よろしくお願い致します。
0760デフォルトの名無しさん
2012/11/19(月) 17:08:25.200761757
2012/11/19(月) 17:13:57.59代入先の変数がcharになっていまして、unsigned charが使えないんです。
なんとかしてchar cにうまく入れる方法はないものでしょうか。
0762デフォルトの名無しさん
2012/11/19(月) 17:18:40.270763デフォルトの名無しさん
2012/11/19(月) 17:20:13.98最上位ビットがたってる 0x9c が int に拡張する際に符号を維持して拡張されただけ
printf("%x", (unsigned int)c);
qDebug("%x", (unsigned int)c);
こうすればどうだい?
>printf("%x", (unsigned int)c);
だめみたい。可変長引数に対する int への integral promotion の適用後、キャストがかかるのかな?よくわからないや。
http://codepad.org/pAcflg6F
開き直ってこれはいかが?私は考えなしにこうしてます、わかりやすいから。
char が unsigned か signed か処理系依存だからいい手をおもいつかない。
http://codepad.org/jlz4eBHE
0765デフォルトの名無しさん
2012/11/19(月) 20:15:10.88C言語256倍でも嫁
0766デフォルトの名無しさん
2012/11/19(月) 20:17:38.650767デフォルトの名無しさん
2012/11/19(月) 20:22:59.02printf(…,(unsigned)(signed)c);だからな
0768 忍法帖【Lv=40,xxxPT】(1+0:5)
2012/11/20(火) 00:09:31.260769757
2012/11/20(火) 00:14:39.02http://codepad.org/pAcflg6F
など、いろいろ試したのですがやはりうまくいきません。
qDebug("%x", (st.status<<4) | st.channel);
のところで、5bitの st.statusを左に4つシフトしてしまっているのは
うまくいかないのに何か関係があったりするのでしょうか?
(9bitになってしまう気がしますので)
char型に0x9b を代入しようとすると 0x9bが10進数の127を超えていますが、
2の補数表現のようなものでマイナスを表しているわけでもないですよね・・?
1ではなくffffffになっていますし・・
0770デフォルトの名無しさん
2012/11/20(火) 00:26:16.400771デフォルトの名無しさん
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を得たいという感じになります
0772デフォルトの名無しさん
2012/11/20(火) 01:01:41.71そもそも0x9b以外に入るわけがないんだけど。
0773デフォルトの名無しさん
2012/11/20(火) 01:02:14.40上に散々出てるが、単に出力時に拡張されて 0xffffff9b になってるだけで、c には 0x9b が入ってる状態になってる
http://codepad.org/p1EGSjVB
0774デフォルトの名無しさん
2012/11/20(火) 01:02:58.08c に入ってる値はまぎれもない0x9bだから。
0775デフォルトの名無しさん
2012/11/20(火) 01:04:37.59qDebug("%02x", c);
でいいんじゃないの?
0776デフォルトの名無しさん
2012/11/20(火) 01:17:20.36いい加減、初心者過ぎませんか?
0777デフォルトの名無しさん
2012/11/20(火) 01:17:36.07printf("%x\n", (unsigned int)c);
printf("%x\n", (unsigned int)(unsigned char)c);
とか出てこないもんかな
0778デフォルトの名無しさん
2012/11/20(火) 01:21:25.50どの変数や数を使ってどう回すのっていう
のが全然思いつけないんだけど、これは慣れなの?
0779デフォルトの名無しさん
2012/11/20(火) 01:24:26.78自分で入力して動作を確かめるところから。
0780デフォルトの名無しさん
2012/11/20(火) 01:26:27.82「ここはiとjの2変数をこういう条件でループさせよう」
といったことが浮かんでくるようになる
0781デフォルトの名無しさん
2012/11/20(火) 01:30:13.240782デフォルトの名無しさん
2012/11/20(火) 01:31:05.22きっと俺だけじゃない…筈。
0783デフォルトの名無しさん
2012/11/20(火) 01:33:30.62ありがとうございます。
BoostにWikipediaの力学モデル (グラフ描画アルゴリズム)のアルゴリズムがあるんですね。
引数の準備が面倒そうだけど汎用性を考えてboostの方を使ってみます。
0784デフォルトの名無しさん
2012/11/20(火) 07:01:54.92馬鹿には無理
0785757
2012/11/20(火) 11:23:48.11なるほど、出力時に変な表示になるだけで実際には0x9bが入ってるんですね。符号拡張というのについて勉強してみます。ありがどうございましたm(__)m
0786デフォルトの名無しさん
2012/11/20(火) 12:25:30.68・お題: *でピラミッドを作る。
↓
*を横にある程度並べて、その上にそれより少ない数並べて天辺まで並べるとピラミッドに見えるだろう。
↓
縦に並べるにはループ制御変数に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');
}
0787デフォルトの名無しさん
2012/11/20(火) 21:19:22.95慣れと知識が圧倒的に足りてないようですね。
頑張ってみます。
フローチャートみたいなのありがとうございました。参考にします。
0788デフォルトの名無しさん
2012/11/20(火) 22:35:05.53物を観察して作る能力が欠けてる
高機能障害の疑いがあるから
病院に行ったほうがいい
0789デフォルトの名無しさん
2012/11/20(火) 22:43:16.000790デフォルトの名無しさん
2012/11/20(火) 23:33:37.930791デフォルトの名無しさん
2012/11/20(火) 23:44:37.430792デフォルトの名無しさん
2012/11/21(水) 00:43:30.38int Val[ 10 ] = { 0 };
意味としては「確保した領域のビットを全て0で埋める」という意味かと思っていたのですが、
float変数配列に適用したところ、
float fVal[ 10 ] = { 0 };
各要素は0.0fになっていました。
浮動小数点フォーマットでビットが全て0というのは0.0fではないため、
上記解釈は間違っており、「各要素を値0で初期化する」という意味であることが分かります。
これは_aligned_recalloc(アライメント付き動的メモリ領域確保&0初期化)でも同様でした。
コンパイラはVisualC++2008ですが、
このような挙動はコンパイラ依存なのでしょうか?
それともC++の仕様なのでしょうか?
0793デフォルトの名無しさん
2012/11/21(水) 00:44:08.050794デフォルトの名無しさん
2012/11/21(水) 00:46:11.02ところで、 int Val[10] = {}; でいいはずだが、VC++2008 はこの書き方ではダメなのか?
0795デフォルトの名無しさん
2012/11/21(水) 01:01:07.13> 浮動小数点フォーマットでビットが全て0というのは0.0fではないため、
IEEE754では全ビット0 = 0.0fだよ
「そうとは限らない」という意味では正しいけど
0796デフォルトの名無しさん
2012/11/21(水) 01:06:42.39まで含めるならコンパイラ依存だね
0797デフォルトの名無しさん
2012/11/21(水) 01:15:52.22それは優劣を比較するたぐいの話ではない。
0798デフォルトの名無しさん
2012/11/21(水) 02:23:27.01問題ない。Cの癖でつい書いちゃうんだろう。
0799792
2012/11/21(水) 22:39:09.70>>794
{}でいいんですね。
知りませんでした。
>>795
全ビット0で0.0fだったとは・・・
失礼しました。
0800デフォルトの名無しさん
2012/11/21(水) 23:33:40.230801792
2012/11/21(水) 23:34:33.920802デフォルトの名無しさん
2012/11/21(水) 23:44:32.98メンバ変数ポインタで確認するのが一番だよ
0803デフォルトの名無しさん
2012/11/22(木) 01:59:52.220の0乗は1だから
数学的には1が正しくね?
0804デフォルトの名無しさん
2012/11/22(木) 02:13:56.52指数部仮数部の話はベースが2だから、0のほげ乗と無関係
しかも、指数部が0は、0乗の意味でもない
0805デフォルトの名無しさん
2012/11/22(木) 06:43:15.32こんなのどこで知るの?
0806デフォルトの名無しさん
2012/11/22(木) 06:48:23.85http://toro.2ch.net/test/read.cgi/tech/1349356417/
0807デフォルトの名無しさん
2012/11/22(木) 07:36:29.62警告出るコンパイラもあるから
memsetしてるわ
0808デフォルトの名無しさん
2012/11/22(木) 07:40:10.420809デフォルトの名無しさん
2012/11/22(木) 07:47:00.58おいやめろ。
http://www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html
0810デフォルトの名無しさん
2012/11/22(木) 08:26:50.140811デフォルトの名無しさん
2012/11/22(木) 09:05:28.37なんでこうなるの?
0812デフォルトの名無しさん
2012/11/22(木) 09:15:59.56人のすることに難癖つけてるだけだな、こんなのは
好きにしたらええよ
0813デフォルトの名無しさん
2012/11/22(木) 09:18:58.15各フィールドに代入してるコードは
確かに間抜けだと思う
0814デフォルトの名無しさん
2012/11/22(木) 09:19:25.41memsetで正しく動作するアーキテクチャかどうかは、
プログラマに確実にわかると限らないから
0815デフォルトの名無しさん
2012/11/22(木) 12:37:51.110816デフォルトの名無しさん
2012/11/22(木) 14:10:48.330を代入して「こうすればいいのです」って矛盾しまくりだな。
0817デフォルトの名無しさん
2012/11/22(木) 14:22:55.000を代入すればコンパイラがよきにはからってくれるんだよ
0818デフォルトの名無しさん
2012/11/22(木) 14:22:59.97値の0と、(memset()で代入される)ビット0では意味が違うのよ。
TCP/IP を扱うのであれば当たり前
0820デフォルトの名無しさん
2012/11/22(木) 19:30:05.600821デフォルトの名無しさん
2012/11/22(木) 21:37:40.960822デフォルトの名無しさん
2012/11/22(木) 21:39:04.23TCP/IPとどう関係が?
0823デフォルトの名無しさん
2012/11/22(木) 21:40:50.440824デフォルトの名無しさん
2012/11/22(木) 22:00:35.42fVal[ 0 ] = 0.0f;
fVal[ 1 ] = 0.0f;
fVal[ 2 ] = 0.0f;
と等価であることがC++の仕様として保障されるけど、
memsetで0フィルする場合はコンパイラ依存の恐れがあると。
VC++では0.0fが各要素に代入される。
0825デフォルトの名無しさん
2012/11/22(木) 22:02:44.890826デフォルトの名無しさん
2012/11/22(木) 22:11:06.16http://www.atmarkit.co.jp/fwin2k/special/win64_02/win64_02_01.html
http://www.atmarkit.co.jp/fwin2k/special/win64_02/fig01.gif
この図を見ると、64bit対応のネイティブアプリが「64bit KERNEL32.DLL」を利用しています。
64bitなのにKERNEL"32"とはこれ如何に??
また、ユーザー・モードなのにカーネル.DLLが働くというのに違和感も・・・
0827デフォルトの名無しさん
2012/11/22(木) 22:12:36.510828デフォルトの名無しさん
2012/11/22(木) 22:22:28.73特にポインタの場合に全ビットの0フィルでなく整数の0での初期化であることが重要になる
0829826
2012/11/22(木) 23:21:08.69互換性のためですか・・・
他にも、64bitなのにSystem32を使ったりと、違和感バリバリですね(汗)
気にしてもしょうがないので、気にしないようにします。
ありがとうございました。
socket() を呼び出す前準備、 struct sockaddr_in の陽に設定しない各メンバは bzero()等で0クリアしておく。
これを忘れるとはまる。
0831デフォルトの名無しさん
2012/11/23(金) 00:46:48.950832デフォルトの名無しさん
2012/11/23(金) 01:07:10.68なんと!
0833デフォルトの名無しさん
2012/11/23(金) 01:14:51.42実装側のファイルにグローバル変数を宣言して使うのとでは、
名前空間で括られるかどうか以外に違いはあるのでしょうか??
0834デフォルトの名無しさん
2012/11/23(金) 01:19:16.71POD型の配列のときは特殊化してんだろ
0835デフォルトの名無しさん
2012/11/23(金) 01:31:30.24当たり前だが実装側ファイルのグローバル変数は
そのファイルに他のクラスのメンバやその他の関数が定義されてればそれらからもアクセスできる
0836デフォルトの名無しさん
2012/11/23(金) 01:43:17.12struct sockaddr_in foo = {0} でいいよね。
0837833
2012/11/23(金) 01:44:53.74なるほど。
たしかに。
まぁ、1ファイル(翻訳単位)につき1クラスの実装しかしないようにするなら問題ないですね。
そもそも、極力、クラスには静的メンバ変数を使いたくないのですが、
Win32APIのOPENFILENAME構造体のlpstrFileメンバのための文字列配列確保を
ローカル変数や普通のメンバ変数にすると、
GetOpenFileName呼び出しが失敗します。
やむを得ず、グローバル変数にしていますが、何かスマートな方法はないものか・・・
0838デフォルトの名無しさん
2012/11/23(金) 01:51:33.82失敗の原因を調べろよ。
0839デフォルトの名無しさん
2012/11/23(金) 01:53:50.19グローバル静的だと0初期化でたまたま動いてるんじゃね?
0840デフォルトの名無しさん
2012/11/23(金) 01:56:00.02>>839の言うとおりちゃんと初期化してないんだろう
0841833
2012/11/23(金) 02:01:44.68来週、会社で直します!
ありがとうございました!
厳密には否。
それは厳密には0クリアではない、メンバの中にポインタがあったり double があったりしたら。
自動変数を「代入のような書き方で」初期化するのも気にいらない、実際にはコードが生成されるのだから。
0844デフォルトの名無しさん
2012/11/23(金) 02:36:21.52Cで変数を初期化する構文は = ... によるものしかないんだが、
これが気に入らないとするとどんな初期化なら良いと言うの?
K&R1 に染まりきってしまい、それ以後に拡張された書き方に心理的抵抗があるだけ、ということでしょうね。
たとえば、K&R2 では関数から構造体そのものを返すことができるようになりましたが、私は今でも構造体のポインタを返す書き方にします。
同様に、配列の初期化については
static int array[100] = {0};
は抵抗なくかけるのですが、
auto into array[100] = {0};
は避けています、心理的に。いや、
auto int a = 1;
すら書かない、書くなら
int a;
...
a = 1;
でしょう。すなわち趣味の問題。
これが c++ だったら平気のへいざで書きようが変わるところが、あー、我ながら矛盾していますね。
0846デフォルトの名無しさん
2012/11/23(金) 03:42:13.23最後の int a; ... a = 1; は趣味の問題では済まない、明らかな害悪だろ。
使うところで宣言して初期化しろ。してください。
0847デフォルトの名無しさん
2012/11/23(金) 03:57:39.66「ゼロによる初期化」と捉えるから数値のゼロなのかビットパターンのゼロなのか混乱するのであって、
「組み込み型の初期値による初期化」と捉えれば混乱はないよね。
宣言と同時に初期化するのは相応のメリットがあるのでしょうね。ときどきいらぬトラブルに巻き込まれるのもそのせいですね。納得です。
>>847
組み込み型の初期値による初期化とビットパターン零による初期化がたまたま等価であったから bzero() を使った初期化でOKだったわけですね。
しかしビットパターン零による初期化は可能な限り避けたほうがいい。
とすれば >>836 が正解ですね。
考察が深まりました。ありがとうございました。
0849847
2012/11/23(金) 06:18:35.470850デフォルトの名無しさん
2012/11/23(金) 07:04:32.15お金を貰ってやってる仕事を2chで解決しようとするバカは死ねよ。
0851デフォルトの名無しさん
2012/11/23(金) 09:11:44.20問題を一般化し、問題点を絞り込んで、人に聞く。その過程だけでもいい訓練になるから
他人に聞くことはどんどん少なくなるものだし。
0852デフォルトの名無しさん
2012/11/23(金) 09:53:17.610853デフォルトの名無しさん
2012/11/23(金) 10:00:21.610854デフォルトの名無しさん
2012/11/23(金) 10:14:15.55技術的に興味を惹かれるネタなら答える人も現れるかも知れない。
上手に回答を釣るのも2chの醍醐味。
0855デフォルトの名無しさん
2012/11/23(金) 12:37:40.44できないのにできますとか言ってプログラマとして就職しちゃった基地害土方が
できなくて焦ってこの板できいてる。
だから質問のレベルも数年前に比べて格段に落ちた。
もう質問スレじゃなくて基地害土方の助け合いスレに変更すべき。
0856デフォルトの名無しさん
2012/11/23(金) 13:58:53.340857デフォルトの名無しさん
2012/11/23(金) 14:13:11.40バカに教えても勉強にならない。
0858デフォルトの名無しさん
2012/11/23(金) 14:13:50.77自分のため
0859デフォルトの名無しさん
2012/11/23(金) 15:27:28.06己の為。
0860デフォルトの名無しさん
2012/11/23(金) 15:31:29.34確かにね。
相手が興味を持ちそうなストーリーを添える、ってのも仕事・ブライベートに限らず、重要なスキルだからな。
0861デフォルトの名無しさん
2012/11/23(金) 16:07:54.940862デフォルトの名無しさん
2012/11/23(金) 16:37:32.59http://blog.livedoor.jp/lalha/archives/50156986.html
0863デフォルトの名無しさん
2012/11/23(金) 16:52:33.77かわっただけで禁止にしちゃいかんよね
0864デフォルトの名無しさん
2012/11/23(金) 17:13:07.41★は売名がよほど成功してからだし
0865デフォルトの名無しさん
2012/11/23(金) 17:50:33.850866デフォルトの名無しさん
2012/11/24(土) 09:24:07.60使うところで宣言、初期化したって関数の冒頭でまとめてやったっていいじゃない
言語仕様は自由だ、だから余計に縛っちゃいやんでござる
初期化忘れは結構はまる
0868デフォルトの名無しさん
2012/11/24(土) 09:46:52.14スコープが無駄に伸びて不必要なアクセスが生じる可能性を恐れているんだよ
0869デフォルトの名無しさん
2012/11/24(土) 10:28:02.26使ってない変数を宣言するな
(使ってたとしても要らなくなったら宣言したまま放っとくな)
と言われましたが
そういうもんなんでしょうか?
0870デフォルトの名無しさん
2012/11/24(土) 10:29:10.44目の前にあるゴミは少ないほうがいいだろう
0871デフォルトの名無しさん
2012/11/24(土) 10:31:55.11消しておいた方が良いね。
0872デフォルトの名無しさん
2012/11/24(土) 10:57:49.98あまりに意味のないコメントもそう
i++; // i をインクリメントする
0873デフォルトの名無しさん
2012/11/24(土) 10:59:10.90コンパイラで警告出すだろ?
精度はいまいち。bcc32とgccそれぞれに見落としがあることを経験している。javac は完璧。
0875デフォルトの名無しさん
2012/11/24(土) 11:18:35.65書くのなら、なんでインクリメントするのかを処理の塊で解説を頭に書いた方がスッキリするね
0876デフォルトの名無しさん
2012/11/24(土) 11:22:18.73初期化漏れが不安で仕方が無い
ごめん
0878デフォルトの名無しさん
2012/11/24(土) 11:46:06.820879デフォルトの名無しさん
2012/11/24(土) 11:49:11.47逆からみれば、必要になるまで宣言しないことは、最初から無計画に思いつきで書いてるように
みえちゃったりするわけよ
0880デフォルトの名無しさん
2012/11/24(土) 11:52:14.64んなこたーない
冒頭で書く事にこだわってバグを増やしたんじゃ世話ない
0881デフォルトの名無しさん
2012/11/24(土) 12:24:01.13static 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];
とか、どうするのがいいでしょう?
0882デフォルトの名無しさん
2012/11/24(土) 12:24:57.630883デフォルトの名無しさん
2012/11/24(土) 12:29:28.23int y = x*(13 << (((x>>3) | (x>>2)) & 1));ですね。最初のシフトの向きが間違ってました
0884デフォルトの名無しさん
2012/11/24(土) 12:38:19.07どれも大差はなさそうだけど、保守性の良さで決めれば
0885デフォルトの名無しさん
2012/11/24(土) 12:50:22.26何か速度の差を生む要因など分かる方がいれば参考にさせて欲しいなあと思ってます
0886デフォルトの名無しさん
2012/11/24(土) 13:04:55.390887デフォルトの名無しさん
2012/11/24(土) 13:10:22.07サイズ100のテーブルか純粋な演算か、どちらがいいのだろう。
0888デフォルトの名無しさん
2012/11/24(土) 13:11:22.540889デフォルトの名無しさん
2012/11/24(土) 13:14:24.46C++で最も素晴らしい拡張であると言っても過言ではない。
これができないだけで生C言語はイヤだ。
0890デフォルトの名無しさん
2012/11/24(土) 13:16:27.33int y = (x < 4 ? 13 : 26); が早い
mov, cmp, cmovl の3命令で済む
0891デフォルトの名無しさん
2012/11/24(土) 13:20:37.57int y = x * (x < 4 ? 13 : 26); だな
0892デフォルトの名無しさん
2012/11/24(土) 13:22:49.18そっちの方が速いんですか。
自分がそう思わなかったのは、if文は遅いということからの勘違い(アセンブラの知識が無いため)だと思うのですが、
?を使った文の場合はjmp命令が無いからif文とは全然違うもので、高速に動作するという解釈でいいのでしょうか
0893デフォルトの名無しさん
2012/11/24(土) 13:31:21.06jmp命令があれば遅くなるけどcmovcc命令を使えば速い(ccには比較方法が入る)
cmovccは条件が満たされる時のみ代入するというもの
cmovcc命令は後から導入されたため大昔の最適化ガイドだと「比較は使うな」と書いてあるかもしれないが、
既に導入された時期が大昔になったため使われる事を期待して全く問題なし
0894デフォルトの名無しさん
2012/11/24(土) 13:31:59.190895デフォルトの名無しさん
2012/11/24(土) 13:33:41.27他のCPUを使ってる時はとりあえず実測しろ
0896デフォルトの名無しさん
2012/11/24(土) 13:36:42.470897デフォルトの名無しさん
2012/11/24(土) 13:37:03.41そんな命令があるんですね
大変勉強になりました。三項演算子を見直しました
ありがとうございます
0898デフォルトの名無しさん
2012/11/24(土) 13:44:57.06mov eax, 13
cmp x, 4
cmovl eax, 26
実際には x は掛け算でも使うので
一旦レジスタに入れられるだろうけどね
(レジスタの余り具合にもよるだろうけど)
0899デフォルトの名無しさん
2012/11/24(土) 13:50:50.900900デフォルトの名無しさん
2012/11/24(土) 13:51:03.460901デフォルトの名無しさん
2012/11/24(土) 13:57:58.73mov eax, 26
cmp x, 4
cmovl eax, 13
0903デフォルトの名無しさん
2012/11/24(土) 16:40:26.040904デフォルトの名無しさん
2012/11/24(土) 16:51:43.250905デフォルトの名無しさん
2012/11/24(土) 17:30:27.460906デフォルトの名無しさん
2012/11/24(土) 17:49:27.300907デフォルトの名無しさん
2012/11/24(土) 19:19:10.090908デフォルトの名無しさん
2012/11/25(日) 00:38:48.52式を解釈(参考に)して結果を選択するからかぁと納得。
0909デフォルトの名無しさん
2012/11/25(日) 00:43:19.740910デフォルトの名無しさん
2012/11/25(日) 01:02:27.03記述が多ければ間違う可能性も多い。これは真理
0911デフォルトの名無しさん
2012/11/25(日) 01:10:58.85ifに戻り値つけろよ。 あとvoidも変数の型に格上げしてテンプレートの引数で
voidとそれ以外を作る手間を省けるようにすべき。
typedefと同じ機能で前方参照にも使える typeclassみたいなのも作ってくれ。
0912デフォルトの名無しさん
2012/11/25(日) 01:23:04.09戻り値ってなんぞ
0913デフォルトの名無しさん
2012/11/25(日) 01:45:01.06if(bool = fuga == hage)
的なことじゃないの
0914デフォルトの名無しさん
2012/11/25(日) 01:52:56.21特定CPU向けでCPUの特性にあわせてるんだろうけど。
0915デフォルトの名無しさん
2012/11/25(日) 01:58:53.28hoge厨がしゃしゃり出てくるんじゃねーよ
異常者は書き込むな
0916デフォルトの名無しさん
2012/11/25(日) 02:12:14.860917デフォルトの名無しさん
2012/11/25(日) 02:19:14.11お前頭おかしい自覚ある?
0918デフォルトの名無しさん
2012/11/25(日) 04:34:50.39頭の悪さが強烈に滲み出てるようなものだからね。
内容以前の問題。
0919デフォルトの名無しさん
2012/11/25(日) 04:40:36.970920デフォルトの名無しさん
2012/11/25(日) 07:27:15.670921デフォルトの名無しさん
2012/11/25(日) 08:42:36.940922デフォルトの名無しさん
2012/11/25(日) 08:52:18.79たぶん理想的な綺麗で求めてるような素直で簡潔なEVALUATEというものがある
0923デフォルトの名無しさん
2012/11/25(日) 10:58:46.60そういうの欲しいね。
代入じゃなくて、初期化で分岐させたいときがあって、
2分岐なら ?: でいいが、多分岐をその構文で行うとわかりづらい。
const string str(val == 1 ? "one" : val == 2 ? "two" : "invalid");
ラムダで switch 使えるけれど、さらに見づらいし、かなり遅くなるんだよね。
const string str([val](){switch (val) {case 1: return "one"; /*略*/}());
0924デフォルトの名無しさん
2012/11/25(日) 11:56:24.12もういい加減ウザいから>>1に禁止って書いとけよ
0925デフォルトの名無しさん
2012/11/25(日) 12:04:03.08const string str(val == 1 ? "one"
: val == 2 ? "two"
: "invalid");
0926デフォルトの名無しさん
2012/11/25(日) 12:39:46.820927デフォルトの名無しさん
2012/11/25(日) 12:55:08.00お前の生殖器
0928デフォルトの名無しさん
2012/11/25(日) 14:17:11.77glibcのソースコードは見たんですけど、訳がわかりませんでした・・・
ウィキ (http://en.wikipedia.org/wiki/BIOS_interrupt_call) によると、
mov ah, 0x0e
mov al, '!'
int 0x10
で一文字表示できるようなので、これを駆使すればprintfを実装できそうな気がします。
どなたか、参考になる簡単なソースコード、もしくはサイトを知ってたら教えて下さい。
0929デフォルトの名無しさん
2012/11/25(日) 14:27:51.580930デフォルトの名無しさん
2012/11/25(日) 14:32:35.98宿題としか思えない。
どうせ可変引数の練習だろうに、素直に1にwriteしとけ。
0931928
2012/11/25(日) 16:47:24.33自作のputcを複数回呼び出して、なんとかここまでは出来た
ソースコード: http://codepad.org/E2uQMHM4
スクリーンショット: http://www.dotup.org/uploda/www.dotup.org3663341.jpg.html
開発環境はVisual Studio 2010
実行環境はVirtual PC
たぶん、AT互換機とかいうやつだと思う。
0932デフォルトの名無しさん
2012/11/25(日) 16:59:45.030933デフォルトの名無しさん
2012/11/25(日) 17:11:45.27ここはC/C++のスレ。アセンブラを書きたいなら他に行け。
つーか、そのレベルでprintf()の実装なんて一ヶ月かけても無理だよ。
0934デフォルトの名無しさん
2012/11/25(日) 17:12:41.560935デフォルトの名無しさん
2012/11/25(日) 17:33:06.78死ね
0936デフォルトの名無しさん
2012/11/25(日) 17:56:31.57昔、組み込み機器用にサブセットを実装したなぁ…
0937デフォルトの名無しさん
2012/11/25(日) 18:08:39.96俺もやったw
つーか、標準ライブラリ使用禁止な仕事だったから標準ライブラリ互換の関数を幾つも作ったが、これは勉強になった。
かれこれ20年前の話。
0938デフォルトの名無しさん
2012/11/25(日) 18:16:17.30世界各国でhogeがメジャーに使われてるとでも思ってんのか
マジで頭おかしいわこいつ
0939デフォルトの名無しさん
2012/11/25(日) 18:33:25.85「やってやる」ってノリ
単項と2項だけじゃ殺風景だから3項が必要な演算は何かないかとか
代入も単純代入だけじゃ殺風景だから演算付き代入も入れとこうとか
判断も if else だけじゃ殺風景だから switch case も入れとこうみたいのは
色んなコンパイラがこぞってやっていた
ちなみにビットと論理を区別しようといった次の瞬間 true は int の 1 みたいな糞ルールが生じた
0940デフォルトの名無しさん
2012/11/25(日) 18:40:07.630941デフォルトの名無しさん
2012/11/25(日) 18:54:01.12と言うバカスタマーせい
0942デフォルトの名無しさん
2012/11/25(日) 18:56:00.47使えないまたは使うのが難しい環境はあるんだよ。
0943デフォルトの名無しさん
2012/11/25(日) 20:43:19.430944デフォルトの名無しさん
2012/11/25(日) 21:16:57.300945デフォルトの名無しさん
2012/11/25(日) 21:18:26.81lisp の cond じゃないの?
0947デフォルトの名無しさん
2012/11/25(日) 23:23:24.34組み込み系の場合は標準関数が用意されていない事もあるからそういう事じゃね
0948デフォルトの名無しさん
2012/11/26(月) 00:08:24.17中身からっぽの関数が用意されてる感じで。
0949デフォルトの名無しさん
2012/11/26(月) 00:40:18.520950デフォルトの名無しさん
2012/11/26(月) 01:29:11.34いつかテンプレートで型セーフなprintfを作ろうかと思ってたが、作る手間はぶけたわ。
はよ標準にしてくれ。
0951デフォルトの名無しさん
2012/11/26(月) 07:23:29.770952デフォルトの名無しさん
2012/11/26(月) 16:47:26.450953デフォルトの名無しさん
2012/11/26(月) 17:50:44.090954デフォルトの名無しさん
2012/11/26(月) 20:01:41.800955デフォルトの名無しさん
2012/11/27(火) 11:00:25.39std::getlineだと弾かれるみたいなので
boost::container::getlineを使いたいのですが
std::stringstreamに該当するものが何なのか分かりません
(つまり、boost版のstring文字列を、行ごとに処理したいのでgetlineを使いたいが、つまづいています。)
具体的にはどうすればよいでのしょうか
0956デフォルトの名無しさん
2012/11/27(火) 12:02:34.750957デフォルトの名無しさん
2012/11/27(火) 12:33:00.06boostでそろえて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;
}
}
0958デフォルトの名無しさん
2012/11/27(火) 14:09:48.58おおおぉぉおぉぉおおぉお!!
できました!!!!!
本当にありがとうございます。
0959デフォルトの名無しさん
2012/11/28(水) 14:00:16.56class Hoge {
public:
int type;
bool skip;
Hoge() { type = 1; skip = true; }
Hoge(int other) { } // ←ここ
Hoge(char* str) { } // ←ここ
}
上のようなクラスで、「←ここ」となっている場所でも、
Hoge()と同じ挙動(type = 1, skip = true)を勝手にやってほしいなと思うのですが
同じように処理をコピペする以外に何かいい方法はあったりしますか?
0960デフォルトの名無しさん
2012/11/28(水) 14:21:59.780961デフォルトの名無しさん
2012/11/28(水) 14:54:57.060962デフォルトの名無しさん
2012/11/28(水) 15:52:18.70{
Hoge tmp;
*this = tmp;
// 以下、エキサイトなコード
}
0963デフォルトの名無しさん
2012/11/28(水) 16:34:20.99Hoge基地害は失せろ
0964デフォルトの名無しさん
2012/11/28(水) 16:51:52.92"huge_array.h"
static const int huge_array[5948375] = {342, 2435, 235987, 894, ...(略)};
をインクルードしてコンパイルすると、コンパイルに時間がかかってしまうのですが
このように巨大な配列だと仕方のないことなのでしょうか?
初回コンパイル時だけでなく、"huge_array.h"をインクルードしているヘッダファイルを更新してからコンパイルする場合も遅くなるので困っています。
0965デフォルトの名無しさん
2012/11/28(水) 17:18:32.960966デフォルトの名無しさん
2012/11/28(水) 17:30:48.31何をもって「いい」と判断するのかにもよるけど、
社会の不利益を減らすって意味ならお前が回線切って吊るのが一番いい。
0967デフォルトの名無しさん
2012/11/28(水) 17:44:24.240968デフォルトの名無しさん
2012/11/28(水) 18:30:46.71ありがとうございます
extern宣言を使って配列のデータをcppに移したらコンパイルの重さが解消しました
0969デフォルトの名無しさん
2012/11/28(水) 18:36:43.47日本企業がIT関係でガラバゴス化やって散々な目にあったのにまだ分からないんだな
>>959みたいにガラバゴス化を持ち込もうとする屑がいる限り日本の産業に未来はない
>>959はマジで生きてるだけで迷惑
0970デフォルトの名無しさん
2012/11/28(水) 18:47:13.400971デフォルトの名無しさん
2012/11/28(水) 18:59:10.89ガラバゴスじゃないよ、自分が間違ってんじゃん。ガラバルスだよ。
0972デフォルトの名無しさん
2012/11/28(水) 20:07:04.250973デフォルトの名無しさん
2012/11/28(水) 20:51:42.850974デフォルトの名無しさん
2012/11/28(水) 21:20:15.96というか、じゃあなにを使ってほしいんだ?
0975デフォルトの名無しさん
2012/11/28(水) 21:23:57.09Hogeとか使うくらいだから根性腐りきってるんだろ
根性腐ってる奴が自演してても特別不思議な印象は受けないな
0976デフォルトの名無しさん
2012/11/28(水) 21:26:11.93foo,bar
0977デフォルトの名無しさん
2012/11/28(水) 21:36:25.53もうホゲ禁止ってテンプレ入れとけよ。
0978デフォルトの名無しさん
2012/11/28(水) 21:37:15.880979デフォルトの名無しさん
2012/11/28(水) 21:53:36.510980デフォルトの名無しさん
2012/11/28(水) 22:15:20.04ハゲは死ぬべき
0981デフォルトの名無しさん
2012/11/28(水) 22:16:13.40http://labaq.com/archives/51770648.html
0982デフォルトの名無しさん
2012/11/28(水) 22:27:51.880983デフォルトの名無しさん
2012/11/28(水) 22:32:04.91そんな巨大な配列は外部ファイルにして
動的に読み出すのが普通
0984デフォルトの名無しさん
2012/11/28(水) 22:50:39.13知識不足とか経験不足とかそういうレベルじゃない
根本的に知能の低い奴しかいない
>>959も例外じゃなかった
0985デフォルトの名無しさん
2012/11/28(水) 22:58:06.59そろそろ次スレ立てるべきかね?
0986デフォルトの名無しさん
2012/11/28(水) 23:02:16.78毎回毎回荒れてかなわん。
0987デフォルトの名無しさん
2012/11/28(水) 23:10:27.84メタ変数はfooとかbarとかを使えという掲示なのだよ……
0988デフォルトの名無しさん
2012/11/28(水) 23:12:00.11組み込み系だとそうもいかないときもあるけどね
0989デフォルトの名無しさん
2012/11/28(水) 23:13:48.360990デフォルトの名無しさん
2012/11/28(水) 23:34:27.60...
}
0991デフォルトの名無しさん
2012/11/29(木) 00:28:44.55でも4*5948375≒23Mバイトも使える組み込みって……
0992デフォルトの名無しさん
2012/11/29(木) 00:30:00.46そもそもファイルという概念がない事もある
0993デフォルトの名無しさん
2012/11/29(木) 00:35:14.07そーなのかー
次スレ
【初心者歓迎】C/C++室 Ver.81【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1354116880/
0994デフォルトの名無しさん
2012/11/29(木) 01:30:44.460995デフォルトの名無しさん
2012/11/29(木) 02:46:56.330996デフォルトの名無しさん
2012/11/29(木) 04:04:02.35ほんと糞だな
0997デフォルトの名無しさん
2012/11/29(木) 06:50:45.960998デフォルトの名無しさん
2012/11/29(木) 06:53:22.23禿の人はそこまで心狭くないと思うけど
0999デフォルトの名無しさん
2012/11/29(木) 07:09:30.601000デフォルトの名無しさん
2012/11/29(木) 07:15:47.29\ヽ, ,、
`''|/ノ
.|
_ |
\`ヽ、|
\, V
`L,,_
|ヽ、)
.|
/ ,、
/ ヽYノ
.| r''ヽ、.|
| `ー-ヽ|ヮ
| `|
ヽ, ,r .|
ヽ,r'''ヽ!'-‐'''''ヽ、ノ
,,,..---r'",r, , 、`ヽ、 ヾ
ヽ、__/ ./ハレハ i`ヽ、 `''r`ミ_
.レ//r,,,、 レ'レハヾ, L,,_ `ヽ、
"レ, l;;;l l;;;l`i.リレ' リ ̄~~
ヽ、 ワ `"/-'`'`'
`''''''''"
┼ヽ -|r‐、. レ |
d⌒) ./| _ノ __ノ
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。