トップページ⇒tech
1001コメント297KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2012/09/21(金) 02:15:05.41
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.79【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1341052801/

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

NG推奨:◆QZaw55cn4c
0002デフォルトの名無しさん2012/09/21(金) 19:16:51.17
余裕の2ゲットモナ(´∀`)
0003デフォルトの名無しさん2012/09/21(金) 20:57:49.50
>>1
乙
0004デフォルトの名無しさん2012/09/22(土) 22:39:55.29
>>1乙ー

998 名前: 忍法帖【Lv=40,xxxPT】(1+0:5) [sage] 投稿日:2012/09/22(土) 01:28:45.67
蒼樹うめ
1000 名前: 忍法帖【Lv=40,xxxPT】(3+0:5) [sage] 投稿日:2012/09/22(土) 01:29:51.89
うめてんてー

↑うめてんてーって言う埋め方って一般的なもんなの?
0005デフォルトの名無しさん2012/09/22(土) 22:53:11.18
AAもあるよ
                      _ / \ _
                     / /    {┳ }
                     >{、     ,>-<
                   // -\__/ -ヽ \     、_、-‐     1
      ゝ       ┐    .  {  |⊂⊃ i  ⊂⊃|  }       }  、   T¨Τ
     , -―、   {_ノ―、     \ヽ 「 ̄ ̄ フ  / /     、-7 ̄   г¨Τ二7
    ´   }  /∨   }   r─\ ゝ ─ '  厶二⊃       / \    ΓΤ J
      _ノ   ヽハ _ノ      ̄`|  ̄ ̄ ̄ ̄  `ーァ    /    ヽ、    |
                      \       /
                       >、___ イ
                       し′  し′
0006デフォルトの名無しさん2012/09/22(土) 22:59:46.49
>>5
いやひだまらーだしうめ先生は知ってる
C++スレにまで出てくるとか(埋めレスとして)汎用性高杉
0007デフォルトの名無しさん2012/09/23(日) 13:35:32.90
多数がNGワードにしてるワードを>>1 に入れるのやめようや
一部を伏せ字にするとかさ工夫してくれ
0008デフォルトの名無しさん2012/09/23(日) 14:05:41.17
俺はNGNameでNGにしてるから>>1はNGにならない
0009デフォルトの名無しさん2012/09/23(日) 14:26:22.26
NGNameにはしてないけどNGWordにはしてる。
0010デフォルトの名無しさん2012/09/23(日) 14:49:48.91
だから NGName にしとけって暗に言われてるんだろ…
0011デフォルトの名無しさん2012/09/23(日) 14:50:44.32
いや言及してるレスの方が
はるかにウザイから
0012デフォルトの名無しさん2012/09/23(日) 14:52:02.67
たしかにw
0013デフォルトの名無しさん2012/09/23(日) 15:22:48.54
せめて二文字
0014デフォルトの名無しさん2012/09/23(日) 15:39:09.05
>>1をNG除外にしてるから何書かれようと問題ない
0015デフォルトの名無しさん2012/09/23(日) 16:52:18.40
>>14で出てた(当方Jane使い)
0016デフォルトの名無しさん 2012/09/23(日) 16:59:09.68
なぁ、C++とかのオブジェクト指向プログラミングって
俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど
要は、親玉(Objectクラス)は、子供(継承したクラス)の
情報をしってて、親玉から子供の情報を知りたい時にキャストして
子供の情報を得る。
ってな感じで良い?
まぁ、オブジェクト指向のなんたるかを語りだすと
色んな人が色んな例えして、どーでも良くなったりすんだけどね。
0017デフォルトの名無しさんNGNG?2BP(0)
VS10 C++ です。
BOOL hoge(CString& sValue)
{
sValue = _T("");
}

CString& sValueは参照変数で空文字で初期化を行なっていますが、MFCの使えない環境で
BOOL hoge(char& sValue)
{
//
}
このような場合のchar& sValueの初期化を行うにはどのように書いたらいいですか。
0018デフォルトの名無しさん2012/09/23(日) 19:58:38.83
お前の言う初期化とはどういう状態になることなんだ
0019デフォルトの名無しさん2012/09/23(日) 20:01:07.28
アホ
どう言うも何も参照で取ってんだから
sprintf(sValue,"");
で十分じゃん
0020デフォルトの名無しさん2012/09/23(日) 20:01:07.81
>>17
文字列を空にしたいってことでしょ?
char*&sValueでsValue[0]="\0";
じゃないかな
0021デフォルトの名無しさん2012/09/23(日) 20:02:06.31
あ、&いらなかった
0022デフォルトの名無しさんNGNG?2BP(0)
>>17ですが、
>>19も>>20も全部エラーになるお、やりたいことは>>20と一緒
参照渡しの文字列を空にしたいのですが
0023デフォルトの名無しさん2012/09/23(日) 20:14:08.69
>>22
>>17の通りなら参照渡ししてるのは文字であって文字列では無い
まず引数をchar*sValueにするところから変更しなきゃ
0024デフォルトの名無しさん2012/09/23(日) 20:33:19.12
>>19
いけず
0025デフォルトの名無しさん2012/09/23(日) 20:36:37.69
>>22
hoge厨は初期化しなくていいから回線切れ
0026デフォルトの名無しさん2012/09/23(日) 20:43:34.86
文字(char)なのか文字列(char*)なのかどっちなのか
0027デフォルトの名無しさん2012/09/23(日) 20:50:36.19
文字列だお
0028デフォルトの名無しさん2012/09/23(日) 20:53:13.55
>>17
お前hogeとか使ってて恥ずかしくねーの?

本物のゴミか?
0029デフォルトの名無しさん2012/09/23(日) 20:56:46.87
>>28
しつけーぞhage
0030デフォルトの名無しさん2012/09/23(日) 20:56:52.69
>>17
hogeを覚える暇はあってもコーディングの技術を身に付ける暇はないとかマジでクズ。
お前みたいな奴社会にいらないよ。
0031デフォルトの名無しさん2012/09/23(日) 20:58:27.46
MFCが使える使えないに関わらず、std::stringを使えばいいじゃん。
0032デフォルトの名無しさん2012/09/23(日) 21:01:35.88
#ifdef _UNICODE
typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif
0033デフォルトの名無しさん2012/09/23(日) 21:06:12.07
もしかしてエラーの内容ってcharじゃなくてwchar_t使わなきゃいけない(もっと言えばTCHAR)だけだったりして
0034デフォルトの名無しさん2012/09/23(日) 21:13:02.76
>>17
おい愚図
お前みたいな愚図は学校や職場では
陰で氏ねばいいのにって言われてるんだろうな

本人気づいてないけどうちの職場にもいる
0035デフォルトの名無しさん2012/09/23(日) 21:16:27.82
>>34
ただの悪口なら気付かなくてもいいんだけど、
>>17みたいな基地害は迷惑で言われるんだからさっさと消えて欲しい。
0036デフォルトの名無しさん2012/09/23(日) 21:18:04.57
>>17

























hogeとかヴァカじゃねおまえ
0037デフォルトの名無しさん2012/09/23(日) 21:21:32.22
>>22
キチガイが何でこのスレにいるの?
0038デフォルトの名無しさん2012/09/23(日) 21:23:46.66
えっ
0039デフォルトの名無しさん2012/09/23(日) 21:26:44.75
>>22
お前の存在自体がエラーwwwwwwww
0040デフォルトの名無しさん2012/09/23(日) 21:29:08.28
>>17も可哀想な奴だと思うよ。
親がゴミみたいな奴だからロクな教育受けてこなかっだんだろ。
しかも本人自覚ないみたいから余計に可哀想。
0041デフォルトの名無しさん2012/09/23(日) 22:02:01.86
もう全部unicodeで統一してくれないかな
0042デフォルトの名無しさん2012/09/23(日) 22:25:43.80
>>28
本物のの hage が聞くんじゃない
0043デフォルトの名無しさん2012/09/23(日) 22:25:48.12
>>17
ここは池沼用掲示板じゃねーんだよ
養護学校できけ精神異常
0044デフォルトの名無しさん2012/09/23(日) 22:27:43.51
>>42は髪が薄くなり始めてるのに気付いてない。
0045デフォルトの名無しさん2012/09/23(日) 22:39:37.79
散りゆく髪に未練などないさ俺たちは中高年
遠く弾けるドラム缶それが俺たちのオイルショック
吹き飛ばせるわけないだろ
体重計の秤量は 100kg 悪気もなく俺たちを
いぇいぇー ぶげらー
0046デフォルトの名無しさん2012/09/23(日) 22:41:57.58
>>40
>>17みたいな本物のゴミは自覚症状ないからある意味幸せだろ
0047デフォルトの名無しさん2012/09/23(日) 22:56:21.13
生きていたけりゃ 飲むしかないのさ
あいつはいつも俺にそういってた

そんなあいつがホスピスにいやがる
それでもいいさ楽になれたのなら

バイバイ マイ ライバル
バイバイ マイ エネミー
バイバイ マイ ボイド
灰が落ちる そしてまた「明日」はくる
俺は吐き血が混じる

いつかバブルを忘れちまうだろう
それは俺もおなじ

woo woo wooo 只じゃ買えない
家も買えない ラブホも行けない

woo woo wooo それでも消費税は
申告 せにゃならん おーいぇーべべー

# 銃声
0048デフォルトの名無しさん2012/09/23(日) 22:59:33.53
>>17
hogeとか書いて本当に恥ずかしくないの?
0049デフォルトの名無しさん2012/09/24(月) 00:04:33.52
またhoge嫌厨が沸いたか
0050デフォルトの名無しさん2012/09/24(月) 00:06:59.72
win32スレと同じだな
0051デフォルトの名無しさん2012/09/24(月) 00:32:58.38
こっちのほうがまだマシだな

向こうは常に荒れてるけど
こっちはhoge厨が湧かない限り荒れてない
0052デフォルトの名無しさん2012/09/24(月) 00:34:49.28
やってるやつは同じじゃねぇの?
そっくりなんだが
0053デフォルトの名無しさん2012/09/24(月) 01:22:20.62
同じだろうと同じじゃなかろうとどっちでもいいよ。
Hogeが来なければ荒れないみたいだからそれを祈るばかり。
0054デフォルトの名無しさん 2012/09/24(月) 10:09:38.93
piyo厨も入れてやれ
0055デフォルトの名無しさん2012/09/24(月) 10:15:18.46
相変わらずhogeに対する凄まじい憎悪だな
そろそろコテ付けろよww
0056デフォルトの名無しさん2012/09/24(月) 10:37:12.54
hogeをngに入れとけばいいだろ
0057デフォルトの名無しさん2012/09/24(月) 10:53:27.13
それじゃ >>34 >>35 >>37 >>39 >>40 >>43 >>46 は消えねーだろww
0058デフォルトの名無しさん2012/09/24(月) 11:22:46.70
>>57
連鎖あぼーんにすればおk
0059デフォルトの名無しさん2012/09/24(月) 11:57:18.32
>>57
連鎖あぼーんとかない?
ブラウザによるのかな。
0060デフォルトの名無しさん2012/09/24(月) 12:17:36.40
>>55
まあここまで叩かれるの分かっていてhoなんとか使うのは初見か荒らしだろうな
>>57
侮蔑語をNGすればOK
>>58
>連鎖あぼーん
Janeだとそういった設定は無いんだが……別の専ブラならできるの?
0061デフォルトの名無しさん2012/09/24(月) 12:21:36.79
>>60
>侮蔑語をNG
「エラー」とか「ゴミ」とかはまだ普通に使う可能性がある単語だろ……
0062デフォルトの名無しさん2012/09/24(月) 12:36:08.08
それはNGしなけりゃいいだろ
それでも目に入る煽りはかなり低減できるだろ
100%クリーンな世界なんてないんだからそのくらいいいと思うけどね

とりあえずHOGE連鎖あぼーんでかなり減ると思うぞ
0063デフォルトの名無しさん2012/09/24(月) 12:50:37.67
>>60
ここに質問に来るような初心者は大抵初見だろw
毎回発狂するキチがコテつけりゃ済む話
0064デフォルトの名無しさん2012/09/24(月) 13:17:37.13
キチガイがコテつければ済む話だがキチガイがわざわざつけてくれるのか?
現実的でない。
0065デフォルトの名無しさん2012/09/24(月) 13:21:32.43
初見と初心者とか感激なくホゲ使っててまともな質問見たことねーな。

全ホゲあぼーんで問題なし。
0066デフォルトの名無しさん2012/09/24(月) 13:30:54.19
できるだけまともな日本語でどうぞ。いや、そもそも個人の感想なんてどうでもいいのだけれど。
0067デフォルトの名無しさん2012/09/24(月) 13:42:17.91
>>66は自分ではまともな日本語で書き込んでると思ってるのかなw
0068デフォルトの名無しさん2012/09/24(月) 13:51:00.04
>>63-65あたりを煽るために
わざと珍妙な日本語で書いてんだろ
お前釣られてんだよ
0069デフォルトの名無しさん2012/09/24(月) 16:04:19.42
スレ住人「あぼんするのでコテつけてください!」→マジキチ「了解です!コテつけます!」

性善説をこじらせるとこういう流れが妄想できるようになるの?
0070デフォルトの名無しさん2012/09/24(月) 17:55:10.54
俺はhoge厨もアンチも両方スルーできるけど、気になる奴はとりあえずNG設定しとけばいいんじゃね
hogeならNG設定しても困らんだろ
0071デフォルトの名無しさん2012/09/24(月) 22:17:57.88
うんこちんちん
0072デフォルトの名無しさん2012/09/24(月) 23:20:48.87
class Hoge* g_hoge;//クラスのグローバルポインタ

class 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.54
なにしとんねん
0075デフォルトの名無しさん2012/09/25(火) 21:16:05.24
VisualStudio2010でプロジェクトをビルドすると
・"Debug\test.unsuccessfulbuild" のタッチ タスクを実行しています
・すべての出力が最新のものです。
・ファイル "Debug\test.unsuccessfulbuild" を削除しています。

という警告メッセージ?がでます。
Explessから移行したばっかなので何がなんだかわからないのですが、どういうものなのでしょうか?
0076デフォルトの名無しさん2012/09/25(火) 21:27:10.57
リモートから見る時unsuccessfulbuildが存在すればビルドに失敗したんだなってわかるようになってる
普通に使ってれば気にしなくていい
0077デフォルトの名無しさん2012/09/27(木) 15:53:06.57
なぜコンストラクタは、returnでエラーをかえせないのですか?
exit()は、できる。
0078デフォルトの名無しさん2012/09/27(木) 17:14:02.83
return値をどうやって受け取るのですか?
0079デフォルトの名無しさん2012/09/27(木) 17:22:27.59
(´・ω・`)知らんがな
0080デフォルトの名無しさん2012/09/27(木) 17:24:33.50
超能力
0081デフォルトの名無しさん2012/09/27(木) 17:32:10.12
>>77
return 先のコード書いてみな
0082デフォルトの名無しさん2012/09/27(木) 17:39:54.69
>>77
returnが無ければ、例外を飛ばせばいいじゃない
0083デフォルトの名無しさん2012/09/27(木) 22:26:12.35
#define SETTING_TEXT "setting.txt"
#include <fstream>
#include <iostream>
using namespace std;

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

int main() {
  Setting s;
  cout << s.getCount() << endl;
  return 0;
}
0084デフォルトの名無しさん2012/09/27(木) 22:32:26.94
必要なのは getCount であって return ではないな
もしかして初期化子を知らないのか?

# 知らなくても代入でどうにでもなるが
0085デフォルトの名無しさん2012/09/28(金) 00:34:03.06
C++でゲームを作っていて、継承について質問です。

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

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

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

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

ゲームスレのほうがいいとは思ったのですが、処理だけ見ればC++に機能そのものなのかなと思いゲームスレではなくこちらで質問させていただきました。
よろしくお願いします。
0086デフォルトの名無しさん2012/09/28(金) 00:38:49.01
基底にvirtual bool IsGun()を作るとか
dynamic_castするとか
0087デフォルトの名無しさん2012/09/28(金) 00:41:47.86
>>85
つtypeid
つdynamic_cast
0088デフォルトの名無しさん2012/09/28(金) 00:43:16.44
typeinfoしか思いつかないなあ
0089デフォルトの名無しさん2012/09/28(金) 00:46:35.27
要するに.NETで言う所のリフレクションみたいな機能が欲しいんだろうと予想するけど

C++11ならdecltypeって使えるな
0090デフォルトの名無しさん2012/09/28(金) 00:47:14.91
使えねーよ
0091デフォルトの名無しさん2012/09/28(金) 00:50:04.04
はっきり言うが設計間違えてるからやり直し
0092デフォルトの名無しさん2012/09/28(金) 01:01:12.06
>>85
特に速度が必要ないならdynamic_castでNULL判定が楽
0093デフォルトの名無しさん2012/09/28(金) 01:19:46.33
>>91
俺もそう思うが、設計スレじゃないし、いいんじゃね?
0094デフォルトの名無しさん2012/09/28(金) 08:36:55.73
>>91
どんな感じにすればいいですか?
0095デフォルトの名無しさん2012/09/28(金) 09:42:12.28
ガチ素人ですがいろいろ聞いていいですか?
0096デフォルトの名無しさん2012/09/28(金) 12:49:39.57
そういうのは、サブクラス側に
bool canEquip(SlotType)
みたいな関数を用意すればいいんじゃね。
0097852012/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
何のための dynamic_cast や
ダウンキャストしてでも派生した方が良い場合もたまにある

ただ、今回がそれかどうかは別の話だが
0101デフォルトの名無しさん2012/09/28(金) 21:02:35.97
dynamic castするくらいならquery interfaceするわ
0102852012/09/28(金) 21:06:21.59
>>99
>>85でいうスーパークラスはインターフェースクラス?なのかどうかは知りませんが
virtualの装飾がついた関数しかありません。
use()=0とかdrop()=0とかpick()=0とか・・・
0103デフォルトの名無しさん2012/09/28(金) 21:07:54.40
具体的な情報が必要な抽象化とかわろす
0104デフォルトの名無しさん2012/09/28(金) 21:24:09.55
query interface は結局 dynamic_cast だろw
0105デフォルトの名無しさん2012/09/28(金) 21:26:40.73
JavaだのC#だのはobjectに値を突っ込んで
ダウンキャストで取り出すなんて日常茶飯事
0106852012/09/28(金) 21:27:21.03
>>103
ということは、>>85でいえば
「アイテムスロットの1番は銃のサブクラスしか入れることはできませんよ」
という判定がしたい時は
逆に銃から3ウェイハンドシェイクみたいなやり取りを開始すれば完全に抽象化できるということでしょうか?
0107デフォルトの名無しさん2012/09/28(金) 21:47:54.71
>>106
言いたいことがさっぱりわからんというかESPしても誤解が誤解を生むだけだから
なんか疑似コードでも書いておくれ
0108デフォルトの名無しさん2012/09/28(金) 21:52:09.68
>>97
アイテムスロットに登録する人、つまり型情報から判定を行う人は誰?
スーパークラス?

0109デフォルトの名無しさん2012/09/28(金) 21:56:32.68
まあ、装備の種類みたいなのはクラスで分けずに
パラメータ化するのが普通じゃね
0110852012/09/28(金) 22:49:22.65
http://codepad.org/fp98nlIJ
こんな感じです。
3ウェイハンドシェイクとか忘れてください。
0111デフォルトの名無しさん2012/09/28(金) 23:03:22.83
そうとう重症だなこれは
0112デフォルトの名無しさん2012/09/28(金) 23:20:37.91
>>110
ちょっとぉ、だいぶ>>85のイメージと違うんだけど。。。

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

その相互依存はいくない。
0113デフォルトの名無しさん2012/09/28(金) 23:20:46.27
Equipにvirtual int GetSlot();を実装

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

とでもしとけ
0114デフォルトの名無しさん2012/09/28(金) 23:28:57.41
>>112
ごめん、見間違えた。
そのコードならいいんじゃね?
俺ならこうするってのはあるけど、それほどおかしくはないと思う。
強いて言えば、タイプをキーにして配列やマップに結びつけるかな。
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.25
プロキシクラスのコンストラクタをprivateにしてプロキシを返す関数とかをfriendにすれば
0117デフォルトの名無しさん2012/09/29(土) 19:30:44.75
MinGWでWin32APIを使っての開発を行っています。

http://codepad.org/fDEMyIto

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

アドバイスお願いします。
0118デフォルトの名無しさん2012/09/29(土) 19:41:33.53
だって自分で閉じてるじゃん。
何が疑問なのかわからないくらい。
0119デフォルトの名無しさん2012/09/29(土) 20:39:33.01
汚たねぇブロック配置だな
0120デフォルトの名無しさん2012/09/29(土) 21:45:43.59
template <class X> class Bob {
friend class X;
private:
void Fuck();
};

class Alice {
Bob<Alice> bob;
public:
void DoSomething() { bob.Fuck(); }
};

こういうふうにfriendに出来る対象をテンプレートで指定したいんですができません
どうすればうまくいきますか?
0121デフォルトの名無しさん2012/09/29(土) 22:04:53.87
>>117
Windowsでは一般にGetしたものはReleaseするものであってCloseするものじゃない
0122デフォルトの名無しさん2012/09/29(土) 22:19:24.47
お二方アドバイスありがとうございます。

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

>>119
お目汚し失礼しました。
C++を学習し始めたばかりですので、お手本お願いできますか?
0123デフォルトの名無しさん2012/09/29(土) 23:31:47.07
>>120
11ではclassを書かずに

friend X

03では適当なクラスを介して

template<class T>
struct friend_template
{
typedef T type;
};
friend class friend_template<X>::type;
0124デフォルトの名無しさん2012/09/29(土) 23:34:58.93
>>123
!!!!!!!!!!!!!!!
!!!ありがとうございます!!!
!!!!!!!!!!!!!!!
0125デフォルトの名無しさん2012/09/30(日) 08:25:09.20
>>115
コピーコンストラクタなどをprivateにしてもauto&&で持つことが出来るよそれ
0126デフォルトの名無しさん2012/09/30(日) 17:07:55.29
現在C++をVisualStudio2010Expressでゲームを作っていますが、C#のようにいわゆるポトペタでGUI部品やスプライトを配置して中身をC++で書けるような技術はありますでしょうか?
Qtを調べたのですがゲームにはあまり向いていないと書いてありました。
0127デフォルトの名無しさん2012/09/30(日) 17:46:39.17
残念ながらExpressにはリソースエディタがない
リソースファイルはテキストで直接編集するしかない
0128デフォルトの名無しさん2012/09/30(日) 18:14:35.99
Qtを使うのならVisualStudioは要らんな。
0129デフォルトの名無しさん2012/09/30(日) 18:23:18.96
ゲームなら自前で全部描画が基本じゃね
0130デフォルトの名無しさん2012/09/30(日) 23:25:32.80
フリーのリソースエディタ
0131デフォルトの名無しさん2012/10/01(月) 15:52:51.27
任意のEXEから呼出されるDLLで作成する
スレッドとファイバのスタックサイズを
4KB未満に小さくするにはどうすれば良いですか?

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

32ビットXPでできる方法はありませんか?
0132デフォルトの名無しさん2012/10/01(月) 16:14:38.57
ファイバーは知らないけど、スタックはスレッド固有の領域だから
ページサイズ以下には出来ないんじゃないの?
仮に出来てもページサイズ単位になるだろうし
0133デフォルトの名無しさん2012/10/06(土) 09:02:38.89
VS2008 C++です。
ライブラリ等外部から取得したポインタのアライメントを確認するには
どのような方法がよいでしょうか?
今はintにキャストしてbit andをとっていますが、これが動作保証されているのか
わからないのと、Windows環境で適切なAPIがあればそちらを使いたいと思っています。
0134デフォルトの名無しさん2012/10/06(土) 10:04:45.03
if(((char *) p - (char *) 0) % align == 0) Good();
0135デフォルトの名無しさん2012/10/06(土) 10:24:06.85
なるほど、NULLがアドレス0ならばこれでアドレスを求められるわけですね。目から鱗です。
0136デフォルトの名無しさん2012/10/06(土) 13:35:32.67
ところがだ、連続していることが保証されていないポインタ同士の減算は未定義だから巧くないんだな。
で、どうせ環境依存になるんだからintptr_tにキャストすればOK。
0137デフォルトの名無しさん2012/10/06(土) 13:38:32.52
>>136
何度も議論されてるようにintptr_tではサイズが足りる保証はない
0138デフォルトの名無しさん2012/10/06(土) 13:40:21.78
>>136
それはイテレーター全般の話だろ
ポインタはvalid rangeじゃなくてもオフセットを取得出来る
0139デフォルトの名無しさん2012/10/06(土) 14:00:22.33
つ ptr_diff_t
0140デフォルトの名無しさん2012/10/06(土) 14:10:00.90
>>139
それも同じでサイズが足りる保証はない
0141デフォルトの名無しさん2012/10/06(土) 14:14:36.17
オフセット取得でサイズが足りなくなる例を一個示してくれ
何度も議論された成果を1行で示すくらい、簡単だろう?
0142デフォルトの名無しさん2012/10/06(土) 14:16:29.60
>>141
>>135
0143デフォルトの名無しさん2012/10/06(土) 14:33:15.52
ISO/IEC 14882:2011
Unless both pointers point to elements of the same array object, or one past the last element of the array object, the behavior is undefined.
JISX3014:2003
両方のポインタが同じ配列オブジェクトの要素又は最終要素の一つ先を指していない場合の動作は、未定義とする。

というわけで少なくともC++では未定義
ptrdiff_tなら標準にあるけどptr_diff_tはない
そもそもptrdiff_tでポインタのサイズに足りる保証はない
intptr_tなら保証されるが定義されている保証はない
0144デフォルトの名無しさん2012/10/06(土) 14:55:31.15
>>143
なるほど、型に保証が無いのは分かったが、
if the expression P points either to an element of an array object or one past the last element of
an array object, and the expression Q points to the last element of the same array object,
なので、同じchar配列要素の場合で最終要素も超えないので、OKかと。

最終要素を超えるの意味はわかってるよね?
>>134のpがintだろうがdoubleだろうがchar*にキャストされた時点で
それらの最終要素より先をポイントしようがないよ?
charが2バイトの環境で、とか言い出されたら、もうハイハイとしか言いようがないけども
0145デフォルトの名無しさん2012/10/06(土) 15:06:35.67
俺は>>143しかレスしてないが・・・
まあ>>134が同じ配列オブジェクトの要素だと強弁するならそれでいいんじゃないの
百歩譲っても(char*)0が配列オブジェクトの要素を指してるなんてありえないと思うけど
0146デフォルトの名無しさん2012/10/06(土) 15:17:48.27
>>134 から始まって、最初に規格書から「配列オブジェクト」を持ちだしたのは>>144だろ
0147デフォルトの名無しさん2012/10/06(土) 15:18:29.08
143だった
0148デフォルトの名無しさん2012/10/06(土) 15:23:59.43
それで、結局のところ「安全にアドレスを整数変換できる方法」はどうすればいいんですか?
あなたたちはあれはだめこれはだめというばかりで一向に話を進めようとしないじゃないですか
0149デフォルトの名無しさん2012/10/06(土) 15:25:20.34
俺はuintptr_tに突っ込んでます
0150デフォルトの名無しさん2012/10/06(土) 15:29:42.29
「安全にアドレスを整数変換できる方法」は環境依存しないかぎり存在しない
intptr_tかuintptr_tがあればそれを使うのが安全
0151デフォルトの名無しさん2012/10/06(土) 15:40:19.14
>>146
それが何かおかしい?
0152デフォルトの名無しさん2012/10/06(土) 15:45:24.94
std::sprintf(buf, "%p", p);
if(BigInt::FromString16(buf) % align == 0) Good(); // EXCELLENT!!
0153デフォルトの名無しさん2012/10/06(土) 15:55:52.11
%pでの出力形式は実装定義だからあんまり意味ないな
0154デフォルトの名無しさん2012/10/06(土) 16:09:32.37
if(BigInt::FromBytes((unsigned char *) &p, sizeof(p), ByteOrder::Check()) % align == 0) Good(); // Amazing!!!
0155デフォルトの名無しさん2012/10/06(土) 16:33:19.07
http://www.kouno.jp/home/c_faq/c5.html#17
それだけがんばってもこういう環境ではうまくいかない件
0156デフォルトの名無しさん2012/10/06(土) 16:38:05.76
そんなマニアックな環境はボイコットしろ
0157デフォルトの名無しさん2012/10/06(土) 16:39:47.31
>>133の環境に限定するならUINT_PTRにでもキャストすればいいんだけどな
01581332012/10/06(土) 16:57:53.35
自分としてはWindows(VC)限定でいいんですが、その環境でポインタを整数に
キャストしたとき下位ビットがアライメントを表すことが保証されているかどうか、
それだけです。
0159デフォルトの名無しさん2012/10/06(土) 18:21:42.78
2の整数乗にしかならないから下位ビットを見ればいいのはあってるけど
struct type1{ char a[10]; }; この型のアライメントは1
struct type2{ DECLSPEC_ALIGN(1024) char a;} この型のアライメントは1024
というようなことを判別する必要があるなら
(UINT_PTR)p % TYPE_ALIGNMENT(T) == 0 が真っ当な方法
0160デフォルトの名無しさん2012/10/06(土) 19:02:42.60
>>158
アライメントの定義は下位ビットでしょ?
問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
キャストできるならその答えは Yes になる

どうせ上司あたりから受け取ったポインタのアライメントを確認するように!と
言われたんだろう。
「x86ならアライメントエラーにならないから平気ですよ」と言い返そう
そのあと「あ、ARMだと例外おきますね。ARMも対応するんですか?なら直してきます」
と言って席に向かおう
0161デフォルトの名無しさん2012/10/06(土) 19:17:04.09
>問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
>キャストできるならその答えは Yes になる

ポインタを整数にキャストできることは保証されているが、それがアドレスか
どうかは規定されてないだろ。
0162デフォルトの名無しさん2012/10/06(土) 19:21:27.24
ARM対応予定はないけどSSE使うから直せとか言われるオチ
01631332012/10/06(土) 20:06:49.56
>>162
まさに、受け取ったデータをSSEで処理したいんですが16byte alignmentを要求するので
そのチェックをしたいということです。
他の環境に移植し得るようなプログラムでポインタのアライメントをチェックしなければ
ならないような場面なんて逆に思いつかないです。
0164デフォルトの名無しさん2012/10/06(土) 20:13:57.58
VC は alignas ないんだっけ
0165デフォルトの名無しさん2012/10/06(土) 21:02:33.91
ない
0166デフォルトの名無しさん2012/10/06(土) 21:50:36.98
ポインタのアラインメントっていわれると&pのアラインメントを思い浮かべちゃうんだけど
0167デフォルトの名無しさん2012/10/06(土) 21:56:01.43
ん?それでいいんじゃないか?
それともポインタ変数のアライメントのことを言ってるのか?
0168デフォルトの名無しさん2012/10/06(土) 22:30:27.72
void * p; &p;ってことね
アドレスのアラインメントっていってくれたほうがわかりやすい
0169デフォルトの名無しさん2012/10/07(日) 06:28:21.41
プログラミング言語C++第三版を読んでC++の勉強をしています。
テンプレートという機能がある事を知ったので、
ある要素配が列に含まれるか調べる関数をテンプレートで書いてみました。こんなのです。
#include <stdio.h>

const char chars[] = {'a', 'b', 'c', 'd', 'e', 'f'};

templete<class T> inline bool memberOf(T x, const T elems[]) {
 for(int i=0;i < sizeof(elems);i++)
  if (x == elems[i]) return true;
 return false; };

int main(){
if (memberOf('a', chars)) return printf("found!!\n");
return printf("not found.\n"); }
しかしgcc4.2.1は
error: expected constructor, destructor, or type conversion before '<' token
というエラーを吐いてコンパイルが出来ません。いったい何がまずいのでしょうか。
0170デフォルトの名無しさん2012/10/07(日) 06:40:26.51
algorithmのfind()を使えば?
それとc++なら、std::coutを使いましょ
0171デフォルトの名無しさん2012/10/07(日) 06:43:55.38
templeteがまずい
0172デフォルトの名無しさん2012/10/07(日) 06:44:15.83
>>169
×templete
○template
あとsizeof(elems)は配列の要素数を返さないのでそれじゃまともに動かないよ
0173デフォルトの名無しさん2012/10/07(日) 08:26:40.90
>>169
とりあえず初心者はVC++かeclipse使って色付けてもらえよ
そしたらこんなしょうもないエラーに悩まされることはないはずだから
0174デフォルトの名無しさん2012/10/07(日) 08:28:09.60
>>170
多分標準ライブラリがあると思ったのですが、
言語の機能を学びたいとおもいこんなことをやっています。

>>171,172
> ○template
それでした、下らなくてすんません
sizeofは自分もそう思ったのですが、
char[]の配列をいくつか作って試してみた限りでは
きちんと配列の長さを返してくれたのでそのままにしてあります
これって仕様に無い実装依存の挙動だったりするんですか?
0175デフォルトの名無しさん2012/10/07(日) 08:43:31.39
>>174
ttp://ideone.com/7CRnJ
本当に返してるかきちんと調べたか?
0176デフォルトの名無しさん2012/10/07(日) 08:56:18.78
>>173
emacsを使ってますが色の意味が分かりませんでした……

>>175
sizeofの結果を直接printfした場合にはちゃんと長さを返してくれてたんですが、
memberOfから呼ぶとだめみたいですね。
やっぱりsizeofじゃダメみたいですね。
0177デフォルトの名無しさん2012/10/07(日) 09:01:31.25
>>176
配列は通常の方法では関数に渡せないからね。渡しているのはポインタ。
関数内で配列のサイズを知りたければ、テンプレート引き数として配列を渡す位しか手がないよ。
0178デフォルトの名無しさん2012/10/07(日) 09:05:46.23
>>177
まあそうなんですが
直接書いて長さ返してくれるなら
インラインは最終的に直接書いたのと同じにならないかなー、と思ったんですが
やっぱりこういうのはあんまりやらない方がいいですね
0179デフォルトの名無しさん2012/10/07(日) 09:38:10.37
>やっぱりこういうのはあんまりやらない方がいいですね
バグの温床になるからしない方が良いかと。
0180デフォルトの名無しさん2012/10/07(日) 10:55:28.91
>>178
template <class T, int N>
inline bool memberOf(const T& x, const T (&elems)[N]){
for(int i=0;i <N;i++)
:
}
とすればうまくいくはずです。

const char chars[] = {'a', 'b', 'c', 'd', 'e', 'f'};
memberOf('a', chars);
の場合、Nには6が設定されます。

以前同じ問題で悩んだことがあったので
参考までに。
0181デフォルトの名無しさん2012/10/08(月) 15:47:59.92
バルバロス「バオーwwwwwwwwwww」
0182デフォルトの名無しさん2012/10/08(月) 15:49:24.24
ルポニ「ランーーwwwwwwwwwwwwww」
0183デフォルトの名無しさん2012/10/08(月) 16:02:19.90
コナニゾ「ムゾコナwwwwwwwwwww」
0184デフォルトの名無しさん2012/10/08(月) 21:40:15.02
Winsockを使ったTCPで複数クライアントと接続するソフトを作りたいのですがうまくいきません。
サーバ側はacceptで待機し、接続があれば新規スレッドを作成し
acceptの戻り値のSOCKETだけ新規スレッドに渡して、ループでaccept待機に戻ります。
新規スレッド内では渡されたSOCKETを用いて送受信処理をおこなっているのですが、
 クライアント�@接続→クライアント�A接続→�@のSOCKETからデータ受信→�@のSOCKETへデータ送信→�Aに届く
といった結果になってしまいます。
SOCKETをsend関数の第1引数に指定するだけでは送り先を変えることはできないのでしょうか?

Javaですが、以下のページと同じように作っています。
ttp://www.cs26.scitec.kobe-u.ac.jp/~kamada/students/textK/net2_sample0.html
0185デフォルトの名無しさん2012/10/08(月) 21:45:15.74
ラゾコンナ「ンババババwwwwwwwwwwwwwwww」
0186デフォルトの名無しさん2012/10/08(月) 22:39:33.65
>>184
send( ), recv( ) の直前でソケットの値表示して、本当に正しいソケットに
対して操作しているか確認しなよ。

もしくは、ソースさらして。
0187デフォルトの名無しさん2012/10/08(月) 22:41:47.22
>>184
えーと、サーバ側アプリを書いているんだよね?
受信したスレッドと送信したスレッドはきちんと把握できている?
ひょっとしたら、メインスレッドで受信してメインスレッドで送信しているんじゃない?
0188デフォルトの名無しさん2012/10/08(月) 23:25:28.29
>>186
ソケットの値も確認しました。recvで�@のソケットで受信していて、sendで�@のソケットを指定しているのに�Aに送信されます
スレッド開始など省いていますが、以下のようなソースです。事情があって受信したデータの解析・送信はメインスレッドのクラスにある関数を使っています。
CServer::mainthread(){
 while(1){
  socket2 = accept( socket1, &addr, &length );
  CThread* cthread = new CThread( socket2, this );
  cthread.start();
 }
}
CServer::Send( SOCKET socket ){
CThread::CThread( SOCKET socket2 ){
 Socket = socket2; //メンバ変数
}
CThread::subthread(){
 JUSINDATA data;
 int length;
 while(1){
  length = recv( Socket, &data, sizeof(data) );
  if( length == sizeof(data) ){
   send( Socket, &data, length );
  }
 }
}
>>187
上記ソースで言うとsubthreadで送り返しているのですが、実際にはsend関数は
0189デフォルトの名無しさん2012/10/08(月) 23:26:54.96
すみません、ソース書いてる途中に間違って送信してしまいました。
>>1のサイトを使ってもう1回書きます。
0190デフォルトの名無しさん2012/10/08(月) 23:34:41.84
ttp://codepad.org/tzuheXNf
先にも書きましたが、受信データの解析・送信はメインスレッドのあるクラスの関数でおこなっています。
SOCKETを渡して、それをsendに指定しているのですが、もしかしてメインスレッドのクラスでsendしているのが問題なのでしょうか
0191デフォルトの名無しさん2012/10/08(月) 23:53:19.41
>>188
>  CThread* cthread = new CThread( socket2, this );
>  cthread.start();

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

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

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

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


0192デフォルトの名無しさん2012/10/09(火) 01:35:08.28
実は java という気がします
0193デフォルトの名無しさん2012/10/09(火) 01:37:01.29
>>191
すみません、他にもいろいろ間違ってますね。
1回間違って書き込んで無意味に焦ってしまいました。

>メインスレッドで受信してメインスレッドで送信しているんじゃない?
というのを受けてもう一度ソースを見なおしたところ、スレッドの扱いは合っていたのですが
別のところで問題があることがわかりました。
TCPがどうとかいう以前の問題でしたので、全体的にソースを見直すことにします。
ご回答して下さった方々、ありがとうございました。
0194デフォルトの名無しさん2012/10/09(火) 06:46:12.36
サブスレッドで受けた後
メインスレッドで処理して
間違ったサブスレッドで送り返していたと

0195デフォルトの名無しさん2012/10/09(火) 23:35:01.10
パゾコナン「マニアwwwwwwwwww」
0196デフォルトの名無しさん2012/10/09(火) 23:36:11.75
>>180
おお、これはすごい
勉強になります
ありがとうございます
0197デフォルトの名無しさん2012/10/09(火) 23:40:12.58
コナニーゾ「ハラバロwwwwwwww」
0198デフォルトの名無しさん2012/10/10(水) 00:00:03.89
uyうぜーよ消えろ
0199デフォルトの名無しさん2012/10/10(水) 00:09:00.78
コナニール「バンバンwwwwwwwwwwwww」
0200デフォルトの名無しさん2012/10/10(水) 00:42:56.19
uyって朝鮮人だってな
0201デフォルトの名無しさん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
>>201
*j には入れてない
j に入れている
0204デフォルトの名無しさん2012/10/10(水) 09:16:20.76
ナロコロ「バーローwwwwwwwwwwww」
0205デフォルトの名無しさん2012/10/10(水) 10:25:05.11
>>201
関数の引数は代入ではなく変数の宣言と同じ
*j=p; ではなく
int *j=p; と同じ(おおまかには int *j; j=p; と同じ)
0206デフォルトの名無しさん2012/10/10(水) 12:13:40.69
ルポナニ「バロバローwwwwwwwwwwwww」
02072012012/10/10(水) 16:47:46.04
>>205
>関数の引数は代入ではなく変数の宣言と同じ

というのがよくわからんのですが、何か良いサイトや本はありませんか?
俺が読んでいる本は標準講座C++(ハーバート・シルト著です。
上記のようなことはざっと見た限り載っていませんでした。
0208デフォルトの名無しさん2012/10/10(水) 16:48:21.12
ナロバリア「バロスwwwwwwwwwww」
0209デフォルトの名無しさん2012/10/10(水) 16:49:01.83
プラニア「ナバルアwwwwwwwwwwwwww」
0210デフォルトの名無しさん2012/10/10(水) 18:17:55.45
>>201 >>207
変数宣言での*と、代入での*は意味が違うってことだと思う
前者は型の一部、後者はポインタ演算子
「int*」型を「int_ptr」型と読み替えると分かりやすいかもしれない


typedef int* int_ptr;

int main()
{
 int i;
 int_ptr p;

 p = &i;
 
 f(p);
}
void f(int_ptr j)
{
 *j = 100;
}
0211デフォルトの名無しさん2012/10/10(水) 18:29:54.16
ある所がわからないってのは、そこより前段階の基礎的な所をわかったつもりでわかってない(間違って理解している)ことが原因のときもあるな
0212デフォルトの名無しさん2012/10/10(水) 19:18:09.11
パルパニア「ニアアwwwwwwwwwwwww」
0213デフォルトの名無しさん2012/10/10(水) 19:30:47.95
ニニル「バーロウwwwwwwwwwwwww」
0214デフォルトの名無しさん2012/10/10(水) 22:29:08.14
コナニ「ウハーwwwwwwwwwwwwwwwww」
0215デフォルトの名無しさん2012/10/11(木) 00:20:02.72
関数中のstatic変数はスタックでしょうかヒープでしょうか?
いわゆるシングルトンもそれと同じになると考えて問題ないですか?
0216デフォルトの名無しさん2012/10/11(木) 00:28:08.08
スタックでもヒープでもない
シングルトンはデータの置き場所としては普通の変数と同じだけど
初期化コードの必要性によって事情が変わる
0217デフォルトの名無しさん2012/10/11(木) 00:34:38.68
スタックでもヒープでもなく、初期化コードの必要性?で変わるとなると一気にわからなくなりました
どう理解すべきでしょうか?
0218デフォルトの名無しさん2012/10/11(木) 01:00:33.00
伝統的なメモリモデルは次の形をとる。
text+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
>>219
>初期化コードの内容によって宣言の仕方が変わる
適当な例を思い浮かべられないのだが?
0221デフォルトの名無しさん2012/10/11(木) 01:27:16.13
初期化/終了タイミングがどうでもいいならただのstatic変数、重要ならshared_ptrを使うみたいな感じ
0222デフォルトの名無しさん2012/10/11(木) 01:39:39.13
>>221
破壊のタイミングをしっかり管理したいときになんでshared_ptrなんだよ
0223デフォルトの名無しさん2012/10/11(木) 01:46:39.77
>>215
> 関数中のstatic変数はスタックでしょうかヒープでしょうか?
まず規格上の言語仕様にはスタック領域・ヒープ領域といった実装レベルの概念に対する規定はない
よって全てはコンパイラの実装に依存する
そしていまどきのPC用のコンパイラの実装であれば少なくともスタック領域ではないところに配置されると思っていい

> いわゆるシングルトンもそれと同じになると考えて問題ないですか?
いわゆるがGoF本でのシングルトンパターンのことなら関数中のstatic変数を使って実装することになるので当然同じになる
0224デフォルトの名無しさん2012/10/11(木) 02:05:48.90
>>222
少し考えればわかるよ
0225デフォルトの名無しさん2012/10/11(木) 02:15:29.60
>>224
知りたくもない話だ。
0226デフォルトの名無しさん2012/10/11(木) 06:35:58.65
>>201
*j に p を代入と言うのは、式で書けば *j=p と言う事だが、どこでそんな事をしている?

関数の引数で受けているところは、j=p 相当の処理だぞ?

int* j=p;
と同じね
0227デフォルトの名無しさん2012/10/11(木) 07:06:56.28
大昔の C での関数宣言を思い出したよ・・・

void f(j)
int *j;
{ ...
0228デフォルトの名無しさん2012/10/11(木) 07:11:41.02
そっちの宣言のが便利だよな
0229デフォルトの名無しさん2012/10/11(木) 07:35:11.67
仮引数並びが型情報を持たないことがか?
0230デフォルトの名無しさん2012/10/11(木) 09:50:47.44
>>215 >>217
「C言語 静的領域」でググってみれ

>>221
ねーよ

>>228
ねーよ
02312152012/10/11(木) 10:17:03.90
単純にスタック、ヒープ以外の領域がある、という理解でよさそうですね
ありがとうございます
0232デフォルトの名無しさん2012/10/12(金) 01:29:06.33
void Func(typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v1,
typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v2
typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v3) { 〜

このくそったれな宣言が↓これだけですむんだぞ。どうみてもこちらのが便利だろ

void Func(v1, v2, v3)
typename std::iterator_traits<hogehoge<TSomeClass>::iterator>::value_type && v1, v2, v3; { 〜
0233デフォルトの名無しさん2012/10/12(金) 01:45:41.39
>>232
君の好みに合う世界は金輪際実現しない
0234デフォルトの名無しさん2012/10/12(金) 02:55:15.25
>>232
そのかわり引数のプロトタイプチェックは皆無になる(はず)なのだが
0235デフォルトの名無しさん2012/10/12(金) 07:23:00.47
>>232 typedef は使えないの?
0236デフォルトの名無しさん2012/10/12(金) 19:34:51.55
>>232
苦笑
02372012012/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.19
>>203,205,210そして>>226と最初からみんなそういってたんだけどな
0240デフォルトの名無しさん2012/10/12(金) 21:44:35.24
ただ、紛らわしいことに
int * a, b;
は、aはintのポインタ型だけと、bはintだから注意な
*aがintになる型、と考えるといいのかもね
0241デフォルトの名無しさん2012/10/12(金) 22:21:11.43
>>240
不自然な仕様だよな
0242デフォルトの名無しさん2012/10/12(金) 22:23:11.11
>>240
ポインタは型ではないから後者が正解。
0243デフォルトの名無しさん2012/10/12(金) 23:03:25.34
>>242
typedefできるだろ?
0244デフォルトの名無しさん2012/10/12(金) 23:07:13.71
int* a,b;
0245デフォルトの名無しさん2012/10/12(金) 23:21:30.16
ttp://codepad.org/HDjLuFG3
0246デフォルトの名無しさん2012/10/13(土) 00:25:09.42
やっぱ 
int *a, b;
で何の問題もないじゃん。
0247デフォルトの名無しさん2012/10/13(土) 00:32:21.47
http://www.libjingu.jp/trans/bs_faq2-j.html#whitespace
0248デフォルトの名無しさん2012/10/13(土) 00:54:20.58
わかりやすいのが一番
0249デフォルトの名無しさん2012/10/13(土) 01:27:06.70
http://toro.open2ch.net/tech/
みんなこっち行こうず
IDあるほうがまだマシ
0250デフォルトの名無しさん2012/10/13(土) 02:06:24.78
>>249
そこは「しようず」が多くて気持ち悪い
0251デフォルトの名無しさん2012/10/13(土) 02:13:12.18
突っ込みどころ満載だし
早くも管理人行方不明じゃねーか
0252デフォルトの名無しさん2012/10/13(土) 02:15:22.27
どこの方言?
0253デフォルトの名無しさん2012/10/13(土) 02:26:48.69
2ch
0254デフォルトの名無しさん2012/10/13(土) 02:57:37.44
全員じゃないからな
0255デフォルトの名無しさん2012/10/13(土) 10:23:46.53
なんか偽ブランド品みたいで使いたくないな
アフィブログ用なんでしょ?そこ
0256デフォルトの名無しさん2012/10/13(土) 10:48:56.47
クラスメンバの関数ポインタのvector配列の文ってどうすればいいんですか?
void (Admin::*ElementSelect)();
というのが関数ポインタなんですけど
void vector <(Admin::*ElementSelect)()> ElementSelectAry;
になるんでしょうか?
0257デフォルトの名無しさん2012/10/13(土) 10:58:19.58
vector <void (Admin::*)()> ElementSelectAry;
0258デフォルトの名無しさん2012/10/13(土) 11:23:35.53
>>257
ありがとう
0259デフォルトの名無しさん2012/10/13(土) 11:42:51.67
素直にtypedef使えと
0260デフォルトの名無しさん2012/10/14(日) 12:44:11.91
DLL←→EXE間でクラスのやり取りするにはどないすればええんでっしゃろ?
0261デフォルトの名無しさん2012/10/14(日) 13:08:50.66
>>260
条件を限定しない一般論なら答えようがない
(あえていうなら一般論としてはやるな、になるけど)
0262デフォルトの名無しさん2012/10/14(日) 13:25:53.17
COM使え
0263デフォルトの名無しさん2012/10/14(日) 13:30:18.27
(あえていうなら一般論としてはやるな、になるけど)(キリッ
0264デフォルトの名無しさん2012/10/14(日) 17:04:33.67
std::array< std::array<int, 3>, 3 > MyArray = {
{
{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
>>264
添え字の範囲を超えないようにするとかで正しく使うなら何の問題もない
0267デフォルトの名無しさん2012/10/14(日) 19:13:20.71
うそ教えんな
0268デフォルトの名無しさん2012/10/14(日) 19:43:11.07
UDKは世界でダントツに採用の多いエンジン使ってるから
学習材料として使ってるのが多い
アセットを作ること自体意味があって、アセットストア頼りとか真のクソ
あとグラフィックコンテンツ的な作品に使われるのも多い
世界で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.92
どっちがどっち?
0270デフォルトの名無しさん2012/10/14(日) 20:19:26.45
>>264
初期化の内容が要素数越えたらgccじゃエラーになったよ
別に安全だと思う
0271デフォルトの名無しさん2012/10/14(日) 20:28:38.18
>>270
ありがと
0272デフォルトの名無しさん2012/10/15(月) 21:05:31.24
class bar{}

template<class T>
class foo :public bar{
void func(boost::shared_ptr<T>);
}

このときbar形のポインタにfooのオブジェクトをnewして、
そのポインタからfunk(...)をキャストせずに使うことは出来ますか?
0273デフォルトの名無しさん2012/10/15(月) 21:12:31.49
>>272
無理
0274デフォルトの名無しさん2012/10/15(月) 21:16:31.01
>>273
キャスト必要なんですかね?
0275デフォルトの名無しさん2012/10/15(月) 21:17:36.99
>>272
できません
0276デフォルトの名無しさん2012/10/15(月) 21:20:19.05
>>275
ありがとうございました
0277デフォルトの名無しさん2012/10/15(月) 21:26:14.11
ちょっとひねり加えれば出来るけど?
0278デフォルトの名無しさん2012/10/15(月) 21:39:00.54
まぁ、キャストでもできるけど、普通は仮想関数を使う
0279デフォルトの名無しさん2012/10/15(月) 22:16:34.58
>>278
仮装関数にしたいものの引数にテンプレート変数が入ってるんですよね…
設計ミスな気もします
0280デフォルトの名無しさん2012/10/15(月) 22:21:59.98
>>279
ん?
なるほど、ポイントはそこか
0281デフォルトの名無しさん2012/10/15(月) 23:31:42.40
>>277
無理だから
諦めて
0282デフォルトの名無しさん2012/10/15(月) 23:32:36.59
>>272
どうしてもそれに近いことをしたいなら、
引数を工夫するために宣言を変えてくれ
0283デフォルトの名無しさん2012/10/15(月) 23:40:42.78
>>272

struct a {};

template<class T> struct b : public a {
boost::shared_ptr<T> m;
何か
};

struct bar {
virtual void func(a&) = 0;
}

template<class T> struct foo : public bar {
virtual void func(a&arg) {
boost::shared_ptr<T> ptr = dynamic_cast<b<T>&>(arg).m;
}
}

main() {
b<int> x(何か);
bar* p = new foo;
p->func(x);
}
0284デフォルトの名無しさん2012/10/15(月) 23:41:54.37
やっぱり何か違うな。
a か b に機能を持たせて丸投げすべきか。
そもそもfooもbarも作り直して考え直すのが良いか。
0285デフォルトの名無しさん2012/10/16(火) 10:31:34.38
>>272
ttp://ideone.com/wSkTm
基礎設計はちょっと違うが(呼び出す時点では)キャストせずにfuncを使える
呼び出し側が引数の正当性を保障できるならdynamic_castの代わりにbar_に仮想関数を持たせずにstatic_castを使うこともできる
0286デフォルトの名無しさん2012/10/16(火) 12:45:48.03
>>285
逸脱し過ぎじゃないか?
0287デフォルトの名無しさん2012/10/16(火) 15:17:00.72
error LNK2001: 外部シンボル ""class A * m_ptest" " は未解決です。
fatal error LNK1120: 外部参照 1 が未解決です。
とかいうエラーがが直せません><

宣言はあるけど、定義はどこか分からない、とこういうエラーが出るらしいですけど、
該当部には
class A;前方宣言
extern A* m_ptest;エクスターンなんとか

m_ptest->func();←ここがエラー箇所
としていて、
別の箇所で
m_ptest = new A();
と定義をしているつもりなんですけど、どこか間違っているでしょうか?
0288デフォルトの名無しさん2012/10/16(火) 15:45:58.25
m_ptest->func();
この時点でclass Aの宣言が全部見えてる必要がある
0289デフォルトの名無しさん2012/10/16(火) 15:50:21.01
回答ありがとうございます。

class Aの宣言を書いたヘッダファイルをインクルードしてみたのですがNGでした。
0290デフォルトの名無しさん2012/10/16(火) 15:51:44.18
どっかのcppにA* m_ptest;って書いとく
0291デフォルトの名無しさん2012/10/16(火) 16:03:48.68
質問:今c++を勉強中でbcc developerを使っているのですが以下のコードでエラーが出る理由が分かりません。
エラー E2141 宣言の構文エラー と出ますが int main()の行なので間違いがあるとも思えず、困っています。
#include <iostream>
using namespace std;

int count(char str[], char ch)

int main()
{
char str[100];
char ch;
cout << "文字列を入力して下さい。\n";
cin >> str;
cout << "文字列から探す文字を入力して下さい。\n";
cin >> ch;
int c = count(str, ch);
cout << str << "の中に" << ch << "は" << c << "個あります。\n";

return 0;
}

int count(char str[], char ch)
{
int i = 0;
int c = 0;
while(str[i]){
if(str[i] == ch)
c++;
i++;
}
return c;
}
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.17
int count(char str[], char ch);
0294デフォルトの名無しさん2012/10/16(火) 16:10:30.87
class B {
A* m_ptest;
};
A* m_ptest;
上の二つは別物です
extern A* m_ptest;
は後者を指してるので定義がないとエラーになります
0295デフォルトの名無しさん2012/10/16(火) 16:12:21.01
>>293 解決しました!見逃していました、ありがとうございます。
0296デフォルトの名無しさん2012/10/16(火) 16:30:15.84
>>294
AはBを構成する部品の一つなので、包含関係かなと思って、
Aのインスタンスm_ptestをBのデータメンバとしていました。

ですが、Aのメンバ関数をBよりも外の箇所で使用したくて、
extern宣言、ヘッダファイルのインクルードなどで、なんとか出来ないかとしていたところ、
上記のエラーが出て困っていました。

全く別物を指していたとは・・・スコープというものでしょうか、
調べてみます。

回答いただきありがとうございました。
0297デフォルトの名無しさん2012/10/17(水) 09:42:10.60
>>279
そういうときはTypeEraserとNonVirtualInterfaceを併用することが多いね
インターフェースにテンプレートメンバ関数ライクな仮想関数を持たせたいときの典型的なパターンね
http://ideone.com/R7LtF
0298デフォルトの名無しさん2012/10/18(木) 20:02:12.02
なぁ、C++とかのオブジェクト指向プログラミングって
俺としては、もう慣れて「こういうもんだろ」ってな感じでやってるけど
要は、親玉(Objectクラス)は、子供(継承したクラス)の
情報をしってて、親玉から子供の情報を知りたい時にキャストして
子供の情報を得る。
ってな感じで良い?
まぁ、オブジェクト指向のなんたるかを語りだすと
色んな人が色んな例えして、どーでも良くなったりすんだけどね。
0299デフォルトの名無しさん2012/10/18(木) 20:37:13.28
コピペしなくていいよ
0300デフォルトの名無しさん2012/10/18(木) 20:41:45.86
>>298
お前の認識してるオブジェクト指向は全部間違ってる
0301デフォルトの名無しさん2012/10/18(木) 20:58:48.49
コピペは程々にな
0302デフォルトの名無しさん2012/10/18(木) 21:53:45.36
>>298
死ね初心者
0303デフォルトの名無しさん2012/10/18(木) 22:22:31.14
std::listで後ろの方の要素を前に持ってきたいときはどうすればいいですか?
例えばこんな感じです。

std::list<int> ls;
ls.push_back(1);
ls.push_back(2);
ls.push_back(3);
ls.push_back(4);
ls.push_back(5); 先頭(1)-(2)-(3)-(4)-(5)終わり
となってるところで、先頭(1)-(4)-(2)-(3)-(5)終わり、とやりたいです。
単純にリンクの張替えで出来ると思ったのですが、やり方がわかりません
0304デフォルトの名無しさん2012/10/18(木) 23:09:33.76
insertしてerase
0305デフォルトの名無しさん2012/10/18(木) 23:13:17.63
corutineの実装がいろいろあるけど
(Hamigakiとか)
GPUを使うOpenCVとかと混ぜたらうまく動かないってことでいいのでしょうか
0306デフォルトの名無しさん2012/10/18(木) 23:13:46.92
リンクの張り替えできないんだよね
ダサい仕様だが
0307デフォルトの名無しさん2012/10/18(木) 23:57:18.99
>>298
その方法は基底をホルダーにした型消去であってオブジェクト指向プログラミングと直接の関係はない
0308デフォルトの名無しさん2012/10/19(金) 00:03:16.48
非同期のMessageBoxを作って、タイムアウトしたら自動で閉じるなどの機能を実装しようと思っています。
自分で作ったウィンドウではなく、MessageBox関数を利用します。

そこでMessageBoxのウィンドウハンドルを取得したいのですが

1 CreateThreadで別スレッドを作成
2 別スレッドがMessageBox呼び出し
3 メインスレッドがEnumThreadWindowsで別スレッドのウィンドウを列挙
4 GetWindowTextでタイトル照合
 タイトルが一致するウィンドウがなければ3に戻る
5 取得したウィンドウハンドルは、タイムアウトしたらWM_CLOSEを送るなどに使用

CreateThreadで作成されたスレッドは
IMEが作ったウィンドウや、タイトルのないウィンドウが
あらかじめ作られているようで
タイトルによってはそれらと一致してしまうので
この手段が不確実です。

ウィンドウを列挙したり、文字列を比較するというのも
かなり無駄が多いです。

このような原始的な方法しか思いつかないのですが
他になにか良い方法はないでしょうか。
0309デフォルトの名無しさん2012/10/19(金) 00:07:26.41
>>303
list<int>::iterator i1(ls.begin()), i2(ls.begin());
ls.splice(++i1, ls, ++ ++ ++i2);
0310デフォルトの名無しさん2012/10/19(金) 00:14:34.04
Cのsscanfって、大文字小文字を無視する設定ってできないんでしたっけ?
sscanf(str, "ID%d", &id");
などとするとき、"ID100"からも"Id100"からも100を取り出したいのですが。
0311デフォルトの名無しさん2012/10/19(金) 00:37:42.79
>>308
GetWindowThreadProcessId 使えばいい
ウィンドウクラス名とプロセスID調べれば誤爆はしないでしょ
時間で閉じるメッセージボックスは公開されてないがuser32.dllにあった気がする
0312デフォルトの名無しさん2012/10/19(金) 07:05:22.00
>>310
一応 "%[Ii]%[Dd]%d" ってのはできる
0313デフォルトの名無しさん2012/10/19(金) 12:28:53.91
>>312
"%*[Ii]%*[Dd]%d"と読み飛ばしてしまえば医院で内科医。

>>310
要求仕様が厳密でないなら↑の方法で。
厳密ならば("Id"や"iD"を許容しない)ならsscanf()一回だけでは無理。
0314デフォルトの名無しさん2012/10/19(金) 13:26:19.97
条件分枝構文って
if else
swich
しかないのでしょうか
boostやstlでもっと複雑なことのできる条件分枝はないのでしょうか
0315デフォルトの名無しさん2012/10/19(金) 13:37:41.16
3項演算子もwhile文もdo - whileもある意味条件分岐だろ
0316デフォルトの名無しさん2012/10/19(金) 13:49:48.85
変数の実行時の型で分岐するポリモーフィズムはどうっすか
0317デフォルトの名無しさん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.25
>>317
C++では同じ名前で引数が異なる関数は作れますが、ローカル関数が作れません
Cではローカル関数は作れますが、同じ名前で引数が異なる関数が作れません
よって作れません
0320デフォルトの名無しさん2012/10/19(金) 14:44:40.03
どうしたらこのスレに書かれてることを理解できるレベルに到達できますか?
初心者向けの本は勉強したけど、全然わかりません。
やさしいC++をひと通りコード書いて理解しました。

int main(void)

とか、int main の中に何か入ってるものは何を意味してるのか分からないし
operator関数も難しいです。
0321デフォルトの名無しさん2012/10/19(金) 14:44:58.51
>>315
論理演算子もある意味条件分岐。

>>317
C++ならね。
0322デフォルトの名無しさん2012/10/19(金) 14:49:36.51
>>321
C++でも出来ねぇって

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.61
std::cout << "ほげ";
std::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.84
試しに
char b[] = {0x30, 0x7B, 0x30, 0x52, 0x00, 0x00}; //ほげ UTF-16BE
std::cout << b;
ってしてみたら
0325デフォルトの名無しさん2012/10/19(金) 15:13:18.13
Cでもローカル関数は定義できない
ただしGCCとかの独自拡張ならできる
独自拡張ならば同名で引数が異なるローカル関数が定義できる処理系もあるかもね
0326デフォルトの名無しさん2012/10/19(金) 15:13:25.90
>>320
正直、使ってみないと覚えない。

難しいとよく言われるCのポインタだって、勉強中はサッパリでも
実際に必要な場面を迎えると案外簡単に使えたりする。

あと、このスレに限らず、技術系のコミュニティって、
半分も理解してないけど参加してる、自分が混ざれる話題にだけ混ざるって人は多いよ。
0327デフォルトの名無しさん2012/10/19(金) 15:32:45.86
class Interface {
public:
virtual void Release(void) = 0;
};

class Hoge : public Interface {
public:
void Release(void) { delete this; }
};

extern "C" __declspec(dllexport) IHoge * __stdcall Create(void) {
return new (std::nothrow) IHoge;
}

---------------

extern "C" __declspec(dllimport) IHoge * __stdcall Create(void) ;


これってDLLとEXEでvtableの構成が変わっちゃうかも、とか気にしなくていいの?
0328デフォルトの名無しさん2012/10/19(金) 16:38:16.98
ハンドルとしてクラスのポインタを返す・ハンドルを受けて(中でクラスに戻して)操作
EXE側は ハンドルの中身をほぐしてクラス動作させることはない
という切れ目で DLL化したことはあるけど

class そのもののエクスポートが必要な要求っぽいね
(EXE側で ポインタ参照〜クラスのメソッドを呼び出したい)
0329デフォルトの名無しさん2012/10/19(金) 16:44:05.10
>>327
CreateがIHoge*でなくInterface*を返して、
DLLとEXEでInterfaceを変更しなければ大丈夫じゃね

dllimport側でHogeはincludeしない(使わない)なら
dllexport側のHogeは変更してOK
0330デフォルトの名無しさん2012/10/19(金) 16:53:10.19
#ifdef HAVE_CPP11
とか
#ifdef HAVE_CPP0X
みたいなことってできないの?
0331デフォルトの名無しさん2012/10/19(金) 17:00:55.05
>>330
その処理系が11に対応してれば、オプションで変更可能になってる場合もあるんでね?
0332デフォルトの名無しさん2012/10/19(金) 17:07:01.56
#if 201103L <= __cplusplus で出来ることになってるけど過渡期の現状ではいまいち
boostならBOOST_NO_CXX11_〜系のマクロで機能ごとに判別できる
0333デフォルトの名無しさん2012/10/19(金) 17:18:30.55
vba用のdllをつくっています。C初心者です。
値をdllに渡して処理したあと、グローバル変数に値を入れておいて、
vbaから読み込みのフラグが立ったらその変数を戻すようにしているのですが、
グローバル変数は呼び出し速度が遅い等ネットで見かけます。

グローバル変数を回避して、ローカル変数のみで同様のことをするには
ざっくりどんなことをすればいいのでしょうか
0334デフォルトの名無しさん2012/10/19(金) 17:26:40.62
handle = open();
proc(handle, p1, p2...);
v = get(handle);
close(handle);
的な感じにするとか
0335デフォルトの名無しさん2012/10/19(金) 17:26:57.06
今度はけっこう前のスレからコピペしてきたな
0336デフォルトの名無しさん2012/10/19(金) 17:37:23.39
math.hのsin()を使う場合と、
float fsin = 0;
_asm{FLD DWORD PTR DS:[fsin]
FSIN
FSTP DWORD PTR DS:[fsin]}
を使う場合では、どちらが高速ですか?
0337デフォルトの名無しさん2012/10/19(金) 17:41:32.98
>>336
環境次第。
例えばSSEが使える状況なら、FPUを使うのは高コスト。
また、math.hのsin()ならコンパイラが勝手にFPU版なりSSE版なり使い分けてくれる可能性がある。
0338デフォルトの名無しさん2012/10/19(金) 17:41:36.73
>>303,305,308,310,314,317,320,323,327,330,333,336
何がしたいんだかわからんけど
http://toro.2ch.net/test/read.cgi/tech/1323692486/
全部ここからのコピペだから相手にしなくていいよ
0339デフォルトの名無しさん2012/10/19(金) 17:43:07.52
>>336
そりゃFPUを直接叩けば一番速いだろうけど、ライブラリは少しでも誤差を少なくするために
いろいろ工夫してるから速度と精度は必ずしも両立しないな
0340デフォルトの名無しさん2012/10/19(金) 17:52:23.79
>>338
それでも回答したがる自己顕示欲の強い奴がいかにム板に多いかってことが改めて浮き彫りになったなw
0341デフォルトの名無しさん2012/10/19(金) 17:53:02.70
class Hoge
{
int mHoge;
virtual void hoge(void) = 0;

void test(int Num) {
mHoge = Num;

}
};

みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、

関数testの実体はインスタンスの数だけ存在するのでしょうか?
0342デフォルトの名無しさん2012/10/19(金) 18:05:53.60
コピペだと分かってたら回答してないんじゃないの?
0343デフォルトの名無しさん2012/10/19(金) 18:08:17.26
しばらくは
「みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、」
のような問題文の一部でググってからレスした方が良さそうだね

健気に文言を変えてコピペしてくるかな?
0344 ◆QZaw55cn4c 2012/10/19(金) 20:07:17.65
ローカル関数?
C99にはあるのか?
0345デフォルトの名無しさん2012/10/19(金) 20:57:11.80
>>327
これが正解

// DLL
struct Hoge { void Method(void); } ;
extern "C" __declspec(dllexport) void * WINAPI Hoge_Create(void) { return new (std::nothrow) Hoge(); }
extern "C" __declspec(dllexport) void Hoge_Method(void * obj) { ((Hoge *) obj)->Method(); }
extern "C" __declspec(dllexport) void Hoge_Delete(void * obj) { delete (Hoge *) obj; }

// EXE
extern "C" __declspec(dllimport) void * WINAPI Hoge_Create(void);
extern "C" __declspec(dllimport) void Hoge_Method(void * obj);
extern "C" __declspec(dllimport) void Hoge_Delete(void * obj);

class Hoge {
shared_ptr<void> p;
public:
Hoge(void) : p(Hoge_Create(), Hoge_Delete) {}
void Method(void) { Hoge_Method(p.get()); }
};
0346デフォルトの名無しさん2012/10/19(金) 21:00:22.01
>>319
C++でもローカル関数のようなものは作れる
C++11ならラムダで、これは本当にローカル関数と言っていいもの
C++03でもローカルクラスのstaticメンバ関数くらいなら作れる(ローカル変数に触れないけど)
0347デフォルトの名無しさん2012/10/19(金) 21:30:19.62
コピペにマジレスかっこいい!
0348デフォルトの名無しさん2012/10/19(金) 21:37:27.68
ラムダは関数オブジェクトだから
「本当にローカル関数と言っていい」というほどのものじゃないな
0349デフォルトの名無しさん2012/10/19(金) 21:41:31.38
引数もキャプチャも無しなら関数ポインタに変換はできるが
ローカルクラスのstaticメンバ関数で十分
0350デフォルトの名無しさん2012/10/19(金) 23:32:31.06
>>341,>>345
hoge厨はプログラム以前の問題だから失せろ
0351デフォルトの名無しさん2012/10/19(金) 23:48:29.86
foo, bar, baz
0352デフォルトの名無しさん2012/10/20(土) 00:15:02.23
baka
0353デフォルトの名無しさん2012/10/20(土) 00:31:47.37
どーでも良い
0354デフォルトの名無しさん2012/10/20(土) 01:11:27.83
志が低いのね
いつか英語でソースコードやドキュメントを用意しなければならないとき、
hogeでは、わからないだろ
0355デフォルトの名無しさん2012/10/20(土) 01:20:32.65
hogeが何語かも知らない素人が増えてるよな
0356デフォルトの名無しさん2012/10/20(土) 01:23:47.49
>>354
hogeも翻訳すればいいだろ >>351
0357デフォルトの名無しさん2012/10/20(土) 02:28:51.06
hageは死ぬべき
0358デフォルトの名無しさん2012/10/20(土) 09:12:21.20
>>350
弾幕薄いよ、なにやってんの
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.18
Rメープルじゃなくてゴールドピアスの方出ろよ
0361デフォルトの名無しさん2012/10/20(土) 15:54:29.33
\r\n の替わりに \0\0 入れとけット。
0362デフォルトの名無しさん2012/10/20(土) 18:20:45.76
#include <cstdio>

int main () {
printf("%d", max(3,5));
}

$ g++ ./test.cc

とすると./test.cc:6: error: `max' was not declared in this scopeと言われてしまいます。
ぐぐるとg++には標準でmax関数は存在するようなのですが、どうしてなのでしょうか?
お知恵を拝借させてください。
0363デフォルトの名無しさん2012/10/20(土) 18:33:35.79
g++は使ったことがないので分からんが、
「標準で用意されている」と「何もインクルードせずに使える」を勘違いしてるんじゃないかと思う。

たぶんalgorithmヘッダ?
0364デフォルトの名無しさん2012/10/20(土) 18:36:09.55
>>351
nyarl, yog, fhtagn
0365デフォルトの名無しさん2012/10/20(土) 19:09:24.92
>>363
できました!
ありがとうございます。
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
>>362
> ぐぐるとg++には標準でmax関数は存在するようなのですが、

大嘘。
libstdc++にはあるかもしれないが別物。
0368デフォルトの名無しさん2012/10/20(土) 19:36:23.10
>>366
ttp://ideone.com/HjcMvJ
0369デフォルトの名無しさん2012/10/20(土) 19:57:17.92
>>367
std::maxなら標準だぞ
0370デフォルトの名無しさん2012/10/20(土) 20:49:12.65
>>367
03
> // 25.3.7, minimum and maximum
> template<class T> const T& min(const T& a, const T& b);
> template<class T, class Compare>
> const T& min(const T& a, const T& b, Compare comp);
> template<class T> const T& max(const T& a, const T& b);
> template<class T, class Compare>
> const T& max(const T& a, const T& b, Compare comp);

11
> // 25.4.7, minimum and maximum:
> template<class T> const T& min(const T& a, const T& b);
> template<class T, class Compare>
> const T& min(const T& a, const T& b, Compare comp);
> template<class T>
> T min(initializer_list<T> t);
> template<class T, class Compare>
> T min(initializer_list<T> t, Compare comp);
(maxは省略)
0371デフォルトの名無しさん2012/10/20(土) 21:44:06.60
>>370
なにそれ
g++の仕様書?
0372デフォルトの名無しさん2012/10/20(土) 21:48:51.81
g++とlibstdc++についての話だからC++の規格は関係ないよな
0373デフォルトの名無しさん2012/10/20(土) 22:01:04.76
>>368
ありがとうございます!うまく動きます。

template<std::size_t N>
int length(int (&ary)[N])
と書けばNに要素数が入るのですね。
何故そうなるのかわからないです・・・。
int (&ary)[N]とはどういう意味なのでしょうか?
0374デフォルトの名無しさん2012/10/20(土) 22:27:22.99
配列の参照
0375デフォルトの名無しさん2012/10/20(土) 22:44:55.05
既存のものの参照を得る時に&は使って
引数で受け取る時には*を使う物だと思っていました。
何故&なのかよくわからないです。
0376デフォルトの名無しさん2012/10/20(土) 22:47:50.27
画像のサイズをwidth*heightで表示したいのですが
MoveWindow(他, widh,height 他,)とするとウインドウ自体のサイズになってしまうのですが
ウインドウの枠のサイズなどを足し引きしないといけないと思うのですがどうすればいいでしょうか?
0377デフォルトの名無しさん2012/10/20(土) 22:49:14.42
AdjustWindowRect
0378デフォルトの名無しさん2012/10/20(土) 22:51:18.61
末尾再帰の最適化なんですが、以下の2つの関数をg++ 4.4.3 (64bit)で-O2でコンパイルしたところ
func()は最適化されてるのにfunc1()は最適化されませんでした。なんででしょうか。

unsigned long long func(unsigned long long a) {
if (a == 1 || a == 0) { return 1ULL; }
else { return a * func(a - 1ULL); }
}

double func1(double a) {
if (a < 1.001) { return 1.0; }
else { return a * func1(a - 1.0); }
}

最適化されてるかどうかは、アセンブラ読めないんで、ネットを参考にして、それぞれの呼び出しの前後でスタックがどれくらいつかわれてるか
(あらかじめスタックの下の方に0xCCCCCCCCを書いておいて呼び出しが終わった後にそれが残ってるか
をチェック)をしました。
どうかよろしくお願いします。
0379デフォルトの名無しさん2012/10/20(土) 22:53:09.95
>>378
ttp://qarc.info/qa/show-9865-747.html
0380デフォルトの名無しさん2012/10/20(土) 23:11:11.86
関数定義の引数部分でint& などとすると参照渡しになるのですね。
呼び出し側で&hogeではなくhogeでよくなるようでした。

うーん、しかし何故>>366はうまく動かないのでしょうか。
呼び出し元では配列の長さが分かるものの、
関数呼び出し先では配列の長さの情報は消えてしまうのでしょうか?
0381デフォルトの名無しさん2012/10/20(土) 23:14:56.08
エラーについて質問です。

bool Dummy::Hoge(std::vector<BYTE> &buffer){
DWORD ReadByte;
BYTE *pBuffer = &buffer[0];
foo(pBuffer, ReadByte);
if(ReadByte > 0)
{
return true;
}
return false;
}

元のソースから部分だけ引っ張ってきたものですが、
“BYTE *pBuffer = &buffer[0];”の部分で
Expression: vector subscript out of range
というエラーが出てしまいます。
こちらのソース自体が2002年ぐらいに作られたらしく、
Webで同様のエラーを探した際もVS2003までは通ってたという記述がありました。
どうやらvector::operator[]がエラーを出していることまではわかったのですが、
そこから先の対処がわからずにいます。
こちらの関数と同様な形で引数として使うので、
エラーにならないようvector<BYTE>からBYTE*に渡せればいいのですが、
どういった対応がありますでしょうか。
よろしくお願いします。
0382デフォルトの名無しさん2012/10/20(土) 23:48:13.56
>>380
簡単に言うと関数の引数宣言では配列を宣言してもポインタの宣言に変換される
 int length(int ary[])
が
 int length(int *ary)
になる。
ポインタほもちろんポインタであって配列の長さの情報は含まれない。
0383デフォルトの名無しさん2012/10/20(土) 23:54:29.79
>>362
標準C++のmaxを使うなら

#include <cstdio>
#include <algorithm>

int main () {
printf("%d", std::max(3,5));
}
0384デフォルトの名無しさん2012/10/21(日) 00:04:47.32
>>382
呼び出し元で使われている、その配列の長さの情報はどこに格納されているのでしょうか?
0385デフォルトの名無しさん2012/10/21(日) 00:05:46.25
コンパイラだけが知ってる
0386デフォルトの名無しさん2012/10/21(日) 00:22:31.69
>>381
Hogeとか使ってるクズには無理
0387デフォルトの名無しさん2012/10/21(日) 00:31:52.05
>>364
前に会社で、テストユーザ名にそんなの並んでたわ
こっそり別の神様追加して帰ったけど
0388 ◆QZaw55cn4c 2012/10/21(日) 01:41:09.39
貧乏神でよければ私も追加してください
0389デフォルトの名無しさん2012/10/21(日) 03:18:19.41
>>381はhogeを覚える暇はあっても調べる暇はないマジキチ
0390デフォルトの名無しさん2012/10/21(日) 03:22:08.04
hogeの本当の意味を知らない子供が増えた
0391デフォルトの名無しさん2012/10/21(日) 03:50:21.59
>>384
配列が配列として解釈されるのはコンパイル時点までで、
実行時はただのアドレスとして処理される、だったような。
例えばint a[10];とした時にアドレス0x0100が振られたとして、
配列宣言したaで参照した場合は配列であると解釈されるが、
aというラベル以外で参照した場合(int *pa=a;としたpa)は、
ただのアドレスとして解釈されるので配列サイズとの関連付けがされない。
ほら、ポインタと違って配列宣言した変数のアドレスって途中で変更できないじゃん?a="abc";みたいに。
だから宣言したaは確実に宣言時点の配列をさしてると保障されるから、コンパイラも安心して配列として解釈できると。
実際、int a[10];int *pa=a;printf("%d %d\n", sizeof(a), sizeof(pa));とした場合、結果は"40 4"となる。
その情報がどこに格納されてるかっていうと、コンパイル時点でsizeof(a)は数字の40に変換してexe出力されるので、
実行時点では”配列サイズ”としての情報は保持されてないの。だからコンパイル中の一時記憶でしかないのよ。
先に書いた通りポインタ参照の場合は実行時に変更可能だから40の決め打ちできなくて4にするしかないのね。
sizeofは普通の関数じゃないのね。記述もsizeof aで通るでしょう?
sizeofの括弧は関数の括弧じゃないのよ。これ豆知識ね。
0392デフォルトの名無しさん2012/10/21(日) 04:20:40.19
>>391
君に「読みにくく書く」才能を認める
0393デフォルトの名無しさん2012/10/21(日) 04:39:15.40
>381=基地害hoge厨
0394デフォルトの名無しさん2012/10/21(日) 05:01:48.73
企業内でしか使わない業務用システム。
数少ない正社員プログラマーの一人が
住所入力の都道府県名を格納する文字列変数の
初期値として「hage」を代入するプログラムを書いた。
あとで聞いたら警告を消すためだったそうだ。
そいつは「hoge」と書いたつもりだったらしい。
その後の話は悲惨すぎて省略。
0395デフォルトの名無しさん2012/10/21(日) 05:43:12.71
都道府県が増える可能性を排除しきれないのでxmlから都道府県リストを読み込む仕様とした。
0396デフォルトの名無しさん2012/10/21(日) 05:47:00.18
>>395
都道府県が増減するよりも前に
道州制が導入されて住所の書式が変化すると予想されるため
書式ルールも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.71
東北はいつでも消せるように作らないとな
0401デフォルトの名無しさん2012/10/21(日) 06:51:15.78
福島括りを嫌って会津県で独立する可能性もあるじゃん
0402デフォルトの名無しさん2012/10/21(日) 07:05:01.44
そもそももうしばらくしたら日本は中国韓国ロシアに解体分譲されて無くなるし
0403デフォルトの名無しさん2012/10/21(日) 07:42:17.55
>>387
やっぱり神様の名前からか……
nyarlがニャル子(ニャルラトホテプ)っぽかったから怪しいと思っていたが
04043662012/10/21(日) 08:14:56.26
>>391
分かりやすかったです。sizeofはマクロみたいなものなのですね!
template<std::size_t N>
int length(int (&ary)[N])
でlength(ary)と呼び出すだけでNに配列要素数が入る仕組みがよくわかりません。

テンプレート関数の異型
ttp://homepage2.nifty.com/well/Template.html#TEMPLATE_FUNCTION_WITH_INTRINSIC_VARIABLE_PARAMETERS

template<int iV>
int Add(int iValue) {
return iValue + iV;
}
int main() {
int iValue = Add<3>(2); // 2 + 3 が返されます。
printf("iValue = %d\n", iValue); // 答えは 5 になります。
return 0;
}

↑この用法なのかなと思い、length呼び出しは<>の部分が推定されているのかと思いました。
しかし試しにlength<3>(ary)としてみるとno matching function for call to `length(int [4])'と言われてしまいました。
0405デフォルトの名無しさん2012/10/21(日) 10:11:55.44
>>404
> ↑この用法なのかなと思い、length呼び出しは<>の部分が推定されているのかと思いました。
これはそのとおり

> しかし試しにlength<3>(ary)としてみるとno matching function for call to `length(int [4])'と言われてしまいました。
これは配列の参照の初期化と関数のオーバーロード解決が関係する
 int a[4];
 int (&x)[4] = a; // 初期化できる
 int (&y)[3] = a; // 初期化エラー、要素数が合わない
また
 void ary(int (&x)[3]) {} // (1)
 int a[4];
 ary(a); // 引数が初期化できないから(1)のaryはこの呼び出しに対して不適切なので対象にならない
     // 他に適切なaryがなければ呼び出し可能な関数がないのでエラー
0406デフォルトの名無しさん2012/10/21(日) 10:36:31.80
>>391
あまりいい加減な事は言わないように

単に、配列はポインタを必要とする箇所では
ポインタへと暗黙変換が行われるというだけ
それ以外ではそのような変換は行われない

例えば配列へのポインタを使用する場合やsizeofを使う時など
配列は配列のまま扱われる

int a[10];
int (*p)[10] = &a; // 配列へのポインタ

そしてsizeofは演算子
普通の関数じゃないどころか、関数ですらない
あと、型のサイズを取得する場合は括弧が必須ね
0407デフォルトの名無しさん2012/10/21(日) 11:37:54.91
404>391だね
0408デフォルトの名無しさん2012/10/21(日) 11:57:53.60
スレッドを使いたくて
A classのprivateで
DWORD WINAPI ThreadFunc(LPVOID vdParam);
void thread();
として
DWORD WINAPI A::ThreadFunc(LPVOID vdParam){Aのprivateメンバなどを使った処理}
void thread(){CreateThread(NULL,0, &A::ThreadFunc,NULL, 0, &dwThreadId);}
という風にしたのですが
A::ThreadFunc' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。
CreateThread' : 3 番目の引数を 'DWORD (__stdcall A::* )(LPVOID)' から 'LPTHREAD_START_ROUTINE' に変換できません。
となります。どうすれば良いのでしょうか?
0409デフォルトの名無しさん2012/10/21(日) 12:03:44.01
https://www.google.co.jp/search?q=%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89+%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0
0410デフォルトの名無しさん2012/10/21(日) 13:09:42.89
staticにすればいいよ
0411デフォルトの名無しさん2012/10/21(日) 14:57:45.61
>>408
> A::ThreadFunc' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。

こんなレベルの奴がマルチスレッドとかやるなよ…
0412デフォルトの名無しさん2012/10/21(日) 15:15:57.90
4人のチャンコロが4本の箸で飯を食うのは不衛生極まりないことを理解できない奴はマルチスレッドに手を出すべきではない。
0413デフォルトの名無しさん2012/10/21(日) 15:19:01.68
>>412
腹痛でトイレがデッドロックですね。分かりま・・・いや、あいつらなら問題ないか。
0414デフォルトの名無しさん2012/10/21(日) 15:20:07.67
4本…?
0415デフォルトの名無しさん2012/10/21(日) 15:44:15.72
そう、4膳ではなく4本。
つまり、2人が食い続けると2人が飢え死にするわけ。
04163662012/10/21(日) 16:46:08.27
>>405
なっるほどー!例が分かりやすかったです。
int (&x)[3]にint a[4]を代入出来ないというのが味噌ですね。

template<std::size_t N>
int length(int (&ary)[N]) {}
で<>を省いた時に、特にその関連性を示しているわけでも無いのに、
aryの要素数が自動でNに格納されるのが不思議だと思いました。
これはもう慣れの話でしょうか。
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.07
>>417
http://www.kouno.jp/home/c_faq/c6.html
0420デフォルトの名無しさん2012/10/22(月) 14:47:24.77
開発環境:VC++2008
質問:std::ifstreamのread関数でstd::stringにファイルの読み出しを行いたい

read関数の第一引数(データの受け取り)にchar*を渡す必要があり、
string型でchar*に相当するものを考えると、むしろそのまま変数を渡すくらいかと思ったのですが、
当然型が違うのでコンパイルが通りません。

当たり前かもしれませんが、強引に&string[0]のように渡しても、コンパイルこそ通れどうまく動きません。

const char*に関してはc_str()関数を使えば問題ないのですが
char*を要求されたときstring型で上手く実現する方法を教えていただきたいです。
0421デフォルトの名無しさん2012/10/22(月) 14:49:24.29
>>420
ttp://qarc.info/qa/show-9865-809.html
0422デフォルトの名無しさん2012/10/22(月) 15:28:51.47
横から質問失礼
グローバル変数をやむなく使うというのは例えばどういう状況でしょうか
自分は結構頻繁に使ってましたorz
0423デフォルトの名無しさん2012/10/22(月) 15:35:11.94
>>422
ブロックを抜けたら寿命が尽きても構わない→自動変数
スコープはブロック内で充分→ブロック内静的変数
スコープは関数内で充分→関数内静的変数
スコープは関数外にまで拡げたい→翻訳単位内静的変数
翻訳単位外からは関数経由でアクセスできると言っても納得せず、
どうしても公開せよと迫られる→グローバル変数
0424デフォルトの名無しさん2012/10/22(月) 15:36:07.51
コード記述時は未確定だけど
アプリケーション起動時に(設定ファイル等から)確定する定数とか
0425デフォルトの名無しさん2012/10/22(月) 15:38:54.90
シングルトンでまとめてるけど、広い意味でグローバル変数と同等だと考えてる
0426デフォルトの名無しさん2012/10/22(月) 15:51:19.75
void myPrint(const char *str) // char のポインタを受け取るだけ
{
printf("%s", str);
}

int main()
{
myPrint("ABCDE"); // その1:const 文字"列の先頭"の、アドレスを渡している

char foo[] = "XYZ"; // その2:char 配"列の先頭"の、アドレスを渡している
myPrint(foo);

char *bar = foo; // その3:その2の配"列の先頭のアドレス"を、コピーしてから渡している
myPrint(bar);

myPrint(&(*bar)); // その4:意味は無いがその3のポインタが指す先のアドレスを渡している
// ※その4での動きは、 bar はポインタ変数、*bar はポインタ変数が指している何か、
// &(*bar) は、ポインタ変数が指している何かのアドレス=ポインタ変数に格納されているアドレス
return 0;
}
0427デフォルトの名無しさん2012/10/22(月) 16:28:08.65
>>422
マルチスレッドのプログラムかなぁ
0428デフォルトの名無しさん2012/10/22(月) 16:39:44.10
stdoutやerrnoがグローバル変数であるケースは結構ある。
むしろマルチスレッド対応で関数になってたりするけど。
0429デフォルトの名無しさん2012/10/22(月) 17:26:55.06
C言語ですが、
配列の要素数の宣言に変数は使用できませんよね?

gcc(MinGW?)では可能と聞いたのですが、本当ですか?
またそれによって実行ファイルが環境に依存することはありますか?
0430デフォルトの名無しさん2012/10/22(月) 17:29:38.65
C99では出来るしgccはC99をかなり取り入れてるしgcc独自の拡張もあるし
どれの事を言ってるのかはっきりしないと答えようがない
0431デフォルトの名無しさん2012/10/22(月) 17:54:00.33
C99なら配列の要素数の宣言に変数が使える
それによって実行ファイルが環境に依存することはありえる
まあそんな処理系知らないけど
0432デフォルトの名無しさん2012/10/22(月) 23:14:18.88
>>429
LSI-C試食版でコンパイルできない。
0433デフォルトの名無しさん2012/10/22(月) 23:16:58.11
gcc独自拡張に、配列の添字に変数が使えるようになる機能がある。だから、本当
0434デフォルトの名無しさん2012/10/23(火) 00:30:33.69
C89だと無理だが、gcc独自拡張があればイケる
C99ならどのコンパイラでもいけるがC99非対応のコンパイラじゃ無理
0435デフォルトの名無しさん2012/10/23(火) 00:38:15.00
誰かが大きさを実行時に決められる自動配列はalloca()の糖衣構文だと言っていたなあ
0436デフォルトの名無しさん2012/10/23(火) 03:10:44.27
http://pc12.2ch.net/test/read.cgi/tech/1267775473/626
コピペ元を少しずつ古いスレにしてるのが笑える
0437デフォルトの名無しさん2012/10/23(火) 09:20:43.08
みえない
0438デフォルトの名無しさん2012/10/23(火) 10:42:13.71
>>432
今時そんな骨董品を使う方がどうかしている。
0439デフォルトの名無しさん2012/10/23(火) 11:11:56.07
パソコンとはかぎらない
0440デフォルトの名無しさん2012/10/23(火) 23:10:58.59
C++の拡張子なにつかってる?
cppがデファクトスタンダードだと思うんだがgoogleのスタイルガイドだとccだた
0441デフォルトの名無しさん2012/10/23(火) 23:27:17.32
cpp/cxx/cpはともかくccの2つ目のcはどこから来たんだよ
C with Classes の名残とかだったらいい加減やめようや
0442デフォルトの名無しさん2012/10/23(火) 23:29:41.30
むしろcpp以外になる理由が知りたい
0443デフォルトの名無しさん2012/10/23(火) 23:33:12.36
c++の+を45度回転
cxx
0444デフォルトの名無しさん2012/10/23(火) 23:34:32.70
Cのプログラムのファイルの拡張子は、
.c
.h

C++の拡張子は、いろいろある。
.C
.c++
.cc
.cp
.cpp
.CPP
.cxx
.h
.h++
.hh
.hp
.hpp
.hxx
0445デフォルトの名無しさん2012/10/23(火) 23:35:19.51
Cをインクリメントしたら2つになったとか?
cppはどうしても、プリプロセッサを想像してしまうんだよな。
0446デフォルトの名無しさん2012/10/23(火) 23:37:19.56
プリプロセッサなら.hの方を思い出すのが普通な気も……
>>444
大杉ワロタw
0447デフォルトの名無しさん2012/10/24(水) 00:10:38.80
.c++は見たことないな
0448デフォルトの名無しさん2012/10/24(水) 10:10:10.45
>>446
#include とか #if とかのプリプロセス処理の展開を済ませた中間ファイル的だね って意図じゃない?
0449デフォルトの名無しさん2012/10/25(木) 23:42:52.63
ヘッダファイルでstring型の変数宣言するときに、そのヘッダファイルに#include <string>を書くべきでしょうか?
かなり初歩的な質問ですまん
0450デフォルトの名無しさん2012/10/25(木) 23:59:28.40
stringはよく使うから
プリコンパイルヘッダファイルが使えるなら
そっちでincludeした方がいい

使えないならそのヘッダファイルに書いた方がいい
そのヘッダファイルでincludeしてる別のヘッダファイル内でたまたまincludeされていて
そのヘッダファイルでstringをincludeしなくてもコンパイルが通る事もあるけど、
その別のヘッダファイルの内容が変更される可能性を考えると
自分でincludeした方が無難
(その別のヘッダファイルというのが標準ヘッダファイルであっても、
 コンパイラを変更したらコンパイル通らなくなったとかよくある事)
0451デフォルトの名無しさん2012/10/26(金) 00:01:40.77
>>450
ありがとうございます
0452デフォルトの名無しさん2012/10/26(金) 00:30:54.93
でも明らかにstringを使っていないと破綻するクラスのヘッダをインクルードした場合は
無理に自分でインクルードする必要は無いと思われ
0453 ◆CAERF1YrA. 2012/10/26(金) 10:32:53.94
DOS窓でWriteConsoleOutputを使い文字を出力しています

char c[3] = "▲";
ci[0].Char.AsciiChar = c[0];
ci[1].Char.AsciiChar = c[1];
ci[0].Attributes = 4;
ci[1].Attributes = 0;

みたいに半角ずつ色を変えて表示したいのですが、
winXPではうまくいきますが、win98では両方[0]の色になってしまいます

解決方法がありましたら教えてください
0454デフォルトの名無しさん2012/10/26(金) 10:38:30.81
WriteConsoleOutputW
0455 ◆CAERF1YrA. 2012/10/26(金) 12:37:38.24
>>454
ありがとうございます
それはWriteConsoleOutputのワイド文字版みたいですね
AsciiCharに入力すると、XPでは別の半角文字に変わり、
UnicodeCharに入力すると、XPでは全角+半角の3文字分表示され、
98ではどちらに入力しても表示されませんでした
0456デフォルトの名無しさん2012/10/26(金) 14:02:32.55
98 のテスト環境なんてもう持ってないな
なんでそんなの使ってんの?
0457 ◆CAERF1YrA. 2012/10/26(金) 16:21:40.37
>>456
XPメインで98はテストですね
コンソールゲームは古い技術だと思うので、
古いマシンでも同じように動いて欲しくてテストしています
0458デフォルトの名無しさん2012/10/26(金) 18:46:38.87
ofstreamまたはifstreamでファイルが開けなかった時にcloseする必要ってありますか?

// 例
ofstream ofs("test.txt");
if (ofs.fail()) {
  ofs.close(); // ←これ
}
0459デフォルトの名無しさん2012/10/26(金) 20:07:24.70
>>453
ttp://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/game1/m100.html
まずはこの辺のサンプルが手持ちの98環境で動くか確認してみたら?
04604592012/10/26(金) 20:09:15.29
>>453
ごめん、全角1文字を半分ずつ色を変えたいのか。ちゃんと読んでなかったわ。
0461デフォルトの名無しさん2012/10/27(土) 01:36:09.35
>>458
開いてないものを閉じることが出来ると思ってるのか?
まあ開いてないファイルストリームを閉じようとしても失敗するだけなんで別にいいけど
0462デフォルトの名無しさん2012/10/27(土) 03:13:53.30
>>458
その例だと>>461の通りだけど
ttp://ideone.com/ouBVuh
の例1のように既にファイルAを開いているfstream fsに対してファイルBをopenすると
Bのopenに失敗してfsのfailbitは立つけれどAはopenのまま
つまりfail()==trueでもfsがNULLとは限らない

(あまりないだろうけど)fsを使いまわす場合は例3のように
一度closeしてからopenしなければならない

またopen/closeに失敗したときのfailbitのsetstateはfstreamのopen/closeで行なわれるので
例2のようにfs.rdbuf()->open()とbasic_filebufのメンバ関数を呼ぶと失敗しても
failbitは立たない
成否は例にあるように返り値で判断する

例5,6にあるようにis_open()==falseのときcloseは失敗する
これは>>458の例と同じ状況

ここに挙げた例は全て明示的にcloseしているけれど
cout << "ExampleX";
{
...
}
の閉じ括弧でfsはデストラクタでcloseされるので
各々最後のcloseは特別な理由がない限り書かなくてもいい

その他細かい動作は27.5 Stream buffers, 27.8 File-based streamsとコンパイラのマニュアルで確認してくれ
0463デフォルトの名無しさん2012/10/27(土) 03:56:13.18
close()してもclear()しないとfailbitが立ったままなんで気をつけないとな
0464デフォルトの名無しさん2012/10/27(土) 06:57:40.95
つまり使い回すなってことだ
0465 ◆CAERF1YrA. 2012/10/27(土) 07:15:47.54
>>459>>460
いえいえ、ありがとうございます
0466デフォルトの名無しさん2012/10/27(土) 07:20:03.08
どう居た前
0467デフォルトの名無しさん2012/10/27(土) 15:48:05.69
http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/virtual.html
純粋仮想関数を再定義する時、子クラスにもvirtualキーワードをつけないとダメ?

class sub:public super{
public:
void func();//←??
virtual void func();//←??
};
0468デフォルトの名無しさん2012/10/27(土) 15:53:30.20
不要
0469デフォルトの名無しさん2012/10/27(土) 16:06:05.98
ありがとう
0470デフォルトの名無しさん2012/10/27(土) 16:20:39.97
何が仮想関数であるべきかが設計時に判らないのに
あらかじめ基底クラスになるかどうかも判らないクラスに
あらかじめ virtual 書いておかなければならないとか
C++ の最大の欠陥
0471デフォルトの名無しさん2012/10/27(土) 16:46:49.47
で?
0472デフォルトの名無しさん2012/10/27(土) 17:31:54.49
わかってない段階からコーディングするとか、バカすぎ。
0473デフォルトの名無しさん2012/10/27(土) 17:45:24.76
質問させてもらいます。
現在64bit メモリ4Gの環境でプログラムを組んでいます。
動的に大容量のメモリを確保する場合、32bitのOSでは2Gが最大との記述を読みましたが、64bitでは最大確保容量=物理メモリと考えてよいのでしょうか?
また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?
0474デフォルトの名無しさん2012/10/27(土) 17:57:49.61
いいえ
0475デフォルトの名無しさん2012/10/27(土) 17:58:27.66
>>473
> また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?

静的に確保した変数はスタックに取られるわけじゃないぞ。
0476デフォルトの名無しさん2012/10/27(土) 18:14:35.49
>>470
で、全ての関数に virtual がついている言語には欠陥がないとでも言うのか
おまえ自分で考える頭がないのをどこに転嫁しても笑われるだけなのを認識しろよ
0477デフォルトの名無しさん2012/10/27(土) 18:36:54.14
>>476
ご指摘ありがとうございます。
静的な確保の場合は静的領域ですね。
0478デフォルトの名無しさん2012/10/27(土) 18:56:50.16
>>477
おまえ今日は何グラム入れてるの?
0479デフォルトの名無しさん2012/10/27(土) 19:34:32.45
>>473
スタックに取られるのはC系の場合自動変数。
基本的に自動変数であまり大きな領域を取ってはいけない。
Windows APIを使ってメモリ確保した場合は仮想メモリから
取られるので、実メモリ+仮想記憶が許す範囲で取れる。
いろいろ勘違いしてるので基本の学習が先だな。
0480デフォルトの名無しさん2012/10/27(土) 19:48:16.98
基本の学習って、アセンブラでもやれってか?

むしろCで「処理系依存」を毛嫌いしすぎるのが
そういう系の習得を邪魔しているだけなんだが
0481デフォルトの名無しさん2012/10/27(土) 20:25:45.28
>>479
> いろいろ勘違いしてるので基本の学習が先だな。

お前がな。
0482デフォルトの名無しさん2012/10/27(土) 20:57:46.66
64bit系OSでは仮想メモリを使わない設定の場合もある気がする
0483デフォルトの名無しさん2012/10/27(土) 21:14:11.82
て言うか、スタックとか静的領域とかのストレージクラスの話と、
仮想メモリーをごっちゃにしてて、偉そうに何言ってるんだ?

って話だろ。

あと、組み込みとかで仮想記憶使わないシステムなんていくら
でもあるよ。
0484デフォルトの名無しさん2012/10/27(土) 21:19:49.94
メモリ確保量の限界を聞いてるんだから
仮想メモリの話は当然出てくるだろう
0485デフォルトの名無しさん2012/10/28(日) 08:55:18.71
flvのファイルをドロップドラッグしてリストに表示し
ボタンを押すとひとファイルずつキー操作する
みたいなことやりたいんだがヒントくれ。
0486デフォルトの名無しさん2012/10/28(日) 09:12:26.01
ポインタと文字列定数について質問があります。

int main()
{
char *s;
s = "Pointers are fun to use.\n"

cout << s;
return 0;
?

というサンプルコードなんですが、なぜポインタ変数に文字列定数を
代入できるんでしょうか?

また、試しにcout <<*sとしてみると先頭の一文字(P)だけ表示されるのですが、なぜなのでしょうか?

0487デフォルトの名無しさん2012/10/28(日) 09:38:02.98
ドロップドラッグ
0488デフォルトの名無しさん2012/10/28(日) 10:01:56.56
*s = 文字列ポインタの実体の先頭 = P
だからその動作は正しい。

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.86
google で 「std::string compare」 で検索すると2つ目に出てくる
ttp://www.nilab.info/z3/20111226_03.html
のサイトの説明についてなんですが

  if(c.c_str() == d.c_str()){
    printf("c.c_str() == d.c_str(): true\n");
  }else{
    printf("c.c_str() == d.c_str(): false\n");
  
とか

  // char* : std::string
  if(a == c){
    printf("a == c: true\n");
  }else{
    printf("a == c: false\n");
  }
  if(a == c.c_str()){
    printf("a == c.c_str(): true\n");
  }else{
    printf("a == c.c_str(): false\n");
  }

っておかしいですよね?
0491デフォルトの名無しさん2012/10/28(日) 10:14:01.72
その質問は何が知りたくてどんな答えを求めてるの?
日本語レベルからやり直したほうがいいぞ。
0492デフォルトの名無しさん2012/10/28(日) 10:15:17.41
#include <iostream>

int main()
{
  using namespace std;

  char *s;
  char c[] = "zj";

  cout << c[0] << endl;
  cout << c[1] << endl;

  s = &c[0];
  cout << s << endl;

  c[0] = 'x';
  cout << s << endl;

  s = "zj";
  cout << s[0] << endl;
  cout << s[1] << endl;

  cout << s << endl;
  return 0;
}
0493デフォルトの名無しさん2012/10/28(日) 10:16:27.61
>>490
trueかfalseか確認してるだけだからおかしくはない。
コードにセンスないとは感じるが。
0494デフォルトの名無しさん2012/10/28(日) 10:18:29.92
assert使った方がいいね
0495デフォルトの名無しさん2012/10/28(日) 10:29:25.76
c_str()を比較するとポインタを比較している事になって正しくない
ポインタの比較は同一の配列か同一の文字列内でしか出来ない
0496デフォルトの名無しさん2012/10/28(日) 10:33:35.40
#define BUFFER_SIZE 256
#include <iostream>
#include <string>

int main()
{
  using namespace std;

  const char *s = "zj";
  char c[BUFFER_SIZE];
  string g(s);

  cout << g << endl;

  strcpy(c, s);
  cout << c << endl;

  cout << s[0] << endl;
//  s[0] = 'x';
  return 0;
}
0497デフォルトの名無しさん2012/10/28(日) 10:38:20.86
>>495
だったらNULLとの比較もできないことになるが
0498デフォルトの名無しさん2012/10/28(日) 10:42:09.72
>>495
stringの使い方からするとおかしいが、比較そのものは合法。

論点はどっちだ?
0499デフォルトの名無しさん2012/10/28(日) 10:47:13.45
いやそうじゃないだろ
ポインタが同じところ差してるからと言って
中身が同じとは限らないのが問題なんだろ
0500デフォルトの名無しさん2012/10/28(日) 10:52:38.59
>>495
> ポインタの比較は同一の配列か同一の文字列内でしか出来ない

大小比較は出来ない (と言うか意味ない) けど、一致比較は出来ると思うぞ。
0501デフォルトの名無しさん2012/10/28(日) 10:59:49.58
>大小比較は出来ない (と言うか意味ない) けど、

位置の前後は意味あるんじゃない?
差分もとれるし。
意味ないのは和の方。
0502デフォルトの名無しさん2012/10/28(日) 11:18:42.69
意味あるかないかであれば、どっちも正しいが正しい

char *a = malloc(20);
char *b = malloc(10);
a > b;  /* 意味ないよ! というかどうなるか分からないよ */

char *a = strstr(c, "hello");
char *b = strstr(c, "world");
a > b;  /* 意味あるよ! cが"hello world"か"world hello"か区別つくよ */
0503デフォルトの名無しさん2012/10/28(日) 11:18:57.50
ポインタ値の大小の話がなんで位置の話になるんだよ。
0504デフォルトの名無しさん2012/10/28(日) 11:20:27.12
>>501
> 位置の前後は意味あるんじゃない?
> 差分もとれるし。

だからそれが意味を持つのは、「同一の配列か同一の文字列内」の場合だけでしょ。
0505デフォルトの名無しさん2012/10/28(日) 11:31:08.31
別に任意のポインタを比較したっていい
それが意味を持つかどうかは、要件次第
0506デフォルトの名無しさん2012/10/28(日) 11:38:23.13
>>505
> 別に任意のポインタを比較したっていい

規格上は「ダウト」じゃなかったっけ?
05074862012/10/28(日) 13:38:38.48
>>488
レスありがとうございます。
>>489の説明でよくわかりました。
0508デフォルトの名無しさん2012/10/28(日) 13:41:31.85
>506
p == NULL
とか
p == q
とか
また「任意じゃない」とか言い出すんだろうな
05094862012/10/28(日) 14:04:45.39
>>488
ところで、なぜポインタ変数に文字列を代入できるんでしょうか?
普通は、アドレス(数値)を代入するのではないでしょうか?
そういう仕様だということで納得するしかないのでしょうか?
0510デフォルトの名無しさん2012/10/28(日) 14:22:24.89
文字列リテラルはその文字列が格納される先頭アドレスを表すから
0511デフォルトの名無しさん2012/10/28(日) 14:24:53.16
>>508
> p == q

p, q が near ポインタだと p == q でも、違うところを指してるケースがあるとか、
なかったっけ?
05124862012/10/28(日) 14:34:05.93
>>510
レスありがとうございます。
文字列リテラルの先頭アドレスは &sで出てくる値で正しいのでしょうか?
0513デフォルトの名無しさん2012/10/28(日) 14:38:49.02
sでいい
&sだとポインタ変数のアドレスになっちまう
0514デフォルトの名無しさん2012/10/28(日) 14:59:08.72
>>512
初心者本買って勉強しろ。
そして死ね。
05154862012/10/28(日) 14:59:53.40
>>513
sのアドレスが見たい時はどうすればよいのでしょうか?
0516デフォルトの名無しさん2012/10/28(日) 15:01:39.18
>>515
std::cout << static_cast<void*>(s) << std::endl;
こういうことか?
0517デフォルトの名無しさん2012/10/28(日) 15:06:04.80
>>516
初心者なのでまだその式の意味がわかりません。
難しい話のようなのでもうちょっと勉強してきます。
0518デフォルトの名無しさん2012/10/28(日) 15:20:17.65
素朴な疑問だが、文字列リテラルってなんで文字定数('A')じゃだめなの?
0519デフォルトの名無しさん2012/10/28(日) 15:25:05.04
null終端じゃないからじゃね
0520デフォルトの名無しさん2012/10/28(日) 15:40:15.95
文字定数が 終端の '\0' を含めて連続配置されたのが文字列リテラル
代入は配列とポインタの関係みたいなもんだな

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
>>518
多分コンパイル結果が一定長の命令になるから。
●1文字だけなら文字定数で問題ない("a"を表示するとき)
push 0x61
call printf
●長いのを文字定数で処理すると文字数分の命令長が必要になる("abc"を表示するとき)
push 0x61
push 0x62
push 0x63
call printf
●文字列リテラル=アドレスにすると文字列長に関係なくアドレスサイズの命令長でおk("abc"を表示するとき)
push 0x100
call printf
0x100番地→61 62 63 00

↑は表現が微妙だけど、文字定数で'a','b','c'とか、仮に'abc'とか定義できたとしても、
その情報は結局メモリ上のどこかに保持しないといけないじゃん?
なら"aとbとc"っていう文字データで渡すより、定義先のアドレス1個で渡した方がよくね?ってこと。
0522デフォルトの名無しさん2012/10/28(日) 18:43:25.86
文字が複数個と文字列は、明らかに別物だから、別物になってるだけ

ジェネレートされた命令列は関係ない
0523デフォルトの名無しさん2012/10/28(日) 20:56:54.27
Cは暗黙のうちに定義される動作がわかりにくいんだよな。
紙にメモリと変数領域を自分で書きながら勉強するといいかも。
0524デフォルトの名無しさん2012/10/29(月) 12:33:01.67
馬鹿には無理。
馬鹿でないなら紙に書かなくても理解できる。
紙に書いて理解できたと思っているのは、実は理解できていない馬鹿か、
無駄なことをしていることに気付いていないだけ。
0525デフォルトの名無しさん2012/10/29(月) 13:44:07.47
英単語は書かないとスペル間違うぞ
0526デフォルトの名無しさん2012/10/29(月) 14:19:55.30
自分が判らないからと言って相手も判らないと思い込み
論を語る基地害ってどこから湧いてくるんだろうな
0527デフォルトの名無しさん2012/10/29(月) 14:22:50.07
・「みんなの意見」「他の人もそう思ってる」など、自分の意見なのに他人もそう思ってると力説する人
他人が自分とは違うという事実が受け入れられない人です。自分の意見が通らないとコピペや荒らしなど
無茶をし始めるので見かけたら放置してください。

・根拠もなく、他人を卑下したり、差別したりする人、自分で自分を褒める人
他人を卑下することで自分を慰めようとする人です。実生活で他人に褒めてもらう機会がないが
プライドだけは高いとか、匿名の掲示板しか話し相手のいない人です。可哀想なので放置してください。

・自分の感情だけ書く人
「〜〜がムカツク」とか自分の感情を掲示板に書くことに意味があると思っている人です。
何がどのようにムカツクのか論理的に書いてあれば、他人が読んでも意味のある文章になりますが、
そういった論理的思考の出来ない人です。もうちょっと賢くなるまでは放置してあげてください。
0528デフォルトの名無しさん2012/10/29(月) 18:15:44.15
今日そのコピペ流行ってるな
0529デフォルトの名無しさん2012/10/29(月) 19:50:36.07
×他人を卑下したり
○他人を蔑視したり

自分を卑下します
0530デフォルトの名無しさん2012/10/31(水) 09:15:54.27
WinGWからDirectXって使えますか?
0531デフォルトの名無しさん2012/10/31(水) 09:19:14.22
もちのろん
0532デフォルトの名無しさん2012/10/31(水) 20:03:31.80
MinGWな
0533デフォルトの名無しさん2012/11/01(木) 08:23:34.87
TがUを公開継承していて暗黙変換可能なとき
IHoge<T>を暗黙にIHoge<U>に変換可能にするような書き方ってできますか?
0534デフォルトの名無しさん2012/11/01(木) 09:06:41.82
template <class T> struct IHoge {
T m;

template <class U> IHoge& operator = (const IHoge<U>& r) {
m = r.m;
return *this;
}
};
0535デフォルトの名無しさん2012/11/01(木) 09:43:32.82
template <class T> struct IHoge {
T & get() = 0;
};

struct T : U { };

void Func(IHoge<U> & hoge) {
hoge.get().UMethod();
}

struct Hoge : IHoge<T> {
T o;
T & get() { return o; } };

Func(Hoge());

↑みたいな感じにしたいです
0536デフォルトの名無しさん2012/11/01(木) 13:04:53.20
hoge
禁止!
0537デフォルトの名無しさん2012/11/01(木) 13:08:21.66
>>535

struct U {};
struct T : public U {};

template<class T>
struct IHoge;

template<>
struct IHoge<U>
{
virtual U & get() = 0;
};

template<>
struct IHoge<T> : public IHoge<U> {};

void Func(IHoge<U> & hoge) { hoge.get(); }

struct Hoge : IHoge<T>
{
T o;
T & get() { return o; }
};
0538デフォルトの名無しさん2012/11/01(木) 13:10:32.31
>>537
TとUは一般的なクラスなんで特殊化だけでは対応し切れません
0539デフォルトの名無しさん2012/11/01(木) 18:55:51.58
バイト列をstd::stringで扱うと何か問題ありますか?
ヌルとかがあるとまずいかなと思って今まで
vector<char>でやってました。
0540デフォルトの名無しさん2012/11/01(木) 19:22:05.22
>539
後者が正解
0541デフォルトの名無しさん2012/11/01(木) 21:50:05.73
ちょっと混乱したのでお助けを
const char* p
だと
*p = 0;
これはダメで
p = "hoge";
これは可能
つまりポインタ先の変更は不可能だが、ポインタ自体は変更可能
では
const char** h;
だと・・・?
char*を一つの型として考えて
*hが変更不可能だと思ったのですが実際は
*hに代入ができました
どう考えるべきですか?
0542デフォルトの名無しさん2012/11/01(木) 21:55:42.30
遠い方に効く
0543デフォルトの名無しさん2012/11/01(木) 22:42:09.13
こういう問題があるから前にconstを書くやつはクズ
後ろに書けば明快でよろしい
0544デフォルトの名無しさん2012/11/01(木) 22:47:17.99
何をconstにしたいかによるだろ
0545デフォルトの名無しさん2012/11/01(木) 22:48:22.55
何をコンストにしたいか一目瞭然だから後置がいいんだよ
0546 ◆QZaw55cn4c 2012/11/01(木) 23:01:18.97
>>541
>>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.46
最初のうちは変数宣言を日本語訳?するとわかりやすいかもしれない(?)

1. constが一番左のときは右隣の型名と入れ替え
2. 機械的に置き換え
 〜(型名):〜型
 *    :へのポインタ型
 const  :の定数
3. 『型』の直後に『の定数』がなければ『の変数』を挿入

char a
 → char型 a
 → char型 (の変数) a
 → char型の変数a

char * b
 → char型 へのポインタ型 b
 → char型 (の変数) へのポインタ型 (の変数) b
 → char型の変数へのポインタ型の変数b

const char * c
 → char const *c
 → char型 の定数 へのポインタ型 c
 → char型 の定数 へのポインタ型 (の変数) c
 → char型の定数へのポインタ型の変数c

const char ** c
 → char const ** c
 → char型 の定数 へのポインタ型 へのポインタ型 c
 → char型 の定数 へのポインタ型 (の変数) へのポインタ型 (の変数) c
 → char型の定数へのポインタ型の変数へのポインタ型の変数c

・参照外しした場合は右から一つずつ『へのポインタ型の変数・定数』を外していく
0549デフォルトの名無しさん2012/11/02(金) 02:06:50.30
>>541の場合の解釈は
const char* p
・p は『char型の定数へのポインタ型の変数』だから変更できる(変数だから)
・*p は『char型の定数』だから変更できない

const char** h
・h は『char型の定数へのポインタ型の変数へのポインタ型の変数』だから変更できる
・*h は『char型の定数へのポインタ型の変数』だからやはり変更できる
・**h になると『char型の定数』だから変更できない

あるいは
char * const * x だと
 → char型 へのポインタ型 の定数 へのポインタ型 x
 → char型 (の変数) へのポインタ型 の定数 へのポインタ型 (の変数) x

・x は『char型の変数へのポインタ型の定数へのポインタ型の変数』だから変更できる
・*x は『char型の変数へのポインタ型の定数』だから変更できない
・**x は『char型の変数』だから変更できる
0550デフォルトの名無しさん2012/11/02(金) 04:26:23.28
>>541
エキスパートCプログラミングという本を読むといい。
そのへんのことが詳しく書いてある。
0551デフォルトの名無しさん2012/11/03(土) 02:42:50.43
csvを読み込むソースください。
自分で実装しようと思ったけど、"とか改行とか考えるとめんどくさくなった
0552デフォルトの名無しさん2012/11/03(土) 02:51:43.53
csvにも仕様が色々ありすぎてどうしようもない
0553デフォルトの名無しさん2012/11/03(土) 02:55:06.20
excelで出力したやつ
0554デフォルトの名無しさん2012/11/03(土) 03:00:37.39
ならまずその仕様を明確に調査してくれ
0555デフォルトの名無しさん2012/11/03(土) 03:37:04.36
そこまでするなら自分で作ります
0556デフォルトの名無しさん2012/11/03(土) 07:39:08.98
CSVってガチにやると凄ぇ面倒くさかった気がする。
0557デフォルトの名無しさん2012/11/03(土) 09:27:12.49
基本カンマ区切りだけど、""内は文字列として扱う、だけじゃ駄目か
0558デフォルトの名無しさん2012/11/03(土) 09:46:47.58
>>557
で、""でくくられると、くくられた文字列ないには大抵改行が入ってるのな
0559デフォルトの名無しさん2012/11/03(土) 09:50:17.72
a,"b1,b2",c
とかも考慮したりするとめんどいな
0560デフォルトの名無しさん2012/11/03(土) 09:59:54.47
>>551
死ね
0561デフォルトの名無しさん2012/11/03(土) 11:01:17.32
プログラミング作法にけっこう解説あるけど、そういうの読むのは面倒?
0562デフォルトの名無しさん2012/11/03(土) 11:05:58.89
abc,"def , "" , ghi",jkl,"mno
pqr"

なんてのも扱えないといけないよ
0563デフォルトの名無しさん2012/11/03(土) 11:12:03.16
改行がCRLFのときに""内にCRだけの改行が入ってたり
0564 ◆QZaw55cn4c 2012/11/03(土) 11:30:06.09
>>562
これは無理なのでは。
""で囲まれたセンテンスの中にさらに " があった場合、これが終わりをしめすのか更なる""センテンスを示すのかはどうやって決定すればいい?
人間はどう解釈している?
0565デフォルトの名無しさん2012/11/03(土) 11:31:03.59
状態遷移図書いてみろや
書けなかったらその構文では無理って事だ
0566デフォルトの名無しさん2012/11/03(土) 11:34:32.51
" " 内の "" は " という文字のエスケープシーケンスだろ、この場合
0567デフォルトの名無しさん2012/11/03(土) 15:57:05.27
>>564
1文字先読みするだけだろ
0568デフォルトの名無しさん2012/11/03(土) 16:02:19.56
>>562
期待するパース結果も書いてくれ

0569デフォルトの名無しさん2012/11/03(土) 16:09:28.70
"abc"
"def , \" , ghi"
"jkl"
"mno\npqr"
だろ
0570デフォルトの名無しさん2012/11/03(土) 16:34:24.87
>>569
ごめん
いまいちルールが理解できないわ
カンマとダブルクォーテーションは、どちらが優先的に解析されるのだ?
0571デフォルトの名無しさん2012/11/03(土) 18:37:29.40
ダブルクォーテーションが優先されなかったら
何の為に書くんだよw
0572デフォルトの名無しさん2012/11/03(土) 20:06:41.18
正直な話、RFC読んで実装をさっくり諦めるくらいの規模ではあるよな
0573デフォルトの名無しさん2012/11/03(土) 20:35:21.85
,"x,x"xx"x,x", と来たらどうするのかとか
,x"x,x"x, と来たらどうするのかとか
改行までを読み込んだり特定文字列で分割して配列に詰め込むことが
サポートされてる言語使い程度には扱えないよねw
0574デフォルトの名無しさん2012/11/03(土) 20:58:46.76
>>541ではないが"エキスパートCプログラミング"を購入した
256倍本もまた販売してほしくなった
0575デフォルトの名無しさん2012/11/03(土) 21:14:14.17
昔、accessとexeclでCSVの解釈が違ってたが、もう直ったのかな
0576デフォルトの名無しさん2012/11/03(土) 21:21:27.37
CSVって方言多いんじゃないの
0577デフォルトの名無しさん2012/11/03(土) 22:32:53.28
Excelを標準にするのが妥当でしょ
abc,d"e
とか
abc,"d"e
みたいなのはパーズエラーで、どうにでもすればよろし
0578デフォルトの名無しさん2012/11/03(土) 22:47:27.31
parse 【pɑ'ːrs】

濁りません
0579デフォルトの名無しさん2012/11/03(土) 22:48:22.33
577 は考えるのをやめた
0580デフォルトの名無しさん2012/11/03(土) 22:49:56.46
[p?'?z] 濁る発音もあるよ!
0581デフォルトの名無しさん2012/11/03(土) 23:49:29.58
>>577
> Excelを標準にするのが妥当でしょ

その使用ってどっかにあるのか?
って話だと思うが。

正式な奴があるなら、俺も欲しい。
0582デフォルトの名無しさん2012/11/03(土) 23:59:35.95
適当に見つけた資料 ttp://www.7key.jp/rfc/rfc4180.html の仕様に合わせて
boost.spiritで
ttp://codepad.org/GBr4mdKx
05835572012/11/04(日) 00:31:19.91
>>558
あれって行単位で扱うもんじゃないの?
>>559
俺のやり方だと「a,"b1」と「b2",c」に分かれるんだが、駄目なん?
(文字列内に,があったら""で囲む。"があったらエスケープする的な)

でも>>577のようなパターンもあるのか……
デファクトスタンダード的にはExcelに合わせるべきなんだろうが、嫌な話だな
0584デフォルトの名無しさん2012/11/04(日) 00:48:33.65
>>583
> あれって行単位で扱うもんじゃないの?

たいていの人はそう思うと思うんだけど、デファクトの Excel が改行を入れてくるから。
0585デフォルトの名無しさん2012/11/04(日) 02:59:40.94
CSVを1行ずつ読み取って解析しようと考える奴は
ExcelはAlt+Enterでセル内に改行を入れられることを
知らないことが多くない?w
0586デフォルトの名無しさん2012/11/04(日) 03:02:21.43
まず一般人でそのことを知らない人について統計をとれ
その後でCSVを1行ずつ読み取って解析しようと考える奴についてそのことを知らないかどうかの統計をとれ
結果に有意な差が出たらお前のことを認めてやる
0587デフォルトの名無しさん2012/11/04(日) 03:05:25.78
いや、1行ずつ読み取って解析しようと考える奴とそうでないやつとで比べないと・・・
05885832012/11/04(日) 08:53:12.74
>>584-586
ぐぬぬ……
それを知ってしまったら、対策用コードを新たに考えなくちゃならんじゃなイカ!
0589デフォルトの名無しさん2012/11/04(日) 09:31:44.41
Windows.hのGetPrivateProfileStringって引数が

LPCTSTR lpAppName, // セクション名
LPCTSTR lpKeyName, // キー名
LPCTSTR lpDefault, // 既定の文字列
LPTSTR lpReturnedString, // 情報が格納されるバッファ
DWORD nSize, // 情報バッファのサイズ
LPCTSTR lpFileName // .ini ファイルの名前

な感じの奴なんですけど、この
>LPTSTR lpReturnedString, // 情報が格納されるバッファ
というのをstd::stringで受け取りたいんですけど、どうしたらいいですか?
0590デフォルトの名無しさん2012/11/04(日) 09:48:39.56
>>589
cpp11なら&str[0]を引数に渡す
そうじゃないならテンポラリバッファを渡す
0591デフォルトの名無しさん2012/11/04(日) 09:54:29.27
>>589
void func(std::string s) {}

int main()
{
LPTSTR lpReturnedString;
func(lpReturnedString);
}
0592デフォルトの名無しさん2012/11/04(日) 10:13:02.73
>>590
cppのバージョンがよくわからないです。。
vs2010だとテンポラリバッファのほうを使うしかないですか?
またテンポラリバッファってvectorでもいいんでしょうか?
文字列の長さが決まってないんですが、予め255文字文newするというのはできるだけしたくないです。
連投ですいません。
0593デフォルトの名無しさん2012/11/04(日) 10:13:31.36
>>584-585
1行をCRLFまでと考えれば
セル内の改行はLFのみだから
正しく処理出来るんだけどなぁ
0594デフォルトの名無しさん2012/11/04(日) 10:16:47.47
>>585
じゃあお前ならどうやる?

何行読む必要あるかは、中身解析しないとわからないから、
一行ずつ読み込んで解析して、継続行の読み込みが必要か
を見ていくのが普通だと思うが。
0595デフォルトの名無しさん2012/11/04(日) 10:17:41.79
>>592
vector でも構わないけど
>予め255文字文newする
これと同じことは必要
0596デフォルトの名無しさん2012/11/04(日) 10:19:16.68
>594
>593
0597デフォルトの名無しさん2012/11/04(日) 10:49:21.04
>>595
ありがとうございます
&str[0]はやめて一時変数と割りきって余分に確保します・・
0598デフォルトの名無しさん2012/11/04(日) 10:59:15.33
動的確保にへんな苦手意識持つ若者が増えてきてるよね
ジジイが執筆した時代に逆行したクソみたいな参考書がヒープ確保は高コストだから控えようみたいな脅しかけるからかな
0599デフォルトの名無しさん2012/11/04(日) 11:11:23.32
C++使うからには資源管理を徹底したいじゃないですか(´・ω・`)
0600デフォルトの名無しさん2012/11/04(日) 11:15:58.75
>>599
だからもうそういう時代じゃないし
0601デフォルトの名無しさん2012/11/04(日) 12:24:05.01
動的確保のコストの話と、資源管理の徹底の話をごっちゃにするなよ…
0602デフォルトの名無しさん2012/11/04(日) 13:25:11.21
>>600
おまえが時代から置いてかれただけ
0603デフォルトの名無しさん2012/11/04(日) 13:57:20.04
>>597
厳密にやりたいならリトライ機能を作り込むしかないよ
サイズはこちらからAPIに教えてあげるんだし、確か書き込まれたサイズも取れたよね?
やってみてダメなら大きいサイズを確保してリトライするって感じね
0604デフォルトの名無しさん2012/11/06(火) 10:59:19.43
C++で質問です。
ゲームを作っていて、戦闘、移動などをシーンクラスで実装しようとしています。
メインループ内において、シーンを遷移するかの判定を行っており、遷移判定が真ならシーンオブジェクトを破棄して、
遷移後のシーンオブジェクトを生成します。

現在、
ダンジョン内の移動シーン→敵に遭遇→戦闘シーンへ遷移→戦闘に勝利→ダンジョン内の移動シーンに遷移
を実装しようとしています。
しかし、遷移後の移動シーンにダンジョン内の位置情報を渡す方法が判らず、戦闘が終わると毎回ダンジョンの入り口に
戻ってしまいます。

そこで質問です。
クラスのコンストラクタに何かデータを渡して、データメンバを初期化する方法はありますでしょうか?
0605デフォルトの名無しさん2012/11/06(火) 11:18:49.70
メンバ初期化子
0606デフォルトの名無しさん2012/11/06(火) 11:33:05.92
ゲーム製作の質問はこちら。

ゲーム製作技術@2ch掲示板
http://toro.2ch.net/gamedev/
0607デフォルトの名無しさん2012/11/06(火) 11:52:47.95
構造体で
typedef struct _abc {
int a;
int b;
int c;
} abc;
があるとき、
abc x = {1, 2, 3};
と初期化出来ますが、
その後 x = {4, 5, 6};
と代入しようとしてもエラーになります。
x = abc(4, 5, 6);
とすると引数ありのコンストラクタが定義されていないと言われます。
コンストラクタを書けば解決するのは判りますが、
コンストラクタは書かずに、
x.a = 4; とかメンバごとに代入するのもせずに、
x = {4, 5, 6}; のように効率的に書く方法はありますか?
0608デフォルトの名無しさん2012/11/06(火) 11:55:14.18
代入演算子を定義する
0609デフォルトの名無しさん2012/11/06(火) 11:57:17.69
ああそうですね。
>コンストラクタは書かずに、
の理由が、
構造体の定義があるのが他人の書いたヘッダなので、勝手に書き換えられないんです。
0610デフォルトの名無しさん2012/11/06(火) 12:03:43.09
void Copyabc(abc* p, int a, int b, int c) { p->a = a; p->b = b; p->c = c; }
0611デフォルトの名無しさん2012/11/06(火) 12:31:29.83
typedef struct _def : public abc {
  _def(int x, int y, int z) { a = x, b = y, c = z; }
} def;

abc x = {1, 2, 3};
x = def(4, 5, 6);
0612デフォルトの名無しさん2012/11/06(火) 20:41:35.51
C++難しすぎなのですが、皆さんはどのようにマスターしたのですか?
プログラムを書きまくれ!とおっしゃる方がいらっしゃいますが、
どのようなプログラムをどのような思考法で書いたのか教えていただけるとありがたいです。
0613デフォルトの名無しさん2012/11/06(火) 20:47:25.56
概念的な問題はコード書けばわかるってものではない。
個人的にはC++の勉強をする前にJavaとデザインパターンの
勉強をすすめる。
0614デフォルトの名無しさん2012/11/06(火) 20:51:57.65
なぜJavaとデザインパターン?
0615デフォルトの名無しさん2012/11/06(火) 20:56:27.63
Javaの利点
・暴走しにくい
・多重継承が禁止されている(多重継承はC++で学べばよい)
・C++のような無理やりCを拡張した形ではないので構造がシンプル

もちろん欠点もあるけどね。
0616デフォルトの名無しさん2012/11/06(火) 20:59:56.68
なぜデザインパターン?
0617デフォルトの名無しさん2012/11/06(火) 21:50:51.99
引き出しを増やすため、か?
0618デフォルトの名無しさん2012/11/06(火) 21:53:09.87
結城本がJavaだしなあ
0619デフォルトの名無しさん2012/11/06(火) 22:11:52.84
>>612
マスターしてるか不明だが、仕事で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.99
>>619
C含めておすすめのC++の本教えてくれ。
0621デフォルトの名無しさん2012/11/06(火) 22:19:51.16
>>619
三行でおk
0622デフォルトの名無しさん2012/11/06(火) 22:56:05.57
>>620
エキスパートCプログラミングはすべてのC初学者に読んでほしい。
0623デフォルトの名無しさん2012/11/06(火) 23:00:40.93
エキスパートCプログラミングの前に読むべき本は?
0624デフォルトの名無しさん2012/11/06(火) 23:02:40.14
K&R2
0625デフォルトの名無しさん2012/11/06(火) 23:47:42.66
>>621
C++の薄い本をなんでもいいから眺めながら、
かいてみたら、なにやってんだ?とか疑問が出た
0626デフォルトの名無しさん2012/11/07(水) 00:00:15.45
最終的にはちゃんとした厚い入門書は読んでおかないと
端々で知識が怪しくなるぞ
0627デフォルトの名無しさん2012/11/07(水) 08:13:42.94
>>620
では読んだ本だけ。アーキテクトさん、学者さんが見たらなめんなと思われるかもしれないが。
後は実コードを見ながらにらめっこ。

C:
C実践プログラミング 第3版
C言語ポインタ完全制覇
定本 Cプログラマのためのアルゴリズムとデータ構造

C++:
C++実践プログラミング 第2版
C++クラスと継承完全制覇
オブジェクト指向における再利用のためのデザインパターン
Effective C++ 第3版

その他:
オブジェクト指向における再利用のためのデザインパターン
プログラミング作法
珠玉のプログラミング

>>621
C++どう動いてるか理解して
自分でコード読んで書いて
めげずに頑張れ
0628デフォルトの名無しさん2012/11/07(水) 09:40:57.52
>>611
型が違うのに代入出来るんですね。
すげー
0629デフォルトの名無しさん2012/11/07(水) 21:53:10.07
計算式で、
テンポラリバッファを用意したほうが速いのかGetメソッドを使って毎回呼び出したほうが速いのか
どっちのほうが速いんでしょうか?
勿論、最初の方はGetのほうが速いんでしょうけど、どれくらいから逆転するか・・・
0630デフォルトの名無しさん2012/11/07(水) 21:55:49.45
コードでおk
0631デフォルトの名無しさん2012/11/07(水) 21:55:57.20
某シューティングゲーム作成サイトでC++使わされて今に至る

ポインタやSTLのイテレータとか使えれば新卒ならどや顔できるよね?(´・ω・`)
0632デフォルトの名無しさん2012/11/07(水) 21:57:45.58
実測しろ

終わり
0633デフォルトの名無しさん2012/11/07(水) 22:00:48.03
>>630

printf("%d",GetNum());
を100回繰り返したのと
int i = GetNum();
としておいて
printf("%d",i);
を100回繰り返したのではどっちが速いのかなーと、
予想では最初は前者が早くてあとから後者のコードが追いつくって思うんだけど、どれくらいで逆転するのか
0634デフォルトの名無しさん2012/11/07(水) 22:01:34.46
>>632
だれかもうしてるなら見たい
0635デフォルトの名無しさん2012/11/07(水) 22:03:07.74
>>633
GetNum()とやらの実装はわからんが、関数なら、2回目から後者が速い。
0636デフォルトの名無しさん2012/11/07(水) 23:03:50.20
オブジェクトの内部の値を外部に渡す方法って
get以外にありますか?

int CSample::get()
{
return m_num;
}
0637デフォルトの名無しさん2012/11/07(水) 23:04:43.98
int CSample::kure()
{
return m_num;
}
0638デフォルトの名無しさん2012/11/07(水) 23:05:00.54
あっ
06396362012/11/07(水) 23:40:53.85
他のやり方ありますでしょうか?
0640デフォルトの名無しさん2012/11/07(水) 23:46:17.87
コールバック与えたら、そいつに値を付けて呼び返してくれるとか
0641デフォルトの名無しさん2012/11/08(木) 00:58:02.79
publicにするとか
0642デフォルトの名無しさん2012/11/08(木) 10:47:38.75
はぁ...
swtich(){
case 0:
...
case default:
break;
}
0643デフォルトの名無しさん2012/11/08(木) 10:50:46.86
>>639
オブザーバーパターンが便利だよ
0644デフォルトの名無しさん2012/11/08(木) 12:30:32.25
class CSampleBase{
union{
int m_num;
const int num;
};
};
class CSample : CSampleBase{
public:
using CSampleBase::num;
};
VC以外でできるのか知らんけど。
0645デフォルトの名無しさん2012/11/09(金) 01:30:25.11
>>588

CSVリーダ作ってて発見したんだが、エクセルノセルにテキストエディタでコピーした
内容をペーストすると、任意の改行コードを混在させられる。

""でくくられるからいいんだけど、解析側が知らないとえらいことになるよ。
0646デフォルトの名無しさん2012/11/09(金) 12:53:46.27
シフト演算って、動的に値が0となった場合にも演算コストかかるのでしょうか?
たとえば、int arr[4] = {0, 4, 8, 12,}としていて、
static x;
// どこかでxに値が入る
func(int i) {
x >>= arr[i];
}
となっているとき、func(0)としたときとしたときとfunc(1)としたときで演算時間に差が生じるでしょうか?
差が生じないのであれば、arr[4] = {4, 8, 12, 16}としたいと思っているので、気になっています。
0647デフォルトの名無しさん2012/11/09(金) 12:57:30.99
すみません脱字が。static int x、void func(int i)でした。
この演算はプログラムの中で最も多く(億単位で)呼び出されるものなので少しでも時間を削りたいと思っています。
0648デフォルトの名無しさん2012/11/09(金) 13:05:03.42
>>646
それ環境依存だね
バレルシフタを使用しているハードウェアならほとんど差はない
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.63
ついでに言えば、
staic 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
>>651
なるほど。勉強になります
0654デフォルトの名無しさん2012/11/09(金) 13:39:07.67
ある程度のずれは、割り込み等や他タスクの関係で当然だが
rdtscを使って、かつそれほどループ回数を多くしなければ、
大抵は比較的ぶれの少ない数値になるはず。
0655デフォルトの名無しさん2012/11/09(金) 13:39:59.34
>>652
>どうも実行するごとにコンマ数秒程度は値がずれたりして
え!?あたりまえじゃん
0656デフォルトの名無しさん2012/11/09(金) 13:50:28.89
YOU!compiler intrinsics 使っちゃいなYO!
0657デフォルトの名無しさん2012/11/09(金) 13:54:17.26
ずれを小さくするにはSetPriorityClass()使えよ

ただし、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.36
QueryPerformanceCounter()とQueryPerformanceFrequency()使うと楽だけどな

OSのAPIには結構美味しい物が揃っている
0660デフォルトの名無しさん2012/11/09(金) 15:11:32.74
CPUクロックが可変だったりして。
0661デフォルトの名無しさん2012/11/09(金) 15:43:42.83
CPU Load 100%で仕事をさせれば平気だろ
RDTSCが一番確実だけど
0662デフォルトの名無しさん2012/11/09(金) 20:12:41.36
値が0だろうが1だろうが全bitをずらすのがシフトだから
演算そのものは実行されるだろう。
結果が変わるかどうかは演算には関係のない話。
0663デフォルトの名無しさん2012/11/09(金) 20:14:50.63
1bitずらすより31bitずらす方が
時間掛かるような気がするが
最近のCPUはそうでもないのか
0664デフォルトの名無しさん2012/11/09(金) 20:35:38.53
Model View Controller - Wikipedia
http://ja.wikipedia.org/wiki/Model_View_Controller

MVCパターンで疑問があります。

動画プレイヤー的なGUIアプリをWin32APIで構築してみたんですが、
ViewとControllerを分離する利点がいまいち理解できません。

Modelに関しては表示や入力に関する処理から切り離すことができて、
本質的な処理(ファイルから動画を読みだしたりフィルタ処理をかけたり)だけ
記述できてスッキリしましたし、GUIを変えたくなってもModelは一切手を加えずに済みます。

しかし、ViewとControllerはいずれもModelをコンポジションしている、
つまり、Modelに依存している点で同じです。
強いて違いを挙げるなら、
「ViewはModelの状態を参照するメソッド(フィルタ処理された最終イメージを参照)をコールする」、
「ControllerはModelの状態や動作を変化させるメソッド(ファイルを開く/再生/停止)をコールする」、
という点だと思いますが、
Modelのメソッドをコールするという点では同じですし、
特にモジュール結合度の点で有利というわけではありません。

ViewとControllerを分離する意義は
何に見出せるのでしょうか??
0665デフォルトの名無しさん2012/11/09(金) 20:38:56.56
>>662
おまえは質問の意味がわかってない。
>>648で答えが出てるから、そもそもレス自体無意味だし。
0666デフォルトの名無しさん2012/11/09(金) 21:35:52.62
>>664
モジュール分割すること自体の意義と、それをMVCに分類することの意義をごっちゃにしている。
モジュール分割を行うにあたって、MVCそれぞれの役割に分類することで結合度を比較的
低く抑えられるという、多分に経験則的な設計指針であって、ダイアグラムだけ見てそれが
良いか悪いかと言えるような性質のものではない。
極端な話、モジュール分割を行わなければ「モジュール結合度」は高くならんわけだし。
0667デフォルトの名無しさん2012/11/09(金) 21:54:14.49
>>663
そもそも1ビットだけずらす機械語命令があるのかと
0668デフォルトの名無しさん2012/11/09(金) 21:54:52.62
あるよ余裕で
06696632012/11/09(金) 21:55:16.92
ごめん、なんか1bitを勘違いしてた(´・ω・`)
06706672012/11/09(金) 22:00:44.62
>>669
俺(>>669)は俺(>>667)です。はぁ、今日はもう寝る。
0671デフォルトの名無しさん2012/11/09(金) 22:39:10.86
自演しすぎるとそうなる
06726642012/11/09(金) 23:18:11.12
>>666
なるほど。
一般的にView&Controllerをいっしょこたにしたものはコード規模が大きく複雑になりがち。
そこでモジュール分割したいわけだが、
経験則的に結合度が低くなる傾向にあるのが
ViewとControllerという分け方、ということですね。

あと、思ったのですが、Viewはアプリの面構えに関する処理の責務を負うわけで、
例えばWin32APIのGUIパーツでなく、DirectXやOpenGLを使った
3DでクールなGUIを構築するということもできると。
そういった見た目の変更をしたいときにはViewだけを変更すればいいわけで
Controllerは一切手を加えずに済みます。

はっきりとした責務、コードの見通しの良さ、変更の容易性など、
これらのバランスが良くなる一つの例がMVCであるということですね。
06736642012/11/10(土) 00:17:20.23
もう一つ、ViewとControllerを分ける良い点がWebで見つかりました。

同じアプリでも、管理者向けのフル機能のGUIと、
ユーザー向けに必要十分な機能のGUIとが求められることがあり
(実際、自分の会社でもこういった要求がありました)、
Controllerはフル機能に対して作ったものを、
機能限定版のGUIに対して一切手を加えずに共有できるというものです。

とても納得がいきました。
0674デフォルトの名無しさん2012/11/10(土) 03:17:23.52
当たり前すぎる
0675デフォルトの名無しさん2012/11/10(土) 11:18:26.12
vector<kurasu> list;
list.push_back(kurasu1);

ってやったときコピーコンストラクタは呼ばれますか?
このpush_backってインスタンスのコピーを追加するんですよね??
0676デフォルトの名無しさん2012/11/10(土) 11:34:37.50
人間その当たり前をせずにどれだけ苦労してきたか
0677デフォルトの名無しさん2012/11/10(土) 11:36:29.96
ruby 1.9 におけるハッシュ飽和攻撃による DoS 脆弱性 (CVE-2012-5371)  
http://www.ruby-lang.org/ja/news/2012/11/09/ruby19-hashdos-cve-2012-5371
0678デフォルトの名無しさん2012/11/10(土) 11:39:14.84
>>675
ok
0679デフォルトの名無しさん2012/11/10(土) 11:53:41.92
>>678
ありがとう
0680デフォルトの名無しさん2012/11/10(土) 12:08:51.38
kurasuクラスにint型のGetSetがあるとして

kurasu* kurasu1 = new kurasu();
kurasu1->SetInt(123);

vector<kurasu> list;
list.push_back(*kurasu1);
としたかったんですが値がコピーされません。(list[0].GetInt()でぬるぽエラー

コピーコンストラクタを定義したせいでしょうか?
0681デフォルトの名無しさん2012/11/10(土) 12:20:54.18
upされてない部分について聞かれても答えようが無いであります
0682デフォルトの名無しさん2012/11/10(土) 12:22:11.13
list[list.size()-1].GetInt()
0683デフォルトの名無しさん2012/11/10(土) 12:30:19.23
>>680
kurasuの中身を書いた方が早い
0684デフォルトの名無しさん2012/11/10(土) 12:30:45.45
きっと reserve したかっただけなのに resize しちゃったんだろうと E. S. P.
0685デフォルトの名無しさん2012/11/10(土) 12:35:21.81
ごめんなさい、コピーコンストラクタの質問でした。

kurasu::kurasu(){
this.flag=false;
this.num=456;
}

kurasu::SetNum(int tmp){
this.Num=tmp;
}

kurasu::kurasu(const kurasu&){
this.flag=true;
}

こんな感じで、
kurasu* kurasu1 = new kurasu();
kurasu1->SetNum(123);
kurasu* kurasu2 = kurasu1;

と処理した時に
kurasu2.Numが456
kurasu2.flagがtrue
って・・・
0686デフォルトの名無しさん2012/11/10(土) 12:38:53.70
ぬるぽ関係ねえ
0687デフォルトの名無しさん2012/11/10(土) 12:40:46.68
>>685
入門書くらい買えよ、ハゲ。
0688デフォルトの名無しさん2012/11/10(土) 12:45:13.58
>>685
何がやりたいのか分からないけど、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
>>685
この部分
> 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.14
適当に戻り値をassertでチェックすればいいんじゃね
0692デフォルトの名無しさん2012/11/11(日) 02:09:24.24
>>690
エラー値を返すの「エラー値」が有無を示すプリミティブ値の
場合は戻り値を工夫すればいいんじゃないの。
たとえばエラーならtrue/エラーなしならfalseを返す関数なら
true/falseで返すのをやめて0-nの整数値で返すとか。
0693デフォルトの名無しさん2012/11/11(日) 04:40:18.08
それなら return __LINE__; して0の時が成功でいいんじゃ
0694デフォルトの名無しさん2012/11/11(日) 11:29:36.64
return __LINE__;
で0が返ることってあったっけ?
0695デフォルトの名無しさん2012/11/11(日) 11:30:02.40
ああエラーの時だけラインを返すって意味か。
0696 忍法帖【Lv=38,xxxPT】(1+0:5) 2012/11/11(日) 13:23:01.72
それなら__FILE__も欲しいわな。
0697デフォルトの名無しさん2012/11/11(日) 16:39:02.07
例外処理を知らないバカ共w
0698デフォルトの名無しさん2012/11/11(日) 16:49:05.06
例外処理で自慢とか (w
0699デフォルトの名無しさん2012/11/11(日) 16:53:25.89
で、その例外処理とやら、どう実装されてんの?
0700デフォルトの名無しさん2012/11/12(月) 00:31:01.14
C#でいうところのstatic classのようなものをC++で実現するにはどのようにしますか?

目的は
・インスタンス化できなくする
・staticメンバー関数・メンバー変数のみにする。

適当な純粋仮想関数を用意する?
0701デフォルトの名無しさん2012/11/12(月) 00:57:40.96
>>700
コンストラクタを private にする
あるいは、別解として無名名前空間に static 関数などを定義する
0702デフォルトの名無しさん2012/11/12(月) 01:03:04.57
>>700
たかだか8文字書き加えるか1行移動するだけで実現できるが、お前には無理。
0703デフォルトの名無しさん2012/11/12(月) 01:28:06.17
eclipseで「hello world c++ project」を実行すると
「nothing to build for project test」と表示され、実行できません。
原因は何でしょうか?
Pleiades-eclipse-4.2&MinGWを使っています。
「hello world c project」の方では何とか実行できました。
0704デフォルトの名無しさん2012/11/12(月) 01:48:37.20
>>703
あなたの環境固有の問題はほかの誰にも知ることはできません。
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.34
vectorの削除系メンバ関数について、以下の認識で合っているでしょうか?

remove:指定要素が取り除かれるように要素をコピーしていく(メモリ領域は解放されない)
pop_back:最後の要素のメモリ領域が解放される
erase:指定範囲の要素のメモリ領域が解放される
clear:全要素のメモリ領域が解放される

いずれも、削除された分だけsize()で得られる要素数が減らされる。
0707デフォルトの名無しさん2012/11/12(月) 20:58:09.92
vectorにremoveなんてあったっけ
0708デフォルトの名無しさん2012/11/12(月) 21:01:01.54
>>706
pop_back:要素数が減る。メモリ領域は解放されない
erase:指定範囲の後ろの要素が前に詰められ、要素数が減る。メモリ領域は解放されない
clear:要素数が0になる。メモリ領域は解放されない。
0709デフォルトの名無しさん2012/11/12(月) 21:04:30.44
pop_backは要素数がひとつ減るだった。あと消える要素はデストラクタが呼ばれるな
07107062012/11/12(月) 21:07:12.73
>>707
すみません、vectorにはremoveはありませんでした(汗)

>>708
え!?
メモリ領域解放されないんですか??
覚えておきます!

>>709
デストラクタが呼ばれるんですね。


ありがとうございました。
0711デフォルトの名無しさん2012/11/12(月) 23:22:10.13
>>710
C++11には確かスワップ技法を使わなくてもメモリを完全に解放するメンバ関数が加わったはずだけど
ど忘れした
0712デフォルトの名無しさん2012/11/12(月) 23:32:29.40
shrink_to_fit()
0713デフォルトの名無しさん2012/11/13(火) 00:19:50.83
>>712
ありがとう
これが出来て助かるんですよね
07147062012/11/13(火) 00:23:27.67
>>711-712
おお、覚えておきます!
0715デフォルトの名無しさん2012/11/13(火) 11:16:11.64
>>714
vector<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
shrink_to_fit は拘束力の無い要件なので、実装依存なんだよね
まぁ、大抵はちゃんと領域を適切にしてくれるだろうけれど
07177062012/11/13(火) 20:50:04.41
>>715
じつにクレバーな手法ですね!
shrink_to_fitが使えたとしても、
あえて使いたくなるかっこよさですw

>>716
覚えておきます!
0718デフォルトの名無しさん2012/11/13(火) 22:41:16.69
>>717
Effective STLに書いてあるよ
07197062012/11/14(水) 00:16:16.84
>>718
その本、持ってました・・・(汗)
たしか1年半ほど前に目を通したはずなんですが、
swap技法、ぜんぜん覚えてませんでした(汗)
付箋貼っておきました!
0720デフォルトの名無しさん2012/11/14(水) 01:05:19.75
https://gist.github.com/4066403
このコードをVisual Studio 2010 のVC10 CLコンパイラでコンパイルすると
意図した動作にならないんですが、コンパイラのバグでしょうか?
xには~0ULLが代入されるはずだと思うのですが、そうなりません。
0721デフォルトの名無しさん2012/11/14(水) 01:54:44.48
自分の書いたコードのバグを疑わない時点でおかしいでしょ。
0722デフォルトの名無しさん2012/11/14(水) 01:59:18.09
>>721
再現可能な最小のケースまで切り詰めたコードで
代入と三項条件演算子とprintf()しか使っていないのですが、
具体的にどこがバグっているのか教えていただけないでしょうか。
gccでは問題ないことを確認しています。
0723デフォルトの名無しさん2012/11/14(水) 02:02:14.19
非常に短いので、一応ここにもコードを貼りますが、

uint64_t value = ~0ULL;
uint64_t x = (value == ~0ULL ? ~0ULL : (value / 2.0 + .5));

MSVCコンパイラでコンパイルするると、xに~0ULLが代入されません。
0724デフォルトの名無しさん2012/11/14(水) 02:02:57.45
>>720
unsigned long long が 64bit を超えるようだと (uint64_t)~0ULL != ~0ULL になるだろうな。
MSVC10 の仕様は知らんけど。アセンブリコードでも出してみれば?
0725デフォルトの名無しさん2012/11/14(水) 02:05:14.23
>>724
MSVC10でのunsigned long longは64bitです。
同値の内容をif文で書けば問題はありませんし、三項演算子の最後の項の式を
もっと単純な整数値式にすればバグらなくなります。
0726デフォルトの名無しさん2012/11/14(水) 05:50:29.11
~0ULL と (value / 2.0 + .5) の型が一致してないのが原因だろうからキャストしろ
0727 ◆QZaw55cn4c 2012/11/14(水) 05:53:20.18
横からでごめんなさい。これもよくわからないんです
http://codepad.org/sOv4x56w
http://codepad.org/2a372NsZ
この差はなんだんでしょうか?うーん
0728デフォルトの名無しさん2012/11/14(水) 06:14:26.94
>>1をよく読みましょう
0729デフォルトの名無しさん2012/11/14(水) 07:25:51.89
>>725
ifと?:でアセンブリコード貼って
最適化なしの場合も
0730デフォルトの名無しさん2012/11/14(水) 09:34:43.55
>>720 の回答をいただきました。バグではないそうです。
http://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
>>720,723
>>726がいってるように>>723は
 uint64_t x = static_cast<uint64_t>( (value == ~0ULL ? static_cast<double>( ~0ULL ) : (value / 2.0 + .5)) );
と等価で~0ULLがdoubleで表現しきれず精度が欠落してる

gccで正常に動いているように見えるのは実数->整数の変換で表現しきれないときの処理の違いかな
ttp://ideone.com/S0ZbD6
0732デフォルトの名無しさん2012/11/14(水) 09:36:44.67
おうかぶった
0733デフォルトの名無しさん2012/11/15(木) 06:55:27.80
明解C言語、写経しながら進めるのって意外と大変
0734デフォルトの名無しさん2012/11/15(木) 08:45:57.73
楽をしても身に付かない
0735デフォルトの名無しさん2012/11/15(木) 10:20:17.72
プログラミング言語も言葉だからね
0736デフォルトの名無しさん2012/11/15(木) 12:47:16.70
エラーは友達 パソコンサンデー
0737デフォルトの名無しさん2012/11/15(木) 13:32:14.50
コンパイルエラーの体験も含めて勉強だから
0738デフォルトの名無しさん2012/11/15(木) 13:33:37.08
人間関係は壊れるとほとんど修復不可能だけど、
パソコンは買い換えれば済むからな。
0739デフォルトの名無しさん2012/11/15(木) 14:12:54.61
Mr.パソコンのご冥福をお祈りいたします。
0740デフォルトの名無しさん2012/11/15(木) 15:53:33.89
死んだのか 合掌
0741デフォルトの名無しさん2012/11/15(木) 18:55:36.15
MrじゃなくてDrだったか。
0742デフォルトの名無しさん2012/11/15(木) 18:56:26.32
http://ja.wikipedia.org/wiki/%E5%AE%AE%E6%B0%B8%E5%A5%BD%E9%81%93

これだね。
0743デフォルトの名無しさん2012/11/15(木) 19:06:01.80
1つのスレッドを、特定のコアに結びつけずに100%回すと、コアあたり(100/コア数)%使用しますよね
こういう場合、このスレッドがボトルネックになっていることを知る方法はありますか?
0744デフォルトの名無しさん2012/11/15(木) 19:16:27.75
よくある常駐監視ソフトでコア毎の使用率見ればいいんでねーの?
0745デフォルトの名無しさん2012/11/15(木) 21:11:31.36
スレッドごとに知りたいってことじゃないの?
方法知らないけど
0746デフォルトの名無しさん2012/11/15(木) 21:39:32.23
知ったところで対策はできないし意味はないと思うけど
知りたい気持ちはわかるな。
0747デフォルトの名無しさん2012/11/15(木) 22:17:09.66
>>743
Process Explorer とかで見ればいいんじゃね?
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

>>746
> 知ったところで対策はできないし意味はないと思うけど

当然自分が作ったソフトの話だと思うけど。
0748デフォルトの名無しさん2012/11/15(木) 22:48:53.75
TLB使いまわし出来る程に柔軟なスケジューラを備えたOSなんてあるの?
0749デフォルトの名無しさん2012/11/15(木) 23:23:37.60
TLBを使い回すってどういうこと?
0750デフォルトの名無しさん2012/11/16(金) 08:39:58.45
んー、CPU使用率は分からんがどこにどれだけ時間がかかってるかとか、処理の頭にデバッグ文とか
入れての推定ならある程度は可能かな
07517432012/11/16(金) 12:11:19.08
ありがとうございます。
ProcessExplorerと、プロファイラなど見てみます。
0752デフォルトの名無しさん2012/11/18(日) 00:04:17.89
2GB以上のファイルを読み込むプログラムを書く場合、
64bit用プログラムとしてコンパイルすれば

size_t fread(void *buf, size_t size, size_t n, FILE *fp);

size_tが64bitになり、対応できるのですが、

int fseek(FILE *fp, long offset, int origin);

fseekの場合はlong型なので、32bitのままで、2GB以上の位置にシークできません。
どうすればよいのでしょうか?
0753デフォルトの名無しさん2012/11/18(日) 00:06:14.96
>>752
http://d.hatena.ne.jp/shiku_otomiya/20091117/p1
07547522012/11/18(日) 00:19:34.05
>>753
助かりました!
ありがとうございました!
0755デフォルトの名無しさん2012/11/19(月) 04:56:19.93
正の重みがあるエッジでノードが接続されているグラフ構造で、エッジの重みから各ノード間の
距離がエッジの重みに準ずるようなノードの最適な配置(座標)を求めたいのですが、
Boost::Graphにそういったものはありますか?
それかまたは簡単に実装できるライブラリなどありますか?
JavaでいうJungみたいなのがあればいいのですが
0756デフォルトの名無しさん2012/11/19(月) 08:50:05.97
>755
>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と表示される

これも意図通りです。
しかし次の動作を行うと意図通りに行きませんでした。
07587572012/11/19(月) 16:57:11.97
char c = (midi_command.status<<4) | midi_command.channel;
qDebug("%x", c); // ffffff9b と出力される。本当は 9b を得たい。

ffffffのような文字が表示されてしまいました。
これはオーバーフローしてしまっている、という状態なのでしょうか。

char c に変わらず0x9bが代入されている状態にしたいのですが、
どのように書けば実現できますでしょうか。

char c = st.data;
qDebug("%x", c);
ですと、意図通り 64 が出力されますので、
ビット演算の辺りが怪しいと思っているのですが・・
環境は
$gcc --version
gcc.exe (TDM-1 mingw32) 4.4.0
です

教えていただけますと嬉しいです。
07597572012/11/19(月) 17:00:45.58
一点間違いがありました。
SampleStructの定義ですが、
unsigned channel : 5
ではなく
signed channel : 5
でした。
よろしくお願い致します。
0760デフォルトの名無しさん2012/11/19(月) 17:08:25.20
ttp://codepad.org/3SBpRAd3
07617572012/11/19(月) 17:13:57.59
レスありがとうございます。
代入先の変数がcharになっていまして、unsigned charが使えないんです。

なんとかしてchar cにうまく入れる方法はないものでしょうか。
0762デフォルトの名無しさん2012/11/19(月) 17:18:40.27
ttp://codepad.org/FyOcewLr
0763デフォルトの名無しさん2012/11/19(月) 17:20:13.98
可変長引数(printf の第二引数移行の箇所)に渡す過程で
最上位ビットがたってる 0x9c が int に拡張する際に符号を維持して拡張されただけ

printf("%x", (unsigned int)c);
qDebug("%x", (unsigned int)c);

こうすればどうだい?
0764 ◆QZaw55cn4c 2012/11/19(月) 20:01:37.31
>>763
>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.88
charをunsigned charにキャストしとけば符号ビットが拡張される事はないだろ
C言語256倍でも嫁
0766デフォルトの名無しさん2012/11/19(月) 20:17:38.65
C言語256倍読みたい
0767デフォルトの名無しさん2012/11/19(月) 20:22:59.02
char c=0x9a;printf(…,(unsigned)c);は
printf(…,(unsigned)(signed)c);だからな
0768 忍法帖【Lv=40,xxxPT】(1+0:5) 2012/11/20(火) 00:09:31.26
printf("%x", (unsigned int)c&0xff );
07697572012/11/20(火) 00:14:39.02
レスありがとうございます。
http://codepad.org/pAcflg6F
など、いろいろ試したのですがやはりうまくいきません。

qDebug("%x", (st.status<<4) | st.channel);
のところで、5bitの st.statusを左に4つシフトしてしまっているのは
うまくいかないのに何か関係があったりするのでしょうか?
(9bitになってしまう気がしますので)

char型に0x9b を代入しようとすると 0x9bが10進数の127を超えていますが、
2の補数表現のようなものでマイナスを表しているわけでもないですよね・・?
1ではなくffffffになっていますし・・
0770デフォルトの名無しさん2012/11/20(火) 00:26:16.40
おいおい、この数レスちゃんと読めよ
0771デフォルトの名無しさん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
c が charであれば データサイズが8bitしかないんだから
そもそも0x9b以外に入るわけがないんだけど。
0773デフォルトの名無しさん2012/11/20(火) 01:02:14.40
そもそも char は 1 byte だから 0x00-0xff までしかない
上に散々出てるが、単に出力時に拡張されて 0xffffff9b になってるだけで、c には 0x9b が入ってる状態になってる
http://codepad.org/p1EGSjVB
0774デフォルトの名無しさん2012/11/20(火) 01:02:58.08
ていうかqDebugでプリントする時にintに符号拡張されてるだけだ。
c に入ってる値はまぎれもない0x9bだから。
0775デフォルトの名無しさん2012/11/20(火) 01:04:37.59
強いて解決法をあげるとすれば

qDebug("%02x", c);

でいいんじゃないの?
0776デフォルトの名無しさん2012/11/20(火) 01:17:20.36
デバッガ位使えるんだろ?
いい加減、初心者過ぎませんか?
0777デフォルトの名無しさん2012/11/20(火) 01:17:36.07
上をちょろっと読んで、
printf("%x\n", (unsigned int)c);
printf("%x\n", (unsigned int)(unsigned char)c);
とか出てこないもんかな
0778デフォルトの名無しさん2012/11/20(火) 01:21:25.50
Cを勉強し始めたんだが、多重ループを使って*でピラミッド作ったりするときに
どの変数や数を使ってどう回すのっていう
のが全然思いつけないんだけど、これは慣れなの?
0779デフォルトの名無しさん2012/11/20(火) 01:24:26.78
まずは入門書を3冊ぐらい買って、出ているプログラムを
自分で入力して動作を確かめるところから。
0780デフォルトの名無しさん2012/11/20(火) 01:26:27.82
割りとマジで慣れしかない。逆に慣れれば、
「ここはiとjの2変数をこういう条件でループさせよう」
といったことが浮かんでくるようになる
0781デフォルトの名無しさん2012/11/20(火) 01:30:13.24
慣れ(経験による知識の蓄積と応用)だけで乗り切ってる人もいるけど本当に持つべきは本質的な概念を理解する力とそれを(プログラミング)言語化する能力
0782デフォルトの名無しさん2012/11/20(火) 01:31:05.22
慣れてくれば、打ち合わせ中に頭の中でコードを書いてる。
きっと俺だけじゃない…筈。
0783デフォルトの名無しさん2012/11/20(火) 01:33:30.62
>>756
ありがとうございます。
BoostにWikipediaの力学モデル (グラフ描画アルゴリズム)のアルゴリズムがあるんですね。
引数の準備が面倒そうだけど汎用性を考えてboostの方を使ってみます。
0784デフォルトの名無しさん2012/11/20(火) 07:01:54.92
>777
馬鹿には無理
07857572012/11/20(火) 11:23:48.11
レスありがとうございます。色々初心者でお恥ずかしいです。

なるほど、出力時に変な表示になるだけで実際には0x9bが入ってるんですね。符号拡張というのについて勉強してみます。ありがどうございましたm(__)m
0786デフォルトの名無しさん2012/11/20(火) 12:25:30.68
>>778
・お題: *でピラミッドを作る。
↓
*を横にある程度並べて、その上にそれより少ない数並べて天辺まで並べるとピラミッドに見えるだろう。
↓
縦に並べるにはループ制御変数にiyを、横に並べるにはixを使おう(別にi, jでもいいけど)。
↓
外側のループはfor (int iy = 0; iy < height; ++iy)で、
内側のループはfor (int ix = 0; ix < width; ++ix)だな。
↓
コンソールに出力するには上からのほうが都合がいいな。
等幅フォントで積み上げることを考えると、天辺は*が1個、その下は3個。つまり、width = iy * 2 + 1になるな。
↓
for (int iy = 0; iy < height; ++iy) {
int width = iy * 2 + 1;
for (int ix = 0; ix < width; ++ix) putchar('*');
putchar('\n');
}
おっと、*の列をセンタリングするために左側の空白も出力しなくちゃ。
例えばheightが2なら1個と0個か。つまり、width = height - iy - 1だ。
↓
i/fはheightだけでいいな。
↓
void printPyramid(int height)
{
for (int iy = 0; iy < height; ++iy) {
int width = height - iy - 1;
for (int ix = 0; ix < width; ++ix) putchar(' ');
width = iy * 2 + 1;
for (int ix = 0; ix < width; ++ix) putchar('*');
putchar('\n');
}
0787デフォルトの名無しさん2012/11/20(火) 21:19:22.95
みなさんありがとうございます。
慣れと知識が圧倒的に足りてないようですね。
頑張ってみます。
フローチャートみたいなのありがとうございました。参考にします。
0788デフォルトの名無しさん2012/11/20(火) 22:35:05.53
プログラムうんぬんではなくて
物を観察して作る能力が欠けてる
高機能障害の疑いがあるから
病院に行ったほうがいい
0789デフォルトの名無しさん2012/11/20(火) 22:43:16.00
肛門のピラミッドかw
0790デフォルトの名無しさん2012/11/20(火) 23:33:37.93
普通のCとEmbedded C++って言語仕様的にどっちが優れてますか?
0791デフォルトの名無しさん2012/11/20(火) 23:44:37.43
Embedded C++に比べたらCのほうが100倍まし
0792デフォルトの名無しさん2012/11/21(水) 00:43:30.38
配列を宣言時、0に限って以下のような記述が可能です。

int 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.05
仕様
0794デフォルトの名無しさん2012/11/21(水) 00:46:11.02
値 0 になるのは仕様

ところで、 int Val[10] = {}; でいいはずだが、VC++2008 はこの書き方ではダメなのか?
0795デフォルトの名無しさん2012/11/21(水) 01:01:07.13
>>792
> 浮動小数点フォーマットでビットが全て0というのは0.0fではないため、

IEEE754では全ビット0 = 0.0fだよ
「そうとは限らない」という意味では正しいけど
0796デフォルトの名無しさん2012/11/21(水) 01:06:42.39
> これは_aligned_recalloc(アライメント付き動的メモリ領域確保&0初期化)でも同様でした。
まで含めるならコンパイラ依存だね
0797デフォルトの名無しさん2012/11/21(水) 01:15:52.22
>>791
それは優劣を比較するたぐいの話ではない。
0798デフォルトの名無しさん2012/11/21(水) 02:23:27.01
>>794
問題ない。Cの癖でつい書いちゃうんだろう。
07997922012/11/21(水) 22:39:09.70
ありがとうございます。

>>794
{}でいいんですね。
知りませんでした。

>>795
全ビット0で0.0fだったとは・・・
失礼しました。
0800デフォルトの名無しさん2012/11/21(水) 23:33:40.23
符号部、指数部、仮数部ともに 0 のときは +0 を表すよう仕様を調整したともいえる
08017922012/11/21(水) 23:34:33.92
実にグッドな調整ですね!
0802デフォルトの名無しさん2012/11/21(水) 23:44:32.98
コンパイラは限定されるが
メンバ変数ポインタで確認するのが一番だよ
0803デフォルトの名無しさん2012/11/22(木) 01:59:52.22
>800
0の0乗は1だから
数学的には1が正しくね?
0804デフォルトの名無しさん2012/11/22(木) 02:13:56.52
0の0乗は未定義

指数部仮数部の話はベースが2だから、0のほげ乗と無関係

しかも、指数部が0は、0乗の意味でもない
0805デフォルトの名無しさん2012/11/22(木) 06:43:15.32
int Val[10] = {}; で0で初期化されるのか知らんかった。毎回memsetしてたわ
こんなのどこで知るの?
0806デフォルトの名無しさん2012/11/22(木) 06:48:23.85
>805
http://toro.2ch.net/test/read.cgi/tech/1349356417/
0807デフォルトの名無しさん2012/11/22(木) 07:36:29.62
コーディングミスなのか意図的なのか分かり辛いし
警告出るコンパイラもあるから
memsetしてるわ
0808デフォルトの名無しさん2012/11/22(木) 07:40:10.42
パフォーマンスは同じ?
0809デフォルトの名無しさん2012/11/22(木) 07:47:00.58
>>805,807
おいやめろ。
http://www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html
0810デフォルトの名無しさん2012/11/22(木) 08:26:50.14
整数(char, int, ...)ならOKじゃなかったっけ?
0811デフォルトの名無しさん2012/11/22(木) 09:05:28.37
>なので、memset を使うべきかどうかはコンパイラ任せにすればよいのです。

なんでこうなるの?
0812デフォルトの名無しさん2012/11/22(木) 09:15:59.56
>>809
人のすることに難癖つけてるだけだな、こんなのは
好きにしたらええよ
0813デフォルトの名無しさん2012/11/22(木) 09:18:58.15
memsetしたあとに
各フィールドに代入してるコードは
確かに間抜けだと思う
0814デフォルトの名無しさん2012/11/22(木) 09:19:25.41
>>811
memsetで正しく動作するアーキテクチャかどうかは、
プログラマに確実にわかると限らないから
0815デフォルトの名無しさん2012/11/22(木) 12:37:51.11
環境依存OKなスレなんだしmemsetが有益な環境なら好きに使えばいいよ
0816デフォルトの名無しさん2012/11/22(木) 14:10:48.33
全bitを0にしても数値として0になるとは限らないと言っておいて
0を代入して「こうすればいいのです」って矛盾しまくりだな。
0817デフォルトの名無しさん2012/11/22(木) 14:22:55.00
どこが矛盾?
0を代入すればコンパイラがよきにはからってくれるんだよ
0818デフォルトの名無しさん2012/11/22(木) 14:22:59.97
>>816
値の0と、(memset()で代入される)ビット0では意味が違うのよ。
0819 ◆QZaw55cn4c 2012/11/22(木) 19:23:22.80
>>813
TCP/IP を扱うのであれば当たり前
0820デフォルトの名無しさん2012/11/22(木) 19:30:05.60
>>1
0821デフォルトの名無しさん2012/11/22(木) 21:37:40.96
まあ配列ならstd::fill使うんだけどな
0822デフォルトの名無しさん2012/11/22(木) 21:39:04.23
>>819
TCP/IPとどう関係が?
0823デフォルトの名無しさん2012/11/22(木) 21:40:50.44
ビッグエンディアンがどうとかじゃねーの
0824デフォルトの名無しさん2012/11/22(木) 22:00:35.42
つまり、float fVal[ 3 ] = {} は

fVal[ 0 ] = 0.0f;
fVal[ 1 ] = 0.0f;
fVal[ 2 ] = 0.0f;

と等価であることがC++の仕様として保障されるけど、
memsetで0フィルする場合はコンパイラ依存の恐れがあると。
VC++では0.0fが各要素に代入される。
0825デフォルトの名無しさん2012/11/22(木) 22:02:44.89
std::fill 使えよ
0826デフォルトの名無しさん2012/11/22(木) 22:11:06.16
Win32アプリケーションを実行するWOW64
http://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.51
互換性のために仕方ない
0828デフォルトの名無しさん2012/11/22(木) 22:22:28.73
うるさくいえば代入でなく初期化で初期化子は整数の0だけどな
特にポインタの場合に全ビットの0フィルでなく整数の0での初期化であることが重要になる
08298262012/11/22(木) 23:21:08.69
>>827
互換性のためですか・・・
他にも、64bitなのにSystem32を使ったりと、違和感バリバリですね(汗)

気にしてもしょうがないので、気にしないようにします。
ありがとうございました。
0830 ◆QZaw55cn4c 2012/11/23(金) 00:12:28.68
>>822
socket() を呼び出す前準備、 struct sockaddr_in の陽に設定しない各メンバは bzero()等で0クリアしておく。
これを忘れるとはまる。
0831デフォルトの名無しさん2012/11/23(金) 00:46:48.95
最近のコンパイラだと、fill, fill_n, memset, = {} で全部同じコード吐くのな
0832デフォルトの名無しさん2012/11/23(金) 01:07:10.68
>>831
なんと!
0833デフォルトの名無しさん2012/11/23(金) 01:14:51.42
クラス内に静的メンバ変数をprivateで宣言するのと、
実装側のファイルにグローバル変数を宣言して使うのとでは、
名前空間で括られるかどうか以外に違いはあるのでしょうか??
0834デフォルトの名無しさん2012/11/23(金) 01:19:16.71
>>831
POD型の配列のときは特殊化してんだろ
0835デフォルトの名無しさん2012/11/23(金) 01:31:30.24
>>833
当たり前だが実装側ファイルのグローバル変数は
そのファイルに他のクラスのメンバやその他の関数が定義されてればそれらからもアクセスできる
0836デフォルトの名無しさん2012/11/23(金) 01:43:17.12
>>830
struct sockaddr_in foo = {0} でいいよね。
08378332012/11/23(金) 01:44:53.74
>>835
なるほど。
たしかに。
まぁ、1ファイル(翻訳単位)につき1クラスの実装しかしないようにするなら問題ないですね。

そもそも、極力、クラスには静的メンバ変数を使いたくないのですが、
Win32APIのOPENFILENAME構造体のlpstrFileメンバのための文字列配列確保を
ローカル変数や普通のメンバ変数にすると、
GetOpenFileName呼び出しが失敗します。
やむを得ず、グローバル変数にしていますが、何かスマートな方法はないものか・・・
0838デフォルトの名無しさん2012/11/23(金) 01:51:33.82
>>837
失敗の原因を調べろよ。
0839デフォルトの名無しさん2012/11/23(金) 01:53:50.19
末尾に\0が2つ要る
グローバル静的だと0初期化でたまたま動いてるんじゃね?
0840デフォルトの名無しさん2012/11/23(金) 01:56:00.02
普通にローカルだろうがメンバ変数だろうが動いてるけど
>>839の言うとおりちゃんと初期化してないんだろう
08418332012/11/23(金) 02:01:44.68
そういうことでしたか!
来週、会社で直します!
ありがとうございました!
0842 ◆QZaw55cn4c 2012/11/23(金) 02:19:44.22
>>836
厳密には否。
それは厳密には0クリアではない、メンバの中にポインタがあったり double があったりしたら。
自動変数を「代入のような書き方で」初期化するのも気にいらない、実際にはコードが生成されるのだから。
0843 ◆QZaw55cn4c 2012/11/23(金) 02:22:09.03
失礼。>>842 はねじれているね。
>>836 で正しいのかも。
しかし、自動変数を「代入のような書き方で」初期化するのはやはり気に入らない。
0844デフォルトの名無しさん2012/11/23(金) 02:36:21.52
>>843
Cで変数を初期化する構文は = ... によるものしかないんだが、
これが気に入らないとするとどんな初期化なら良いと言うの?
0845 ◆QZaw55cn4c 2012/11/23(金) 02:55:50.57
>>844
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
>>845
最後の int a; ... a = 1; は趣味の問題では済まない、明らかな害悪だろ。
使うところで宣言して初期化しろ。してください。
0847デフォルトの名無しさん2012/11/23(金) 03:57:39.66
>>843
「ゼロによる初期化」と捉えるから数値のゼロなのかビットパターンのゼロなのか混乱するのであって、
「組み込み型の初期値による初期化」と捉えれば混乱はないよね。
0848 ◆QZaw55cn4c 2012/11/23(金) 04:19:52.36
>>846
宣言と同時に初期化するのは相応のメリットがあるのでしょうね。ときどきいらぬトラブルに巻き込まれるのもそのせいですね。納得です。

>>847
組み込み型の初期値による初期化とビットパターン零による初期化がたまたま等価であったから bzero() を使った初期化でOKだったわけですね。
しかしビットパターン零による初期化は可能な限り避けたほうがいい。
とすれば >>836 が正解ですね。

考察が深まりました。ありがとうございました。
08498472012/11/23(金) 06:18:35.47
まあ、言葉遊びだけどね。
0850デフォルトの名無しさん2012/11/23(金) 07:04:32.15
>>841
お金を貰ってやってる仕事を2chで解決しようとするバカは死ねよ。
0851デフォルトの名無しさん2012/11/23(金) 09:11:44.20
別にいいと思うよ。こっちもヒントを貰うこともあるから回答しているんだし。
問題を一般化し、問題点を絞り込んで、人に聞く。その過程だけでもいい訓練になるから
他人に聞くことはどんどん少なくなるものだし。
0852デフォルトの名無しさん2012/11/23(金) 09:53:17.61
2chは無断ビジネス禁止
0853デフォルトの名無しさん2012/11/23(金) 10:00:21.61
結論:仕事だとはいちいち言わなくていい
0854デフォルトの名無しさん2012/11/23(金) 10:14:15.55
聞かれてもいないのに目的を言う必要はない。
技術的に興味を惹かれるネタなら答える人も現れるかも知れない。
上手に回答を釣るのも2chの醍醐味。
0855デフォルトの名無しさん2012/11/23(金) 12:37:40.44
趣味でプログラムやってる奴の質問なんて全体の5%もない。
できないのにできますとか言ってプログラマとして就職しちゃった基地害土方が
できなくて焦ってこの板できいてる。
だから質問のレベルも数年前に比べて格段に落ちた。
もう質問スレじゃなくて基地害土方の助け合いスレに変更すべき。
0856デフォルトの名無しさん2012/11/23(金) 13:58:53.34
教えることが、最良の勉強になる。
0857デフォルトの名無しさん2012/11/23(金) 14:13:11.40
>>856
バカに教えても勉強にならない。
0858デフォルトの名無しさん2012/11/23(金) 14:13:50.77
教えるのは馬鹿のためじゃない
自分のため
0859デフォルトの名無しさん2012/11/23(金) 15:27:28.06
情けは人の為ならず。
己の為。
0860デフォルトの名無しさん2012/11/23(金) 15:31:29.34
>>854
確かにね。
相手が興味を持ちそうなストーリーを添える、ってのも仕事・ブライベートに限らず、重要なスキルだからな。
0861デフォルトの名無しさん2012/11/23(金) 16:07:54.94
忘れるから
0862デフォルトの名無しさん2012/11/23(金) 16:37:32.59
2ch へのアクセス禁止で開発効率が大幅に低下
http://blog.livedoor.jp/lalha/archives/50156986.html
0863デフォルトの名無しさん2012/11/23(金) 16:52:33.77
昔はfj.*やcomp.*などのネットニュースでやってたことを、時代とともにその場が
かわっただけで禁止にしちゃいかんよね
0864デフォルトの名無しさん2012/11/23(金) 17:13:07.41
売名ができない点が、発言の内容に大きく影響している
★は売名がよほど成功してからだし
0865デフォルトの名無しさん2012/11/23(金) 17:50:33.85
楠楠
0866デフォルトの名無しさん2012/11/24(土) 09:24:07.60
>>846
使うところで宣言、初期化したって関数の冒頭でまとめてやったっていいじゃない
言語仕様は自由だ、だから余計に縛っちゃいやんでござる
0867 ◆QZaw55cn4c 2012/11/24(土) 09:31:33.95
>>866
初期化忘れは結構はまる
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
>>867
コンパイラで警告出すだろ?
0874 ◆QZaw55cn4c 2012/11/24(土) 11:04:53.45
>>873
精度はいまいち。bcc32とgccそれぞれに見落としがあることを経験している。javac は完璧。
0875デフォルトの名無しさん2012/11/24(土) 11:18:35.65
>>872
書くのなら、なんでインクリメントするのかを処理の塊で解説を頭に書いた方がスッキリするね
0876デフォルトの名無しさん2012/11/24(土) 11:22:18.73
Cあがりの人が冒頭で変数宣言してるの超うざい
初期化漏れが不安で仕方が無い
0877 ◆QZaw55cn4c 2012/11/24(土) 11:32:06.47
>>876
ごめん
0878デフォルトの名無しさん2012/11/24(土) 11:46:06.82
コピーコンストラクタでなく代入演算子が動くのも問題
0879デフォルトの名無しさん2012/11/24(土) 11:49:11.47
>>876
逆からみれば、必要になるまで宣言しないことは、最初から無計画に思いつきで書いてるように
みえちゃったりするわけよ
0880デフォルトの名無しさん2012/11/24(土) 11:52:14.64
>>879
んなこたーない
冒頭で書く事にこだわってバグを増やしたんじゃ世話ない
0881デフォルトの名無しさん2012/11/24(土) 12:24:01.13
テーブル使って
static const int arr[10] = {13, 13, 13, 13, 26, 26, 26, 26, 26, 26};
int y = x*arr[x]; // xは0〜9の整数値を取る変数
とするのと、
テーブル使わずに
int y = x*(13 >> (((x>>3) | (x>>2)) & 1));
とするのとでは、どっちが速いですかね?

あるいは、中間を取って
static const int arr[3] = {11, 22, 22};
int y = x*arr[x>>2];
とか、どうするのがいいでしょう?
0882デフォルトの名無しさん2012/11/24(土) 12:24:57.63
すみません、下の段落はarr[3] = {13,26,26}でした
0883デフォルトの名無しさん2012/11/24(土) 12:29:28.23
あ、もう一つ間違いが。
int y = x*(13 << (((x>>3) | (x>>2)) & 1));ですね。最初のシフトの向きが間違ってました
0884デフォルトの名無しさん2012/11/24(土) 12:38:19.07
実際にclock()とか使って数万回ループで計測してみれば?
どれも大差はなさそうだけど、保守性の良さで決めれば
0885デフォルトの名無しさん2012/11/24(土) 12:50:22.26
そうですね、実際測ってみるつもりなのですが、勉強目的でコードを書いているので、
何か速度の差を生む要因など分かる方がいれば参考にさせて欲しいなあと思ってます
0886デフォルトの名無しさん2012/11/24(土) 13:04:55.39
テーブル使うならxをかけた結果のテーブルを作って int y = arr[x]; だろ
0887デフォルトの名無しさん2012/11/24(土) 13:10:22.07
なるほど、それが一番テーブルを生かしたコードですね。
サイズ100のテーブルか純粋な演算か、どちらがいいのだろう。
0888デフォルトの名無しさん2012/11/24(土) 13:11:22.54
すみません、勘違いでした。サイズは変わらず10ですね。純粋に改善されたコードでした。
0889デフォルトの名無しさん2012/11/24(土) 13:14:24.46
必要なところの直前で変数を宣言できる仕様は
C++で最も素晴らしい拡張であると言っても過言ではない。
これができないだけで生C言語はイヤだ。
0890デフォルトの名無しさん2012/11/24(土) 13:16:27.33
>>881
int y = (x < 4 ? 13 : 26); が早い
mov, cmp, cmovl の3命令で済む
0891デフォルトの名無しさん2012/11/24(土) 13:20:37.57
って、さらにxかけるのね
int y = x * (x < 4 ? 13 : 26); だな
0892デフォルトの名無しさん2012/11/24(土) 13:22:49.18
>>890
そっちの方が速いんですか。
自分がそう思わなかったのは、if文は遅いということからの勘違い(アセンブラの知識が無いため)だと思うのですが、
?を使った文の場合はjmp命令が無いからif文とは全然違うもので、高速に動作するという解釈でいいのでしょうか
0893デフォルトの名無しさん2012/11/24(土) 13:31:21.06
>>892
jmp命令があれば遅くなるけどcmovcc命令を使えば速い(ccには比較方法が入る)
cmovccは条件が満たされる時のみ代入するというもの
cmovcc命令は後から導入されたため大昔の最適化ガイドだと「比較は使うな」と書いてあるかもしれないが、
既に導入された時期が大昔になったため使われる事を期待して全く問題なし
0894デフォルトの名無しさん2012/11/24(土) 13:31:59.19
三項演算子マンセー
0895デフォルトの名無しさん2012/11/24(土) 13:33:41.27
もちろんCPUに依存する事は言うまでもないので
他のCPUを使ってる時はとりあえず実測しろ
0896デフォルトの名無しさん2012/11/24(土) 13:36:42.47
昔のCPU使ってる人は切り捨てるので大丈夫です!
0897デフォルトの名無しさん2012/11/24(土) 13:37:03.41
>>893
そんな命令があるんですね
大変勉強になりました。三項演算子を見直しました
ありがとうございます
0898デフォルトの名無しさん2012/11/24(土) 13:44:57.06
x < 4 ? 13 : 26 は例えばこんな風にコンパイルされると思われる

mov eax, 13
cmp x, 4
cmovl eax, 26

実際には x は掛け算でも使うので
一旦レジスタに入れられるだろうけどね
(レジスタの余り具合にもよるだろうけど)
0899デフォルトの名無しさん2012/11/24(土) 13:50:50.90
なるほど、わかりやすいです
0900デフォルトの名無しさん2012/11/24(土) 13:51:03.46
これからは三項演算子ガンガン使います!
0901デフォルトの名無しさん2012/11/24(土) 13:57:58.73
ごめん、数値逆だった

mov eax, 26
cmp x, 4
cmovl eax, 13
0902 ◆QZaw55cn4c 2012/11/24(土) 15:53:38.05
>>894
http://toro.2ch.net/test/read.cgi/tech/1313183984/594
0903デフォルトの名無しさん2012/11/24(土) 16:40:26.04
「条件演算子」って言えよ。
0904デフォルトの名無しさん2012/11/24(土) 16:51:43.25
関係・比較演算子と紛らわしいから三項演算子の方が齟齬が無くていいよ
0905デフォルトの名無しさん2012/11/24(土) 17:30:27.46
ということにしたいのですね。
0906デフォルトの名無しさん2012/11/24(土) 17:49:27.30
もったいないのでわたしにください。
0907デフォルトの名無しさん2012/11/24(土) 19:19:10.09
ハテナコロンはダメですか?
0908デフォルトの名無しさん2012/11/25(日) 00:38:48.52
口頭で聞いたときは「"参考"演算子」だと思ってた。
式を解釈(参考に)して結果を選択するからかぁと納得。
0909デフォルトの名無しさん2012/11/25(日) 00:43:19.74
三項演算子の起源?はなんだろう、なんでこんな演算子というかからくりを組み込んだんだろう?
0910デフォルトの名無しさん2012/11/25(日) 01:02:27.03
そりゃわざわざifを使うのは冗長でいけてない状況が多いからだろう
記述が多ければ間違う可能性も多い。これは真理
0911デフォルトの名無しさん2012/11/25(日) 01:10:58.85
ifだと戻り値が返せないのがな。

ifに戻り値つけろよ。 あとvoidも変数の型に格上げしてテンプレートの引数で
voidとそれ以外を作る手間を省けるようにすべき。

typedefと同じ機能で前方参照にも使える typeclassみたいなのも作ってくれ。
0912デフォルトの名無しさん2012/11/25(日) 01:23:04.09
構文と式の違いだろ
戻り値ってなんぞ
0913デフォルトの名無しさん2012/11/25(日) 01:45:01.06
bool hoge;
if(bool = fuga == hage)
的なことじゃないの
0914デフォルトの名無しさん2012/11/25(日) 01:52:56.21
ifより三項演算子のほうがわずかに高速なコンパイラがあったな。
特定CPU向けでCPUの特性にあわせてるんだろうけど。
0915デフォルトの名無しさん2012/11/25(日) 01:58:53.28
>>913
hoge厨がしゃしゃり出てくるんじゃねーよ
異常者は書き込むな
0916デフォルトの名無しさん2012/11/25(日) 02:12:14.86
913のダメさ加減は識別子以前の問題だと思うがね
0917デフォルトの名無しさん2012/11/25(日) 02:19:14.11
>>913
お前頭おかしい自覚ある?
0918デフォルトの名無しさん2012/11/25(日) 04:34:50.39
hoge使ってる時点でどんなに正しいことを言ってても相手にされない。
頭の悪さが強烈に滲み出てるようなものだからね。
内容以前の問題。
0919デフォルトの名無しさん2012/11/25(日) 04:40:36.97
hogeに反応する奴はハゲ
0920デフォルトの名無しさん2012/11/25(日) 07:27:15.67
ん、if ((a = b) == c) じゃなくてif (a = b == c) でいいのか……
0921デフォルトの名無しさん2012/11/25(日) 08:42:36.94
論点が違っている。
0922デフォルトの名無しさん2012/11/25(日) 08:52:18.79
つか、多項式ならswitchを拡張する方がいいと思うけどな、先輩のCOBOLなんて
たぶん理想的な綺麗で求めてるような素直で簡潔なEVALUATEというものがある
0923デフォルトの名無しさん2012/11/25(日) 10:58:46.60
>>922
そういうの欲しいね。
代入じゃなくて、初期化で分岐させたいときがあって、
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
またhoge厨とアンチか

もういい加減ウザいから>>1に禁止って書いとけよ
0925デフォルトの名無しさん2012/11/25(日) 12:04:03.08
こう書けばシンプルで分かりやすいテーブルになる
const string str(val == 1 ? "one"
         : val == 2 ? "two"
         :       "invalid");
0926デフォルトの名無しさん2012/11/25(日) 12:39:46.82
hogeより素晴らしい意味の無いものを示す識別子てあるんですか?
0927デフォルトの名無しさん2012/11/25(日) 12:55:08.00
>>926
お前の生殖器
0928デフォルトの名無しさん2012/11/25(日) 14:17:11.77
printfを自分で作りたいのですが、参考になるソースコードを教えて下さい。
glibcのソースコードは見たんですけど、訳がわかりませんでした・・・
ウィキ (http://en.wikipedia.org/wiki/BIOS_interrupt_call) によると、
mov ah, 0x0e
mov al, '!'
int 0x10
で一文字表示できるようなので、これを駆使すればprintfを実装できそうな気がします。
どなたか、参考になる簡単なソースコード、もしくはサイトを知ってたら教えて下さい。
0929デフォルトの名無しさん2012/11/25(日) 14:27:51.58
環境が分からんことには答えようがないと思うが
0930デフォルトの名無しさん2012/11/25(日) 14:32:35.98
いまどき全然関係ないところを探し当てる、その程度の知識でprintfを実装とか
宿題としか思えない。
どうせ可変引数の練習だろうに、素直に1にwriteしとけ。
09319282012/11/25(日) 16:47:24.33
頑張ってglibcのソースコード読もうとしたけど結局分からんかった・・・
自作の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.03
いくらなんでもスレ違いだろう
0933デフォルトの名無しさん2012/11/25(日) 17:11:45.27
>>931
ここはC/C++のスレ。アセンブラを書きたいなら他に行け。
つーか、そのレベルでprintf()の実装なんて一ヶ月かけても無理だよ。
0934デフォルトの名無しさん2012/11/25(日) 17:12:41.56
printf()の実装か‥‥一度はてをつけてもいいかも
0935デフォルトの名無しさん2012/11/25(日) 17:33:06.78
>>931
死ね
0936デフォルトの名無しさん2012/11/25(日) 17:56:31.57
>>934
昔、組み込み機器用にサブセットを実装したなぁ…
0937デフォルトの名無しさん2012/11/25(日) 18:08:39.96
>>936
俺もやったw
つーか、標準ライブラリ使用禁止な仕事だったから標準ライブラリ互換の関数を幾つも作ったが、これは勉強になった。
かれこれ20年前の話。
0938デフォルトの名無しさん2012/11/25(日) 18:16:17.30
>>926みたいな基地害って英語の情報を調べたことがないんだろうな
世界各国でhogeがメジャーに使われてるとでも思ってんのか
マジで頭おかしいわこいつ
0939デフォルトの名無しさん2012/11/25(日) 18:33:25.85
>>909
「やってやる」ってノリ
単項と2項だけじゃ殺風景だから3項が必要な演算は何かないかとか
代入も単純代入だけじゃ殺風景だから演算付き代入も入れとこうとか
判断も if else だけじゃ殺風景だから switch case も入れとこうみたいのは
色んなコンパイラがこぞってやっていた

ちなみにビットと論理を区別しようといった次の瞬間 true は int の 1 みたいな糞ルールが生じた
0940デフォルトの名無しさん2012/11/25(日) 18:40:07.63
>>937 それ何のために禁止してんの?信頼性は自作のほうが落ちてるよね?
0941デフォルトの名無しさん2012/11/25(日) 18:54:01.12
既存のものはバグがある、俺が金を出して作らせたものにはバグはない
と言うバカスタマーせい
0942デフォルトの名無しさん2012/11/25(日) 18:56:00.47
メモリ使用量が多すぎたりROM化しにくかったりで標準関数が
使えないまたは使うのが難しい環境はあるんだよ。
0943デフォルトの名無しさん2012/11/25(日) 20:43:19.43
組み込み系だと、標準出力の概念がなかったりね。
0944デフォルトの名無しさん2012/11/25(日) 21:16:57.30
hogeは、米国発祥
0945デフォルトの名無しさん2012/11/25(日) 21:18:26.81
だから鬼畜米英なんだよ
0946 ◆QZaw55cn4c 2012/11/25(日) 22:57:54.26
>>939
lisp の cond じゃないの?
0947デフォルトの名無しさん2012/11/25(日) 23:23:24.34
>>940
組み込み系の場合は標準関数が用意されていない事もあるからそういう事じゃね
0948デフォルトの名無しさん2012/11/26(月) 00:08:24.17
コンパイルは通るけど、何も起こらないとか結構あるみたいね。
中身からっぽの関数が用意されてる感じで。
0949デフォルトの名無しさん2012/11/26(月) 00:40:18.52
標準入出力の概念自体がなかったりとか
0950デフォルトの名無しさん2012/11/26(月) 01:29:11.34
ARMCにはstringをバッファとして渡せるprintfとか入ってるんだよな。

いつかテンプレートで型セーフなprintfを作ろうかと思ってたが、作る手間はぶけたわ。
はよ標準にしてくれ。
0951デフォルトの名無しさん2012/11/26(月) 07:23:29.77
標準にするなら可変個引数テンプレートを使ったもので
0952デフォルトの名無しさん2012/11/26(月) 16:47:26.45
fooとかbarはここでも使っていいんですか
0953デフォルトの名無しさん2012/11/26(月) 17:50:44.09
はい
0954デフォルトの名無しさん2012/11/26(月) 20:01:41.80
hageは死ぬべき。
0955デフォルトの名無しさん2012/11/27(火) 11:00:25.39
boost::container::stringを使ってます
std::getlineだと弾かれるみたいなので
boost::container::getlineを使いたいのですが
std::stringstreamに該当するものが何なのか分かりません
(つまり、boost版のstring文字列を、行ごとに処理したいのでgetlineを使いたいが、つまづいています。)
具体的にはどうすればよいでのしょうか
0956デフォルトの名無しさん2012/11/27(火) 12:02:34.75
行ごとに切り分ける処理だけ自分で書けばいいんじゃないかな
0957デフォルトの名無しさん2012/11/27(火) 12:33:00.06
>>955
boostでそろえてboost.iostreams使えばいいんじゃないか

#include <iostream>
#include <boost/container/string.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/array.hpp>

int main()
{
boost::container::string s("abc\ndef\n"), d;
boost::iostreams::stream<boost::iostreams::array_source> st(s.c_str(), s.size());

while (st) {
boost::container::getline(st, d);
std::cout << ":" << d << std::endl;
}
}
0958デフォルトの名無しさん2012/11/27(火) 14:09:48.58
>>957
おおおぉぉおぉぉおおぉお!!
できました!!!!!

本当にありがとうございます。
0959デフォルトの名無しさん2012/11/28(水) 14:00:16.56
クラスの初期化について。

class 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.78
Init()とか作って投げる
0961デフォルトの名無しさん2012/11/28(水) 14:54:57.06
Hoge(int other) :Hoge(){ }
0962デフォルトの名無しさん2012/11/28(水) 15:52:18.70
Hoge(int other)
{
Hoge tmp;
*this = tmp;

// 以下、エキサイトなコード
}
0963デフォルトの名無しさん2012/11/28(水) 16:34:20.99
>>959
Hoge基地害は失せろ
0964デフォルトの名無しさん2012/11/28(水) 16:51:52.92
Visual Studio 2012でC++を使ってます。
"huge_array.h"
static const int huge_array[5948375] = {342, 2435, 235987, 894, ...(略)};
をインクルードしてコンパイルすると、コンパイルに時間がかかってしまうのですが
このように巨大な配列だと仕方のないことなのでしょうか?
初回コンパイル時だけでなく、"huge_array.h"をインクルードしているヘッダファイルを更新してからコンパイルする場合も遅くなるので困っています。
0965デフォルトの名無しさん2012/11/28(水) 17:18:32.96
cppに分けりゃいいんじゃね
0966デフォルトの名無しさん2012/11/28(水) 17:30:48.31
>>959
何をもって「いい」と判断するのかにもよるけど、
社会の不利益を減らすって意味ならお前が回線切って吊るのが一番いい。
0967デフォルトの名無しさん2012/11/28(水) 17:44:24.24
>959=ゴミw
0968デフォルトの名無しさん2012/11/28(水) 18:30:46.71
>>965
ありがとうございます
extern宣言を使って配列のデータをcppに移したらコンパイルの重さが解消しました
0969デフォルトの名無しさん2012/11/28(水) 18:36:43.47
hogeとかプログラミングにまでガラバゴス化を持ち込もうとしてる屑は何なの?
日本企業がIT関係でガラバゴス化やって散々な目にあったのにまだ分からないんだな
>>959みたいにガラバゴス化を持ち込もうとする屑がいる限り日本の産業に未来はない
>>959はマジで生きてるだけで迷惑
0970デフォルトの名無しさん2012/11/28(水) 18:47:13.40
hogeを覚える暇はあってもコーディングについて調べる暇はないとか終わってるな
0971デフォルトの名無しさん2012/11/28(水) 18:59:10.89
>>969
ガラバゴスじゃないよ、自分が間違ってんじゃん。ガラバルスだよ。
0972デフォルトの名無しさん2012/11/28(水) 20:07:04.25
相手にするなよ
0973デフォルトの名無しさん2012/11/28(水) 20:51:42.85
>>959←この基地害は何で荒らしにきたの?
0974デフォルトの名無しさん2012/11/28(水) 21:20:15.96
一々hogeがどうたらと荒らし回るなよ、と
というか、じゃあなにを使ってほしいんだ?
0975デフォルトの名無しさん2012/11/28(水) 21:23:57.09
>>959=>>972

Hogeとか使うくらいだから根性腐りきってるんだろ

根性腐ってる奴が自演してても特別不思議な印象は受けないな
0976デフォルトの名無しさん2012/11/28(水) 21:26:11.93
>>974
foo,bar
0977デフォルトの名無しさん2012/11/28(水) 21:36:25.53
ウゼえなまたか。
もうホゲ禁止ってテンプレ入れとけよ。
0978デフォルトの名無しさん2012/11/28(水) 21:37:15.88
椅子でもビアマグでも好きに使えばいい。
0979デフォルトの名無しさん2012/11/28(水) 21:53:36.51
ハゲを使えって話とは違うの?
0980デフォルトの名無しさん2012/11/28(水) 22:15:20.04
>>979
ハゲは死ぬべき
0981デフォルトの名無しさん2012/11/28(水) 22:16:13.40
禿には禿にしかできない仕事がある
http://labaq.com/archives/51770648.html
0982デフォルトの名無しさん2012/11/28(水) 22:27:51.88
あ
0983デフォルトの名無しさん2012/11/28(水) 22:32:04.91
>>964
そんな巨大な配列は外部ファイルにして
動的に読み出すのが普通
0984デフォルトの名無しさん2012/11/28(水) 22:50:39.13
にしてもhoge使う奴には知能の低い奴しかいないな
知識不足とか経験不足とかそういうレベルじゃない
根本的に知能の低い奴しかいない

>>959も例外じゃなかった
0985デフォルトの名無しさん2012/11/28(水) 22:58:06.59
>>983が言いたいことを言ってくれた

そろそろ次スレ立てるべきかね?
0986デフォルトの名無しさん2012/11/28(水) 23:02:16.78
hoge huga piyo全部禁止にしてくれ。
毎回毎回荒れてかなわん。
0987デフォルトの名無しさん2012/11/28(水) 23:10:27.84
>>986
メタ変数はfooとかbarとかを使えという掲示なのだよ……
0988デフォルトの名無しさん2012/11/28(水) 23:12:00.11
>>983
組み込み系だとそうもいかないときもあるけどね
0989デフォルトの名無しさん2012/11/28(水) 23:13:48.36
アンチhoge厨共は一応英語は分かってるみたいだなwhugeに食い付くだろうと思って見てたけど食い付かなかったw
0990デフォルトの名無しさん2012/11/28(水) 23:34:27.60
template<class hage> hoge{
...
}
0991デフォルトの名無しさん2012/11/29(木) 00:28:44.55
>>988
でも4*5948375≒23Mバイトも使える組み込みって……
0992デフォルトの名無しさん2012/11/29(木) 00:30:00.46
>>991
そもそもファイルという概念がない事もある
0993デフォルトの名無しさん2012/11/29(木) 00:35:14.07
>>992
そーなのかー

次スレ
【初心者歓迎】C/C++室 Ver.81【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1354116880/
0994デフォルトの名無しさん2012/11/29(木) 01:30:44.46
ある一線越えてRAMが別チップになるとギガビット単位になるからね
0995デフォルトの名無しさん2012/11/29(木) 02:46:56.33
hugearreyがなんなのかきになるわ
0996デフォルトの名無しさん2012/11/29(木) 04:04:02.35
またhoge厨が沸いてたのか
ほんと糞だな
0997デフォルトの名無しさん2012/11/29(木) 06:50:45.96
まだ埋まってなかったのか
0998デフォルトの名無しさん2012/11/29(木) 06:53:22.23
hogeに過敏に反応してるのがいるけど、禿なのか日本が大嫌いな隣の国の人なのかどっちなんだろうな
禿の人はそこまで心狭くないと思うけど
0999デフォルトの名無しさん2012/11/29(木) 07:09:30.60
Itenium を使う組み込みなんてのもある
1000デフォルトの名無しさん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⌒) ./| _ノ  __ノ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。