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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

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

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2008/07/06(日) 02:30:47
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
3デフォルトの名無しさん:2008/07/06(日) 02:31:13
1乙
4デフォルトの名無しさん:2008/07/06(日) 02:32:27
 テスト
5デフォルトの名無しさん:2008/07/06(日) 05:29:24
前スレ999はツンデレ
6デフォルトの名無しさん:2008/07/06(日) 11:01:54
C++の仮想関数についてです

これって派生先でオーバーライドするなら
とりあえず派生元にvirtual書いてしまってておk?

書いてて弊害起きるのかな?
7デフォルトの名無しさん:2008/07/06(日) 11:05:49
むしろ派生元にvirtual書かないといけません。
8デフォルトの名無しさん:2008/07/06(日) 11:09:00
いつも当たり前のように書いてたけど、むしろ書かないとどうなるんだ?
9デフォルトの名無しさん:2008/07/06(日) 11:15:06
オーバーライドと仮想関数は抱き合わせ商品なんですか。thx


でも、仮想関数とオーバーライドの説明を
別個で説明してるケースが多いのなんでだろ
10デフォルトの名無しさん:2008/07/06(日) 11:15:40
>>8
struct A{
  void f(){ std::cout << "A::f" << std::endl; }
};
struct B : A {
  char* p;
  B(){
    p=new char[100];
    std::cout << "new p" << std::endl;
  }
  ~B(){
    delete[] p;
    std::cout << "delete p" << std::endl;
  }
  void f(){ std::cout << "B::f" << std::endl; }
};
void test(){
  A* a = new B();
  a->f();
  delete a;
}
--出力--
new p
A::f
※ pはdelete[]されない
11デフォルトの名無しさん:2008/07/06(日) 11:19:04
某C#ではオーバーライドと隠蔽をこれでもかってくらい区別してる
それは置いといて継承先にvertualをつけるかつけないか議論になってたことがあるな
1210:2008/07/06(日) 11:20:42
ちょっと訂正。Bにvirtual付いてなかった。

struct B : A {
  virtual ~B(){...
  virtual void f(){...
  ...
};

出力結果は同じ。
13デフォルトの名無しさん:2008/07/06(日) 11:21:30
あー、なるほど
インスタンスはBでも、Aとして振舞うのか
デストラクタが呼ばれないのは、よくわからんが
14デフォルトの名無しさん:2008/07/06(日) 11:23:28
>>11
C#やJavaなどでオーバーライドだと明示するようになってきてるから、
明示した方が良い、という流れなんだろうね。言語設計者達の中では。
15デフォルトの名無しさん:2008/07/06(日) 11:26:30
>>13
(A*)new Bとして使う場合は、
Aのデストラクタと仮想化したい関数にvirtualを付けておく必要がある。
デストラクタもオーバーライドしないとまずいってこと。
16デフォルトの名無しさん:2008/07/06(日) 11:58:23
本来ディフォルトで virtual にした方が安全なんだけど
C との互換性が崩れるのでできなかった。

個人的には、struct と class をもっと別のものとして
定義すべきだったと思う。
17デフォルトの名無しさん:2008/07/06(日) 12:01:43
virtual宣言すると、クラスサイズが増えるぞ
18デフォルトの名無しさん:2008/07/06(日) 12:26:13
遅くなるしな。『安全、便利』は効率を犠牲にしない限りなるべく
やりましょうってのがC++のスタンス。

virtual書かなかったときのコンパイル後のイメージが浮かばん奴は
仕事でC++使うべきじゃない。っていうか意味分からないのにvirtual
書くなよ…

あ、遅くなるっていうのに対して、今時のCPUなら問題ないとかいう
レスはいらないから。
19デフォルトの名無しさん:2008/07/06(日) 12:28:24
>>『安全、便利』は効率を犠牲にしない限りなるべく
やりましょうってのがC++のスタンス。
言いたいことは分かるが、「『安全、便利』は効率を犠牲にする場合はやらない」と書くべきでは。
20デフォルトの名無しさん:2008/07/06(日) 12:29:40
サイズが増えるとか遅くなるって言ってる奴は、ちょっと
頭おかしくないか?

同様のことしようとしたら C でも、似たようなもんだろ。
21デフォルトの名無しさん:2008/07/06(日) 12:32:01
いや・・・何振り構わずvirtual付けるバカの話だろ
必要なら付けろよ
22デフォルトの名無しさん:2008/07/06(日) 12:36:52
>>19
>犠牲にする場合はやらない
そこまで強くないっしょ。軽微な効率ダウンと引き換えに
RTTIや例外は導入されたからね(そんなニュアンスのことが
ARMかD&Eにあった気がする)

>>20
>頭おかしくないか?
そこまで言われる筋合い無い。サイズ増えて遅くなる理由が
わかってるなら問題ないことだし。
23デフォルトの名無しさん:2008/07/06(日) 16:02:25
構造体がよくわからない、構造体勉強するのにいい本ない?
24デフォルトの名無しさん:2008/07/06(日) 16:06:22
>>23
複数の変数がセットになっただけだよ
25デフォルトの名無しさん:2008/07/06(日) 16:18:12
>>24
箱をしまう箱っていうのはわかるんだけど、その中で関数書いたり
引数なしでおkのくせに、構造体で宣言されてる中の変数は使えるとかがいみぷーなんです。
26デフォルトの名無しさん:2008/07/06(日) 16:19:49
int型という名前の小皿があるとしたら、それを乗せる御盆が構造体とか
ん〜・・・どうやれば理解できるのか
27デフォルトの名無しさん:2008/07/06(日) 16:22:14
Cでも構造体に関数って作れるんだっけか?
28デフォルトの名無しさん:2008/07/06(日) 16:23:49
Cの構造体はただの器
29デフォルトの名無しさん:2008/07/06(日) 16:24:05
ああ、すいませんC++の話です。
Cより新しいならC++のがよくね?ってC++の勉強してたら構造体単体なら分かりますが
構造体内で関数とかがいみぷーで。
30デフォルトの名無しさん:2008/07/06(日) 16:24:51
C++ならクラスを勉強したほうが良さそうよ
31デフォルトの名無しさん:2008/07/06(日) 16:29:42
>>28
なのか
C++から入ったから細かいことはよく知らんのだ 情報thx

>>29
基本的に構造体とクラスってあんまり変わらないよ
実装的な違いでは、デフォルトのアクセス指定子がpublicなのかprivateなのかぐらいしか無いらしい
意味的な違いでは、構造体はデータ中心でクラスは関数中心として使うといい
32デフォルトの名無しさん:2008/07/06(日) 16:30:14
構造体やクラス内・・・いわゆるメンバ関数は、自分自身のメンバ変数を操作するためにあると思っとけばいい

たとえば、エレベータというクラスがあるとして、メンバ変数に階数があるとしたら、
アップというメンバ関数でメンバ変数が変動するとか
33デフォルトの名無しさん:2008/07/06(日) 16:33:09
俺は、メンバ変数がパブリックにしたい場合は構造体
完全に隠ぺいしたい場合はクラスにするって感じかな

Getter/Setterを定義するのが無駄なくらい小規模なら、まず構造体
34デフォルトの名無しさん:2008/07/06(日) 16:46:45
>>25
  struct A {
    int n;
    A() { n = 0; }
    void func(){ n += 10; }
  };
  void test(){
    A a;
    a.func();
  }
これはつまり
  struct A {
    int n;
  }
  void A_ctor(A* this) { this->n = 0; };
  void A_func(A* this) { this->n += 10; };
  void test(){
    A a;
    A_ctor(&a);
    A_func(&a);
  }
ということ。
35デフォルトの名無しさん:2008/07/06(日) 17:21:37
>>34
そうする過程で関数中心の時は必要だったものがデータ中心になると
関数中心とは別な考え方しなくてはいけないわけで、データ中心の考え方というのがわからない
36デフォルトの名無しさん:2008/07/06(日) 17:30:59
>>35
何言ってるか分からない・・・w
仮想関数など使わない限り、別な考え方とか要らないと思うけど。
構造化プログラミングとオブジェクト指向プログラミングの話?
37デフォルトの名無しさん:2008/07/06(日) 17:47:26
this-> を表記するかしないかって完全に好みですか?
VC++だとコードの候補が出てきて楽なんですが
込み入ったところだとごちゃっとした感じになってしまって
もちろんなるべく見やすく書くように気を付けているんですが
どうしたモノかと迷ってて。
38デフォルトの名無しさん:2008/07/06(日) 17:53:30
>>35
別に全ての関数を構造体に入れないといけないってわけじゃないよ
39デフォルトの名無しさん:2008/07/06(日) 18:20:27
>>37
メンバ変数とかには基本m_ とか付けてる
けど何が一番良いのかは知らない
40デフォルトの名無しさん:2008/07/06(日) 18:22:50
OSがWindowsXPでコンパイラがBCCです。

コマンドプロンプト上に特定フォルダ配下の全テキストファイルを表示

ファイルを選択

ファイルを処理

という流れを作りたいのですが、
ファイル表示、ファイル選択は可能でしょうか? 可能なら、どうすれば実装できますか?
41デフォルトの名無しさん:2008/07/06(日) 18:24:41
>>40です
あ、言語はC++です。失礼しました。
42デフォルトの名無しさん:2008/07/06(日) 18:25:26
初心者だと、メンバ関数を「クラス(or構造体)の中に入った関数」と考えてしまって、
「関数が入ってる、ってどういうことだろう?」みたいな疑問に振り回されちゃうことが
あるかもしれないね。
43デフォルトの名無しさん:2008/07/06(日) 18:26:08
m_はいわゆるシステムハンガリアンだな
一般的に批判的な声が多いコードでもあるが、コンパイラ依存度や可読性を考えたら、ありだと思ってる
44デフォルトの名無しさん:2008/07/06(日) 18:26:57
>>40
BCCはファイル表示もファイル選択も不可能だった希ガス。
VC++6.0ならできますよ。
45デフォルトの名無しさん:2008/07/06(日) 18:29:39
>>40
方法1 コンソール系のAPIをいじって対話型に選べるようにする。
方法2 ファイルに番号をつけて一覧する。番号を入力させて選択に代える。これならスクロール型のI/Fで可能。

方法1はDOS時代にエスケープシーケンス使ってやってたなぁ〜
46デフォルトの名無しさん:2008/07/06(日) 18:32:23
this 使うとメンバ変数だけじゃなくてメンバ関数も候補に挙がるから
m_ だとメンバ変数だけに絞れて良いかなって個人的に思っては居るんだが
そういう話って良い悪いじゃなくて、一貫したコーディングスタイルであるか?
が問題な事が多い気がするし正解なんてないよね
47デフォルトの名無しさん:2008/07/06(日) 18:32:59
text vram直書きだったなw
48デフォルトの名無しさん:2008/07/06(日) 18:38:25
なるほど、色々参考になります。
m_ ですがシステムハンガリアンが型のプリフィクスを多く使うのに対して
クラス内、外を区別できるので個人的にはアプリケーションハンガリアン寄りかなと
思っているのですが、これはちょっと自分に誤解があるのでしょうか。
49デフォルトの名無しさん:2008/07/06(日) 18:41:04
>>37
この辺は好みが別れるから一貫性が保ててればいいと思うよ。
個人的には
全部に this-> は冗長っぽい
m_val や val_ は悪くはないが、publicなフィールドにはちょっと
  _val やってたらちょっとこい(笑
50デフォルトの名無しさん:2008/07/06(日) 18:45:23
>>44-45
ありがとうございました。方法1を調べてみます。
ヴィジュアル系の環境、さっぱりわからんので、方法1が向いてそうです。
51デフォルトの名無しさん:2008/07/06(日) 18:46:11
う、カーソル位置を保存しておく変数に Cursor_pos て名前は駄目でしょうか
52デフォルトの名無しさん:2008/07/06(日) 18:46:30
ちなみにグローバル関数には頭に::付ける派
Win32の場合だけど
53デフォルトの名無しさん:2008/07/06(日) 18:46:43
>>49
C#だと_valやってます、さーせんw
54デフォルトの名無しさん:2008/07/06(日) 18:47:55
さすがに変数の頭文字が大文字なのは引っかかるなw


プレフィックスがCursorってことか?
カーソル位置と言っても、絶対座標と相対座標と色々あるし、しっかり設計してから決めた方がいいぞ
55デフォルトの名無しさん:2008/07/06(日) 18:51:39
アプリケーションウィンドウに対する位置なので
相対座標でしょうか(意識したことがないので)
名前の付け方でいつも四苦八苦なのも思い出しました…
56デフォルトの名無しさん:2008/07/06(日) 20:45:02
C++でのエラー処理はintの返り血を
返すような設計にするべきなんでしょうか?
それとも全部例外処理で実装するべきなんでしょうか
57デフォルトの名無しさん:2008/07/06(日) 21:00:24
googleは例外を使わない方針だそうだ。
コンストラクタで実行時エラーが起きたらどうしてるんだろうか。
58デフォルトの名無しさん:2008/07/06(日) 21:13:40
実行時エラーの時どうやって回避してるんだろう
59デフォルトの名無しさん:2008/07/06(日) 21:15:59
・new_handlerかなんか
・newをオーバーロードしてるか
・コンストラクタで実行時エラー起きるようなことしない
・そもそもメモリ不足とかは無いものとして組む
60デフォルトの名無しさん:2008/07/06(日) 22:26:13
コンストラクタが「bool& result」って出力パラメータがあるとか、
すべてのクラスの基底になってるクラスに、
「newされたかどうか」って示すフィールドがあるとか。

....めっさ素人ぃな発想で住まん。
61デフォルトの名無しさん:2008/07/06(日) 22:53:52
std::nothrowでいいだろ。阿呆かw
62デフォルトの名無しさん:2008/07/06(日) 23:00:31
http://www.henshi.net/k/hiki.cgi?GoogleCppStyleGuide

コレ読めばいいのかな?日本語訳ちょっとへんなとこあるけど
63デフォルトの名無しさん:2008/07/06(日) 23:38:37
結構以外だった。C++ではなくベターCとして使ってる印象だな。
64デフォルトの名無しさん:2008/07/07(月) 11:05:37
C++について質問です

HANDLE HogeFile = ::CreateFile();

このダブルコロンの意味を教えてください。
65デフォルトの名無しさん:2008/07/07(月) 11:09:21
:: はスコープ演算子
この場合どの名前空間にも属してない = グローバル空間に属してると考えると良いと思う
66デフォルトの名無しさん:2008/07/07(月) 11:17:48
>>65
ありがとうございます!残りは自分で調べます!
67デフォルトの名無しさん:2008/07/07(月) 11:36:33
>>37
全部に this-> つけないと一貫性がない気がするんですが。。。

ところでthis->で区別できるからといって
メンバ変数とローカル変数を同じネーミング規則にするのは危険だと思う。
他人が保守したときにバグになりそうなので。
(this->をつけるのを強制できないしね)

68デフォルトの名無しさん:2008/07/07(月) 11:37:10
C++で(他の言語もそうなのかも知れないんですが)
先ほど全角スペースによるコンパイルエラーというものを知りました。

調べてる時に思ったんですが
全角 × 半角 ○ インデント・・・?
インデントは使っても安全なのでしょうか?
それとも安全とわかりきっている半角スペースを使うべきなのでしょうか?
69デフォルトの名無しさん:2008/07/07(月) 11:39:49
インデントは字下げのことであって
それ自体が全角スペースだとか半角スペースだとかは無い
別にTabでインデントしても良い
70デフォルトの名無しさん:2008/07/07(月) 11:49:53
>>68
空白文字   : 半角スペース、TAB、改行
非空白文字 : 全角スペース 他

半角スペースかTABを使って下さい。
71デフォルトの名無しさん:2008/07/07(月) 12:34:01
>>69>>70
なるほど、文字としての種類というか、扱いが違うんですね。
ありがとうございました。
72デフォルトの名無しさん:2008/07/07(月) 14:11:06
>>71
>>2にある、全角スペースの話は、
こういう掲示板で他人に「みせる」ときに使ってね。という話

(果てしなく意味のないコードだけど気にしない(゚ε゚))

//半角スペース
if(true){
int hoge; //インデントしてます
}

//全角スペース
if(true){
  int hoge;    //インデントしてます
}

とまぁ、前者はスペース入れても掲示板の仕様で消されてしまい見にくくなる

全角半角の違いはアスキーコード(ASCII CODE)を調べるべし
その手の話はC言語の定番の練習問題でもある
73デフォルトの名無しさん:2008/07/07(月) 15:01:51
>>72
Cの定番というより、PCの基本じゃないか。
74デフォルトの名無しさん:2008/07/07(月) 17:13:50
>>72
詳しい解説ありがとうございます。

>>73
そうですね、ちょっと調べればわかる事でした、失礼しました
75デフォルトの名無しさん:2008/07/07(月) 17:23:15
> とまぁ、前者はスペース入れても掲示板の仕様で消されてしまい見にくくなる
これはまあPCの基本になるのかもしれないね。
HTMLにおける連続したスペースの扱いに関する知識。

> 全角半角の違いはアスキーコード(ASCII CODE)を調べるべし
けど、定番の練習問題がかかっているのはこっちでしょ
76デフォルトの名無しさん:2008/07/07(月) 18:23:34
自作クラスでDCを取るにはどうすればいいんですか?
おねがいします。

// MFCダイアログ
void CRS232C_TESTDlg::OnBnClickedstart(){
 CClientDC* pDC( this );
 AfxBeginThread( drawData::DrawThreadFunction, (LPVOID*)&pDC, THREAD_PRIORITY_HIGHEST );


// 自作クラス
class drawData : public CObject{
 static UINT __cdecl DrawThreadFunction( LPVOID pParam ){
  CClientDC* pDC( pParam ); //成功させたい場所
}}
77デフォルトの名無しさん:2008/07/07(月) 18:26:52
ウィンドウはあるの?
あるならGetDCすればいいし、無ければCreateDCするしかないかな。
CreateDCするにはどのデバイスのDCかの指定は要るけどね。
78デフォルトの名無しさん:2008/07/07(月) 18:28:45
ってもしかして pParam がCWndのポインタならキャストすればいい。
79デフォルトの名無しさん:2008/07/07(月) 18:50:05
ダイアログウィンドウあります。
基本クラスCObjectで作ったのに既定のコンストラクタがないと言われてしまいます
CWndはキャストできないと言われてしまいます

// MFCダイアログ
void CRS232C_TESTDlg::OnBnClickedstart(){
 AfxBeginThread( drawData::DrawThreadFunction, this, THREAD_PRIORITY_HIGHEST );


// 自作クラス
class drawData : public CObject{
 static UINT __cdecl DrawThreadFunction( LPVOID* pParam ){
  //CClientDC* pDC( (CWnd*)pParam );
  CClientDC* pDC;
  pDC = pParam->GetDC();
}}

80デフォルトの名無しさん:2008/07/07(月) 18:55:35
ありがとうございます!LPVOIDの*を取ったらコンパイルできました。
が、なにも起動しませんw
81デフォルトの名無しさん:2008/07/07(月) 19:38:03
template <class T> void WriteData(T data);
のような関数内で、dataのサイズを知りたいのですが、どうしたら良いのでしょうか。
sizeof(data)を行うと、明らかに正しくない値が返ってくるみたいなのですが、、、
82デフォルトの名無しさん:2008/07/07(月) 19:53:39
あ、すみません。動いていました。
なんだか手違いで動いてないように見えただけみたいですorz
83デフォルトの名無しさん:2008/07/07(月) 20:11:26
CWndとかCDCとかHDCとかHWNDとかって、
スレッドアフィニティがあった気がするけど
84デフォルトの名無しさん:2008/07/07(月) 21:49:36
!0
の値は必ず1であると保証されているのでしょうか。
中には0以外の値と書かれてますが。そういう場合もあるのでしょうか。
85デフォルトの名無しさん:2008/07/07(月) 21:50:42
>中には0以外の値と書かれてますが。
これは、中には「0以外の値」と説明しているところもあるという意味です。
86デフォルトの名無しさん:2008/07/07(月) 22:04:55
>>84
特に保証はされてない
87デフォルトの名無しさん:2008/07/07(月) 22:10:34
論理否定演算子!の結果はそのオペランドの値が0と比較して等しくない場合0とし、等しい場合1とする。
結果の型はintとする。式!Eは(0==E)と等価とする。

保障されてる
88デフォルトの名無しさん:2008/07/07(月) 22:35:36
ポインタ変数をconst宣言することは出来ますか?
89デフォルトの名無しさん:2008/07/07(月) 22:37:19
できます。
90デフォルトの名無しさん:2008/07/07(月) 22:41:53
ありがとうございます
91デフォルトの名無しさん:2008/07/07(月) 23:04:14
やり方とか聞かなくていいのかw
92デフォルトの名無しさん:2008/07/08(火) 00:10:34
Detected memory leaks!
ってどうやって解除すればいいんですか?
PC再起動するまで直らないんですけど
93デフォルトの名無しさん:2008/07/08(火) 00:16:28
Detected memory leaks!
94デフォルトの名無しさん:2008/07/08(火) 00:30:43
95デフォルトの名無しさん:2008/07/08(火) 01:48:58
deleteすればいいと思うよw
96デフォルトの名無しさん:2008/07/08(火) 04:45:12
やっとわかった
カスタムコントロールは配置するだけだとメモリリークする
97デフォルトの名無しさん:2008/07/08(火) 12:04:40
関数内でエラーが起きたときって
-1を返すべき?
それともNULL?


あとassertとperrorってどう違うの?

98デフォルトの名無しさん:2008/07/08(火) 12:18:45
gnome-terminalについて。

まずTESTって実行ファイルを作成したんだ
ただハローワールドが表示されるだけのプログラムなんだけど

gnome-terminalでもう一個ウインドウ立ち上げて引数に
実行ファイル名指定してるんだが新しいウインドウに
ハローワールドが表示されない。
どんな感じで実装したらいいのかな?
もしスレチならごめん
99デフォルトの名無しさん:2008/07/08(火) 12:19:25
>>97
> -1を返すべき?
> それともNULL?

ケースバイケース

> あとassertとperrorってどう違うの?

マニュアル読めばわかる。
読んで分からないのなら、どう分からないのか書け。
100デフォルトの名無しさん:2008/07/08(火) 12:22:33
>>97
boost::optional
101デフォルトの名無しさん:2008/07/08(火) 12:30:14
>>99
>ケースバイケース
とか分かってんだよ
慣例とか具体例とか使って教えてちょ

perroとassertは調べるわ
102デフォルトの名無しさん:2008/07/08(火) 12:33:40
どっちもあるから。
自分で決められないならママに聞け。
103デフォルトの名無しさん:2008/07/08(火) 12:39:59
>>101
それは今回の君の状況を具体的に書くのが先だよ。
104デフォルトの名無しさん:2008/07/08(火) 12:42:22
vs2005 のc++でWin32プロジェクトで作ったexeが
他所の環境だと動かないらしく、調べてみると
VC++2005 が入っていない環境では
VC++2005のランタイムが必要だとかいう記述などに行き着きました。

これはどんな状態にもかかわらず、そういうものなんでしょうか?
それとも、こちらのコンパイル時の設定などによってどうなかなったりするんでしょうか?
あるいは単純にVS2008買ってコンパイルすればOKとか・・・

よろしくお願いします。
105デフォルトの名無しさん:2008/07/08(火) 12:45:40
動かない、ではなく具体的な現象を書け。
エラーメッセージが出るのならコピペしろ。
考えられるのはデバッグビルド版を配布してるとか。
106デフォルトの名無しさん:2008/07/08(火) 12:49:27
>>104
ランタイムライブラリを「マルチスレッド DLL」ではなく「マルチスレッド」にする
107デフォルトの名無しさん:2008/07/08(火) 12:56:38
108デフォルトの名無しさん:2008/07/08(火) 13:16:57
>>105
基本的なことを忘れてました。すいません。

エラー:
このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。
詳細については、アプリケーションのイベント ログを参照してください。

そのログ:
Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50608.0" が見つかりませんでした。
詳細な診断を行うには sxstrace.exe を実行してください。

とかいうものです。

その後ですが、>>106さんに教えてもらったように
「マルチスレッド デバッグ (/MTd)」にしたら動いたようです。
(ただの「マルチスレッド」はリリースビルドしないとビルドできないのは、それで正しいんですよね?)

でもこれの意味ってなんなんでしょうか?
できるだけ噛み砕いて教えてもらえると助かります。
109108:2008/07/08(火) 13:32:25
あら、すいません。
>>107
に書いてありました。
なんとなく分かったような分からんような。
ちょっとお勉強してきます。ありがとうございました。
110デフォルトの名無しさん:2008/07/08(火) 13:32:39
>>108
スタティックリンクでぐぐれ
111デフォルトの名無しさん:2008/07/08(火) 17:38:12
クラスが角度を表すメンバ変数もっているのですが、
値が常に0から360度になるようにしたいのです
500度を代入したら140度が格納されるように
しかし、いちいちsetterを経由したくありません
C#だとプロパティでかのうですが、C++で同じようなことはできないでしょうか
112デフォルトの名無しさん:2008/07/08(火) 17:43:11
>>111
値を格納するときに、チェックしろよ。 x を入力したとき
x - 360 * {x/360}
{y}はyより小さい方のほうの整数に変換する
113デフォルトの名無しさん:2008/07/08(火) 17:45:57
整数なら、x %= 360 じゃだめか。
114デフォルトの名無しさん:2008/07/08(火) 18:01:32
VC++なら独自拡張で__declspec( property(〜))がある。
それか角度クラス作って演算子オーバーロードでなんとかするとか。
115デフォルトの名無しさん:2008/07/08(火) 18:05:01
型変換がうまくいかないので教えていただきたいのですが、
const double T = 12;
const int A = (int)T;
int B[A];
とすると、エラー:定数式が必要 と言われてしまいます。
Tはdoubleの必要があるので、これを変換する方法を教えてください。
116デフォルトの名無しさん:2008/07/08(火) 18:08:41
const int A = 12;
117デフォルトの名無しさん:2008/07/08(火) 18:10:53
const double T = 12;
const int A = (int)T;
int B[12];
118デフォルトの名無しさん:2008/07/08(火) 18:17:05
#define N (12)
const double T = N ;
int B[N] ;
119115:2008/07/08(火) 18:20:03
配列がいろいろなところにあり、値を変えるときにすべての場所を変更するのが大変なので
変数をひとつにしたいのですが・・・
>>116 さんのも、値の変更忘れが怖いので出来たら一元化したいです。
const double 型を const int 型に変換することは出来ないんですか?
120デフォルトの名無しさん:2008/07/08(火) 18:23:58
何でエラーが出てるか分かってるか?
121115:2008/07/08(火) 18:29:08
わかりません
122デフォルトの名無しさん:2008/07/08(火) 18:45:37
配列添え字には整数を使いましょう。
const int には整数の定数式を入れましょう。
ほぼ総てのプログラマーは部下から>>115のプログラムを見せられたら。転職を進めるでしょう。
123デフォルトの名無しさん:2008/07/08(火) 18:47:32
C99でおk
124デフォルトの名無しさん:2008/07/08(火) 19:10:26
>>105
知らないやつがしゃしゃり出てんじゃねーよ
125デフォルトの名無しさん:2008/07/08(火) 19:16:33
後から出てきて文句だけは一人前だな、おまえ
126デフォルトの名無しさん:2008/07/08(火) 19:23:51
>>115
変換なんて考えないで、>>118でいいんじゃね?
127デフォルトの名無しさん:2008/07/08(火) 19:40:14
解決はしたんですが
最初の文でうまく実行できない理由が分からないので、再度質問させてください。
A はなぜ整数の定数式ではないのですか?
整数でないのか、定数式でないのか・・・。いろいろ試しましたが分かりませんでした。
128デフォルトの名無しさん:2008/07/08(火) 19:41:04
コンパイル時定数ではありません。以上
129デフォルトの名無しさん:2008/07/08(火) 19:43:18
一言でconstってなんですか?
130デフォルトの名無しさん:2008/07/08(火) 19:43:57
131デフォルトの名無しさん:2008/07/08(火) 19:47:45
青春?
132デフォルトの名無しさん:2008/07/08(火) 19:48:52
>>127
まずどう解決したのかを書くと良いよ。
133デフォルトの名無しさん:2008/07/08(火) 19:51:30
今からCを勉強したいでちゅので図書館行ったんですけど、最新バージョンのC99準拠の入門書を探したが、
まったく見つからないわけだが。Cはどうしたの?死ぬの?
134デフォルトの名無しさん:2008/07/08(火) 19:54:09
c++てやつ
135デフォルトの名無しさん:2008/07/08(火) 20:13:57
>>128
いつ定数になるんですか?
>>129
変数を定数にする修飾子だと認識してます。
const double T=12;
const int A = (int)T;
// int B[A];
で実行したらエラーはでない = Aは定数の整数と定義(?)されいる
のに、なぜAを配列の添え字に使えないのかが分かりません・・・。
>>131
プログラムを見直したらTがdoubleである必要が無かったのでintにして解決しました。
13684:2008/07/08(火) 20:14:57
>>86-87
遅くなりました。ありがとうございます。
137デフォルトの名無しさん:2008/07/08(火) 20:37:06
>>102,103
具体例を書けば教えてくれるなら
何かしらのルールがあるわけでしょ?

その指針を教えてください,と。

あと具体例はないんです
常々関数作ってるときに思ってる疑問なんです
138デフォルトの名無しさん:2008/07/08(火) 20:53:20
このスレ笑えるわ
139デフォルトの名無しさん:2008/07/08(火) 20:53:49
>>137
CやC++で無効ポインタはNULLとか0だけ。
これ以外の値は「有効なポインタ」と区別がつかない。
だからポインタを返す関数は、失敗時に-1を返すことはあり得ない。

エラーコードを返す種類の関数で、
失敗したときに-1を返すべきか0(NULL)を返すべきかだと、-1のほうがいいことが多い。
なぜなら関数の成功を0で表す場合が多いから(=成功の状態は一つしか無いことが多い)
エラーはエラーの種類によって0以外のいろんな値を使うことが多い。
でも、関数によっては成功時に非0を返した方がいいかもしれない。
条件式では「真」として評価されるから。
この辺はほんとうにケースバイケース。
140デフォルトの名無しさん:2008/07/08(火) 20:59:18
typedef struct{
int a;
int b;
}DATA;

という構造体を定義しmain関数で DATA hogeと宣言します

これを関数に渡して処理したいんですがどうかけばいいですか

int func(DATA hoge){

}
だとエラーになります・・・


141デフォルトの名無しさん:2008/07/08(火) 20:59:28
>>137
Cなら成功時に0を返す
C++ならboolを返せば悩まなくてすむぞ
142デフォルトの名無しさん:2008/07/08(火) 21:03:05
>>140
それでエラーが出ませんが
どのような書き方でどのようなエラーが出てるんでしょうか?
143デフォルトの名無しさん:2008/07/08(火) 21:03:37
>>140
一見問題なさそうだよ
144デフォルトの名無しさん:2008/07/08(火) 21:05:18
>>142
'func : 関数に 1 個の引数を指定できません。

とでます。

構造体の宣言の時にDATA *hoge;
ってなってました。

これは他人が書いた部分でSound hoge;ってできません
145デフォルトの名無しさん:2008/07/08(火) 21:06:42
hogehoge##className

とかってなんなの?
define文とかで出てくるんだけど。
先にhogehogeとclassNameのdefineを解釈して
その後に単語として連結するって意味?
VC++なんだけど
146デフォルトの名無しさん:2008/07/08(火) 21:08:31
>>144
何歳?
147デフォルトの名無しさん:2008/07/08(火) 21:10:22
>>146
18歳です
148デフォルトの名無しさん:2008/07/08(火) 21:10:47
>>144
typedef struct{
  int a;
  int b;
} DATA;

int func(DATA *hoge);

int main()
{
  DATA *hoge;
  func(hoge);
  return 0;
}

int func(DATA *hoge)
{
  return 0;
}

これで通るよ
149144:2008/07/08(火) 21:11:14
これは他人が書いた部分でDATA hoge;ってできません

に訂正します
150144:2008/07/08(火) 21:13:01
できました。

プロトタイプ宣言のところを書き換えるの忘れてたせいでした。。。
すいません
151デフォルトの名無しさん:2008/07/08(火) 21:13:38
大体分かったけど日本語何とかした方がいい
152デフォルトの名無しさん:2008/07/08(火) 21:14:54
わかったのか。おめでとう
153144:2008/07/08(火) 21:25:08
>>151
すいません。ちゃんと書くようにします

>>152
わかりました。ありがとうございました
154デフォルトの名無しさん:2008/07/08(火) 22:06:40
センター試験英語リスニング


    ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´∀`)/<先生!!なぜか僕には理解できない外国語が流れます!
 _ / /   /   \      故障ではないですか?
\⊂ノ ̄ ̄ ̄ ̄\  \_______________
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄|| 
    .||          || 
155デフォルトの名無しさん:2008/07/09(水) 00:27:17
>>145
##は単に連結する
156デフォルトの名無しさん:2008/07/09(水) 00:33:52
>>145
空白無しでくっつけると覚えておけばいいと思う。文字の置き換えするだけだし。

#define a(x) x ## f
#define b(x) a(x)(#x)
b(print);

printf("print");
157デフォルトの名無しさん:2008/07/09(水) 00:34:09
単純にソースコード情報文字を連結すると思えばいい
文字列ではなく
158デフォルトの名無しさん:2008/07/09(水) 01:20:36
bccでnewの例外がキャッチできません。どうなってるの?
159デフォルトの名無しさん:2008/07/09(水) 01:41:52
再現する最小のコードを張ってごらん。
160デフォルトの名無しさん:2008/07/09(水) 01:42:25
仮想関数について勉強していて思ったのですが、
virtualと付けてもオーバーライドしなければそのまま使えるのであれば
関数にはとりあえずvirtualと付けておけば良くないですか?
161デフォルトの名無しさん:2008/07/09(水) 01:42:58
よくない
162デフォルトの名無しさん:2008/07/09(水) 01:48:27
本当に必要な関数だけにしとけ
誤解を招くことあるし、パフォーマンスも落ちる
163デフォルトの名無しさん:2008/07/09(水) 01:59:37
どうしてですか?名前が被らないように少し気をつければいいだけではないでしょうか。
パフォーマンスの低下以外に何か大きなデメリットはあるのですか?
164デフォルトの名無しさん:2008/07/09(水) 02:01:57
#include <iostream>
#include <new.h>

class test{
int *array;
public:
test(int x);
~test(){delete [] array;};
};
test::test(int x = 1){
try{
array = new int[x];
}catch(bad_alloc&){
std::cout << "bad_alloc" << std::endl;
abort();
}
};
int main(){
test *a;
while(1) a = new test;
return 0;
}
// 実行結果
//
// Abnormal program termination
//
165デフォルトの名無しさん:2008/07/09(水) 02:03:37
#include <iostream>
#include <new.h>
int main(){
int *array;
while(1){
try{
array = new int[10000];
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
}
return 0;
}

// 実行結果
// bad_alloc!!!
//
// Abnormal program termination
//

こっちだとうまくいくんだが・・・
166デフォルトの名無しさん:2008/07/09(水) 02:03:56
一番大きなデメリットを教えよう。
そのプログラムを、ちゃんとしたプログラマーに見せたら。
「君、もう帰っていいよ」 と言われて。
君がダメプログラマーであるレッテルを貼られる。
167デフォルトの名無しさん:2008/07/09(水) 02:06:55
>>160
> 関数にはとりあえずvirtualと付け

「とりあえず」が非常にまずい
168デフォルトの名無しさん:2008/07/09(水) 02:07:00
>>166>>163
追加で、何も言われなかったら陰で笑われるを追加。
169デフォルトの名無しさん:2008/07/09(水) 02:08:32
なぜそう思われるのかが分からないから質問してるんじゃないの?
ちゃんと教えてあげてよ。
俺C++わからんから答えられないけど、そのレスはかわいそうだわ
170デフォルトの名無しさん:2008/07/09(水) 02:17:36
メンバメソッドはデフォルトで仮想関数なD言語でも使ってればいいよ。
171デフォルトの名無しさん:2008/07/09(水) 02:23:22
>>169
知りたければ、ネットでも本でも読めばいい。ここは教育を行う場ではない。
調べて分からなければ、そのわからないところを聞くべきと思われ。
ついでに自演乙。
172デフォルトの名無しさん:2008/07/09(水) 02:24:21
>>170
そのような言語があるということは、
仮想関数がデフォルトであることに致命的なデメリットは無いということですね?
ならば何が「ダメ」で「まずい」んでしょうか?その方が便利だと思うのですが。
173デフォルトの名無しさん:2008/07/09(水) 02:25:28
>>171
答えられないからってその逃げはないわ
174デフォルトの名無しさん:2008/07/09(水) 02:37:39
俺は実際に仕事でやってるわけでもないし、チームでやったこともないから想像だけど
全部virtualにする危険性はなんとなく想像できる
つまり公衆の面前で全裸はマズイということだ
175デフォルトの名無しさん:2008/07/09(水) 02:41:48
>>160
俺はPHPのOOPしかまともにやった事がないと事前に言い訳させといてね

C++ってvirtual付けてないと親クラスのメソッドとして実行されちゃうと思うんだけど、
それだと、継承先の子クラスの方で「あれ?オーバライドしたのに親クラスの動作に
なるぞ?」ってなるんじゃない?

たとえば、親クラスで以下のメソッドがあるとする
・Hoge::testMethod() { cout << "親クラスですよ"; }

で、これを子クラスのほうでオーバライドする
・Foo::testMethod() { cout << "子クラスですよ"; }

これで、子クラスのインスタンス作ってtestMethodを実行したら実行結果が、親クラスですよ
っていう結果になってしまうのだよ!
※ Foo* fooInstance = new Foo();でインスタンスを作った場合

ただし、Fooインスタンスを作る場合に、上の例みたいに参照先を設定するんじゃなくて、
Foo fooInstane
見たいな作り方すれば意図した動作をするみたい(子クラスですよが表示される)

ただ、インスタンスの作り方なんて人が変われば異なってくる可能性があるから、オーバライドするなら
virtual付けといた方がいいと思う。


多分間違ってないと思うけど参考程度に・・・
176デフォルトの名無しさん:2008/07/09(水) 02:48:12
>>163
大きいデメリットかどうかは状況によるけど、
あまり良くはない。

・デフォルトで非仮想なC++では、virtualが付いていると
オーバーライドして欲しいというセマンティクスが強くなる。
そのため、逆に本当にオーバーライドすべきものが分かり辛くなる。

・通常、継承よりコンポジションの方が良い。
オーバーライドは、元のクラスの実装を知っている必要があることが比較的多く、
より依存性が大きくなる。

・仮想化のためにvptrというのが付加され、
インスタンスのサイズも増える。

・本当に多様が必要な場合はともかく、単に機能を追加する場合は、
バイナリのサイズとのトレードオフはあるものの、
テンプレートでの拡張の方が良いことが多い。
こちらの方がコンパイラの最適化がよりよく働く。

>>167
何が非常にまずいんだ?

>>166, >>168
キメェレスだな
177175:2008/07/09(水) 02:48:18
あ、これだとただ単にvirtualの説明で、>>160の質問に答えられてないな・・・すまんこ

よく考えるとJavaとかPHPの親クラスには原則virtualがついてるような物かもしれんね。

ちなみに>>163の名前が被らない様に気をつけて〜という部分なんだけど、この部分に
関しては仕事では宜しくないと思う。気をつけててもやっちゃう事が可能性としてある訳
だから理想としてはそもそも出来ないようにしておくべきだね。

個人とかある程度見通しの良い規模なら全然問題ないと思うけど。
178デフォルトの名無しさん:2008/07/09(水) 02:56:13
>>175
いやいや、それは子クラスのほうが呼ばれるだろう。
179デフォルトの名無しさん:2008/07/09(水) 02:58:51
>>176-177
つまり、「何でもかんでも付けるのが悪い」ではなく、「必要なものにだけ付けた方が良い」ということですね。
やっと納得しました。ありがとうございます。
180デフォルトの名無しさん:2008/07/09(水) 03:03:08
ボクが(基本クラス)これから作る作業内容
後(継承先のクラス)で内容が変えられちゃうかも知れないけど
どんなことをするのか仮組み(仮想関数)しておくね。
でも、弄る時はちゃんと読んで(コンストラクタして)から弄ってね。

みんな、ボクの手順に従うなら覚えるまで時間掛かるけど、
覚えちゃえば直ぐ作業にかかれるからね。
もし、君が仮組みを使って好きな様に弄りたいならちゃんと自分で考えてね。
やることが増えちゃうけど、自分好みにできるよ。

こんなかんじ?
181デフォルトの名無しさん:2008/07/09(水) 03:03:57
>>178
本当だ!
ということは、親クラスのインスタンスを生成してtestMethodを実行しても、virtualが付いてて子クラスで
オーバライドされてると、親クラスのインスタンスでメソッド実行してもオーバライドされてる子クラス側の
メソッドが動いちゃうんだ!

ということは、virtualの動作で気をつけるのは子クラスじゃなくて親クラスの方か?
182デフォルトの名無しさん:2008/07/09(水) 03:21:55
phpの標準がC++のvirtualで
phpのfinalがC++の標準で
phpのabstractがC++の純粋仮想関数
ってことかしら
183デフォルトの名無しさん:2008/07/09(水) 03:26:00
>>181
親クラスのインスタンスなら親クラスのメソッドが動くだろ。
親クラスっぽいけど実は子クラスの時に仮想関数の仕組みが動くんだよ。
#include <iostream>
using namespace std;
class Parent {
public:
virtual void Foo() { cout << "Parent::Foo()" << endl; }
};
class Child : public Parent {
public:
virtual void Foo() { cout << "Child::Foo()" << endl; }
};

int main() {
Parent p; p.Foo();
Child c; c.Foo();
Parent * pp = &c; pp->Foo();
return 0;
}

--output--
Parent::Foo()
Child::Foo()
Child::Foo()
184デフォルトの名無しさん:2008/07/09(水) 03:27:42
>>181
お前は何を言っているんだ。
185デフォルトの名無しさん:2008/07/09(水) 08:30:29
>>176
かっこいい
186デフォルトの名無しさん:2008/07/09(水) 08:36:31
このスレ笑えるわ
187デフォルトの名無しさん:2008/07/09(水) 09:21:09
#include <iostream>
using namespace std;
class base1 {
base1();
~base1(){cout<<"base1"<<endl;
}
class obj1:public base1 {
obj1();
~obj(){cout<<"obj1"<<endl;
}
class base2 {
base2();
virtual ~base2(){cout<<"base2"<<endl;
}
class obj2:public base2 {
obj2();
~obj2(){cout<<"obj2"<<endl;
}

int main()
{
cout <<"非仮想"<<endl;
base1 *p1 = new obj1;
delete p1;
cout <<"仮想"<<endl;
base2 *p2 = new obj2;
delete p2;
return 0;
}
188デフォルトの名無しさん:2008/07/09(水) 09:29:35
↑仮想デストラクタ
↓仮想継承
#include <iostream>
using namespace std;
class base {
protected:
int val;
public:
int getval(){ return val;};
};
class obj1 : virtual public base{};
class obj2 : virtual public base{};
class obj3 : public obj2, obj3 {
public:
obj3(){ val=100; };
};
int main()
{
obj3 my;
cout << my.getval() << endl;
return 0;
}
189デフォルトの名無しさん:2008/07/09(水) 09:38:53
仮想継承まで引き合いに出す意味無いだろ。ポリモーフィズムの
使いどころも良く分かって無い人間が、近年の言語ではC++にしか
ない多重継承でのさらに仮想継承まで知る必要ねーよ。
190デフォルトの名無しさん:2008/07/09(水) 09:41:28
仮想関数として宣言すると、派生先で継承と
仮想関数のオーバーライドが出来るようになる。
このため、基本クラスの派生クラスでは、
実装内容だけが異なる、全く同じ形式の仮想関数を持つことが出来る。
これにより、基本クラスとその派生クラスでは、共通インターフェースを持つことが出来る。

>>187-188
標準C++言語辞典柏原正三(著) より抜粋簡略
という事らしい
191デフォルトの名無しさん:2008/07/09(水) 09:53:43
親クラスの参照を引数にとって そいつのメソッド動かす関数 a を作った
その関数に小クラスを渡した

関数 a は
 virtual 付きメソッドなら 小クラス側を実行し
 virtual 無しメソッドなら 親クラス側を実行する
192デフォルトの名無しさん:2008/07/09(水) 10:12:55
そんな動きするんだ。
C++ってなんかすげえね。勉強しよかなw
193デフォルトの名無しさん:2008/07/09(水) 10:21:27
Mac OS XでC&C++のプログラミングをし、それをWindows XPで実行したいと思っています。

1. Windowsで動かす際に、スクリプトをどのように変更すれば良いですか?
  それとも基本的な仕様から違いますか?
2. Windowsのコンパイラは持っていないのですが、手に入れるのは容易ですか?
3. Windowsで動かす際、exe(実行)ファイルにして誰でも扱えるようにすることは可能ですか?

よろしくお願いします
194デフォルトの名無しさん:2008/07/09(水) 10:26:13
1.スクリプトの問題ではない。 仕様違いのためほぼ無理。
クロスコンパイラーでもあれば別
2.容易
3.同じwindows環境であれば。
195デフォルトの名無しさん:2008/07/09(水) 10:28:12
迅速な回答ありがたうございます
仕様違うんですね……書き方が似てる程度でしたか
ちょっとWindowsのほうも勉強してみます
196デフォルトの名無しさん:2008/07/09(水) 10:31:25
>>192
C言語完璧にしてからのほうがいい。完璧ってのはどのくらいか?
というと
・コンパイル結果のアセンブラがどんなプロセッサでもなんとなく読めるようになること。
・C言語で色々やっていて「こういうところは言語が自動化してくれたら楽だなあ」とか思えるようになること。

C++は「こういうところは言語が自動化してくれたら…」をやってくれた言語なので、
つまずくことが減る。いきなりC++やっても上に何人もいるvirtualの使いどころが
分からない人間になるのが落ち。

挙動を言葉で知っていても、使いどころが分からないので、とりあえず
全部つけとけ、ということになる。

余談だが、Javaをいきなりやるのは有りだと思う。Javaは全部virtualだから。それが
どういうことか分かるだろ? いきなりやった人間が区別できないのは目に見えてる
から、機能的に無いと困るvirtualで統一したんだよ。
197デフォルトの名無しさん:2008/07/09(水) 10:32:00
ソースコードの仕様は言語によって決まってるだけだから別に変わらんよ。
スクリプトがソースコードをさしているのなら、OS固有のAPI使ってない限り、
その環境でコンパイルすれば動く
198デフォルトの名無しさん:2008/07/09(水) 10:34:07
>>196
C Perl PHP JavaScript C#あたりをやったことあって、C++の挙動がおもしろそうだなあと思っただけなんだけど
アセンブラ読めないと手をつけないと駄目ですか
199デフォルトの名無しさん:2008/07/09(水) 10:35:35
補足で、親クラスの参照からメソッドを呼び出すときに、親、子のどちらのものが呼ばれるかが
言語で決められているわけではなく、実装により変えられるところがおもしろそうだなあと思ったとこです。
200デフォルトの名無しさん:2008/07/09(水) 10:37:37
>>197
恐らくソースコードの事です。スクリプトだと意味が違ってしまうんですね…。
ありがとうございます、C言語にC++が少しだけ入ってる程度なんでちょっとWindowsでそのままコンパイルしてみます
201デフォルトの名無しさん:2008/07/09(水) 10:54:44
>>198
>C++の挙動がおもしろそうだなあ
これがもし、Cやってて「こうだったらいいのになあ」と思ったことに
結びついてるならC++やる資格あると思うよ。

アセンブラに関しては、概要を知っておけば、C++の挙動が
どうしてこうなるのか、というのが直接覗けるので、virtualを
全部つけとけばいい、みたいなことを考えなくて済むようになる。
202デフォルトの名無しさん:2008/07/09(水) 10:57:41
>>198-199
C#を知っててなぜそういう感想になるw

C#は親側でvirtual, 子側でoverrideを指定するとポリモーフィックになる
そうでなければメソッド呼び出しは静的に解決される
子側の指定も必要なのがC++よりキツいが、基本的に同じだろ
203デフォルトの名無しさん:2008/07/09(水) 10:59:42
>>199
>おもしろそうだなあ
面白いかどうかよりも、プログラムする上で必要かどうかじゃないか。

プログラムが趣味で言語オタクとしてそれを楽しむというなら、
本末転倒は承知の上でそれもアリだがな。
204デフォルトの名無しさん:2008/07/09(水) 11:00:50
>>202
ごめんwC#もっと勉強してから出直すwww
205デフォルトの名無しさん:2008/07/09(水) 11:03:16
>>202
便乗質問なんだけど、親のvirtual指定を子側でキャンセル(あえてoverrideしない)できるということ?
206デフォルトの名無しさん:2008/07/09(水) 11:04:58
>>203
俺はそうは思わない
BASICやCOBOLだけやってて、オブジェクト指向や関数型の言語に触れたことの無い人は
普通は言語に思考を規定されることになる
知的好奇心や向上心を失ったプログラマは、あっという間に老害化するだけだ

が、C++は勧めないな、俺は
207デフォルトの名無しさん:2008/07/09(水) 11:06:49
>>205
そういうことになるね
キャンセルというよりは

C#だと
親のvirtualは「オーバーライドしていいよ」
子のoverrideは「オーバーライドします」
ってことだな
C++的発想だと、virtualであると言った時点でvtbl作らないといかんわけだし
無駄に見えるけどな
208デフォルトの名無しさん:2008/07/09(水) 11:12:33
>>207
選択肢が増えるのがいいことなのか、親がvirtualしろといってるのに
しないってのはどうかと思うが。

まあC++の場合は親のポインタから呼び出すときでも、強制的に
静的に呼び出せるから、同じといっちゃあ同じだがね。vtblは
確かに無駄になる。
209デフォルトの名無しさん:2008/07/09(水) 11:22:01
>>196
何言ってんのお前。
低位の動作は隠蔽して、より使いやすくするために高級プログラミング言語が生まれたんだろ。
アセンブラやCを学んで悪いことは無いが、学ばなきゃいけない、なんてバカげてる。
そんなものはつまずいた時に初めて、関係あるところだけ目を通せばいいんだよ。
いや、それすら普通は必要ないだろうな。「C++の勉強」をしていれば、C++は使えるようになる。
virtualの件だって、最初は全部に付けてたっていいじゃないか。
それで何か問題が起きて初めて、これは変だと気付けばいいだけの話だろ。
最初から全て理解した上でなきゃ何もしてはならない、なんてのは最低の勉強方法だ。
210デフォルトの名無しさん:2008/07/09(水) 11:32:31
何事も好奇心ですよね
211デフォルトの名無しさん:2008/07/09(水) 11:33:28
>最初は全部に付けてたっていいじゃないか
他人への迷惑とかは考えないのか?
212デフォルトの名無しさん:2008/07/09(水) 11:34:20
Cなんかやらなくても、いきなりC++で平気だよ。

> いきなりC++やっても上に何人もいるvirtualの使いどころが
> 分からない人間になるのが落ち。
「C++をやる」っていうのは、C++を勉強し使えるようになることも含むのであって、
「virtualの使いどころが分からない」人間は、単に「ちゃんとC++をやってない人間」だよ。
「先にCをやっていないから」そうなるのではなく、「C++をちゃんと勉強していないから」そうなるだけ。
213デフォルトの名無しさん:2008/07/09(水) 11:34:39
>virtualの件だって、最初は全部に付けてたっていいじゃないか。
>それで何か問題が起きて初めて、これは変だと気付けばいいだけの話だろ。
そういう姿勢だったら問題は無かっただろう。
214デフォルトの名無しさん:2008/07/09(水) 11:37:29
ていうか、Cを先にやっておかないと全部virtual付けるようになる、っていうこと自体が、
いったいどこで仕入れてきたフォークロアなのかようわからんよね。
215デフォルトの名無しさん:2008/07/09(水) 11:38:25
>>211
まずそんな初心者に勝手に組ませて、いざ失敗されると「迷惑だ」と怒り出す方が頭おかしい
216デフォルトの名無しさん:2008/07/09(水) 11:40:09
>>215
おま…、一人だけで組んでるのか? 社会に出ろよ
217デフォルトの名無しさん:2008/07/09(水) 11:41:28
別にプログラミングで社会に出る必要はないと思う…
218デフォルトの名無しさん:2008/07/09(水) 11:41:54
そもそもなぜ全部にvirtualをつけようって発想になるんだろう?
そうすることが悪いとは言わない(後から学べばいいと思う方)けど、そうした方がよさそうに思う理由が知りたい
219デフォルトの名無しさん:2008/07/09(水) 11:43:17
集団における作業、という設定を強調するなら、そもそも全部にvirtual云々というのは
「新人にそういう乱暴な教え方をする奴っているよなぁ」みたいな問題であって、
他言語の経験とかそういう話とは違ってくるのでは。
220デフォルトの名無しさん:2008/07/09(水) 11:43:58
>>218
気が向いたらオーバーライドできるし、しなくても普通に使える。柔軟性アップじゃね?
221デフォルトの名無しさん:2008/07/09(水) 11:45:22
>柔軟性アップじゃね?
そのとき効率の犠牲が気にならないならC++じゃなくてもいい
222デフォルトの名無しさん:2008/07/09(水) 11:48:41
>>220
子クラスの同一名メソッドは、無条件にオーバーライドされる。
しなくても普通に使える訳ではない。
必ず違うメソッド名にする必要がある。正直迷惑。
223デフォルトの名無しさん:2008/07/09(水) 11:49:29
勉強で書いてるうちから効率のこと気にしてたら汚いコードしかかけなくなるw
224デフォルトの名無しさん:2008/07/09(水) 11:49:53
>>212
>「先にCをやっていないから」そうなるのではなく、「C++をちゃんと勉強していないから」そうなるだけ。
いややはりCを先にやっとけ。C/C++の関係なら時間もそんなに無駄にはならん。
他の言語やるまえにCやれってのとは事情が違う。
225デフォルトの名無しさん:2008/07/09(水) 11:53:56
>>221
趣味の場合は効率はあまり気にしないな

>>222
ん?virtualを付けないと、子クラスで定義しても親クラスの関数が使われちゃうんだろ?
つまり子クラスの定義が無駄になると。そんな状況に何の意味があるのさ。
226デフォルトの名無しさん:2008/07/09(水) 11:56:29
C++勉強しなおしたら?
227デフォルトの名無しさん:2008/07/09(水) 11:58:50
>>225
C++のプログラムしたことあるのか?
228デフォルトの名無しさん:2008/07/09(水) 12:05:21
>>225
おちつこ
229デフォルトの名無しさん:2008/07/09(水) 12:05:25
>>224
殆ど無駄にならんっていうか、無駄はそもそも無いのでは。
ごく少数の例外事項を除いて、C++の中にCはすっぽり入ってるわけだし。
この話はつまり、
「C++の(Cに対する)拡張部分を脇にのけて、残った部分からやるという分類行為に
"物凄く意識的になる"必要があるのだろうか?」
って話で、俺はそこまで必要とは思わない、って意見。
Cの存在を無視して、C++という一個の言語だけ見つめても、それを「基礎から」学んでいこうと思えば
序盤はまぁ大体がCにもある機能の話になる。自然に。
virtual以前に、クラスの作り方自体、どの本を見ても、Cの機能を一通りやったあと触れることになるし。
その「自然にそうなる程度の区分け」で十分ではないかと。
230デフォルトの名無しさん:2008/07/09(水) 12:18:38
>>225>>226>>227
ほらー、virtualつけたときのコンパイル後のイメージが分からないから
そういうことになるんだよ。

>>229
>「自然にそうなる程度の区分け」
それプラスやはりコンパイル後のイメージに興味持って欲しいね、俺は。

ポインタとメモリの関係が分からない人間にポインタ扱わせるのは危なっかしくて
しょうがないだろ。C++は全般的にそういう傾向があるとおもう。
231デフォルトの名無しさん:2008/07/09(水) 12:36:21
質問なんですがC言語で
任意の1〜9の数の全ての組み合わせを表示する、
例えば1〜3の組み合わせだと123、132、213、231、312、321と表示するプログラムの考え方を教えてください。
232デフォルトの名無しさん:2008/07/09(水) 12:43:52
>>231
プログラムが書ける上でその質問してるのか?
233デフォルトの名無しさん:2008/07/09(水) 12:47:25
>>231
for(i = 111111111; i <= 99999999; i++) {
if (i にゼロが含まれている) {
/* 何もしない */
} else if (i に同じ数字が2つ含まれている) {
/* 何もしない */
} else {
/* i を表示 */
}
}
234デフォルトの名無しさん:2008/07/09(水) 12:52:24
>>233
それ順列だろ。 >>231の文には矛盾が有る。
3行目は組合せと言いながら順列を出している。
235デフォルトの名無しさん:2008/07/09(水) 13:05:40
>>225の何がおかしいのかわからん。
お前ら批判する前にちゃんと理由を言えよ。
236デフォルトの名無しさん:2008/07/09(水) 13:34:29
virtualとオーバーライドをごっちゃにしてる奴がいるな。無関係じゃないが別物だぞ。
237デフォルトの名無しさん:2008/07/09(水) 13:54:48
virtualが付いて無い → オーバーライド禁止
デストラクタにすらvirtualが付いて無い → 継承禁止
が基本だと思ってたけど違うの?
238デフォルトの名無しさん:2008/07/09(水) 14:01:47
>>237
>virtualが付いて無い → オーバーライド禁止
単に派生クラス側で基底クラスのメソッドと同じ引数を持つメソッドを
定義することをオーバーライドといい、virtualがついているかどうか
は関係が無い。

>デストラクタにすらvirtualが付いて無い → 継承禁止
別に禁止されてるわけじゃない。そうした方がよけりゃ
そうするだけ。
239デフォルトの名無しさん:2008/07/09(水) 14:06:38
>>235
> virtualを付けないと(中略)子クラスの定義が無駄になる
この辺がおかしいのでは
240デフォルトの名無しさん:2008/07/09(水) 14:07:49
>>233
お答えありがとうございます。
俺の文章がわかりにくくてすいません。実装したいプログラムとちょっと違うけど、考え方は一緒だったのでわかりました。
241デフォルトの名無しさん:2008/07/09(水) 14:10:45
礼儀のなってない香具師の教育の場になりますた。
242デフォルトの名無しさん:2008/07/09(水) 14:13:55
お前が言うなw
243デフォルトの名無しさん:2008/07/09(水) 14:15:50
お子様相手に頑張ってる皆様にお礼_言いなさい!
244デフォルトの名無しさん:2008/07/09(水) 14:23:33
>>238
動作を上書きしなきゃオーバーライドにならない気がするんだが、
virtualつけなくてもできるのか?
245デフォルトの名無しさん:2008/07/09(水) 14:26:58
>>244
小クラスのインスタンスを小クラスのまま呼び出す場合 はちゃんとオーバーライドされてるじゃん
class Child cInstance;
cInstance.hogehoge();
246デフォルトの名無しさん:2008/07/09(水) 14:46:33
多態しないならvirtualいらない。
多態はしなくても継承・オーバーライドをすることはある。
247デフォルトの名無しさん:2008/07/09(水) 14:57:05
>>238 >>245
>単に派生クラス側で基底クラスのメソッドと
>同じ引数を持つメソッドを
>定義することをオーバーライドといい
それは「隠蔽」と言う。
以下で A::f2()からのf1()は、常にA::f1()が呼ばれる。

struct A{
   int f1(){return 10;}
   int f2(){return f1()*2;}
};
struct B : A{
   int f1(){return 100;}
};
void test(){
   B b;
   std::cout << b.f1() << ":" << b.f2() << std::endl;
}
--結果-----
100:20

>>デストラクタにすらvirtualが
>別に禁止されてるわけじゃない。
使い方によって、リソースリークの危険が大きくなるため
通常は継承不可と捉えるべき。
248デフォルトの名無しさん:2008/07/09(水) 15:15:17
>>247
struct A{ int f1(){return 10;} };
struct B : A { int f1(){return 100;} };
void test(){
 A a;
 B b;
 std::cout << a.f1() << ":" << b.f1() << std::endl;
}
--結果-----
10:100

こっちは オーバーライドって言わない?
249デフォルトの名無しさん:2008/07/09(水) 15:16:19
すみません質問です。

以下のコードを実行すると、
  ifstream fs;
  fs.open( "hogehoge", ios::in | ios::binary );
fs.is_open()がfalse、fs.rdstate()の結果が0x2(failbit)となります。

ifstreamがコケる原因は全く思いつかないのですが、他に何かありますでしょうか?
環境はWindowsXPSP3、VisualStudio2008Stdです。

いくつか検証してみたところ、下記の現象も見つけました。
・"hogehoge"は確実に存在する(boostのexists()でtrueが戻る)
・"hogehoge"は排他制御はかかっていない(手動でリネームも出来る)
・試しにfopen( "hogehoge", "r" )した結果、NULL以外の値が戻る(→成功している?)

どうかよろしくお願いします。
250デフォルトの名無しさん:2008/07/09(水) 15:19:01
一人だか二人だかは分からないけど
知っていて当たり前な前提で話したいならこっち

C++上級者が集まるスレ
http://pc11.2ch.net/test/read.cgi/tech/1095113801/
251デフォルトの名無しさん:2008/07/09(水) 15:21:23
>>248
こっちというか、それを説明したつもりだったんだけど、
それを隠蔽と呼ぶ。
252デフォルトの名無しさん:2008/07/09(水) 15:25:39
オーバーライド
関数名、仮引数の型と構成、戻り値の型が完全に一致しているもの

オーバーロード
仮引数の型と構成の異なる同じ名前の関数を多重定義すること
253251:2008/07/09(水) 15:35:11
ちなみにC#ではオーバーライド時にはoverride、
隠蔽時にはnewキーワードを指定する。

javaではインスタンスメソッドが全て仮想なので、
隠蔽となるのはstaticメソッドのみ。
254デフォルトの名無しさん:2008/07/09(水) 15:44:44
>>249
ファイル名が全角とかなんとか
255デフォルトの名無しさん:2008/07/09(水) 15:45:57
>>252
>オーバーライド
>関数名、仮引数の型と構成、戻り値の型が完全に一致しているもの
これによって基底の宣言が隠蔽されるのは当然だが、この条件に加え、
さらに基底の宣言にvirtualがないとオーバーライドとは言わないのか?
256デフォルトの名無しさん:2008/07/09(水) 15:46:55
failbit 回復可能な書式エラーまたは変換エラー
257デフォルトの名無しさん:2008/07/09(水) 15:52:53
>基底の宣言にvirtualがないとオーバーライドとは言わないのか?
言わないのではないかと勝手に補足する。yes

仮想関数のオーバーライド
基本クラスでvirtual指定した関数を派生先クラスで上書きし
関数名、仮引数の型と構成、戻り値の型が完全に一致させたもの
258デフォルトの名無しさん:2008/07/09(水) 15:57:03
基底の動作を上書き(オーバーライド)しないと
一致してるだけじゃ駄目だろ。一致してないと上書きできないけど。
259デフォルトの名無しさん:2008/07/09(水) 16:01:21
ちゃんと書いてあるだろ
260デフォルトの名無しさん:2008/07/09(水) 16:18:23
およ?ってことは、virtualが指定されていると、子クラスのインスタンスを使って
親で定義されているメソッドを呼び出すことは出来なくなるってこと?

本読むなり調べるなり手段はいくらでもあるけどせっかくなのでこちらで聞いてみますです。
261デフォルトの名無しさん:2008/07/09(水) 16:24:12
>>257
補足dクス

あと、>>252に戻り値の型が完全に一致とあるけど、
C++は共変性に対応してるので、
戻り値の型は同一でなくとも良い。

struct ValBase{};
struct ValDev : ValBase{};

struct A{
  virtual ~A(){}
  virtual ValBase* f1(){return (ValBase*)1;}
};
struct B : A{
  ValDev* f1(){return (ValDev*)2;}
};
void test(){
  A* a = new B();
  std::cout << a->f1() << std::endl;
  delete a;
}
--結果------
00000002
262デフォルトの名無しさん:2008/07/09(水) 16:34:12
>>260
一応、強引に呼ぶことは出来るけど。

std::cout << a->A::f1() << std::endl;
263デフォルトの名無しさん:2008/07/09(水) 16:48:12
>>261
正直俺にはよく分からないけど
それはValDevがラップされてValBaseと同じ型扱いをされてるんじゃ?
264デフォルトの名無しさん:2008/07/09(水) 17:02:49
>>262
ありがとうございました
265デフォルトの名無しさん:2008/07/09(水) 17:10:50
>>263
つまりはそういうこと。

オーバーライドの際に、
戻り値に、元より具体的な型を指定しても矛盾しない、
このオーバーライドを認めることを共変性といい、
引数に、元より抽象的な型を指定しても矛盾しない、
このオーバーライドを認めることを反変性という。

C++は反変性に対応してないけど。
266デフォルトの名無しさん:2008/07/09(水) 18:08:22
C++初心者です

エラーメッセージが出てきたんですが、エラー元のファイルを見つけられません・・・
環境はVista、VS2008です

エラーが起きたファイルのパス (まず、これがどこを指しているのかわかりません)
File : f: \dd\vctools\vc7libs\ship\atlmfc\src\mfc\winocc.cpp

VS内の検索でwinocc.cppを検索したのですが
すべて検索 "winocc.cpp", サブ フォルダ, 検索結果 1, "Visual C++ インクルード ディレクトリ"
一致した行: 0 一致したファイル: 0
と、返ってきました・・・

どなたか予測が付けられる方がいたら、アドバイスお願いします・・・。
自分でもよく理解できていないんで、何か必要な情報があったら、教えて下さい。



ちなみにデバッグ実行で辿った所、memset.asm内で落ちてるみたいなのですが、さっぱり意味がわかりません・・・
267デフォルトの名無しさん:2008/07/09(水) 18:19:40
>>266
エラーはライブラリで起きてる。
ソースインストールして中見るでもいいが、通常は
止まったとこからスタックダンプ(呼び出し履歴だっけ?)で自分のコードの該当箇所探して
渡してる引数の値とかチェックしてみ。
268デフォルトの名無しさん:2008/07/09(水) 18:30:04
>>267
了解です、詳しく値をチェックしてみます
ありがとうございました。
269デフォルトの名無しさん:2008/07/09(水) 18:46:06
↓newの投げるエラーがキャッチできません!なんでんでしょうか?
#include <iostream>
#include <new.h>
class test{
int *array;
public:
test(int x);
~test(){delete [] array;};
};
test::test(int x = 1){
try{
array = new int[x];
}catch(bad_alloc&){
std::cout << "bad_alloc" << std::endl;
abort();
}
};
int main(){
test *a;
while(1) a = new test;
return 0;
}
↓実行結果

Abnormal program termination
270デフォルトの名無しさん:2008/07/09(水) 18:59:48
本当にbad_allocが投げられているかどうか確認してみなされ
271デフォルトの名無しさん:2008/07/09(水) 19:04:04
↓だとうまくいくのでbad_allocはでてるはずです
#include <iostream>
#include <new.h>
int main(){
int *array;
while(1){
try{
array = new int[10000];
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
}
return 0;
}
実行結果
bad_alloc!!!

Abnormal program termination


272デフォルトの名無しさん:2008/07/09(水) 19:12:27
while(1) a = new test;
の部分で、int *array; の為のメモリを確保する部分で先にbad_allocが投げられてるんだと思う。
273デフォルトの名無しさん:2008/07/09(水) 19:29:44
>>272

try{
test *a;
while(1) a = new test;
}
catch(bad_alloc&){
std::cout << "!!!!" << std::endl;
}

に変えてみたけど、Abnormal program termination と表示されるだけで!!!!は出力されませんでした・・・

274デフォルトの名無しさん:2008/07/09(水) 19:36:28
何がなんだかわかんねー
#include <iostream>
#include <new.h>
int main(){
int *array;
while(1){
try{
array = new int[7]; // <-確保する量を減らしたらcatchできなくなった、8以上だとcatchできる
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
}
return 0;
}
実行結果
Abnormal program termination
275デフォルトの名無しさん:2008/07/09(水) 19:40:40
あーわかった。たぶん
276デフォルトの名無しさん:2008/07/09(水) 19:44:12
http://home.f01.itscom.net/toge/programingreport/program/clang.html

このサイトの

音声処理
# Waveファイルを入出力してみる
# 音声を逆に再生してみる
# 音声をフーリエ変換してみる

# 完全版 [wave.h] [wave.c] [calculation.h] [calculation.c]

のプログラムつかってwavファイル読み込みしてみました。

16ビットモノラルと16ビットステレオの読み込み時間の差が結構あるんですが、改良できないですか?

16ビットステレオの読み込みが結構かかります。モノラルの倍ぐらいならわかるんですが、4倍ぐらいかかる気がします。

277デフォルトの名無しさん:2008/07/09(水) 19:46:24
なんか違う例外も発生してるのかも?
catch(...) も追加してみたらどうなるだろう
278デフォルトの名無しさん:2008/07/09(水) 19:56:40
ほかのエラーもキャッチできませんでした
#include <iostream>
#include <new.h>
int main(){
try{
int *array;
while(1){
array = new int[4];
}
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
catch(...)
{
std::cout << "not bad_alloc!!!" << std::endl;
}
return 0;
}
実行結果
Abnormal program termination
279デフォルトの名無しさん:2008/07/09(水) 20:07:12
>>278
多分俺の予測だけど、聞きたい?
280デフォルトの名無しさん:2008/07/09(水) 20:10:28
>>276
ぱっと見た感じ、ステレオの場合にファイルからの読み込み回数が
増えるようになってたので、そこが遅さの原因かも?

wave.cの Sound *Read_Wave(char *filename) のファイル読み込み部分を、
ファイル全体を一度メモリに読み込んでから処理するように変えれば、
いくらか速くなる・・・かも。
281デフォルトの名無しさん:2008/07/09(水) 20:11:45
>>279
聞かずに言ってやれよw
282デフォルトの名無しさん:2008/07/09(水) 20:12:29
>>279
蝶聞きたい
283デフォルトの名無しさん:2008/07/09(水) 20:13:52
構造体の配列にに一気に読みこんでも大丈夫そうだけどな
284デフォルトの名無しさん:2008/07/09(水) 20:25:41
>>280
なるほど。しかしそんなスキルがありません\\
285デフォルトの名無しさん:2008/07/09(水) 20:28:12
>>279
魅上!何をしている!?助けろ!!書けー!
286デフォルトの名無しさん:2008/07/09(水) 20:30:25
じゃあ、どんなスキルを持っているんだ?
287デフォルトの名無しさん:2008/07/09(水) 20:31:14
>>284
じゃぁ何か?最初から、「もっと速いのを俺の為に書け」と、
そういうつもりで書き込んでたのか?
288デフォルトの名無しさん:2008/07/09(水) 20:40:43
>>286
身の程も弁えず赤の他人に丸投げする厚顔無恥のスキルとか。
289デフォルトの名無しさん:2008/07/09(水) 20:41:59
>>278
// MinGW g++(GCC)3.4.5 にて
// bad_alloc!!! が出力されたよ
#include <iostream>
#include <new>
int main(){
try{
int *array;
while(1){
array = new int[4];
}
}
catch(std::bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl; // 可能性としてはここでメモリ確保失敗?
abort();
}
catch(...)
{
std::cout << "not bad_alloc!!!" << std::endl;
}
return 0;
}
290デフォルトの名無しさん:2008/07/09(水) 20:46:45
>>286
どうてい
291デフォルトの名無しさん:2008/07/09(水) 20:48:28
特技はイオナズンとありますが?
292デフォルトの名無しさん:2008/07/09(水) 20:51:12
>>289
BCCが悪いのかな?
MinGWっていうの使ってみますわ
293デフォルトの名無しさん:2008/07/09(水) 20:51:18
>>285
わるいわるい、席外してた。
メモリ確保できなくて例外が飛んだとき、std::coutが動作できるほどメモリがあまってないんじゃないのか?

メモリ確保の一回の単位を大きくすると、最後の失敗で返却される余裕が大きいから、std::coutが動く余裕ができる、と。
ま、良そうだから分からんけど。

catchが起きてるかどうかは表示じゃなくてブレークポイント貼るとかしてみたら?

とおもったら>>289が書いてるじゃん
294デフォルトの名無しさん:2008/07/09(水) 20:53:31
>>291
はい、スレ住人のSAN値にダメージを与えられます。
295デフォルトの名無しさん:2008/07/09(水) 20:57:40
>>293
そういうことかーーーーーわかりやすい説明dd
296デフォルトの名無しさん:2008/07/09(水) 21:04:18
>>295
どこの環境の所為というよりも、メモリ確保失敗ではありがちなシチュエーション。
こういうのを、スッと予想できるようになったら初心者脱出だよ。

決してプログラミング言語の全貌理解するとか、機能や仕組みの名称を
間違えずにいえるとかは関係ないんだな。
297デフォルトの名無しさん:2008/07/09(水) 21:05:20
std::coutでなくてstd::clogに出力してみれば?
そういう問題でもない気もするけど。

ちなみにBCC5.9.4ではunknown software exceptionの
ダイアログボックスが表示される。
298デフォルトの名無しさん:2008/07/09(水) 21:05:56
>>291
魔法の聖水渡しておきますね
299デフォルトの名無しさん:2008/07/09(水) 21:10:17
main関数内で宣言して値を入力した配列を関数に渡すにはどうしたらいいですか?
ポインタが絡むと良く分からなくなります
300デフォルトの名無しさん:2008/07/09(水) 21:11:46
>>299
ポインタを勉強してみるとか
STL vector を参照渡ししてみるとか
301デフォルトの名無しさん:2008/07/09(水) 21:16:09
qsortの引数とかで使われている関数へのポインタというのが
良く分かりません。
変数や構造体のポインタというのは、それがメモリ上で占める
大きさがきっちり決まっているものだと思うのですが、それとは
性質が違うものなんでしょうか? 名前は同じでも。
上の例でいうと、比較用の関数を書きますが、その引数とか渡す
タイミングが(qsortの引数にあると)良くわからないのですが。
この辺り詳しく解説していある入門書とかありますか?
302デフォルトの名無しさん:2008/07/09(水) 21:20:42
>>301
関数ポインタは入門じゃないと思うが
これを勧めておく
http://kmaebashi.com/book/index.html

良書を保護する資金と場所が欲しい
303デフォルトの名無しさん:2008/07/09(水) 21:20:50
↓でようやく狙い通りのbad_allocがでますた。みんなありがとー!

#include <iostream>
#include <new>

int main(){
int *array;
char *dummy = new char[0xff];

try{
while(1){
array = new int[1];
}
}
catch(std::bad_alloc&){
delete [] dummy;
std::cout << "bad_alloc" << std::endl;
abort();
}

return 0;
}
304デフォルトの名無しさん:2008/07/09(水) 21:28:26
>>303
それ自力で思いついたのなら、君素質あるかも
305デフォルトの名無しさん:2008/07/09(水) 21:43:41
俺がやったとして100%その答えを出せる自信は無いな、情けないけど…。
306デフォルトの名無しさん:2008/07/09(水) 22:08:34
俺もその発想は無かったわ。
コロンブスだね
307デフォルトの名無しさん:2008/07/09(水) 23:03:39
Windows Mobile 6で、ファイルの入出力をやりたいんですけど、何の関数を使っていいかわからないです。
環境としては、VS2005、MFCでダイアログベースで、
コントロールの状態について、読み出し・保存を、ファイルで管理したいです。

とりあえず1行ずつ読み出しがしたかったので、
CStdioFileでやってみたら、文字化け…。(ブレークポイント設定して、ウォッチの状態で)

CFileだと、一行ずつっていうのがどうしたらいいのかわからないです。
ほかにもfstreamとかfopenとかいろいろあるみたいなんですけど、どれがなんなのか、どんな設定が必要なのかさっぱりです。

MSDNもざっとはみたんですけど、unicodeがどうとか、そういう記述が見当たらなくて。
やり方or参考になるものを教えていただけませんでしょうか。
308デフォルトの名無しさん:2008/07/09(水) 23:15:13
1行ずつならCFileの子供にそういうクラスあったはず
UNICODEなら_UNICODEって#defineする必要あり
っていうか、MFCなのか
309デフォルトの名無しさん:2008/07/09(水) 23:17:46
>>307
文字化け以前に、バイナリのレベルでは読み出せてるの?
310デフォルトの名無しさん:2008/07/09(水) 23:23:51
>>308
ど、どれでしょうか・・・(;´Д`)ウウッ…

>>309
馬鹿なこと聞きますが、
バイナリのレベルで読み出せてるかっていうのはどうやって確かめたらいいのでしょう??
311デフォルトの名無しさん:2008/07/09(水) 23:38:25
おいおい、中身が明らかなファイルを読み出しながら1バイトずつ表示でもしたら?
WM6の実行環境がどうなのか俺は知らんけど、あんたそこまで分からん初心者なのか?
312デフォルトの名無しさん:2008/07/09(水) 23:40:18
CStdioFileだな
ていうか、MFCスレで聞いた方が良さ気
313デフォルトの名無しさん:2008/07/09(水) 23:46:17
>>311
ごめんなさい、そこまでわからん初心者です…。
一応中身はあきらかなファイルを作って見てはいるんですが、1バイトずつ?とかっていうのがわかりません…。
おいてあるファイルの中身は
key=test
の1行だけです。

>>312
一応今はCStdioFileとかの関数を使ってますが、それ以外でも実現可能ならなんでもよかったので、こちらで聞いてみました。
だめでしょうか(´・ω・`)
314デフォルトの名無しさん:2008/07/09(水) 23:49:07
やってみたのはこれ↓で、lineに中身が入ると「敫㵹整瑳਍਍」って感じになってますです。。。

CString m_FileName = path;
CStdioFile inFile;
if( !inFile.Open( m_FileName, CFile::modeRead ) ){
 inFile.Open( m_FileName, CFile::modeCreate );
 inFile.WriteString(_T("key=test"));
 MessageBox(_T("設定ファイルのオープンに失敗しました。"));
 inFile.Close();
 return;
}
CString line;
while(inFile.ReadString(line) != NULL){
 MessageBox(line);
}
315デフォルトの名無しさん:2008/07/09(水) 23:51:25
BOMがあるときの挙動はどうなるんだろ
ファイルを見ないことにはなんとも


■MFC相談室 mfc19d.dll■
http://pc11.2ch.net/test/read.cgi/tech/1207301867/
316デフォルトの名無しさん:2008/07/09(水) 23:54:16
女性?
317デフォルトの名無しさん:2008/07/09(水) 23:54:34
virtual LPTSTR ReadString(
LPTSTR lpsz,
UINT nMax
);
virtual BOOL ReadString(
CString& rString
);

戻り値
最初の改行文字を読み込んだとき、読み込みを停止します。このとき、読み込んだ文字数が nMax-1 より少ないときは、バッファに改行文字を格納します。いずれの場合でも、null 文字 ('\0') が付加されます。


とりあえず、そのwhile文はやめろw
318307:2008/07/10(木) 00:00:25
>>315
こちらで一段落着いたら行かせていただきます!

>>316
一応そうです^^;

>>317
あ、NULLじゃなくてFALSEで判定?
↓にそれっぽいサンプルがあったので、そのまま使ってました(--;
http://www.ias.tokushima-u.ac.jp/linguistik/program/Tagger.html
319デフォルトの名無しさん:2008/07/10(木) 01:06:59
自作クラスから組み込み型への変換したいのですが、
暗黙的変換を禁止し、明示的変換だけ許可する方法はありませんか?
C#だとexplicitとimplicitで可能ですけど
320307:2008/07/10(木) 01:19:53
あれ?
よくわからないアクセスエラーが出てきたので、最初から作り直したら、うまくいきました。
なんか、おさわがせしてしまいまして、すみません。。。
変えたところはwhileの条件なので、そこが原因だったのかもしれないです。
どうもありがとうございましたm(_ _)m

結局動いたコードは↓です。
CString m_FileName = path;
CStdioFile inFile;
if( !inFile.Open( m_FileName, CFile::modeRead ) ){
  inFile.Open( m_FileName, CFile::modeCreate | CFile::modeWrite );
  inFile.WriteString(_T("key=test"));
  MessageBox(_T("設定ファイルのオープンに失敗しました。"));
  inFile.Close();
  return;
}
CString line;
while( inFile.ReadString(line) != FALSE ){
  MessageBox(line);
}
321デフォルトの名無しさん:2008/07/10(木) 01:22:12
>>319
それがないんだな。
C++0xでは型変換演算子にもexplicitつけられるようになる予定。
322319:2008/07/10(木) 01:46:26
>>321
ないですか…。ありがとうございます
C++0xマダー?
VC++ 2008が対応してくれると信じて
323デフォルトの名無しさん:2008/07/10(木) 10:38:06
>>319
明示的にやるなら変換関数つくって呼ぶだけじゃね?
324デフォルトの名無しさん:2008/07/10(木) 12:19:24
>>323
暗黙的変換を禁止したいんだろ
325デフォルトの名無しさん:2008/07/10(木) 13:13:40
class CHoge
{
public:
CHoge(){
_asm{
mov ecx , m_value
xorps xmm0 , xmm0
movaps [ ecx ] , xmm0
}
}
virtual ~CHoge();
virtual void func();

private:
__declspec( align(16) ) float m_value[4];
};
のようなクラスがあったとして、そのインスタンスを
ある関数内で自動変数として確保したとき、
m_valueのアドレスが16byte境界でないために movaps のところで
停止してしまうのですが、m_value のアドレスが16byte境界になる
ようにする方法はありますでしょうか?
できれば movups に変更しないで済む方法でお願いします。
環境:VisualStudio6 + sp5 + ProcessorPack WindowsXP
326デフォルトの名無しさん:2008/07/10(木) 13:23:37
少し大きめの配列を取って、そこに割り当てる。

char dat[200]
CHoge * chp;
if((&dat[0] &0x00001) == 1) chp = (CHoge *) &dat[1];
else chp = (CHoge *) &dat[0];
327デフォルトの名無しさん:2008/07/10(木) 13:27:26
char dat[sizeof(CHoge)+1]; のほうがいいかな
328デフォルトの名無しさん:2008/07/10(木) 13:29:55
>>326
解答ありがとうございます。
クラス宣言側で対処できないものかと考えていたのですが、
もう少し考えてみたいと思います。
329デフォルトの名無しさん:2008/07/10(木) 13:31:47
クラス生成時に同じことをやればできるのだが。 わかる?
330デフォルトの名無しさん:2008/07/10(木) 13:33:12
サンプル要る? ちなみに言語的には無いはず
331デフォルトの名無しさん:2008/07/10(木) 13:33:16
16バイト境界だから、それじゃ全然足りないと思うけど。
char dat[sizeof(CHoge) + 15];
CHoge *chp = (CHoge*)(((uintptr_t)dat + 15) & ~15);
332デフォルトの名無しさん:2008/07/10(木) 13:33:34
アラインされたヒープを操作するクラス作って、そいつに任せたら?
CHoge() の中で
 _asm{
 mov ecx , <ヒープ先頭>
 xorps xmm0 , xmm0
 movaps [ ecx ] , xmm0
 }
とやらずに済まないかな? と
333デフォルトの名無しさん:2008/07/10(木) 13:34:00
__declspec(align(16)) CHoge hoge;
ってことですか?
334デフォルトの名無しさん:2008/07/10(木) 13:34:54
>>331
失礼16Bitと間違えました、>>331が正しい
335デフォルトの名無しさん:2008/07/10(木) 13:37:21
placement newは?
336デフォルトの名無しさん:2008/07/10(木) 13:40:28
>>325
ちょっと待て、
mov ecx , m_value ←これ、ecxに&m_valueが入るのか?
337デフォルトの名無しさん:2008/07/10(木) 13:41:05
う〜ん、やっぱりインスタンス作成側で解決するしかないみたいですね。
338デフォルトの名無しさん:2008/07/10(木) 13:42:51
>>336
m_value が配列だから &m_value[0] に相当する値が ecx に入るんじゃね?
339デフォルトの名無しさん:2008/07/10(木) 13:43:58
いえ、クラス内で生成時にアライメンと調整が出来ますよ

class CH
{
char dat[200]; // 数は適当
dat * chp;
CH()
{
CH *chp = (CH*)(((uintptr_t)dat + 15) & ~15);
}
}

これでクラス内だけ
340デフォルトの名無しさん:2008/07/10(木) 13:44:46
>>336
すみません。簡略化のためにミスしたようです。
そこは m_value のアドレスが入ると思ってください。
341デフォルトの名無しさん:2008/07/10(木) 13:48:00
dat *chp = (dat *)(((uintptr_t)dat + 15) & ~15);
に訂正
342デフォルトの名無しさん:2008/07/10(木) 13:50:35
>>338
インラインアセンブラはそこまで気にしてくれない。俺んとこでは先頭要素が入る。
本人分かってるからいいけど。
343デフォルトの名無しさん:2008/07/10(木) 13:52:03
>>339
なるほど。其の方法ならクラス内で吸収できそうですね。
いただいたご意見は参考にさせていただきます。
ありがとうございました。
344デフォルトの名無しさん:2008/07/10(木) 13:52:19
そこは環境依存上等な部分なんだから、アライメント指定をしておけばいいだけだろ。
345デフォルトの名無しさん:2008/07/10(木) 13:53:21
>>342
thx そうっだったのか
346デフォルトの名無しさん:2008/07/10(木) 13:54:28
なー、アラインメントがんばるより、エラー起きないオペコードにしたほうが速くね?
沢山アクセスするなら分からんが、どうせ一回読んだらxmmの上で転がしまくる
んでしょ?
347デフォルトの名無しさん:2008/07/10(木) 14:28:29
http://www.geocities.jp/ky_webid/win32c/055.html

ファイルを開くコモンダイアログの処理ですが、関数化したいんですが、うまくできません。

ウィンドウプロシージャの中に書かないといけないんですか?
348デフォルトの名無しさん:2008/07/10(木) 14:32:14
できますよ
他の関数の中に書いてもいいです
349デフォルトの名無しさん:2008/07/10(木) 14:35:20
マウスのクリックなどいつ起こるか分からない処理をプロシージャの中に書く。

(今は、マウスがクリックされたときコモンダイアログを出すという処理をしたいとします)

マウスがクリックされたら コモンダイアログを開く関数を呼び出す という内容を書く

って考え方であってますか?
350デフォルトの名無しさん:2008/07/10(木) 14:38:06
その文面から読み取れる範囲では合ってる。
まぁ、試せばすぐにわかるさ。
351デフォルトの名無しさん:2008/07/10(木) 14:40:18
そのコモンダイアログを開く関数がうまくかけないんです。。。
引数がよくわからなくて

APIのメイン関数は
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)

って書く。

なにか自作の関数は

int WINAPI Hoge(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
じゃだめなんですか?
352デフォルトの名無しさん:2008/07/10(木) 14:46:38
引数は自分で決めればよろしい。
int Hoge() でもいい
353デフォルトの名無しさん:2008/07/10(木) 14:47:49
わかったかもです。
int WINAPI test(HWND hWnd){

static OPENFILENAME ofn;
static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域
static TCHAR filename[MAX_PATH]; //

ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく
ofn.lStructSize = sizeof(ofn); // 構造体のサイズ
ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル
ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類
ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス
ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス
ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ
ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ
ofn.Flags = OFN_FILEMUSTEXIST; // フラグ指定
ofn.lpstrTitle = _T("ファイルを開く"); // コモンダイアログのキャプション
ofn.lpstrDefExt = _T("wav"); // デフォルトのファイルの種類
// ファイルを開くコモンダイアログを作成
if( !GetOpenFileName( &ofn ) )
{
MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
SendMessage( hWnd, WM_CLOSE, 0, 0 );
return 0;
}
// 選択されたファイル名を表示
MessageBox( hWnd, filename_full, _T("OK"), MB_OK );
return 0;
}
としてプロシージャ内でtest(hWnd)で呼び出せばOKすか?一応うまく動作しました。
354デフォルトの名無しさん:2008/07/10(木) 14:53:52
いいけど、それじゃファイル選択しないでキャンセル押したら元のウィンドウも閉じるんじゃ
355デフォルトの名無しさん:2008/07/10(木) 14:56:28
>>354
そうですね。サイトのプログラムがそういう仕様です。

hWndって奴の役割がイマイチ理解できないです
引数で渡さないといけないものですか?

test関数で引数として与えたのは関数内に
MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
があったからなんですが
356デフォルトの名無しさん:2008/07/10(木) 15:00:50
staticがヤバい
357デフォルトの名無しさん:2008/07/10(木) 15:01:05
>>355
ファイル選択のダイアログはモーダルで動作しないと困るでしょ?
モーダルにするには、動作中無効にする親ウィンドウが必要なのさ。
358デフォルトの名無しさん:2008/07/10(木) 15:03:18
ってモードレスでもダイアログとして動作させるには親がいるけどな。
コモンダイアログで単体で動作することって無さそうだしな。
359デフォルトの名無しさん:2008/07/10(木) 15:06:49
>>356-358

やばい・・・理解できない
360デフォルトの名無しさん:2008/07/10(木) 15:21:37
>>355
>hWnd
fopenで使うFILE* fpと同じだと思っておけばいい。
361デフォルトの名無しさん:2008/07/10(木) 19:04:48

#include <iostream>

int main()
{
char text[] = "つれずれ";
std::cout << text[1] << '\n';
}
こんな感じのプログラムがあるのですが、文字化けしてしまいます。
どう対処すればいいでしょうか。この例では「れ」を表示させたい。
362デフォルトの名無しさん:2008/07/10(木) 19:19:48
あるクラスAがあったとして、
A a();
とした時に出来るaって何物ですか?
引数付きコンストラクタの場合には初期化出来るのに、
上記の場合が駄目なのは仕様上の問題でしょうか?
363デフォルトの名無しさん:2008/07/10(木) 19:25:05
あ、事故解決・・・
関数のプロトタイプと被るのか・・・orz
364デフォルトの名無しさん:2008/07/10(木) 19:26:30
>>362
aは、クラスAを返り値とする引数を取らない関数の宣言。
365デフォルトの名無しさん:2008/07/10(木) 20:22:27
>>361
text[2]じゃねーの?
366デフォルトの名無しさん:2008/07/10(木) 20:27:57
>>361
std::cout << text[2] << text[3] << '\n';
367デフォルトの名無しさん:2008/07/10(木) 20:44:30
>>361
×つれずれ
○つれづれ

くつずれじゃないんだからさぁ……
368361:2008/07/10(木) 20:45:20
なるほど。連続で出力すればよかったんですね。
解決しました。ありがとう
369デフォルトの名無しさん:2008/07/10(木) 23:14:45
文字コードとか考えてるか?
370デフォルトの名無しさん:2008/07/10(木) 23:33:10
rand()を使って0-9の乱数を発生したい場合、ある本で、rand() % 10で剰余を取ればいいとあったのですが、
元のrand()で発生するのは(自分の処理系では) 0-7FFFとなるので、0-9の出現確率が1/10にはならない
はずです。
また%は計算コストが掛かると思うのですが、計算コストが少なくかつ精度良く任意の範囲の乱数を計算す
る定石ってあるのでしょうか?
371デフォルトの名無しさん:2008/07/10(木) 23:35:51
>0-9の出現確率が1/10にはならない はずです。
なぜそう思った?
372デフォルトの名無しさん:2008/07/10(木) 23:38:36
(int)((10 * rand())/(RAND_MAX + 1)) とか?
373デフォルトの名無しさん:2008/07/10(木) 23:40:32
>>370
% のコストなんて気にしないっていう手があるw
あと、出現確率が気になる場合は
rand()>=(RAND_MAX+1-(RAND_MAX+1)%10)
の時にもう一度サイコロを振る
374デフォルトの名無しさん:2008/07/10(木) 23:45:25
>>373
それ右辺が常に0でない?
375デフォルトの名無しさん:2008/07/10(木) 23:48:05
>>374
抜けてたw
RAND_MAX によってはラップアラウンドの問題があるね
int 32bit
RAND_MAX 32767
で考えてた
376デフォルトの名無しさん:2008/07/10(木) 23:51:33
思うんだが、どんな計算しても>>370は「出現確率が1/10にはならないはずです。 」
と思うんだが、いかがなものだろう? 難しい計算のすれば納得するものなのか?
377デフォルトの名無しさん:2008/07/10(木) 23:55:18
まあ六面体ダイスの出目をmodulo4で剰余取るとかよりはマシだろうが
一般にrand()で使われてる線形合同法は低位ビットの質が特に糞らしいから
そういう意味では単に剰余取るのはやはりオススメはできんな

ま、ぐぐればいくらでも情報は入ると思うぜ
378デフォルトの名無しさん:2008/07/10(木) 23:59:00
>>377
了解した。解消の方法はいくつかあるが、%よりは遅そうだな。
解答は他の人にまかす。
379デフォルトの名無しさん:2008/07/11(金) 00:00:44
>>371
元の乱数が1-10とか1-100とか10の倍数でないと、モジュロの0-9出現回数は1/10
にはならんのじゃないか?
あれ、違うか・・・?
380373:2008/07/11(金) 00:03:14
>>373 の内容
偏りに関与する部分を使用しないことにする方針
#include<stdio.h>
#include<stdlib.h>

#define KIND_NUM 10

int main(void){
int i, x, count[KIND_NUM]={0};

for(i=0;i<100000;i++){
while((x=rand())>=(RAND_MAX+1-(RAND_MAX+1)%KIND_NUM)) // 0-32767 のうち 32760-32767 を使用しない
;
count[x%KIND_NUM]++;
}
for(i=0;i<KIND_NUM;i++) printf("%d\n", count[i]);
return 0;
}
381デフォルトの名無しさん:2008/07/11(金) 00:04:56
無限に続くランダム配列の中から
ある一定の時間だけ抜き取れば偏りが生じるのがあたりまえなんじゃないの
むしろ均等にばらけてる方が自然からみて偏りが生じてると思うんだが。
というおきまりの考察は置いて於いてsrand()忘れてないだろうな
382デフォルトの名無しさん:2008/07/11(金) 00:06:01
>>379
それは乱数の性能以下の誤差しかで無いと思われ。
危惧があるなら>>377の危惧が正しい。
だから、求めるのは、>>377の危惧を解消する方法。
383373:2008/07/11(金) 00:07:23
今なら線形合同法が使われているか方が少ないと思うが
心配ならメルセンヌツイスターでググればよいかと
384デフォルトの名無しさん:2008/07/11(金) 00:08:28
>>376
別に難しく考えなくてもいいよ
385デフォルトの名無しさん:2008/07/11(金) 00:09:48
>>381
そういう話じゃないんだなあ
386デフォルトの名無しさん:2008/07/11(金) 00:12:51
ジョーカーを含むトランプ53枚のうちランダムに1枚引いたときに
それがキングである確率は1/4じゃないよねって話。

>>380のやつはジョーカーだったらもう一回引けばいいよねって方法
387デフォルトの名無しさん:2008/07/11(金) 00:13:30
あ、1/13ですわ。
388デフォルトの名無しさん:2008/07/11(金) 00:18:45
確率は簡単な気がしても良く考えないと罠にはまること多し。
しかし381はいっぱしなこと言っているつもりかもしれんが、気の毒な人すぎるな。
389デフォルトの名無しさん:2008/07/11(金) 00:22:54
彼女ができる確立は1/2、できるかできないかだ
390デフォルトの名無しさん:2008/07/11(金) 00:24:32
友達以上彼女未満を入れてください!
391デフォルトの名無しさん:2008/07/11(金) 00:24:43
>>389
できる(10%) できない(85%) 主観のみではできている(5%)
392デフォルトの名無しさん:2008/07/11(金) 00:28:48
昔は標準乱数は性能が今一だったが、今は改善された?
393デフォルトの名無しさん:2008/07/11(金) 00:32:22
最近のVC++は低位ビットとやらを捨ててから渡してくれるらしいな
394デフォルトの名無しさん:2008/07/11(金) 00:35:56
0 と 1 の出現順序に規則性を見出せますか?
#include<stdio.h>
#include<stdlib.h>
int main(void){
int i;
for(i=0;i<100;i++) printf("%d", rand()&1);
return 0;
}

rand() の返り値に線形合同法の最下位ビットを使用している場合には
0 のみ
1 のみ
0 と 1 が交互に出現
の3つのうちのいずれかになる問題があります
395デフォルトの名無しさん:2008/07/11(金) 00:44:22
いちばん簡単なのは真ん中とりか?
no = (rand()>>16)%10;
どんな計算をしても、0-10程度では多分有る程度は偏ると思われ。
それ以上気にすると、%の性能どころではなくなるかな。
396デフォルトの名無しさん:2008/07/11(金) 01:09:29
乱数生成の仕組みがわからん
397デフォルトの名無しさん:2008/07/11(金) 01:12:09
乱数でググれば、山ほど情報が有る、ぐぐれ
398デフォルトの名無しさん:2008/07/11(金) 02:33:03
>>396
CPUの中にラジウムの入った微細なガラス管があり、そこから放出される放射線
ノイズを元に乱数を発生させている。
399デフォルトの名無しさん:2008/07/11(金) 04:39:07
CreateFileMapping()でNULLが帰ってくるのですが、
原因が引数にあるファイルネームがフルパスにあるようです。
(相対パスを入力すると問題なかった)

OPENFILENAME ofn → GetOpenFileName(&ofn)
というにファイルダイアログでファイルパス(フルパス)を取得している
のですが、ファイルダイアログから相対パスを得ることはできないでしょうか?
400デフォルトの名無しさん:2008/07/11(金) 06:05:35
char ss[5];
BYTE bt[5];

for(int t = 0; t < 5; t++)
{
sprintf(ss[t], "%1u", bt[t]);
}
fout << ss[0] << ss[1] << ss[2] << ss[3] << ss[4] << '\n';

'sprintf' : 1 番目の引数を 'char' から 'char *' に変換できません。

というエラーが出るんですが、どうすればいいですか?
401デフォルトの名無しさん:2008/07/11(金) 06:13:30
sprintfつかうのやめればいいよ
402デフォルトの名無しさん:2008/07/11(金) 06:30:18
そもそも、確率が6分の1であったとしても
6回サイコロを振ったときに重複した数字がでないか?つったらそうじゃないだろ。

サイコロは、振ったときに6分の1なだけで次に振る時もまた6分の1でしかないんだから。
403デフォルトの名無しさん:2008/07/11(金) 07:10:14
>>400
std::stringstream使えよ
404デフォルトの名無しさん:2008/07/11(金) 08:11:58
405デフォルトの名無しさん:2008/07/11(金) 08:32:20
>>400

for(int t = 0; t < 5; t++)
{
ss[t] = bt[t]; //sprintf(ss[t], "%1u", bt[t]);
}

マジレスすると、ポインタとその中身に関してしっかり勉強した方がいい。
現状では君の知識は、Cを扱うには滅茶苦茶だよ。
406デフォルトの名無しさん:2008/07/11(金) 09:13:22
ss[t] = '0' + (bt[t] % 10);
じゃね?
407デフォルトの名無しさん:2008/07/11(金) 09:46:20
どーせ宿題
408デフォルトの名無しさん:2008/07/11(金) 11:20:40
だからこそ動作仕様を満たしつつ提出したら怒られそうなソースをですね
409デフォルトの名無しさん:2008/07/11(金) 12:47:19
関数ポインタとか使って変態プログラム作るか
410デフォルトの名無しさん:2008/07/11(金) 12:51:56
>>402
そのとおり。でも何で突然そんなことを?
確率の話してるから言ってみただけかな
411デフォルトの名無しさん:2008/07/11(金) 14:28:49
>>402
コンピューターにおける乱数の使われ方をよく理解したら。単純にそう言い切れなくなるよ。
412デフォルトの名無しさん:2008/07/11(金) 15:08:18
乱数の話か擬似乱数の話か区別つけようぜ
413デフォルトの名無しさん:2008/07/11(金) 15:29:13
乱数ときたら幹
414デフォルトの名無しさん:2008/07/11(金) 15:31:39
乱馬1/2
415デフォルトの名無しさん:2008/07/11(金) 15:41:35
>>402
> そもそも、確率が6分の1であったとしても
> 6回サイコロを振ったときに重複した数字がでないか?つったらそうじゃないだろ。
>
> サイコロは、振ったときに6分の1なだけで次に振る時もまた6分の1でしかないんだから。

なんでそんなあたりまえのことわざわざ披露して得意になっているの?
上の書き込みでそれに反することでも書いてあったのかな?
だったら指摘してほしいものだけど。
416デフォルトの名無しさん:2008/07/11(金) 15:55:27
まあまあ、
高校数学の確率論の話と計算機における擬似乱数列特有の問題を
ごっちゃにしてるってか
単に話についてけない人が口を挟みたがってるだけなので
スルー汁
417デフォルトの名無しさん:2008/07/11(金) 16:21:12
>>412
普通のCPUは中にラジウムの入った微細なガラス管があり、そこから放出される放射線ノイズを元に乱数を発生させている。
だから疑似乱数の話は必要ない。
418デフォルトの名無しさん:2008/07/11(金) 16:24:03
419デフォルトの名無しさん:2008/07/11(金) 16:28:00
最初の質問者そっちのけで議論はじめんなよw
420デフォルトの名無しさん:2008/07/11(金) 16:28:10
質問です。
VC2008で新規プロジェクト>「Windowsアプリケーション」で「空のプロジェクト」をOFF
とすると、ウインドウが出るだけのソースができあがりますよね。

これを単にDebugコンパイルし、デバッグモード走るらせます。
するとウインドウ右上の×を押して閉じた時、
>test.exe の 0x77d0f48f で初回の例外が発生しました: 0xC0000005: 場所 0x2604b974 を読み込み中にアクセス違反が発生しました。
というログが出力されました。
不思議に思い、デバッガの例外時ブレークを全てONにし試したところ、
DefWindowProc(hWnd, message, wParam, lParam);
のところで例外を投げていました。

不審に思い、今まで長年作ってきたプロジェクトから適当に抽出してDebugビルド>実行>閉じるをやってみたのですが、全てのプロジェクトで同様に例外を投げていました。
VC6.0で作った(そちらでは例外なんてでてない)プロジェクトを2008で開き、(自動変換を行った後)ビルド〜とやってみましたが、やはり例外を投げています。

この動作は仕様なのでしょうか?
それとも私の環境がぶっこわれてしまっているのでしょうか。
421デフォルトの名無しさん:2008/07/11(金) 16:44:19
420です。
お騒がせしました。
IME Watcherをいう、XPのIMEをタスクバーに隠すフリーツールが悪さをしていたようです。
なんでまったく関係ないのに悪さをしたのかは不明ですが

・VS2008は言語バーをタスクバーにしまってあると動作がおかしくなる
・IME WatcherはIMEをタスクトレイにしまってくれるツール
というあたりに何かありそうです。
422デフォルトの名無しさん:2008/07/11(金) 17:43:08
>>421
スレチだけど、それじゃあ他の全部のプログラムが終了時に例外投げるんじゃないの?
デバッグ実行限定かもしれんが。
423デフォルトの名無しさん:2008/07/11(金) 17:51:03
だから他のすべてのプロジェクトで同様の例外が発生したんでないの?
424デフォルトの名無しさん:2008/07/11(金) 17:51:15
>>422
ええ、デバッグ実行限定ですが、あらゆるプロジェクトが例外投げました
素直にMS2003入れ(て、IMEをタスクトレイにしまい)ました;
425デフォルトの名無しさん:2008/07/11(金) 18:59:01
bmpファイルを読み込むプログラムのヘッダーファイルですが
以下の通りのコードをビルドしようとしたところエラー
error C2011: 'STRUCT_IMAGE' : 'struct' 型の再定義
error C2011: 'STRUCT_PIXEL' : 'struct' 型の再定義
が出ました。
どこを直せばいいのでしょうか?

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef unsigned char BYTE;

typedef struct STRUCT_IMAGE{
int width,height;
int depth;
void* pixels;
}ImageData;

#define PIXELMAX 255
typedef struct STRUCT_PIXEL{
int r,g,b;
}Pixel;

ImageData* createImage(int width,int height,int depth);
void disposeImage(ImageData *img);
int readBMPfile(char *fname,ImageData **img);
int writeBMPfile(char *fname,ImageData *img);
int getPixel(ImageData *img,int x,int y,Pixel *pix);
int setPixel(ImageData *img,int x,int y,Pixel *pix);
426デフォルトの名無しさん:2008/07/11(金) 19:08:25
どっかで同じ名前の何かがあるんじゃないの?
427デフォルトの名無しさん:2008/07/11(金) 19:10:22
そのヘッダが同じ翻訳単位の中で二回以上インクルードされてるとか。
428デフォルトの名無しさん:2008/07/11(金) 19:13:54
VC++初心者です
余りに下らない質問ですいません・・・

エディットボックスに変数の追加をして利用したいのですが
Valueは使い方が分かるのですが
Controlの意味がよく分かりません。

Googleから調べてみたのですが、コレといってピンとくる情報も見つけられず
(あまりに理解が無くて、見ても気づいていないのかもしれないです)
Controlのニュアンスもつかめていないので、他にどういうキーワードで検索していいかもわからず
ここに書き込ませてもらいました。

どなたか、よろしければヒントお願いします。
429デフォルトの名無しさん:2008/07/11(金) 19:38:46
>>428

>VC++
VC++2008 Express Edition?

>エディットボックス
System.Windows.Forms.TextBox?
CEdit?
430デフォルトの名無しさん:2008/07/11(金) 19:45:17
>>429
VisualStudio TeamSystem2008 DevelopmentEdition で

MFCアプリケーションのエディットボックス、変数の種類のところはCEditになってます

答え噛み合ってるでしょうか・・・?
431デフォルトの名無しさん:2008/07/11(金) 19:59:59
初心者が使うバージョンじゃあるまいに…評価版か?
432デフォルトの名無しさん:2008/07/11(金) 20:01:20
>>431
未経験中途で入った新入社員です、なのでこれは会社のです^^; 
433デフォルトの名無しさん:2008/07/11(金) 20:37:14
>>432
みんな呆れて返答しないみたいだけど、まずMFCの本とかに
一通り目を通したら?
434デフォルトの名無しさん:2008/07/11(金) 20:48:46
>>433
今はWin32APIを使ったC++プログラミングの勉強をしていたんですが
資料として渡されたソースで、Win32で書かれたクラスの利用側がMFCで書かれていて
それなりに利用側の構造も理解しないと先に進めないので調べていたんです。
なのでMFCの本を購入してっていうのはちょっと・・・

エディットボックス、Control、Value、コントロール変数 等の組み合わせでググったんですが、
参考になるサイトを見つけられなかったため、書きこませて貰いました。

具体的にはCFileDialogでファイルのフルパスを抜き出すって物なんで
Valueを使ってもControlを使っても実装する事はできたんですが
Controlを使った実装方法の意味がいまいち理解できなかったので質問しました。

みなさん呆れていらっしゃったんですね・・・理由は、質問するために渡した情報が少なかったからでしょうか?
それともそんな【初心者歓迎】スレでも質問しちゃいけない程程度の低い質問だったからでしょうか?
よろしければその点だけでも教えていただけると助かります。

どうもありがとうございました。
時間の折り合いがついたら言われたとおりMFCの書籍で勉強したいと思います。
435デフォルトの名無しさん:2008/07/11(金) 20:50:47
M = 難しいけど
F = ふぉんとうに
C = 挑戦しちゃうの?
436デフォルトの名無しさん:2008/07/11(金) 20:58:44
>>433
すいません、解決しました。
ありがとうございました。

>>435
うま・・・くないですね
がんばります
437デフォルトの名無しさん:2008/07/11(金) 21:01:45
まあ、よく言われることだけど、初心者は免罪符じゃない。
そりゃ、ここは初心者歓迎とあるけどな。
438デフォルトの名無しさん:2008/07/11(金) 21:24:40
>>437
ちいさな事でつまずいて、そういう時ほど混乱して膨大に時間を無駄にしてしまうので、
知恵を貸してもらえたらと思ったんです。
他人の貴重な時間を奪ってる訳ですから、おっしゃる事はもっともです。
これだけの時間が経過してわかった事は「MFCの本に書いてある」って事だけだったので、
そういった意味でも勉強になりました。
アドバイスありがとうございました。
439デフォルトの名無しさん:2008/07/11(金) 21:33:26
初心者ですと言えば教えて貰えると思って書き込んで
レスが付かなければひがんでで催促して
優しく忠告されたら逆ギレしてってどんだけ甘ちゃんだよ
みんなお前の親じゃねーんだよ
vipにも書き込んでマルチしやがってクズ野郎
440デフォルトの名無しさん:2008/07/11(金) 21:34:50
初心者ですけどー、アルゴリズムとかぁデータ中心の考え方まなぶのにぃーいい本おしえてくださぃーっていうかーマジ教えてほしいっス
441デフォルトの名無しさん:2008/07/11(金) 21:43:26
とりあえず本屋に言って何か買って来い
442デフォルトの名無しさん:2008/07/11(金) 21:46:32
そんなこと言ったらエロ本買って来ちゃうだろ
443デフォルトの名無しさん:2008/07/11(金) 21:49:05
>>438
ホントはみんな、答えを知らないか、質問の意味が分からないかのどっちかw
444デフォルトの名無しさん:2008/07/11(金) 21:51:22
ゲヘヘヘ、ビニール本かってきちまったぜ・・・

塩化ビニールの化学式格好いいよ!
塩化ビニールの原子モデルサイコーにエロいぜ!
445デフォルトの名無しさん:2008/07/11(金) 21:55:10
ジブロモエタンの本は?
じぶろ萌えたん
446デフォルトの名無しさん:2008/07/11(金) 21:58:40
>>440
amazonでアルゴリズムの本を探していたら、
いつの間にかアルマジロランをプレイしていた。
金曜日の夜だったはずなのに、月曜日になっていたとかそんなちゃちな(ry
447デフォルトの名無しさん:2008/07/11(金) 22:50:17
>>439
会話が噛み合わないのでこれ以上話すのは時間の無駄ですね。
ありがとうございました。

>>443
多分、後者ですね・・・もっと全体像を把握して的確に質問する技術を磨きます。
ありがとうございました。
448デフォルトの名無しさん:2008/07/11(金) 23:00:39
お前向いてないよ
449デフォルトの名無しさん:2008/07/11(金) 23:04:12
>>447
会社の人間に先ず聞くべきだったかもしれないね。
450デフォルトの名無しさん:2008/07/11(金) 23:07:08
while(1) cout << "せんせーできませんこたえおしえて!" << endl;
programmer.grow();
451デフォルトの名無しさん:2008/07/11(金) 23:07:59
error:初期化がされていません
452デフォルトの名無しさん:2008/07/11(金) 23:09:46
>>449
そうですね・・・それは全く持って思います。
極力社内で解決できるように新人同士のネットワークを作る努力などはしているんですが、
上司や先輩に質問ができる環境を作る努力もしていこうと思います。
ありがとうございました。
453デフォルトの名無しさん:2008/07/11(金) 23:22:36
ここでいいのかな?他に適切なスレがあれば教えて下さい。

少なくともPOSIXでは、execv()の引数って
int execv(const char *path, char *const argv[]);
になってるんですが(参考: http://www.linux.or.jp/JM/html/LDP_man-pages/man3/exec.3.html )
この2番目の引数が
const char *const argv[]
でなくて
char *const argv[]
なのを説明できる方はいますか?
execv()はargv[]のアドレスを変える可能性があるということなんでしょうか?
454デフォルトの名無しさん:2008/07/11(金) 23:39:44
>>404
ソースUPしろってこと?OK
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7343.txt

このクラスのOpenFileDialog()がCreateFileMapping()の直後の
if文でfalse返ってファイルを読み込めないんすよ。
環境はVC++2008 Windows
455429:2008/07/11(金) 23:47:27
聞くだけ聞いて、ついさっきまでレスしたことすっかり忘れてた。
456デフォルトの名無しさん:2008/07/11(金) 23:47:28
GetLastError()の値を調べるべし
457デフォルトの名無しさん:2008/07/11(金) 23:49:43
>>452
違いは、Controlはvalueより複雑なことができるというところ
たとえば状況に応じてEditControlを有効化/無効化するとかしたいなら
Controlでなければ対応できない
テキストを取り出すだけならどちらも同じことができるので使いやすいほうでよい
458429:2008/07/11(金) 23:53:32
>>430
もう見てなさそうだけど、オンラインのMSDNの中を色々見て回れば良いと思うよ。
459429:2008/07/12(土) 00:01:08
補足。特にDDX関連。
460デフォルトの名無しさん:2008/07/12(土) 00:15:21
>>457
なるほど、より複雑な実装ができるんですね。
今回はとりあえずパスを取りだしたら用済みなんで、時間ができたら調べてみます。
自分みたいな素人にもわかりやすい抽象的な説明、ほんとうに助かります。ありがとうございました。

>>458
さっき、FileDialogのクラスからたどっていろいろなクラスの中身を調べてました。
見ても見ても意味がわからなくて、どこに大事な事が乗ってるのかわからなかったんですけど、やっと発見できました!
なかなかMSDNも自分みたいなへっぽこには欲しい情報を探すのがむずかしくて笑
でも、ちょっと今回見つけられたんで、次回からもっと楽に情報を探せると思います。
ありがとうございました。

>>459
あ、こういう機能をDDX(Dialog Data Exchange)って言うんですね!
ほんと、単語を知らないっていうのは調べ物をするのが容易じゃないです。
ありがとうございました、詳しく調べてみます!
461399:2008/07/12(土) 00:36:20
>>456
指定したパスが見つかりませんだって。
462デフォルトの名無しさん:2008/07/12(土) 00:49:59
publicで定義されている純粋仮想関数を具象クラスでprivateで定義するのは
何か弊害ありますか?
インターフェースを介してでないと呼べないようにしたいのですが。
弊害がない場合このやり方は一般的なのでしょうか?
463399:2008/07/12(土) 00:55:14
>>456
ファイルの置き場が悪いのかなと思ったら、
Cドライブ直下に置いてもエラーコードは「指定したパスが見つかりません」だとか。
もうよくわからん
464デフォルトの名無しさん:2008/07/12(土) 01:01:09
\
465デフォルトの名無しさん:2008/07/12(土) 01:09:21
>>463
状況がみえないのだが、そもそも CreateFileMapping のパラメタに
パス名というのは存在しないのでは?
オブジェクト名というのはあるけど、これはパス名とは違うし
もともと \ は受け付けない仕様のはず
466デフォルトの名無しさん:2008/07/12(土) 01:14:02
出てきたフルパスをWin+Rに入れてちゃんとファイルが開くか確認すべき
467399:2008/07/12(土) 01:53:22
>>465
それっぽい
オブジェクト名はパスが適切だと思ったんだけど
\がすっかり盲点だったし、NULLにしたら期待道理に動作もした。

さんきゅー
468デフォルトの名無しさん:2008/07/12(土) 05:25:34
マルチスレッドを停止させる方法で別スレッド関数内でループさせて、本体でフラグ変数を操作してループを抜けさせて別スレッドを終了させたいんですが、
終了させようとするとハンドルされていない例外、読み込み中にアクセス違反が発生エラーが出るんですが、こういう使い方は無理なんですか?
469デフォルトの名無しさん:2008/07/12(土) 06:00:29
>>468
可能、別の原因で出てるエラーだろう。
再現性のあるコードをアップできるならしたほうが早いと思うよ。
470デフォルトの名無しさん:2008/07/12(土) 06:09:05
朝からすいません、スレッド以外で絞って調べて見ます。ありがとう
471デフォルトの名無しさん:2008/07/12(土) 11:58:23
>>462
俺の近所では一般的ではないみたい。結局のところインタフェースとなる
基底クラスのポインタか参照を用意する手間を厭わなければ何でもできる
ので、期待できるのは、うっかりミスを防止する程度じゃないかな。

あるいは、具象クラスで基底クラスと概念の異なるインタフェースを提供
して、そのクライアントには基底クラスのインタフェースを触らせない
という用途も考えられるけど、これは多重継承使えっていうサインかも。
472デフォルトの名無しさん:2008/07/12(土) 12:24:50
>>462
インターフェイスしか触らせたくないのなら、具象クラスのコンストラクタをプライベートにして、newできなくして、
ファクトリメソッドみたいので、作るようにすればいいんじゃね?
473デフォルトの名無しさん:2008/07/12(土) 14:18:49
>>471
>>472
ありがとうございます。
インターフェースしか触らせたくなかったらたしかにnewできなくするべきですね。

デザパタのオブザーバパターンのコールバック関数は
継承したクラスでprivateで持たせるのは一般的にどうなのでしょうか?

そのクラスは直接newして使うクラスなのでなるべく関係のない関数は
隠したいです。


474デフォルトの名無しさん:2008/07/12(土) 16:36:08
>>473
一般的かどうかは知らんが、俺なら callback を private にするな。
インタフェースは最小が気持ちいいしね。混乱・勘違いされるのが嫌なら
「なぜそうするのか」というコメントかメモを残せばいいでしょ。
475デフォルトの名無しさん:2008/07/12(土) 17:00:26
昔Cは関数呼び出しのとき、値渡しが原則で、参照の時は明示的にやるので
呼び出し側から、呼び出した結果引数の内容が気づかないうちに変更されている
危険がなくて安心、とかいう説明をきいた記憶があるのですが、C++は呼び出し
側から値渡しか参照渡しかわからない書き方ができるので、これは退化じゃない
かと思うのですが、違うんでしょうか?
476デフォルトの名無しさん:2008/07/12(土) 17:10:27
C++は、別にCの進化系言語ではない
477デフォルトの名無しさん:2008/07/12(土) 17:14:46
>>475
ポインタの値渡しと参照渡しがごっちゃになってる
constをつけておけば値を変更しないことを明示できるからそれを使うべし

というか気づかないうちに変更されてるって関数の説明くらい読めばいいのに
逆に説明の書いてないような怪しい関数は使わない方がいい
478デフォルトの名無しさん:2008/07/12(土) 17:16:01
C++についていけない猿人プログラマがそんなこと言うらしいな
479デフォルトの名無しさん:2008/07/12(土) 17:19:32
>>477
> というか気づかないうちに変更されてるって関数の説明くらい読めばいいのに
> 逆に説明の書いてないような怪しい関数は使わない方がいい
それはプログラムするときの心構えや良い習慣の問題であって、言語として問題を
起こしにくいつくりになっていれば、それに越したことはないのでは?
480デフォルトの名無しさん:2008/07/12(土) 17:32:38
そう言っても「C++はそうなってる」わけだしな
嫌ならDでも使えばいいよ。1.X系は仕様確定してるし
481デフォルトの名無しさん:2008/07/12(土) 17:39:28
「C++はそうなっている」で疑問に思わないようじゃ単なる思考停止だろ。
Dとか出してハク付くているつもりか知らんがプログラマとしては大成しないタイプだな。
C++の参照渡しがあの形になっているのは理由がある。
が、入門書とかでswap(a,b)みたいなので、Cに比べて便利になりました、みたいな説明
をしているのがあって、それは確かにバカじゃないかと思う。
呼び出し元をみただけで、変数が変更されるかどうかわかった方が便利だしミスが少な
くなるのはあたりまえ。
482デフォルトの名無しさん:2008/07/12(土) 17:44:09
ポインタが無くなればバグが減って解決ってことですね
483デフォルトの名無しさん:2008/07/12(土) 17:46:20
ポインタがないと作れないソフトがあるから、非常に困るw
484デフォルトの名無しさん:2008/07/12(土) 17:46:47
俺良く分からないけど思考停止だ大成しないと言うのは勝手だけども
じゃあ言語の文句をここで言っても意味が無いんじゃって思うんだ
485デフォルトの名無しさん:2008/07/12(土) 17:51:59
ポインタは便利だろ
C++になっても結構使うぞ
486デフォルトの名無しさん:2008/07/12(土) 17:52:10
まぁもっと問うのに適切な場所は色々あると思うが、
まず便所の落書きLVの場所で篩ってみるのも
迷惑度が下がってよいと思うよ。
487デフォルトの名無しさん:2008/07/12(土) 17:53:48
googleのC++のコーディングルールは、ロジック追えないから、例外禁止だったな。
488デフォルトの名無しさん:2008/07/12(土) 17:53:53
>>475
引数の値が変わらないことは、
大して重要なことではありません。

 char* p = f1();
 f2(p);
 free(p);

 int handle = open();
 close(handle);

Cではどのような関数であれ、
pやhandleの値自体が変わらないことは保証されます。

しかし、ポインタの先やその値に関して重大な影響を与えることはあり、
それは関数の仕様を知る以外に方法はありません。

そして、引数の型が参照かどうかを知るのも同様であるため、
退化というような新たな問題が発生したとは言えないのです。
489デフォルトの名無しさん:2008/07/12(土) 17:58:18
何するか知らない関数呼ぶとか普通ねぇしな
490デフォルトの名無しさん:2008/07/12(土) 18:01:00
>>485
> ポインタは便利だろ
> C++になっても結構使うぞ
バカだなあ。
ポインタ否定しているわけでもないし、C++の参照渡しを否定しているわけでもないぞ。
swap(a,b)みたいなので参照渡しを使うぐらいなら、C流に&a, &bで渡した方が分かり易
に決まってんじゃん。
C++で必要なはデストラクタとかでどうしても必要だからでしょ。
C#でこの問題がどう解決されているかとかも含め、いっぺん調べてみりゃいいのに。
491デフォルトの名無しさん:2008/07/12(土) 18:01:32
ポインタ・配列が分からない とCを投げる

VBでポインタ使えない・配列の勝手が悪い と投げる
492デフォルトの名無しさん:2008/07/12(土) 18:13:51
>>490
> C++で必要なはデストラクタとかでどうしても必要だからでしょ。

なんで、自信満々にバカ晒せるんだろう...

自分こそいっぺん調べてみりゃいいのに...
493デフォルトの名無しさん:2008/07/12(土) 18:15:43
#define swap(a,b) if(&a!=&b){ a^=b; b^=a; a^=b; }

呼び出し元だけじゃマクロか関数か区別のつかない
C言語(とC++言語)は駄目駄目ってことですね
494デフォルトの名無しさん:2008/07/12(土) 18:30:49
分かりやすいかどうかじゃなくって、C++とか外国人が作ったわけで
外国人から見ればこの記述法のやりやすいってだけの話で。

思考停止云々って馬鹿じゃねーの?できる範囲でできうる限りの事をするのがプログラマだろ。
C++で実装できなきゃアセンブラで書くしアセンブラで出来なきゃ0と1ででもプログラム書いてやるよ。
言語仕様の文句をつけてることで大成するんならご勝手にやってれば?
出来ない事があるからこそ、複数の言語扱えるようになればいいだけの話で
CにしろC++にしろ前提条件が「プログラマは、すごい人だからミスなんてしないよね!」っていう仕様になってるから
クソッタレな馬鹿は文句つけるしかできなくなる
495デフォルトの名無しさん:2008/07/12(土) 18:32:17
まさにそのとおりだ
496デフォルトの名無しさん:2008/07/12(土) 18:38:35
C++でポインタ使わずにポリモーフィズムやってみろよ
497デフォルトの名無しさん:2008/07/12(土) 18:42:03
参照でやればいいんじゃね
498デフォルトの名無しさん:2008/07/12(土) 19:01:00
参照はハードコーディングになるから用途が限られる
499デフォルトの名無しさん:2008/07/12(土) 19:05:01
サウンドの同期再生と非同期再生は何が違うんですか?
500デフォルトの名無しさん:2008/07/12(土) 19:42:06
たぶん、鳴り終わるまで待つのが同期じゃない?
501デフォルトの名無しさん:2008/07/12(土) 19:48:59
そもそもそれはC/C++とは関係ないよなw
502デフォルトの名無しさん:2008/07/12(土) 19:49:29
>>500
なるほど

>>501
わかってましたけど、サーセンw
503デフォルトの名無しさん:2008/07/12(土) 20:44:10
strtok_s関数で「\」を区切り文字とした場合、
「能」を含む文字列を正しく区切れないのですがなぜでしょうか?

char buf[1025]= "ほげほげ能ほげほげ";
char *sp, *nexttoken;
sp = strtok_s(buf, "\\", &nexttoken);
printf("%s\n", sp);

このようなコードを実行した場合、「ほげほげ・」と出力されます。

OSはWinXP Pro SP3、コンパイラはVisual Studio 2005 Proです。
Visual Studio関係の更新はWindows Updateからすべて適用してあります。
504デフォルトの名無しさん:2008/07/12(土) 20:50:21
>>503
「ダメ文字」でぐぐれ
505503:2008/07/12(土) 20:58:39
ダメ文字でググればよかったんですね。
ありがとうございます。
506デフォルトの名無しさん:2008/07/12(土) 21:03:28
ダメ文字からの解決は止めとけ・・・
内部はwchar_tを使うように。
507デフォルトの名無しさん:2008/07/12(土) 21:24:22
アクセス制御に関して質問なのですが、ファイル内のstatic変数にアクセスしたいときは以下でよろしいのでしょうか?
/* main.c */
#include <stdio.h>
#inlcude "main.h"
#include "sub.h"
static char szName[10];
void main()
{
strcpy( szName , "TEST" );
showName();
};
const char* getName( )
{
return (const char*)szName;
}
/* main.h */
const char* getName();
/* sub.c */
#include <stdio.h>
#include "sub.h"
void showName()
{
printf( "%s\n" , getName() );
}
/* sub.h */
void showName();
508デフォルトの名無しさん:2008/07/12(土) 21:32:40
まず、
「どう考えてもstatic変数を使うべき所だろう」というとき以外は
static変数を使うのを止めましょう。
509デフォルトの名無しさん:2008/07/12(土) 21:37:57
なんかみんなconstとかでえらそうなこと言ってるけど
>>453には誰も答えられないの?
みんなVCですか。そうですか。
ここはそんなレベルですか。
510デフォルトの名無しさん:2008/07/12(土) 21:41:29
>>453
変えても関数の外にはなんら影響しないだろ
511デフォルトの名無しさん:2008/07/12(土) 21:41:58
>>509
単に読まれてないだけだろ。そう怒るな。
512デフォルトの名無しさん:2008/07/12(土) 21:44:26
>>507
こんな感じで。 ※各ヘッダにはインクルードガードを。
/* app.h */
  struct App {
    char szName[10];
  };
/* main.h */
  #inlcude "app.h"
  const char* getName(App* app);
/* sub.h */
  #inlcude "app.h"
  void showName(App* app);
/* main.c */
  #include <stdio.h>
  #inlcude "main.h"
  #include "sub.h"
  void main() {
    App app;
    strcpy( app.szName , "TEST" );
    showName(&app);
  };
  const char* getName(App* app){
    return (const char*)app->szName;
  }
/* sub.c */
  #include <stdio.h>
  #inlcude "main.h"
  #include "sub.h"
  void showName(App* app){
    printf( "%s\n" , getName(app) );
  }
513デフォルトの名無しさん:2008/07/12(土) 21:54:23
>>453
>char *const argv[]
こういう引数ってキモイよな。char**の方が読みやすいし。
constつけるなら
  const char* const * argv
だな。

const付いてないなら書き換わるかも、と考えた方が良いと思うぜ。
select()のtimeout書き換えみたいな糞実装もあることだし。
514デフォルトの名無しさん:2008/07/12(土) 21:55:50
>>509
んー、たしかに const char const *argv[] でないのは不思議ですね。
515デフォルトの名無しさん:2008/07/12(土) 22:02:26
システムコールにはよくあること・・・
WinAPIのCreateProcessも引数のコマンドライン文字列がconstでなく、
しかもマジで書き換えてくる
516デフォルトの名無しさん:2008/07/12(土) 22:02:47
>>510,511,513
煽ってごめんな。ありがとう。

>>511
「関数の外になんら影響しないように」すれば何の問題もないのは確かなんだけど、
なぜそうなってるのか?が疑問なんです。

>>513
の言うとおり書き換わると思ったほうが良いんだろうけど
なぜ書き換わるようにしているのか?
が気になってるといったほうが質問が適切ですね。

select()のtimeout書き換えは確かに糞実装だけどやりたいことはわかるし、
それと似たような理由がexecv()にもあるんですかね?
517デフォルトの名無しさん:2008/07/12(土) 22:04:54
その関数を考えた人間じゃないからわからない
プログラムはその人のアルゴリズムで書かれてるから何をしているかは理解できても
どうしてそうなっているかは、その人でなければ理解できん
518デフォルトの名無しさん:2008/07/12(土) 22:13:06
>>517
アルゴリズムをなぜそうしたかは、確かに書いた人しかわからないけど、
こういうシステムコールのAPIの引数が実装者にしかわからないってありえないと思うんですよね。

何か理由があるんではないか?と思ってしまうのです。
まあその理由が、
・単純にこうしたほうが処理が速いとか実装が楽
レベルなのかもしれませんけど。
519デフォルトの名無しさん:2008/07/12(土) 22:14:17
manに書いてない以上、理由を知るのは難しいね。
const付け忘れとか、スペルミスとかも普通に残っていくし。
520デフォルトの名無しさん:2008/07/12(土) 22:17:18
creat w
521デフォルトの名無しさん:2008/07/12(土) 22:26:46
http://en.wikiquote.org/wiki/Kenneth_Thompson

If I had to do it over again? Hmm... I guess I'd spell 'creat' with an 'e'. (On the design of Unix)

wwww
522デフォルトの名無しさん:2008/07/12(土) 23:44:12
初心者の素朴な疑問でこんな風に荒れるとはさすがプログラム板だな(w

Cだと実引数でfoo( &x )という書き方で参照渡しできるのに、C++だと
なぜわざわざ仮引数側でfoo (int& x)なんて書き方をして、呼ぶ側は
foo( x )とするんだろう、呼ぶ側でも区別つけた方がいいんじゃない、
というのはなかなかいい質問だと思うんだが。

「C++はそういうものだから仕方ない」は思考停止とまでは呼ばないけ
ど、ちょっと笑って、どこか悲しくなったのは確かだなあ。処世術と
してはそれが正しいんだろうね。いちいち悩むな、どうせ自分じゃ世界
は変えられない、与えられたものにいちいち疑問を持つな、みたいな
諦念みたいなものが感じられて(w

#一つ煽ると、誰もちゃんと説明できないのに笑った。
#初心者歓迎、じゃなくて、初心者しかいないのね(w
523デフォルトの名無しさん:2008/07/12(土) 23:45:50
// ここまで説明無し
524デフォルトの名無しさん:2008/07/12(土) 23:47:08
>>489
> 何するか知らない関数呼ぶとか普通ねぇしな
あなたみたいな優秀なプログラマばっかりだったらきっとカプセル化とかprivateメンバと
とかめんどくさいこと考えずにすんだんだろうね。
いや、皮肉じゃなくて。
525デフォルトの名無しさん:2008/07/12(土) 23:49:43
>>494
> 分かりやすいかどうかじゃなくって、C++とか外国人が作ったわけで
> 外国人から見ればこの記述法のやりやすいってだけの話で。
これ最高だな。爆笑した。
「外国人が作ったから」
俺も次回から全部これで説明することにするよ。
526デフォルトの名無しさん:2008/07/12(土) 23:50:16
>>523
コンパイルエラーでました><
527デフォルトの名無しさん:2008/07/12(土) 23:55:53
>>525
>>494はその説明でいいけど、君はどうも使いどころが理解できてなさそうだから
たぶん恥をかくだろうね。
528デフォルトの名無しさん:2008/07/12(土) 23:57:57
>>522
> Cだと実引数でfoo( &x )という書き方で参照渡しできるのに、C++だと
> なぜわざわざ仮引数側でfoo (int& x)なんて書き方をして、
こんな馬鹿なことを書いちゃう程度の理解力だから、「なかなかいい質問だと思」っちゃったんでしょうね。
529デフォルトの名無しさん:2008/07/13(日) 00:03:19
C++0xのガーベジコレクションは結論出てないけど、C++/CLIみたいな記述にしてほしいな
C++/CLI自体は、歴史の闇に葬っていいけどw
530デフォルトの名無しさん:2008/07/13(日) 00:06:24
>>527
494はちょっとどうかと思ったけど。
あれって説明なの?
531デフォルトの名無しさん:2008/07/13(日) 00:07:45
>>528
俺もいい質問だと思うけど何がダメなの?
532デフォルトの名無しさん:2008/07/13(日) 00:08:57
>>530
525は説明だと思ったみたいだね。
533デフォルトの名無しさん:2008/07/13(日) 00:09:26
>>524
どうして、コロンとドットなのかとか考えたか?
コロンとドットは日本語て言う所の、句読点に相当するのよ。
「あなたにとって最適化されたプログラム言語」ではなく広義では外国人が。
狭義では「C++を作った人にとって最適化されたプログラミング言語」なんだよ。
534デフォルトの名無しさん:2008/07/13(日) 00:10:05
IDがないと、自作自演かもとおもってしまうよn(ry
535デフォルトの名無しさん:2008/07/13(日) 00:13:51
初めてC++を勉強したら疑問を持つのは悪いことじゃないと思うけどな
そんなに許されない質問なのかな>C++の参照
というか何故かわからないので誰か分かりやすく説明して下さい
初心者でスミマセン
536デフォルトの名無しさん:2008/07/13(日) 00:14:44
意見に意見をぶつけたい人はID無くても気にならないけど、
とにかくただ対立したいだけの困ったちゃんは、誰が書いてるか気になるのかな。
537デフォルトの名無しさん:2008/07/13(日) 00:15:29
自分で自分の意見に同意して多数派のフリする奴っているからなぁ
538デフォルトの名無しさん:2008/07/13(日) 00:18:11
えぴすてーめーの本でも読んでろ、アホ自演。
間違いとかじゃくて、C++とか作った人間が自分に適したように作っただけの
話。本当のプログラマは呼び出し側の変数が変わるなんて注意は当然している。
そんなのも理解できないような奴はVBでもやってろ。
そういう仕様だからそれにあわせるのは当然。
539デフォルトの名無しさん:2008/07/13(日) 00:22:22
ここは初心者にきびしいスレですね
540デフォルトの名無しさん:2008/07/13(日) 00:25:19
どうだろう、デカイ態度の初心者がいると厳しくなるのは、人として普通だと思われ。
541デフォルトの名無しさん:2008/07/13(日) 00:53:09
C#は呼び出し側でもref付けて区別しているんだよな。
これはきっとプログラマを信用してないってことなんだろうね。C++は真のプログラマ
向け言語だからいちいちそういう余計なタイプはさせないという点で優れている。

constの複数の意味とかちょっと考えればすぐわかるようなことを区別するのにいち
いちプログラマに負担掛けないのがC++のいいところなのにわけのわからないことを
書くからきつい反応されるんだろ。
わかんねえ奴はC#でもJavaでも使ってりゃいいんだよ。
542デフォルトの名無しさん:2008/07/13(日) 00:59:55
言語には相反する方向性がある。
1つは、コンピューターを効率よく動かそうとする言語(その分プログラマーに負担を)
2つに、プログラマーのミスを少なくしよう、プログラマーに優しくしよう(その分コンピューターに負担を)
1の代表に、アセンブラ、C、Cから継承されたC++
2にJava、C#、純粋関数型言語等

この二つは、根本的に設計思想が違うのです。
543デフォルトの名無しさん:2008/07/13(日) 01:06:11
何も知らないから、何から聞けばいいのかわからないのはしょうがないでしょ?
何で聞いたらダメなの?調べろ?どこでどうやって調べればいいかわからないから、
専門的なことを良く知っているあなたに聞いてるんでしょ?
検索しろっていうけど、自分で調べるより知ってる人から教えてもらった方が早いし、
ちゃんとわかるまで繰り返し聞けるじゃん。いざとなったら代わりにやってもらうことも
可能だし。

こっちは何も知らない素人なんだから、わからないのはしょうがないでしょ?
ちょっと知ってるからって、素人を馬鹿にしたような言い方は正直ムカツク。
レベルが低いとか、話が通じないとか、単語が分からなくていちいち説明しなきゃ
ならないのかよめんどくさいとか、そんなこというけど自分だって最初は何も
知らなかったわけでしょ?態度悪いし感じ悪いね。

確かにこっちは何もわかってないかもしれないけど、一応要望だけは伝えておかなきゃ
あとで後悔するのも嫌だし。勝手に何でもかんでもやった挙句、高いお金かけてたら、
いくらなんでも引くって。ある程度の出費は覚悟してるけど、こっちにも限度ってものが
あるんだから。

信用してないわけじゃないけど、信用してるから頼んでるんだし。お願いする立場だけど
そっちもちゃんと考えてほしい。

そっちがコンピューターに詳しくて、実力もあるってのはちゃんと分ってるから、
別に疑ってないから、ちゃんと性能がよくてお金のかからないパソコンを組んで。




これが素人の言い分です。
544デフォルトの名無しさん:2008/07/13(日) 01:14:14
バカの壁…
545デフォルトの名無しさん:2008/07/13(日) 01:16:33
>>543
素人の分際で知らないモノを教えてくれる人にムカツクだの感じ悪いだの大層なご身分だな
546デフォルトの名無しさん:2008/07/13(日) 01:17:00
>>524
カプセル化もprivateメンバもする、それだけでなく
メンバ関数の説明も書くし、読む

お前はクラス名や関数名、引数名だけで
勝手に仕様を想像して使いそうだけどな
547デフォルトの名無しさん:2008/07/13(日) 01:17:22
>>543
っ教えてgoo
548デフォルトの名無しさん:2008/07/13(日) 01:20:43
>>543
そんな泣き言を言っている時点で2chに向かないから、もっと大人になってから来ましょう。
549デフォルトの名無しさん:2008/07/13(日) 01:21:44
543は「素人はこういう言い分で話をする」と言う例でしょ
550デフォルトの名無しさん:2008/07/13(日) 01:23:22
コピペされたものであると理解できぬ程
住人の判断力を奪うとは何という破壊力。
551デフォルトの名無しさん:2008/07/13(日) 01:25:12
関数の仕様変えたとき(主に開発途中)に呼び出し側のコード変えなくてすむのが便利だったからとかじゃないの?
552デフォルトの名無しさん:2008/07/13(日) 01:33:56
>>543
テンプレwww
553デフォルトの名無しさん:2008/07/13(日) 01:42:19
「言語仕様に文句つけても意味が無い」とよく言われるが、一人でブツブツ愚痴ってるならともかく、
こういう大勢と対話ができる場所で不満を発することには少なからず意味があるだろう。
不満がもっともなものであるならば、それはその言語の弱点であり、弱点を把握することは周りの人間にも有益なこと。
もし不満が筋違いなものであっても、では何故そのような仕様になっているのかという本当の理由を、
詳しい人間に教えてもらえる。その情報もきっと周りの人間にとって有益なものであるはず。
「黙って使ってりゃいい」って、そっちの方が何も生み出さないだろうと。
554デフォルトの名無しさん:2008/07/13(日) 01:51:46
>>543はテンプレにしてもいいんじゃないか?w
555デフォルトの名無しさん:2008/07/13(日) 01:54:32
納得できねーという奴がいるから新しい言語が生まれる
「黙って使ってりゃいい。気に入らなきゃ自分で作れ」って方が何かを生み出しそうでしょ?
556デフォルトの名無しさん:2008/07/13(日) 01:58:57
>>555
何が言いたいんだお前は。
557デフォルトの名無しさん:2008/07/13(日) 01:59:36
> ちゃんと性能がよくてお金のかからないパソコンを組んで。
なぜこの文が入ってるか分からないが、素人が仕事として依頼する場合に
「ちゃんと性能がよくて」を聞きだすのに非常に時間がかかる。そしてその分を請求
項目に含むのは当然では?
要求仕様が明確であればその分浮くのか?という疑問もわくだろうが、その場合、
玄人から見た観点での改善案も出てくるだろうと思うんだ。
メモリは1Gがいい!→512*2の方が速いっすよ。けど拡張性はさがるっす。どうするっすか?
みたいな。
558デフォルトの名無しさん:2008/07/13(日) 02:06:19
>>555
納得と理解を混同している輩にそんな事言われても
559デフォルトの名無しさん:2008/07/13(日) 02:09:18
なんか意味不明な事言ってしまった
560デフォルトの名無しさん:2008/07/13(日) 02:09:40
クラスの型変換演算子?ってなんか嫌われてる気がするけど、逆にどういう時なら使うべき?
561デフォルトの名無しさん:2008/07/13(日) 02:11:19
型変換て全く違う型に?
562デフォルトの名無しさん:2008/07/13(日) 02:53:32
別な型を一意に扱いたいときとか。
まぁ大抵型変換演算子使わなくても別な方法があると思うが。
563デフォルトの名無しさん:2008/07/13(日) 03:23:43
で結局C++の参照呼出しが今の形になった理由はなんなの?
564デフォルトの名無しさん:2008/07/13(日) 03:34:50
過去ログ読め
565デフォルトの名無しさん:2008/07/13(日) 08:51:27
クラスの型変換演算子?
dynamic_castのことか?
具象クラス固有の機能とか使いたい場合など
ダウンキャストで使う
まぁその時点であまり設計的によろしくないのかも

クラスを別な型に???
>>562は何言ってんの?www
566デフォルトの名無しさん:2008/07/13(日) 08:52:14
>>553
だったら、次々期C++に入れてもらえるように標準化委員会に送ってくればいいだけの話だろ?
567デフォルトの名無しさん:2008/07/13(日) 09:05:12
C++勉強するのにいい本があったら教えてください
568デフォルトの名無しさん:2008/07/13(日) 09:54:07
BOOL flag = 0;
BOOL flag2;
void CRS232C_TESTDlg::OnBnClickedstart(){
if(flag == 0){
flag = 1;
flag2 = 0;
AfxBeginThread(drawData::DrawThreadFunction, this, THREAD_PRIORITY_LOWEST);
}else{
flag = 0;
flag2 = 1;
}
}

extern BOOL flag;
extern BOOL flag2;
UINT drawData::DrawThreadFunction(LPVOID pParam){
flag2 = 0;
while(flag2 == 0){
//処理
}
}

これがどうしてもスレッドとまりません、どこがおかしいのかブレークポイントを両方につけてゆっくり確認しながら進めると止まるんですが
ブレークポイントを入れないとなぜかflag2が1にならないんです。どういうことでしょうか?
569デフォルトの名無しさん:2008/07/13(日) 10:04:22
もりあがってんなあw

>>563
結構有名な話だが、C++の参照渡しはオーバーロードされた
演算子をすっきりした記述で書くために導入された。

もし参照が無ければ、

operator = なら

a = b; と書くところ(aが変更される)を、 &a = b; とかって書かない
といけなくなるだろ。式としての記述のスマートさを維持するには、
単に「a」と書いてaを変更することが可能なルールが必要だった
んだよ。

通常の関数では参照と値渡しの区別が出来ないので
関数内で値を変更するためには参照は使用すべきではない。

演算子なら式のどの部分が変更されるかというのは、ほとんど
の人が「算数的」なルールを共有しているから問題はおきにくい。

それなら参照は演算子オーバーロードだけに限定すればいいん
じゃないかという声もありそうだが、C++は一貫性、一般化を極力
重んじるから、これだけ特別、というふうにはならなかったようだ。

D&Eに参照渡しの導入経緯はちょこっと記述があったよ。
570デフォルトの名無しさん:2008/07/13(日) 10:10:24
>>568
プログラム以前の問題だが、

>CRS232C
誰が書いたか分かるような情報をそのまま書いてしまうことが
気にならないのかい?
571デフォルトの名無しさん:2008/07/13(日) 10:15:51
>>568
原因はわからんけどフラグの変数にvolataileをつけてみるか、それでもだめだったら、
素直に同期オブジェクトを使うとか。
572デフォルトの名無しさん:2008/07/13(日) 10:25:53
>>570
もう1週間ぐらいこれやってるんでそろそろ恥ずかしくなってきましたw

volataile、同期オブジェクト調べてみます。ありがとうございます。
573デフォルトの名無しさん:2008/07/13(日) 10:33:17
つづりが間違ってた。 volatile だ。
574デフォルトの名無しさん:2008/07/13(日) 10:35:14
とりあえずx86系のwindows限定ならvolatileで対処できるはず。
IA-64とか他のOSへの移植とか言い出すともっとややこしくなる。
575困り熊:2008/07/13(日) 10:47:15
お初にお目にかかります。
4月から大学でC言語を始めたのですが、課題に四苦八苦しています。
どなたか助言していただけると助かります。

課題 文字列検索の関数の作成
形式 char StrStr(char *s1 char *s2)
機能 文字列s1の中で文字列s2と同じ並びの最初の出現に位置づけする。
返却値 文字列が発見できなかった→NULL、発見できた→位置づけられた文字列のポインタ

ロジックもいまいち浮かんでこないので手が付けられません。。。
576デフォルトの名無しさん:2008/07/13(日) 10:52:27
>>575
文字処理のロジックというのは案外地道なもので1文字づつ丹念に調べてゆくのが基本。
577デフォルトの名無しさん:2008/07/13(日) 10:57:41
回答だけがまるまる欲しいなら宿題スレへ。
ただし先生がスレをチェックしてることがあるから丸写しは要注意な。
578困り熊 ◆JW6hbMJs/s :2008/07/13(日) 11:00:20
>>576
一応、文章に落としてからソースを考える作業を行っているんですが、どうもうまくいきません。
この質問に相応しいスレがあったのでそちらに移動します。
スレ汚してしまい申し訳ありません。
579デフォルトの名無しさん:2008/07/13(日) 11:10:47
C++のtry..catch..構文にfinallyは無いのでしょうか?
580デフォルトの名無しさん:2008/07/13(日) 11:11:35
文章に落としてるならそれをアップするといいよ。
そういうのはスレ的に全然OK。
581デフォルトの名無しさん:2008/07/13(日) 11:14:26
C++しかしらないからよくしらんけど
二重のfor文とif文組み合わせりゃいけると思うんだが・・・。
582デフォルトの名無しさん:2008/07/13(日) 11:18:29
分かりやすいかどうかじゃなくって、C++とか外国人が作ったわけで
外国人から見ればこの記述法のやりやすいってだけの話で。

思考停止云々って馬鹿じゃねーの?できる範囲でできうる限りの事をするのがプログラマだろ。
C++で実装できなきゃアセンブラで書くしアセンブラで出来なきゃ0と1ででもプログラム書いてやるよ。
言語仕様の文句をつけてることで大成するんならご勝手にやってれば?
出来ない事があるからこそ、複数の言語扱えるようになればいいだけの話で
CにしろC++にしろ前提条件が「プログラマは、すごい人だからミスなんてしないよね!」っていう仕様になってるから
クソッタレな馬鹿は文句つけるしかできなくなる
583デフォルトの名無しさん:2008/07/13(日) 11:20:02
char* StrStr(char *s1 char *s2)
{
if (*s1 == '\0')
return NULL;
if (strncmp(s1, s2, strlen(s2) == 0)
return s1;
return StrStr(s1 + 1, s2);
}
584デフォルトの名無しさん:2008/07/13(日) 11:20:29
休日だね。いい天気だ・・
585デフォルトの名無しさん:2008/07/13(日) 11:21:20
>>583
strncmpの閉じ括弧が抜けてた。
586デフォルトの名無しさん:2008/07/13(日) 11:23:30
末尾再帰の最適化をやってくれるコンパイラを探さなくては
587デフォルトの名無しさん:2008/07/13(日) 11:43:33
>>579
無い。C++では、finallyより優れたRAIIを使う。
つまりはデストラクタ。
588デフォルトの名無しさん:2008/07/13(日) 11:49:46
stringコンテナの中身をprintfで表示させる方法について

#include<stdio.h>
#include<string>
using namespace std;
int main(){
string a;
a="test";
printf("%s",a);

return 0;
}

こうすると(null)と表示されてしまいstringの中身が表示できません。
cout使えと言われそうですがライブラリの仕様上使えないのです
589デフォルトの名無しさん:2008/07/13(日) 11:52:47
>>588
a.c_str()
590デフォルトの名無しさん:2008/07/13(日) 11:55:32
>>589
できました。ありがとうございました
591デフォルトの名無しさん:2008/07/13(日) 11:58:19
>>587
ありがとうございました
592デフォルトの名無しさん:2008/07/13(日) 11:59:48
>>593
ありがとうございました
593デフォルトの名無しさん:2008/07/13(日) 12:00:57
>>592
いえいえ、こちらこそ
594デフォルトの名無しさん:2008/07/13(日) 12:03:13
>>693
おととい来やがれ
595デフォルトの名無しさん:2008/07/13(日) 12:05:23
参照についてこれだけのレスがあって、まともな回答は>>569のみ。
普段大口叩いてる奴らが実はいかに無能だったかがよくわかるな。
596デフォルトの名無しさん:2008/07/13(日) 12:06:57
>>595
ありがとうございました。お帰りはあちらです。
597デフォルトの名無しさん:2008/07/13(日) 12:28:51
>>595
参照が出来た理由を聞いてたの?

>これは退化じゃないかと思うのですが、違うんでしょうか?
という質問だから、退化じゃないよと答えたけど。

C++は何故参照なんて機能を用意したの?って聞いてれば
おそらくは、俺含め何人か答えてたんじゃない?
598597:2008/07/13(日) 12:30:34
補足。デメリットのこと話してると思ったんで。
599デフォルトの名無しさん:2008/07/13(日) 12:35:10
要するに質問の真意すら汲み取れない読解力false揃いか。
退化だと思ってるからそういう質問が出る、じゃあ退化でないと言うなら理由を聞かねば納得いかない。
その程度の流れもわからないのか。
600デフォルトの名無しさん:2008/07/13(日) 12:38:57
>>597
> >これは退化じゃないかと思うのですが、違うんでしょうか?
> という質問だから、退化じゃないよと答えたけど。

それって、やりとりに対してその範疇でしか受け答えしない、
典型的な仕事できない人間じゃないかw

わざとやってるんだろうけどなー
601デフォルトの名無しさん:2008/07/13(日) 12:42:58
>>600
仕事の話と初心者の質問を一緒にされてもね・・・w
あなたが手取り足取り教えてあげてはどうですか?

ちなみに部下の教育では、答え自体は教えずヒントを与えるだけに留めてますが。
602デフォルトの名無しさん:2008/07/13(日) 12:46:09
>>599
聞くしか能の無い初心者なのに態度でかいんじゃね?
603デフォルトの名無しさん:2008/07/13(日) 12:50:55
俺は演算子オーバーロードの為だと思ってたけど

ていうかC++の設計と進化とかその辺読めよ
604デフォルトの名無しさん:2008/07/13(日) 12:52:19
悔しいからって>>602みたいな中身の無い反応は更にアホっぽいぞ^^
605デフォルトの名無しさん:2008/07/13(日) 12:52:50
3.7 リファレンス
606デフォルトの名無しさん:2008/07/13(日) 12:54:20
>>604
低脳涙目だなw
607デフォルトの名無しさん:2008/07/13(日) 13:05:58
>>601
あなたは自分自身の邪悪さに心が痛む時がありませんか?
608デフォルトの名無しさん:2008/07/13(日) 13:08:33
キチガイ警報

お前らいい加減レスすんな
609デフォルトの名無しさん:2008/07/13(日) 13:10:38
610デフォルトの名無しさん:2008/07/13(日) 13:11:41
読解力falseの意味が分かりません、これは言語の退化ではないでしょうか?
611デフォルトの名無しさん:2008/07/13(日) 13:13:19
おまえがな。小学生どころか3歳からやり直せ
612デフォルトの名無しさん:2008/07/13(日) 13:18:39
読解力false
ワラタ
リアルでもこんな言葉つかってんのかな
613デフォルトの名無しさん:2008/07/13(日) 13:42:58
そんな感じの芸人居たよなと思って
10分近くググってやっとルー大柴の名前思い出せた

あっちはウケ狙いでやってるんだろうけど
614デフォルトの名無しさん:2008/07/13(日) 14:03:40
>>565
operator T()のことだろう。
わかってなかったの多分お前だけだし、>>562はそのものズバリの回答だぞ。
615デフォルトの名無しさん:2008/07/13(日) 14:56:52
ゲームパッドに対応したゲームを作成したいのですが、
入力したキーやボタンを取得して、対応した処理にディスパッチする基本的コーディング方法を分かり易く解説した
おすすめのホームページを教えてください。
616デフォルトの名無しさん:2008/07/13(日) 15:05:07
ディスパッチって何?
617デフォルトの名無しさん:2008/07/13(日) 15:06:15
dispatch
618デフォルトの名無しさん:2008/07/13(日) 15:12:08
619デフォルトの名無しさん:2008/07/13(日) 15:59:54
いくつカタカナ使ってんだよ
620デフォルトの名無しさん:2008/07/13(日) 16:03:48
>>618
そこの何所がわからないのよ?
621デフォルトの名無しさん:2008/07/13(日) 16:09:59
>>615にディスパッチとは何か解説して欲しい
622615:2008/07/13(日) 16:13:41
>617 >621 処理を振り分けるようなイメージだよ。
C言語ではあまり使わないのかな? ちなみに自分はJavaメインでWeb系システム構築時によく使うよ。

で、ゲームパッドを使用したプログラムを開発するにあたり、参考になるHPはないの?
623デフォルトの名無しさん:2008/07/13(日) 16:17:47
Windowsのメッセージディスパッチだろう。

>>615
このスレは環境依存可だけど、Win32スレの方がいいかもよ。
624デフォルトの名無しさん:2008/07/13(日) 16:18:39
>>622
C/C++では、あまりディスパッチと言う表現は使わないね。
どちらかと言えば、スレッド、マルチスレッド、cellでのプロセスパイプ、等かな。
625デフォルトの名無しさん:2008/07/13(日) 16:19:37
>>624に追加、Windowsのメッセージディスパッチも有った。
626623:2008/07/13(日) 16:20:39
Windowsのメッセージディスパッチとは限らないか。
それはともあれゲームスレで聞いた方がよさそう。
627デフォルトの名無しさん:2008/07/13(日) 16:20:58
ダブルディスパッチパターン
628デフォルトの名無しさん:2008/07/13(日) 16:23:19
>>627
確信犯はだめよw
Modern C++ Designだよね。あれは使いどころが難しそうだな。
629デフォルトの名無しさん:2008/07/13(日) 16:24:54
>>615
ちかごろの事情はあんまりわかんねえんだけど、
Windowsの話なら最近はDirectInputが破棄されてXInputを使うのが推奨されてる。
630デフォルトの名無しさん:2008/07/13(日) 16:56:02
>>624
> スレッド、マルチスレッド、cellでのプロセスパイプ、

どう見てもディスパッチとは関係ないと思うが。
631デフォルトの名無しさん:2008/07/13(日) 17:00:29
>>632
解決しました
ありがとうございました
632デフォルトの名無しさん:2008/07/13(日) 17:00:59
4byteのクラスをnew演算子で250000個確保したところ、
タクスマネージャで確認した範囲で、メモリを15580KBを消費しました
なぜ16倍も消費しているのでしょうか?
boost::poolで確保した場合は、計算どおり1MBくらい消費しました
633デフォルトの名無しさん:2008/07/13(日) 17:05:39
>>632
> 4byteのクラスをnew演算子で250000個確保したところ、
このコード貼れる? そんなに長くないよね。
634デフォルトの名無しさん:2008/07/13(日) 17:06:16
>>597
> 参照が出来た理由を聞いてたの?

> C++は何故参照なんて機能を用意したの?って聞いてれば
> おそらくは、俺含め何人か答えてたんじゃない?

お前、自分の間違いを認めるのがよっぽど嫌いみたいだな。
どんだけ屁理屈だよ。
635デフォルトの名無しさん:2008/07/13(日) 17:06:54
管理領域
636デフォルトの名無しさん:2008/07/13(日) 17:07:30
とアラインメント
637デフォルトの名無しさん:2008/07/13(日) 17:09:08
>>601
> >>600
> 仕事の話と初心者の質問を一緒にされてもね・・・w
> あなたが手取り足取り教えてあげてはどうですか?
なにお前はこのスレで頭悪いのを披露するのが仕事だったの(w
てっきり初心者とかの質問に答えるスレだと思ってたよ。俺は。
638デフォルトの名無しさん:2008/07/13(日) 17:09:20
>>632
自分でnewの中身(つーかmallocだな)書くこと考えてみな。
何でか想像つくだろ。
boost::pool は要するに new CHoge[250000] なんじゃねーの?
639デフォルトの名無しさん:2008/07/13(日) 17:10:48
>>632
64バイト荒いんで確保する仕様なんじゃね?
640デフォルトの名無しさん:2008/07/13(日) 17:11:57
解決しました
ありがとうございました
641デフォルトの名無しさん:2008/07/13(日) 17:13:09
>分かりやすいかどうかじゃなくって、C++とか外国人が作ったわけで
>外国人から見ればこの記述法のやりやすいってだけの話で

少なくとも、こんなこと言っている奴が人にものを教えちゃだめだろ。
外国人が考えたから仕方ないのです、って何時の時代の人だよ?
642デフォルトの名無しさん:2008/07/13(日) 17:13:17
お前誰だよ
643デフォルトの名無しさん:2008/07/13(日) 17:14:03
引数でポインタ渡しだとヌルポがくる可能性あるけど
参照渡しなら変なことしない限りヌルポにならないから便利。
644デフォルトの名無しさん:2008/07/13(日) 17:14:06
>>633
class CA{
public:
long x;
CA(){x=0;}
CA(long a){x=a;;}
};

int const NUMS=500;
main(){
CA *x[NUMS][NUMS];
getchar(); //ここで消費メモリ2340k
cout << sizeof(CA); //"4"と表示される
for(long i=0;i<NUMS;++i){
for(long j=0;j<NUMS;++j){
x[i][j]=new CA(i);
}
}
getchar(); //ここで消費メモリ18160K
for(long i=0;i<NUMS;++i){
for(long j=0;j<NUMS;++j){
delete x[i][j];
}
}
getchar(); //ここで消費メモリ2580k
}
645デフォルトの名無しさん:2008/07/13(日) 17:14:55
646デフォルトの名無しさん:2008/07/13(日) 17:17:47
>>635
ちなみに空き領域だけに管理情報を書く実装も
あるので管理領域というのは間違い

アロケート後の領域はアロケータの管理外になる
647デフォルトの名無しさん:2008/07/13(日) 17:20:03
粘着キチガイまだ居るのか・・・
648デフォルトの名無しさん:2008/07/13(日) 17:21:45
匿名掲示板でお前誰だよと訊く馬鹿
649デフォルトの名無しさん:2008/07/13(日) 17:23:09
俺だよ俺
650デフォルトの名無しさん:2008/07/13(日) 17:23:29
>>646
おまえはfree(p)するときにpの領域の指すサイズがわかるのかよ。エスパーか。

ていうか、「偉そうな書き方」「age」という、知ったかの典型な野郎だな。
651デフォルトの名無しさん:2008/07/13(日) 17:24:10
デストラクタの中で例外発生させてはいけないのはなぜでしょうか?
また、やむを得ず例外発生する関数を使ってしまった場合、
具体的にどのような対策を採れば良いのでしょうか?
652デフォルトの名無しさん:2008/07/13(日) 17:24:15
>>646
じゃあアロケート後の状況を管理するための情報を保持する
メモリーのことは何というのか?
653デフォルトの名無しさん:2008/07/13(日) 17:25:41
>>650
*(p-1)とか*(p-2)あたりに管理情報置いてるallocatorもある
654デフォルトの名無しさん:2008/07/13(日) 17:26:07
>>646
とりあえず、その「例」を挙げてくれよ。

あ、特定サイズに限定してのpoolでの利用時、ってのはナシな。
それじゃサイズ情報が固定になっちゃうから。
655デフォルトの名無しさん:2008/07/13(日) 17:26:48
>>643
自分もそう思って参照を使ってるけど、
最近ではポインタの方がいいかなと思い始めてる。
利用時に見た目で区別できた方が保守性が上がりそうだから。

ポインタとヌルポの扱いが悩ましくなるけど、皆どうしてる?
自分は、ヌルポは指定不可とドキュメントに書いてアサートしてる。
(privateメンバ関数はもちろん、publicメンバ関数でも)
NULLの場合にはFALSEを返したり例外を投げる方がよいという意見もあるだろうけど、
ドキュメントとアサートで十分な気がしている。
656デフォルトの名無しさん:2008/07/13(日) 17:27:15
>>644
&x[0][0] と &x[0][1] の差を出してみ。
それでなんとなくわかるべ
657デフォルトの名無しさん:2008/07/13(日) 17:27:48
>>653
だから『*(p-1)とか*(p-2)あたりに管理情報』は管理領域じゃないのか?
658デフォルトの名無しさん:2008/07/13(日) 17:28:00
>>653
バカかお前は。
それは「管理領域として消費しているメモリ」そのものだろ。
659デフォルトの名無しさん:2008/07/13(日) 17:29:33
>>651
例外を投げない宣言をするといい
~Hoge() throw() { fuga(); }
それでも投げられてしまったら
void unexpected() が呼ばれるが
std::set_unexpected(unexpected_hander);
とかで自前のものに変更可能
660デフォルトの名無しさん:2008/07/13(日) 17:29:43
>>644
デバック版とリリース版で変わる?
661デフォルトの名無しさん:2008/07/13(日) 17:29:52
>>653
ワロタw
管理領域って何だと思ってたんだよw
662デフォルトの名無しさん:2008/07/13(日) 17:33:05
>>651
デストラクタでtry〜catchして食べちゃえばいい。

理由は↓
http://cppemb.blog17.fc2.com/blog-entry-31.html

663デフォルトの名無しさん:2008/07/13(日) 17:33:43
>>655
真実に気づき始めてるみたいだから後押しするが、参照で渡したい
ものはパラメータへの積み込みにコストがかかり(つまりでかい)
中で書き換えが発生しない場合に限った方が良い。

NULLポインタ禁止はドキュメントで十分だが、その辺は
好きにしていいと思う。
664デフォルトの名無しさん:2008/07/13(日) 17:34:58
>>651
ちなみにコンストラクタから例外を投げていいかどうかは賛否両論あるね。
賛成派が多い感じがするけど。
665デフォルトの名無しさん:2008/07/13(日) 17:35:07
>>655
> 利用時に見た目で区別できた方が保守性が上がりそうだから。
こんなこと書いている段階で駄目だろ。
666655:2008/07/13(日) 17:38:14
>>663
参照の方がコストがかかるって本当?
内部的にはポインタと同じくアドレスを渡してると思ってたけど違うの?
667デフォルトの名無しさん:2008/07/13(日) 17:39:56
>>665
何言ってるんだ。

その(見て分かる)ために書き換え可能性のある場合はポインタで渡すんだよ。
668655:2008/07/13(日) 17:40:46
>>665
何がダメなの?

>>663
ごめん。読み違えてた。666はスルーで。
669デフォルトの名無しさん:2008/07/13(日) 17:42:00
>>666
>参照の方がコストがかかるって本当?
値渡しに比べて、だね。

コストはポイントと同じ。
670デフォルトの名無しさん:2008/07/13(日) 17:43:38
>>663 >>>>> C++標準委員会

というわけですね、わかります。
671デフォルトの名無しさん:2008/07/13(日) 17:43:49
CにしろC++にしろ前提条件が「プログラマは、すごい人だからミスなんてしないよね!」っていう仕様に
なってるんだよ。クソッタレな馬鹿は見た目で区別したできた方が保守性が上がりそうとか言い出す。
だから呼び出しコストに鈍感なクズプログラムを量産して迷惑掛ける。
672デフォルトの名無しさん:2008/07/13(日) 17:47:09
ドカタは黙ってろよ
673655:2008/07/13(日) 17:47:59
>>667
そうそう。思うに、
「NULLチェックしなくて済むから参照にする」
→「その関数作った自分は書き換えられること知ってるから問題ない」
→「他の奴はドキュメントよく読め」
ってなりそう。それは自己中だよね。

>>669
だよね。


674デフォルトの名無しさん:2008/07/13(日) 17:49:07
まー、不器用な奴はC#でもJavaでもやってろってことだなw
675デフォルトの名無しさん:2008/07/13(日) 17:53:46
>>671
2行目と3行目のつながりが分からない。
今はポインタ渡しと参照渡しの話をしていて、コストは同じ。
676デフォルトの名無しさん:2008/07/13(日) 17:54:42
今日も大荒れだな。
677デフォルトの名無しさん:2008/07/13(日) 17:54:42
>>673
だからさー「NULLチェックしなくて済むから参照にする」
ってのをやめようとしてるのに何罵倒してるんだ?

NULLが渡された時どういう挙動にするかはコードの
用途次第だろ?

パフォーマンス優先でNULLチェックもしたくない場合は
動作未定義とドキュメントに書いておいて、使う人間に
NULL呼び出ししないことを保証してもらうのがベストだし。
678デフォルトの名無しさん:2008/07/13(日) 18:00:40
>>673
見て分からないメンバ関数は書き換え禁止?
a.countUp();は
countUp(&a);にすべき?
679デフォルトの名無しさん:2008/07/13(日) 18:02:58
そ、それは……
680デフォルトの名無しさん:2008/07/13(日) 18:03:59
参照の騒動でも思ったけど、値が勝手に書きかえられちゃうような
関数呼び出しをするのは調べない方が悪い、みたいな態度で相手を
馬鹿にしている書き込みがあったけど、そういう奴こそ、基礎に戻
ってモジュール結合度とか、カプセル化の意味とか考え直して欲し
いものだと思った。
681デフォルトの名無しさん:2008/07/13(日) 18:04:21
>>667
書き換える可能性だけで言うなら、ポインタだろうと参照だろうと
仮引数にconstをつけて書き換えないことを明示する
(=constが無ければ関数内で書き換える可能性がある)のが普通だと思うんだけど。
682673:2008/07/13(日) 18:04:32
673は自分を罵倒してるんですが。。。自己中なのでやめようと思うということです。
書き方が悪かったかな。
4行目以降は全く同意です。
683デフォルトの名無しさん:2008/07/13(日) 18:09:12
>>681
>仮引数にconstをつけて書き換えないことを明示する
いやいやいや、ここでの明示の価値は、宣言部分じゃなくて
使用してるところで明確にすることにあるんですよ。

宣言部分で万事OKなら、>>678>>679とはならないよよよ
684デフォルトの名無しさん:2008/07/13(日) 18:09:28
ドキュメントなんて一切見なくてもちゃんと組めるのが理想だろ。
そういう設計にすべきなのに、事あるごとにドキュメントに頼ろうとする奴はアセンブリにでも埋まってろ。
685デフォルトの名無しさん:2008/07/13(日) 18:09:29
>>680
説明も読まずに関数やクラスを使っちゃうような人に基礎の話をされてもねw
686デフォルトの名無しさん:2008/07/13(日) 18:10:44
値を書き換えられるのが嫌な人はHaskellとかErlangあたりを使えばいいと思うよ
687673:2008/07/13(日) 18:13:43
>>678
それはこの話とは別と思ってます。

>>681
それは同意ですが、
書き換え不可の場合はconst参照が一般的なので、
書き換え可能な場合はポインタにすると書き換え不可と区別がつけられるという話をしています。
688デフォルトの名無しさん:2008/07/13(日) 18:16:26
「それとこれとは別」って何の意味も無い言葉だな。
関係があると思うからそういう例を出してるのに、単に「別」と言われても。
別だと思うならどこが違うのか理由を言えと。
689デフォルトの名無しさん:2008/07/13(日) 18:17:23
まあ仕事でやればわかるけど自分以外は何やるかわからないキチガイと考えて
防衛的なプログラムを書くもの。
690673:2008/07/13(日) 18:18:40
>>687
>>書き換え可能な場合はポインタにすると書き換え不可と区別がつけられるという話をしています。
→「呼び出し方を見るだけで」ということです。
691デフォルトの名無しさん:2008/07/13(日) 18:20:58
>>688
>「それとこれとは別」って何の意味も無い言葉だな。
な、何も汲み取れないのか…?
692デフォルトの名無しさん:2008/07/13(日) 18:21:29
>>690
それで、「呼び出し方を見るだけで」区別が付けられない>>678のような例は?
別の話なの?
693673:2008/07/13(日) 18:23:33
>>688
「書き換わることが見た目で分かるかどうか」という観点では関係ありますが、
今している「引数を参照VSポインタ」の議論とはメリット/デメリットが変わってくるので別の話と思います。
694デフォルトの名無しさん:2008/07/13(日) 18:23:56
>>691
自分が勝手に前提としているものが、人にも通用するとは思わない方がいいよ。
自分とは違う視点もあることを知った方がいいよ。
695デフォルトの名無しさん:2008/07/13(日) 18:25:26
>>690
それはあまりにもひどいローカルルールじゃないか。
他人が見たときに「一貫性の無い野郎だな」でスルーされるかもよ?

利用側で書き換え禁止を明示したいだけなら
int x = 0;
somefunc(static_cast<int const &>(x));
と書くとか、コメント書くほうが健全だと思うんだけど。
696デフォルトの名無しさん:2008/07/13(日) 18:26:44
>>689
× 自分以外は
○ 自分も含めて

# 一週間以上前の自分は他人だと定義する方法もあるが。
697デフォルトの名無しさん:2008/07/13(日) 18:27:10
>>694
普段よほど自分の言うことが他人に理解されない生活送ってるんだねかわいそうにw

>>693
そのように知恵のある人間なら解釈すべきだと思う。
ちゃんとニュアンス伝わってる人間も居るので心配しなくていい。
ここは明らかに汲み取れない方が鈍感。
698デフォルトの名無しさん:2008/07/13(日) 18:27:43
一つの話しかできないのかよシングルタスク野郎め
699デフォルトの名無しさん:2008/07/13(日) 18:27:46
別に自分ひとりで開発するならconstなんていらないけど
共同開発をするなら、視覚的に分かりやすく、ソースを見ただけでわかってもらえるように
関数にもconstつけるんだろ
700デフォルトの名無しさん:2008/07/13(日) 18:30:12
>>695
>それはあまりにもひどいローカルルールじゃないか。
んなこたーない

>他人が見たときに「一貫性の無い野郎だな」でスルーされるかもよ?
書き換えるときのみポインタで渡すことで一貫させようという話だろ
701デフォルトの名無しさん:2008/07/13(日) 18:30:43
話が通じないな。
「ニュアンス」なんて自分勝手で曖昧なものを、いつでも汲み取ってもらえるなどと思うなってことだ。
そもそものところ、一度に一つの議論しかできないのかと。
702デフォルトの名無しさん:2008/07/13(日) 18:30:58
相手を黙らせたいなら誰もが納得する説明でピシャっと決めろよ
703デフォルトの名無しさん:2008/07/13(日) 18:32:30
>>699
>>696
未来の自分は他人
704デフォルトの名無しさん:2008/07/13(日) 18:32:35
>>699
>別に自分ひとりで開発するならconstなんていらない
そんなばかな

>ソースを見ただけでわかってもらえるように関数にもconstつけるんだろ
それは当たり前
705デフォルトの名無しさん:2008/07/13(日) 18:36:37
>>701
ちがうね

自分が汲み取ってもらうことを期待してるんじゃなくて、誰かの言うことを
汲み取れるようになれって言ってんの。

>そもそものところ、一度に一つの議論しかできないのかと。
メンバ関数呼び出しの話か? 君こそ他人が複数の話題に
ついてこれることを期待しちゃってるんじゃないの?
706デフォルトの名無しさん:2008/07/13(日) 18:38:32
文章しかないコミュニケーションで汲み取れとかアホらしいこと言わずに
文章だけできちんと伝えられるようにしろ
707デフォルトの名無しさん:2008/07/13(日) 18:39:37
class Tがあって、宣言を
 func1(const T &arg)
 func2(T *arg)
と書いといたら、呼び出し側は必然的に
 func1(arg)
 func2(&arg)
としなきゃいけなくなるから、「そのルールを知ってれば」ソース上で書き換え禁止かどうか判断できるという話ではないの?
そう解釈しているんだが。
私もそうしてる。
Cから入ったせいか、見た目が値渡しなのに中身が変わるのは気持ち悪いんだよね。
ルールを知らない人向けに(まぁ、自分以外は知らないだろうけど)関数ヘッダにも別途書き換えする場合はその旨記述しておくが。
708デフォルトの名無しさん:2008/07/13(日) 18:39:47
>>560
嫌われる理由は、暗黙の型変換に起因するトラブルやわかりにくさのため。
std::string が operator char* ではなく、c_str() を用意しているのもその
せい。暗黙の型変換による影響範囲を特定できて、可読性の向上にも寄与
するなら使ってもいいと思う。そういうケースを思い付かないなら使わない。
709デフォルトの名無しさん:2008/07/13(日) 18:39:57
>>693
以下の最後のケースだけを重視して、あとはどうでも良いと?
それは一貫性が無いんじゃない?

//(1)
char buf[100];
f1(buf); // bufに変化があるか、見た目で分からない

//(2)
A insA;
int n = insA.countUp(); // insAに変化があるか、見た目で分からない

//(3)
int b = 0;
f2(b);  // bに変化があるか、見た目で分からない

//(4)
int c = 0;
f3(&c);  // cに変化があるかもしれない、見た目で分かる
710デフォルトの名無しさん:2008/07/13(日) 18:40:23
×複数の話題についてこれることを期待
○勝手に振った話題についてきてくれると期待

で、ついてきてくれなかったら切れるわけだ。無視されたーってw
711デフォルトの名無しさん:2008/07/13(日) 18:42:24
「値が変更されることは、見てわかるようにすべき」という主張だろう。
だったら>>678の質問もおかしくないんじゃないの?
この書き方だと、値が変わるか変わらないかは関数の中身を見ないとわからない。
いちいち見に行くのが嫌だから、呼び出しの時点でわかるようにしようって話なんだろ。
逆にこの書き方はOKだとするなら、何故参照渡しがいけないの?
ポインタを渡していないけれど値が書き換わる、という点で同じじゃないか。
712デフォルトの名無しさん:2008/07/13(日) 18:43:41
何かよく分からないんだけど、
「const参照とは違う渡し方をしてるから、これは書き換えられる可能性があるってことね」ってことなの?
読み手がその勝手規約を知っているか勘の良い人だっていうことを前提としてるように見えるんだけど、
もっとズバッと分かりやすいやり方は無いの?
713673:2008/07/13(日) 18:44:56
>>707
>>「そのルールを知ってれば」ソース上で書き換え禁止かどうか判断できるという話ではないの?
そうです。

↓Googleもそのルールを使ってます。それ以外でも聞くのでそんなにローカルなルールではないと思います。

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Reference_Arguments
714デフォルトの名無しさん:2008/07/13(日) 18:46:32
>>713
Googleのルールって馬鹿よけの奴だよね。
日本語の書いとく
http://www.henshi.net/k/hiki.cgi?GoogleCppStyleGuide
715デフォルトの名無しさん:2008/07/13(日) 18:46:53
>>709
全部分からないより//(4)に関して分かってる方がより建設的じゃね?
それから//(3)に関して変化しないことを見た目でわかるようにしよう
というルールだし。

//(1)//(2)はお前の嫌いな別の話。これらがあるとしても//(3)//(4)に
関して十分有効なルール。
716デフォルトの名無しさん:2008/07/13(日) 18:49:24
>>715
(1)も別の話ですか、
十分有効なルールとか本気で言ってるの?w
717デフォルトの名無しさん:2008/07/13(日) 18:52:16
>>711
>逆にこの書き方はOKだとするなら、何故参照渡しがいけないの?
他に、値渡しと区別がつかないから、というのもある。

区別がつかないなら、値渡しと見た目が同じ参照渡しでは、
呼び出し側の変更が無いものというルールにすることは、
そんなに反感招くほど悪いものではないだろ。
718デフォルトの名無しさん:2008/07/13(日) 18:52:55
>>716
残念ながら別の話だし、有効だろうね。

なんか知ってるか知らないかという話の気がしてきた。
719デフォルトの名無しさん:2008/07/13(日) 18:53:23
ほーらニュアンスなんかに頼ってるから議論がぐちゃぐちゃになっていく。
「参照渡しをすべきではない」と思う理由を明確にしろ。後付けのわがままは許さない。
720デフォルトの名無しさん:2008/07/13(日) 18:57:07
「参照渡しをすべきではない」→「値を変更する参照渡しをすべきではない」
だな。
>>717
は妥当だとは思わないか?
721デフォルトの名無しさん:2008/07/13(日) 18:58:33
まあ仕事でやればわかるけど自分以外は何やるかわからないキチガイと考えて
防衛的なプログラムを書くもの。
722デフォルトの名無しさん:2008/07/13(日) 19:01:22
反対派の人はまず>>713のGoogleの説明を読んでからだね。
( >>714の日本語版では全部訳されてない。)

723デフォルトの名無しさん:2008/07/13(日) 19:02:27
妥当だと思わない人間がいるから議論になってるんじゃねーの。
こんなの個人的な嗜好の問題なのに、反対する人間をも納得させようとして、
変に話を大きくしてるから突っ込まれるんだよ。
724デフォルトの名無しさん:2008/07/13(日) 19:02:43
const char * hoge;
char const * fuga;
の違いを教えてください
725デフォルトの名無しさん:2008/07/13(日) 19:03:27
ポインタ型の変数とか使ったことが無いのだろうか・・・
普通に値渡しで、指す先が変更されることもあるんだけど、

ポインタ値自体が分からなければOKってことなのかな?
726デフォルトの名無しさん:2008/07/13(日) 19:03:50
Googleを業界基準にしようなんておこがましいにも程があるとはおもわんかね
C++の規格に沿って話せよ
727デフォルトの名無しさん:2008/07/13(日) 19:04:43
>>724
同じ。
728デフォルトの名無しさん:2008/07/13(日) 19:05:49
>>721
どっち派なんだ? 仮に値変更可能な参照渡し容認派なら、

>防衛的なプログラムを書くもの。
それは「値を変更する参照渡しをすべきではない」という主張と
別に相容れないものではないじゃないか。

むしろconstじゃない参照パラメータを書かないのだからより
安全だろう…あ、つまり反対派なんだw
729デフォルトの名無しさん:2008/07/13(日) 19:06:41
どっち派とか下らないレッテル貼らないと話もできないわけ?
730デフォルトの名無しさん:2008/07/13(日) 19:06:56
>>725>>720宛てな
731デフォルトの名無しさん:2008/07/13(日) 19:09:49
>>704
未来の自分は他人ってスレの中で定義されてるんだから
可読性を考慮しないで、1日でくみ上げちまえば「自分」だけになるんじゃね
732デフォルトの名無しさん:2008/07/13(日) 19:10:05
>>723
>妥当だと思わない人間がいるから議論になってるんじゃねーの。
では>>717のどこがおかしいのか言ってくれたまえ。

個人的な嗜好は不可ね。それ言ったら何でもありになっちゃうから。
その「嗜好」になった理由があるだろ?
733デフォルトの名無しさん:2008/07/13(日) 19:10:23
const char * hoge;
char * const fuga;
の違いを教えてください
734デフォルトの名無しさん:2008/07/13(日) 19:13:40
>>733
hoge = NULL; //コンパイル可能
*hoge = '\0'; //コンパイル不可
fuga = NULL'; //コンパイル不可
*fuga = '\0'; //コンパイル可能
735デフォルトの名無しさん:2008/07/13(日) 19:16:48
>>725
さほど奇妙な話ではないかと。

ポインタ値自体は値渡しだから変更はない。
ポインタの先は「ポインタ渡し」だから変更される。
736デフォルトの名無しさん:2008/07/13(日) 19:23:28
>>707にあるように、Cでは値が変わる場合は普通ポインタ渡しになる。
値渡しでは通常値は変わらない。
C++で参照渡しをすると、値渡しのように見えるが値が変わってしまうから分かりにくい。
だから参照渡しの場合は値を変えないようにしよう(値を変える場合はポインタ渡しにしよう)っていうルール。
Googleの説明もそんな感じ。

どうも反対派でグッとくる意見がないね。
737デフォルトの名無しさん:2008/07/13(日) 19:30:34
>>736
結局は「見える」ってところが重要なんだよな?
  char* str = malloc(100);
  strcpy(str, "aaa");
は&strになってないけど、どうなの?
というような質問には別の話とか言って答えないだろ?

struct iterator{
  int* p;
};
みたいなのも値渡しで、結果的にpの先が書き換わったりすることもあるし。
std::のアルゴリズムとか。
それらについてはどうなの?
738デフォルトの名無しさん:2008/07/13(日) 19:32:29
>>709の(1)と>>737
ポインタ渡しだから変化があるかどうかは分からない。
それはこのルールの対象外。

このルールは「参照渡しの場合はconstであること」。

ポインタの場合は、「変わる可能性がある」ことに気づきやすい。
参照の場合は値渡しと同じに見えるから気づきにくい。

これで分かりますか?
739デフォルトの名無しさん:2008/07/13(日) 19:35:31
他のケースがあるから、そのルール(制限)には意味が無いって言ってるんですが、
分かります?
740デフォルトの名無しさん:2008/07/13(日) 19:38:08
参照なんて不要
741デフォルトの名無しさん:2008/07/13(日) 19:39:55
>>739
ドライバーがアクセル全開にするかもしれないから
制限速度の法規には意味がありませんか?
742デフォルトの名無しさん:2008/07/13(日) 19:42:18
>>741
「その」の意味分かります?
誰も「ルールは意味無い」なんて言っていませんが。
743デフォルトの名無しさん:2008/07/13(日) 19:42:48
>>741
馬鹿丸出しw
744デフォルトの名無しさん:2008/07/13(日) 19:43:57
>>740
ここですごい第三の意見が出てきたなw
745デフォルトの名無しさん:2008/07/13(日) 19:52:43
>>742
「わかります?」じゃなくて、わかって欲しい内容そのものを書いたほうがいいよ。

本当は何も頭の中にありはしないのに、知見を隠し持ってるフリしてるようにしか見えないから。
746デフォルトの名無しさん:2008/07/13(日) 19:52:59
発想を逆転させ、関数側で書き換えないことを保障する代わりに、
こんな感じで呼び出し側でconstで渡すというのはどうだろう。

template<class T>
const T& const_ref(T& v) {
 return v;
}

//hoge(fuga& r);
hoge(const_ref(arg)); //エラー
747デフォルトの名無しさん:2008/07/13(日) 19:54:38
>>739
意味はあります。
他のケースよりも問題になりやすいからできたルールです。

全て対応する必要はないし、対応できないケースはあるでしょう。
748デフォルトの名無しさん:2008/07/13(日) 19:56:26
>>745
では、>>739を踏まえて>>737に答えて下さい。
>>738は答えになっていないので。
749デフォルトの名無しさん:2008/07/13(日) 20:00:04
>>746
毎回付けるにはその名前は長い気がするので、単項のoperator+でどうだろう
hoge(+arg);
750デフォルトの名無しさん:2008/07/13(日) 20:00:52
>>707
> Cから入ったせいか、見た目が値渡しなのに中身が変わるのは気持ち悪いんだよね。
お前はC++に向いていない。
C++の流儀に従えないのなら一生Cやってろ。
751デフォルトの名無しさん:2008/07/13(日) 20:00:54
>>747
それで、対応出来るケースは非常に小さい範囲というのがこちらの主張で、
そのルールによってstd::swapなどを否定するほどのメリットが有るとは、
思えません。
752デフォルトの名無しさん:2008/07/13(日) 20:01:58
>>746
それはもう考えたんだけど、
値渡しを含む全ての引数にやらないとポインタ渡し派規約と同じ保証が出来ないよ。
753デフォルトの名無しさん:2008/07/13(日) 20:02:05
>>750
了解
754デフォルトの名無しさん:2008/07/13(日) 20:02:37
>見た目が値渡しなのに中身が変わるのは気持ち悪い
これだと、std::sortも否定されますね。
まぁ、std::vector<T>::iteratorなどがポインタだった時期もありましたが。
755デフォルトの名無しさん:2008/07/13(日) 20:05:43
昔Cは関数呼び出しのとき、値渡しが原則で、参照の時は明示的にやるので
呼び出し側から、呼び出した結果引数の内容が気づかないうちに変更されている
危険がなくて安心、とかいう説明をきいた記憶があるのですが、C++は呼び出し
側から値渡しか参照渡しかわからない書き方ができるので、これは退化じゃない
かと思うのですが、違うんでしょうか?
756デフォルトの名無しさん:2008/07/13(日) 20:07:01
機能として存在しているのに、使わないのが正しいとか言い出すからおかしくなるんだよ。
C++とはそういうものと考えて使えば良いだけの話。
いい加減荒らすな。
757デフォルトの名無しさん:2008/07/13(日) 20:07:56
別スレでやればいいのに
758747:2008/07/13(日) 20:08:21
>>751
了解です。私も元々このルールを使っていなかったので、押し付けるつもりはありません。
(そう読めたらごめんなさい)。
誤解があるかもと思って説明しましたが、そうではなかったようで、
あとは各人の経験や嗜好に基づく部分と思いますのでここらで失礼します。
759デフォルトの名無しさん:2008/07/13(日) 20:08:20
そろそろ goto とか longjmp の出番か?
760デフォルトの名無しさん:2008/07/13(日) 20:08:38
>>755
char* str = malloc(100);
strcpy(str); //全然明示的でない件について
761デフォルトの名無しさん:2008/07/13(日) 20:09:40
アプリケーションハンガリアンが解決してくれる
762デフォルトの名無しさん:2008/07/13(日) 20:13:22
まあ書き換える可能性がある関数は
大抵WriteParameter(param);とか名前で分かるし、
IDEの機能で引数の型が表示されたりするしなぁ。
あんまり気にしたことが無かったというのが正直なところ。

ただ、ポインタ渡し派の規約には
たとえ紙に印刷されていても規約を知っていれば読めるとか
引数ごとに細かく明示できるという利点を感じた。
763デフォルトの名無しさん:2008/07/13(日) 20:13:46
>>758
二度と来るなよ。
764デフォルトの名無しさん:2008/07/13(日) 20:15:50
>>760
結局、向こう側に「何をされるのか」は、向こう側のことがわからないと
どうにもならないからなぁ。
765デフォルトの名無しさん:2008/07/13(日) 20:15:57
>>760
その関数はポインタを受け取るから変更の可能性アリ。

なんか&の表記があることと混同してる奴がいないか?
766デフォルトの名無しさん:2008/07/13(日) 20:16:51
>>760
> char* str = malloc(100);
> strcpy(str); //全然明示的でない件について
このレベルで回答してたのか。
馬鹿すぎる・・・
767デフォルトの名無しさん:2008/07/13(日) 20:18:40
>>761
同意。関数名と変数名こそ大事だよな。

>>765 >>766
>>690などの「呼び出し方を見るだけで」の話かと思ったので。
768デフォルトの名無しさん:2008/07/13(日) 20:19:22
>>765
つまり、ポインタを渡す場合には、変更の可能性があるかもしれないことを
受け入れるわけだよね、それって。
769デフォルトの名無しさん:2008/07/13(日) 20:20:12
>>765 >>766
変数の型が大事な君らにはシステムハンガリアンをお勧めする
770デフォルトの名無しさん:2008/07/13(日) 20:24:11
>>766
>>755では「関数呼び出しのとき」値渡しが原則で参照の時は「明示的に」やるので
とあるけど、strcpy(str)のどの辺が明示的か説明して貰えるかな?
771デフォルトの名無しさん:2008/07/13(日) 20:25:17
結論:外国人が決めたルールに従え
772デフォルトの名無しさん:2008/07/13(日) 20:25:36
吹いたww
773デフォルトの名無しさん:2008/07/13(日) 20:26:10
>>766
そのレベルがどのレベルなのかはっきりしないけど、
元の話題がそもそもそういう話だからね。

「どっちみち、呼び出し先で引数に何をされるか予想できない関数呼び出しに満ちているんだよ」
ってことだな。
774デフォルトの名無しさん:2008/07/13(日) 20:27:19
何番目の引数が書き換わるかすぐにわかるような新しい関数の命名法を考えるといいんじゃね
775デフォルトの名無しさん:2008/07/13(日) 20:27:45
>>752
全部付ければ良い。
変えて良いときだけref付けたりポインタ渡しを強制するのも、
変えちゃダメな時にconst_ref付けるのも、本質的には同じ対処。
どちらを優先するかな違いだけ。
776デフォルトの名無しさん:2008/07/13(日) 20:30:01
そもそもswap( int &a, int &b)なんて宣言してswap( a, b )なんて使い方している奴いるの?
777デフォルトの名無しさん:2008/07/13(日) 20:31:14
C#みたいに呼び出し側でrefをつけるようにすりゃいいんじゃね?
なんかC++の機能制限に繋がるのか?
778デフォルトの名無しさん:2008/07/13(日) 20:32:17
>>773
>「どっちみち、呼び出し先で引数に何をされるか予想できない関数呼び出しに満ちているんだよ」

だから参照渡しは書き換えないようにしようって発想なんだろ。
何が気に入らないんだ?
779デフォルトの名無しさん:2008/07/13(日) 20:33:03
つ STL
780デフォルトの名無しさん:2008/07/13(日) 20:34:13
>>776
どういう状況でどのスタンスの人間に訊いてるのか、よくわからないが・・・。
とりあえずSTLのswap関数はそうなってるよな。
ていうか、swapなんだから、ああ、値が入れ替わるんだな、ってのは容易に想像できるし。
(むしろ、swap関数なのに引数が変化してなかったら、そっちのほうが驚きでは)
781デフォルトの名無しさん:2008/07/13(日) 20:34:38
誰かεπιστημη呼んで来いよ
782デフォルトの名無しさん:2008/07/13(日) 20:36:32
>>776
いかにも覚えたての人間が嬉しくてやる例だよね。有用でないと
までは言わないが。

演算子オーバーロードのために導入された参照が、たまたま
Cの時にマクロで作られていたswapとかに流用されただけだし。
783デフォルトの名無しさん:2008/07/13(日) 20:36:40
>>780
> ていうか、swapなんだから、ああ、値が入れ替わるんだな、ってのは容易に想像できるし。

俺なんか名前から容易に想像できる関数たちに散々裏切られてきたぜ。
同僚が作ったのとかMSが作ったのとか。
だから俺も裏切ってやることにした。
784デフォルトの名無しさん:2008/07/13(日) 20:37:17
>>778
なにがどう「だから」なのかわからんのだけど。
ポインタはいいの? 書き換えられない保証付きの手段が無くても。
785デフォルトの名無しさん:2008/07/13(日) 20:38:35
異常にスレ伸びてると思ったら
くだらん宗教論争やってんなーと思って静観してたけど

>>783
> だから俺も裏切ってやることにした。

お前の最後の一行になんか和んでしまったw
786デフォルトの名無しさん:2008/07/13(日) 20:39:54
流れに便乗して質問
void copy1( vector<int> &dst, const vector<int> &src );
void copy2( vector<int> *dst, const vector<int> &src );

vector<int> foo;
vector<int> bar;
copy1( foo, bar );
copy2( &foo, bar );

こういう場合ってどっちの方がいいのかな?たまに悩むんだけど
strcpyみたいなのにあわせればcopy1だけど、
copy2の方がわかりやすいのかなとも思うし。
787デフォルトの名無しさん:2008/07/13(日) 20:40:14
>>784
書き換えたいからポインタで渡すんだろ、って話では。
788デフォルトの名無しさん:2008/07/13(日) 20:40:55
f(T&)くらいも気に入らないと言ってる人は
C++0xの右辺値参照とか入ってきたら発狂しそうだよな
789デフォルトの名無しさん:2008/07/13(日) 20:41:44
>>786
strcpyにあわせるとcopy2だろ。
790デフォルトの名無しさん:2008/07/13(日) 20:42:52
呼び出し先で書き換えて欲しくない文字列を渡すとき、については、
「参照を書き換えるな派」は黙って受け入れるということでいいのかな。
char* p = new char[sz];
// pの指すchar配列の範囲に色々詰め込む
hoge(p); // 文字列書き換えられたくないなぁ・・・でもいいや!
      // ポインタ渡しならボクはその可能性にも耐えられる!何故かポインタだけは!
791デフォルトの名無しさん:2008/07/13(日) 20:46:53
>>790
参照書き換え不可派じゃないが、
const char* p = new char[sz];

hoge((const char*)p);
でOK
792デフォルトの名無しさん:2008/07/13(日) 20:48:14
そうやってるわけね。いつも。
793デフォルトの名無しさん:2008/07/13(日) 20:48:53
いや、普通に関数のヘッダみて確認しますよw
794デフォルトの名無しさん:2008/07/13(日) 20:50:43
>>791
>>746 >>749でも出てる方法だね。
確かに1文字でconst化出来れば結構嬉しいかな。
795デフォルトの名無しさん:2008/07/13(日) 20:52:22
俺もクラスの定義見て確認するからメンバは全部publicでいいよ。
796デフォルトの名無しさん:2008/07/13(日) 20:54:04
>>749は追加OKに見えるw
797デフォルトの名無しさん:2008/07/13(日) 20:55:12
IDEやエディタが非const参照・ポインタの引数に色付けてくれればいいんじゃね
798デフォルトの名無しさん:2008/07/13(日) 20:56:33
>>794
そう。746,749と同じ考え。
書き換えて欲しくないとき、そう明示する手段があるのだから使えば良い。

書き換え無い保証が欲しいが、引数型の確認もしたくないとか言うのなら、
constで渡すくらいの手間は我慢するしかないと思うのよ。
799デフォルトの名無しさん:2008/07/13(日) 20:59:44
vector<int> foo;
vector<int> bar;
copy1(foo, static_cast<const vector<int>&>(bar));

ちなみにjava
List<Integer> foo;
copy1(foo, Collections.unmodifiableList(bar));

どちらも、実は使ったことがある。
800デフォルトの名無しさん:2008/07/13(日) 21:03:45
swapググってたらこんなん見つけたんだが、
ttp://cppemb.blog17.fc2.com/blog-entry-30.html
……マジ?(排他に関するvolatile記述)
801デフォルトの名無しさん:2008/07/13(日) 21:09:02
こういう個人的な好き嫌いや感情で正しいとか間違っているとか宗教戦争がすぐ発生しちゃうから
C++は駄目言語なんだよ。
ずうたいばかり大きくなった恐竜みたいなもの。
早く滅びてC#やJavaに道を譲った方がいい。
802デフォルトの名無しさん:2008/07/13(日) 21:11:54
C++が駄目なんじゃない!宗教戦争を起こす人間が駄目なんだ!
803デフォルトの名無しさん:2008/07/13(日) 21:12:13
>>801
C#やJavaでの宗教戦争に参加したことが無いようで。

いや、参加しない方がいいんだけどね・・・w
804デフォルトの名無しさん:2008/07/13(日) 21:12:51
ちなみにインデントの宗教戦争は言語をも越えて勃発するw
805デフォルトの名無しさん:2008/07/13(日) 21:13:26
>>801
言語の良し悪しとは関係ないんだから別に良いんじゃない?

Javaは臭い金の臭いしかしないから好きになれん。
C♯はMonoプロジェクトの頑張りでもっともっと普及すると思う。
806デフォルトの名無しさん:2008/07/13(日) 21:14:18
大体創始者の名前の読みにくさとかハゲ頭みたときから怪しいと思ってた。
807デフォルトの名無しさん:2008/07/13(日) 21:14:33
>>804
TAB派かスペース派か

俺は断然スペース派
808デフォルトの名無しさん:2008/07/13(日) 21:15:51
おれはIDEお任せ派
809デフォルトの名無しさん:2008/07/13(日) 21:16:51
俺は1行79文字インデント無し派
810デフォルトの名無しさん:2008/07/13(日) 21:17:26
>>806
ワールドワイドで考えると、名前の読みにくさと、持ってる宗教の怪しさでは
Rubyの人が一番だろうけどね。
811デフォルトの名無しさん:2008/07/13(日) 21:17:30
Wikipediaだとビャーネ・ストロヴストルップとなっているけど、これで定着してるの?
812デフォルトの名無しさん:2008/07/13(日) 21:18:12
>>810
rubyの人の宗教ってなに?
813デフォルトの名無しさん:2008/07/13(日) 21:18:12
Eclipseのデフォルトのインデントの無能っぷりは異常w
814デフォルトの名無しさん:2008/07/13(日) 21:18:43
>>811
Wikipediaにしては珍しく記事名で議論が出てないな。
火つけたらきっとよく燃えるぞw
815デフォルトの名無しさん:2008/07/13(日) 21:20:50
>>811
皆結構好き勝手に読んでる、C++スレでは「びよよん」って呼ばれてた
816デフォルトの名無しさん:2008/07/13(日) 21:22:50
817デフォルトの名無しさん:2008/07/13(日) 21:25:46
>>807
>俺は断然スペース派
このスレじゃなかったら、銃を向け合うところだったな


なんてなw 俺はT(ry
818デフォルトの名無しさん:2008/07/13(日) 21:29:09
俺はもっぱら4tab派だけど、同じファイル内で統一されてるなら、タブだろうがスペースだろうが好きにすればいいと思うよ
自分のコードさえ汚されなきゃキレない・・・と、思う



あー、やっぱ見にくいのを読まされるのはヤダな
819デフォルトの名無しさん:2008/07/13(日) 21:35:16
javaの標準ライブラリは一つのファイル内でも統一されていないから困る
4TABと8TABで切り替えると、どこかが綺麗になってどこかが崩れるw
820デフォルトの名無しさん:2008/07/13(日) 21:44:39
もう最近は、インデントは、テキストに保存されてるのとは別に、IDEが
ユーザー定義のルールで整形しなおして表示しちゃえばいいと思う。
どうせC系は改行やスペースにほぼ意味無いんだし
821デフォルトの名無しさん:2008/07/13(日) 21:47:12
Cの場合、マクロがやっかいになるな
それだと
822デフォルトの名無しさん:2008/07/13(日) 21:51:31
>>804 >>807-809 >>813 >>817-820
インデントの話は、するにしても雑談の範囲で頼むよ。
分かってるとは思うけど、一応ね。
823デフォルトの名無しさん:2008/07/13(日) 23:00:16
TABかスペースかはおいといて、世界で初めてインデントした人って誰なんだろう?
凄い地味だけどこれは素晴らしい発見だと思う。
824デフォルトの名無しさん:2008/07/13(日) 23:01:45
>>823
825デフォルトの名無しさん:2008/07/13(日) 23:56:22
>>823
俺も。
つーか普通にやってりゃかなりの確率で発見するような気がせんでもない。
826デフォルトの名無しさん:2008/07/14(月) 00:00:02
でも、BASICにはその概念ないよな
827デフォルトの名無しさん:2008/07/14(月) 00:04:09
QuickBASIC以降はあったような
828デフォルトの名無しさん:2008/07/14(月) 00:05:58
>>825
確かに何かしらの工夫はするだろうね。
まだソースを見やすくする工夫が存在していない状態と仮定して、
俺ならどうするだろう。
多分コメントで

// A処理開始
print ('A');
//A_B処理開始
print ('A_B');
//A_B処理終了
// A処理終了

ぐらいしか思いつかんだろうな。

あとはエディタで色分けぐらい?
829デフォルトの名無しさん:2008/07/14(月) 00:07:24
少なくとも、一行の文字数に制限があった時代にインデントはなかっただろう
830デフォルトの名無しさん:2008/07/14(月) 00:17:08
>>829
何時代から来たんだ?
831デフォルトの名無しさん:2008/07/14(月) 00:42:28
FORTRAN
FORTH
PYTHON
832デフォルトの名無しさん:2008/07/14(月) 00:49:48
何時代かはわからんが >>831 が40以上なのはなんとなく分かる。
833デフォルトの名無しさん:2008/07/14(月) 00:52:50
若くても文字列処理用とか勉強用ならやってるやついるんじゃないか?
俺はよく分からんが・・・

FORTRANは昔読んでたC言語の本に併記されてたから、ある程度読める
834デフォルトの名無しさん:2008/07/14(月) 01:01:05
FORTRANは始まりの桁数も決まってたしなあ。
COBOLはある程度自由だったが。
BASICは入力するたびに勝手に整形されてたしな
835デフォルトの名無しさん:2008/07/14(月) 01:04:38
C#も勝手に整形しやがるよ
何かMSの言いなりみたいで癪だ
836デフォルトの名無しさん:2008/07/14(月) 01:06:48
>>835
オプションで辞めさせられるだろうが
837デフォルトの名無しさん:2008/07/14(月) 01:07:12
VSの設定で変えられるだろ
838デフォルトの名無しさん:2008/07/14(月) 01:08:45
そろそろ穿孔カードの話を始める団塊の世代が現れるな
839デフォルトの名無しさん:2008/07/14(月) 01:09:33
整形してくれるならそれに流れるように身を任せてるよ
840デフォルトの名無しさん:2008/07/14(月) 01:11:19
マグロですね、わかります。
841デフォルトの名無しさん:2008/07/14(月) 01:19:13
むしろブレースの位置とかも指定できなかったっけ?
indentコマンド使わなくてもよくなる時代が来るかね
842758:2008/07/14(月) 01:27:37
758

>>693の(1)(2)と736の前半がなぜ別問題なのか説明できるようになったので
戻ってきてしまいました。頑張って考えてきました。聞いてください。

なぜ別問題か?それはこの問題の本質が、
「変化があるか見た目で分からない」ではなく、
「参照渡しと値渡しで呼び出し方が同じであるため、
参照渡しと気づかず、知らぬ間に書き換わっている可能性がある」ということです。
参照をconst限定にするのは、この問題を回避するためです。
(気づかなくても、constだから書き換わらない)

ポインタ渡し(1)やメンバ関数(2)については、呼び出し方を見て、
ポインタ渡し/メンバ関数呼び出しであることがわかるため、
この問題がない、あるいは少ないです。
>>693 の例で言うと、(1)(2)(4)については「変化があるか見た目で分からないが、変化がある可能性を認知できる」が、
(3)については「値渡しと思い込んで、変化があると思いもしない可能性がある」ということになると思います。
この違いがあるため、別問題と考えます。
(全部参照渡しを疑うべきっていうのはなしとして話してます)
843758:2008/07/14(月) 01:28:35
>>790さんは、このルール支持派が参照はconstで、ポインタは書き換え可能なことを受け入れることに違和感を感じられていますが、
上で述べたように、「変化があるか見た目で分からないが、変化がある可能性を認知できる」というのは望ましい状態であり、
その状態は受け入れるスタンスなわけです。

以下はちょっと余談気味ですが、
真の問題を回避するには、「参照禁止」というルールでもいいのですが、
C++ではコピーコンストラクタや代入演算子などでconst参照が使われますし、
値渡しの変わりにconst参照渡しが使われるのは一般的なので、
「参照はconstにする」というルールになっています。
また、なんらかの形で呼び出し側で値渡しと参照渡しが区別できればこのルールは当然不要と思います。

次にswapの存在などにより、参照をconstで統一できないという指摘ですが、
これはもちろん別問題ではなく、「統一感がない」というデメリットになります。
そのため意味がない、という意見も分かります。
実際の現場では、使用するライブラリや既存コードがこのルールに則っているかや、
メンバのスキルやバックグラウンド、嗜好などにより、メリットとデメリットを比較して
導入を決定することになると思います。

最後に、議論を通じて自分の考えがより深まりました。ありがとうございました。
では今度こそ本当にさらばだ。でゅわ!!
844デフォルトの名無しさん:2008/07/14(月) 01:33:34
さっき758をC++標準化委員会のボードメンバーに推薦してきたので、以後その話は
そっちでやって下さい。
845デフォルトの名無しさん:2008/07/14(月) 01:37:41
>>842
要するに君が望むのは、
「C言語における値渡しの書き方ならば絶対に値が書き換わらない状況」なんだろ。
それについては何も文句は無いし、実際に便利だと思う。
でも、それ以外の書き方についてもごちゃごちゃ言い始めたから面倒なことになったんだ。
下手に一般化しようとして話を広げたからいけないんだ。反省しなさい。
846デフォルトの名無しさん:2008/07/14(月) 01:40:45
あまりに議論が白熱してて読むのもめどいんだが、値型、参照型の2種類存在してることが
そもそも気に食わなかったりする?
847デフォルトの名無しさん:2008/07/14(月) 01:41:53
参照渡しなんか考えた奴誰だよ、泣いて謝れよ
848デフォルトの名無しさん:2008/07/14(月) 01:43:40
びよよんだ文句あるかね
849デフォルトの名無しさん:2008/07/14(月) 01:50:31
constな参照渡しって結局値渡しと何が違うんですか?
(意味の違いは分かってますよ)
850デフォルトの名無しさん:2008/07/14(月) 01:51:07
気持ち
851デフォルトの名無しさん:2008/07/14(月) 01:51:39
オブジェクトがでかいときのオーバヘッドが違うだろ
852デフォルトの名無しさん:2008/07/14(月) 01:52:30
それならポインタで充分じゃないですか?
853デフォルトの名無しさん:2008/07/14(月) 01:54:25
参照は要らんよ
C++は何でも盛り込み過ぎて破綻してる
854デフォルトの名無しさん:2008/07/14(月) 01:55:45
ポインタは悪しき物だとして徹底的に排除して
Javaとかで参照とかが出てきたんじゃないの?
で、それをC++でも使えて何か不満なのかな?
855デフォルトの名無しさん:2008/07/14(月) 01:56:57
>>854
順番がおかしい
それにC++の参照とJavaの参照は別物
856デフォルトの名無しさん:2008/07/14(月) 01:58:19
解答のひとつがC#の f(ref a, out b) なんだろね。
857デフォルトの名無しさん:2008/07/14(月) 02:17:05
マルチスレッドプログラムでコンソールにエラー出力をする場合の素朴な疑問です。

Cでいうところの下記のような動作を期待して、
 fprintf(stderr, "%d%d\n", 1, 2);
C++で下記のようにコーディングしてみました。
 std::cerr << 1 << 2 << "\n";
しかしこれでは複数のスレッドから書き込みを行った場合、
タイミングによって1と2が分断されて出力されてしまいます。

これを下記の条件内で解決する方法はあるのでしょうか?
 ・C++標準の範疇で(環境依存のスレッド同期APIなどを使わずに)
 ・iostreamの範疇で(std::fprintfなどを使わずに)
 ・例外で失敗せずに(std::stringstream::str()を使わずに)

それともこういう場合は素直にstd::fprintfなどを使うのが正しい選択なのでしょうか?
858デフォルトの名無しさん:2008/07/14(月) 03:02:53
そもそもC++にスレッドなんて概念ないから、
連結してから書き出しても何らかの理由で割り込まれたりするんじゃねえの。

ある程度、環境依存になるのはしかたないよ。
859デフォルトの名無しさん:2008/07/14(月) 03:15:12
そもそも環境に依存せずにマルチスレッドを使うことは出来ないはず
860857:2008/07/14(月) 03:24:13
ありがとうございます。
確かにマルチスレッドな時点でC++標準ではないですね・・・。
もう一度考え直してみます。
861デフォルトの名無しさん:2008/07/14(月) 03:28:53
バッファにため込んで、一度に(ファイルなどへ)書き込めば平気なはず。  モニタだと別のやつが先に来るかもしれないが
862デフォルトの名無しさん:2008/07/14(月) 03:42:46
ファイルでも別のが先に来る可能性はあるな。 同時にアクセスしているのだから。
書き込みが終わるまで待つ必要ある。 ロックする。
863デフォルトの名無しさん:2008/07/14(月) 03:51:28
じゃあ同時にロックされたらどうなる?
とか考え始めると泥沼にはまってデッドロックの理論も勉強するはめになる。
864デフォルトの名無しさん:2008/07/14(月) 04:22:35
マルチスレッド嫌い。
865デフォルトの名無しさん:2008/07/14(月) 04:50:14
そこで「マルチスレッドでコンパイルする」な人の出番ですよ。
866デフォルトの名無しさん:2008/07/14(月) 05:37:55
>>857
環境依存無しは不可能だけど、多少マシな方法
http://www.google.com/search?q=boost%3A%3Amutex

ちなみにロックを使わない限り、fprintfでも保証は無いから。
867デフォルトの名無しさん:2008/07/14(月) 05:54:48
Lock-freeとWait-freeアルゴリズム - Wikipedia

のほうがよくないか?
画面表示するデータを、キューへいれていき処理する方法。
これだと、ロック待ちが無い。 
868デフォルトの名無しさん:2008/07/14(月) 06:10:10
求められるパフォーマンスによってはそうだろうね。
その手のIO待ちを避ける手法は
プログラムの複雑さとトレードオフになるので。
869デフォルトの名無しさん:2008/07/14(月) 08:25:50
MFCでフォーム物作るのとC#で同じもの作るのはどっちが動作速度速いんですか?
870デフォルトの名無しさん:2008/07/14(月) 08:27:37
サウンドのラインイン端子からデータ取る関数ってありますか?
871デフォルトの名無しさん:2008/07/14(月) 08:56:28
>>870
WaveIn でどう?
872デフォルトの名無しさん:2008/07/14(月) 09:36:37
>>869
同等に慣れていて、0から作るなら。
C#>>>>>MFC
873デフォルトの名無しさん:2008/07/14(月) 09:37:30
↑ミス、作成速度と間違えた。動作速度なら
MFC>>C#
874デフォルトの名無しさん:2008/07/14(月) 09:54:15
MFC慣れたら簡単になってきたんだけど、C#のほうがそんなにいいのか
また勉強するのは気力的に辛すぎるw
875デフォルトの名無しさん:2008/07/14(月) 10:20:00
文法は似てるんだから、気が向いたらいつでも使えるよ。
876デフォルトの名無しさん:2008/07/14(月) 10:28:00
MFCの方が速度速いんだ?なんとなくC#だと思ってたわ
877デフォルトの名無しさん:2008/07/14(月) 10:29:31
C#はGDI+を使っている事もあり全体的に動作がもっさり
878デフォルトの名無しさん:2008/07/14(月) 10:41:49
MFCは大きすぎ重すぎでやっぱりSDK生で書かないとといってた頃が懐かしい
879デフォルトの名無しさん:2008/07/14(月) 10:47:20
VistaだとGDIがエミュになってのろまになったんだろ?
今後のC/C++のGUIって何で書けばいいんだ?
880デフォルトの名無しさん:2008/07/14(月) 10:53:44
>>879
コマーシャル見て、「あ、これ買わなきゃ!」とかいうタイプですね、わかります。
881デフォルトの名無しさん:2008/07/14(月) 12:05:17
そうかC#はCで作ったのか
882デフォルトの名無しさん:2008/07/14(月) 12:29:55
WaveIn難しすぎませんか?
全然日本語の情報ページがないんですが
883デフォルトの名無しさん:2008/07/14(月) 12:37:29
じゃどのくらい簡単ならいいのか書いてよ
884デフォルトの名無しさん:2008/07/14(月) 12:41:37
日本語がへたですいません
日本語でWaveIn詳しく解説してるページないですか?
885デフォルトの名無しさん:2008/07/14(月) 12:45:21
これ見てどうにもならんならあきらめろ
ttp://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/audiocapture.html
886デフォルトの名無しさん:2008/07/14(月) 13:05:12
>543
887デフォルトの名無しさん:2008/07/14(月) 13:10:26
そういえばそのコピペ4年前からあるな
888デフォルトの名無しさん:2008/07/14(月) 15:04:10
>>843
デフォ型を全部const型にしておいて、>746,749の変形で
単項+で非constな参照を返すようにすればいい。
889デフォルトの名無しさん:2008/07/14(月) 15:15:00
Cのあるプログラムで作った内部データを、C++の別プログラムに渡して使用することって可能でしょうか。
CからC++の関数を呼ぶこと自体はextern "C"を使えばできるっぽいですが、データの受け渡しをどうやるのか…。
例えばファイルを吐き出させてC++の方で改めてそれを読む、というのは考えられますが、できれば変数のまま
やりとりをしたいと思っています。常識的な方法があるのだろうとは思いますが、勉強不足でわからないので、
よろしければ教えてもらえないでしょうか。
890デフォルトの名無しさん:2008/07/14(月) 15:18:25
>>889
普通にどちらからもアクセスできる構造体なり配列を使えばいいと思うよ。
勿論、単純な整数型などの変数でも構わないし。
891デフォルトの名無しさん:2008/07/14(月) 15:26:11
>>889
別のプログラムだから、ファイル経由したくないならプロセス間通信だね。
プログラムは同時に立ち上がってるんでしょ?

同時に動いていないならファイルに書き出すなりプロセス以外の状態での
データ保持を考えないといけなくなる。
892デフォルトの名無しさん:2008/07/14(月) 15:32:46
関数を呼ぶってあるけどどっちなんだろね。
893889:2008/07/14(月) 15:57:33
回答ありがとうございます。

>>890
Cの方のプログラムは既存のブラックボックスで、挙動が不明な上に、C++側とは別プロセスになっています。

>>891
キーワードとしてはプロセス間通信が目的に合っていそうです。
状況としては
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31174&forum=7
が近い気がします。
一応プロセスは同時に動かす予定です。(C側でデータ作成が終わった段階でC++のプログラムを呼び出す)

しかしこの辺りの話題は用語からしてよくわからないです…。
普通の言語解説書には載っていない気がします。
入門用に丁度いい本をご存じないでしょうか。
894889:2008/07/14(月) 15:59:12
書き忘れ。
ググると、windowsAPIを用いた方法が山のようにでてきますが、今の環境はLinuxです。
できれば最初はOS依存性のない原理的な方法が知りたいと思っています。
895889:2008/07/14(月) 16:02:45
度々すみません。
TheUnixSuperText下巻の第9部がそれっぽい話題でした。
読んでみますが、他によりよい本があったら教えて頂けると幸いですorz
896デフォルトの名無しさん:2008/07/14(月) 16:19:01
>>893
>Cの方のプログラムは既存のブラックボックス
この時点でどうにもならないのでは? C++の方から無理やり
プロセス内メモリを覗くことは不可能じゃないけど、目的とする
データがどこにあるかとか知らないとダメだし。
897デフォルトの名無しさん:2008/07/14(月) 16:24:27
ブラックボックスのプログラムがどういったインターフェース用意しているかによるだろ
たとえばDLLならそれ専用のアクセス方法があるように
898デフォルトの名無しさん:2008/07/14(月) 16:38:53
>どういったインターフェース用意しているか
それがわかるんならこんな質問してくるかね?
899デフォルトの名無しさん:2008/07/14(月) 16:40:19
ブラックボックスのプログラムの仕様がわかないままで答えられない
900デフォルトの名無しさん:2008/07/14(月) 16:42:39
何もかもすべて明らかにならないと話もしたくないなら、
書き込まなきゃいいのに
901デフォルトの名無しさん:2008/07/14(月) 16:47:38
>>889>>893ではCのプログラムの説明が全然違うだろ
902デフォルトの名無しさん:2008/07/14(月) 16:47:42
float型の数値データが入ったファイルがあり、
そのファイルからデータを読み出す関数
(下記のReadData())があります。

long a0, lbytes, len;
void *buf ;

lbytes=4 * 1024;
buf = (void *)malloc(lbytes);
len = ReadData(a0, buf);

ファイルに格納されている値はfloat型だと
分かっているのですが、voidポインタで
しかもバイト数でメモリを確保して読み出す
使用になっているため、bufで示される領域の
データを、どうすれば1024個のfloat型の数値
に戻せばよいのか分かりません。

mallocでいろいろググッたのですが、確保される
領域に読み出されるのが、ひとかたまりの文字列
だったり、mallocの段階できちんとキャストされ
ていたりで、上記のような用例がありません。

上記のように、float型の複数個の数値をバイト数
で指定したメモリ範囲にひとかたまりで読み込んだ
ときに、これを元のfloat型の複数個の数値に直す
(例えばfloat val[1023]; に代入するとか)は
どうすればよろしいのでしょうか?

なんか手がかりを頂けるとうれしいです。
なにとぞよろしこ。
903デフォルトの名無しさん:2008/07/14(月) 16:54:42
>>902
float *float_buf;
float_buf=(float*)buf;
904902:2008/07/14(月) 17:04:02
読めたああああ!
ありがとう!
905889:2008/07/14(月) 17:05:20
>>897
おそらくまともなインターフェースは用意されていません。
C側でデータを吐かせたというのも、コードを解析してそれっぽい変数を推測し、
吐き出させるためのコードを無理やり追加してやったという感じです。
ただ、当然ながら、変数の型(structの構造)は明らかになっているので、同様の型を
C++側にも用意してやれば何とかプロセス間でデータを受け渡しできるのではないかと思っています。
しかしここまでわからないことだらけの状況ではファイルを経由するのが現実的かもしれません…。
906デフォルトの名無しさん:2008/07/14(月) 17:05:36
>>902
float * buf = malloc(sizeof(* buf) * 1024);
len = ReadData(a0, (void *) buf);
907デフォルトの名無しさん:2008/07/14(月) 17:08:12
>>905
既存のロジックではファイルを出力しているの?
それだったらそこはそのまま使えばいいじゃん。
解析できないソースならシンプルがベストだよ。
実験してみてパフォーマンスに問題があるなら
その先を検討すればいいのだし。
908デフォルトの名無しさん:2008/07/14(月) 17:10:00
>>905
ブラックボックスって言ってたけど、
もしかしてソースは有るの?
それともマシンコードを直にいじった?
909デフォルトの名無しさん:2008/07/14(月) 17:11:21
>>908
後者のノウハウがあったらこんなぐだぐだな質問しないよ。
910デフォルトの名無しさん:2008/07/14(月) 17:13:12
ただいまVisualStudio2008でC言語を学習しています。
サイン・コサインについて質問なのですが、例えば、

double angle = 0.0, answer = 0.0;
answer = cos( angle );
 
という計算。angleに50を代入するとanswerの値は0.964966。
しかし、Windowsの電卓でcos( 50 )を計算すると0.642787…となり、値が全く違います。
これはどうやったら正確な計算ができるようになるでしょうか?
911デフォルトの名無しさん:2008/07/14(月) 17:17:23
>>910
電卓のRadを選択してから計算してみ。
912デフォルトの名無しさん:2008/07/14(月) 17:17:42
>>910
Windowsの電卓での 三角関数の引数の単位は 度 で受ける(デフォルト:ラジオボタン Deg がそれ)
C言語の 三角関数の引数の単位は ラジアン で受ける

つまり単位をあわせろ ということだ
913デフォルトの名無しさん:2008/07/14(月) 17:18:02
>>910
関数の仕様をMSDN辺りできちんと読みましょう。

一般的に、角度の単位には度(°)ではなくradianが使われます。
914デフォルトの名無しさん:2008/07/14(月) 17:23:03
>>911-913
なるほどラジアンでしたか…
もっとよく仕様を読んでみます。即レスありがとうございました。
915デフォルトの名無しさん:2008/07/14(月) 17:27:10
あるテキストファイルに
「数字aを表示。」という文章が有り、
string にファイル入力し、
int a=256で宣言して、画面出力で

「数字256を表示。」と表示させる方法はありませんか?
ゲーム製作中に主人公の名前等を変数に格納して
別ファイルにキャラの会話等を分割したいのです。

ソース内に台詞を全て直書きするほうが楽でしょうか?
916デフォルトの名無しさん:2008/07/14(月) 17:34:11
>>915
テキストファイル内の $hero を主人公の名前 $heroine をヒロインの名前
のように置き換えるのがいいと思う

接頭辞+変数名+接尾辞 とか
917デフォルトの名無しさん:2008/07/14(月) 17:36:45
>>916
それはファイル入力時に1文字ずつ読んで、接頭辞から接尾辞までを変数名
とする、みたいな入力をするということでしょうか?
918デフォルトの名無しさん:2008/07/14(月) 17:38:10
>>915
テキストファイルで一行読み込んで、特定の文字が出たら

例えば
名前[0]を表示

[0] → [] + 数字 で 数字番目キャラの名前を表す って言うように決めておいて
[0]の部分を名前で置き換えればいいと思う
919デフォルトの名無しさん:2008/07/14(月) 17:38:52
うは、被りまくりんぐ
920デフォルトの名無しさん:2008/07/14(月) 17:43:00
テキストファイルに
 |"数字%dを表示。" 0
 |"名前%sを表示。" 1
とかはどうよ?

"で挟まれた区画は printf フォーマットそのもの
後ろの 0 や 1 を見つけて どの変数にするかを決める
921デフォルトの名無しさん:2008/07/14(月) 17:58:24
Cで文字加工はめんどくさいからスクリプト言語に任せると楽かと。
const char * hero = "太郎";
sprintf(cmd, "/bin/sed -e 's/\$hero/%s/g' scriptFile", hero);
FILE * fp = popen(cmd, "r");
fgets(buf, sizeof(buf), fp);
pclose(fp);
printf("%s", buf);
922デフォルトの名無しさん:2008/07/14(月) 18:06:14
メンテ中のソースに出てきたらコメントアウトするレベル。
923デフォルトの名無しさん:2008/07/14(月) 18:13:01
>>921
冗談だろw
「ゲーム」だと言ってるのに外部プロセスなんぞを
spawnして一体何フレーム待たせる気だ

やるならLuaあたりを埋め込むのがゲームのやりかたでしょう
924デフォルトの名無しさん:2008/07/14(月) 18:19:09
やりたいことがただのテンプレートの置換処理なら、
ttp://labs.preferred.jp/azarac/tutorial.php
こういうのが役に立つかもしれない

本来はWebで使うことを目的にした代物だが
925デフォルトの名無しさん:2008/07/14(月) 18:22:27
>>923
>921をゲーム中でやると考える方がどうかしている。
んなもん、起動時に一回やればいいことだろうよ。
926デフォルトの名無しさん:2008/07/14(月) 18:27:10
>>925
え?質問者の趣旨的には、
実行時の変数の状態に応じてメッセージの内容を生成したいわけだろ?

何言ってんだかさっぱりわからんが、酔ってんじゃねえの?
927デフォルトの名無しさん:2008/07/14(月) 18:30:43
ヒント:

実行時なんて誰も書いていない。
928デフォルトの名無しさん:2008/07/14(月) 18:32:38
ユーザーに名前を変えさせたいのか、開発時で登場人物の
名前が確定してないのか、どっちかな。
ゲーム中と書いてあるので、たぶん前者だと思うが。
929デフォルトの名無しさん:2008/07/14(月) 18:33:46
ああよみちがい。
「ゲーム製作中」か
930デフォルトの名無しさん:2008/07/14(月) 18:37:10
何か質問内容が不十分で誤解を生じていそうで申し訳有りません。

要は、
int main(){
string scr;
string name="主人公";
ifstream ifs("script.txt");
ifs>>scr;

}

テキストファイルscript.txtを用意
内容:
nameは死んでしまった・・・

これをprintfで表示した時に
出力:
主人公は死んでしまった・・・

を行いたいんです。nameはユーザーに入力してもらうつもりで、テキストファイルそのもの
を書き換えてしまうのはセーブを行う上で都合が悪いです。

>>928
前者です。
931デフォルトの名無しさん:2008/07/14(月) 18:46:37
>>930 C++で書いてみた。入力文字列の $hero$ および $heroine$ をそれぞれおきかえるサンプル
#include <iostream>
#include <map>
#include <string>
void puts_var(std::map<std::string,std::string> var_map, std::string var_name){
std::string puts_string=var_name;
if(var_map.find(var_name)!=var_map.end()) puts_string=var_map[var_name];
std::cout << puts_string;
}
void puts_string(std::map<std::string,std::string> var_map, std::string target){
unsigned chk_start, var_start, var_end;
std::string var_name;
for(chk_start=0;(var_start=target.find("$", chk_start))<target.size();){
if((var_end=target.find("$", var_start+1))>=target.size()) break;
std::cout << target.substr(chk_start, var_start-chk_start);
if(var_end==var_start+1){chk_start=var_end+1;std::cout << "$";continue;} // $$ で $ 一文字出力
var_name=target.substr(var_start+1, var_end-var_start-1);
puts_var(var_map, var_name);
chk_start=var_end+1;
}
std::cout << target.substr(chk_start);
}
int main(void){
std::map<std::string, std::string> var_map;
std::string oneline;
var_map["hero"]="太郎";
var_map["heroine"]="花子";
while(getline(std::cin, oneline)){
puts_string(var_map, oneline);
std::cout << std::endl;
}
}
932デフォルトの名無しさん:2008/07/14(月) 18:49:35
読んでないけど{$name}形式にしとけ。
終端が曖昧だとろくなことがない。
933デフォルトの名無しさん:2008/07/14(月) 21:37:19
>>931
参照は嫌い?

というのは置いといて、istream作って変換しつつ読むほうがそれっぽいと思った。
934931:2008/07/14(月) 21:43:26
>>933
確かにistreamにした方がよさげですね
935デフォルトの名無しさん:2008/07/14(月) 22:39:35
>>930
何文字目に"name"があるか探して、(n文字目)

前の部分(1〜n-1)を出力
変数nameの内容を出力
後ろの部分(n+4〜src.size())を出力

これだと最初の1つしか置換されないから、
後ろの部分からまた"name"を探して、
と見つからなくなるまで続ける

と、このレベルの質問なんじゃないかと思った。
936デフォルトの名無しさん:2008/07/14(月) 23:38:32
クラスの宣言より後、定義より前のところでsizeof演算子を使うとコンパイルエラーになるのですが
なんとかなりませんか?
937デフォルトの名無しさん:2008/07/14(月) 23:44:02
>>936
ならないので関数化してください
938デフォルトの名無しさん:2008/07/14(月) 23:55:58
こんな関数を考えましたが、うまく動きませんでした

template<T t>
int getsize(T t){
  return sizeof(t);
}

どんな関数なら良いのでしょうか?
939デフォルトの名無しさん:2008/07/14(月) 23:56:39
template<class T>だった
940デフォルトの名無しさん:2008/07/15(火) 00:06:12
>>938
配列相手にうまくいかないというのなら、引数をconst T&にすれば動くと思う。
単にTだと、Tは要素へのポインタ型になるという規則があったはず。

ちなみに、配列を相手にしているなら、boost::sizeというものが既にある。
コンテナに使えばsize()を返すなどといった方向性での汎用化が進んでいる。
941デフォルトの名無しさん:2008/07/15(火) 00:14:52
いや、配列じゃなくってクラスです

boost::pool<> p(sizeof(T))
てなものを書きたくて
942デフォルトの名無しさん:2008/07/15(火) 00:34:20
950踏んだら次スレ立て?
943デフォルトの名無しさん:2008/07/15(火) 00:59:33
C#みたいにref xとか明示するようにしてればこんなに荒れなかった。
ハゲ言語実装者が悪い。
944デフォルトの名無しさん:2008/07/15(火) 01:04:47
splintなら、hoge(/* out */ n); みたいなコメントつけないと警告でるとかって機能があったよね。
ちがうやつだったかな?
945デフォルトの名無しさん:2008/07/15(火) 01:04:49
ref a = ref(b + ref c); ですね、わかります。
946デフォルトの名無しさん:2008/07/15(火) 03:29:49
単項+演算子って何のためにあるんですか?
947デフォルトの名無しさん:2008/07/15(火) 03:36:26
-の逆で、正を表現するためじゃないの?
948デフォルトの名無しさん:2008/07/15(火) 03:47:15
そんだけですか?

オーバーロードしてない単項+演算子が何かを起こしうる場合があれば教えて下さい
949デフォルトの名無しさん:2008/07/15(火) 05:09:31
ByVal とか ByRef とか VB.NET らしくて良いですね
950デフォルトの名無しさん:2008/07/15(火) 11:11:24
言語への質問になりそうなのですが、質問です
typeofというものが、コンパイル環境によってあったりなかったりするのですが、
なんでVS2008にすら存在しないのでしょう?

「なんでって言われても、実装してないから実装してないんだよ」とかそんな返答を得そうな質問ですが
あまりに不思議なもので

typeof(data)::iterator it = data.begin();
ってかければどれだけ楽かと思うのですが…
951デフォルトの名無しさん:2008/07/15(火) 11:33:53
C++でのファイルからのデータ入力について質問があります。
文字と数字が混在しているファイルから、それぞれを区別して読み取りたいときどうすればよいのでしょうか。
具体的には

L 15
123 456
134 467
145 478
156 489

L 31
23 256
44 267
45 278
56 300

といった感じのデータがたくさんあり、"L"に続く数字がオブジェクトのID番号、
それ以下の行がオブジェクトの要素(具体的にはx,y座標)です。
ここから順次データを読んでいって、オブジェクトを生成しつつデータをセットする
ということをしたいと思っています。
基本的で申し訳ないですが、教えていただけないでしょうかorz
952デフォルトの名無しさん:2008/07/15(火) 11:36:00
>>950
C++の規格にはtypeofなんてものは存在しない
一部のコンパイラが独断と偏見で勝手に言語を拡張してるだけ
953デフォルトの名無しさん:2008/07/15(火) 11:38:24
>>951
常に文字(列)として読み取り、それが数字であったならその文字(列)は数値に変換する
954デフォルトの名無しさん:2008/07/15(火) 11:39:52
>>951
int a;
char b;
fscanf(fp, "%c %d", &b, &a);
955デフォルトの名無しさん:2008/07/15(火) 12:30:10
C++の不幸は全てのClassに共通の唯一の祖先が無い事だと思う
956デフォルトの名無しさん:2008/07/15(火) 12:32:22
不幸かなあ
あえてそっちを選択したんじゃないの
957デフォルトの名無しさん:2008/07/15(火) 12:36:52
>>950
C++0xのdecltypeあたりがきな臭いな。実験的にやってるコンパイラはあるのだろうな。
958デフォルトの名無しさん:2008/07/15(火) 13:39:09
>>952
なるほど、VCは規格に厳密と。便利なので浸透してほしかったところですね

>>957
C++0x、いったいいつになったら来るんでしょうね('A`)そしていつ頃浸透するのやら

>>955
C/C++の理念として、何もしなければ一番早いモードになるってのがありますよ
だから共通の祖先をもって(つまり仮想関数を持つ祖先を持つという意味ですよね)しまうと、クラス関数呼び出しが仮想関数テーブル参照になってしまって遅くなるので避けたのでは?
959デフォルトの名無しさん:2008/07/15(火) 14:43:50
>>957
decltypeっていう字面からは型を作りそうに見えるけどね
960低脳:2008/07/15(火) 15:07:19
先生
>>931について
istream用いたときの>>931はどう書くんですか?
961デフォルトの名無しさん:2008/07/15(火) 15:12:30
VC9でtypeofが欲しいならBOOST_TYPEOFかなぁ。
962デフォルトの名無しさん:2008/07/15(火) 16:33:01
>>959
int n1;
decltype(n1) n2;

ってことができるらしいよ
n2は当然intになる
便利だなぁこれ
963デフォルトの名無しさん:2008/07/15(火) 16:38:52
いつからVCやBCBでそれが使えるようになるの?
964デフォルトの名無しさん:2008/07/15(火) 16:50:12
auto it = data.begin();
965デフォルトの名無しさん:2008/07/15(火) 17:01:54
VCは2008SP1で大きく変わるんだったか?
BCBは・・・無理じゃねw
966デフォルトの名無しさん:2008/07/15(火) 17:58:33
>>964
期待してVS2008でテストしたのに、未対応じゃねーか。・゚・(ノД`)・゚・。
予約語にはなっているようだが・・・(文字色が青にかわった)
967デフォルトの名無しさん:2008/07/15(火) 17:59:46
auto int i; // == int i;
968デフォルトの名無しさん:2008/07/15(火) 18:00:53
autoって自動変数の明示的宣言じゃないの?
969デフォルトの名無しさん:2008/07/15(火) 18:04:35
ここは value でw
970デフォルトの名無しさん:2008/07/15(火) 19:11:49
>>966
autoはもともと大昔のCの名残のようなキーワード。
ずるずるとC99/C++03でも残っているから当然青くなるわけだ。
971デフォルトの名無しさん:2008/07/15(火) 19:17:07
C習いたての頃に律儀にregister int i;などと宣言して先輩に苦笑されたことを思い出した
972デフォルトの名無しさん:2008/07/15(火) 19:20:20
今ここで見るまで存在を忘れていた>register
973デフォルトの名無しさん:2008/07/15(火) 20:05:57
>>949
> ByVal とか ByRef とか VB.NET らしくて良いですね

ずれすぎ。
974デフォルトの名無しさん:2008/07/16(水) 01:00:23
登録する関数を作ろうとすると地味にキーワードで困る>register

この間は友人がfarを変数名に使おうとしてはまっていた
975デフォルトの名無しさん:2008/07/16(水) 08:21:07
形容詞をそのまま変数名にしようとするのが間違い。
976デフォルトの名無しさん:2008/07/16(水) 09:59:02
CのコードをC++でコンパイルしようとしてよく引っかかるのがnew
977デフォルトの名無しさん:2008/07/16(水) 12:28:59
_register
_far
で大丈v
978デフォルトの名無しさん:2008/07/16(水) 12:51:11
>>977
突っ込まれるの期待してるみたいなので、あえて突っ込まない。
979デフォルトの名無しさん:2008/07/16(水) 13:32:27
>>977
MLB延長戦でそれどころじゃないので、あえて突っ込まない。
980デフォルトの名無しさん:2008/07/16(水) 14:06:24
飯食って戻ってきたらまだやってたのかー
981デフォルトの名無しさん:2008/07/16(水) 15:17:40
結局15回か。カズミア使わないでくれって言ってたのにしょうがないかw
982デフォルトの名無しさん:2008/07/16(水) 15:32:38
char *p, c[] = "hogehoge";
p = c;

printf("%d %d", (int)sizeof p, (int)sizeof c);


こうやった場合 c のサイズが4バイトにならないのは何故ですか?
c がc[]の配列の初めのアドレスを指すのなら

と書いていたら何故だか分かりました、本当にありがとうございました
983デフォルトの名無しさん:2008/07/16(水) 15:42:10
>>982
ならいちいち書かんでいいわいw
984デフォルトの名無しさん:2008/07/16(水) 18:17:04
まずはぬいぐるみに話しかけてみろなんて話も聞くよね。
985デフォルトの名無しさん:2008/07/16(水) 18:59:34
教わる時に使う頭と、教える時に使う頭って別なんだな
両方使うと理解が深まる、と
986デフォルトの名無しさん:2008/07/16(水) 19:39:26
int c[] = {0x41, 0x48, 0x4F};
printf("%d", (int)sizeof c);
さらに混乱すると
987デフォルトの名無しさん:2008/07/16(水) 20:18:03
どこで混乱しようか
988デフォルトの名無しさん:2008/07/16(水) 21:11:14
>>984
ベアプログラミングですね、分かります
989デフォルトの名無しさん:2008/07/16(水) 21:18:04
                   |::|::::l:::!:::/ \:::::: ヾ:::|::::::::| ::i::::1::リ:::: |: i:::::::::::::ゝ 
 __                |::|::::|:::l::ハ|_ ヾ ::::::| ヽィ::::j/=、|::::::|::::7: /:::i::::| ____ 
     \ :'´⌒ヽ         |::ハ:::V:::| イ⌒゙`\:i リ \|ノ 弋_フノ /:::/: / 
      |i   " )_,,, _     l:ゝ::.\::i〃⌒゙ヽ  〃⌒゙ヾ //::) | 'ハ::::: |     コ
 た や |i         ヽ   | ト/人7} 〃〃    〃〃´ ∠イr 'ちノ::::: |     ン
 え っ  |i      / ・ i     イ:リ::::|    '、        |:::::rイ:::::::: |      パ
 ち た  |i          t    / i:::::ハ    r‐--ー、     /ハi!:::::::::::::::: | 通   イ
 ゃ ね  |i         〃 ●   ハ::::::: \   .イ_ _,,ツ  イ/'/:::::::::::::. <  っ   ル
 ん    |i   r一 ヽ      )  /i::ハi::::i:::::>,, ___ _,, ´ /,,ハ/|/:::ii:::::::: |  た  が
 !    |i   |   i   ∀"    "  ̄ ̄     ト、  //ヽ  ̄" ̄  | よ
        |i   |    i   ノi            ノ:r j       :ア` …‐: | 
       |i ニ|   |二二◎        __,..'| /        /   :::: | 
       |i  i    i   ヽ      __,,:'´   t/       /    :: | 
       li           }    ,_:'´     {    ,,___ /     ,,/i \____ 
990デフォルトの名無しさん:2008/07/16(水) 21:22:55
ああ、次はコアダンプだ‥‥
991デフォルトの名無しさん:2008/07/16(水) 21:48:03
http://www32.ocn.ne.jp/~graph_puzzle/gazou/hidoukei.jpg

グラフのシミュレーションをしているのですが、
この図のグラフにて「青から赤」にするためのプログラムが作れず困っています
詳細はあとで記載します
992デフォルトの名無しさん:2008/07/16(水) 21:49:40
>>991
いえいえ、遠慮していただいて結構ですよ。
993デフォルトの名無しさん:2008/07/16(水) 21:55:37
埋めるか?
994デフォルトの名無しさん:2008/07/16(水) 21:57:22
>>984
ああ、だからフィギュアが置いてあるのか!
995デフォルトの名無しさん:2008/07/16(水) 21:57:29
インクリメント
996デフォルトの名無しさん:2008/07/16(水) 22:06:22
俺はsizeofに括弧を付ける派
997デフォルトの名無しさん:2008/07/16(水) 22:12:38
じゃあreturnにも括弧付けるんだね
998デフォルトの名無しさん:2008/07/16(水) 22:14:45
returnは単独で文になるからつけないが、
sizeofは要素にしかならないからつける派
999デフォルトの名無しさん:2008/07/16(水) 22:16:59
うめますか
1000デフォルトの名無しさん:2008/07/16(水) 22:17:35
うめます
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。