2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん: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

2 :デフォルトの名無しさん:2012/09/21(金) 19:16:51.17
余裕の2ゲットモナ(´∀`)

3 :デフォルトの名無しさん:2012/09/21(金) 20:57:49.50
>>1


4 :デフォルトの名無しさん: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
うめてんてー

↑うめてんてーって言う埋め方って一般的なもんなの?

5 :デフォルトの名無しさん:2012/09/22(土) 22:53:11.18
AAもあるよ
                      _ / \ _
                     / /    {┳ }
                     >{、     ,>-<
                   // -\__/ -ヽ \     、_、-‐     1
      ゝ       ┐    .  {  |⊂⊃ i  ⊂⊃|  }       }  、   T¨Τ
     , -―、   {_ノ―、     \ヽ 「 ̄ ̄ フ  / /     、-7 ̄   г¨Τ二7
    ´   }  /∨   }   r─\ ゝ ─ '  厶二⊃       / \    ΓΤ J
      _ノ   ヽハ _ノ      ̄`|  ̄ ̄ ̄ ̄  `ーァ    /    ヽ、    |
                      \       /
                       >、___ イ
                       し′  し′

6 :デフォルトの名無しさん:2012/09/22(土) 22:59:46.49
>>5
いやひだまらーだしうめ先生は知ってる
C++スレにまで出てくるとか(埋めレスとして)汎用性高杉

7 :デフォルトの名無しさん:2012/09/23(日) 13:35:32.90
多数がNGワードにしてるワードを>>1 に入れるのやめようや
一部を伏せ字にするとかさ工夫してくれ

8 :デフォルトの名無しさん:2012/09/23(日) 14:05:41.17
俺はNGNameでNGにしてるから>>1はNGにならない

9 :デフォルトの名無しさん:2012/09/23(日) 14:26:22.26
NGNameにはしてないけどNGWordにはしてる。

10 :デフォルトの名無しさん:2012/09/23(日) 14:49:48.91
だから NGName にしとけって暗に言われてるんだろ…

11 :デフォルトの名無しさん:2012/09/23(日) 14:50:44.32
いや言及してるレスの方が
はるかにウザイから

12 :デフォルトの名無しさん:2012/09/23(日) 14:52:02.67
たしかにw

13 :デフォルトの名無しさん:2012/09/23(日) 15:22:48.54
せめて二文字

14 :デフォルトの名無しさん:2012/09/23(日) 15:39:09.05
>>1をNG除外にしてるから何書かれようと問題ない

15 :デフォルトの名無しさん:2012/09/23(日) 16:52:18.40
>>14で出てた(当方Jane使い)

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

17 :デフォルトの名無しさん:2012/09/23(日) 19:51:10.92 ?2BP(0)
VS10 C++ です。
BOOL hoge(CString& sValue)
{
sValue = _T("");
}

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


18 :デフォルトの名無しさん:2012/09/23(日) 19:58:38.83
お前の言う初期化とはどういう状態になることなんだ

19 :デフォルトの名無しさん:2012/09/23(日) 20:01:07.28
アホ
どう言うも何も参照で取ってんだから
sprintf(sValue,"");
で十分じゃん

20 :デフォルトの名無しさん:2012/09/23(日) 20:01:07.81
>>17
文字列を空にしたいってことでしょ?
char*&sValueでsValue[0]="\0";
じゃないかな

21 :デフォルトの名無しさん:2012/09/23(日) 20:02:06.31
あ、&いらなかった

22 :デフォルトの名無しさん:2012/09/23(日) 20:10:49.55 ?2BP(0)
>>17ですが、
>>19>>20も全部エラーになるお、やりたいことは>>20と一緒
参照渡しの文字列を空にしたいのですが

23 :デフォルトの名無しさん:2012/09/23(日) 20:14:08.69
>>22
>>17の通りなら参照渡ししてるのは文字であって文字列では無い
まず引数をchar*sValueにするところから変更しなきゃ

24 :デフォルトの名無しさん:2012/09/23(日) 20:33:19.12
>>19
いけず

25 :デフォルトの名無しさん:2012/09/23(日) 20:36:37.69
>>22
hoge厨は初期化しなくていいから回線切れ

26 :デフォルトの名無しさん:2012/09/23(日) 20:43:34.86
文字(char)なのか文字列(char*)なのかどっちなのか

27 :デフォルトの名無しさん:2012/09/23(日) 20:50:36.19
文字列だお

28 :デフォルトの名無しさん:2012/09/23(日) 20:53:13.55
>>17
お前hogeとか使ってて恥ずかしくねーの?

本物のゴミか?

29 :デフォルトの名無しさん:2012/09/23(日) 20:56:46.87
>>28
しつけーぞhage

30 :デフォルトの名無しさん:2012/09/23(日) 20:56:52.69
>>17
hogeを覚える暇はあってもコーディングの技術を身に付ける暇はないとかマジでクズ。
お前みたいな奴社会にいらないよ。

31 :デフォルトの名無しさん:2012/09/23(日) 20:58:27.46
MFCが使える使えないに関わらず、std::stringを使えばいいじゃん。

32 :デフォルトの名無しさん:2012/09/23(日) 21:01:35.88
#ifdef _UNICODE
typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif

33 :デフォルトの名無しさん:2012/09/23(日) 21:06:12.07
もしかしてエラーの内容ってcharじゃなくてwchar_t使わなきゃいけない(もっと言えばTCHAR)だけだったりして

34 :デフォルトの名無しさん:2012/09/23(日) 21:13:02.76
>>17
おい愚図
お前みたいな愚図は学校や職場では
陰で氏ねばいいのにって言われてるんだろうな

本人気づいてないけどうちの職場にもいる

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

36 :デフォルトの名無しさん:2012/09/23(日) 21:18:04.57
>>17

























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

37 :デフォルトの名無しさん:2012/09/23(日) 21:21:32.22
>>22
キチガイが何でこのスレにいるの?

38 :デフォルトの名無しさん:2012/09/23(日) 21:23:46.66
えっ

39 :デフォルトの名無しさん:2012/09/23(日) 21:26:44.75
>>22
お前の存在自体がエラーwwwwwwww

40 :デフォルトの名無しさん:2012/09/23(日) 21:29:08.28
>>17も可哀想な奴だと思うよ。
親がゴミみたいな奴だからロクな教育受けてこなかっだんだろ。
しかも本人自覚ないみたいから余計に可哀想。

41 :デフォルトの名無しさん:2012/09/23(日) 22:02:01.86
もう全部unicodeで統一してくれないかな

42 :デフォルトの名無しさん:2012/09/23(日) 22:25:43.80
>>28
本物のの hage が聞くんじゃない

43 :デフォルトの名無しさん:2012/09/23(日) 22:25:48.12
>>17
ここは池沼用掲示板じゃねーんだよ
養護学校できけ精神異常

44 :デフォルトの名無しさん:2012/09/23(日) 22:27:43.51
>>42は髪が薄くなり始めてるのに気付いてない。

45 :デフォルトの名無しさん:2012/09/23(日) 22:39:37.79
散りゆく髪に未練などないさ俺たちは中高年
遠く弾けるドラム缶それが俺たちのオイルショック
吹き飛ばせるわけないだろ
体重計の秤量は 100kg 悪気もなく俺たちを
いぇいぇー ぶげらー

46 :デフォルトの名無しさん:2012/09/23(日) 22:41:57.58
>>40
>>17みたいな本物のゴミは自覚症状ないからある意味幸せだろ

47 :デフォルトの名無しさん:2012/09/23(日) 22:56:21.13
生きていたけりゃ 飲むしかないのさ
あいつはいつも俺にそういってた

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

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

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

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

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

# 銃声

48 :デフォルトの名無しさん:2012/09/23(日) 22:59:33.53
>>17
hogeとか書いて本当に恥ずかしくないの?

49 :デフォルトの名無しさん:2012/09/24(月) 00:04:33.52
またhoge嫌厨が沸いたか

50 :デフォルトの名無しさん:2012/09/24(月) 00:06:59.72
win32スレと同じだな

51 :デフォルトの名無しさん:2012/09/24(月) 00:32:58.38
こっちのほうがまだマシだな

向こうは常に荒れてるけど
こっちはhoge厨が湧かない限り荒れてない

52 :デフォルトの名無しさん:2012/09/24(月) 00:34:49.28
やってるやつは同じじゃねぇの?
そっくりなんだが

53 :デフォルトの名無しさん:2012/09/24(月) 01:22:20.62
同じだろうと同じじゃなかろうとどっちでもいいよ。
Hogeが来なければ荒れないみたいだからそれを祈るばかり。

54 :デフォルトの名無しさん :2012/09/24(月) 10:09:38.93
piyo厨も入れてやれ

55 :デフォルトの名無しさん:2012/09/24(月) 10:15:18.46
相変わらずhogeに対する凄まじい憎悪だな
そろそろコテ付けろよww

56 :デフォルトの名無しさん:2012/09/24(月) 10:37:12.54
hogeをngに入れとけばいいだろ

57 :デフォルトの名無しさん:2012/09/24(月) 10:53:27.13
それじゃ >>34 >>35 >>37 >>39 >>40 >>43 >>46 は消えねーだろww

58 :デフォルトの名無しさん:2012/09/24(月) 11:22:46.70
>>57
連鎖あぼーんにすればおk

59 :デフォルトの名無しさん:2012/09/24(月) 11:57:18.32
>>57
連鎖あぼーんとかない?
ブラウザによるのかな。

60 :デフォルトの名無しさん:2012/09/24(月) 12:17:36.40
>>55
まあここまで叩かれるの分かっていてhoなんとか使うのは初見か荒らしだろうな
>>57
侮蔑語をNGすればOK
>>58
>連鎖あぼーん
Janeだとそういった設定は無いんだが……別の専ブラならできるの?

61 :デフォルトの名無しさん:2012/09/24(月) 12:21:36.79
>>60
>侮蔑語をNG
「エラー」とか「ゴミ」とかはまだ普通に使う可能性がある単語だろ……

62 :デフォルトの名無しさん:2012/09/24(月) 12:36:08.08
それはNGしなけりゃいいだろ
それでも目に入る煽りはかなり低減できるだろ
100%クリーンな世界なんてないんだからそのくらいいいと思うけどね

とりあえずHOGE連鎖あぼーんでかなり減ると思うぞ

63 :デフォルトの名無しさん:2012/09/24(月) 12:50:37.67
>>60
ここに質問に来るような初心者は大抵初見だろw
毎回発狂するキチがコテつけりゃ済む話

64 :デフォルトの名無しさん:2012/09/24(月) 13:17:37.13
キチガイがコテつければ済む話だがキチガイがわざわざつけてくれるのか?
現実的でない。

65 :デフォルトの名無しさん:2012/09/24(月) 13:21:32.43
初見と初心者とか感激なくホゲ使っててまともな質問見たことねーな。

全ホゲあぼーんで問題なし。

66 :デフォルトの名無しさん:2012/09/24(月) 13:30:54.19
できるだけまともな日本語でどうぞ。いや、そもそも個人の感想なんてどうでもいいのだけれど。

67 :デフォルトの名無しさん:2012/09/24(月) 13:42:17.91
>>66は自分ではまともな日本語で書き込んでると思ってるのかなw

68 :デフォルトの名無しさん:2012/09/24(月) 13:51:00.04
>>63-65あたりを煽るために
わざと珍妙な日本語で書いてんだろ
お前釣られてんだよ

69 :デフォルトの名無しさん:2012/09/24(月) 16:04:19.42
スレ住人「あぼんするのでコテつけてください!」→マジキチ「了解です!コテつけます!」

性善説をこじらせるとこういう流れが妄想できるようになるの?

70 :デフォルトの名無しさん:2012/09/24(月) 17:55:10.54
俺はhoge厨もアンチも両方スルーできるけど、気になる奴はとりあえずNG設定しとけばいいんじゃね
hogeならNG設定しても困らんだろ

71 :デフォルトの名無しさん:2012/09/24(月) 22:17:57.88
うんこちんちん

72 :デフォルトの名無しさん: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
{

73 :デフォルトの名無しさん:2012/09/24(月) 23:21:35.58
おう間違えた

もういいや、寝る

74 :デフォルトの名無しさん:2012/09/25(火) 12:01:33.54
なにしとんねん

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

という警告メッセージ?がでます。
Explessから移行したばっかなので何がなんだかわからないのですが、どういうものなのでしょうか?

76 :デフォルトの名無しさん:2012/09/25(火) 21:27:10.57
リモートから見る時unsuccessfulbuildが存在すればビルドに失敗したんだなってわかるようになってる
普通に使ってれば気にしなくていい

77 :デフォルトの名無しさん:2012/09/27(木) 15:53:06.57
なぜコンストラクタは、returnでエラーをかえせないのですか?
exit()は、できる。

78 :デフォルトの名無しさん:2012/09/27(木) 17:14:02.83
return値をどうやって受け取るのですか?

79 :デフォルトの名無しさん:2012/09/27(木) 17:22:27.59
(´・ω・`)知らんがな

80 :デフォルトの名無しさん:2012/09/27(木) 17:24:33.50
超能力

81 :デフォルトの名無しさん:2012/09/27(木) 17:32:10.12
>>77
return 先のコード書いてみな

82 :デフォルトの名無しさん:2012/09/27(木) 17:39:54.69
>>77
returnが無ければ、例外を飛ばせばいいじゃない

83 :デフォルトの名無しさん: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;
}

84 :デフォルトの名無しさん:2012/09/27(木) 22:32:26.94
必要なのは getCount であって return ではないな
もしかして初期化子を知らないのか?

# 知らなくても代入でどうにでもなるが

85 :デフォルトの名無しさん:2012/09/28(金) 00:34:03.06
C++でゲームを作っていて、継承について質問です。

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

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

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

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

ゲームスレのほうがいいとは思ったのですが、処理だけ見ればC++に機能そのものなのかなと思いゲームスレではなくこちらで質問させていただきました。
よろしくお願いします。

86 :デフォルトの名無しさん:2012/09/28(金) 00:38:49.01
基底にvirtual bool IsGun()を作るとか
dynamic_castするとか

87 :デフォルトの名無しさん:2012/09/28(金) 00:41:47.86
>>85
つtypeid
つdynamic_cast

88 :デフォルトの名無しさん:2012/09/28(金) 00:43:16.44
typeinfoしか思いつかないなあ

89 :デフォルトの名無しさん:2012/09/28(金) 00:46:35.27
要するに.NETで言う所のリフレクションみたいな機能が欲しいんだろうと予想するけど

C++11ならdecltypeって使えるな

90 :デフォルトの名無しさん:2012/09/28(金) 00:47:14.91
使えねーよ

91 :デフォルトの名無しさん:2012/09/28(金) 00:50:04.04
はっきり言うが設計間違えてるからやり直し

92 :デフォルトの名無しさん:2012/09/28(金) 01:01:12.06
>>85
特に速度が必要ないならdynamic_castでNULL判定が楽

93 :デフォルトの名無しさん:2012/09/28(金) 01:19:46.33
>>91
俺もそう思うが、設計スレじゃないし、いいんじゃね?

94 :デフォルトの名無しさん:2012/09/28(金) 08:36:55.73
>>91
どんな感じにすればいいですか?

95 :デフォルトの名無しさん:2012/09/28(金) 09:42:12.28
ガチ素人ですがいろいろ聞いていいですか?

96 :デフォルトの名無しさん:2012/09/28(金) 12:49:39.57
そういうのは、サブクラス側に
bool canEquip(SlotType)
みたいな関数を用意すればいいんじゃね。

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

98 :デフォルトの名無しさん:2012/09/28(金) 18:59:06.86
まるで頭悪い発言スレだな
>>87 で FA

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

100 :デフォルトの名無しさん:2012/09/28(金) 20:57:57.65
何のための dynamic_cast や
ダウンキャストしてでも派生した方が良い場合もたまにある

ただ、今回がそれかどうかは別の話だが

101 :デフォルトの名無しさん:2012/09/28(金) 21:02:35.97
dynamic castするくらいならquery interfaceするわ

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

103 :デフォルトの名無しさん:2012/09/28(金) 21:07:54.40
具体的な情報が必要な抽象化とかわろす

104 :デフォルトの名無しさん:2012/09/28(金) 21:24:09.55
query interface は結局 dynamic_cast だろw

105 :デフォルトの名無しさん:2012/09/28(金) 21:26:40.73
JavaだのC#だのはobjectに値を突っ込んで
ダウンキャストで取り出すなんて日常茶飯事

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

107 :デフォルトの名無しさん:2012/09/28(金) 21:47:54.71
>>106
言いたいことがさっぱりわからんというかESPしても誤解が誤解を生むだけだから
なんか疑似コードでも書いておくれ

108 :デフォルトの名無しさん:2012/09/28(金) 21:52:09.68
>>97
アイテムスロットに登録する人、つまり型情報から判定を行う人は誰?
スーパークラス?



109 :デフォルトの名無しさん:2012/09/28(金) 21:56:32.68
まあ、装備の種類みたいなのはクラスで分けずに
パラメータ化するのが普通じゃね

110 :85:2012/09/28(金) 22:49:22.65
http://codepad.org/fp98nlIJ
こんな感じです。
3ウェイハンドシェイクとか忘れてください。

111 :デフォルトの名無しさん:2012/09/28(金) 23:03:22.83
そうとう重症だなこれは

112 :デフォルトの名無しさん:2012/09/28(金) 23:20:37.91
>>110
ちょっとぉ、だいぶ>>85のイメージと違うんだけど。。。

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

その相互依存はいくない。


113 :デフォルトの名無しさん:2012/09/28(金) 23:20:46.27
Equipにvirtual int GetSlot();を実装

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

とでもしとけ


114 :デフォルトの名無しさん:2012/09/28(金) 23:28:57.41
>>112
ごめん、見間違えた。
そのコードならいいんじゃね?
俺ならこうするってのはあるけど、それほどおかしくはないと思う。
強いて言えば、タイプをキーにして配列やマップに結びつけるかな。


115 :デフォルトの名無しさん:2012/09/29(土) 11:36:37.73
メソッドチェイン用に外部に保持されないプロクシを作れないだろうか

// ok
obj.Proxy().Method();

// ng
auto proxy = obj.Proxy();
proxy.Method();


116 :デフォルトの名無しさん:2012/09/29(土) 12:30:54.25
プロキシクラスのコンストラクタをprivateにしてプロキシを返す関数とかをfriendにすれば

117 :デフォルトの名無しさん:2012/09/29(土) 19:30:44.75
MinGWでWin32APIを使っての開発を行っています。

http://codepad.org/fDEMyIto

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

アドバイスお願いします。


118 :デフォルトの名無しさん:2012/09/29(土) 19:41:33.53
だって自分で閉じてるじゃん。
何が疑問なのかわからないくらい。

119 :デフォルトの名無しさん:2012/09/29(土) 20:39:33.01
汚たねぇブロック配置だな

120 :デフォルトの名無しさん: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に出来る対象をテンプレートで指定したいんですができません
どうすればうまくいきますか?

121 :デフォルトの名無しさん:2012/09/29(土) 22:04:53.87
>>117
Windowsでは一般にGetしたものはReleaseするものであってCloseするものじゃない

122 :デフォルトの名無しさん:2012/09/29(土) 22:19:24.47
お二方アドバイスありがとうございます。

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

>>119
お目汚し失礼しました。
C++を学習し始めたばかりですので、お手本お願いできますか?


123 :デフォルトの名無しさん: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;

124 :デフォルトの名無しさん:2012/09/29(土) 23:34:58.93
>>123
!!!!!!!!!!!!!!!
!!!ありがとうございます!!!
!!!!!!!!!!!!!!!


125 :デフォルトの名無しさん:2012/09/30(日) 08:25:09.20
>>115
コピーコンストラクタなどをprivateにしてもauto&&で持つことが出来るよそれ

126 :デフォルトの名無しさん:2012/09/30(日) 17:07:55.29
現在C++をVisualStudio2010Expressでゲームを作っていますが、C#のようにいわゆるポトペタでGUI部品やスプライトを配置して中身をC++で書けるような技術はありますでしょうか?
Qtを調べたのですがゲームにはあまり向いていないと書いてありました。

127 :デフォルトの名無しさん:2012/09/30(日) 17:46:39.17
残念ながらExpressにはリソースエディタがない
リソースファイルはテキストで直接編集するしかない

128 :デフォルトの名無しさん:2012/09/30(日) 18:14:35.99
Qtを使うのならVisualStudioは要らんな。

129 :デフォルトの名無しさん:2012/09/30(日) 18:23:18.96
ゲームなら自前で全部描画が基本じゃね

130 :デフォルトの名無しさん:2012/09/30(日) 23:25:32.80
フリーのリソースエディタ

131 :デフォルトの名無しさん:2012/10/01(月) 15:52:51.27
任意のEXEから呼出されるDLLで作成する
スレッドとファイバのスタックサイズを
4KB未満に小さくするにはどうすれば良いですか?

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

32ビットXPでできる方法はありませんか?

132 :デフォルトの名無しさん:2012/10/01(月) 16:14:38.57
ファイバーは知らないけど、スタックはスレッド固有の領域だから
ページサイズ以下には出来ないんじゃないの?
仮に出来てもページサイズ単位になるだろうし

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

134 :デフォルトの名無しさん:2012/10/06(土) 10:04:45.03
if(((char *) p - (char *) 0) % align == 0) Good();


135 :デフォルトの名無しさん:2012/10/06(土) 10:24:06.85
なるほど、NULLがアドレス0ならばこれでアドレスを求められるわけですね。目から鱗です。

136 :デフォルトの名無しさん:2012/10/06(土) 13:35:32.67
ところがだ、連続していることが保証されていないポインタ同士の減算は未定義だから巧くないんだな。
で、どうせ環境依存になるんだからintptr_tにキャストすればOK。

137 :デフォルトの名無しさん:2012/10/06(土) 13:38:32.52
>>136
何度も議論されてるようにintptr_tではサイズが足りる保証はない

138 :デフォルトの名無しさん:2012/10/06(土) 13:40:21.78
>>136
それはイテレーター全般の話だろ
ポインタはvalid rangeじゃなくてもオフセットを取得出来る

139 :デフォルトの名無しさん:2012/10/06(土) 14:00:22.33
つ ptr_diff_t

140 :デフォルトの名無しさん:2012/10/06(土) 14:10:00.90
>>139
それも同じでサイズが足りる保証はない

141 :デフォルトの名無しさん:2012/10/06(土) 14:14:36.17
オフセット取得でサイズが足りなくなる例を一個示してくれ
何度も議論された成果を1行で示すくらい、簡単だろう?

142 :デフォルトの名無しさん:2012/10/06(土) 14:16:29.60
>>141
>>135

143 :デフォルトの名無しさん: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なら保証されるが定義されている保証はない

144 :デフォルトの名無しさん: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バイトの環境で、とか言い出されたら、もうハイハイとしか言いようがないけども

145 :デフォルトの名無しさん:2012/10/06(土) 15:06:35.67
俺は>>143しかレスしてないが・・・
まあ>>134が同じ配列オブジェクトの要素だと強弁するならそれでいいんじゃないの
百歩譲っても(char*)0が配列オブジェクトの要素を指してるなんてありえないと思うけど

146 :デフォルトの名無しさん:2012/10/06(土) 15:17:48.27
>>134 から始まって、最初に規格書から「配列オブジェクト」を持ちだしたのは>>144だろ

147 :デフォルトの名無しさん:2012/10/06(土) 15:18:29.08
143だった

148 :デフォルトの名無しさん:2012/10/06(土) 15:23:59.43
それで、結局のところ「安全にアドレスを整数変換できる方法」はどうすればいいんですか?
あなたたちはあれはだめこれはだめというばかりで一向に話を進めようとしないじゃないですか

149 :デフォルトの名無しさん:2012/10/06(土) 15:25:20.34
俺はuintptr_tに突っ込んでます

150 :デフォルトの名無しさん:2012/10/06(土) 15:29:42.29
「安全にアドレスを整数変換できる方法」は環境依存しないかぎり存在しない
intptr_tかuintptr_tがあればそれを使うのが安全

151 :デフォルトの名無しさん:2012/10/06(土) 15:40:19.14
>>146
それが何かおかしい?

152 :デフォルトの名無しさん:2012/10/06(土) 15:45:24.94
std::sprintf(buf, "%p", p);
if(BigInt::FromString16(buf) % align == 0) Good(); // EXCELLENT!!

153 :デフォルトの名無しさん:2012/10/06(土) 15:55:52.11
%pでの出力形式は実装定義だからあんまり意味ないな

154 :デフォルトの名無しさん:2012/10/06(土) 16:09:32.37
if(BigInt::FromBytes((unsigned char *) &p, sizeof(p), ByteOrder::Check()) % align == 0) Good(); // Amazing!!!

155 :デフォルトの名無しさん:2012/10/06(土) 16:33:19.07
http://www.kouno.jp/home/c_faq/c5.html#17
それだけがんばってもこういう環境ではうまくいかない件

156 :デフォルトの名無しさん:2012/10/06(土) 16:38:05.76
そんなマニアックな環境はボイコットしろ

157 :デフォルトの名無しさん:2012/10/06(土) 16:39:47.31
>>133の環境に限定するならUINT_PTRにでもキャストすればいいんだけどな

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

159 :デフォルトの名無しさん: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 が真っ当な方法

160 :デフォルトの名無しさん:2012/10/06(土) 19:02:42.60
>>158
アライメントの定義は下位ビットでしょ?
問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
キャストできるならその答えは Yes になる

どうせ上司あたりから受け取ったポインタのアライメントを確認するように!と
言われたんだろう。
「x86ならアライメントエラーにならないから平気ですよ」と言い返そう
そのあと「あ、ARMだと例外おきますね。ARMも対応するんですか?なら直してきます」
と言って席に向かおう

161 :デフォルトの名無しさん:2012/10/06(土) 19:17:04.09
>問題は整数にキャストできるか(かつそれがアドレス値か)どうかで、
>キャストできるならその答えは Yes になる

ポインタを整数にキャストできることは保証されているが、それがアドレスか
どうかは規定されてないだろ。

162 :デフォルトの名無しさん:2012/10/06(土) 19:21:27.24
ARM対応予定はないけどSSE使うから直せとか言われるオチ

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

164 :デフォルトの名無しさん:2012/10/06(土) 20:13:57.58
VC は alignas ないんだっけ

165 :デフォルトの名無しさん:2012/10/06(土) 21:02:33.91
ない

166 :デフォルトの名無しさん:2012/10/06(土) 21:50:36.98
ポインタのアラインメントっていわれると&pのアラインメントを思い浮かべちゃうんだけど

167 :デフォルトの名無しさん:2012/10/06(土) 21:56:01.43
ん?それでいいんじゃないか?
それともポインタ変数のアライメントのことを言ってるのか?

168 :デフォルトの名無しさん:2012/10/06(土) 22:30:27.72
void * p; &p;ってことね
アドレスのアラインメントっていってくれたほうがわかりやすい


169 :デフォルトの名無しさん: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
というエラーを吐いてコンパイルが出来ません。いったい何がまずいのでしょうか。

170 :デフォルトの名無しさん:2012/10/07(日) 06:40:26.51
algorithmのfind()を使えば?
それとc++なら、std::coutを使いましょ

171 :デフォルトの名無しさん:2012/10/07(日) 06:43:55.38
templeteがまずい

172 :デフォルトの名無しさん:2012/10/07(日) 06:44:15.83
>>169
×templete
○template
あとsizeof(elems)は配列の要素数を返さないのでそれじゃまともに動かないよ

173 :デフォルトの名無しさん:2012/10/07(日) 08:26:40.90
>>169
とりあえず初心者はVC++かeclipse使って色付けてもらえよ
そしたらこんなしょうもないエラーに悩まされることはないはずだから

174 :デフォルトの名無しさん:2012/10/07(日) 08:28:09.60
>>170
多分標準ライブラリがあると思ったのですが、
言語の機能を学びたいとおもいこんなことをやっています。

>>171,172
> ○template
それでした、下らなくてすんません
sizeofは自分もそう思ったのですが、
char[]の配列をいくつか作って試してみた限りでは
きちんと配列の長さを返してくれたのでそのままにしてあります
これって仕様に無い実装依存の挙動だったりするんですか?

175 :デフォルトの名無しさん:2012/10/07(日) 08:43:31.39
>>174
ttp://ideone.com/7CRnJ
本当に返してるかきちんと調べたか?

176 :デフォルトの名無しさん:2012/10/07(日) 08:56:18.78
>>173
emacsを使ってますが色の意味が分かりませんでした……

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

177 :デフォルトの名無しさん:2012/10/07(日) 09:01:31.25
>>176
配列は通常の方法では関数に渡せないからね。渡しているのはポインタ。
関数内で配列のサイズを知りたければ、テンプレート引き数として配列を渡す位しか手がないよ。

178 :デフォルトの名無しさん:2012/10/07(日) 09:05:46.23
>>177
まあそうなんですが
直接書いて長さ返してくれるなら
インラインは最終的に直接書いたのと同じにならないかなー、と思ったんですが
やっぱりこういうのはあんまりやらない方がいいですね

179 :デフォルトの名無しさん:2012/10/07(日) 09:38:10.37
>やっぱりこういうのはあんまりやらない方がいいですね
バグの温床になるからしない方が良いかと。

180 :デフォルトの名無しさん: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が設定されます。

以前同じ問題で悩んだことがあったので
参考までに。


181 :デフォルトの名無しさん:2012/10/08(月) 15:47:59.92
バルバロス「バオーwwwwwwwwwww」

182 :デフォルトの名無しさん:2012/10/08(月) 15:49:24.24
ルポニ「ランーーwwwwwwwwwwwwww」

183 :デフォルトの名無しさん:2012/10/08(月) 16:02:19.90
コナニゾ「ムゾコナwwwwwwwwwww」

184 :デフォルトの名無しさん: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

185 :デフォルトの名無しさん:2012/10/08(月) 21:45:15.74
ラゾコンナ「ンババババwwwwwwwwwwwwwwww」

186 :デフォルトの名無しさん:2012/10/08(月) 22:39:33.65
>>184
send( ), recv( ) の直前でソケットの値表示して、本当に正しいソケットに
対して操作しているか確認しなよ。

もしくは、ソースさらして。

187 :デフォルトの名無しさん:2012/10/08(月) 22:41:47.22
>>184
えーと、サーバ側アプリを書いているんだよね?
受信したスレッドと送信したスレッドはきちんと把握できている?
ひょっとしたら、メインスレッドで受信してメインスレッドで送信しているんじゃない?

188 :デフォルトの名無しさん: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関数は


189 :デフォルトの名無しさん:2012/10/08(月) 23:26:54.96
すみません、ソース書いてる途中に間違って送信してしまいました。
>>1のサイトを使ってもう1回書きます。

190 :デフォルトの名無しさん:2012/10/08(月) 23:34:41.84
ttp://codepad.org/tzuheXNf
先にも書きましたが、受信データの解析・送信はメインスレッドのあるクラスの関数でおこなっています。
SOCKETを渡して、それをsendに指定しているのですが、もしかしてメインスレッドのクラスでsendしているのが問題なのでしょうか

191 :デフォルトの名無しさん:2012/10/08(月) 23:53:19.41
>>188
>  CThread* cthread = new CThread( socket2, this );
>  cthread.start();

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

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

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

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




192 :デフォルトの名無しさん:2012/10/09(火) 01:35:08.28
実は java という気がします

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

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

194 :デフォルトの名無しさん:2012/10/09(火) 06:46:12.36
サブスレッドで受けた後
メインスレッドで処理して
間違ったサブスレッドで送り返していたと



195 :デフォルトの名無しさん:2012/10/09(火) 23:35:01.10
パゾコナン「マニアwwwwwwwwww」

196 :デフォルトの名無しさん:2012/10/09(火) 23:36:11.75
>>180
おお、これはすごい
勉強になります
ありがとうございます

197 :デフォルトの名無しさん:2012/10/09(火) 23:40:12.58
コナニーゾ「ハラバロwwwwwwww」

198 :デフォルトの名無しさん:2012/10/10(水) 00:00:03.89
uyうぜーよ消えろ

199 :デフォルトの名無しさん:2012/10/10(水) 00:09:00.78
コナニール「バンバンwwwwwwwwwwwww」

200 :デフォルトの名無しさん:2012/10/10(水) 00:42:56.19
uyって朝鮮人だってな

201 :デフォルトの名無しさん: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はアドレスですよね?
なぜアドレスを値に代入できるのでしょうか?

202 :デフォルトの名無しさん:2012/10/10(水) 09:14:34.59
死ね
臭い質問すんなゴミ

203 :デフォルトの名無しさん:2012/10/10(水) 09:15:55.61
>>201
*j には入れてない
j に入れている

204 :デフォルトの名無しさん:2012/10/10(水) 09:16:20.76
ナロコロ「バーローwwwwwwwwwwww」

205 :デフォルトの名無しさん:2012/10/10(水) 10:25:05.11
>>201
関数の引数は代入ではなく変数の宣言と同じ
*j=p; ではなく
int *j=p; と同じ(おおまかには int *j; j=p; と同じ)

206 :デフォルトの名無しさん:2012/10/10(水) 12:13:40.69
ルポナニ「バロバローwwwwwwwwwwwww」

207 :201:2012/10/10(水) 16:47:46.04
>>205
>関数の引数は代入ではなく変数の宣言と同じ

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

208 :デフォルトの名無しさん:2012/10/10(水) 16:48:21.12
ナロバリア「バロスwwwwwwwwwww」

209 :デフォルトの名無しさん:2012/10/10(水) 16:49:01.83
プラニア「ナバルアwwwwwwwwwwwwww」

210 :デフォルトの名無しさん: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;
}


211 :デフォルトの名無しさん:2012/10/10(水) 18:29:54.16
ある所がわからないってのは、そこより前段階の基礎的な所をわかったつもりでわかってない(間違って理解している)ことが原因のときもあるな

212 :デフォルトの名無しさん:2012/10/10(水) 19:18:09.11
パルパニア「ニアアwwwwwwwwwwwww」

213 :デフォルトの名無しさん:2012/10/10(水) 19:30:47.95
ニニル「バーロウwwwwwwwwwwwww」

214 :デフォルトの名無しさん:2012/10/10(水) 22:29:08.14
コナニ「ウハーwwwwwwwwwwwwwwwww」

215 :デフォルトの名無しさん:2012/10/11(木) 00:20:02.72
関数中のstatic変数はスタックでしょうかヒープでしょうか?
いわゆるシングルトンもそれと同じになると考えて問題ないですか?

216 :デフォルトの名無しさん:2012/10/11(木) 00:28:08.08
スタックでもヒープでもない
シングルトンはデータの置き場所としては普通の変数と同じだけど
初期化コードの必要性によって事情が変わる

217 :デフォルトの名無しさん:2012/10/11(木) 00:34:38.68
スタックでもヒープでもなく、初期化コードの必要性?で変わるとなると一気にわからなくなりました
どう理解すべきでしょうか?

218 :デフォルトの名無しさん:2012/10/11(木) 01:00:33.00
伝統的なメモリモデルは次の形をとる。
text+data+bss+heap+stack
textはコード
関数中のstaticな変数も含めて生存期間がプログラム実行時と同じ変数はdataかbssに置かれる。

なお実行可能ファイルに含まれるのはtextとdata。
>>216
>初期化コードの必要性によって事情が変わる
というのはdataにおくかbssにおくか、の判別を指すと思う。

適当な参考書籍やurlはよくわからない、すまない。

219 :デフォルトの名無しさん:2012/10/11(木) 01:02:53.24
データのおき場所は宣言の仕方によってことなる
初期化コードの内容によって宣言の仕方が変わる

220 :デフォルトの名無しさん:2012/10/11(木) 01:19:45.99
>>219
>初期化コードの内容によって宣言の仕方が変わる
適当な例を思い浮かべられないのだが?

221 :デフォルトの名無しさん:2012/10/11(木) 01:27:16.13
初期化/終了タイミングがどうでもいいならただのstatic変数、重要ならshared_ptrを使うみたいな感じ


222 :デフォルトの名無しさん:2012/10/11(木) 01:39:39.13
>>221
破壊のタイミングをしっかり管理したいときになんでshared_ptrなんだよ

223 :デフォルトの名無しさん:2012/10/11(木) 01:46:39.77
>>215
> 関数中のstatic変数はスタックでしょうかヒープでしょうか?
まず規格上の言語仕様にはスタック領域・ヒープ領域といった実装レベルの概念に対する規定はない
よって全てはコンパイラの実装に依存する
そしていまどきのPC用のコンパイラの実装であれば少なくともスタック領域ではないところに配置されると思っていい

> いわゆるシングルトンもそれと同じになると考えて問題ないですか?
いわゆるがGoF本でのシングルトンパターンのことなら関数中のstatic変数を使って実装することになるので当然同じになる

224 :デフォルトの名無しさん:2012/10/11(木) 02:05:48.90
>>222
少し考えればわかるよ

225 :デフォルトの名無しさん:2012/10/11(木) 02:15:29.60
>>224
知りたくもない話だ。

226 :デフォルトの名無しさん:2012/10/11(木) 06:35:58.65
>>201
*j に p を代入と言うのは、式で書けば *j=p と言う事だが、どこでそんな事をしている?

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

int* j=p;
と同じね

227 :デフォルトの名無しさん:2012/10/11(木) 07:06:56.28
大昔の C での関数宣言を思い出したよ・・・

void f(j)
int *j;
{ ...


228 :デフォルトの名無しさん:2012/10/11(木) 07:11:41.02
そっちの宣言のが便利だよな

229 :デフォルトの名無しさん:2012/10/11(木) 07:35:11.67
仮引数並びが型情報を持たないことがか?

230 :デフォルトの名無しさん:2012/10/11(木) 09:50:47.44
>>215 >>217
「C言語 静的領域」でググってみれ

>>221
ねーよ

>>228
ねーよ

231 :215:2012/10/11(木) 10:17:03.90
単純にスタック、ヒープ以外の領域がある、という理解でよさそうですね
ありがとうございます

232 :デフォルトの名無しさん: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; { 〜


233 :デフォルトの名無しさん:2012/10/12(金) 01:45:41.39
>>232
君の好みに合う世界は金輪際実現しない

234 :デフォルトの名無しさん:2012/10/12(金) 02:55:15.25
>>232
そのかわり引数のプロトタイプチェックは皆無になる(はず)なのだが

235 :デフォルトの名無しさん:2012/10/12(金) 07:23:00.47
>>232 typedef は使えないの?

236 :デフォルトの名無しさん:2012/10/12(金) 19:34:51.55
>>232
苦笑

237 :201:2012/10/12(金) 19:40:15.08
遅いレスですみません。
>>226
>関数の引数で受けているところは、j=p 相当の処理だぞ?

というのがわからんのです。

一日無い知恵を絞って考えたんですが、仮引数の宣言に現れる*は、
ポインタ宣言の場合とおなじようにjがポインタ変数であることを示しているだけで、
単項演算子の*とは異なるという認識でよろしいのでしょうか?

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

239 :デフォルトの名無しさん:2012/10/12(金) 21:33:28.19
>>203,205,210そして>>226と最初からみんなそういってたんだけどな

240 :デフォルトの名無しさん:2012/10/12(金) 21:44:35.24
ただ、紛らわしいことに
int * a, b;
は、aはintのポインタ型だけと、bはintだから注意な
*aがintになる型、と考えるといいのかもね

241 :デフォルトの名無しさん:2012/10/12(金) 22:21:11.43
>>240
不自然な仕様だよな

242 :デフォルトの名無しさん:2012/10/12(金) 22:23:11.11
>>240
ポインタは型ではないから後者が正解。

243 :デフォルトの名無しさん:2012/10/12(金) 23:03:25.34
>>242
typedefできるだろ?

244 :デフォルトの名無しさん:2012/10/12(金) 23:07:13.71
int* a,b;

245 :デフォルトの名無しさん:2012/10/12(金) 23:21:30.16
ttp://codepad.org/HDjLuFG3

246 :デフォルトの名無しさん:2012/10/13(土) 00:25:09.42
やっぱ 
int *a, b;
で何の問題もないじゃん。

247 :デフォルトの名無しさん:2012/10/13(土) 00:32:21.47
http://www.libjingu.jp/trans/bs_faq2-j.html#whitespace

248 :デフォルトの名無しさん:2012/10/13(土) 00:54:20.58
わかりやすいのが一番

249 :デフォルトの名無しさん:2012/10/13(土) 01:27:06.70
http://toro.open2ch.net/tech/
みんなこっち行こうず
IDあるほうがまだマシ

250 :デフォルトの名無しさん:2012/10/13(土) 02:06:24.78
>>249
そこは「しようず」が多くて気持ち悪い

251 :デフォルトの名無しさん:2012/10/13(土) 02:13:12.18
突っ込みどころ満載だし
早くも管理人行方不明じゃねーか

252 :デフォルトの名無しさん:2012/10/13(土) 02:15:22.27
どこの方言?

253 :デフォルトの名無しさん:2012/10/13(土) 02:26:48.69
2ch

254 :デフォルトの名無しさん:2012/10/13(土) 02:57:37.44
全員じゃないからな

255 :デフォルトの名無しさん:2012/10/13(土) 10:23:46.53
なんか偽ブランド品みたいで使いたくないな
アフィブログ用なんでしょ?そこ

256 :デフォルトの名無しさん:2012/10/13(土) 10:48:56.47
クラスメンバの関数ポインタのvector配列の文ってどうすればいいんですか?
void (Admin::*ElementSelect)();
というのが関数ポインタなんですけど
void vector <(Admin::*ElementSelect)()> ElementSelectAry;
になるんでしょうか?

257 :デフォルトの名無しさん:2012/10/13(土) 10:58:19.58
vector <void (Admin::*)()> ElementSelectAry;

258 :デフォルトの名無しさん:2012/10/13(土) 11:23:35.53
>>257
ありがとう

259 :デフォルトの名無しさん:2012/10/13(土) 11:42:51.67
素直にtypedef使えと

260 :デフォルトの名無しさん:2012/10/14(日) 12:44:11.91
DLL←→EXE間でクラスのやり取りするにはどないすればええんでっしゃろ?

261 :デフォルトの名無しさん:2012/10/14(日) 13:08:50.66
>>260
条件を限定しない一般論なら答えようがない
(あえていうなら一般論としてはやるな、になるけど)

262 :デフォルトの名無しさん:2012/10/14(日) 13:25:53.17
COM使え

263 :デフォルトの名無しさん:2012/10/14(日) 13:30:18.27
(あえていうなら一般論としてはやるな、になるけど)(キリッ

264 :デフォルトの名無しさん: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 ;
こういう使い方ってしてもいいんですか?

265 :デフォルトの名無しさん:2012/10/14(日) 17:22:52.69
それはダメですね
かなり危ないコードです

266 :デフォルトの名無しさん:2012/10/14(日) 18:54:05.17
>>264
添え字の範囲を超えないようにするとかで正しく使うなら何の問題もない

267 :デフォルトの名無しさん:2012/10/14(日) 19:13:20.71
うそ教えんな

268 :デフォルトの名無しさん: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

日本でどうとかいってる低レベルのダニは駆逐されてほしい


269 :デフォルトの名無しさん:2012/10/14(日) 19:44:04.92
どっちがどっち?

270 :デフォルトの名無しさん:2012/10/14(日) 20:19:26.45
>>264
初期化の内容が要素数越えたらgccじゃエラーになったよ
別に安全だと思う

271 :デフォルトの名無しさん:2012/10/14(日) 20:28:38.18
>>270
ありがと

272 :デフォルトの名無しさん: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(...)をキャストせずに使うことは出来ますか?

273 :デフォルトの名無しさん:2012/10/15(月) 21:12:31.49
>>272
無理

274 :デフォルトの名無しさん:2012/10/15(月) 21:16:31.01
>>273
キャスト必要なんですかね?

275 :デフォルトの名無しさん:2012/10/15(月) 21:17:36.99
>>272
できません

276 :デフォルトの名無しさん:2012/10/15(月) 21:20:19.05
>>275
ありがとうございました

277 :デフォルトの名無しさん:2012/10/15(月) 21:26:14.11
ちょっとひねり加えれば出来るけど?

278 :デフォルトの名無しさん:2012/10/15(月) 21:39:00.54
まぁ、キャストでもできるけど、普通は仮想関数を使う

279 :デフォルトの名無しさん:2012/10/15(月) 22:16:34.58
>>278
仮装関数にしたいものの引数にテンプレート変数が入ってるんですよね…
設計ミスな気もします

280 :デフォルトの名無しさん:2012/10/15(月) 22:21:59.98
>>279
ん?
なるほど、ポイントはそこか

281 :デフォルトの名無しさん:2012/10/15(月) 23:31:42.40
>>277
無理だから
諦めて

282 :デフォルトの名無しさん:2012/10/15(月) 23:32:36.59
>>272
どうしてもそれに近いことをしたいなら、
引数を工夫するために宣言を変えてくれ


283 :デフォルトの名無しさん: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);
}

284 :デフォルトの名無しさん:2012/10/15(月) 23:41:54.37
やっぱり何か違うな。
a か b に機能を持たせて丸投げすべきか。
そもそもfooもbarも作り直して考え直すのが良いか。

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

286 :デフォルトの名無しさん:2012/10/16(火) 12:45:48.03
>>285
逸脱し過ぎじゃないか?

287 :デフォルトの名無しさん: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();
と定義をしているつもりなんですけど、どこか間違っているでしょうか?


288 :デフォルトの名無しさん:2012/10/16(火) 15:45:58.25
m_ptest->func();
この時点でclass Aの宣言が全部見えてる必要がある

289 :デフォルトの名無しさん:2012/10/16(火) 15:50:21.01
回答ありがとうございます。

class Aの宣言を書いたヘッダファイルをインクルードしてみたのですがNGでした。

290 :デフォルトの名無しさん:2012/10/16(火) 15:51:44.18
どっかのcppにA* m_ptest;って書いとく

291 :デフォルトの名無しさん: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;
}

292 :デフォルトの名無しさん:2012/10/16(火) 16:03:50.28
レスポンスありがとうございます。

それも別のクラスの宣言部に書いてたのですが、エラーが出てます。

別のクラスBのヘッダファイル中において、データメンバとして
A* m_ptest;
と書いておいて、
そのクラスBのcppファイル中、コンストラクタ内で
m_ptest = new A();
と定義してるつもりでした。

試しにWinMain関数の前にA* m_ptest;と書いたら
エラー無しで問題は解決したのですが、両者の違いが分かりません。
理解を深めるためにもお教えいただけないでしょうか。

293 :デフォルトの名無しさん:2012/10/16(火) 16:08:04.17
int count(char str[], char ch);

294 :デフォルトの名無しさん:2012/10/16(火) 16:10:30.87
class B {
A* m_ptest;
};
A* m_ptest;
上の二つは別物です
extern A* m_ptest;
は後者を指してるので定義がないとエラーになります

295 :デフォルトの名無しさん:2012/10/16(火) 16:12:21.01
>>293 解決しました!見逃していました、ありがとうございます。

296 :デフォルトの名無しさん:2012/10/16(火) 16:30:15.84
>>294
AはBを構成する部品の一つなので、包含関係かなと思って、
Aのインスタンスm_ptestをBのデータメンバとしていました。

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

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

回答いただきありがとうございました。

297 :デフォルトの名無しさん:2012/10/17(水) 09:42:10.60
>>279
そういうときはTypeEraserとNonVirtualInterfaceを併用することが多いね
インターフェースにテンプレートメンバ関数ライクな仮想関数を持たせたいときの典型的なパターンね
http://ideone.com/R7LtF

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

299 :デフォルトの名無しさん:2012/10/18(木) 20:37:13.28
コピペしなくていいよ

300 :デフォルトの名無しさん:2012/10/18(木) 20:41:45.86
>>298
お前の認識してるオブジェクト指向は全部間違ってる

301 :デフォルトの名無しさん:2012/10/18(木) 20:58:48.49
コピペは程々にな

302 :デフォルトの名無しさん:2012/10/18(木) 21:53:45.36
>>298
死ね初心者

303 :デフォルトの名無しさん: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)終わり、とやりたいです。
単純にリンクの張替えで出来ると思ったのですが、やり方がわかりません

304 :デフォルトの名無しさん:2012/10/18(木) 23:09:33.76
insertしてerase

305 :デフォルトの名無しさん:2012/10/18(木) 23:13:17.63
corutineの実装がいろいろあるけど
(Hamigakiとか)
GPUを使うOpenCVとかと混ぜたらうまく動かないってことでいいのでしょうか

306 :デフォルトの名無しさん:2012/10/18(木) 23:13:46.92
リンクの張り替えできないんだよね
ダサい仕様だが

307 :デフォルトの名無しさん:2012/10/18(木) 23:57:18.99
>>298
その方法は基底をホルダーにした型消去であってオブジェクト指向プログラミングと直接の関係はない

308 :デフォルトの名無しさん:2012/10/19(金) 00:03:16.48
非同期のMessageBoxを作って、タイムアウトしたら自動で閉じるなどの機能を実装しようと思っています。
自分で作ったウィンドウではなく、MessageBox関数を利用します。

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

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

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

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

このような原始的な方法しか思いつかないのですが
他になにか良い方法はないでしょうか。

309 :デフォルトの名無しさん:2012/10/19(金) 00:07:26.41
>>303
list<int>::iterator i1(ls.begin()), i2(ls.begin());
ls.splice(++i1, ls, ++ ++ ++i2);

310 :デフォルトの名無しさん:2012/10/19(金) 00:14:34.04
Cのsscanfって、大文字小文字を無視する設定ってできないんでしたっけ?
sscanf(str, "ID%d", &id");
などとするとき、"ID100"からも"Id100"からも100を取り出したいのですが。

311 :デフォルトの名無しさん:2012/10/19(金) 00:37:42.79
>>308
GetWindowThreadProcessId 使えばいい
ウィンドウクラス名とプロセスID調べれば誤爆はしないでしょ
時間で閉じるメッセージボックスは公開されてないがuser32.dllにあった気がする

312 :デフォルトの名無しさん:2012/10/19(金) 07:05:22.00
>>310
一応 "%[Ii]%[Dd]%d" ってのはできる

313 :デフォルトの名無しさん:2012/10/19(金) 12:28:53.91
>>312
"%*[Ii]%*[Dd]%d"と読み飛ばしてしまえば医院で内科医。

>>310
要求仕様が厳密でないなら↑の方法で。
厳密ならば("Id"や"iD"を許容しない)ならsscanf()一回だけでは無理。

314 :デフォルトの名無しさん:2012/10/19(金) 13:26:19.97
条件分枝構文って
if else
swich
しかないのでしょうか
boostやstlでもっと複雑なことのできる条件分枝はないのでしょうか

315 :デフォルトの名無しさん:2012/10/19(金) 13:37:41.16
3項演算子もwhile文もdo - whileもある意味条件分岐だろ

316 :デフォルトの名無しさん:2012/10/19(金) 13:49:48.85
変数の実行時の型で分岐するポリモーフィズムはどうっすか

317 :デフォルトの名無しさん:2012/10/19(金) 13:55:52.82
質問です。
同じ名前で引数が異なるローカル関数って作れますか?

hoge(enum hoge);
hoge(int hoge);

318 :デフォルトの名無しさん:2012/10/19(金) 13:58:56.78
作れますよ


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

319 :デフォルトの名無しさん:2012/10/19(金) 14:28:42.25
>>317
C++では同じ名前で引数が異なる関数は作れますが、ローカル関数が作れません
Cではローカル関数は作れますが、同じ名前で引数が異なる関数が作れません
よって作れません

320 :デフォルトの名無しさん:2012/10/19(金) 14:44:40.03
どうしたらこのスレに書かれてることを理解できるレベルに到達できますか?
初心者向けの本は勉強したけど、全然わかりません。
やさしいC++をひと通りコード書いて理解しました。

int main(void)

とか、int main の中に何か入ってるものは何を意味してるのか分からないし
operator関数も難しいです。

321 :デフォルトの名無しさん:2012/10/19(金) 14:44:58.51
>>315
論理演算子もある意味条件分岐。

>>317
C++ならね。

322 :デフォルトの名無しさん: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

323 :デフォルトの名無しさん: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()付近で調べればわかりますかね?

324 :デフォルトの名無しさん:2012/10/19(金) 15:00:33.84
試しに
char b[] = {0x30, 0x7B, 0x30, 0x52, 0x00, 0x00}; //ほげ UTF-16BE
std::cout << b;
ってしてみたら

325 :デフォルトの名無しさん:2012/10/19(金) 15:13:18.13
Cでもローカル関数は定義できない
ただしGCCとかの独自拡張ならできる
独自拡張ならば同名で引数が異なるローカル関数が定義できる処理系もあるかもね

326 :デフォルトの名無しさん:2012/10/19(金) 15:13:25.90
>>320
正直、使ってみないと覚えない。

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

あと、このスレに限らず、技術系のコミュニティって、
半分も理解してないけど参加してる、自分が混ざれる話題にだけ混ざるって人は多いよ。


327 :デフォルトの名無しさん: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の構成が変わっちゃうかも、とか気にしなくていいの?

328 :デフォルトの名無しさん:2012/10/19(金) 16:38:16.98
ハンドルとしてクラスのポインタを返す・ハンドルを受けて(中でクラスに戻して)操作
EXE側は ハンドルの中身をほぐしてクラス動作させることはない
という切れ目で DLL化したことはあるけど

class そのもののエクスポートが必要な要求っぽいね
(EXE側で ポインタ参照〜クラスのメソッドを呼び出したい)

329 :デフォルトの名無しさん:2012/10/19(金) 16:44:05.10
>>327
CreateがIHoge*でなくInterface*を返して、
DLLとEXEでInterfaceを変更しなければ大丈夫じゃね

dllimport側でHogeはincludeしない(使わない)なら
dllexport側のHogeは変更してOK

330 :デフォルトの名無しさん:2012/10/19(金) 16:53:10.19
#ifdef HAVE_CPP11
とか
#ifdef HAVE_CPP0X
みたいなことってできないの?

331 :デフォルトの名無しさん:2012/10/19(金) 17:00:55.05
>>330
その処理系が11に対応してれば、オプションで変更可能になってる場合もあるんでね?

332 :デフォルトの名無しさん:2012/10/19(金) 17:07:01.56
#if 201103L <= __cplusplus で出来ることになってるけど過渡期の現状ではいまいち
boostならBOOST_NO_CXX11_〜系のマクロで機能ごとに判別できる

333 :デフォルトの名無しさん:2012/10/19(金) 17:18:30.55
vba用のdllをつくっています。C初心者です。
値をdllに渡して処理したあと、グローバル変数に値を入れておいて、
vbaから読み込みのフラグが立ったらその変数を戻すようにしているのですが、
グローバル変数は呼び出し速度が遅い等ネットで見かけます。

グローバル変数を回避して、ローカル変数のみで同様のことをするには
ざっくりどんなことをすればいいのでしょうか

334 :デフォルトの名無しさん:2012/10/19(金) 17:26:40.62
handle = open();
proc(handle, p1, p2...);
v = get(handle);
close(handle);
的な感じにするとか

335 :デフォルトの名無しさん:2012/10/19(金) 17:26:57.06
今度はけっこう前のスレからコピペしてきたな

336 :デフォルトの名無しさん: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]}
を使う場合では、どちらが高速ですか?

337 :デフォルトの名無しさん:2012/10/19(金) 17:41:32.98
>>336
環境次第。
例えばSSEが使える状況なら、FPUを使うのは高コスト。
また、math.hのsin()ならコンパイラが勝手にFPU版なりSSE版なり使い分けてくれる可能性がある。

338 :デフォルトの名無しさん: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/
全部ここからのコピペだから相手にしなくていいよ

339 :デフォルトの名無しさん:2012/10/19(金) 17:43:07.52
>>336
そりゃFPUを直接叩けば一番速いだろうけど、ライブラリは少しでも誤差を少なくするために
いろいろ工夫してるから速度と精度は必ずしも両立しないな

340 :デフォルトの名無しさん:2012/10/19(金) 17:52:23.79
>>338
それでも回答したがる自己顕示欲の強い奴がいかにム板に多いかってことが改めて浮き彫りになったなw

341 :デフォルトの名無しさん:2012/10/19(金) 17:53:02.70
class Hoge
{
int mHoge;
virtual void hoge(void) = 0;

void test(int Num) {
mHoge = Num;

}
};

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

関数testの実体はインスタンスの数だけ存在するのでしょうか?

342 :デフォルトの名無しさん:2012/10/19(金) 18:05:53.60
コピペだと分かってたら回答してないんじゃないの?

343 :デフォルトの名無しさん:2012/10/19(金) 18:08:17.26
しばらくは
「みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、」
のような問題文の一部でググってからレスした方が良さそうだね

健気に文言を変えてコピペしてくるかな?

344 : ◆QZaw55cn4c :2012/10/19(金) 20:07:17.65
ローカル関数?
C99にはあるのか?

345 :デフォルトの名無しさん: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()); }
};

346 :デフォルトの名無しさん:2012/10/19(金) 21:00:22.01
>>319
C++でもローカル関数のようなものは作れる
C++11ならラムダで、これは本当にローカル関数と言っていいもの
C++03でもローカルクラスのstaticメンバ関数くらいなら作れる(ローカル変数に触れないけど)

347 :デフォルトの名無しさん:2012/10/19(金) 21:30:19.62
コピペにマジレスかっこいい!

348 :デフォルトの名無しさん:2012/10/19(金) 21:37:27.68
ラムダは関数オブジェクトだから
「本当にローカル関数と言っていい」というほどのものじゃないな

349 :デフォルトの名無しさん:2012/10/19(金) 21:41:31.38
引数もキャプチャも無しなら関数ポインタに変換はできるが
ローカルクラスのstaticメンバ関数で十分

350 :デフォルトの名無しさん:2012/10/19(金) 23:32:31.06
>>341,>>345
hoge厨はプログラム以前の問題だから失せろ

351 :デフォルトの名無しさん:2012/10/19(金) 23:48:29.86
foo, bar, baz

352 :デフォルトの名無しさん:2012/10/20(土) 00:15:02.23
baka

353 :デフォルトの名無しさん:2012/10/20(土) 00:31:47.37
どーでも良い

354 :デフォルトの名無しさん:2012/10/20(土) 01:11:27.83
志が低いのね
いつか英語でソースコードやドキュメントを用意しなければならないとき、
hogeでは、わからないだろ

355 :デフォルトの名無しさん:2012/10/20(土) 01:20:32.65
hogeが何語かも知らない素人が増えてるよな

356 :デフォルトの名無しさん:2012/10/20(土) 01:23:47.49
>>354
hogeも翻訳すればいいだろ >>351

357 :デフォルトの名無しさん:2012/10/20(土) 02:28:51.06
hageは死ぬべき

358 :デフォルトの名無しさん:2012/10/20(土) 09:12:21.20
>>350
弾幕薄いよ、なにやってんの

359 :デフォルトの名無しさん:2012/10/20(土) 15:09:45.88
すみません。文章についてなのですが、
メモ帳から読み込んだ文章を、1つの大きなchar配列に入れ、
改行コードの\r\nの代わりに\0を入れています。
(\r\nだと、繋げた時に1行分の長さをstrlenで計れないので\0を。)

これを、1行描画したらstrlenで長さを取り、間仕切り(\0)の分+1して
次の行を描画する  としたいのですが、
strlenで長さは正しく取れるのに、
文字列を取ろうとすると、\0から後ろはおかしな結果になってしまいます。

\0を間仕切りに使うのはかなり不味い事なのでしょうか?
それとも私が何か勘違いしてミスっているのか…。
何かご助言頂けますと幸いです。 

360 :デフォルトの名無しさん:2012/10/20(土) 15:10:57.18
Rメープルじゃなくてゴールドピアスの方出ろよ

361 :デフォルトの名無しさん:2012/10/20(土) 15:54:29.33
\r\n の替わりに \0\0 入れとけット。

362 :デフォルトの名無しさん: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関数は存在するようなのですが、どうしてなのでしょうか?
お知恵を拝借させてください。

363 :デフォルトの名無しさん:2012/10/20(土) 18:33:35.79
g++は使ったことがないので分からんが、
「標準で用意されている」と「何もインクルードせずに使える」を勘違いしてるんじゃないかと思う。

たぶんalgorithmヘッダ?

364 :デフォルトの名無しさん:2012/10/20(土) 18:36:09.55
>>351
nyarl, yog, fhtagn

365 :デフォルトの名無しさん:2012/10/20(土) 19:09:24.92
>>363
できました!
ありがとうございます。

366 :デフォルトの名無しさん: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]));
}


367 :デフォルトの名無しさん:2012/10/20(土) 19:34:51.18
>>362
> ぐぐるとg++には標準でmax関数は存在するようなのですが、

大嘘。
libstdc++にはあるかもしれないが別物。

368 :デフォルトの名無しさん:2012/10/20(土) 19:36:23.10
>>366
ttp://ideone.com/HjcMvJ

369 :デフォルトの名無しさん:2012/10/20(土) 19:57:17.92
>>367
std::maxなら標準だぞ

370 :デフォルトの名無しさん: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は省略)

371 :デフォルトの名無しさん:2012/10/20(土) 21:44:06.60
>>370
なにそれ
g++の仕様書?

372 :デフォルトの名無しさん:2012/10/20(土) 21:48:51.81
g++とlibstdc++についての話だからC++の規格は関係ないよな

373 :デフォルトの名無しさん:2012/10/20(土) 22:01:04.76
>>368
ありがとうございます!うまく動きます。

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

374 :デフォルトの名無しさん:2012/10/20(土) 22:27:22.99
配列の参照

375 :デフォルトの名無しさん:2012/10/20(土) 22:44:55.05
既存のものの参照を得る時に&は使って
引数で受け取る時には*を使う物だと思っていました。
何故&なのかよくわからないです。

376 :デフォルトの名無しさん:2012/10/20(土) 22:47:50.27
画像のサイズをwidth*heightで表示したいのですが
MoveWindow(他, widh,height 他,)とするとウインドウ自体のサイズになってしまうのですが
ウインドウの枠のサイズなどを足し引きしないといけないと思うのですがどうすればいいでしょうか?

377 :デフォルトの名無しさん:2012/10/20(土) 22:49:14.42
AdjustWindowRect

378 :デフォルトの名無しさん: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を書いておいて呼び出しが終わった後にそれが残ってるか
をチェック)をしました。
どうかよろしくお願いします。

379 :デフォルトの名無しさん:2012/10/20(土) 22:53:09.95
>>378
ttp://qarc.info/qa/show-9865-747.html

380 :デフォルトの名無しさん:2012/10/20(土) 23:11:11.86
関数定義の引数部分でint& などとすると参照渡しになるのですね。
呼び出し側で&hogeではなくhogeでよくなるようでした。

うーん、しかし何故>>366はうまく動かないのでしょうか。
呼び出し元では配列の長さが分かるものの、
関数呼び出し先では配列の長さの情報は消えてしまうのでしょうか?

381 :デフォルトの名無しさん: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*に渡せればいいのですが、
どういった対応がありますでしょうか。
よろしくお願いします。

382 :デフォルトの名無しさん:2012/10/20(土) 23:48:13.56
>>380
簡単に言うと関数の引数宣言では配列を宣言してもポインタの宣言に変換される
 int length(int ary[])

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

383 :デフォルトの名無しさん:2012/10/20(土) 23:54:29.79
>>362
標準C++のmaxを使うなら

#include <cstdio>
#include <algorithm>

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

384 :デフォルトの名無しさん:2012/10/21(日) 00:04:47.32
>>382
呼び出し元で使われている、その配列の長さの情報はどこに格納されているのでしょうか?

385 :デフォルトの名無しさん:2012/10/21(日) 00:05:46.25
コンパイラだけが知ってる

386 :デフォルトの名無しさん:2012/10/21(日) 00:22:31.69
>>381
Hogeとか使ってるクズには無理

387 :デフォルトの名無しさん:2012/10/21(日) 00:31:52.05
>>364
前に会社で、テストユーザ名にそんなの並んでたわ
こっそり別の神様追加して帰ったけど

388 : ◆QZaw55cn4c :2012/10/21(日) 01:41:09.39
貧乏神でよければ私も追加してください

389 :デフォルトの名無しさん:2012/10/21(日) 03:18:19.41
>>381はhogeを覚える暇はあっても調べる暇はないマジキチ

390 :デフォルトの名無しさん:2012/10/21(日) 03:22:08.04
hogeの本当の意味を知らない子供が増えた

391 :デフォルトの名無しさん: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の括弧は関数の括弧じゃないのよ。これ豆知識ね。

392 :デフォルトの名無しさん:2012/10/21(日) 04:20:40.19
>>391
君に「読みにくく書く」才能を認める

393 :デフォルトの名無しさん:2012/10/21(日) 04:39:15.40
>381=基地害hoge厨

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

395 :デフォルトの名無しさん:2012/10/21(日) 05:43:12.71
都道府県が増える可能性を排除しきれないのでxmlから都道府県リストを読み込む仕様とした。

396 :デフォルトの名無しさん:2012/10/21(日) 05:47:00.18
>>395
都道府県が増減するよりも前に
道州制が導入されて住所の書式が変化すると予想されるため
書式ルールもxmlで指定できる仕様とした。

397 :デフォルトの名無しさん:2012/10/21(日) 05:49:38.26
合併で減る可能性があっても増える可能性はない

道州制がきたら県合併の価値がさがるので県が減ることはないな

目先の問題は大阪都構想

398 :デフォルトの名無しさん:2012/10/21(日) 05:51:35.12
大阪が「府」でなくなる
道州制による住所書式変更
合併による都道府県の削減

上から順に優先度が高い

399 :デフォルトの名無しさん:2012/10/21(日) 05:53:48.75
国際化されたシステムなら「州」や「省」は対応済みで
国ごとの設定で無効化してる

今更やることはない

400 :デフォルトの名無しさん:2012/10/21(日) 06:04:51.71
東北はいつでも消せるように作らないとな

401 :デフォルトの名無しさん:2012/10/21(日) 06:51:15.78
福島括りを嫌って会津県で独立する可能性もあるじゃん

402 :デフォルトの名無しさん:2012/10/21(日) 07:05:01.44
そもそももうしばらくしたら日本は中国韓国ロシアに解体分譲されて無くなるし

403 :デフォルトの名無しさん:2012/10/21(日) 07:42:17.55
>>387
やっぱり神様の名前からか……
nyarlがニャル子(ニャルラトホテプ)っぽかったから怪しいと思っていたが

404 :366:2012/10/21(日) 08:14:56.26
>>391
分かりやすかったです。sizeofはマクロみたいなものなのですね!
template<std::size_t N>
int length(int (&ary)[N])
でlength(ary)と呼び出すだけでNに配列要素数が入る仕組みがよくわかりません。

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

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

↑この用法なのかなと思い、length呼び出しは<>の部分が推定されているのかと思いました。
しかし試しにlength<3>(ary)としてみるとno matching function for call to `length(int [4])'と言われてしまいました。

405 :デフォルトの名無しさん: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がなければ呼び出し可能な関数がないのでエラー

406 :デフォルトの名無しさん:2012/10/21(日) 10:36:31.80
>>391
あまりいい加減な事は言わないように

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

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

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

そしてsizeofは演算子
普通の関数じゃないどころか、関数ですらない
あと、型のサイズを取得する場合は括弧が必須ね

407 :デフォルトの名無しさん:2012/10/21(日) 11:37:54.91
404>391だね

408 :デフォルトの名無しさん: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' に変換できません。
となります。どうすれば良いのでしょうか?

409 :デフォルトの名無しさん: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

410 :デフォルトの名無しさん:2012/10/21(日) 13:09:42.89
staticにすればいいよ

411 :デフォルトの名無しさん:2012/10/21(日) 14:57:45.61
>>408
> A::ThreadFunc' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。

こんなレベルの奴がマルチスレッドとかやるなよ…

412 :デフォルトの名無しさん:2012/10/21(日) 15:15:57.90
4人のチャンコロが4本の箸で飯を食うのは不衛生極まりないことを理解できない奴はマルチスレッドに手を出すべきではない。

413 :デフォルトの名無しさん:2012/10/21(日) 15:19:01.68
>>412
腹痛でトイレがデッドロックですね。分かりま・・・いや、あいつらなら問題ないか。

414 :デフォルトの名無しさん:2012/10/21(日) 15:20:07.67
4本…?

415 :デフォルトの名無しさん:2012/10/21(日) 15:44:15.72
そう、4膳ではなく4本。
つまり、2人が食い続けると2人が飢え死にするわけ。

416 :366:2012/10/21(日) 16:46:08.27
>>405
なっるほどー!例が分かりやすかったです。
int (&x)[3]にint a[4]を代入出来ないというのが味噌ですね。

template<std::size_t N>
int length(int (&ary)[N]) {}
で<>を省いた時に、特にその関連性を示しているわけでも無いのに、
aryの要素数が自動でNに格納されるのが不思議だと思いました。
これはもう慣れの話でしょうか。


417 :デフォルトの名無しさん:2012/10/22(月) 09:22:31.19
前にポインタ宣言について質問した者なのですが、
配列もまた宣言の時の要素数と式中の配列の添え字指定とでは異なるものだと理解してよろしいのでしょうか?
つまり、
int sample[10]という配列があって、
sample[0]が最初の要素の添え字指定で、sample[9]が最後の要素になりますよね?
その場合、sample[10]という要素はありませんよね?

ではなぜ、宣言のところの[]と式の[]は同じ[]を使っているのでしょうか?
ポインタの時もそうでしたが、つい混同してしまいます。。。

418 :デフォルトの名無しさん:2012/10/22(月) 09:31:16.91
> ではなぜ、宣言のところの[]と式の[]は同じ[]を使っているのでしょうか?
そういう約束だから、そういうもんだと諦める
自分で新しく言語を作るつもりなら 吟味してくれい

宣言は 「利用可能な個数」を指示 (10個)
式中のは (ポインタ主体の思考で) 先頭からのオフセット0〜オフセット9
 sample[offset] → *(sample + offset)

419 :デフォルトの名無しさん:2012/10/22(月) 14:39:00.07
>>417
http://www.kouno.jp/home/c_faq/c6.html

420 :デフォルトの名無しさん: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型で上手く実現する方法を教えていただきたいです。

421 :デフォルトの名無しさん:2012/10/22(月) 14:49:24.29
>>420
ttp://qarc.info/qa/show-9865-809.html

422 :デフォルトの名無しさん:2012/10/22(月) 15:28:51.47
横から質問失礼
グローバル変数をやむなく使うというのは例えばどういう状況でしょうか
自分は結構頻繁に使ってましたorz

423 :デフォルトの名無しさん:2012/10/22(月) 15:35:11.94
>>422
ブロックを抜けたら寿命が尽きても構わない→自動変数
スコープはブロック内で充分→ブロック内静的変数
スコープは関数内で充分→関数内静的変数
スコープは関数外にまで拡げたい→翻訳単位内静的変数
翻訳単位外からは関数経由でアクセスできると言っても納得せず、
どうしても公開せよと迫られる→グローバル変数

424 :デフォルトの名無しさん:2012/10/22(月) 15:36:07.51
コード記述時は未確定だけど
アプリケーション起動時に(設定ファイル等から)確定する定数とか

425 :デフォルトの名無しさん:2012/10/22(月) 15:38:54.90
シングルトンでまとめてるけど、広い意味でグローバル変数と同等だと考えてる

426 :デフォルトの名無しさん: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;
}

427 :デフォルトの名無しさん:2012/10/22(月) 16:28:08.65
>>422
マルチスレッドのプログラムかなぁ

428 :デフォルトの名無しさん:2012/10/22(月) 16:39:44.10
stdoutやerrnoがグローバル変数であるケースは結構ある。
むしろマルチスレッド対応で関数になってたりするけど。

429 :デフォルトの名無しさん:2012/10/22(月) 17:26:55.06
C言語ですが、
配列の要素数の宣言に変数は使用できませんよね?

gcc(MinGW?)では可能と聞いたのですが、本当ですか?
またそれによって実行ファイルが環境に依存することはありますか?

430 :デフォルトの名無しさん:2012/10/22(月) 17:29:38.65
C99では出来るしgccはC99をかなり取り入れてるしgcc独自の拡張もあるし
どれの事を言ってるのかはっきりしないと答えようがない

431 :デフォルトの名無しさん:2012/10/22(月) 17:54:00.33
C99なら配列の要素数の宣言に変数が使える
それによって実行ファイルが環境に依存することはありえる
まあそんな処理系知らないけど

432 :デフォルトの名無しさん:2012/10/22(月) 23:14:18.88
>>429
LSI-C試食版でコンパイルできない。

433 :デフォルトの名無しさん:2012/10/22(月) 23:16:58.11
gcc独自拡張に、配列の添字に変数が使えるようになる機能がある。だから、本当

434 :デフォルトの名無しさん:2012/10/23(火) 00:30:33.69
C89だと無理だが、gcc独自拡張があればイケる
C99ならどのコンパイラでもいけるがC99非対応のコンパイラじゃ無理

435 :デフォルトの名無しさん:2012/10/23(火) 00:38:15.00
誰かが大きさを実行時に決められる自動配列はalloca()の糖衣構文だと言っていたなあ

436 :デフォルトの名無しさん:2012/10/23(火) 03:10:44.27
http://pc12.2ch.net/test/read.cgi/tech/1267775473/626
コピペ元を少しずつ古いスレにしてるのが笑える

437 :デフォルトの名無しさん:2012/10/23(火) 09:20:43.08
みえない

438 :デフォルトの名無しさん:2012/10/23(火) 10:42:13.71
>>432
今時そんな骨董品を使う方がどうかしている。

439 :デフォルトの名無しさん:2012/10/23(火) 11:11:56.07
パソコンとはかぎらない

440 :デフォルトの名無しさん:2012/10/23(火) 23:10:58.59
C++の拡張子なにつかってる?
cppがデファクトスタンダードだと思うんだがgoogleのスタイルガイドだとccだた

441 :デフォルトの名無しさん:2012/10/23(火) 23:27:17.32
cpp/cxx/cpはともかくccの2つ目のcはどこから来たんだよ
C with Classes の名残とかだったらいい加減やめようや

442 :デフォルトの名無しさん:2012/10/23(火) 23:29:41.30
むしろcpp以外になる理由が知りたい

443 :デフォルトの名無しさん:2012/10/23(火) 23:33:12.36
c++の+を45度回転
cxx

444 :デフォルトの名無しさん:2012/10/23(火) 23:34:32.70
Cのプログラムのファイルの拡張子は、
.c
.h

C++の拡張子は、いろいろある。
.C
.c++
.cc
.cp
.cpp
.CPP
.cxx
.h
.h++
.hh
.hp
.hpp
.hxx

445 :デフォルトの名無しさん:2012/10/23(火) 23:35:19.51
Cをインクリメントしたら2つになったとか?
cppはどうしても、プリプロセッサを想像してしまうんだよな。

446 :デフォルトの名無しさん:2012/10/23(火) 23:37:19.56
プリプロセッサなら.hの方を思い出すのが普通な気も……
>>444
大杉ワロタw

447 :デフォルトの名無しさん:2012/10/24(水) 00:10:38.80
.c++は見たことないな

448 :デフォルトの名無しさん:2012/10/24(水) 10:10:10.45
>>446
#include とか #if とかのプリプロセス処理の展開を済ませた中間ファイル的だね って意図じゃない?

449 :デフォルトの名無しさん:2012/10/25(木) 23:42:52.63
ヘッダファイルでstring型の変数宣言するときに、そのヘッダファイルに#include <string>を書くべきでしょうか?
かなり初歩的な質問ですまん

450 :デフォルトの名無しさん:2012/10/25(木) 23:59:28.40
stringはよく使うから
プリコンパイルヘッダファイルが使えるなら
そっちでincludeした方がいい

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

451 :デフォルトの名無しさん:2012/10/26(金) 00:01:40.77
>>450
ありがとうございます

452 :デフォルトの名無しさん:2012/10/26(金) 00:30:54.93
でも明らかにstringを使っていないと破綻するクラスのヘッダをインクルードした場合は
無理に自分でインクルードする必要は無いと思われ

453 : ◆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]の色になってしまいます

解決方法がありましたら教えてください

454 :デフォルトの名無しさん:2012/10/26(金) 10:38:30.81
WriteConsoleOutputW

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

456 :デフォルトの名無しさん:2012/10/26(金) 14:02:32.55
98 のテスト環境なんてもう持ってないな
なんでそんなの使ってんの?

457 : ◆CAERF1YrA. :2012/10/26(金) 16:21:40.37
>>456
XPメインで98はテストですね
コンソールゲームは古い技術だと思うので、
古いマシンでも同じように動いて欲しくてテストしています

458 :デフォルトの名無しさん:2012/10/26(金) 18:46:38.87
ofstreamまたはifstreamでファイルが開けなかった時にcloseする必要ってありますか?

// 例
ofstream ofs("test.txt");
if (ofs.fail()) {
  ofs.close(); // ←これ
}

459 :デフォルトの名無しさん:2012/10/26(金) 20:07:24.70
>>453
ttp://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/game1/m100.html
まずはこの辺のサンプルが手持ちの98環境で動くか確認してみたら?

460 :459:2012/10/26(金) 20:09:15.29
>>453
ごめん、全角1文字を半分ずつ色を変えたいのか。ちゃんと読んでなかったわ。

461 :デフォルトの名無しさん:2012/10/27(土) 01:36:09.35
>>458
開いてないものを閉じることが出来ると思ってるのか?
まあ開いてないファイルストリームを閉じようとしても失敗するだけなんで別にいいけど

462 :デフォルトの名無しさん: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とコンパイラのマニュアルで確認してくれ

463 :デフォルトの名無しさん:2012/10/27(土) 03:56:13.18
close()してもclear()しないとfailbitが立ったままなんで気をつけないとな

464 :デフォルトの名無しさん:2012/10/27(土) 06:57:40.95
つまり使い回すなってことだ

465 : ◆CAERF1YrA. :2012/10/27(土) 07:15:47.54
>>459>>460
いえいえ、ありがとうございます

466 :デフォルトの名無しさん:2012/10/27(土) 07:20:03.08
どう居た前

467 :デフォルトの名無しさん: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();//←??
};

468 :デフォルトの名無しさん:2012/10/27(土) 15:53:30.20
不要

469 :デフォルトの名無しさん:2012/10/27(土) 16:06:05.98
ありがとう

470 :デフォルトの名無しさん:2012/10/27(土) 16:20:39.97
何が仮想関数であるべきかが設計時に判らないのに
あらかじめ基底クラスになるかどうかも判らないクラスに
あらかじめ virtual 書いておかなければならないとか
C++ の最大の欠陥

471 :デフォルトの名無しさん:2012/10/27(土) 16:46:49.47
で?

472 :デフォルトの名無しさん:2012/10/27(土) 17:31:54.49
わかってない段階からコーディングするとか、バカすぎ。

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

474 :デフォルトの名無しさん:2012/10/27(土) 17:57:49.61
いいえ

475 :デフォルトの名無しさん:2012/10/27(土) 17:58:27.66
>>473
> また静的確保の場合はどちらのOSでも、最大確保容量=スタック領域と考えてよいのでしょうか?

静的に確保した変数はスタックに取られるわけじゃないぞ。

476 :デフォルトの名無しさん:2012/10/27(土) 18:14:35.49
>>470
で、全ての関数に virtual がついている言語には欠陥がないとでも言うのか
おまえ自分で考える頭がないのをどこに転嫁しても笑われるだけなのを認識しろよ

477 :デフォルトの名無しさん:2012/10/27(土) 18:36:54.14
>>476
ご指摘ありがとうございます。
静的な確保の場合は静的領域ですね。

478 :デフォルトの名無しさん:2012/10/27(土) 18:56:50.16
>>477
おまえ今日は何グラム入れてるの?

479 :デフォルトの名無しさん:2012/10/27(土) 19:34:32.45
>>473
スタックに取られるのはC系の場合自動変数。
基本的に自動変数であまり大きな領域を取ってはいけない。
Windows APIを使ってメモリ確保した場合は仮想メモリから
取られるので、実メモリ+仮想記憶が許す範囲で取れる。
いろいろ勘違いしてるので基本の学習が先だな。

480 :デフォルトの名無しさん:2012/10/27(土) 19:48:16.98
基本の学習って、アセンブラでもやれってか?

むしろCで「処理系依存」を毛嫌いしすぎるのが
そういう系の習得を邪魔しているだけなんだが

481 :デフォルトの名無しさん:2012/10/27(土) 20:25:45.28
>>479
> いろいろ勘違いしてるので基本の学習が先だな。

お前がな。

482 :デフォルトの名無しさん:2012/10/27(土) 20:57:46.66
64bit系OSでは仮想メモリを使わない設定の場合もある気がする

483 :デフォルトの名無しさん:2012/10/27(土) 21:14:11.82
て言うか、スタックとか静的領域とかのストレージクラスの話と、
仮想メモリーをごっちゃにしてて、偉そうに何言ってるんだ?

って話だろ。

あと、組み込みとかで仮想記憶使わないシステムなんていくら
でもあるよ。

484 :デフォルトの名無しさん:2012/10/27(土) 21:19:49.94
メモリ確保量の限界を聞いてるんだから
仮想メモリの話は当然出てくるだろう

485 :デフォルトの名無しさん:2012/10/28(日) 08:55:18.71
flvのファイルをドロップドラッグしてリストに表示し
ボタンを押すとひとファイルずつキー操作する
みたいなことやりたいんだがヒントくれ。

486 :デフォルトの名無しさん: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)だけ表示されるのですが、なぜなのでしょうか?



487 :デフォルトの名無しさん:2012/10/28(日) 09:38:02.98
ドロップドラッグ

488 :デフォルトの名無しさん:2012/10/28(日) 10:01:56.56
*s = 文字列ポインタの実体の先頭 = P
だからその動作は正しい。

cout << s

なら文字列が表示されるはず。

489 :デフォルトの名無しさん:2012/10/28(日) 10:05:15.79
もうちょっと詳しく書くと

"Pointers are fun to use.\n"

これはコンパイラが暗黙のうちにメモリのどこかの領域に
文字列を定義しているということ。

s = "Pointers are fun to use.\n"

は、コンパイラが定義した文字列領域の先頭アドレスを
ポインタ変数に代入しているということ。

だから *s つまりポインタの実体(の先頭)を表示すると
Pが表示される。

アドレスから文字列全体を表示する(cout << s)の場合は
文字列全体が表示される。

490 :デフォルトの名無しさん: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");
  }

っておかしいですよね?

491 :デフォルトの名無しさん:2012/10/28(日) 10:14:01.72
その質問は何が知りたくてどんな答えを求めてるの?
日本語レベルからやり直したほうがいいぞ。

492 :デフォルトの名無しさん: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;
}

493 :デフォルトの名無しさん:2012/10/28(日) 10:16:27.61
>>490
trueかfalseか確認してるだけだからおかしくはない。
コードにセンスないとは感じるが。

494 :デフォルトの名無しさん:2012/10/28(日) 10:18:29.92
assert使った方がいいね

495 :デフォルトの名無しさん:2012/10/28(日) 10:29:25.76
c_str()を比較するとポインタを比較している事になって正しくない
ポインタの比較は同一の配列か同一の文字列内でしか出来ない

496 :デフォルトの名無しさん: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;
}

497 :デフォルトの名無しさん:2012/10/28(日) 10:38:20.86
>>495
だったらNULLとの比較もできないことになるが

498 :デフォルトの名無しさん:2012/10/28(日) 10:42:09.72
>>495
stringの使い方からするとおかしいが、比較そのものは合法。

論点はどっちだ?

499 :デフォルトの名無しさん:2012/10/28(日) 10:47:13.45
いやそうじゃないだろ
ポインタが同じところ差してるからと言って
中身が同じとは限らないのが問題なんだろ

500 :デフォルトの名無しさん:2012/10/28(日) 10:52:38.59
>>495
> ポインタの比較は同一の配列か同一の文字列内でしか出来ない

大小比較は出来ない (と言うか意味ない) けど、一致比較は出来ると思うぞ。

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

位置の前後は意味あるんじゃない?
差分もとれるし。
意味ないのは和の方。

502 :デフォルトの名無しさん: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"か区別つくよ */

503 :デフォルトの名無しさん:2012/10/28(日) 11:18:57.50
ポインタ値の大小の話がなんで位置の話になるんだよ。

504 :デフォルトの名無しさん:2012/10/28(日) 11:20:27.12
>>501
> 位置の前後は意味あるんじゃない?
> 差分もとれるし。

だからそれが意味を持つのは、「同一の配列か同一の文字列内」の場合だけでしょ。

505 :デフォルトの名無しさん:2012/10/28(日) 11:31:08.31
別に任意のポインタを比較したっていい
それが意味を持つかどうかは、要件次第

506 :デフォルトの名無しさん:2012/10/28(日) 11:38:23.13
>>505
> 別に任意のポインタを比較したっていい

規格上は「ダウト」じゃなかったっけ?

507 :486:2012/10/28(日) 13:38:38.48
>>488
レスありがとうございます。
>>489の説明でよくわかりました。


508 :デフォルトの名無しさん:2012/10/28(日) 13:41:31.85
>506
p == NULL
とか
p == q
とか
また「任意じゃない」とか言い出すんだろうな

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


510 :デフォルトの名無しさん:2012/10/28(日) 14:22:24.89
文字列リテラルはその文字列が格納される先頭アドレスを表すから

511 :デフォルトの名無しさん:2012/10/28(日) 14:24:53.16
>>508
> p == q

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

512 :486:2012/10/28(日) 14:34:05.93
>>510
レスありがとうございます。
文字列リテラルの先頭アドレスは &sで出てくる値で正しいのでしょうか?


513 :デフォルトの名無しさん:2012/10/28(日) 14:38:49.02
sでいい
&sだとポインタ変数のアドレスになっちまう

514 :デフォルトの名無しさん:2012/10/28(日) 14:59:08.72
>>512
初心者本買って勉強しろ。
そして死ね。

515 :486:2012/10/28(日) 14:59:53.40
>>513
sのアドレスが見たい時はどうすればよいのでしょうか?


516 :デフォルトの名無しさん:2012/10/28(日) 15:01:39.18
>>515
std::cout << static_cast<void*>(s) << std::endl;
こういうことか?

517 :デフォルトの名無しさん:2012/10/28(日) 15:06:04.80
>>516
初心者なのでまだその式の意味がわかりません。
難しい話のようなのでもうちょっと勉強してきます。


518 :デフォルトの名無しさん:2012/10/28(日) 15:20:17.65
素朴な疑問だが、文字列リテラルってなんで文字定数('A')じゃだめなの?

519 :デフォルトの名無しさん:2012/10/28(日) 15:25:05.04
null終端じゃないからじゃね

520 :デフォルトの名無しさん: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++; }

521 :デフォルトの名無しさん: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個で渡した方がよくね?ってこと。

522 :デフォルトの名無しさん:2012/10/28(日) 18:43:25.86
文字が複数個と文字列は、明らかに別物だから、別物になってるだけ

ジェネレートされた命令列は関係ない


523 :デフォルトの名無しさん:2012/10/28(日) 20:56:54.27
Cは暗黙のうちに定義される動作がわかりにくいんだよな。
紙にメモリと変数領域を自分で書きながら勉強するといいかも。

524 :デフォルトの名無しさん:2012/10/29(月) 12:33:01.67
馬鹿には無理。
馬鹿でないなら紙に書かなくても理解できる。
紙に書いて理解できたと思っているのは、実は理解できていない馬鹿か、
無駄なことをしていることに気付いていないだけ。

525 :デフォルトの名無しさん:2012/10/29(月) 13:44:07.47
英単語は書かないとスペル間違うぞ

526 :デフォルトの名無しさん:2012/10/29(月) 14:19:55.30
自分が判らないからと言って相手も判らないと思い込み
論を語る基地害ってどこから湧いてくるんだろうな

527 :デフォルトの名無しさん:2012/10/29(月) 14:22:50.07
・「みんなの意見」「他の人もそう思ってる」など、自分の意見なのに他人もそう思ってると力説する人
他人が自分とは違うという事実が受け入れられない人です。自分の意見が通らないとコピペや荒らしなど
無茶をし始めるので見かけたら放置してください。

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

・自分の感情だけ書く人
「〜〜がムカツク」とか自分の感情を掲示板に書くことに意味があると思っている人です。
何がどのようにムカツクのか論理的に書いてあれば、他人が読んでも意味のある文章になりますが、
そういった論理的思考の出来ない人です。もうちょっと賢くなるまでは放置してあげてください。


528 :デフォルトの名無しさん:2012/10/29(月) 18:15:44.15
今日そのコピペ流行ってるな

529 :デフォルトの名無しさん:2012/10/29(月) 19:50:36.07
×他人を卑下したり
○他人を蔑視したり

自分を卑下します

530 :デフォルトの名無しさん:2012/10/31(水) 09:15:54.27
WinGWからDirectXって使えますか?

531 :デフォルトの名無しさん:2012/10/31(水) 09:19:14.22
もちのろん

532 :デフォルトの名無しさん:2012/10/31(水) 20:03:31.80
MinGWな

533 :デフォルトの名無しさん:2012/11/01(木) 08:23:34.87
TがUを公開継承していて暗黙変換可能なとき
IHoge<T>を暗黙にIHoge<U>に変換可能にするような書き方ってできますか?

534 :デフォルトの名無しさん:2012/11/01(木) 09:06:41.82
template <class T> struct IHoge {
T m;

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

535 :デフォルトの名無しさん: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());

↑みたいな感じにしたいです

536 :デフォルトの名無しさん:2012/11/01(木) 13:04:53.20
hoge
禁止!

537 :デフォルトの名無しさん: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; }
};

538 :デフォルトの名無しさん:2012/11/01(木) 13:10:32.31
>>537
TとUは一般的なクラスなんで特殊化だけでは対応し切れません

539 :デフォルトの名無しさん:2012/11/01(木) 18:55:51.58
バイト列をstd::stringで扱うと何か問題ありますか?
ヌルとかがあるとまずいかなと思って今まで
vector<char>でやってました。

540 :デフォルトの名無しさん:2012/11/01(木) 19:22:05.22
>539
後者が正解

541 :デフォルトの名無しさん:2012/11/01(木) 21:50:05.73
ちょっと混乱したのでお助けを
const char* p
だと
*p = 0;
これはダメで
p = "hoge";
これは可能
つまりポインタ先の変更は不可能だが、ポインタ自体は変更可能
では
const char** h;
だと・・・?
char*を一つの型として考えて
*hが変更不可能だと思ったのですが実際は
*hに代入ができました
どう考えるべきですか?

542 :デフォルトの名無しさん:2012/11/01(木) 21:55:42.30
遠い方に効く

543 :デフォルトの名無しさん:2012/11/01(木) 22:42:09.13
こういう問題があるから前にconstを書くやつはクズ
後ろに書けば明快でよろしい

544 :デフォルトの名無しさん:2012/11/01(木) 22:47:17.99
何をconstにしたいかによるだろ

545 :デフォルトの名無しさん:2012/11/01(木) 22:48:22.55
何をコンストにしたいか一目瞭然だから後置がいいんだよ

546 : ◆QZaw55cn4c :2012/11/01(木) 23:01:18.97
>>541
>>542 >>543によると
const char **h;
は char const **h と考えるのがいいとのこと。
http://codepad.org/yAJmxtgd

547 :デフォルトの名無しさん:2012/11/01(木) 23:23:58.14
色々ありがとうございます
何か自分が単純な思い落としをしていたのかと思ってたのですが
意外に根が深そうですね
もうちょっと自分で整理つけてみます

548 :デフォルトの名無しさん: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

・参照外しした場合は右から一つずつ『へのポインタ型の変数・定数』を外していく

549 :デフォルトの名無しさん: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型の変数』だから変更できる

550 :デフォルトの名無しさん:2012/11/02(金) 04:26:23.28
>>541
エキスパートCプログラミングという本を読むといい。
そのへんのことが詳しく書いてある。

551 :デフォルトの名無しさん:2012/11/03(土) 02:42:50.43
csvを読み込むソースください。
自分で実装しようと思ったけど、"とか改行とか考えるとめんどくさくなった

552 :デフォルトの名無しさん:2012/11/03(土) 02:51:43.53
csvにも仕様が色々ありすぎてどうしようもない

553 :デフォルトの名無しさん:2012/11/03(土) 02:55:06.20
excelで出力したやつ

554 :デフォルトの名無しさん:2012/11/03(土) 03:00:37.39
ならまずその仕様を明確に調査してくれ

555 :デフォルトの名無しさん:2012/11/03(土) 03:37:04.36
そこまでするなら自分で作ります

556 :デフォルトの名無しさん:2012/11/03(土) 07:39:08.98
CSVってガチにやると凄ぇ面倒くさかった気がする。

557 :デフォルトの名無しさん:2012/11/03(土) 09:27:12.49
基本カンマ区切りだけど、""内は文字列として扱う、だけじゃ駄目か

558 :デフォルトの名無しさん:2012/11/03(土) 09:46:47.58
>>557
で、""でくくられると、くくられた文字列ないには大抵改行が入ってるのな

559 :デフォルトの名無しさん:2012/11/03(土) 09:50:17.72
a,"b1,b2",c
とかも考慮したりするとめんどいな

560 :デフォルトの名無しさん:2012/11/03(土) 09:59:54.47
>>551
死ね

561 :デフォルトの名無しさん:2012/11/03(土) 11:01:17.32
プログラミング作法にけっこう解説あるけど、そういうの読むのは面倒?

562 :デフォルトの名無しさん:2012/11/03(土) 11:05:58.89
abc,"def , "" , ghi",jkl,"mno
pqr"

なんてのも扱えないといけないよ

563 :デフォルトの名無しさん:2012/11/03(土) 11:12:03.16
改行がCRLFのときに""内にCRだけの改行が入ってたり

564 : ◆QZaw55cn4c :2012/11/03(土) 11:30:06.09
>>562
これは無理なのでは。
""で囲まれたセンテンスの中にさらに " があった場合、これが終わりをしめすのか更なる""センテンスを示すのかはどうやって決定すればいい?
人間はどう解釈している?

565 :デフォルトの名無しさん:2012/11/03(土) 11:31:03.59
状態遷移図書いてみろや
書けなかったらその構文では無理って事だ

566 :デフォルトの名無しさん:2012/11/03(土) 11:34:32.51
" " 内の "" は " という文字のエスケープシーケンスだろ、この場合

567 :デフォルトの名無しさん:2012/11/03(土) 15:57:05.27
>>564
1文字先読みするだけだろ

568 :デフォルトの名無しさん:2012/11/03(土) 16:02:19.56
>>562
期待するパース結果も書いてくれ



569 :デフォルトの名無しさん:2012/11/03(土) 16:09:28.70
"abc"
"def , \" , ghi"
"jkl"
"mno\npqr"
だろ

570 :デフォルトの名無しさん:2012/11/03(土) 16:34:24.87
>>569
ごめん
いまいちルールが理解できないわ
カンマとダブルクォーテーションは、どちらが優先的に解析されるのだ?

571 :デフォルトの名無しさん:2012/11/03(土) 18:37:29.40
ダブルクォーテーションが優先されなかったら
何の為に書くんだよw

572 :デフォルトの名無しさん:2012/11/03(土) 20:06:41.18
正直な話、RFC読んで実装をさっくり諦めるくらいの規模ではあるよな

573 :デフォルトの名無しさん:2012/11/03(土) 20:35:21.85
,"x,x"xx"x,x", と来たらどうするのかとか
,x"x,x"x, と来たらどうするのかとか
改行までを読み込んだり特定文字列で分割して配列に詰め込むことが
サポートされてる言語使い程度には扱えないよねw

574 :デフォルトの名無しさん:2012/11/03(土) 20:58:46.76
>>541ではないが"エキスパートCプログラミング"を購入した
256倍本もまた販売してほしくなった

575 :デフォルトの名無しさん:2012/11/03(土) 21:14:14.17
昔、accessとexeclでCSVの解釈が違ってたが、もう直ったのかな

576 :デフォルトの名無しさん:2012/11/03(土) 21:21:27.37
CSVって方言多いんじゃないの

577 :デフォルトの名無しさん:2012/11/03(土) 22:32:53.28
Excelを標準にするのが妥当でしょ
abc,d"e
とか
abc,"d"e
みたいなのはパーズエラーで、どうにでもすればよろし

578 :デフォルトの名無しさん:2012/11/03(土) 22:47:27.31
parse 【pɑ'ːrs】

濁りません

579 :デフォルトの名無しさん:2012/11/03(土) 22:48:22.33
577 は考えるのをやめた

580 :デフォルトの名無しさん:2012/11/03(土) 22:49:56.46
[p?'?z] 濁る発音もあるよ!

581 :デフォルトの名無しさん:2012/11/03(土) 23:49:29.58
>>577
> Excelを標準にするのが妥当でしょ

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

正式な奴があるなら、俺も欲しい。

582 :デフォルトの名無しさん:2012/11/03(土) 23:59:35.95
適当に見つけた資料 ttp://www.7key.jp/rfc/rfc4180.html の仕様に合わせて
boost.spiritで
ttp://codepad.org/GBr4mdKx

583 :557:2012/11/04(日) 00:31:19.91
>>558
あれって行単位で扱うもんじゃないの?
>>559
俺のやり方だと「a,"b1」と「b2",c」に分かれるんだが、駄目なん?
(文字列内に,があったら""で囲む。"があったらエスケープする的な)

でも>>577のようなパターンもあるのか……
デファクトスタンダード的にはExcelに合わせるべきなんだろうが、嫌な話だな

584 :デフォルトの名無しさん:2012/11/04(日) 00:48:33.65
>>583
> あれって行単位で扱うもんじゃないの?

たいていの人はそう思うと思うんだけど、デファクトの Excel が改行を入れてくるから。

585 :デフォルトの名無しさん:2012/11/04(日) 02:59:40.94
CSVを1行ずつ読み取って解析しようと考える奴は
ExcelはAlt+Enterでセル内に改行を入れられることを
知らないことが多くない?w

586 :デフォルトの名無しさん:2012/11/04(日) 03:02:21.43
まず一般人でそのことを知らない人について統計をとれ
その後でCSVを1行ずつ読み取って解析しようと考える奴についてそのことを知らないかどうかの統計をとれ
結果に有意な差が出たらお前のことを認めてやる

587 :デフォルトの名無しさん:2012/11/04(日) 03:05:25.78
いや、1行ずつ読み取って解析しようと考える奴とそうでないやつとで比べないと・・・

588 :583:2012/11/04(日) 08:53:12.74
>>584-586
ぐぬぬ……
それを知ってしまったら、対策用コードを新たに考えなくちゃならんじゃなイカ!

589 :デフォルトの名無しさん: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で受け取りたいんですけど、どうしたらいいですか?

590 :デフォルトの名無しさん:2012/11/04(日) 09:48:39.56
>>589
cpp11なら&str[0]を引数に渡す
そうじゃないならテンポラリバッファを渡す

591 :デフォルトの名無しさん:2012/11/04(日) 09:54:29.27
>>589
void func(std::string s) {}

int main()
{
LPTSTR lpReturnedString;
func(lpReturnedString);
}

592 :デフォルトの名無しさん:2012/11/04(日) 10:13:02.73
>>590
cppのバージョンがよくわからないです。。
vs2010だとテンポラリバッファのほうを使うしかないですか?
またテンポラリバッファってvectorでもいいんでしょうか?
文字列の長さが決まってないんですが、予め255文字文newするというのはできるだけしたくないです。
連投ですいません。

593 :デフォルトの名無しさん:2012/11/04(日) 10:13:31.36
>>584-585
1行をCRLFまでと考えれば
セル内の改行はLFのみだから
正しく処理出来るんだけどなぁ

594 :デフォルトの名無しさん:2012/11/04(日) 10:16:47.47
>>585
じゃあお前ならどうやる?

何行読む必要あるかは、中身解析しないとわからないから、
一行ずつ読み込んで解析して、継続行の読み込みが必要か
を見ていくのが普通だと思うが。

595 :デフォルトの名無しさん:2012/11/04(日) 10:17:41.79
>>592
vector でも構わないけど
>予め255文字文newする
これと同じことは必要

596 :デフォルトの名無しさん:2012/11/04(日) 10:19:16.68
>594
>593

597 :デフォルトの名無しさん:2012/11/04(日) 10:49:21.04
>>595
ありがとうございます
&str[0]はやめて一時変数と割りきって余分に確保します・・

598 :デフォルトの名無しさん:2012/11/04(日) 10:59:15.33
動的確保にへんな苦手意識持つ若者が増えてきてるよね
ジジイが執筆した時代に逆行したクソみたいな参考書がヒープ確保は高コストだから控えようみたいな脅しかけるからかな


599 :デフォルトの名無しさん:2012/11/04(日) 11:11:23.32
C++使うからには資源管理を徹底したいじゃないですか(´・ω・`)

600 :デフォルトの名無しさん:2012/11/04(日) 11:15:58.75
>>599
だからもうそういう時代じゃないし

601 :デフォルトの名無しさん:2012/11/04(日) 12:24:05.01
動的確保のコストの話と、資源管理の徹底の話をごっちゃにするなよ…

602 :デフォルトの名無しさん:2012/11/04(日) 13:25:11.21
>>600
おまえが時代から置いてかれただけ

603 :デフォルトの名無しさん:2012/11/04(日) 13:57:20.04
>>597
厳密にやりたいならリトライ機能を作り込むしかないよ
サイズはこちらからAPIに教えてあげるんだし、確か書き込まれたサイズも取れたよね?
やってみてダメなら大きいサイズを確保してリトライするって感じね


604 :デフォルトの名無しさん:2012/11/06(火) 10:59:19.43
C++で質問です。
ゲームを作っていて、戦闘、移動などをシーンクラスで実装しようとしています。
メインループ内において、シーンを遷移するかの判定を行っており、遷移判定が真ならシーンオブジェクトを破棄して、
遷移後のシーンオブジェクトを生成します。

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

そこで質問です。
クラスのコンストラクタに何かデータを渡して、データメンバを初期化する方法はありますでしょうか?

605 :デフォルトの名無しさん:2012/11/06(火) 11:18:49.70
メンバ初期化子

606 :デフォルトの名無しさん:2012/11/06(火) 11:33:05.92
ゲーム製作の質問はこちら。

ゲーム製作技術@2ch掲示板
http://toro.2ch.net/gamedev/

607 :デフォルトの名無しさん: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}; のように効率的に書く方法はありますか?

608 :デフォルトの名無しさん:2012/11/06(火) 11:55:14.18
代入演算子を定義する

609 :デフォルトの名無しさん:2012/11/06(火) 11:57:17.69
ああそうですね。
>コンストラクタは書かずに、
の理由が、
構造体の定義があるのが他人の書いたヘッダなので、勝手に書き換えられないんです。

610 :デフォルトの名無しさん: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; }

611 :デフォルトの名無しさん: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);


612 :デフォルトの名無しさん:2012/11/06(火) 20:41:35.51
C++難しすぎなのですが、皆さんはどのようにマスターしたのですか?
プログラムを書きまくれ!とおっしゃる方がいらっしゃいますが、
どのようなプログラムをどのような思考法で書いたのか教えていただけるとありがたいです。

613 :デフォルトの名無しさん:2012/11/06(火) 20:47:25.56
概念的な問題はコード書けばわかるってものではない。
個人的にはC++の勉強をする前にJavaとデザインパターンの
勉強をすすめる。

614 :デフォルトの名無しさん:2012/11/06(火) 20:51:57.65
なぜJavaとデザインパターン?

615 :デフォルトの名無しさん:2012/11/06(火) 20:56:27.63
Javaの利点
・暴走しにくい
・多重継承が禁止されている(多重継承はC++で学べばよい)
・C++のような無理やりCを拡張した形ではないので構造がシンプル

もちろん欠点もあるけどね。

616 :デフォルトの名無しさん:2012/11/06(火) 20:59:56.68
なぜデザインパターン?

617 :デフォルトの名無しさん:2012/11/06(火) 21:50:51.99
引き出しを増やすため、か?

618 :デフォルトの名無しさん:2012/11/06(火) 21:53:09.87
結城本がJavaだしなあ

619 :デフォルトの名無しさん: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++を読む。
一応、これだけできたら普通のプログラマレベルにはなってると思う。

620 :デフォルトの名無しさん:2012/11/06(火) 22:17:07.99
>>619
C含めておすすめのC++の本教えてくれ。

621 :デフォルトの名無しさん:2012/11/06(火) 22:19:51.16
>>619
三行でおk

622 :デフォルトの名無しさん:2012/11/06(火) 22:56:05.57
>>620
エキスパートCプログラミングはすべてのC初学者に読んでほしい。

623 :デフォルトの名無しさん:2012/11/06(火) 23:00:40.93
エキスパートCプログラミングの前に読むべき本は?

624 :デフォルトの名無しさん:2012/11/06(火) 23:02:40.14
K&R2

625 :デフォルトの名無しさん:2012/11/06(火) 23:47:42.66
>>621
C++の薄い本をなんでもいいから眺めながら、
かいてみたら、なにやってんだ?とか疑問が出た

626 :デフォルトの名無しさん:2012/11/07(水) 00:00:15.45
最終的にはちゃんとした厚い入門書は読んでおかないと
端々で知識が怪しくなるぞ

627 :デフォルトの名無しさん:2012/11/07(水) 08:13:42.94
>>620
では読んだ本だけ。アーキテクトさん、学者さんが見たらなめんなと思われるかもしれないが。
後は実コードを見ながらにらめっこ。

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

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

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

>>621
C++どう動いてるか理解して
自分でコード読んで書いて
めげずに頑張れ

628 :デフォルトの名無しさん:2012/11/07(水) 09:40:57.52
>>611
型が違うのに代入出来るんですね。
すげー

629 :デフォルトの名無しさん:2012/11/07(水) 21:53:10.07
計算式で、
テンポラリバッファを用意したほうが速いのかGetメソッドを使って毎回呼び出したほうが速いのか
どっちのほうが速いんでしょうか?
勿論、最初の方はGetのほうが速いんでしょうけど、どれくらいから逆転するか・・・

630 :デフォルトの名無しさん:2012/11/07(水) 21:55:49.45
コードでおk

631 :デフォルトの名無しさん:2012/11/07(水) 21:55:57.20
某シューティングゲーム作成サイトでC++使わされて今に至る

ポインタやSTLのイテレータとか使えれば新卒ならどや顔できるよね?(´・ω・`)

632 :デフォルトの名無しさん:2012/11/07(水) 21:57:45.58
実測しろ

終わり

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

printf("%d",GetNum());
を100回繰り返したのと
int i = GetNum();
としておいて
printf("%d",i);
を100回繰り返したのではどっちが速いのかなーと、
予想では最初は前者が早くてあとから後者のコードが追いつくって思うんだけど、どれくらいで逆転するのか

634 :デフォルトの名無しさん:2012/11/07(水) 22:01:34.46
>>632
だれかもうしてるなら見たい

635 :デフォルトの名無しさん:2012/11/07(水) 22:03:07.74
>>633
GetNum()とやらの実装はわからんが、関数なら、2回目から後者が速い。

636 :デフォルトの名無しさん:2012/11/07(水) 23:03:50.20
オブジェクトの内部の値を外部に渡す方法って
get以外にありますか?

int CSample::get()
{
return m_num;
}


637 :デフォルトの名無しさん:2012/11/07(水) 23:04:43.98
int CSample::kure()
{
return m_num;
}


638 :デフォルトの名無しさん:2012/11/07(水) 23:05:00.54
あっ

639 :636:2012/11/07(水) 23:40:53.85
他のやり方ありますでしょうか?

640 :デフォルトの名無しさん:2012/11/07(水) 23:46:17.87
コールバック与えたら、そいつに値を付けて呼び返してくれるとか


641 :デフォルトの名無しさん:2012/11/08(木) 00:58:02.79
publicにするとか

642 :デフォルトの名無しさん:2012/11/08(木) 10:47:38.75
はぁ...
swtich(){
case 0:
...
case default:
break;
}

643 :デフォルトの名無しさん:2012/11/08(木) 10:50:46.86
>>639
オブザーバーパターンが便利だよ

644 :デフォルトの名無しさん:2012/11/08(木) 12:30:32.25
class CSampleBase{
union{
int m_num;
const int num;
};
};
class CSample : CSampleBase{
public:
using CSampleBase::num;
};
VC以外でできるのか知らんけど。

645 :デフォルトの名無しさん:2012/11/09(金) 01:30:25.11
>>588

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

""でくくられるからいいんだけど、解析側が知らないとえらいことになるよ。

646 :デフォルトの名無しさん: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}としたいと思っているので、気になっています。

647 :デフォルトの名無しさん:2012/11/09(金) 12:57:30.99
すみません脱字が。static int x、void func(int i)でした。
この演算はプログラムの中で最も多く(億単位で)呼び出されるものなので少しでも時間を削りたいと思っています。

648 :デフォルトの名無しさん:2012/11/09(金) 13:05:03.42
>>646
それ環境依存だね
バレルシフタを使用しているハードウェアならほとんど差はない

649 :デフォルトの名無しさん:2012/11/09(金) 13:06:34.11
それより億単位で呼び出されるならインライン化かマクロ化した方が
効果が大きいんじゃね

CALL/RETによるパイプラインバブルの発生はコストが大きいぞ
頭の良いCPUなら投機実行してくれるけど

650 :デフォルトの名無しさん:2012/11/09(金) 13:10:54.69
いやむしろ関数に入る時にいくつかの破壊されるレジスタの内容をを退避/復帰させる時間が
馬鹿にならない

651 :デフォルトの名無しさん:2012/11/09(金) 13:21:53.63
ついでに言えば、
staic const int arr[] = {0, 4, 8, 12, 16, };
x >>= arr[i];
なら
x >>= (i * 4);
とした方が最適化されやすい。

652 :デフォルトの名無しさん: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()を使っているのですが、どうも実行するごとにコンマ数秒程度は値がずれたりしてていまいち信用できず面倒に感じてしまっています。

653 :デフォルトの名無しさん:2012/11/09(金) 13:29:24.48
>>651
なるほど。勉強になります

654 :デフォルトの名無しさん:2012/11/09(金) 13:39:07.67
ある程度のずれは、割り込み等や他タスクの関係で当然だが
rdtscを使って、かつそれほどループ回数を多くしなければ、
大抵は比較的ぶれの少ない数値になるはず。

655 :デフォルトの名無しさん:2012/11/09(金) 13:39:59.34
>>652
>どうも実行するごとにコンマ数秒程度は値がずれたりして
え!?あたりまえじゃん

656 :デフォルトの名無しさん:2012/11/09(金) 13:50:28.89
YOU!compiler intrinsics 使っちゃいなYO!

657 :デフォルトの名無しさん:2012/11/09(金) 13:54:17.26
ずれを小さくするにはSetPriorityClass()使えよ

ただし、REALTIME_PRIORITY_CLASSを指定するとデバイスドライバまでロックされて
もしプログラムが停止しない場合リセットするしか方法がなくなるんで注意

HIGH_PRIORITY_CLASSあたりがいいかも

658 :デフォルトの名無しさん:2012/11/09(金) 14:10:54.92
皆さんありがとうございます。
自分の計測は随分といい加減なやり方だったようです。
HIGH_PRIORITY_CLASSにしてrdtsc (intrin.h) 使うなどしてみます。

659 :デフォルトの名無しさん:2012/11/09(金) 14:45:30.36
QueryPerformanceCounter()とQueryPerformanceFrequency()使うと楽だけどな

OSのAPIには結構美味しい物が揃っている

660 :デフォルトの名無しさん:2012/11/09(金) 15:11:32.74
CPUクロックが可変だったりして。

661 :デフォルトの名無しさん:2012/11/09(金) 15:43:42.83
CPU Load 100%で仕事をさせれば平気だろ
RDTSCが一番確実だけど

662 :デフォルトの名無しさん:2012/11/09(金) 20:12:41.36
値が0だろうが1だろうが全bitをずらすのがシフトだから
演算そのものは実行されるだろう。
結果が変わるかどうかは演算には関係のない話。

663 :デフォルトの名無しさん:2012/11/09(金) 20:14:50.63
1bitずらすより31bitずらす方が
時間掛かるような気がするが
最近のCPUはそうでもないのか

664 :デフォルトの名無しさん: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を分離する意義は
何に見出せるのでしょうか??

665 :デフォルトの名無しさん:2012/11/09(金) 20:38:56.56
>>662
おまえは質問の意味がわかってない。
>>648で答えが出てるから、そもそもレス自体無意味だし。

666 :デフォルトの名無しさん:2012/11/09(金) 21:35:52.62
>>664
モジュール分割すること自体の意義と、それをMVCに分類することの意義をごっちゃにしている。
モジュール分割を行うにあたって、MVCそれぞれの役割に分類することで結合度を比較的
低く抑えられるという、多分に経験則的な設計指針であって、ダイアグラムだけ見てそれが
良いか悪いかと言えるような性質のものではない。
極端な話、モジュール分割を行わなければ「モジュール結合度」は高くならんわけだし。

667 :デフォルトの名無しさん:2012/11/09(金) 21:54:14.49
>>663
そもそも1ビットだけずらす機械語命令があるのかと

668 :デフォルトの名無しさん:2012/11/09(金) 21:54:52.62
あるよ余裕で

669 :663:2012/11/09(金) 21:55:16.92
ごめん、なんか1bitを勘違いしてた(´・ω・`)

670 :667:2012/11/09(金) 22:00:44.62
>>669
俺(>>669)は俺(>>667)です。はぁ、今日はもう寝る。

671 :デフォルトの名無しさん:2012/11/09(金) 22:39:10.86
自演しすぎるとそうなる

672 :664:2012/11/09(金) 23:18:11.12
>>666
なるほど。
一般的にView&Controllerをいっしょこたにしたものはコード規模が大きく複雑になりがち。
そこでモジュール分割したいわけだが、
経験則的に結合度が低くなる傾向にあるのが
ViewとControllerという分け方、ということですね。

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

はっきりとした責務、コードの見通しの良さ、変更の容易性など、
これらのバランスが良くなる一つの例がMVCであるということですね。

673 :664:2012/11/10(土) 00:17:20.23
もう一つ、ViewとControllerを分ける良い点がWebで見つかりました。

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

とても納得がいきました。

674 :デフォルトの名無しさん:2012/11/10(土) 03:17:23.52
当たり前すぎる

675 :デフォルトの名無しさん:2012/11/10(土) 11:18:26.12
vector<kurasu> list;
list.push_back(kurasu1);

ってやったときコピーコンストラクタは呼ばれますか?
このpush_backってインスタンスのコピーを追加するんですよね??

676 :デフォルトの名無しさん:2012/11/10(土) 11:34:37.50
人間その当たり前をせずにどれだけ苦労してきたか

677 :デフォルトの名無しさん: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

678 :デフォルトの名無しさん:2012/11/10(土) 11:39:14.84
>>675
ok

679 :デフォルトの名無しさん:2012/11/10(土) 11:53:41.92
>>678
ありがとう

680 :デフォルトの名無しさん: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()でぬるぽエラー

コピーコンストラクタを定義したせいでしょうか?

681 :デフォルトの名無しさん:2012/11/10(土) 12:20:54.18
upされてない部分について聞かれても答えようが無いであります

682 :デフォルトの名無しさん:2012/11/10(土) 12:22:11.13
list[list.size()-1].GetInt()

683 :デフォルトの名無しさん:2012/11/10(土) 12:30:19.23
>>680
kurasuの中身を書いた方が早い

684 :デフォルトの名無しさん:2012/11/10(土) 12:30:45.45
きっと reserve したかっただけなのに resize しちゃったんだろうと E. S. P.

685 :デフォルトの名無しさん: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
って・・・

686 :デフォルトの名無しさん:2012/11/10(土) 12:38:53.70
ぬるぽ関係ねえ

687 :デフォルトの名無しさん:2012/11/10(土) 12:40:46.68
>>685
入門書くらい買えよ、ハゲ。

688 :デフォルトの名無しさん: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;
こう

689 :デフォルトの名無しさん:2012/11/10(土) 18:03:23.96
>>685
この部分
> kurasu* kurasu2 = kurasu1;
ここは、kurasu1のポインタをkurasu2にコピーしている。したがってkurasu1とkurasu2は同じオブジェクトを指す様になるのであります。
そこでkurasu1のポインタで指したオブジェクトをSetNumで変更すれば、同じオブジェクトを指すkurasu2のオブジェクトを変更したことになるのです。

この代入はポインターをコピーしているだけでコピーコンストラクタは呼ばれていないのです。

690 :デフォルトの名無しさん:2012/11/11(日) 01:02:34.08
関数内で頻繁にエラー値をチェックしてエラーが出た時点でエラー値を返す関数があるんですが
この関数のどこでエラーが発生したかを調べたいのですがなにかいい方法は思いつきますか?
関数の入り口で適当なクラスを作って、デストラクタが__LINE__マクロを受け取る事が出来れば楽なのですが
そういった方法ってありますでしょうか?

691 :デフォルトの名無しさん:2012/11/11(日) 01:04:09.14
適当に戻り値をassertでチェックすればいいんじゃね

692 :デフォルトの名無しさん:2012/11/11(日) 02:09:24.24
>>690
エラー値を返すの「エラー値」が有無を示すプリミティブ値の
場合は戻り値を工夫すればいいんじゃないの。
たとえばエラーならtrue/エラーなしならfalseを返す関数なら
true/falseで返すのをやめて0-nの整数値で返すとか。

693 :デフォルトの名無しさん:2012/11/11(日) 04:40:18.08
それなら return __LINE__; して0の時が成功でいいんじゃ

694 :デフォルトの名無しさん:2012/11/11(日) 11:29:36.64
return __LINE__;
で0が返ることってあったっけ?

695 :デフォルトの名無しさん:2012/11/11(日) 11:30:02.40
ああエラーの時だけラインを返すって意味か。

696 : 忍法帖【Lv=38,xxxPT】(1+0:5) :2012/11/11(日) 13:23:01.72
それなら__FILE__も欲しいわな。

697 :デフォルトの名無しさん:2012/11/11(日) 16:39:02.07
例外処理を知らないバカ共w

698 :デフォルトの名無しさん:2012/11/11(日) 16:49:05.06
例外処理で自慢とか (w

699 :デフォルトの名無しさん:2012/11/11(日) 16:53:25.89
で、その例外処理とやら、どう実装されてんの?

700 :デフォルトの名無しさん:2012/11/12(月) 00:31:01.14
C#でいうところのstatic classのようなものをC++で実現するにはどのようにしますか?

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

適当な純粋仮想関数を用意する?

701 :デフォルトの名無しさん:2012/11/12(月) 00:57:40.96
>>700
コンストラクタを private にする
あるいは、別解として無名名前空間に static 関数などを定義する

702 :デフォルトの名無しさん:2012/11/12(月) 01:03:04.57
>>700
たかだか8文字書き加えるか1行移動するだけで実現できるが、お前には無理。

703 :デフォルトの名無しさん: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」の方では何とか実行できました。

704 :デフォルトの名無しさん:2012/11/12(月) 01:48:37.20
>>703
あなたの環境固有の問題はほかの誰にも知ることはできません。

705 :デフォルトの名無しさん:2012/11/12(月) 02:05:25.31
自己解決しました!
こちらを参考にしました
http://absolutearea.blogspot.jp/2010/07/eclipse-cdt-mingw64bit.html
もし同じ症状が出た方は参考にしてみてください(いないと思いますが)

706 :デフォルトの名無しさん:2012/11/12(月) 20:55:35.34
vectorの削除系メンバ関数について、以下の認識で合っているでしょうか?

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

いずれも、削除された分だけsize()で得られる要素数が減らされる。

707 :デフォルトの名無しさん:2012/11/12(月) 20:58:09.92
vectorにremoveなんてあったっけ

708 :デフォルトの名無しさん:2012/11/12(月) 21:01:01.54
>>706
pop_back:要素数が減る。メモリ領域は解放されない
erase:指定範囲の後ろの要素が前に詰められ、要素数が減る。メモリ領域は解放されない
clear:要素数が0になる。メモリ領域は解放されない。

709 :デフォルトの名無しさん:2012/11/12(月) 21:04:30.44
pop_backは要素数がひとつ減るだった。あと消える要素はデストラクタが呼ばれるな

710 :706:2012/11/12(月) 21:07:12.73
>>707
すみません、vectorにはremoveはありませんでした(汗)

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

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


ありがとうございました。

711 :デフォルトの名無しさん:2012/11/12(月) 23:22:10.13
>>710
C++11には確かスワップ技法を使わなくてもメモリを完全に解放するメンバ関数が加わったはずだけど
ど忘れした

712 :デフォルトの名無しさん:2012/11/12(月) 23:32:29.40
shrink_to_fit()

713 :デフォルトの名無しさん:2012/11/13(火) 00:19:50.83
>>712
ありがとう
これが出来て助かるんですよね

714 :706:2012/11/13(火) 00:23:27.67
>>711-712
おお、覚えておきます!

715 :デフォルトの名無しさん: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);

716 :デフォルトの名無しさん:2012/11/13(火) 19:21:45.19
shrink_to_fit は拘束力の無い要件なので、実装依存なんだよね
まぁ、大抵はちゃんと領域を適切にしてくれるだろうけれど

717 :706:2012/11/13(火) 20:50:04.41
>>715
じつにクレバーな手法ですね!
shrink_to_fitが使えたとしても、
あえて使いたくなるかっこよさですw

>>716
覚えておきます!

718 :デフォルトの名無しさん:2012/11/13(火) 22:41:16.69
>>717
Effective STLに書いてあるよ

719 :706:2012/11/14(水) 00:16:16.84
>>718
その本、持ってました・・・(汗)
たしか1年半ほど前に目を通したはずなんですが、
swap技法、ぜんぜん覚えてませんでした(汗)
付箋貼っておきました!

720 :デフォルトの名無しさん:2012/11/14(水) 01:05:19.75
https://gist.github.com/4066403
このコードをVisual Studio 2010 のVC10 CLコンパイラでコンパイルすると
意図した動作にならないんですが、コンパイラのバグでしょうか?
xには~0ULLが代入されるはずだと思うのですが、そうなりません。

721 :デフォルトの名無しさん:2012/11/14(水) 01:54:44.48
自分の書いたコードのバグを疑わない時点でおかしいでしょ。

722 :デフォルトの名無しさん:2012/11/14(水) 01:59:18.09
>>721
再現可能な最小のケースまで切り詰めたコードで
代入と三項条件演算子とprintf()しか使っていないのですが、
具体的にどこがバグっているのか教えていただけないでしょうか。
gccでは問題ないことを確認しています。

723 :デフォルトの名無しさん:2012/11/14(水) 02:02:14.19
非常に短いので、一応ここにもコードを貼りますが、

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

MSVCコンパイラでコンパイルするると、xに~0ULLが代入されません。

724 :デフォルトの名無しさん:2012/11/14(水) 02:02:57.45
>>720
unsigned long long が 64bit を超えるようだと (uint64_t)~0ULL != ~0ULL になるだろうな。
MSVC10 の仕様は知らんけど。アセンブリコードでも出してみれば?

725 :デフォルトの名無しさん:2012/11/14(水) 02:05:14.23
>>724
MSVC10でのunsigned long longは64bitです。
同値の内容をif文で書けば問題はありませんし、三項演算子の最後の項の式を
もっと単純な整数値式にすればバグらなくなります。

726 :デフォルトの名無しさん:2012/11/14(水) 05:50:29.11
~0ULL と (value / 2.0 + .5) の型が一致してないのが原因だろうからキャストしろ

727 : ◆QZaw55cn4c :2012/11/14(水) 05:53:20.18
横からでごめんなさい。これもよくわからないんです
http://codepad.org/sOv4x56w
http://codepad.org/2a372NsZ
この差はなんだんでしょうか?うーん

728 :デフォルトの名無しさん:2012/11/14(水) 06:14:26.94
>>1をよく読みましょう

729 :デフォルトの名無しさん:2012/11/14(水) 07:25:51.89
>>725
ifと?:でアセンブリコード貼って
最適化なしの場合も

730 :デフォルトの名無しさん: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が
得られないのですね。よく理解できました。

731 :デフォルトの名無しさん: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

732 :デフォルトの名無しさん:2012/11/14(水) 09:36:44.67
おうかぶった

733 :デフォルトの名無しさん:2012/11/15(木) 06:55:27.80
明解C言語、写経しながら進めるのって意外と大変

734 :デフォルトの名無しさん:2012/11/15(木) 08:45:57.73
楽をしても身に付かない

735 :デフォルトの名無しさん:2012/11/15(木) 10:20:17.72
プログラミング言語も言葉だからね

736 :デフォルトの名無しさん:2012/11/15(木) 12:47:16.70
エラーは友達 パソコンサンデー

737 :デフォルトの名無しさん:2012/11/15(木) 13:32:14.50
コンパイルエラーの体験も含めて勉強だから

738 :デフォルトの名無しさん:2012/11/15(木) 13:33:37.08
人間関係は壊れるとほとんど修復不可能だけど、
パソコンは買い換えれば済むからな。

739 :デフォルトの名無しさん:2012/11/15(木) 14:12:54.61
Mr.パソコンのご冥福をお祈りいたします。

740 :デフォルトの名無しさん:2012/11/15(木) 15:53:33.89
死んだのか 合掌

741 :デフォルトの名無しさん:2012/11/15(木) 18:55:36.15
MrじゃなくてDrだったか。

742 :デフォルトの名無しさん:2012/11/15(木) 18:56:26.32
http://ja.wikipedia.org/wiki/%E5%AE%AE%E6%B0%B8%E5%A5%BD%E9%81%93

これだね。

743 :デフォルトの名無しさん:2012/11/15(木) 19:06:01.80
1つのスレッドを、特定のコアに結びつけずに100%回すと、コアあたり(100/コア数)%使用しますよね
こういう場合、このスレッドがボトルネックになっていることを知る方法はありますか?

744 :デフォルトの名無しさん:2012/11/15(木) 19:16:27.75
よくある常駐監視ソフトでコア毎の使用率見ればいいんでねーの?

745 :デフォルトの名無しさん:2012/11/15(木) 21:11:31.36
スレッドごとに知りたいってことじゃないの?
方法知らないけど

746 :デフォルトの名無しさん:2012/11/15(木) 21:39:32.23
知ったところで対策はできないし意味はないと思うけど
知りたい気持ちはわかるな。

747 :デフォルトの名無しさん:2012/11/15(木) 22:17:09.66
>>743
Process Explorer とかで見ればいいんじゃね?
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

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

当然自分が作ったソフトの話だと思うけど。

748 :デフォルトの名無しさん:2012/11/15(木) 22:48:53.75
TLB使いまわし出来る程に柔軟なスケジューラを備えたOSなんてあるの?

749 :デフォルトの名無しさん:2012/11/15(木) 23:23:37.60
TLBを使い回すってどういうこと?

750 :デフォルトの名無しさん:2012/11/16(金) 08:39:58.45
んー、CPU使用率は分からんがどこにどれだけ時間がかかってるかとか、処理の頭にデバッグ文とか
入れての推定ならある程度は可能かな

751 :743:2012/11/16(金) 12:11:19.08
ありがとうございます。
ProcessExplorerと、プロファイラなど見てみます。

752 :デフォルトの名無しさん: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以上の位置にシークできません。
どうすればよいのでしょうか?

753 :デフォルトの名無しさん:2012/11/18(日) 00:06:14.96
>>752
http://d.hatena.ne.jp/shiku_otomiya/20091117/p1

754 :752:2012/11/18(日) 00:19:34.05
>>753
助かりました!
ありがとうございました!

755 :デフォルトの名無しさん:2012/11/19(月) 04:56:19.93
正の重みがあるエッジでノードが接続されているグラフ構造で、エッジの重みから各ノード間の
距離がエッジの重みに準ずるようなノードの最適な配置(座標)を求めたいのですが、
Boost::Graphにそういったものはありますか?
それかまたは簡単に実装できるライブラリなどありますか?
JavaでいうJungみたいなのがあればいいのですが

756 :デフォルトの名無しさん: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 みたいだけど。

757 :デフォルトの名無しさん:2012/11/19(月) 16:56:06.99
ビット演算について教えていただけますでしょうか。

下記のような構造体があります

struct SampleStruct {

unsigned status : 4
unsigned channel : 5 //4ではなく5
unsigned data : 8
}


この構造体が保持しているデータを出力させると下記のようになるとします。
(QtというGUIフレームワークを使用しているのでデバッグにqDebug()を使っています)

// st はSampleStructのオブジェクト
qDebug("%x", st.status); // 9と表示される
qDebug("%x", st.channel); // bと表示される
qDebug("%x", st.data); // 64と表示される

ここまでは意図通りです。
次に statusとchannelを合わせて8ビットで表現させるために以下を行います

qDebug("%x", (midi_command.status<<4) | midi_command.channel);
// 9bと表示される

これも意図通りです。
しかし次の動作を行うと意図通りに行きませんでした。

758 :757:2012/11/19(月) 16:57:11.97
char c = (midi_command.status<<4) | midi_command.channel;
qDebug("%x", c); // ffffff9b と出力される。本当は 9b を得たい。

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

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

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

教えていただけますと嬉しいです。

759 :757:2012/11/19(月) 17:00:45.58
一点間違いがありました。
SampleStructの定義ですが、
unsigned channel : 5
ではなく
signed channel : 5
でした。
よろしくお願い致します。

760 :デフォルトの名無しさん:2012/11/19(月) 17:08:25.20
ttp://codepad.org/3SBpRAd3

761 :757:2012/11/19(月) 17:13:57.59
レスありがとうございます。
代入先の変数がcharになっていまして、unsigned charが使えないんです。

なんとかしてchar cにうまく入れる方法はないものでしょうか。

762 :デフォルトの名無しさん:2012/11/19(月) 17:18:40.27
ttp://codepad.org/FyOcewLr

763 :デフォルトの名無しさん:2012/11/19(月) 17:20:13.98
可変長引数(printf の第二引数移行の箇所)に渡す過程で
最上位ビットがたってる 0x9c が int に拡張する際に符号を維持して拡張されただけ

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

こうすればどうだい?

764 : ◆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

765 :デフォルトの名無しさん:2012/11/19(月) 20:15:10.88
charをunsigned charにキャストしとけば符号ビットが拡張される事はないだろ
C言語256倍でも嫁

766 :デフォルトの名無しさん:2012/11/19(月) 20:17:38.65
C言語256倍読みたい

767 :デフォルトの名無しさん:2012/11/19(月) 20:22:59.02
char c=0x9a;printf(…,(unsigned)c);は
printf(…,(unsigned)(signed)c);だからな

768 : 忍法帖【Lv=40,xxxPT】(1+0:5) :2012/11/20(火) 00:09:31.26
printf("%x", (unsigned int)c&0xff );

769 :757:2012/11/20(火) 00:14:39.02
レスありがとうございます。
http://codepad.org/pAcflg6F
など、いろいろ試したのですがやはりうまくいきません。

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

char型に0x9b を代入しようとすると 0x9bが10進数の127を超えていますが、
2の補数表現のようなものでマイナスを表しているわけでもないですよね・・?
1ではなくffffffになっていますし・・

770 :デフォルトの名無しさん:2012/11/20(火) 00:26:16.40
おいおい、この数レスちゃんと読めよ

771 :デフォルトの名無しさん:2012/11/20(火) 00:39:44.63
すみませんわかりません。。
ちなみに
char c = ((st.status<<4) | st.channel);
qDebug("%x", c&0xff);

このようにすると、9bの出力を得れることを確認したのですが、
出力時に9bになればよいというわけではなく、c に0x9bが入っている状態にしたいのです

char c = st.data;
qDebug("%x", c);
で64が出力されるのと同様に、
char c = (st.status<<4) | st.channel;
qDebug("%x", c);
でffffff9bではなく9bを得たいという感じになります

772 :デフォルトの名無しさん:2012/11/20(火) 01:01:41.71
c が charであれば データサイズが8bitしかないんだから
そもそも0x9b以外に入るわけがないんだけど。

773 :デフォルトの名無しさん:2012/11/20(火) 01:02:14.40
そもそも char は 1 byte だから 0x00-0xff までしかない
上に散々出てるが、単に出力時に拡張されて 0xffffff9b になってるだけで、c には 0x9b が入ってる状態になってる
http://codepad.org/p1EGSjVB

774 :デフォルトの名無しさん:2012/11/20(火) 01:02:58.08
ていうかqDebugでプリントする時にintに符号拡張されてるだけだ。
c に入ってる値はまぎれもない0x9bだから。

775 :デフォルトの名無しさん:2012/11/20(火) 01:04:37.59
強いて解決法をあげるとすれば

qDebug("%02x", c);

でいいんじゃないの?

776 :デフォルトの名無しさん:2012/11/20(火) 01:17:20.36
デバッガ位使えるんだろ?
いい加減、初心者過ぎませんか?

777 :デフォルトの名無しさん:2012/11/20(火) 01:17:36.07
上をちょろっと読んで、
printf("%x\n", (unsigned int)c);
printf("%x\n", (unsigned int)(unsigned char)c);
とか出てこないもんかな

778 :デフォルトの名無しさん:2012/11/20(火) 01:21:25.50
Cを勉強し始めたんだが、多重ループを使って*でピラミッド作ったりするときに
どの変数や数を使ってどう回すのっていう
のが全然思いつけないんだけど、これは慣れなの?

779 :デフォルトの名無しさん:2012/11/20(火) 01:24:26.78
まずは入門書を3冊ぐらい買って、出ているプログラムを
自分で入力して動作を確かめるところから。

780 :デフォルトの名無しさん:2012/11/20(火) 01:26:27.82
割りとマジで慣れしかない。逆に慣れれば、
「ここはiとjの2変数をこういう条件でループさせよう」
といったことが浮かんでくるようになる

781 :デフォルトの名無しさん:2012/11/20(火) 01:30:13.24
慣れ(経験による知識の蓄積と応用)だけで乗り切ってる人もいるけど本当に持つべきは本質的な概念を理解する力とそれを(プログラミング)言語化する能力

782 :デフォルトの名無しさん:2012/11/20(火) 01:31:05.22
慣れてくれば、打ち合わせ中に頭の中でコードを書いてる。
きっと俺だけじゃない…筈。

783 :デフォルトの名無しさん:2012/11/20(火) 01:33:30.62
>>756
ありがとうございます。
BoostにWikipediaの力学モデル (グラフ描画アルゴリズム)のアルゴリズムがあるんですね。
引数の準備が面倒そうだけど汎用性を考えてboostの方を使ってみます。

784 :デフォルトの名無しさん:2012/11/20(火) 07:01:54.92
>777
馬鹿には無理

785 :757:2012/11/20(火) 11:23:48.11
レスありがとうございます。色々初心者でお恥ずかしいです。

なるほど、出力時に変な表示になるだけで実際には0x9bが入ってるんですね。符号拡張というのについて勉強してみます。ありがどうございましたm(__)m

786 :デフォルトの名無しさん: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');
}

787 :デフォルトの名無しさん:2012/11/20(火) 21:19:22.95
みなさんありがとうございます。
慣れと知識が圧倒的に足りてないようですね。
頑張ってみます。
フローチャートみたいなのありがとうございました。参考にします。

788 :デフォルトの名無しさん:2012/11/20(火) 22:35:05.53
プログラムうんぬんではなくて
物を観察して作る能力が欠けてる
高機能障害の疑いがあるから
病院に行ったほうがいい

789 :デフォルトの名無しさん:2012/11/20(火) 22:43:16.00
肛門のピラミッドかw

790 :デフォルトの名無しさん:2012/11/20(火) 23:33:37.93
普通のCとEmbedded C++って言語仕様的にどっちが優れてますか?

791 :デフォルトの名無しさん:2012/11/20(火) 23:44:37.43
Embedded C++に比べたらCのほうが100倍まし

792 :デフォルトの名無しさん: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++の仕様なのでしょうか?

793 :デフォルトの名無しさん:2012/11/21(水) 00:44:08.05
仕様

794 :デフォルトの名無しさん:2012/11/21(水) 00:46:11.02
値 0 になるのは仕様

ところで、 int Val[10] = {}; でいいはずだが、VC++2008 はこの書き方ではダメなのか?

795 :デフォルトの名無しさん:2012/11/21(水) 01:01:07.13
>>792
> 浮動小数点フォーマットでビットが全て0というのは0.0fではないため、

IEEE754では全ビット0 = 0.0fだよ
「そうとは限らない」という意味では正しいけど

796 :デフォルトの名無しさん:2012/11/21(水) 01:06:42.39
> これは_aligned_recalloc(アライメント付き動的メモリ領域確保&0初期化)でも同様でした。
まで含めるならコンパイラ依存だね

797 :デフォルトの名無しさん:2012/11/21(水) 01:15:52.22
>>791
それは優劣を比較するたぐいの話ではない。

798 :デフォルトの名無しさん:2012/11/21(水) 02:23:27.01
>>794
問題ない。Cの癖でつい書いちゃうんだろう。

799 :792:2012/11/21(水) 22:39:09.70
ありがとうございます。

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

>>795
全ビット0で0.0fだったとは・・・
失礼しました。

800 :デフォルトの名無しさん:2012/11/21(水) 23:33:40.23
符号部、指数部、仮数部ともに 0 のときは +0 を表すよう仕様を調整したともいえる

801 :792:2012/11/21(水) 23:34:33.92
実にグッドな調整ですね!

802 :デフォルトの名無しさん:2012/11/21(水) 23:44:32.98
コンパイラは限定されるが
メンバ変数ポインタで確認するのが一番だよ

803 :デフォルトの名無しさん:2012/11/22(木) 01:59:52.22
>800
0の0乗は1だから
数学的には1が正しくね?

804 :デフォルトの名無しさん:2012/11/22(木) 02:13:56.52
0の0乗は未定義

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

しかも、指数部が0は、0乗の意味でもない

805 :デフォルトの名無しさん:2012/11/22(木) 06:43:15.32
int Val[10] = {}; で0で初期化されるのか知らんかった。毎回memsetしてたわ
こんなのどこで知るの?

806 :デフォルトの名無しさん:2012/11/22(木) 06:48:23.85
>805
http://toro.2ch.net/test/read.cgi/tech/1349356417/

807 :デフォルトの名無しさん:2012/11/22(木) 07:36:29.62
コーディングミスなのか意図的なのか分かり辛いし
警告出るコンパイラもあるから
memsetしてるわ

808 :デフォルトの名無しさん:2012/11/22(木) 07:40:10.42
パフォーマンスは同じ?

809 :デフォルトの名無しさん:2012/11/22(木) 07:47:00.58
>>805,807
おいやめろ。
http://www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html

810 :デフォルトの名無しさん:2012/11/22(木) 08:26:50.14
整数(char, int, ...)ならOKじゃなかったっけ?

811 :デフォルトの名無しさん:2012/11/22(木) 09:05:28.37
>なので、memset を使うべきかどうかはコンパイラ任せにすればよいのです。

なんでこうなるの?

812 :デフォルトの名無しさん:2012/11/22(木) 09:15:59.56
>>809
人のすることに難癖つけてるだけだな、こんなのは
好きにしたらええよ

813 :デフォルトの名無しさん:2012/11/22(木) 09:18:58.15
memsetしたあとに
各フィールドに代入してるコードは
確かに間抜けだと思う

814 :デフォルトの名無しさん:2012/11/22(木) 09:19:25.41
>>811
memsetで正しく動作するアーキテクチャかどうかは、
プログラマに確実にわかると限らないから

815 :デフォルトの名無しさん:2012/11/22(木) 12:37:51.11
環境依存OKなスレなんだしmemsetが有益な環境なら好きに使えばいいよ

816 :デフォルトの名無しさん:2012/11/22(木) 14:10:48.33
全bitを0にしても数値として0になるとは限らないと言っておいて
0を代入して「こうすればいいのです」って矛盾しまくりだな。

817 :デフォルトの名無しさん:2012/11/22(木) 14:22:55.00
どこが矛盾?
0を代入すればコンパイラがよきにはからってくれるんだよ

818 :デフォルトの名無しさん:2012/11/22(木) 14:22:59.97
>>816
値の0と、(memset()で代入される)ビット0では意味が違うのよ。

819 : ◆QZaw55cn4c :2012/11/22(木) 19:23:22.80
>>813
TCP/IP を扱うのであれば当たり前

820 :デフォルトの名無しさん:2012/11/22(木) 19:30:05.60
>>1

821 :デフォルトの名無しさん:2012/11/22(木) 21:37:40.96
まあ配列ならstd::fill使うんだけどな

822 :デフォルトの名無しさん:2012/11/22(木) 21:39:04.23
>>819
TCP/IPとどう関係が?

823 :デフォルトの名無しさん:2012/11/22(木) 21:40:50.44
ビッグエンディアンがどうとかじゃねーの

824 :デフォルトの名無しさん: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が各要素に代入される。

825 :デフォルトの名無しさん:2012/11/22(木) 22:02:44.89
std::fill 使えよ

826 :デフォルトの名無しさん: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が働くというのに違和感も・・・

827 :デフォルトの名無しさん:2012/11/22(木) 22:12:36.51
互換性のために仕方ない

828 :デフォルトの名無しさん:2012/11/22(木) 22:22:28.73
うるさくいえば代入でなく初期化で初期化子は整数の0だけどな
特にポインタの場合に全ビットの0フィルでなく整数の0での初期化であることが重要になる

829 :826:2012/11/22(木) 23:21:08.69
>>827
互換性のためですか・・・
他にも、64bitなのにSystem32を使ったりと、違和感バリバリですね(汗)

気にしてもしょうがないので、気にしないようにします。
ありがとうございました。

830 : ◆QZaw55cn4c :2012/11/23(金) 00:12:28.68
>>822
socket() を呼び出す前準備、 struct sockaddr_in の陽に設定しない各メンバは bzero()等で0クリアしておく。
これを忘れるとはまる。

831 :デフォルトの名無しさん:2012/11/23(金) 00:46:48.95
最近のコンパイラだと、fill, fill_n, memset, = {} で全部同じコード吐くのな

832 :デフォルトの名無しさん:2012/11/23(金) 01:07:10.68
>>831
なんと!

833 :デフォルトの名無しさん:2012/11/23(金) 01:14:51.42
クラス内に静的メンバ変数をprivateで宣言するのと、
実装側のファイルにグローバル変数を宣言して使うのとでは、
名前空間で括られるかどうか以外に違いはあるのでしょうか??

834 :デフォルトの名無しさん:2012/11/23(金) 01:19:16.71
>>831
POD型の配列のときは特殊化してんだろ

835 :デフォルトの名無しさん:2012/11/23(金) 01:31:30.24
>>833
当たり前だが実装側ファイルのグローバル変数は
そのファイルに他のクラスのメンバやその他の関数が定義されてればそれらからもアクセスできる

836 :デフォルトの名無しさん:2012/11/23(金) 01:43:17.12
>>830
struct sockaddr_in foo = {0} でいいよね。

837 :833:2012/11/23(金) 01:44:53.74
>>835
なるほど。
たしかに。
まぁ、1ファイル(翻訳単位)につき1クラスの実装しかしないようにするなら問題ないですね。

そもそも、極力、クラスには静的メンバ変数を使いたくないのですが、
Win32APIのOPENFILENAME構造体のlpstrFileメンバのための文字列配列確保を
ローカル変数や普通のメンバ変数にすると、
GetOpenFileName呼び出しが失敗します。
やむを得ず、グローバル変数にしていますが、何かスマートな方法はないものか・・・

838 :デフォルトの名無しさん:2012/11/23(金) 01:51:33.82
>>837
失敗の原因を調べろよ。

839 :デフォルトの名無しさん:2012/11/23(金) 01:53:50.19
末尾に\0が2つ要る
グローバル静的だと0初期化でたまたま動いてるんじゃね?

840 :デフォルトの名無しさん:2012/11/23(金) 01:56:00.02
普通にローカルだろうがメンバ変数だろうが動いてるけど
>>839の言うとおりちゃんと初期化してないんだろう

841 :833:2012/11/23(金) 02:01:44.68
そういうことでしたか!
来週、会社で直します!
ありがとうございました!

842 : ◆QZaw55cn4c :2012/11/23(金) 02:19:44.22
>>836
厳密には否。
それは厳密には0クリアではない、メンバの中にポインタがあったり double があったりしたら。
自動変数を「代入のような書き方で」初期化するのも気にいらない、実際にはコードが生成されるのだから。

843 : ◆QZaw55cn4c :2012/11/23(金) 02:22:09.03
失礼。>>842 はねじれているね。
>>836 で正しいのかも。
しかし、自動変数を「代入のような書き方で」初期化するのはやはり気に入らない。

844 :デフォルトの名無しさん:2012/11/23(金) 02:36:21.52
>>843
Cで変数を初期化する構文は = ... によるものしかないんだが、
これが気に入らないとするとどんな初期化なら良いと言うの?

845 : ◆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++ だったら平気のへいざで書きようが変わるところが、あー、我ながら矛盾していますね。

846 :デフォルトの名無しさん:2012/11/23(金) 03:42:13.23
>>845
最後の int a; ... a = 1; は趣味の問題では済まない、明らかな害悪だろ。
使うところで宣言して初期化しろ。してください。

847 :デフォルトの名無しさん:2012/11/23(金) 03:57:39.66
>>843
「ゼロによる初期化」と捉えるから数値のゼロなのかビットパターンのゼロなのか混乱するのであって、
「組み込み型の初期値による初期化」と捉えれば混乱はないよね。

848 : ◆QZaw55cn4c :2012/11/23(金) 04:19:52.36
>>846
宣言と同時に初期化するのは相応のメリットがあるのでしょうね。ときどきいらぬトラブルに巻き込まれるのもそのせいですね。納得です。

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

考察が深まりました。ありがとうございました。

849 :847:2012/11/23(金) 06:18:35.47
まあ、言葉遊びだけどね。

850 :デフォルトの名無しさん:2012/11/23(金) 07:04:32.15
>>841
お金を貰ってやってる仕事を2chで解決しようとするバカは死ねよ。

851 :デフォルトの名無しさん:2012/11/23(金) 09:11:44.20
別にいいと思うよ。こっちもヒントを貰うこともあるから回答しているんだし。
問題を一般化し、問題点を絞り込んで、人に聞く。その過程だけでもいい訓練になるから
他人に聞くことはどんどん少なくなるものだし。

852 :デフォルトの名無しさん:2012/11/23(金) 09:53:17.61
2chは無断ビジネス禁止

853 :デフォルトの名無しさん:2012/11/23(金) 10:00:21.61
結論:仕事だとはいちいち言わなくていい

854 :デフォルトの名無しさん:2012/11/23(金) 10:14:15.55
聞かれてもいないのに目的を言う必要はない。
技術的に興味を惹かれるネタなら答える人も現れるかも知れない。
上手に回答を釣るのも2chの醍醐味。

855 :デフォルトの名無しさん:2012/11/23(金) 12:37:40.44
趣味でプログラムやってる奴の質問なんて全体の5%もない。
できないのにできますとか言ってプログラマとして就職しちゃった基地害土方が
できなくて焦ってこの板できいてる。
だから質問のレベルも数年前に比べて格段に落ちた。
もう質問スレじゃなくて基地害土方の助け合いスレに変更すべき。

856 :デフォルトの名無しさん:2012/11/23(金) 13:58:53.34
教えることが、最良の勉強になる。

857 :デフォルトの名無しさん:2012/11/23(金) 14:13:11.40
>>856
バカに教えても勉強にならない。

858 :デフォルトの名無しさん:2012/11/23(金) 14:13:50.77
教えるのは馬鹿のためじゃない
自分のため

859 :デフォルトの名無しさん:2012/11/23(金) 15:27:28.06
情けは人の為ならず。
己の為。

860 :デフォルトの名無しさん:2012/11/23(金) 15:31:29.34
>>854
確かにね。
相手が興味を持ちそうなストーリーを添える、ってのも仕事・ブライベートに限らず、重要なスキルだからな。

861 :デフォルトの名無しさん:2012/11/23(金) 16:07:54.94
忘れるから

862 :デフォルトの名無しさん:2012/11/23(金) 16:37:32.59
2ch へのアクセス禁止で開発効率が大幅に低下
http://blog.livedoor.jp/lalha/archives/50156986.html

863 :デフォルトの名無しさん:2012/11/23(金) 16:52:33.77
昔はfj.*やcomp.*などのネットニュースでやってたことを、時代とともにその場が
かわっただけで禁止にしちゃいかんよね

864 :デフォルトの名無しさん:2012/11/23(金) 17:13:07.41
売名ができない点が、発言の内容に大きく影響している
★は売名がよほど成功してからだし

865 :デフォルトの名無しさん:2012/11/23(金) 17:50:33.85
楠楠

866 :デフォルトの名無しさん:2012/11/24(土) 09:24:07.60
>>846
使うところで宣言、初期化したって関数の冒頭でまとめてやったっていいじゃない
言語仕様は自由だ、だから余計に縛っちゃいやんでござる

867 : ◆QZaw55cn4c :2012/11/24(土) 09:31:33.95
>>866
初期化忘れは結構はまる

868 :デフォルトの名無しさん:2012/11/24(土) 09:46:52.14
別に初期化を忘れるのは問題じゃない
スコープが無駄に伸びて不必要なアクセスが生じる可能性を恐れているんだよ

869 :デフォルトの名無しさん:2012/11/24(土) 10:28:02.26
言語の先生に
使ってない変数を宣言するな
(使ってたとしても要らなくなったら宣言したまま放っとくな)
と言われましたが
そういうもんなんでしょうか?

870 :デフォルトの名無しさん:2012/11/24(土) 10:29:10.44
そういうもんです
目の前にあるゴミは少ないほうがいいだろう

871 :デフォルトの名無しさん:2012/11/24(土) 10:31:55.11
あとで使うつもりで残しておいたのでなければ、
消しておいた方が良いね。

872 :デフォルトの名無しさん:2012/11/24(土) 10:57:49.98
ソースコードにはできるかぎり価値のないものは書かないようにする
あまりに意味のないコメントもそう
i++; // i をインクリメントする

873 :デフォルトの名無しさん:2012/11/24(土) 10:59:10.90
>>867
コンパイラで警告出すだろ?

874 : ◆QZaw55cn4c :2012/11/24(土) 11:04:53.45
>>873
精度はいまいち。bcc32とgccそれぞれに見落としがあることを経験している。javac は完璧。

875 :デフォルトの名無しさん:2012/11/24(土) 11:18:35.65
>>872
書くのなら、なんでインクリメントするのかを処理の塊で解説を頭に書いた方がスッキリするね

876 :デフォルトの名無しさん:2012/11/24(土) 11:22:18.73
Cあがりの人が冒頭で変数宣言してるの超うざい
初期化漏れが不安で仕方が無い

877 : ◆QZaw55cn4c :2012/11/24(土) 11:32:06.47
>>876
ごめん

878 :デフォルトの名無しさん:2012/11/24(土) 11:46:06.82
コピーコンストラクタでなく代入演算子が動くのも問題

879 :デフォルトの名無しさん:2012/11/24(土) 11:49:11.47
>>876
逆からみれば、必要になるまで宣言しないことは、最初から無計画に思いつきで書いてるように
みえちゃったりするわけよ

880 :デフォルトの名無しさん:2012/11/24(土) 11:52:14.64
>>879
んなこたーない
冒頭で書く事にこだわってバグを増やしたんじゃ世話ない

881 :デフォルトの名無しさん: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];
とか、どうするのがいいでしょう?

882 :デフォルトの名無しさん:2012/11/24(土) 12:24:57.63
すみません、下の段落はarr[3] = {13,26,26}でした

883 :デフォルトの名無しさん:2012/11/24(土) 12:29:28.23
あ、もう一つ間違いが。
int y = x*(13 << (((x>>3) | (x>>2)) & 1));ですね。最初のシフトの向きが間違ってました

884 :デフォルトの名無しさん:2012/11/24(土) 12:38:19.07
実際にclock()とか使って数万回ループで計測してみれば?
どれも大差はなさそうだけど、保守性の良さで決めれば

885 :デフォルトの名無しさん:2012/11/24(土) 12:50:22.26
そうですね、実際測ってみるつもりなのですが、勉強目的でコードを書いているので、
何か速度の差を生む要因など分かる方がいれば参考にさせて欲しいなあと思ってます

886 :デフォルトの名無しさん:2012/11/24(土) 13:04:55.39
テーブル使うならxをかけた結果のテーブルを作って int y = arr[x]; だろ

887 :デフォルトの名無しさん:2012/11/24(土) 13:10:22.07
なるほど、それが一番テーブルを生かしたコードですね。
サイズ100のテーブルか純粋な演算か、どちらがいいのだろう。

888 :デフォルトの名無しさん:2012/11/24(土) 13:11:22.54
すみません、勘違いでした。サイズは変わらず10ですね。純粋に改善されたコードでした。

889 :デフォルトの名無しさん:2012/11/24(土) 13:14:24.46
必要なところの直前で変数を宣言できる仕様は
C++で最も素晴らしい拡張であると言っても過言ではない。
これができないだけで生C言語はイヤだ。

890 :デフォルトの名無しさん:2012/11/24(土) 13:16:27.33
>>881
int y = (x < 4 ? 13 : 26); が早い
mov, cmp, cmovl の3命令で済む

891 :デフォルトの名無しさん:2012/11/24(土) 13:20:37.57
って、さらにxかけるのね
int y = x * (x < 4 ? 13 : 26); だな

892 :デフォルトの名無しさん:2012/11/24(土) 13:22:49.18
>>890
そっちの方が速いんですか。
自分がそう思わなかったのは、if文は遅いということからの勘違い(アセンブラの知識が無いため)だと思うのですが、
?を使った文の場合はjmp命令が無いからif文とは全然違うもので、高速に動作するという解釈でいいのでしょうか

893 :デフォルトの名無しさん:2012/11/24(土) 13:31:21.06
>>892
jmp命令があれば遅くなるけどcmovcc命令を使えば速い(ccには比較方法が入る)
cmovccは条件が満たされる時のみ代入するというもの
cmovcc命令は後から導入されたため大昔の最適化ガイドだと「比較は使うな」と書いてあるかもしれないが、
既に導入された時期が大昔になったため使われる事を期待して全く問題なし

894 :デフォルトの名無しさん:2012/11/24(土) 13:31:59.19
三項演算子マンセー

895 :デフォルトの名無しさん:2012/11/24(土) 13:33:41.27
もちろんCPUに依存する事は言うまでもないので
他のCPUを使ってる時はとりあえず実測しろ

896 :デフォルトの名無しさん:2012/11/24(土) 13:36:42.47
昔のCPU使ってる人は切り捨てるので大丈夫です!

897 :デフォルトの名無しさん:2012/11/24(土) 13:37:03.41
>>893
そんな命令があるんですね
大変勉強になりました。三項演算子を見直しました
ありがとうございます

898 :デフォルトの名無しさん:2012/11/24(土) 13:44:57.06
x < 4 ? 13 : 26 は例えばこんな風にコンパイルされると思われる

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

実際には x は掛け算でも使うので
一旦レジスタに入れられるだろうけどね
(レジスタの余り具合にもよるだろうけど)

899 :デフォルトの名無しさん:2012/11/24(土) 13:50:50.90
なるほど、わかりやすいです

900 :デフォルトの名無しさん:2012/11/24(土) 13:51:03.46
これからは三項演算子ガンガン使います!

901 :デフォルトの名無しさん:2012/11/24(土) 13:57:58.73
ごめん、数値逆だった

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

902 : ◆QZaw55cn4c :2012/11/24(土) 15:53:38.05
>>894
http://toro.2ch.net/test/read.cgi/tech/1313183984/594

903 :デフォルトの名無しさん:2012/11/24(土) 16:40:26.04
「条件演算子」って言えよ。

904 :デフォルトの名無しさん:2012/11/24(土) 16:51:43.25
関係・比較演算子と紛らわしいから三項演算子の方が齟齬が無くていいよ

905 :デフォルトの名無しさん:2012/11/24(土) 17:30:27.46
ということにしたいのですね。

906 :デフォルトの名無しさん:2012/11/24(土) 17:49:27.30
もったいないのでわたしにください。

907 :デフォルトの名無しさん:2012/11/24(土) 19:19:10.09
ハテナコロンはダメですか?

908 :デフォルトの名無しさん:2012/11/25(日) 00:38:48.52
口頭で聞いたときは「"参考"演算子」だと思ってた。
式を解釈(参考に)して結果を選択するからかぁと納得。

909 :デフォルトの名無しさん:2012/11/25(日) 00:43:19.74
三項演算子の起源?はなんだろう、なんでこんな演算子というかからくりを組み込んだんだろう?

910 :デフォルトの名無しさん:2012/11/25(日) 01:02:27.03
そりゃわざわざifを使うのは冗長でいけてない状況が多いからだろう
記述が多ければ間違う可能性も多い。これは真理

911 :デフォルトの名無しさん:2012/11/25(日) 01:10:58.85
ifだと戻り値が返せないのがな。

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

typedefと同じ機能で前方参照にも使える typeclassみたいなのも作ってくれ。

912 :デフォルトの名無しさん:2012/11/25(日) 01:23:04.09
構文と式の違いだろ
戻り値ってなんぞ

913 :デフォルトの名無しさん:2012/11/25(日) 01:45:01.06
bool hoge;
if(bool = fuga == hage)
的なことじゃないの

914 :デフォルトの名無しさん:2012/11/25(日) 01:52:56.21
ifより三項演算子のほうがわずかに高速なコンパイラがあったな。
特定CPU向けでCPUの特性にあわせてるんだろうけど。

915 :デフォルトの名無しさん:2012/11/25(日) 01:58:53.28
>>913
hoge厨がしゃしゃり出てくるんじゃねーよ
異常者は書き込むな

916 :デフォルトの名無しさん:2012/11/25(日) 02:12:14.86
913のダメさ加減は識別子以前の問題だと思うがね

917 :デフォルトの名無しさん:2012/11/25(日) 02:19:14.11
>>913
お前頭おかしい自覚ある?

918 :デフォルトの名無しさん:2012/11/25(日) 04:34:50.39
hoge使ってる時点でどんなに正しいことを言ってても相手にされない。
頭の悪さが強烈に滲み出てるようなものだからね。
内容以前の問題。

919 :デフォルトの名無しさん:2012/11/25(日) 04:40:36.97
hogeに反応する奴はハゲ

920 :デフォルトの名無しさん:2012/11/25(日) 07:27:15.67
ん、if ((a = b) == c) じゃなくてif (a = b == c) でいいのか……

921 :デフォルトの名無しさん:2012/11/25(日) 08:42:36.94
論点が違っている。

922 :デフォルトの名無しさん:2012/11/25(日) 08:52:18.79
つか、多項式ならswitchを拡張する方がいいと思うけどな、先輩のCOBOLなんて
たぶん理想的な綺麗で求めてるような素直で簡潔なEVALUATEというものがある

923 :デフォルトの名無しさん: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"; /*略*/}());

924 :デフォルトの名無しさん:2012/11/25(日) 11:56:24.12
またhoge厨とアンチか

もういい加減ウザいから>>1に禁止って書いとけよ

925 :デフォルトの名無しさん:2012/11/25(日) 12:04:03.08
こう書けばシンプルで分かりやすいテーブルになる
const string str(val == 1 ? "one"
         : val == 2 ? "two"
         :       "invalid");

926 :デフォルトの名無しさん:2012/11/25(日) 12:39:46.82
hogeより素晴らしい意味の無いものを示す識別子てあるんですか?

927 :デフォルトの名無しさん:2012/11/25(日) 12:55:08.00
>>926
お前の生殖器

928 :デフォルトの名無しさん: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を実装できそうな気がします。
どなたか、参考になる簡単なソースコード、もしくはサイトを知ってたら教えて下さい。

929 :デフォルトの名無しさん:2012/11/25(日) 14:27:51.58
環境が分からんことには答えようがないと思うが

930 :デフォルトの名無しさん:2012/11/25(日) 14:32:35.98
いまどき全然関係ないところを探し当てる、その程度の知識でprintfを実装とか
宿題としか思えない。
どうせ可変引数の練習だろうに、素直に1にwriteしとけ。

931 :928:2012/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互換機とかいうやつだと思う。

932 :デフォルトの名無しさん:2012/11/25(日) 16:59:45.03
いくらなんでもスレ違いだろう

933 :デフォルトの名無しさん:2012/11/25(日) 17:11:45.27
>>931
ここはC/C++のスレ。アセンブラを書きたいなら他に行け。
つーか、そのレベルでprintf()の実装なんて一ヶ月かけても無理だよ。

934 :デフォルトの名無しさん:2012/11/25(日) 17:12:41.56
printf()の実装か‥‥一度はてをつけてもいいかも

935 :デフォルトの名無しさん:2012/11/25(日) 17:33:06.78
>>931
死ね

936 :デフォルトの名無しさん:2012/11/25(日) 17:56:31.57
>>934
昔、組み込み機器用にサブセットを実装したなぁ…

937 :デフォルトの名無しさん:2012/11/25(日) 18:08:39.96
>>936
俺もやったw
つーか、標準ライブラリ使用禁止な仕事だったから標準ライブラリ互換の関数を幾つも作ったが、これは勉強になった。
かれこれ20年前の話。

938 :デフォルトの名無しさん:2012/11/25(日) 18:16:17.30
>>926みたいな基地害って英語の情報を調べたことがないんだろうな
世界各国でhogeがメジャーに使われてるとでも思ってんのか
マジで頭おかしいわこいつ

939 :デフォルトの名無しさん:2012/11/25(日) 18:33:25.85
>>909
「やってやる」ってノリ
単項と2項だけじゃ殺風景だから3項が必要な演算は何かないかとか
代入も単純代入だけじゃ殺風景だから演算付き代入も入れとこうとか
判断も if else だけじゃ殺風景だから switch case も入れとこうみたいのは
色んなコンパイラがこぞってやっていた

ちなみにビットと論理を区別しようといった次の瞬間 true は int の 1 みたいな糞ルールが生じた

940 :デフォルトの名無しさん:2012/11/25(日) 18:40:07.63
>>937 それ何のために禁止してんの?信頼性は自作のほうが落ちてるよね?

941 :デフォルトの名無しさん:2012/11/25(日) 18:54:01.12
既存のものはバグがある、俺が金を出して作らせたものにはバグはない
と言うバカスタマーせい

942 :デフォルトの名無しさん:2012/11/25(日) 18:56:00.47
メモリ使用量が多すぎたりROM化しにくかったりで標準関数が
使えないまたは使うのが難しい環境はあるんだよ。

943 :デフォルトの名無しさん:2012/11/25(日) 20:43:19.43
組み込み系だと、標準出力の概念がなかったりね。

944 :デフォルトの名無しさん:2012/11/25(日) 21:16:57.30
hogeは、米国発祥

945 :デフォルトの名無しさん:2012/11/25(日) 21:18:26.81
だから鬼畜米英なんだよ

946 : ◆QZaw55cn4c :2012/11/25(日) 22:57:54.26
>>939
lisp の cond じゃないの?

947 :デフォルトの名無しさん:2012/11/25(日) 23:23:24.34
>>940
組み込み系の場合は標準関数が用意されていない事もあるからそういう事じゃね

948 :デフォルトの名無しさん:2012/11/26(月) 00:08:24.17
コンパイルは通るけど、何も起こらないとか結構あるみたいね。
中身からっぽの関数が用意されてる感じで。

949 :デフォルトの名無しさん:2012/11/26(月) 00:40:18.52
標準入出力の概念自体がなかったりとか

950 :デフォルトの名無しさん:2012/11/26(月) 01:29:11.34
ARMCにはstringをバッファとして渡せるprintfとか入ってるんだよな。

いつかテンプレートで型セーフなprintfを作ろうかと思ってたが、作る手間はぶけたわ。
はよ標準にしてくれ。

951 :デフォルトの名無しさん:2012/11/26(月) 07:23:29.77
標準にするなら可変個引数テンプレートを使ったもので

952 :デフォルトの名無しさん:2012/11/26(月) 16:47:26.45
fooとかbarはここでも使っていいんですか

953 :デフォルトの名無しさん:2012/11/26(月) 17:50:44.09
はい

954 :デフォルトの名無しさん:2012/11/26(月) 20:01:41.80
hageは死ぬべき。

955 :デフォルトの名無しさん:2012/11/27(火) 11:00:25.39
boost::container::stringを使ってます
std::getlineだと弾かれるみたいなので
boost::container::getlineを使いたいのですが
std::stringstreamに該当するものが何なのか分かりません
(つまり、boost版のstring文字列を、行ごとに処理したいのでgetlineを使いたいが、つまづいています。)
具体的にはどうすればよいでのしょうか

956 :デフォルトの名無しさん:2012/11/27(火) 12:02:34.75
行ごとに切り分ける処理だけ自分で書けばいいんじゃないかな

957 :デフォルトの名無しさん: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;
}
}

958 :デフォルトの名無しさん:2012/11/27(火) 14:09:48.58
>>957
おおおぉぉおぉぉおおぉお!!
できました!!!!!

本当にありがとうございます。

959 :デフォルトの名無しさん: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)を勝手にやってほしいなと思うのですが
同じように処理をコピペする以外に何かいい方法はあったりしますか?

960 :デフォルトの名無しさん:2012/11/28(水) 14:21:59.78
Init()とか作って投げる

961 :デフォルトの名無しさん:2012/11/28(水) 14:54:57.06
Hoge(int other) :Hoge(){ }

962 :デフォルトの名無しさん:2012/11/28(水) 15:52:18.70
Hoge(int other)
{
Hoge tmp;
*this = tmp;

// 以下、エキサイトなコード
}

963 :デフォルトの名無しさん:2012/11/28(水) 16:34:20.99
>>959
Hoge基地害は失せろ

964 :デフォルトの名無しさん: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"をインクルードしているヘッダファイルを更新してからコンパイルする場合も遅くなるので困っています。

965 :デフォルトの名無しさん:2012/11/28(水) 17:18:32.96
cppに分けりゃいいんじゃね

966 :デフォルトの名無しさん:2012/11/28(水) 17:30:48.31
>>959
何をもって「いい」と判断するのかにもよるけど、
社会の不利益を減らすって意味ならお前が回線切って吊るのが一番いい。

967 :デフォルトの名無しさん:2012/11/28(水) 17:44:24.24
>959=ゴミw

968 :デフォルトの名無しさん:2012/11/28(水) 18:30:46.71
>>965
ありがとうございます
extern宣言を使って配列のデータをcppに移したらコンパイルの重さが解消しました

969 :デフォルトの名無しさん:2012/11/28(水) 18:36:43.47
hogeとかプログラミングにまでガラバゴス化を持ち込もうとしてる屑は何なの?
日本企業がIT関係でガラバゴス化やって散々な目にあったのにまだ分からないんだな
>>959みたいにガラバゴス化を持ち込もうとする屑がいる限り日本の産業に未来はない
>>959はマジで生きてるだけで迷惑

970 :デフォルトの名無しさん:2012/11/28(水) 18:47:13.40
hogeを覚える暇はあってもコーディングについて調べる暇はないとか終わってるな

971 :デフォルトの名無しさん:2012/11/28(水) 18:59:10.89
>>969
ガラバゴスじゃないよ、自分が間違ってんじゃん。ガラバルスだよ。

972 :デフォルトの名無しさん:2012/11/28(水) 20:07:04.25
相手にするなよ

973 :デフォルトの名無しさん:2012/11/28(水) 20:51:42.85
>>959←この基地害は何で荒らしにきたの?

974 :デフォルトの名無しさん:2012/11/28(水) 21:20:15.96
一々hogeがどうたらと荒らし回るなよ、と
というか、じゃあなにを使ってほしいんだ?

975 :デフォルトの名無しさん:2012/11/28(水) 21:23:57.09
>>959=>>972

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

根性腐ってる奴が自演してても特別不思議な印象は受けないな

976 :デフォルトの名無しさん:2012/11/28(水) 21:26:11.93
>>974
foo,bar

977 :デフォルトの名無しさん:2012/11/28(水) 21:36:25.53
ウゼえなまたか。
もうホゲ禁止ってテンプレ入れとけよ。

978 :デフォルトの名無しさん:2012/11/28(水) 21:37:15.88
椅子でもビアマグでも好きに使えばいい。

979 :デフォルトの名無しさん:2012/11/28(水) 21:53:36.51
ハゲを使えって話とは違うの?

980 :デフォルトの名無しさん:2012/11/28(水) 22:15:20.04
>>979
ハゲは死ぬべき

981 :デフォルトの名無しさん:2012/11/28(水) 22:16:13.40
禿には禿にしかできない仕事がある
http://labaq.com/archives/51770648.html

982 :デフォルトの名無しさん:2012/11/28(水) 22:27:51.88


983 :デフォルトの名無しさん:2012/11/28(水) 22:32:04.91
>>964
そんな巨大な配列は外部ファイルにして
動的に読み出すのが普通

984 :デフォルトの名無しさん:2012/11/28(水) 22:50:39.13
にしてもhoge使う奴には知能の低い奴しかいないな
知識不足とか経験不足とかそういうレベルじゃない
根本的に知能の低い奴しかいない

>>959も例外じゃなかった

985 :デフォルトの名無しさん:2012/11/28(水) 22:58:06.59
>>983が言いたいことを言ってくれた

そろそろ次スレ立てるべきかね?

986 :デフォルトの名無しさん:2012/11/28(水) 23:02:16.78
hoge huga piyo全部禁止にしてくれ。
毎回毎回荒れてかなわん。

987 :デフォルトの名無しさん:2012/11/28(水) 23:10:27.84
>>986
メタ変数はfooとかbarとかを使えという掲示なのだよ……

988 :デフォルトの名無しさん:2012/11/28(水) 23:12:00.11
>>983
組み込み系だとそうもいかないときもあるけどね

989 :デフォルトの名無しさん:2012/11/28(水) 23:13:48.36
アンチhoge厨共は一応英語は分かってるみたいだなwhugeに食い付くだろうと思って見てたけど食い付かなかったw

990 :デフォルトの名無しさん:2012/11/28(水) 23:34:27.60
template<class hage> hoge{
...
}

991 :デフォルトの名無しさん:2012/11/29(木) 00:28:44.55
>>988
でも4*5948375≒23Mバイトも使える組み込みって……

992 :デフォルトの名無しさん:2012/11/29(木) 00:30:00.46
>>991
そもそもファイルという概念がない事もある

993 :デフォルトの名無しさん:2012/11/29(木) 00:35:14.07
>>992
そーなのかー

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

994 :デフォルトの名無しさん:2012/11/29(木) 01:30:44.46
ある一線越えてRAMが別チップになるとギガビット単位になるからね

995 :デフォルトの名無しさん:2012/11/29(木) 02:46:56.33
hugearreyがなんなのかきになるわ

996 :デフォルトの名無しさん:2012/11/29(木) 04:04:02.35
またhoge厨が沸いてたのか
ほんと糞だな

997 :デフォルトの名無しさん:2012/11/29(木) 06:50:45.96
まだ埋まってなかったのか

998 :デフォルトの名無しさん:2012/11/29(木) 06:53:22.23
hogeに過敏に反応してるのがいるけど、禿なのか日本が大嫌いな隣の国の人なのかどっちなんだろうな
禿の人はそこまで心狭くないと思うけど

999 :デフォルトの名無しさん: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⌒) ./| _ノ  __ノ

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

235 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)