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

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

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

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2 ◆3.JjF77I26 :2008/08/06(水) 20:59:15
2get
3デフォルトの名無しさん:2008/08/06(水) 21:17:19
                          刀、           , ヘ
                  /´ ̄`ヽ /: : : \_____/: : : : ヽ、
              ,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
               /: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
     ,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
    /: :.,.-ァ: : : |: : : : : : : : :    :\: : : : :: : : :ヽ  \   /: : : :/
    ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i  / /: : : : :/
     /: :     ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/  /: : : : :/         、
.    /: : /  . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : |  /: : : : :/            |\
   /: : ィ: : : : :.i: : |   \!___/ ヽ:: : : : : : :\|:.:.:.:/:!  ,': : : : /              |: : \
   / / !: : : : :.ト‐|-    ヽ    \: : : : : l::::__:' :/  i: : : : :{              |: : : :.ヽ
   l/   |: : :!: : .l: :|            \: : : l´r. Y   {: : : : :丶_______.ノ: : : : : :}
      l: : :l: : :ト、|         、___,ィ ヽ: :| ゝ ノ    '.: : : : : : : : : : : : : : : : : : : : : : /
      |: : :ト、: |: :ヽ ___,彡     ´ ̄´   ヽl-‐'     \: : : : : : : : : : : : : : : : : : イ
        !: :从ヽ!ヽ.ハ=≠' , ///// ///u /           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      V  ヽ|    }///  r‐'⌒ヽ  イ〉、
              ヽ、______ー‐‐' ィ´ /:/:7rt‐---、       こ、これは>>1乙じゃなくて
                  ィ幵ノ ./:/:./:.! !: : : : :!`ヽ     ポニーテールなんだから
              r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\   変な勘違いしないでよね!
4デフォルトの名無しさん:2008/08/06(水) 21:19:28
                ,. -─‐ー=-<._   ノ―- 、
              ,. '´: : : : : : : : : : : : : :`:<: : : `ヽ、_` 、__
          ,. -一'´: : : : : : : : : : : : : : :   : : : ヽ: : : : :.ヽ ̄
       ,. '´:  . : : : : : i: : : : : : : : :ヽ.   :',: : :.丶: : : : :.\
     ,. '´ ,'       イ:.∧:.ヽ: : : : : : :.',: : : . .:',=-: :}:::: : :|: : : ヽ
   _,. '´-‐'7  . . : : : : :/|:.l ヽ: :l\‐- 、: :.',: : : : :.!: : :.`、::: :lミ、: :.}/^i
.   ̄    /: : : : :i: : : : l, |:.|   \! \: : : : ',: : : : .!: :.〃}::: :l }: :/ イ
       /: : :./: :!: : :./| l:|     ヽ  \: : :.',: : :l:.|: ://:|::::/ノ‐'´ノ/
      /: : /{: : |: : : : | l:l       r勿示ミ、',: :.!:.|彡':::!:/´   ィ_
      l: :/ !: : l: :.l: :.lxィキ       !::fr..:ト、!: ト.:ト、::::从 ,. ' ´ `i
      |/   |: : :!: ヽ.:{ 代..ヽ     代.じ:| |: l´ヘ Y  ノ'´     |
        |: : : ',: :.ト〈{:::じi|      辷ソ  !/ }} ノ /        l._  私じゃ>>1乙って出来ないみたい
           l: : : ∧:.い弋ソ  .     xxx ,.ァ '   {           }
         l: : / ヾヽ}xxx   __,.    ∠、    l           l
            !: :l     ヽ、.__     ,. ィ〃: : y'⌒ヽ、!           |
         ヽ{         ,.`「¨刀´   /: : /     >、       l
                ノ ノ: : :l   /: /    ,. '´ .::rヽ、     ヽ
               / ヽ: : :.l  //   /   ,.. |        }
                   {     \:| //  ,. '´  /   !          |
                 /\      Y/ イ    /            ノ
5デフォルトの名無しさん:2008/08/07(木) 01:34:19
>>4
つかさちゃんきゃわあああああああああああ!!!!!!!!!!!!
つかさちゃんとちゅっちゅしたいよ〜
6デフォルトの名無しさん:2008/08/07(木) 01:47:42
gdbで一行ずつ見ていくとSegmentationFault出さずに終了するんだけど
普通に実行するとエラー吐いて終了してしまいます。こういう場合どんな原因が考えられますか?
7デフォルトの名無しさん:2008/08/07(木) 01:49:47
>>6
ポインタが初期化されていない
8デフォルトの名無しさん:2008/08/07(木) 16:54:51
うははははは
9デフォルトの名無しさん:2008/08/08(金) 00:49:32
float i = 0.0f;

while( i != 7.0f) {
i += 0.1f;
}

これだとwhileで7が認識されず終わらない。
0.2とか色々数値を変えても終わらない。

でもi += 1だと終わる。
なぜか 1を半分に割っていく数値0.5,0.25.0.125といった数値なら抜けれる。

謎過ぎてもう頭がパーンしそう。
誰か原因わかる人居ますか?
10デフォルトの名無しさん:2008/08/08(金) 00:54:18
>>9
そこまで分かってるなら、もう分かるだろ。
11デフォルトの名無しさん:2008/08/08(金) 00:54:54
>>9
9割自分で答えが導けてるじゃないか

2進数で小数を表現すると、0.5、0.25、0.125…しか正確に表せないからだよ
でも丸めが出るから処理系によって上手く「動いてしまう」ときもある。
12デフォルトの名無しさん:2008/08/08(金) 00:55:10
浮動小数点数でwikiれば自ずとわかる
13デフォルトの名無しさん:2008/08/08(金) 00:56:02
>>9
浮動小数点数(float/double)で表現できる数値について
14デフォルトの名無しさん:2008/08/08(金) 00:57:28
学校の宿題なんだろ。
>なぜか 1を半分に割っていく数値0.5,0.25.0.125といった数値なら抜けれる。
これは、そのヒントっぽいな。本人はわかってなかったり。
15デフォルトの名無しさん:2008/08/08(金) 01:00:46
な・・なんだと・・・

そんな法則があったのかw

自力でその法則を発見した俺は数学者になる素質があるな、と思った。

とりあえずおまいらありがとう。
16デフォルトの名無しさん:2008/08/08(金) 01:03:13
数学者?
17デフォルトの名無しさん:2008/08/08(金) 01:18:35
>>15
すばらしい。
18デフォルトの名無しさん:2008/08/08(金) 01:22:30
車輪の再発見、数学屋のサヨナラ
ttp://jp.youtube.com/watch?v=c2SURtxy6i0
19デフォルトの名無しさん:2008/08/08(金) 01:58:58
少数を比較するときは範囲で比較しようって学校で教えてくれなかったんか?
20デフォルトの名無しさん:2008/08/08(金) 10:28:33
複数行の文章が書いてあるテキストファイルから
一行ごとにもじれすを抜き出す方法を教えてくださいm(_ _)m
21デフォルトの名無しさん:2008/08/08(金) 10:53:10
もじれすってなに?
22デフォルトの名無しさん:2008/08/08(金) 10:55:11
文字列のことだろうか。
fgets()は? あるいはcin.getline()とか。
23デフォルトの名無しさん:2008/08/08(金) 11:47:26
ttp://www.rupan.net/uploader/download/1218163435.cpp
上記ファイルの内容は、キュー構造をint型配列を用いて実装したものです。
これは、リストを用いてキュー構造を実装したものと比較して、完全に劣るものでしょうか?
占有するメモリ量の点で劣っているのは分かっています。
24デフォルトの名無しさん:2008/08/08(金) 12:08:50
申し訳ありませんが、詰まってしまったので・・・

XP SP2
VS2005 c++8.0
なのですが、 MultiByteToWideChar を行った際に、変換後の文字列にゴミが付加されてしまいます
なぜなんでしょ・・・

以下、コードです。よろしくお願いします。

CString UtoT(const xmlChar* str, int len)
{
CString ret;
if (str)
{
int wclen = MultiByteToWideChar(CP_UTF8,0, (LPCSTR)str, len, NULL, 0);
LPWSTR wcbuf = ret.GetBuffer(wclen);
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR%
2524:2008/08/08(金) 12:11:15
途中送信に成ってしまったので、もう一度。

CString UtoT(const xmlChar* str, int len)
{
CString ret;
if (str)
{
int wclen = MultiByteToWideChar(CP_UTF8,0, (LPCSTR)str, len, NULL, 0);
LPWSTR wcbuf = ret.GetBuffer(wclen);
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)str, len, wcbuf, wclen);
ret.ReleaseBuffer();
}
return ret;
}

26デフォルトの名無しさん:2008/08/08(金) 12:15:23
>>24-25
0でターミネートしてないだけじゃない?
MB2WC()のlenをlen+1にすれば解決する予感。
27デフォルトの名無しさん:2008/08/08(金) 12:39:28
>>23
たぶん配列のキューの方が速い
要素を追加/削除するたびにメモリの確保/解放をせずに済む
リストのキューは、追加/削除するたびにノードを確保/解放する必要がある

メモリ効率は、配列のキューは要素が空いててもその分のメモリを解放できない点で無駄があるが、
リストのキューも要素ごとに次のノードを指すポインタが必要という点でやはり無駄な部分がある
どっちが特に優れているというわけではない
状況に応じて使い分けるもの
2824:2008/08/08(金) 12:46:26
>>26
解決しました。ありがとうございます。

29デフォルトの名無しさん:2008/08/08(金) 12:55:17
>>27
ありがとうございました。
キューのサンプルを探したところ、リストを用いたものばかりだったので
疑問に思い、質問した次第です。
30デフォルトの名無しさん:2008/08/08(金) 12:57:54
地震だ><
31デフォルトの名無しさん:2008/08/08(金) 14:41:50
キューならstd::dequeかboost::circular_bufferが良いのじゃないかな
32デフォルトの名無しさん:2008/08/08(金) 14:58:10
>31
ありがとうございます。
わざわざ作らずとも、すでに用意されているのですね
33デフォルトの名無しさん:2008/08/08(金) 21:09:10
こんにちは。ポインタと free() についての質問になると思います。
C は初心者ながらも単機能な Web サーバを作ってみようと思い立ち、
libevent を触ってみています。 evbuffer という構造体が出てきますが、
evbuffer_free() では orig_buffer と buffer を free() しています。

void
evbuffer_free(struct evbuffer *buffer)
{
 if (buffer->orig_buffer != NULL) free(buffer->orig_buffer);
 free(buffer);
}

そこで、 orig_buffer と buffer の正体を見てみようと、 PHP でいう
print_r のような関数を作って調べてみました。

evbuffer: 0x606080
size_t misalign: 0, totallen: 256, off: 4
void* cb: 0x0, cbarg: 0x0
u_char* buffer: 0x609100 [HOGE]
u_char* orig_buffer: 0x609100 [HOGE]

buffer と orig_buffer は同じ場所を指しているように見えます。
二回も free() して大丈夫なのでしょうか。
3432:2008/08/08(金) 21:11:20
関係ありそうなところをはっときます。直リンクがうまくいくかわかりませんが…。

libevent/event.h (BSDL) http://toku.xdisc.net/cgi/up/vcc/nm0687.txt
libevent/buffer.c (BSDL) http://toku.xdisc.net/cgi/up/vcc/nm0688.txt
testcode.c (as-is でお願いします) http://toku.xdisc.net/cgi/up/vcc/nm0689.txt
35デフォルトの名無しさん:2008/08/08(金) 21:20:12
>>33 のアドレスでいうと
if(0x609100 != NULL) free(0x609100);
free(0x606080);
になると思いますよ
36デフォルトの名無しさん:2008/08/08(金) 21:23:53
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
free() はポインタ ptr が指すメモリ空間を解放する。
このポインタは、以前に呼び出された malloc(), calloc(), realloc() のいずれかが返した値でなければならない。

これ以外のポインタを指定したり、すでに free(ptr) が実行されていたりした場合の動作は定義されていない。

ptr が NULL の場合には、なんの動作も行われない。

3732:2008/08/08(金) 21:36:55
>>35
よくわかりました。ものすごく勘違いしていました!
free(buffer->buffer); しているものと空目していました。
ありがとうございます!
38デフォルトの名無しさん:2008/08/08(金) 22:22:48
Effective C++ 第3版12項にコピーコンストラクタの実装でコピー代入演算子を
呼び出すことはナンセンスと書いてあるが、実際どういう弊害があるんですか?

これでいい気がするんだけど。
ClassA& operator=(const ClassA& rhs)
{
 メンバ変数 = rhs.メンバ変数;
 return (*this);
}

ClassA::ClassA(const ClassA& rhs)
{
 (*this) = rhs;
}
39デフォルトの名無しさん:2008/08/08(金) 22:53:35
初期化リストが使えないとか
その例だと意味無いが
40デフォルトの名無しさん:2008/08/08(金) 23:52:12
>>38
もしoperator =はthisがすでに初期化済みであることを前提にしたコードを書いた場合、
コピーコンストラクタの中では初期化されていないので=演算子を使えないという事態に陥ってしまう。
そうでないとしても、時と場合にもよるが一般的にデフォルト構築+代入演算はコピーコンストラクタよりコストがかかるとされている。

Effective C++に載っていなかった気がするからここに書くけど、
こうやって、=演算子はコピーコンストラクタ(とswap)を使って実装できる。元ネタはExceptional C++。
ClassA& operator=(const ClassA& rhs)
{
  ClassA tmp(*this);
  tmp.swap(rhs);
  return *this;
}
41デフォルトの名無しさん:2008/08/08(金) 23:58:59
実害はないんじゃないの?
「覚えておくこと」のところに共通の処理は別の関数に実装すれば良い
みたいなこと書いてあるし

「代入は既に存在するモノの値を変えるのに使う。
 まだ存在していないモノに対して行うのはおかしい」って事だと読み取ったけど
42デフォルトの名無しさん:2008/08/09(土) 07:47:52
newで確保した領域の容量ってsizeofで求められないんですか?
byte *p=new byte [1000];
int size=sizeof(p);
ってしてもsizeof(p)が実行されなんですが何で?
43デフォルトの名無しさん:2008/08/09(土) 08:04:28
>>42
実行されます。
ポインタのサイズが返ります。
44デフォルトの名無しさん:2008/08/09(土) 08:42:21
>ってしてもsizeof(p)が実行されなんですが何で?
どうして>42みたいな質問する奴ってこれだけの文章もまともに書けないんだろうな。
しかも、ちょっと探せばすぐに見つかるのに。
4538:2008/08/09(土) 10:55:23
>>39-41
参考になります。
コストはかかるがoperator=をそれなりに実装しておけば問題ないってことですかね。
46デフォルトの名無しさん:2008/08/09(土) 12:12:19
atan2のテーブルを高速参照したいんだが何かいい方法はないですか?
高速であればテーブルじゃなくてもいいです
環境はcygwin上のgccで、math.hとかはあります
47デフォルトの名無しさん:2008/08/09(土) 12:15:15
>>46
必要な精度、引数の制約条件は?
4846:2008/08/09(土) 12:52:21
>>47
精度は単精度floatです。
制約条件っていうのがよくわからないので教えてください
49デフォルトの名無しさん:2008/08/09(土) 14:02:30
>>48
引数ってんだから、その形式とか範囲とかじゃね?
三角関数系はゲームとかだと360度やラジアンでやるより
一周を0xffや0xffffにしたほうが扱いやすいし…、とかそういう
ことだと思うが。あ、おれ47じゃないから
50デフォルトの名無しさん:2008/08/09(土) 14:23:07
>>49
形式はfloatで1周1024で分割
ってかんじでいいんですかね?
51デフォルトの名無しさん:2008/08/09(土) 14:38:22
それだったら、単にテーブルを作るだけでいいと思うが。
52デフォルトの名無しさん:2008/08/09(土) 14:39:30
atan2だと、引数の精度(x,y)がfloatで、戻り値の角度が一周1024ってこと?
45度ごとに場合分けして、小さい方を大きい方で割って、
まあ2048倍して、テーブル2048個から0〜1023を返すようにすりゃいんじゃない?
倍にしてるのは気分的に。
53デフォルトの名無しさん:2008/08/09(土) 14:40:50
あ、ちょっと違うか、1週1024なら45度の範囲だとその
1/8のテーブル量で済むわ
54デフォルトの名無しさん:2008/08/09(土) 16:25:42
どうでもいいけど、atanをあーたんと読むとちょっとカワイイよな
55デフォルトの名無しさん:2008/08/09(土) 16:33:17
独学でC++、DirectX、Win32APIでゲームを作り始めたんですが、
いつも設計に悩まされ、綺麗な形にできません。

起動した瞬間開始する単純な2Dシューティングから始まり、
メニュー画面を追加し、一時停止画面を追加し、
エロゲーみたいな会話画面をはさみ、3D描画を入れたりと、
機能追加するごとに、設計がぐだぐだで汚くなっていきます。

プログラムは2chとグーグルだけで覚えたので、
他人が作ったアプリのソース全体を見たことがないんですが、
アプリケーション全体の設計を勉強するにはどうすればいいでしょうか?

何かお勧めの本があったら教えてもらえませんか。
56デフォルトの名無しさん:2008/08/09(土) 16:34:22
あーくたんもカワユイ
57デフォルトの名無しさん:2008/08/09(土) 16:43:22
>>55
適当なデザインパターンの本を読んでふむふむと思いつつ、
あとは習うより慣れろで行くしかないと思う。
俺も同じような時期があったから一言だけ言わせてもらうと、
『本当に必要のないものは実装するな』の一言に尽きる。

>>54
こたんはなんか犯罪の香り
58デフォルトの名無しさん:2008/08/09(土) 17:08:08
>55

まずは構造化プログラミングですね。>57の言うようにデザインパターンとかってのもあるけど、

>起動した瞬間開始する単純な2Dシューティングから始まり、
>メニュー画面を追加し、一時停止画面を追加し、
>エロゲーみたいな会話画面をはさみ、3D描画を入れたりと、
>機能追加するごとに、設計がぐだぐだで汚くなっていきます。

を見る限りでは、オブジェクトとのマッピングや責務分割を考えるよりも、スパゲッティっぽくなってるのをちゃんと整理する力をつけるのが先かと。

あと、今時、全てを一つのEXEで作らなくても良い、と言うのも重要。
59デフォルトの名無しさん:2008/08/09(土) 17:25:52
ゲームだとタスクシステムとかかなぁ
60デフォルトの名無しさん:2008/08/09(土) 19:09:19
>>43
ありがとう
ずっと確保した容量が返ってくるものだと勘違いして使ってた
61デフォルトの名無しさん:2008/08/09(土) 19:42:01
確保サイズが知りたい場合は_msizeだそうな(注:Windows限定)
62デフォルトの名無しさん:2008/08/09(土) 20:15:29
× Windows限定
× VC限定
63デフォルトの名無しさん:2008/08/09(土) 20:17:03
>>62
ワロタ
6455:2008/08/09(土) 20:31:01
>>57
まだ、何ができるかをちゃんと把握してないので、
思いついたものや試しをどんどん追加実装してるのが一番問題っぽいですが、
習作なので仕方ないかなとも思います。
実装するものの全体像を把握するまで、慣れるしかないですかね。

>>58
EXEを分割できるとは知りませんでした。
そういう場合、複数EXEで共用するモジュールを作ったりするんでしょうか。
それともまったく独立して複数作るんですか?
65デフォルトの名無しさん:2008/08/09(土) 20:57:30
>実装するものの全体像を把握するまで、慣れるしかないですかね。
ゲームプログラマーから一言。

あとからいくらでも追加に耐えられるように組むこと。
全体像なんて最初から最後まで同じである保証なんてどこにも無いよ〜

>EXEを分割できるとは知りませんでした。
ニュアンスが違うんじゃないか?

ゲームだったらEXE一個だよ。分割なんか考えなくていい。
まあ機能ごとにDLLに分解するのはあると思うが、まだそんなこと考えなくてもいいだろう。
66デフォルトの名無しさん:2008/08/09(土) 21:00:01
>>65
拡張性を無視して作って変更が出たら作り直すって手法なかったっけ?
一回やってみたいと思ってるんだが勇気がなんだ
67デフォルトの名無しさん:2008/08/09(土) 21:02:13
アジャイル?
68デフォルトの名無しさん:2008/08/09(土) 21:04:26
>>66
>拡張性を無視して作って変更が出たら作り直すって手法なかったっけ?
かってにすればーw








冗談じゃねー、1回作り直すのに数年かかるわ!
69デフォルトの名無しさん:2008/08/09(土) 21:05:36
XP?
70デフォルトの名無しさん:2008/08/09(土) 21:09:07
>>67>>69
ああ、そんなんだった、調べてみる
>>68
>冗談じゃねー、1回作り直すのに数年かかるわ!
俺もそう思うんだ、だからやってみたことはない。
でも手法として確立してるからにはどうにかなるのだろうとは思う。
ちょっと調べてみていけそうなら今度提案してみる。
71デフォルトの名無しさん:2008/08/09(土) 21:14:43
XPでなんとなく理解できたのはペアプログラミングくらいだったな
72デフォルトの名無しさん:2008/08/09(土) 21:32:10
>>52,53さんありがとうございます。

また質問になりますすみません。
環境は>>46と同じです

error: cannot convert 'Bullet (*)[100]' to 'Bullet**' for argument '4' to 'void Shot(int, Image*, MyShip*, Bullet**)'

という意味はわかるのですがですが、改善法が分からないエラーが出て困っています


typedef struct{

}Bullet;

Bullet shot[100];

Shot(ctrlmode, bullet, &MyShip, &shot);

void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet *shot[]){略}


どこがいけないのでしょうか?
73デフォルトの名無しさん:2008/08/09(土) 21:35:51
構造体の中身を全て = 0 にするにはどうしたらいいですか。
宣言のときなら struct hoge a = {0}; でできると思いますが。
全ての中身に対して = 0 をするコードを書くしかないですか。
74デフォルトの名無しさん:2008/08/09(土) 21:37:22
構造体の中身が全て整数型なら0にmemsetすることで実現できます。
それ以外の場合は0を意味する値を代入するしかありません。
75デフォルトの名無しさん:2008/08/09(土) 21:44:03
>>73
struct hoge a;

...;

struct hoge zero = {0};
a = zero;
76デフォルトの名無しさん:2008/08/09(土) 21:52:47
a = hoge();
77デフォルトの名無しさん:2008/08/09(土) 21:53:49
>>72
Shot(ctrlmode, bullet, &MyShip, shot);

void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet shot[]){略}
78デフォルトの名無しさん:2008/08/09(土) 21:55:23
>>72
引数shotの型が違う。
Bullet shot[100]; のとき、&shotは配列へのポインタで
関数の仮引数のBullet *shot[]はBulletへのポインタへのポインタ。

何がしたいのか良く分からんけど。

Bullet shot[100];
void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet *shot){略}

Bullet *shot[100];
void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet *shot[]){略}
こうで、

Shot(ctrlmode, bullet, &MyShip, shot);
こうじゃね?
79デフォルトの名無しさん:2008/08/09(土) 22:16:58
>>78
配列がまずいのですかね?

両方ともやりましたが結果は同じでした・・・
80デフォルトの名無しさん:2008/08/09(土) 22:19:24
MyShip *MyShipってありなのかぁ…
81デフォルトの名無しさん:2008/08/09(土) 22:24:44
>>79
結果は同じって同じエラーってこと?
82デフォルトの名無しさん:2008/08/09(土) 22:55:22
newでchar型の配列を1521090492個以上確保したらエラーがでるのですが何故でしょうか?
メモリは4G積んでるんでメモリが足りなくて確保できないってことではないと思うんですが
newで確保できるのは1521090492byteまでって決まってたりするんですか?
83デフォルトの名無しさん:2008/08/09(土) 22:57:40
それはコンパイラを作った人に訊いてくれ。
84デフォルトの名無しさん:2008/08/09(土) 23:09:26
どんなエラーよ?

他にもOSとかコンパイラとか色々あるじゃん。書くことが。
85デフォルトの名無しさん:2008/08/09(土) 23:09:59
ごめんなさいコンパイルは通るけど、それを実行すると確保するところでエラーでる
mlock.cの
void __cdecl _unlock (int locknum){
    //leave the critical section.
    LeaveCriticalSection( _locktable[locknum].lock );
}

0x7d4f2366 でハンドルされていない例外が発生しました: Microsoft C++ の
例外: std::bad_alloc (メモリの場所 0x0012fe40)。
ってエラーがでます
これってコンパイラかデバッガの仕様なんですか?

ソースはこんなのでnewのところでエラー
int main(){
    char *p;
    p=new char [1521090493];
    delete [] p;
    return 0;
}
86デフォルトの名無しさん:2008/08/09(土) 23:13:25
>>85
そもそもWindowsでは32ビットアプリで32ビット(2GiB)以上のメモリ空間をアクセスする単純な手段は提供されていません。
大人しく64ビットアプリを作るか、ありえないメモリ戦略を諦めることをお勧めします。
87デフォルトの名無しさん:2008/08/09(土) 23:13:45
OSはXPx64でコンパイラはVisualStudio2008Proです
タスクマネージャでみるとメモリのコミットチャージは
newで確保前は470MB/3826MBで充分空いてます
88デフォルトの名無しさん:2008/08/09(土) 23:13:49
std::bad_allocでググれば。
89デフォルトの名無しさん:2008/08/09(土) 23:17:44
>>86
ありがとうございます。32ビットでも2Gまでならいけるはずですよね
とりあえずこんなに確保するつもりは無いんですが、色々試したら[1521090492]
を超えたところでエラーがでたので興味本位できいてみただけです。
>>88
ググったら色々情報でてきた。あとは自分で調べてみることにします
90デフォルトの名無しさん:2008/08/09(土) 23:23:14
ゲームでアジャイルとかできるんかね。
ゲーム作ったことないけどテストパターンが割りと膨大になりそうにおもう。
91デフォルトの名無しさん:2008/08/09(土) 23:34:15
Code::Blocks(MinGWつき)とwxWidgetsをWindows XPにインストールした後、
「壮大な一歩を踏み出すぞ〜」と意気込んで、とりあえずwxWidgetsプロジェクトではなく
以下のコードをビルド、出来上がったexeをコマンドプロンプトにて実行しました。

#include <iostream>
using namespace std;

int main()
{
cout << "こんにちわ世界" << endl;
}

日本語は文字化けしてしまったので、プロンプトのフォントをMSゴシックに変えたんですが
それでも駄目で、壮大な一歩を踏み外してしまいました。
Unicodeがらみの文字化けというところまでは分かるのですが、解決策が分かりません。
Code::Blocks WikiのWxWindowsQuickRefに書かれているBuild wxWidgetsはすでに終えたのですが、
まだwxWidgetsを使う所まで行ってないので、関係ないだろうし。

Code::BlocksとwxWidgetsでC++を始めようと考えていたのですが、かなり道は険しいようです……。
92デフォルトの名無しさん:2008/08/09(土) 23:41:13
>>91
ソースコードの文字コードを変えてみては?
93デフォルトの名無しさん:2008/08/09(土) 23:43:18
なんでもいいけど、int main なら値返そうよ。
2歩目も怪しい。
94デフォルトの名無しさん:2008/08/10(日) 00:00:03
>>93
C++ならmainでreturnしないとreturn 0:したことになるって規則があって問題ない。
省略していいかどうかはまた別問題。
95デフォルトの名無しさん:2008/08/10(日) 00:02:54
UNICODEで文字列を表示したいのか
単に日本語を表示したいのか
96デフォルトの名無しさん:2008/08/10(日) 00:23:39
>>91
g++なら--input-charset=cp932 --exec-charset=cp932でどう?
Code::Blocksでどう設定するかは知らないけど。
97デフォルトの名無しさん:2008/08/10(日) 01:00:10
ソースをUTF-8か何かで書いてるのかな
98デフォルトの名無しさん:2008/08/10(日) 05:48:46
これって問題あるでしょうか?

struct hoge {
int x;
};

hoge *ptr;
hoge &ref = *ptr;
ptr = new hoge; //参照を作った後に確保
ref.x = 1;     //参照からアクセス
99デフォルトの名無しさん:2008/08/10(日) 06:09:09
問題なし
100デフォルトの名無しさん:2008/08/10(日) 08:14:01
>>98
問題あり
101デフォルトの名無しさん:2008/08/10(日) 08:23:27
問題あり。
refの指している先はnewされたところではない。
102デフォルトの名無しさん:2008/08/10(日) 08:32:10
動かしてないけど
hoge &ref = *ptr;
のところで落ちるんじゃない?
ptrは無効なポインタだからね、この時点で。
103デフォルトの名無しさん:2008/08/10(日) 08:43:02
そもそもなんでnewしたいんだ?
そこから見直すべきだな。
104デフォルトの名無しさん:2008/08/10(日) 08:44:01
>>102
試して落ちたの?
中身へのアクセスは無いからそこじゃ落ちないと思うけど。俺は試してないw
105デフォルトの名無しさん:2008/08/10(日) 08:49:34
遅れてすみません

>>80
それはまずいですかね?
別の名前に変えてみます

>>81
言葉が足りませんでした、すみません
まさにその通りです
106デフォルトの名無しさん:2008/08/10(日) 08:52:57
>>104
そうかもね
「動かしてない」って書いたジャン・・
107デフォルトの名無しさん:2008/08/10(日) 09:05:21
規格的に、どこを指してるかわからないポインタに"*"を適用した時点で、鼻から悪魔が出るかもしれない、はず。
実装的にも、大抵は「どこを指してるかわからないポインタ変数の指すアドレス」をコピーして別の変数に保持するだけだろうから
HDDをフォーマットしてスパムメールを送りまくってももおかしくない、はず。
108デフォルトの名無しさん:2008/08/10(日) 09:56:02
>HDDをフォーマットしてスパムメールを送りまくってももおかしくない、はず。
おかしいと思います。文章が。
109デフォルトの名無しさん:2008/08/10(日) 11:53:58
いいもも〜
110デフォルトの名無しさん:2008/08/10(日) 11:57:43
>>109
中学生の太もも??
いいももだよねーーー
ハァハァハァハァハァハァハァ
111デフォルトの名無しさん:2008/08/10(日) 12:46:00
mapに関する質問です。以下のようなプログラムをビルドした際に、
(1)または(2)のように記述するとエラーとなりました。
   error C2662: 'MYTYPE::hoge' : 'const MYTYPE' から'MYTYPE &' へ 'this' ポインタを変換できません

なぜ(1)(2)だと失敗するのか、(3)だと成功するのか教えていただけないでしょうか。
※環境 WindowsVista, Visual C++ 2008 Express

map<string, vector<MYTYPE> > mapA;

for(map<string, vector<MYTYPE> >::const_iterator it = mapA.begin();
  it != mapPitcher.end(); ++it)
{
 // イテレータを用いた方法
 for(vector<MYTYPE>::const_iterator it2 = it->second.begin();
   it2 != it->second.end(); ++itv)
 {
  it2->hoge();  // (1)コンパイルエラー
 }
 
 // イテレータを用いない方法
 for(vector<MYTYPE>::size_type size = 0; size != it->second.size(); ++size)
 {
  it->second[size].hoge();     // (2)コンパイルエラー
  mapA[it->first][size].hoge();   // (3)成功
 }
}
112デフォルトの名無しさん:2008/08/10(日) 12:57:20
>>111
MYTYPE::hogeがconstでないから、const MYTYPEに対してhogeを呼べない。
試しに↓やってみ。
const MYTYPE x;
x.hoge();
↓のようにhogeにconstを付ければok。
struct MYTYPE {
void hoge() const;
};
void MYTYPE::hoge() const {
...
}
113111:2008/08/10(日) 13:36:10
>>112
ありがとうございます。関数にconstをつけることで(1)(2)ともにコンパイルに成功することができました。ただ、

>const MYTYPE x;

のように、変数宣言の時にconstをつけた場合に

>void hoge() cosnt;

とすればよいと自分なりに解釈したのですが、変数宣言は上で書いたとおり

map<string, vector<MYTYPE> > mapA;

とMYTYPEにconstをつけていません。どこでconstがついたのか教えていただけないでしょうか。
たびたびで申し訳ありませんが、よろしくお願いします。
114デフォルトの名無しさん:2008/08/10(日) 13:46:47
const_iteratorだからじゃね
115デフォルトの名無しさん:2008/08/10(日) 14:25:37
>>113
>どこでconstがついたのか
根本的に勘違いしてる。オブジェクトがconstかどうかと、
メンバ関数のconst指定は、まったく無関係ではないが
基本的に別物
116111:2008/08/10(日) 14:27:47
>>114
const_iterator → iterator とすると、エラーになりませんでした。
イテレータについてまだ理解していないので、勉強したいと思います。
ありがとうございました。
117111:2008/08/10(日) 14:34:27
>>115
>>113の解釈は間違っているということですね。
オブジェクトのconstとメンバ関数のconst指定について調べていきたいと思います。
ご指摘、ありがとうございます。
118デフォルトの名無しさん:2008/08/10(日) 14:40:31
わざわざconst_iteratorを使ってるからには、constになることくらいわかってるんだと思ってた
世の中難しいものだ
119デフォルトの名無しさん:2008/08/10(日) 14:44:38
>>118
イテレータについての理解があまりなく、参考書丸写ししてました。
120デフォルトの名無しさん:2008/08/10(日) 17:12:14
C言語の標準ライブラリ関数qsortについての質問です
この関数はメモリ上で連続していない配列に対しても動作は保証されているんでしょうか?
121デフォルトの名無しさん:2008/08/10(日) 17:16:50
>>120
各要素は連続している必要があります。
122120:2008/08/10(日) 17:27:06
>>121
そうでしたか。
回答ありがとうございました。
123120:2008/08/10(日) 17:32:00
よく考えたら連続していない配列って・・・。
お恥ずかしい限りです。
124デフォルトの名無しさん:2008/08/10(日) 19:07:36
ttp://www.rupan.net/uploader/download/1218362175.cpp
ttp://www.rupan.net/uploader/download/1218362441.h
ttp://www.rupan.net/uploader/download/1218362315.cpp
上から、main.cpp,sample.h,sample.cpp です。すべて同じディレクトリに配置されています。

staticメンバ変数についての質問なのですが、上のファイルのように
ヘダファイル内のクラスでstatic変数dataを宣言し、同名cppファイル内で定義しようとすると、
main.cppで「Error: 外部シンボル 'Sample::data' が未解決」と出てしまいます。
int Sample::data = 0; の記述をヘッダファイル内に移動させればコンパイル通りますが、
解説しているサイトなどを見る限り、これは良くない書き方のような気がします。
どこに問題があるのか、ご教授ください。
125デフォルトの名無しさん:2008/08/10(日) 19:11:02
少しスレ違いかもしれませんが、VC++で作った実行ファイルについての質問です。

リリースビルドした実行ファイルを覗くと、pdbファイルへのパスがそのまま残っているのですが、
これは他の数、例えば0x00等で塗りつぶしてしまってもいいのでしょうか?
問題なく動いているように見えますが、異常終了した際になにか不具合がでたりしませんか?
126デフォルトの名無しさん:2008/08/10(日) 19:12:35
>124
失礼しました、コンパイラはBorland C++ 5.5.1です。
127デフォルトの名無しさん:2008/08/10(日) 19:25:40
>>124>>126
BCCなら、多分Makefileの問題じゃないかね?

コンパイルするときに分割コンパイルするオプション付いてる?
-oか何かだと思うけど。
128デフォルトの名無しさん:2008/08/10(日) 19:27:39
ごめん。大嘘コイた。

多分-c
129デフォルトの名無しさん:2008/08/10(日) 19:38:36
>127-128
ありがとうございます!ご指摘のとおりでした。
130デフォルトの名無しさん:2008/08/10(日) 20:31:47
>>125
そんな面倒なことしなくてもコンパイラオプションで消せる。
131デフォルトの名無しさん:2008/08/10(日) 21:29:52
>>130
ありがとうございます。
なんでデフォでリリースビルドにデバッグ情報埋め込んでるのやら……
132デフォルトの名無しさん:2008/08/10(日) 21:35:02
以下のようにvoid*型にポインタを変換したとき、
delete時にデストラクタが呼ばれるでしょうか?
class test
{
 int *p;
public:
 test(){
  p = new int();
 }
 ~test(){
  delete p;
 }
};

int main()
{
 void *ptr = (void*)(new test());
 delete ptr;
 return 0;
}
133デフォルトの名無しさん:2008/08/10(日) 21:41:28
>>132
鼻から悪魔。
134デフォルトの名無しさん:2008/08/10(日) 21:42:01
_
135デフォルトの名無しさん:2008/08/10(日) 21:49:05
>>132
delete p;
の上にprintfを入れて試してみては?
136132:2008/08/10(日) 21:58:43
>>135
試してみた。呼ばれないみたいだね。
137デフォルトの名無しさん:2008/08/10(日) 22:13:19
そりゃvoid*で型情報消してるし
138デフォルトの名無しさん:2008/08/10(日) 22:15:03
じゃあどうしてvoid*型の変数をdelete/delete[]しようとするとエラーが出るようにはならないんですか?
new void;とかできませんよね?なぜ?どうして?
139デフォルトの名無しさん:2008/08/10(日) 22:20:42
>>131
リリース版でもデバッグできるって結構便利だと俺は思う。

>>138
エラーにしたいという要望だけはboost::checked_delete使えば叶う。
あと、boost::shared_ptr<void>だとデストラクタが呼ばれるというマジックもある。
140135:2008/08/10(日) 22:28:54
>>138
gccならwarning deleting void* is undefinedって警告がでた。
141デフォルトの名無しさん:2008/08/10(日) 23:59:16
>>73なんだけど
gccで構造体を = {0} して初期化すると、「最初以外の、他の中身の初期化子(?)がない」っていう警告が出るんだけど、
これは無視してもいいの?
142デフォルトの名無しさん:2008/08/11(月) 00:01:16
それ構造体か?構造体の配列とかでやってないか?
143デフォルトの名無しさん:2008/08/11(月) 00:15:36
構造体です。例えば具体的に言うと、struct tm(mktimeとかで使う、time_tを要素毎に分けた奴)で、
struct tm a = {0}; ってすると、
*.cpp:36: warning: missing initializer for member `tm::tm_min'
*.cpp:36: warning: missing initializer for member `tm::tm_hour'
*.cpp:36: warning: missing initializer for member `tm::tm_mday'
*.cpp:36: warning: missing initializer for member `tm::tm_mon'
*.cpp:36: warning: missing initializer for member `tm::tm_year'
*.cpp:36: warning: missing initializer for member `tm::tm_wday'
*.cpp:36: warning: missing initializer for member `tm::tm_yday'
*.cpp:36: warning: missing initializer for member `tm::tm_isdst'
って出ます。(最初のtm::tm_secだけ警告が出ない)
コンパイル時の設定は -Wall -W ってやってるんだけど、問題ないんだったら、これだけ警告でないようにできないかな…
144デフォルトの名無しさん:2008/08/11(月) 00:32:29
なら
struct tm a = {0, 0, 0, 0, 0, 0, 0, 0, 0};
にすると出なくなるような気がしないでもない。
145デフォルトの名無しさん:2008/08/11(月) 10:02:02
テンプレートの引数にoffsetofを使いたいのですが、
offsetに使用するパラメータがprivate内にあると
エラーがでてしまいます。

なんとかメンバをprivateにしたいのですが、
手は無いでしょうか。

template <int T> class test {
};

class Hoge1 {
  friend test<offsetof(Hoge1, Hoge1::a)>;
public:
private:
  int a;
};

以下の様にするとエラー無し。

template <int T> class test {
};

class Hoge1 {
public:
  int a;
};

test<offsetof(Hoge1, Hoge1::a)>;

よろしくお願いいたします
146デフォルトの名無しさん:2008/08/11(月) 10:09:31
>>145
そもそもクラス(非PODか?)では、変数が宣言順に配置されるという保証がなかったと思う。
危険コードかもよ。
147デフォルトの名無しさん:2008/08/11(月) 10:15:39
>>146
こらこら
クラスは変数が宣言順に配置されるぞ
メンバ関数だけは別扱いだけど
メンバ関数ポインタも宣言順に配置される
148デフォルトの名無しさん:2008/08/11(月) 10:20:49
>>145
そのコードの目的が分からん
offsetofを使わずに済むコードを考えた方がいいんじゃない
見てていらつくコードなんだけど
149デフォルトの名無しさん:2008/08/11(月) 10:23:11
C++でクラス内でoffsetofを使うのは大抵委譲を使う場合だな
150デフォルトの名無しさん:2008/08/11(月) 10:35:42
else if{
}

else{
  if{
  }
}
とで内部的に違いありますか?
見た目的にネストは浅くした方がいいのかな?
151デフォルトの名無しさん:2008/08/11(月) 10:36:40
>>150
前者はelseの後に複文が書けない
後者は複文が書ける

それ以外は同じ
152デフォルトの名無しさん:2008/08/11(月) 10:40:10
>>147
非PODだと「変数が宣言順に配置されるという保証がない」ではなくて、
「offsetofマクロが正常動作する保証がない」だった。
(自分は規格を読んでないから↓の受け売りだけど)

ttp://www.kijineko.co.jp/tech/cppemb/alignment.html

まあ145のコード通りならPODだから問題なさそうだけど、
いつPODでなくなるか分からないから怖いな。
153デフォルトの名無しさん:2008/08/11(月) 10:43:23
>>151d!
154デフォルトの名無しさん:2008/08/11(月) 14:01:01
>>147
一般論?
なら順序が保証されるのはアクセス指定子が間に挟まらない場合だけだった気がする。
155152:2008/08/11(月) 14:09:51
>>154
あ、そうだ。それを聞いたことがある。
156デフォルトの名無しさん:2008/08/11(月) 17:40:19
昔、sunかどっかのCコンパイラのstructのメンバの順番が
ソースの上下と逆だった覚えがある。

それ以来構造体のメンバの順番に依存したコードは書かなく
なったので、構造体が拡張されたC++ではどうなのか気にした
こともないやw
157デフォルトの名無しさん:2008/08/11(月) 17:43:39
トラウマというやつですね
158デフォルトの名無しさん:2008/08/11(月) 20:29:46
仮に配置が宣言順にならない場合も、初期化子の実行順は保証されますか?
159デフォルトの名無しさん:2008/08/11(月) 20:32:15
>>158
されます
宣言順です
並べた初期化子の順ではありません
160デフォルトの名無しさん:2008/08/11(月) 20:44:05
C言語検定の1級をもってるとゲームプログラマーとして就職するときどのくらい有利ですか?
161デフォルトの名無しさん:2008/08/11(月) 20:45:56
宣言順にならないとき、Cスタイルの初期化はプログラマの意図した通りになる?
struct hoge {
int a;
int b;
};
hoge h = {1,2};//h.a==1,h.b==2
162デフォルトの名無しさん:2008/08/11(月) 20:46:48
>>160
それでやっと最低限。しかも資格持っていないC言語分かってる
連中とまったく対等くらい
163デフォルトの名無しさん:2008/08/11(月) 20:48:41
こころなしか足しになる程度であんまり意味は無いんじゃないかと
あの程度は研修で叩き込まれたらすぐ身に付くレベル
他の要素のほうが重要視されるだろう
164デフォルトの名無しさん:2008/08/11(月) 20:52:45
なるほど、じゃあ線形代数ができる等 のほうが強みになるってことですか。
スレ違いの質問に答えていただきありがとうございました。
165デフォルトの名無しさん:2008/08/11(月) 22:01:41
>>164
ゲームプログラマーとして(大手に)就職したいなら、普通に
大卒か院卒で、趣味でゲーム一本でも作っておけ。

チームで作ってメインプログラマ兼取りまとめ役とか
だとポイント高いよ。
166デフォルトの名無しさん:2008/08/12(火) 00:41:38
->
これはどういう意味ですか?
こんな感じで使われているようです。
node->setMaterialFlag(EMF_LIGHTING, true);

また何と呼ばれてますか?
->でgoogleで検索かけてもかからないので困ってます。
167デフォルトの名無しさん:2008/08/12(火) 00:44:37
>>166
アロー演算子

(*node).setMaterialFlag(EMF_LIGHTING, true)
の書き方が違うだけ
168デフォルトの名無しさん:2008/08/12(火) 00:45:51
あるクラスの実体である、node変数のsetMaterialFlag()メンバ関数を呼び出している

class CHoge
{
setMaterialFlag(XXX, bool){}
};

169デフォルトの名無しさん:2008/08/12(火) 00:50:21
>>167-168
わかりました。
即レスしていただきありがとうございました。
170デフォルトの名無しさん:2008/08/12(火) 01:01:33
なんでメンバのアクセスって.と->に分けてるんだろう。
どちらかに統一すると困るケースが思いつかないのですが、
何か理由があるのでしょうか?
171デフォルトの名無しさん:2008/08/12(火) 01:05:54
>>170
*(p + i)で事が足りるのにp[i]と書けるのと同じ理由で、
(* p).mで事が足りるけれどもp->mと書けるようにしてある。
172デフォルトの名無しさん:2008/08/12(火) 01:19:40
タイプを楽にするためですよ
173デフォルトの名無しさん:2008/08/12(火) 01:42:22
そういうのって糖衣構文と言うのだったかな?
174デフォルトの名無しさん:2008/08/12(火) 01:51:12
いや、ポインタでも実体でもどちらも.か->に統一してくれたほうが
ジェネリックプログラムで楽で、メリットがあるのではと思ったんですよ。

そういうメリットを捨てて*や->を使わせてるのは、
ポインタからメンバにアクセスするのに*をつかわないで直接
ptr.mで良いようにしてしまうと、言語仕様として何か不都合が
あるからなのかなと、疑問に思ったわけで。
175デフォルトの名無しさん:2008/08/12(火) 02:10:08
なんか数ヶ月前にも似たような話題があった。
176デフォルトの名無しさん:2008/08/12(火) 02:21:39
ptrptr-->m
177デフォルトの名無しさん:2008/08/12(火) 02:38:00
歴史的経緯は知らんが状態を持つイテレータを使うので . と->の両方が無いと困る。
178デフォルトの名無しさん:2008/08/12(火) 08:35:01
Cのころからそうだったのを受け継いでいるのはおいといて、
C++では「.」はオーバーロードできない(させない)という差がある。
->はオーバーロードできる。いろんな都合で現状のルールに落ち
着いてるようだ。
179デフォルトの名無しさん:2008/08/12(火) 09:23:53
Dだとどっちも . でいけるって話なかったっけ?
180デフォルトの名無しさん:2008/08/12(火) 10:05:56
gccで特定のファイルというか場所というかインクルードしたファイルに対してだけ警告がでないようにはできますか?
使っている環境のgccで警告を厳しくすると、stlに対して大量の警告がでてしまうので、うっとおしいんです
スクロールしないと見たい警告みれないですし
自分でstl側をいじれる環境ではないです
181デフォルトの名無しさん:2008/08/12(火) 13:55:55
配列とポインタで
A *a=new A[100];
A b[10][10];
とした時に
&((((*A)[10])a)[i][j]) - a == &(b[i][j]) - b
これって常に成り立ちますか?
182デフォルトの名無しさん:2008/08/12(火) 14:08:37
>>181
要するに要素数10の配列へのポインタへ強引にキャストして
成り立つかというわけでしょ。
そりゃ成り立つわ。
183デフォルトの名無しさん:2008/08/12(火) 16:00:44
サン・クスコ
184デフォルトの名無しさん:2008/08/12(火) 16:13:38
どういたしマチュピチュ
185デフォルトの名無しさん:2008/08/12(火) 16:46:23
マンコ=カパックがどうしたの?
186デフォルトの名無しさん:2008/08/13(水) 03:51:24
今知ったんだけど、newって失敗したらNULLを返すと思ってたけど違うのね
ずっと
p=new int [1000];
if(p==NULL){〜
みたいな意味ないことしてた…
187デフォルトの名無しさん:2008/08/13(水) 05:04:55
nothrow
188デフォルトの名無しさん:2008/08/14(木) 06:14:13

 パスの後ろに '\\' が無い場合は追加する関数を作ったんですが,
"像\\" とかだとさらに追加されて "像\\\\" になってしまいます.
 正確にやるには先頭から調べるか, wstring に変換するしかないでしょうか?

std::string& AddBackslashIfNotExist1(std::string* ptrPath)
{
  std::string& strPath = *ptrPath;

  if( strPath.empty() ) return strPath;

  if( strPath[ strPath.size()-1 ] != '\\' ) return strPath += '\\';

  if( strPath.size() > 1 )
  {
    if( _ismbblead( strPath[ strPath.size()-2 ] ) ) return strPath += '\\';
  }

  return strPath;
}
189デフォルトの名無しさん:2008/08/14(木) 06:19:58
要するにSJISの2バイト目が\の文字の対策ってことだよね?
先頭から見て行くか別の文字コードにするしか手は無いよ。
190デフォルトの名無しさん:2008/08/14(木) 06:49:20
>>188
SJISの1バイト目領域⊂2バイト目領域だから、これはいかんともしがたい。
191デフォルトの名無しさん:2008/08/14(木) 07:54:46
>>188
律儀に先頭から見る必要は必ずしもないけれど、1バイトずつ遡る関数を作ったところで効率はさほどよくならないね。
192188:2008/08/14(木) 08:14:20

>>189-191

解答ありがとうございます.
遡るのは面倒なので wstring に変換して調べることにします.
193デフォルトの名無しさん:2008/08/14(木) 16:13:51
C++のコンパイルの仕方がわかりません
194デフォルトの名無しさん:2008/08/14(木) 16:15:11
>>193
エイホが書いたドラゴンブックとか、アマゾンで「コンパイラ」関連の書籍を読んでみては?
195デフォルトの名無しさん:2008/08/14(木) 16:24:59
>>193はそういう質問なんだろうか

・ソースの拡張子をcppにしてみよう
・ccではなくc++コマンドを使おう
・makeのサフィックスルールなんかも気をつけよう

とかいうはなしかと思ってしまった
196デフォルトの名無しさん:2008/08/14(木) 16:44:05
あの、プロンプトからcppファイルをコンパイルしたいんですけど、どういうコマンドを打てばいいのか解らないんです。
197デフォルトの名無しさん:2008/08/14(木) 16:46:04
使ってるコンパイラは何よ?
それがわからなきゃこっちもエスパー回答しかできない
198デフォルトの名無しさん:2008/08/14(木) 16:48:42
Visual Studio 2008だと思います
199デフォルトの名無しさん:2008/08/14(木) 16:49:37
>>196
コマンドプロンプトはあきらめて、普通にビルドしてはいけないのですか?
200デフォルトの名無しさん:2008/08/14(木) 16:56:47
VC9ならcl ソースファイル名 だよ。
でもその前に vcvars32.bat を実行してからにしてね。
201デフォルトの名無しさん:2008/08/14(木) 16:57:07
>>199
コマンドプロンプトの方が手軽に見えたので
202デフォルトの名無しさん:2008/08/14(木) 17:01:23
有難う御座います。解決しました
203デフォルトの名無しさん:2008/08/14(木) 17:14:10
関数の戻り値を配列に場合どう記述すればいいのでしょうか?
204デフォルトの名無しさん:2008/08/14(木) 17:16:58
>>203
まずローカル変数を返さないように注意しろよ。
次に受け取った配列の先頭アドレスを返すようにするか、
もしくは配列そのものを返したければ構造体の中に配列を入れて
返すようにする。
205デフォルトの名無しさん:2008/08/14(木) 17:36:18
すごいコードに展開されててワロタ

#include <stdlib.h>

struct Int {
int N[10000];
};

struct Int func(struct Int a);

int main(void)
{
int i;
struct Int *a = (struct Int *)malloc(sizeof(struct Int));

for (i = 0; i < 100000; i++)
func(*a);

free(a);

return 0;
}

struct Int func(struct Int a)
{
return a;
}
206デフォルトの名無しさん:2008/08/14(木) 17:42:51
構造体にしまった意味が無いだろwwwww
207デフォルトの名無しさん:2008/08/14(木) 17:45:08
だって配列そのものを返すには?って聞かれたんだもんwww
208デフォルトの名無しさん:2008/08/14(木) 17:49:19
>struct Int *a = (struct Int *)malloc(sizeof(struct Int));
これ笑いどころ?
209デフォルトの名無しさん:2008/08/14(木) 17:49:48
そうでした
もうしわけありませんでした
210デフォルトの名無しさん:2008/08/14(木) 17:54:39
>>208
static領域に確保したらつまらないコードを吐くもんで
わざとそうした
211デフォルトの名無しさん:2008/08/14(木) 18:13:40
スレ誘導されてきました
#include <iostream>
using namespace std;
//2直線の交点を求める関数
double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope);
int main()
{
double P1[2] = {4, 10};
double P2[2] = {6, 18};
double S1 = 2/3;
double S2 = 1/3;
double ans[2] = {0, 0};


*ans = lineIntersect(P1, S1, P2, S2);

cout << "交点の座標は" << ans[0] << '/' << ans[1] << "です\n";

return 0;
}
double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope) {
double ans[2] = {0, 0};

ans[0] = (L1Slope * L1Point[0] - L2Slope * L2Point[0] + L2Point[1] - L1Point[1]) / (L2Slope - L1Slope);
ans[1] = L1Slope * (ans[0] - L1Point[0]) + L1Point[1];

return ans;
}
30分位調べたり考えたりしたのですが1つだけエラーが解決しません;;
cpp(29) : error C2440: 'return' : 'double [2]' から 'double' に変換できません。
212デフォルトの名無しさん:2008/08/14(木) 18:14:30
>double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope) {
>double [2]lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope) {
213デフォルトの名無しさん:2008/08/14(木) 18:19:00
ローカル変数のアドレスだと・・・
214デフォルトの名無しさん:2008/08/14(木) 18:23:34
(double *)[2]

どちらにしろ関数を抜けた時点で実体がなくなるわけだが。
構造体にして返すなり工夫をしろ
215208:2008/08/14(木) 18:26:09
>>210
なるほど。

>>211
だからぁ、向こうで書かれた注意を全く無視してんじゃねぇよ。
216デフォルトの名無しさん:2008/08/14(木) 18:26:20
構造体の考え方で記述してみます
アドバイスありがとうございました
217デフォルトの名無しさん:2008/08/14(木) 18:26:25
>(double *)[2]

これじゃエラーか

double (*)[2] だな
218デフォルトの名無しさん:2008/08/14(木) 19:22:40
ポインタ引数を使うのが普通かな。

double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope, double* ans1, double* ans2)
219211:2008/08/14(木) 19:32:40
構造体を利用して記述しています。
まだ途中ですができそうな気がしてきました。
結果が出たら報告します。
220デフォルトの名無しさん:2008/08/14(木) 20:03:47
#include <iostream>
using namespace std;
struct Point{
double L1Point[2];
double L2Point[2];
double L1Slope;
double L2Slope;
double num[2];
};
double ans[2];
Point pt = {10, 20, 20, 44, 10, 3, 3, 20};
double lineIntersect(Point* pt1);
int main()
{
*ans = lineIntersect(&pt);

cout << "答えは(" << ans[0] << ',' << ans[1] << ")です\n";
return 0;
}
double lineIntersect(Point* pt1){

pt1->num[0] = (pt1->L1Slope * pt1->L1Point[0] - pt1->L2Slope * pt1->L2Point[0] + pt1->L2Point[1] - pt1->L1Point[1]) / (pt1->L1Slope - pt1->L2Slope);
pt1->num[1] = pt1->L1Slope * (pt1->num[0] - pt1->L1Point[0]) + pt1->L1Point[1];

return pt1->num;
}
""""""'return' : 'double [2]' から 'double' に変換できません""""""
構造体でやってみたのですが同じエラーが出てできません;;
自分のスキルが足りないのは百も承知ですが誰かアドバイスいただけませんか?
214さんの(double *)[2]をどこかで使えばいいのでしょうか。
221デフォルトの名無しさん:2008/08/14(木) 20:11:45
>>220
×return pt1->num;
○return pt;
222デフォルトの名無しさん:2008/08/14(木) 20:12:56
×double lineIntersect(Point* pt1)
○struct Point *lineIntersect)

それから構造体へのポインタを渡しているので
戻り値は別にvoidでもよい。
223デフォルトの名無しさん:2008/08/14(木) 20:13:53
ところでC言語の仕様ではどうやっても配列そのものを返す事は
できんな。
返せたと思ったら配列へのポインタだったorz

#include <stdio.h>

double (*func(double (*a)[2]))[2];

int main(void)
{
double a[2][2] = {{1.0, 2.0}, {3.0, 4.0}};
double (*b)[2];

b = func(a);

printf("%f %f\n", b[0][0], b[0][1]);
printf("%f %f\n", b[1][0], b[1][1]);

return 0;
}

double (*func(double (*a)[2]))[2]
{
a[1][1] = 10.0;

return a;
}
224デフォルトの名無しさん:2008/08/14(木) 20:37:03
221さんと222さんの方法を試しても同じエラーが出たので
C言語の本をもう一度やり直してきます。

参考にしたいので誰か時間のある人がいたら
実行できるソース書き込んでもらえたら幸いです。

お騒がせしました。
225デフォルトの名無しさん:2008/08/14(木) 20:37:13
完全なソースを一応貼っておく。

#include <iostream>
struct Point {
double L1Point[2];
double L2Point[2];
double L1Slope;
double L2Slope;
double num[2];
};
Point* lineIntersect(Point* pt1);
std::ostream& operator<<(std::ostream& os, const Point& pt);
Point pt = {{10, 20}, {20, 44}, 10, 3, {3, 20}};
int main()
{
Point* ans = lineIntersect(&pt);

std::cout << "答えは(" << *ans << ")です\n";
}
Point* lineIntersect(Point* pt1)
{
pt1->num[0] = (pt1->L1Slope * pt1->L1Point[0] - pt1->L2Slope * pt1->L2Point[0] + pt1->L2Point[1] - pt1->L1Point[1]) / (pt1->L1Slope - pt1->L2Slope);
pt1->num[1] = pt1->L1Slope * (pt1->num[0] - pt1->L1Point[0]) + pt1->L1Point[1];
return pt1;
}
std::ostream& operator<<(std::ostream& os, const Point& pt)
{
os << pt.num[0] << ' ' << pt.num[1];
return os;
}
226デフォルトの名無しさん:2008/08/14(木) 20:40:33
それともう少し言えばC++ならlineIntersectはメンバ関数に
すべき。他の変数は全部privateにしてしまう。
227デフォルトの名無しさん:2008/08/14(木) 20:51:25
連投すまんがC++流に書くなら次のように書いた方が良い
#include <iostream>
class Point {
double L1Point[2];
double L2Point[2];
double L1Slope, L2Slope;
double num[2];
public:
Point() {
L1Point[0] = 10; L1Point[1] = 20;
L2Point[0] = 20; L2Point[1] = 44;
L1Slope = 10; L2Slope = 3;
num[0] = 3; num[1] = 20;
}
void lineIntersect() {
num[0] = (L1Slope * L1Point[0] - L2Slope * L2Point[0] + L2Point[1] - L1Point[1]) / (L1Slope - L2Slope);
num[1] = L1Slope * (num[0] - L1Point[0]) + L1Point[1];
}
friend std::ostream& operator<<(std::ostream& os, const Point& pt);
};
std::ostream& operator<<(std::ostream& os, const Point& pt);
int main()
{
Point ans;
ans.lineIntersect();
std::cout << "答えは(" << ans << ")です\n";
}
std::ostream& operator<<(std::ostream& os, const Point& pt)
{
os << pt.num[0] << ' ' << pt.num[1];
return os;
}
228デフォルトの名無しさん:2008/08/14(木) 20:56:25
>>225>>226>>227
ありがとうございます!
参考にさせてもらいます。
229デフォルトの名無しさん:2008/08/14(木) 21:37:19
C++を単なるBetter Cとして使うだけならそこまでする必要はない罠。
しかし日頃からC++を使い慣れている人には気持ちはわかる。

特にプログラムが大規模になればなるほどC流儀よりもC++流儀の方が
プログラムをコントロールする労力が遙かに少ない事がわかってくる。

namespaceの必要性も最初は理解できないだろうが、プログラムが大きく
なると必然的に必要性がわかってくるし。
230デフォルトの名無しさん:2008/08/14(木) 21:49:25
#include <iostream>
using namespace std;
class Point{
private:
double L1Point[2];
double L2Point[2];
double L1Slope, L2Slope;
double num[2];
public:
Point();
void lineIntersect();
void show();
};
//メンバ関数の定義
Point::Point(){
L1Point[0] = 9; L1Point[1] = 6;
L2Point[0] = 5; L2Point[1] = 6;
L1Slope = 2; L2Slope = 1;
num[0] = 0; num[1] = 0;
}
void Point::lineIntersect(){
num[0] = (L1Slope * L1Point[0] - L2Slope * L2Point[0] + L2Point[1] - L1Point[1]) / (L1Slope - L2Slope);
num[1] = L1Slope * (num[0] - L1Point[0]) + L1Point[1];
}
void Point::show(){
cout << "答えは(x=" << num[0] << ",y=" << num[1] << ")です\n";}
int main(){
Point pt;
pt.lineIntersect();
pt.show();
return 0;}
227さんのレスを見て自分なりにコードを書いてみました。無事実行できました。コードで直したほうがいいところがあったら指摘お願いします。
231デフォルトの名無しさん:2008/08/14(木) 21:52:18
>>230
いいんじゃね?特に問題となるような点はないみたいだ。

当初の質問の『関数から配列を返す』という話題からは
かけ離れてしまったけどそれはいいんだね?
232デフォルトの名無しさん:2008/08/14(木) 21:54:00
>>231
それも自分で納得できるように理解したいのですが
今のスキルじゃちょっときついのでC言語の本をもう一度読み返してからチャレンジしようと思います。
色々ありがとうございました。
233デフォルトの名無しさん:2008/08/14(木) 21:57:13
>>232
そうですか。

構造体へのポインタを使えば「データそのものを書き換えてくれ」と
委譲できるし、構造体を返すのは通常オーバーヘッドが大きいので
Cの流儀としてもあまりお勧めできない。

だから構造体へのポインタさえ理解すれば大抵の場合はそれでいいと思う。
234デフォルトの名無しさん:2008/08/14(木) 22:03:45
効率を無視してポインタを使わずに構造体そのものを返すという事になると
だいたい次のようなプログラムになると思う。
これが当初の『配列を関数から返す』に一番近い答えになるだろう。

#include <stdio.h>

struct Point {
double L1Point[2];
double L2Point[2];
double L1Slope;
double L2Slope;
double num[2];
};
struct Point lineIntersect(struct Point pt1);
struct Point pt = {{10, 20}, {20, 44}, 10, 3, {3, 20}};
int main(void)
{
struct Point ans = lineIntersect(pt);

printf("答えは(%f %fです\n", ans.num[0], ans.num[1]);

return 0;
}
struct Point lineIntersect(struct Point pt1)
{
pt1.num[0] = (pt1.L1Slope * pt1.L1Point[0] - pt1.L2Slope * pt1.L2Point[0] + pt1.L2Point[1] - pt1.L1Point[1]) / (pt1.L1Slope - pt1.L2Slope);
pt1.num[1] = pt1.L1Slope * (pt1.num[0] - pt1.L1Point[0]) + pt1.L1Point[1];
return pt1;
}
235デフォルトの名無しさん:2008/08/14(木) 23:50:41
catchで受け取る型をテンプレートにしたいのですが無理ですか?

//こんなの
template<class T>
} catch(T Obj) {
〜〜
236デフォルトの名無しさん:2008/08/14(木) 23:58:59
むりだお。 最低限共通の基底クラスから派生させるとかしないとだめ。
もう少し具体的に何がしたいのかを書けば誰か親切な人が考えてくれるかも。
237デフォルトの名無しさん:2008/08/15(金) 12:14:24
クラステンプレートか関数テンプレートの定義内で、テンプレート引数型でcatchすることは出来るんじゃない。
何がしたいのか分からないのでこれが解決になるのかは分からんが。
238デフォルトの名無しさん:2008/08/15(金) 15:42:47
class Base{};
class A:public Base{};
class B:public Base{};
みたいな感じで、
class A内で、Baseの値を変えたとき、
class BのBaseの値も変わっているようにするにはどうすればいいのでしょうか?
239デフォルトの名無しさん:2008/08/15(金) 15:45:58
>>238
そんなことをするくらいなら、class Bがclass Aを継承すればいいんじゃね?
240デフォルトの名無しさん:2008/08/15(金) 15:48:58
Baseが基底となる全クラスのインスタンスで値を共有したいならBaseの値をstaticにすればいい。
241デフォルトの名無しさん:2008/08/15(金) 16:00:19
>>238
宣言と実態をごっちゃにしていそうな気がするので、何をしたいのか詳しく。
242デフォルトの名無しさん:2008/08/15(金) 16:00:56
>>238
メンバをすべてstaticにしたらかっこいいYO!
243デフォルトの名無しさん:2008/08/15(金) 16:10:33
>>242
シングルトンの方が見通しが良くね?
244デフォルトの名無しさん:2008/08/15(金) 16:23:28
無理しないでグローバルな構造体でいいじゃん^^;
245デフォルトの名無しさん:2008/08/15(金) 16:30:15
>>244
アクセッサは欲しい
246デフォルトの名無しさん:2008/08/15(金) 18:35:18
ソースコードの書かれたテキストを読んで、
使われている変数や関数を解析するパーサみたいなものが作りたいのですが、
こういうのって一行まるごと読んで正規表現で抜き出したりって方法でいいんでしょうか。

効率的といいますか、定石みたいなのがあれば教えてください。
247デフォルトの名無しさん:2008/08/15(金) 18:39:40
一行づつで問題が発生しないならそれでいいんじゃね
248デフォルトの名無しさん:2008/08/15(金) 18:40:17
ひょっとしてCですか?
249デフォルトの名無しさん:2008/08/15(金) 18:50:45
ドラゴンブックに
250デフォルトの名無しさん:2008/08/15(金) 18:59:10
yaccとかbisonを使う方向の方が幸せになれそうだが
251デフォルトの名無しさん:2008/08/15(金) 19:00:24
>>246
プリプロセッサに通した後のファイルを読むようにすると随分と楽になる
252デフォルトの名無しさん:2008/08/15(金) 19:05:00
>>246
Cのソースコードを正規表現でパースすることは原理的に不可能であることがわかってる。
厳密でなくていいならどうとでも出来るけど、
そんなことを考えるより既存のライブラリやツールで処理した方がてっとりばやい。
ctags とかではいかんのか?
253デフォルトの名無しさん:2008/08/16(土) 13:52:50
配列のポインタから中身サイズを取得する方法ありますか?
sizeof()だとポインタそのもののサイズが取得される
254デフォルトの名無しさん:2008/08/16(土) 13:53:34
>>253
ないです。
255デフォルトの名無しさん:2008/08/16(土) 13:57:02
sizeofnakami()
256デフォルトの名無しさん:2008/08/16(土) 13:57:18
間違ってるかもしれないけど、
呼び出した関数の中とか、現在のスコープにおいてその配列の要素数が
わからない場所でsizeofを使ってもそのポインタのサイズしか得られない。
要素数はなんらかの方法で渡さなきゃならない
257デフォルトの名無しさん:2008/08/16(土) 14:19:00
>>253
環境依存でよければあるよ
258デフォルトの名無しさん:2008/08/16(土) 17:05:41
わたし環境依存それわからなーず
259デフォルトの名無しさん:2008/08/16(土) 17:39:58
環境依存・・・
それは標準の方法では決してできないことを平然とやってのける魔法の道具
しかし環境が変わると途端に動かなくなる諸刃の剣
260デフォルトの名無しさん:2008/08/16(土) 17:40:35
if( ! a=Test() )
代入かつ否定 はこれでおk?
261デフォルトの名無しさん:2008/08/16(土) 17:47:01
不安ならなんでも括弧つけとけ、損はしない
>>260
ダメ。

代入をカッコで囲んでそれを否定する。
263デフォルトの名無しさん:2008/08/16(土) 17:54:21
把握
264デフォルトの名無しさん:2008/08/16(土) 19:16:54
関数へのポインタの配列を動的に確保するにはどうすればいい?
int size=10;
void(**ppfunc)(void);
ppfunc=new void(*)(void)[size];
とかだとコンパイルが通らない。typedefするしかないのかね
265デフォルトの名無しさん:2008/08/16(土) 19:55:53
>>264
C的に考えても、(void **) の意味がよくわからないのですが。(void *) でだめですか?
266265:2008/08/16(土) 19:57:42
ごめんなさい。勘違いしていました。
267デフォルトの名無しさん:2008/08/16(土) 20:10:52
これでコンパイル通ったよ

#include <iostream>

void func1();

int main()
{
void (**func)();

func = new (void (*[10])());
func[0] = func1;
(func[0])();
}

void func1()
{
std::cout << "func1()" << std::endl;
}
268デフォルトの名無しさん:2008/08/16(土) 20:57:19
>>267
new void(*[10])();が通らなかったので見逃してた。
なるほど、括弧で囲めばいいのか。ありがとう。
269デフォルトの名無しさん:2008/08/17(日) 10:52:00
読み辛いし、普通にtypedef使おうぜ・・・
270デフォルトの名無しさん:2008/08/17(日) 14:45:50
知っておくのも損は無いだろう。typedefで省略して良いのは基本を理解していてなぜtypedefが必要なのかを知っている者のみ。
271デフォルトの名無しさん:2008/08/17(日) 16:09:51
>>270
基本は new T[N] で、この書式に合わせるためには typedef が必要だとわかっている。
typedef を使わない書き方を知る必要は無いよ。
272デフォルトの名無しさん:2008/08/17(日) 17:05:16
typedefを使わないと理解出来ない馬鹿は去れ。
273デフォルトの名無しさん:2008/08/17(日) 17:18:44
そりゃtypedefを使わない奴は馬鹿だが関数宣言における他演算子と比べた時の優先順位を理解できない奴も馬鹿だろ
274デフォルトの名無しさん:2008/08/17(日) 17:28:27
人の事はどうでもいいから自分の恥を知れ。
275デフォルトの名無しさん:2008/08/17(日) 17:37:46
初心者歓迎ってスレタイに書いてあるのに馬鹿は去れとか
276デフォルトの名無しさん:2008/08/17(日) 17:38:24
ageて言うほど悔しかったかワロスwwwwwwwww
277デフォルトの名無しさん:2008/08/17(日) 17:39:14
来るものは拒まず、馬鹿は去れ
278275:2008/08/17(日) 17:39:44
>>276
sageチェック外す癖が付いてたんだよ悪かったな
279デフォルトの名無しさん:2008/08/17(日) 17:41:09
馬鹿に限って煽りをスルーできないんだよな( ´ー`)y−~~
280デフォルトの名無しさん:2008/08/17(日) 17:41:54
( ゚Д゚ )y−~~
281デフォルトの名無しさん:2008/08/17(日) 17:57:51
>>272-280
なんという夏休み。

>>264
今日び配列newなんてやめておいた方が良い。
std::vectorか、boost::arrayあたりを。
それにC++的には関数ポインタより関数オブジェクトを。
282デフォルトの名無しさん:2008/08/17(日) 18:05:15
typedefがよくわかりません
教えてください
釣りではありません
本当です
283デフォルトの名無しさん:2008/08/17(日) 18:06:12
どう分からないんだ
284デフォルトの名無しさん:2008/08/17(日) 18:07:51
>>281
嫌だね。
人にプログラミング上の事まで強制される謂われはないし
285デフォルトの名無しさん:2008/08/17(日) 18:09:09
int a; //aという変数の宣言
typedef int a; //変数宣言の形にtypedef修飾子をつけるとaという型の宣言になる
286デフォルトの名無しさん:2008/08/17(日) 18:12:11
typedefのあとに変数宣言の形とか考えたこともなかった
そんな分かりにくい説明なんか読むんじゃありません

typedef 元の型 新しく宣言する型;

これで分からなかったらもうどうしようもない
287デフォルトの名無しさん:2008/08/17(日) 18:22:05
ちなみにtypedef修飾子は他の修飾子がそうである様に
元の型 typedef 新しく宣言する型;
という元の型の後の修飾でも有効
288デフォルトの名無しさん:2008/08/17(日) 19:56:26
typedefがわからんて…
289デフォルトの名無しさん:2008/08/17(日) 20:44:19
質問です。C++のクラスのメンバに、自身のクラスのメンバ関数ポインタ、
あるいは他のクラスのメンバ関数ポインタを保持させ、
呼び出すことは可能でしょうか?また、それはどのような方法でしょうか?

次レスに、実験したソースを付けます(インデントは全角スペース)。
プログラムの意図は、

・自身のメンバ関数ポインタによる自身のメンバ関数の呼び出し
・同じ変数による、他のクラスのメンバ関数ポインタによる他のクラスのメンバ関数の呼び出し

の二つです。
多少、形が変わっても構いません。
ご存知の方、よろしくお願いします。
290289:2008/08/17(日) 20:45:42
#include<stdio.h>
class object1{
public:
  void (object1::*PFunc)(void);
  void Func1(void);
};
class object2:public object1{
public:
  void Func2(void);
};
void object1::Func1(void)
{
  printf("1\n");
}
void object2::Func2(void)
{
  printf("2\n");
}
int main(void)
{
  object1 *Obj=new object1;

  Obj->PFunc = &object1::Func1;
  (Obj->*PFunc)();//error C2065: 'PFunc' : 定義されていない識別子です。

  Obj->PFunc = (void (__thiscall object1::* )(void))&object2::Func2;
  (Obj->*PFunc)();

  return 0;
}
291デフォルトの名無しさん:2008/08/17(日) 21:17:24
>>290
何がしたいのかいまいちわかんないけど、(Obj->*Obj->PFunc)();じゃね?
292デフォルトの名無しさん:2008/08/17(日) 22:30:40
->*が出てくるときはまず設計ミス
293289:2008/08/17(日) 22:40:10
>>291
動きました。ありがとうございます。
-> と ->* は全く違うんですね…。

>何がしたいのか
まず、あらかじめ別の型で動的確保した領域で、線形リストをクラスで組んでメンバ関数を使おうとしました。
しかし、その場合、仮想関数はなぜか使えませんでした。
仮想関数を呼び出すとコンパイラはエラーを出さないんですが、実行時に停止するんです。
そこで、関数ポインタを入れ替えることにし、このような形になりました。
かなり横着している気はしますが…。
294デフォルトの名無しさん:2008/08/17(日) 22:47:11
__thiscallとか移植性ないんだからやめろよ
295デフォルトの名無しさん:2008/08/17(日) 22:48:29
boost::ptr_funでも使ってポリモーフィズムすりゃいいんじゃね?
296デフォルトの名無しさん:2008/08/17(日) 22:49:16
boost::ptr_vectorだったorz
297デフォルトの名無しさん:2008/08/18(月) 14:43:56
#include <iostream>
void (**(**func)())();
void func3();
void func4();

int main()
{
void (**(func1()))();
void (**func2)();

func = new (void (**(*[1])())());
func[0] = func1;
func2 = func[0]();
func2[0]();
func2[1]();}
void (**(func1()))(){
void (**func)() = new (void (*[2])());
func[0] = func3;
func[1] = func4;
return func;
}
void func3(){
std::cout << "func3() " << std::endl;
}
void func4(){
std::cout << "func4() " << std::endl;
}
298デフォルトの名無しさん:2008/08/18(月) 20:58:41
>>297
これ何?
299デフォルトの名無しさん:2008/08/18(月) 21:01:21
自分で考えろカス
300デフォルトの名無しさん:2008/08/18(月) 21:06:06
いやそういう意味ではなくて、何の質問もないのに関数への
ポインタとか関数へのポインタを返す関数へのポインタとかの
ソースをいきなり貼られてるのは何の意味があるのかと思って。
301デフォルトの名無しさん:2008/08/18(月) 21:19:30
それなら「ない」
302デフォルトの名無しさん:2008/08/18(月) 21:20:20
>>297
なんか言えよ
303デフォルトの名無しさん:2008/08/18(月) 21:22:36
void (**(func1()))();

こんな関数のプロトタイプ宣言初めてみたぞ。
まあ書けばいくらでも複雑に書けるんだろうけど、
デザパタの生成パターンでもこんな書き方はしないし。
304デフォルトの名無しさん:2008/08/18(月) 21:56:09
何故括弧を一つ増やしたし
305デフォルトの名無しさん:2008/08/19(火) 07:30:48
c/c++で開発経験者にお聞きしたいのですが、
コボルみたいにコードインスペクションは現場でやりますか
また、ソースを読み上げたりハードコピーにマーカーでチェック、机上チェックなんかも
やったりしますか?
306デフォルトの名無しさん:2008/08/19(火) 07:33:51
BSD socketでsendしてerrno:9が帰る場合考えられる原因ってなんなんでしょうか。
char *c;
strcpy(c,str);
printf("Sending:%s¥n",c);
int checker=send(socketID, c, strlen(c), 0);
if(checker == -1){
NSLog([NSString stringWithFormat:@"Send Error:%d",errno]);
return 2;
}
return 0;
307306:2008/08/19(火) 07:37:57
Obj-CのNSLog();使ってエラー表示させてるけどそこは気にしない方向でお願いします。
NSLog([NSString stringWithFormat:@"Send Error:%d",errno]);

printf("Send Error:%d¥n",errno);
とほぼ同じです。
308デフォルトの名無しさん:2008/08/19(火) 07:44:27
>>306
#define EBADF 9 /* Bad file number */
ならsocketIDが無効
socket( )の戻り値は確認してる?
309デフォルトの名無しさん:2008/08/19(火) 07:54:04
>>306
数値の意味がわからないなら文字列にすれば
NSLog([NSString stringWithFormat:@"Send Error:%s", strerror(errno)]);
310306:2008/08/19(火) 08:15:49
>>308
ありがとうございます。
socket()の戻り値は確認していて、connect()及びrecv()は問題なく行えています。
socketIDがガベージコレクションで解放されちゃったのかもしれないのでその辺りで探ってみます。

>>309
文字列にできたんですか。ありがとうございます。
311デフォルトの名無しさん:2008/08/19(火) 09:07:33
関係ないけど7bit asciiのみなら
NSLog(@"format",...);
って書けた気がする。
312デフォルトの名無しさん:2008/08/19(火) 23:22:50
>>305
プロジェクトの性質によって色々だとは思うが、
絶対ないと断言できるのは「読み上げ」だな。
やれるもんならやってみろ。
313デフォルトの名無しさん:2008/08/19(火) 23:39:10
>>305
>ソースを読み上げたりハードコピーにマーカーでチェック、机上チェック
そんなアナクロなこと、COBOLでだってやりませんよ。
314デフォルトの名無しさん:2008/08/19(火) 23:53:35
>>305
俺は「コードレビュー」はやったことはある
紙の無駄だけどプリントアウトしたソース使って

ただ、(若手の)教育と(協力会社さんなどの)スキル把握(もちろん
悪いところは直してもらう)が主な目的だったんで、約束事として
つねにやってたわけじゃない
315デフォルトの名無しさん:2008/08/20(水) 22:23:44
hppファイルにクラス、クラスの内部にメンバ関数の宣言を記述し、
同名のcppファイルでそのhppファイルをインクルードし、cppファイルにメンバ関数の
定義を記述したのですが、コンパイルしようとすると、cppファイルのメンバ関数定義に
ついて未解決の外部シンボルとなってしまいます。
WinMain関数の記述されているファイルにhppファイルだけでなく、直接
cppファイルをインクルードすると、コンパイルが通ります。
未解決の外部シンボル となってしまう原因は何なのでしょうか?
環境はVisual Studio2005です。
316デフォルトの名無しさん:2008/08/20(水) 22:42:03
main.cpp sub.hpp sub.cpp があるとして
cl main.cpp sub,cpp
とやるか
cl /c sub.cpp
cl main.cpp sub.obj
317デフォルトの名無しさん:2008/08/20(水) 22:46:35
ヘッダファイルにあるクラスの定義がおかしいんじゃないの?
318デフォルトの名無しさん:2008/08/20(水) 22:56:09
>316
ありがとうございます。コマンドラインから個別にコンパイルしてやるか、
同時に指定してやるかということですね。
もしかして、こういった構成だと、統合開発環境からはコンパイルできないのでしょうか…

>317
クラス、及びメンバ関数の宣言とメンバ関数の定義を両方ともhppファイルに
記述した状態だと動作していたので、それはないとは思うのですが…
319デフォルトの名無しさん:2008/08/20(水) 23:12:05
cppファイルにあるメンバ関数の定義がおかしいと思う
320デフォルトの名無しさん:2008/08/20(水) 23:16:11
戻り値の型 クラス名::メンバ関数名(引数)
int HOGE::hogehoge(void)
{
}
321デフォルトの名無しさん:2008/08/20(水) 23:18:50
>もしかして、こういった構成だと、統合開発環境からはコンパイルできないのでしょうか…

それはないw
何のための統合開発環境なんだかわからなくなるって
322デフォルトの名無しさん:2008/08/20(水) 23:22:02
>319,>320,>321
すみません、原因がわかりました。
大騒ぎしといてわざわざレスまで頂いて、本当に申し訳ありませんでした。
テンプレートだから、っぽいです。
323デフォルトの名無しさん:2008/08/20(水) 23:23:20
エスパー力が足りなかったようだ、修行してくる
324デフォルトの名無しさん:2008/08/20(水) 23:25:56
export templateか・・・・全部ヘッダに書けよ
それかComeau C++を使うか
325デフォルトの名無しさん:2008/08/20(水) 23:42:08
>324
そういうのもあるのですね
でもヘッダに書かないとダメならダメでも良いんです。
広く外部に公開するものでもありませんので…
326305:2008/08/20(水) 23:50:09
回答していただいたみなさん、ありがとうございました
327デフォルトの名無しさん:2008/08/21(木) 11:32:49 BE:556079459-2BP(0)
作ったexeファイルをメモ帳で開いたら「"」で括って書いた部分がそのまま見えちゃう
んだけどこれ見えないようにできますか?
328デフォルトの名無しさん:2008/08/21(木) 11:35:35
>>327
ソースに書き込んでいるものは見えちゃってもしょうがないよね
暗号化するとかしかないんじゃない?

ソースで見える文字列は見えちゃうと思った方がいい
329デフォルトの名無しさん:2008/08/21(木) 11:54:16 BE:222431663-2BP(0)
>>328
ありがとう。簡単にどうこうできるものじゃないのね
諦めます
330デフォルトの名無しさん:2008/08/21(木) 12:12:07
簡単な方法としてはEXEをUPXみたいなパッカーで圧縮するとか
331デフォルトの名無しさん:2008/08/21(木) 15:00:03
Win32アプリケーションでLoadLibrary()使って開いたハンドルをWM_DESTROYのときにFreeLibrary()したら、DispatchMessage()で例外が発生したんだが何が原因だろうか
332デフォルトの名無しさん:2008/08/21(木) 23:09:22
平面状の2点間の距離を求めたいのですが、三平方の定理を利用(xyの差を二乗して云々…)する
以外に、C++的にもっと良い方法はありますか?それとも上記の方法が無難でしょうか?
333デフォルトの名無しさん:2008/08/21(木) 23:32:21
>>332

C++的に?
こういうのは言語の問題ではない。数学の問題だ。
最良のアルゴリズムを導いて、それを言語で表すだけ。
334デフォルトの名無しさん:2008/08/21(木) 23:40:44
>>333
何か自分の知らない役立つ関数があるかもしれない…と思い質問しました。
三平方の定理の方法でも特に問題ないので、そっちを使いたいと思います
ありがとうございました。
335デフォルトの名無しさん:2008/08/21(木) 23:55:51
あまり詳しくないけどこーいうのは使えない?
http://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html

boost についてはこちら
http://ja.wikipedia.org/wiki/Boost
336デフォルトの名無しさん:2008/08/21(木) 23:56:03
337デフォルトの名無しさん:2008/08/22(金) 00:05:19
>>335
ありがとうございます。今回の目的以外にもかなり便利なライブラリが
あるようですね。勉強になります。

>336
ずばりな回答ですね。ありがとうございます!
こういった形で公開されていると、非常に参考になります
338デフォルトの名無しさん:2008/08/22(金) 00:21:58
336のソース見たけどmoler-morrison法って計算量多いからなんか遅そうなんだけど
math.h にhypot()があるお

試しにコンパイルしてみたらやっぱり遅かったお(g++ 4.1, 1.6GHz)
register 着けたけど、sqrt()呼び出しが最速だったお
ライブラリは、汗で(ry
339デフォルトの名無しさん:2008/08/22(金) 00:26:55
>>331
DLLが作成したウィンドウがまだ残ってるのにFreeLibrary()して
DispatchMessage()が既に開放されたDLLのウィンドウプロシージャを呼ぼうとして落ちた。
340デフォルトの名無しさん:2008/08/22(金) 00:30:00
>>338
平方根ぐらいはFPUが1サイクルで計算できるから
下手に四則演算にばらさないほうがいいってことだろう。
341デフォルトの名無しさん:2008/08/22(金) 00:53:15
>>338
6回も割り算してるからな。そりゃsqrtのほうが速いわ
342デフォルトの名無しさん:2008/08/22(金) 01:06:15
普通にhypot()を使えばいいだけじゃん。iccのhypot()は速いぞ。
343デフォルトの名無しさん:2008/08/22(金) 01:27:24
まあ、hypotはC99からやし
344デフォルトの名無しさん:2008/08/22(金) 01:50:23
boost::math::hypot
345338:2008/08/22(金) 02:40:24
>>344
boostの実装ぱくったら爆速だったお、やほお。最適化(-O2)したけどね。
実際にあのアルゴリズムで解が出るとは、驚きだおおおお。
346デフォルトの名無しさん:2008/08/22(金) 03:14:37
標準C++的には_hypot?
347デフォルトの名無しさん:2008/08/22(金) 04:49:53
特定の条件でのみJaneのlast.datをlast2.datにコピーしたいのですが
「特定の条件」の判定は問題無くできたけど、肝心のファイルコピーが出来ません
void copy_last()のkekkaかkekkaAが毎回0で失敗しています
CopyFileは
BOOL CopyFile(
 LPCTSTR lpExistingFileName,
 LPCTSTR lpNewFileName,
 BOOL bFailIfExists
);
なので、ファイル名をLPCTSTRで
LPCTSTR moto=_T("last.dat");
LPCTSTR saki=_T("last2.dat");
int kekka=CopyFile(moto,saki,false);
こんな感じにしてるのですがダメでした
LPCTSTR moto="last.dat";
LPCTSTR saki="last2.dat";
でも同じでした

どのようにファイル名を指定すればコピー出来るのでしょうか?
環境はBCC Developer+Vista SP1+Borland C++builder 5.0 です
348デフォルトの名無しさん:2008/08/22(金) 07:21:14
>>347
Vistaか
書き込み権限の関係?
とりあえず
DWORD GetLastError(void);
でエラーの原因を絞れ
349デフォルトの名無しさん:2008/08/22(金) 09:32:30
カレントパスが思っているのと違うところにあるから上手くいかなくて、
絶対パスで指定すればいいなんてことはない?
350デフォルトの名無しさん:2008/08/22(金) 12:00:36
>>348
GetLastError、そういうのもあるのか!
32でした

ファイルサイズ取得する時に開いたハンドルが原因でした
CloseHandleで無事コピー出来ました
ありがとうございます
351デフォルトの名無しさん:2008/08/22(金) 13:34:13
>>336
そのコードに
x = x ? x : -x; // x = fabs(x); と同じ結果だが高速な方法。
って行があるんだけど、おかしくね?
-xになるのはx==0の時だけで、fabs(x)と同じになんてならないよね?
352デフォルトの名無しさん:2008/08/22(金) 14:05:57
>>351
ほんとうは分かってかってるだろwww
x >= x ? x : -x;
の間違いだってw
353デフォルトの名無しさん:2008/08/22(金) 14:07:32
x = x >= 0 ? x : -x;
だろJK
354デフォルトの名無しさん:2008/08/22(金) 14:07:35
おしいw
355デフォルトの名無しさん:2008/08/22(金) 14:10:14
馬鹿ばっかw
356デフォルトの名無しさん:2008/08/22(金) 14:12:38
浮動小数点数の絶対値なんて大抵、符号ビットを取り払うだけで済むわけで、
環境に合わせて最適化してるfabsのほうが速いと思うんだが、2002年の記事だからそんなものなのか?
357351:2008/08/22(金) 14:23:02
あぁそうか。(いや、素だったよw>352)
しかし単純ミスにしては・・・。「負は偽」と誤解してそう。
358デフォルトの名無しさん:2008/08/22(金) 15:20:52
符号ビットを取り払……う?
359デフォルトの名無しさん:2008/08/22(金) 16:12:14
構造体のメンバで、stringstream型のメンバ変数だよって分かりやすくするように

struct sample {
std::stringstream m_ssData;
}

みたいな記法を考えているんですが、変でしょうか??
mとかいらないですかね??
なにかセオリーのようなものがあったら教えていただきたく。
360359:2008/08/22(金) 16:15:48
DataのDが大文字なのも変かも・・?と思ったり・・
361デフォルトの名無しさん:2008/08/22(金) 16:18:32
>>358
ん?何か間違ったこと言ったか?

世の中で使われてる浮動小数点形式は、符号ビットを0にするという
比較的簡単な操作だけで絶対値が求まるようにできている。

それに対して、浮動小数点数が0より大きいかどうかを判断するには、
符号ビットを見ただけでは十分ではなく、値全体を眺めてNaNでないことを
確かめないといけないので、より時間がかかる。

だから、0と比較→符号反転は明らかに無駄。
362デフォルトの名無しさん:2008/08/22(金) 16:19:59
>>359
クラス名・変数名に迷ったら書き込むスレ。Part12
http://pc11.2ch.net/test/read.cgi/tech/1206118762/
363359:2008/08/22(金) 16:21:05
おお、そんなスレが。そっち行って見ます。ありがとうございますm(_ _)m
364デフォルトの名無しさん:2008/08/22(金) 16:46:09
自前で
x &= 0x7FFFFFFF
みたいなことはできないのですか?
365デフォルトの名無しさん:2008/08/22(金) 16:48:50
>>364
やればいいんじゃないですか?
366デフォルトの名無しさん:2008/08/22(金) 18:17:54
ある値が16進数で表されている文字列があって、(LPSTR str = "0x2345e23";こんな
これからその値を取り出してintでもlongにでも入れたいんだが。。
どうすればいいかわからんからキミたち教えて
367デフォルトの名無しさん:2008/08/22(金) 18:20:46
>>366
strtolでもつかって炉
368デフォルトの名無しさん:2008/08/22(金) 18:29:22
>>367
素早い応答感謝。
おとなしくstrtol使ってくる。
369デフォルトの名無しさん:2008/08/22(金) 19:08:09
strtolって16進表記も使えたっけ?
370デフォルトの名無しさん:2008/08/22(金) 19:11:23
おいおい
371デフォルトの名無しさん:2008/08/22(金) 19:16:10
ナイスボケ
372デフォルトの名無しさん:2008/08/22(金) 21:16:00
>>361
浮動小数点の形式がIEEEなのかはたまた別なのかは定義されていないから環境依存が激しくなると思われ。
といいつつ大概は先頭ビットを0にする処理で終わらせてるが。
373デフォルトの名無しさん:2008/08/22(金) 21:19:37
つまり素直にfabs使っとけってこったな
374デフォルトの名無しさん:2008/08/22(金) 21:37:42
>>372
いやいや、そうじゃなくて、CPU内部ではフラグ倒すだけの操作だってことを言いたかった。
ビット操作で符号フラグをクリアしろという意味じゃない。
>>356で「環境に合わせて最適化してる」と書いたとおりです。
375デフォルトの名無しさん:2008/08/22(金) 22:50:50
変な質問ですが、下のプログラムは最適化をかけた時に展開されますか?

template <unsigned int N>
inline double pow(double v){
return v * pow<N-1>(v);
}

template <>
inline double pow<0>(double v){
return 1;
}

使用例:pow<4>(3)
コンパイル後:3*3*3*3 ?

コンパイラはbcc使ってます。デバッグモードじゃ展開されないみたいだし、
リリースモードだと、アセンブラが分かりません;〜;
よろしくお願いします。
376デフォルトの名無しさん:2008/08/22(金) 22:53:16
まともなコンパイラなら展開されると期待していいと思う。
問題はbccがまともかどうかということだが……。
377デフォルトの名無しさん:2008/08/22(金) 22:59:36
>>375
gccの例で恐縮だが、printf("%g\n", pow<4>(3))したらprintf("%g\n", 81.)相当に展開された。
378デフォルトの名無しさん:2008/08/22(金) 23:05:56
つーか、展開されないってどんだけよ。
試しにpow<4>(argc)したらこんなことになったけど。
--
cvtsi2sd 8(%ebp), %xmm1
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, 4(%esp)
--
# アセンブラ読めなくても掛け算3回連続ってのは判るでしょ。
379デフォルトの名無しさん:2008/08/22(金) 23:27:04
>>378
定数畳込みがされるかどうか聞きたかったんじゃ。
380デフォルトの名無しさん:2008/08/22(金) 23:29:30
>>376-378ありがとうございます。展開されると期待します。

ところでもう一つ質問なのですが、
template<unsigned int n,unsigned int i>
struct h{
static inline double hill1(double t,double p[n]){
return p[i]*t + h<n,i-1>::hill1(t,p);
}
};

template<unsigned int n>
struct h<n,0>{
static inline double hill1(double t,double p[n]){
return p[0];
}
};

このテンプレートでh<1,0>::hill1(0,hoge);とした時に下のテンプレートが適用されないみたいなんですが
原因がよく分かりません。エラー文は
最大 VIRDEF 数を超過した; 再帰をチェック
と出ています。また、よろしくお願いします。
381デフォルトの名無しさん:2008/08/22(金) 23:56:54
BCCだと知らないけど、インライン展開のネストの許可数を設定する
プラグマか何かあるんじゃないかな。上限ぐらい上げられると思うけど。
VCの#pragma inline_depthみたいな
382デフォルトの名無しさん:2008/08/23(土) 00:08:42
>>381すいません。問題はそこじゃなくてテンプレートの部分特殊化がうまくいってないっぽいというところなんですが
383デフォルトの名無しさん:2008/08/23(土) 00:15:22
C言語ド素人です。この問題を解いていただきたいです・・・。

1.
次のような式で表される数列が与えられたとする。
a0=1,a1=1,an=an-1+2an-2
int型の整数n(n≧0)を受け取り、上記の数列anの値をa0からanまで全て表示する関数printa(n)を作成せよ。

2.
要素数2個のdouble型の配列xy(xy[0]にはx座標、xy[1]にはy座標が納められている)と2行2列のdouble型の2次元配列Aを受け取り、座標(x,y)のAによる1次変換を求めて、その結果を配列xyに格納する返却値無しの関数LinearTrance(xy,A)を作成せよ。

3.
文字列の納められた文字型の配列sとstailを受け取り、sの末尾にstailの文字列が含まれているかどうかを調べ、含まれている場合には1、含まれていない場合には0を返す関数strcmptail(s,stail)を作成せよ。

4.
4個の文字列"abc.txt","xyz.jpg","foo.txt","bar.mp3"と文字列"txt"を受け取り、文字列の末尾に"txt"を含む文字列かあるかどうかを調べて、あればその文字列全てを表示するプログラムを作成せよ。ただし問3で作成した関数を用いること。


見づらいかもですが、よろしくお願いします。
384デフォルトの名無しさん:2008/08/23(土) 00:18:46
世の中には宿題スレというものがあってだな、…。

宿題程度は自分でやれといいたいが。
385デフォルトの名無しさん:2008/08/23(土) 00:23:23
>>380
BCCが関数テンプレートの部分特殊化に対応してるか怪しいような。
対応してても、ぐぐったらちょっとバグがあるらしいので
標準に完全準拠してると期待しない方がいい。
インライン展開で無限ループしてるんじゃない?下の特殊化版を消してコンパイル結果が
同じならそういうことかと。
386デフォルトの名無しさん:2008/08/23(土) 00:29:16
>>384
すみません、そちらに書き込みます。
387デフォルトの名無しさん:2008/08/23(土) 00:36:07
gccにおいて、特定のヘッダファイルに関してだけ警告が出ないようにするというか
特定ファイルだけ警告出さないようにするというのはできますか?
それというのも少し環境が変わって以前使っていた警告オプションだとSTLに対して大量の警告がでるようになってしまい、
これを何とかしたいんです
388デフォルトの名無しさん:2008/08/23(土) 00:37:45
gccではそういうのありまえん
389デフォルトの名無しさん:2008/08/23(土) 00:39:44
>>385どうやらそのようです・・・ありがとうございました。
これをクリアするのは至難の業ですね・・・Umm
390デフォルトの名無しさん:2008/08/23(土) 01:17:20
簡単だよ。bccを捨てればいい。
391デフォルトの名無しさん:2008/08/23(土) 01:22:07
>>380
BCC5.9.3(C++Builder2007の付属品)だとちゃんと動くよ。
392デフォルトの名無しさん:2008/08/23(土) 09:46:52
>>390-391そうですね。てゆうかよく考えたら、今やってることが必要ないことに気づきました。

template<unsigned int i>
struct f{
  template<unsigned int n>
  static inline double hill(double t,double p[n]){
    return p[i] * Bernstein<n,i>(t) + f<i>::hill<n>(t,p);
  }
};
template<>
struct f<0>{
  template<unsigned int n>
  static inline double hill(double t,double p[n]){
    return p[0] * Bernstein<n,0>(t);
  }
};

main:
こうしたら一見コンパイルは通るんですが
393デフォルトの名無しさん:2008/08/23(土) 09:49:59
Shift+Enter押しちゃった・・・

続きですが、上のやつだと
f<2>::hill<1>
が関数として見られないらしく関数ポインタに代入しようとすると”式の構文エラー”と出てしまいます。
これも不正あるいはBCCの未対応によるものなんでしょうか
394デフォルトの名無しさん:2008/08/23(土) 21:41:55
>>388
そうですか
どうもありがとうございました

なんとかならないのかなぁ
395デフォルトの名無しさん:2008/08/23(土) 22:30:01
>>394
grepでおk
396デフォルトの名無しさん:2008/08/24(日) 01:18:13
半年前くらいから、独学でCとC++をやってるんですが、
普通どのくらいファイルを分割するものでしょうか?

1プロジェクトのソースの総サイズが160KBで、
ヘッダを含めて110ファイルになったんですが、
これって分割しすぎですか?
397デフォルトの名無しさん:2008/08/24(日) 01:31:39
>>396
1ファイルの平均が1.5Kか。
こういうのに正解はないから好きにすればいいとは思うけど、普通よりだいぶ細かく分割してるのは違いないな。
398デフォルトの名無しさん:2008/08/24(日) 01:44:59
やっぱり細かいですか。
どうもありがとうございます。
399デフォルトの名無しさん:2008/08/24(日) 02:05:03
>>396
私は1クラス2ファイル(hとcpp)を目安に分けてる
構造体なんかは関連するクラスにまとめちゃうことが多いな
400デフォルトの名無しさん:2008/08/24(日) 08:10:20
110ファイルもあると、それ自体のディレクトリを分割整理したくなるな。
401デフォルトの名無しさん:2008/08/24(日) 09:05:02
ヘッダを細かく分けると、幾つかのヘッダを纏めたヘッダとかも
作ることになるからさらに増えるからなぁ
402デフォルトの名無しさん:2008/08/24(日) 10:19:02
自分の場合は
一つの処理を行う過程で複数の関数にまたがるような処理
汎用的に使えそうな関数を書く場合
こういうソースを分けてるなぁ
403デフォルトの名無しさん:2008/08/24(日) 11:56:29
以下のようなクラスで、Subのオブジェクトをdeleteすると、
Superのデストラクタで「純粋仮想関数を呼んだ」っていうランタイムエラーが出ます。
SuperのデストラクタでSubの release()を呼びたいんですが、どうすればいいでしょうか?

template <class T>
class Super{
public:
  virtual ~Super(){
    static_cast<T*>(this)->release();//ここでランタイムエラー
  }
  virtual void release() = 0;
};


class Sub{
public:
  void release(){}
};

環境はVisualStudio2003のVC++です。
404デフォルトの名無しさん:2008/08/24(日) 11:58:21
すいません間違えました。Subはこうでした。

class Sub : public Super<Sub>{
public:
  void release(){}
};
405デフォルトの名無しさん:2008/08/24(日) 12:04:10
class Sub : public Super<Sub>{
public:
  void release(){}
  ~Sub(){}
};
406デフォルトの名無しさん:2008/08/24(日) 12:13:11
C++では、Superのデストラクタが呼ばれるときには、
もうSubオブジェクトは無くなっていると考える。

Subにデストラクタは設けられないの?
407デフォルトの名無しさん:2008/08/24(日) 12:33:00
>>406
おっしゃるとおり、Subのデストラクタでrelease()を呼び出すようにしました。
全子クラスのデストラクタでrelease()を実行するので、親のデストラクタで呼び出したかったんですが。
408デフォルトの名無しさん:2008/08/24(日) 12:39:21
どういう仕様か知らんが、release
409デフォルトの名無しさん:2008/08/24(日) 12:41:47
どういう仕様か知らんが、releaseで行うべき処理をデストラクタですればいいんじゃないの?
410407:2008/08/24(日) 13:21:08
子クラスによって解放するモノが違うので、
親クラスに解放処理の中身はかけないのです。
411デフォルトの名無しさん:2008/08/24(日) 13:25:51
子クラスのデストラクタに書けよ
412デフォルトの名無しさん:2008/08/24(日) 13:26:49
もしSuperにデストラクタでreleaseを呼ぶこと以外の目的がないなら、
継承しなくても包含でいいんじゃないかという気もする。
413デフォルトの名無しさん:2008/08/24(日) 13:46:20
やりたい事情は分かるけど無理。
継承をテンプレートに変えればできるかも。
414デフォルトの名無しさん:2008/08/24(日) 15:07:23
Visual C++ や Borland C++ 等の一部の開発環境で
__int8、__int16、__int32、__int64
のような、サイズが定まった整数型が存在します
自分は .NET のようにサイズが定まってる方が好きですし
型名にサイズが記されてて分かり易いので使っていこうかなと思っています
(long long int みたいな名称はちょっと微妙な感じ・・・)

が、これらの型についてググっても意外に使用しているコードが少ないです
非標準だからでしょうか?
これらの型のメリット、デメリットってどんなのがあるんでしょうか?
やっぱり、あんまり使わない方がいいんでしょうか?
よろしくお願いします
415デフォルトの名無しさん:2008/08/24(日) 15:11:36
サイズにこだわる必要のない場面も多いだろうし
strlenとかのライブラリ関数はそんな型使ってないから整合性に困るし
非標準ってのもあるかもしれないが、それだけならC99標準に合わせて
int8_t int16_t int32_t int64_t に typedef して使うのがいいんじゃないかな
416デフォルトの名無しさん:2008/08/24(日) 15:30:22
>>415
ありがとうございます
元はといえば long long int という型名が嫌だったので別名を探してました
VS2008 で動かしてみたら C99 の int32_t って対応してないみたいですね
ググっても Linux関連が大量に出てきた・・・

VC++ では
typedef で INT8、INT16、INT32、INT64 というのがあったので
コイツらを使っていこうと思います
ありがとうございました
417デフォルトの名無しさん:2008/08/24(日) 15:46:01
>>416 boost/cstdint.hpp
418デフォルトの名無しさん:2008/08/24(日) 20:22:23
#include <iostream>
#include <algorithm>
#include <set>
#include <functional>

int main()
{
 char ch[] = {
  'N', 'B', 'J', 'K', 'E', 'C', 'G', 'D',
  'A', 'C', 'F', 'I', 'L', 'M', 'L', 'B', 'G', 'H'
 };
 int size = sizeof(ch);
 std::set<char, std::greater<char> > s2(std::greater<char>() );
 for (int i = 0; i < size; ++i) {
  if (!s2.insert(ch[i] ).second) { // 15 行目
   std::cout << "失敗\n";
  }
 }
}
これをビルドしようとすると、エラーになります。何がダメなのでしょうか?
(15) : error C2228: '.insert' の左側はクラス、構造体、共用体でなければなりません
(15) : error C2228: '.second' の左側はクラス、構造体、共用体でなければなりません

visual studio 2005 standardをつかってます
419デフォルトの名無しさん:2008/08/24(日) 20:44:27
関数宣言と解釈されちゃってんじゃね
420デフォルトの名無しさん:2008/08/24(日) 20:48:37
× std::set<char, std::greater<char> > s2(std::greater<char>() );
○ std::set<char, std::greater<char> > s2;
キモイ std::set<char, std::greater<char> > s2((std::greater<char>()));
421デフォルトの名無しさん:2008/08/24(日) 21:04:47
>>419
なるほど
std::set<char, std::greater<char> > s2(std::greater<char>() );
の部分を std::set<char, std::greater<char> > を返す
s2という関数の宣言と解釈されたということですね

>>420
どちらでもうまくいきました。ありがとう
C++標準ライブラリの使い方 完全ガイド では>>418の様に書かれてるんだけどな・・・
422デフォルトの名無しさん:2008/08/24(日) 21:07:50
レッドストーンでチートしたいんですが
バイナリエディタにつっこんだ後、機械語が横の方にでるんだけど、日本語に翻訳するにはどうすればいいか教えてください
423デフォルトの名無しさん:2008/08/24(日) 21:09:56
>>422
このスレはC/C++の質問だけにしてください
424デフォルトの名無しさん:2008/08/24(日) 21:15:21
Winpcapの制御でpcap_next_exを使ってパケットを取る時
大量のパケットが流れている状態だとリアルタイムに取ることができません
(秒間60パケット程度になると1秒間の分を1.5秒くらいかけて取り込む結果に・・・)

最適化などで高速化を頑張ってみましたが一向に改善されません
ループ処理を軽くすれば解決できるような問題なんでしょうか
425デフォルトの名無しさん:2008/08/24(日) 21:21:43
>>424
データ量がどれだけか分からないけど
ギガビットイーサで400Mbps(=50MB)の受信があったとすると
かなりの負荷になるな

でもジャンボフレーム16kとして60パケットなら100kB程度
余裕で処理できそうな気はする
426デフォルトの名無しさん:2008/08/24(日) 21:23:59
>>425
具体的なデータ量は120バイト前後のバラバラのパケットが秒間58個+α流れてくる状態です
これしきのことでどうして酷いタイムラグが起きるのか悩んでます
427デフォルトの名無しさん:2008/08/24(日) 21:27:10
>>425
計算違うw
16kBx60=1MB程度になる
428デフォルトの名無しさん:2008/08/24(日) 21:31:51
>>420
うはw
std::set<char, std::greater<char> > s2((std::greater<char>()));
って書くとBCCではコンパイルエラーになるわ
429デフォルトの名無しさん:2008/08/24(日) 21:32:20
>>426
ブロッキングモードで読んでるのが原因とか?
430デフォルトの名無しさん:2008/08/24(日) 21:44:32
>>429
Winsock2ではブロッキングモードがあるのは知っているのですが
Winpcapを使った場合でも同様のものがあるんでしょうか
取得までのタイムアウト値を設定できるとのことなので
ぎりぎり動く範囲の2msに今は設定しています
431デフォルトの名無しさん:2008/08/24(日) 21:46:45
さすがにそれはネットワークプログラミングスレで聞こうや

C/C++と関係なさすぎ
432デフォルトの名無しさん:2008/08/24(日) 21:56:42
すいません、C++で動かしてたのでついここで良かったかと・・・
友人が英語サイトから有用そうな情報を引っ張ってきてくれたので
もう暫く頑張ってみようと思います
ありがとうございました
433デフォルトの名無しさん:2008/08/24(日) 23:08:46
C++の勉強にソースを読みたいんだけど、
いいオープンソースありまっか?
434デフォルトの名無しさん:2008/08/24(日) 23:09:44
>>433
SourceForge へいってみればあると思うよ
435デフォルトの名無しさん:2008/08/25(月) 02:07:35
newで生成した配列をreinterpret_castした物のdeleteてどうするんですか?
例:
int *pint = reinterpret_cast< int * >( new char[sizeof(int)] );
delete pint; <-これで正しいんですか?
436デフォルトの名無しさん:2008/08/25(月) 02:17:51
>>435
delete [] reinterpret_cast<char*>(pint);

っていうか最初の reinterpret_cast が要らんような気がするんだが。
new int じゃダメなのか?
437デフォルトの名無しさん:2008/08/25(月) 05:07:36
>>435
そういうやばいことやるようなケースならmalloc/free使ったほうが明示的で良い気はする
438デフォルトの名無しさん:2008/08/25(月) 11:48:33
STL の map についての質問です

#include<string>
#include<map>
class hoge{
  private:
    std::string m_name;
  public:
    hoge(std::string name) : m_name(name){}
};
std::map<int, hoge> hogelist;

このとき hogelist に新しいメンバを追加する際
hoge のコンストラクタに引数を指定する方法を教えてください

当然ながら hogelist[1]("hogehoge"); はダメでした
439デフォルトの名無しさん:2008/08/25(月) 11:57:45
>>438
#include <utility>
hogelist.insert(std::make_pair(1, "hogehoge"));
440438:2008/08/25(月) 12:05:58
>>439
ありがとうございます
助かりました

今は必要ないのですが、>>438 と同様の状況で
コンストラクタに複数の引数を渡したい場合の書き方について
ご存知であれば教えてください
441デフォルトの名無しさん:2008/08/25(月) 12:13:43
>>440
hogelist.insert(std::make_pair(1, hoge("hogehoge", ...)));
442438:2008/08/25(月) 12:16:01
>>441
なるほど、コピーコンストラクタを使うのですか
勉強になります
443デフォルトの名無しさん:2008/08/25(月) 13:14:14
virtaulなデストラクタを持たないクラスを継承して多態を表したいときどうすればいいですか?
Aがデストラクタを持たない親クラスで、
Bがテンプレートを持つクラスで、それを継承したC、D、Eで多態を表したいです。
Bのテンプレート引数には子クラス(C、D、E)を渡さないといけない状況です。

具体的には、ATLのCWindowを継承しているCWindowImplを継承して自分用のclassを作ったんですが、
mapに入れて管理しておいて、参照しているところがなくなったら削除しようと、shared_ptr<CWindow>で入れてみたんですが、
CWindowにvirtaulなデストラクタがなくてshared_ptrでdeleteしようとすると未定義な動作になるようです。
444デフォルトの名無しさん:2008/08/25(月) 13:34:08
>virtaulなデストラクタを持たないクラスを継承して多態を表したいときどうすればいいですか?
諦める。
445デフォルトの名無しさん:2008/08/25(月) 13:50:03
間にもう一つかませればいいんじゃない?
446デフォルトの名無しさん:2008/08/25(月) 13:50:10
>>443
CWindowを継承しないとだめなの?

CWindowImplのprivateメンバに直接アクセスするわけじゃなければ、
CWindow*のメンバ変数を所有するクラスを作って、
場合によりそれを継承するとかじゃ無理?
447デフォルトの名無しさん:2008/08/25(月) 13:51:19
class Foo {
virtual ~Foo(){}
virtual CWindow *GetCWindow() = 0;
};
のようなクラスを作り、自分用のクラスに多重継承させ、
shared_ptr<CWindow> の代わりに shared_ptr<Foo> を使う
448デフォルトの名無しさん:2008/08/25(月) 13:52:00
>>443
いやいや、shared_ptrなら仮想デストラクタを持っていなくても、
正しくデストラクタが呼ばれるから問題ない。

shared_ptr<> p(new MyWindow);というように最派生クラスの型へのポインタを
直接shared_ptrのコンストラクタに渡せば平気。
このときのshared_ptrのテンプレート引数はMyWindowでもATL::CWindowでも果てはvoidでも大丈夫。

仕組みが知りたければここ読め。
http://d.hatena.ne.jp/Cryolite/20060108

449デフォルトの名無しさん:2008/08/25(月) 14:26:29
>>448
おぉ、それは知らなかった。
こういう利便性があるとsharedじゃない単なるポインタ版も欲しくなるね。
450443:2008/08/25(月) 14:38:11
レスありがとうございます。
>>444
できればなにか回避する方向でいきたいと。
>>445, 447
間にあるクラス(B)がテンプレートクラスなのでかまさせられないのです。
一番下の子クラス(C)でテンプレート引数として自分を指定するので。
>>446
ATLのCWindowを継承したいのが目的なので、コンポジションではだめなのです。
すべてのメソッドにラッパーメソッドをかますとなると、結構大変そうというのが理由です。
>>448
なるほど、boostのshared_ptrなら、大丈夫だとは。
自分が代入された時の型を覚えておくなんてすばらしいですね。
これを元にして解決してみます。ありがとうございました。

結論としては、virtaulなデストラクタを持たないクラスを継承して多態を表したいときは、
生成した型に合わせてdeleteすればよいということですね。

ありがとうございました。
451デフォルトの名無しさん:2008/08/25(月) 14:58:52
もちろん、TR1のshared_ptrでも平気だよ。
452443:2008/08/25(月) 15:04:03
POCOのSharedPtrではだめでした。そういう実装になってなかったです。
boostを参考にしてみます。ありがとうございます。
453デフォルトの名無しさん:2008/08/25(月) 15:17:53
>>449
C++0xのunique_ptrは参照カウントないんでそういう感じに近いと思う。
454デフォルトの名無しさん:2008/08/25(月) 16:26:50
virtaulってタイプミスかと思ってたらずっとそう書いてるな
455デフォルトの名無しさん:2008/08/25(月) 16:45:20
virtaul の検索結果 約 57,500 件中 1 - 10 件目 (0.25 秒)

もしかして: virtual
456デフォルトの名無しさん:2008/08/25(月) 20:54:16
ループ{
 Aの処理
 Bの処理(しばらく処理が戻ってこない命令含む)
}

↑のようなのがあって
Aの処理はできるだけガンガン回したいのにBが邪魔なんだ
そこでマルチスレッドでAとBを分割してやれば
Bの制御が戻ってこない間もAをブンブン回せる?
457デフォルトの名無しさん:2008/08/25(月) 20:59:26
>>456

ループ1{
  ループ2{
    Aの処理
  }
  Bの処理(しばらく処理が戻ってこない命令含む)
}
458デフォルトの名無しさん:2008/08/25(月) 21:02:31
>>457
ありがとうございます
でもそれをやるとAを何回かまわしてBをやった時
またAに戻るまでにタイムラグができてしまわない?
459デフォルトの名無しさん:2008/08/25(月) 21:18:24
#include <new>

int global_area[1000];
int main(){
int* arr = new(global_area) int[10];
for(int cnt=0;cnt<10;++cnt){
arr[cnt] = 1;
}
return 0;
}

上記のソースはplacement newで領域を確保しようとしています。
コンパイルすると、
'operator new[](unsigned int,int *)' に一致するものが見つからない
と表示されてしまいます。new演算子のオーバーロードが必要ということでしょうか?
もしそうだとすると、この場合、どこにそれを記述すればよいのでしょうか?
コンパイラはBCC++5.5です。
460デフォルトの名無しさん:2008/08/25(月) 21:24:23
>>459
gcc3.4.5(MinGW)だけどエラー出ないぞ。
461デフォルトの名無しさん:2008/08/25(月) 21:29:40
>>458
AとBが同じリソース(ファイルとかVRAMとかメモリ)の書き換えを行うようなことをしてなければ、
そのままマルチスレッドでも良いと思うよ。
462デフォルトの名無しさん:2008/08/25(月) 21:38:50
>>458
どうせ馬鹿なんだから、最初から小出しにしないで用件全て晒せよ。
463デフォルトの名無しさん:2008/08/25(月) 21:39:24
ありがとうございます
ちょっと敷居が高いですが頑張ってみます
スレッドが回ってる時にCloseHandleってやってしまうとまずいですか?
464デフォルトの名無しさん:2008/08/25(月) 23:05:49
>460
ありがとうございます。
そうですか…何故かうちの環境だとエラーとなるのです。
条件変えて試してみます
465デフォルトの名無しさん:2008/08/25(月) 23:08:03
>>436-437
どうも、ぺこり
実プログラムでは下のようにmalloc/freeで行っているのですが、
それをnew/deleteで行った場合の開放の仕方がわからず質問しました

PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);
free(functionClassDeviceData);
466デフォルトの名無しさん:2008/08/25(月) 23:30:03
またおまえか
467デフォルトの名無しさん:2008/08/26(火) 00:22:06
std::vector<char> buf(predictedLength);
PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData =
PSP_INTERFACE_DEVICE_DETAIL_DATA( &buf[0] );
とかでいいんじゃないもう
468デフォルトの名無しさん:2008/08/26(火) 00:31:30
デストラクタは、
「オブジェクトが解体される直前に呼び出され、内部で指定された処理を実行する」
以外に、自動的に(ユーザーの見えないところで)何か処理を行っているのでしょうか?
469デフォルトの名無しさん:2008/08/26(火) 00:32:57
>>468
どうしてそう思ったの?
470デフォルトの名無しさん:2008/08/26(火) 00:33:18
自動的に、メンバ変数のデストラクタを呼び、
仮想関数テーブルを基本クラスのものに戻して、
基本クラスのデストラクタを呼ぶ
471デフォルトの名無しさん:2008/08/26(火) 00:45:19
>470
ありがとうございます。継承を遡っているのですね。
注意します。

>469
ttp://www.geocities.jp/ky_webid/cpp/language/036.html
こちらのコンテンツを読んでいる際に、明示的にデストラクタを呼び出している
のが、たんにデストラクタを明示的に呼び出すことが可能という説明なのか、
必ず呼び出さなければならないのか釈然としなかったからです。
472デフォルトの名無しさん:2008/08/26(火) 00:51:50
placement newと混同すんなよw
473デフォルトの名無しさん:2008/08/26(火) 14:19:27
>>448
の方法での実装をみるとvoid*を経由しているようです
void*を経由した場合、以下の継承関係だとエラーになるんですが、どうやったら回避できますか?

型情報がいったんなくなるので多重継承の場合は無理なのかなぁと思っています。
(shared_ptrのソースはむつかしくて読めてません)

class AAA {};
class BBB {
public:
  virtual BOOL x() = 0;
};
class FFF : public AAA, public BBB {
public:
  BOOL x() {return 0;}
};

FFF* fff = new FFF();
AAA* aaa = fff;
void* vvv = aaa;
FFF* buf = static_cast<FFF*>(vvv);
delete buf;
474デフォルトの名無しさん:2008/08/26(火) 15:10:56
>>473
そのAAA*→void*→FFF*って変換が一般にできるは分からない。
けど、BoostとVC++9の実装を見てみたが、delete自体は問題ない。
どっちもshared_ptr用とは別にdelete用のポインタを保持していて、
それはずっとFFF*だったりFFF*→void*→FFF*だったりする。
475デフォルトの名無しさん:2008/08/26(火) 15:25:06
new の時点で元の型情報保持するためにshared_ptrに
渡してdeleterを作成させなきゃダメでしょ。
476デフォルトの名無しさん:2008/08/26(火) 15:36:04
>>474
void*を経由した時に多重継承だとオフセットわかんなくなりませんか?
>>473のコードだけでも落ちたのでそうなるかなと。

>>475
生成時に渡しててもvoid*経由してたら落ちると思います。
>>448のコードでも多重継承のやつをdynamic_scoped_ptr<AAA> buf(new FFF());で落ちます。
477デフォルトの名無しさん:2008/08/26(火) 15:48:14
>>476
X*からvoid*へ変換してまたX*へ戻すっていう風に、void*にする前と後で同じ型の場合なら、
void*にする前と後でビットパターンが変化しなければうまくいく。

あと、dynamic_scoped_ptrじゃなくて、boost::shared_ptrで試してみ。
dynamic_scoped_ptrほど単純な仕組みではないからうまくいくはず。
478Mr.yutori:2008/08/26(火) 15:53:11
swich文を簡単に、
教えてください。
479デフォルトの名無しさん:2008/08/26(火) 15:56:15
>>478
unknown
480デフォルトの名無しさん:2008/08/26(火) 15:59:41
>>478
そんなものは無いので忘れるといいよ
481デフォルトの名無しさん:2008/08/26(火) 16:35:49
#include <iostream>
#include <cstring>

template <typename TYPE>
// TYPE max(const TYPE& a, const TYPE& b) // なんかこっちだどだめ *****
TYPE max(TYPE a, TYPE b)
{
  return (a > b) ? a : b;
}
template <>
inline char *max(char *a, char *b)
{
  std::cout << "char *" << std::endl;
  return (strcmp(a, b) > 0) ? a : b;
}

int main()
{
  char *s = "fdada"; char *p = "fff";
  std::cout << max(s, p) << std::endl;
  return 0;
}

コメントアウトした方がダメなのはなぜですか?
482デフォルトの名無しさん:2008/08/26(火) 16:40:31
特殊化の方
char *max(char* const& a, char* const& b)
にしないとテンプレートと合わないんじゃないか?
483デフォルトの名無しさん:2008/08/26(火) 17:08:19
>>477
shared_ptrのソースの読めた部分だけで、shared_ptrのまねをして
>>448のdeleterにポインタ渡すようにしてvoid*を経由しないようにしたらできました。
レスくれたかた、ありがとう。
484デフォルトの名無しさん:2008/08/26(火) 17:10:41
>>481
確か<utility>にstd::maxが入ってるからそれとぶつかるんでは?
485デフォルトの名無しさん:2008/08/26(火) 17:16:20
なんとか総合研究会って所で
C++に使える最強のクラスをまとめたヘッダーファイルが3万で売ってると聞いたのですが
詳細が書いてあるサイトご存じありませんか?
486デフォルトの名無しさん:2008/08/26(火) 17:29:11
RogueWaveから何か売ってたな
487デフォルトの名無しさん:2008/08/26(火) 17:30:25
>>481
TYPEをそのままchar *に置き換えてみれば違いがわかるんじゃない?
488デフォルトの名無しさん:2008/08/26(火) 17:33:18
>>483
Boost使っちゃだめだった?
それなら、shared_ptr.hppをコピーして名前だけ変えたほうが手っ取り早いと思うけど。
あるいはVC++2008なら、SP1あてればshared_ptrも付いてくるし。
489デフォルトの名無しさん:2008/08/26(火) 18:19:06
>>488
勉強のために理解したかったので今後、何かするときはboost::shared_ptrを使おうと思います。
今まで継承するクラスは仮想デストラクタがないといけないという思い違いをしていましたので、
目から鱗がぼろぼろでした。ありがとう。
490デフォルトの名無しさん:2008/08/26(火) 19:33:22
#include宣言を、例えばファイル上部ではなくあるクラスAの宣言の下に、クラスAを
基底クラスとする派生クラスB,C,D...と#include していくのは行儀の悪い方法ですか?
491デフォルトの名無しさん:2008/08/26(火) 20:10:11
行儀が悪いです
492デフォルトの名無しさん:2008/08/26(火) 20:14:13
>491
レスありがとうございます。
別の方法を探ります
493デフォルトの名無しさん:2008/08/26(火) 21:46:14
#define ERROR_EXIT() { int line = __LINE__; const char *file = __FILE__;\

__LINE__

とかの__の部分の意味

について解説してるサイトご存じないですか?
これについて理解できなくて・・・・。
494デフォルトの名無しさん:2008/08/26(火) 21:54:02
特に意味はない。
495デフォルトの名無しさん:2008/08/26(火) 21:57:31
>>493
ただのマクロです行数に置き換えてくれます
意味とかいわれてもわかりません
496デフォルトの名無しさん:2008/08/26(火) 22:00:58
>>494 ごめんなさい
>>495 ありがとうございました!
497デフォルトの名無しさん:2008/08/26(火) 22:58:58
>>493
多分、アンダースコアを連続で付ける意味を知りたいのだと思うが、その辺の話は、
MSDN - Deep C++ 「予約名」
http://msdn.microsoft.com/ja-jp/library/cc440188.aspx
このページの説明が分かり易いと思う。
498デフォルトの名無しさん:2008/08/26(火) 23:49:20
>>489
全部が全部shared_ptr使うわけでもないだろうし、
スーパークラスとなる可能性があるクラスは、
仮想デストラクタを作っといたほうが行儀はいいと思うよ、一応
499デフォルトの名無しさん:2008/08/27(水) 00:39:09
>>482
お答えいただいていただきありがとうございます

つまり全部参照にするか、全部値渡しにするかどっちかじゃないとだめだということ・・・?
500デフォルトの名無しさん:2008/08/27(水) 00:47:05
特殊化って何か分かってるの?
501デフォルトの名無しさん:2008/08/27(水) 00:50:06
>>500
指定した型のときだけ違う動作させるものじゃないんですか?
502デフォルトの名無しさん:2008/08/27(水) 01:06:31
>>501
そうそう。
だから、TYPE max(const TYPE& a, const TYPE& b)を特殊化したものも、
またTYPE max(const TYPE& a, const TYPE& b)のシグネチャに一致しないといけないということ。
クラステンプレートならまた話は別だけど。
503デフォルトの名無しさん:2008/08/27(水) 01:46:57
>>502
ありがとうございます
TYPE max(const TYPE& a, const TYPE& b)の特殊化であってこれに沿っていないといけないのですね

関数のオーバーロードみたいなものでなんでもいいのかと思っていました

どうもありがとうございました

504デフォルトの名無しさん:2008/08/27(水) 10:31:58
ちなみに、特殊化ではなく、単なる多重定義としてこの2つは共存できるよ。
template <typename TYPE>
TYPE max(const TYPE& a, const TYPE& b);
char *max(char *a, char *b);

あと、誰もつっこんでいないけど、<cstring>ならstd::strcmpだ。
505デフォルトの名無しさん:2008/08/27(水) 13:58:47
メモリの解放について聞きたいのですが

#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }

これについて解説していただけませんか
よろしくお願いします・・・。
SAFE_DELETE(p)の意味がわかりません・・・
506デフォルトの名無しさん:2008/08/27(水) 14:01:11
if いらんけど、delete後、確実にポインタをNULLにしたいんだろ?
なにを解説したらいいの?#defineの動作?
507デフォルトの名無しさん:2008/08/27(水) 14:03:45
自己解脱しました
ありがとうございました
508デフォルトの名無しさん:2008/08/27(水) 14:05:38
俺も解脱したい
509デフォルトの名無しさん:2008/08/27(水) 14:06:14
自己解脱www

最終解脱まだ??
510デフォルトの名無しさん:2008/08/27(水) 14:08:55
例えば #define DIGIT 30
だとすると文にDIGITを置くと30と同じじゃないですか

その文だと

#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
になってて
そのあと(p)が何度も出てくるんですけどSAFE_DELETEが見当たらないのでどういう意味なのか疑問に思いました
511デフォルトの名無しさん:2008/08/27(水) 14:09:59
            |  ゝノ
           __|_______|_   ■■■■■■■■
           |iiiiiiiiiiiiiiiii|  ■■■■■■■■■ナニヤッテンダヨ!バカモノガァ!
           |iiiiiiiiiiiiiiiii| ■■■■√ === │
           |iiiiiiiiiiiiiiiii|■■■■√ ~ ミ ノノノ 彡 |
           |iiiiiiiiiiiiiiii|■■■√   ∀    ∀ \
           |iiiiiiiiiiiiiiii|■■■  ∵   (●  ●) ∴│  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           |iiiiiiiiiiiiiiii|■■■    丿■■■(  │< 常にageとけって
           |iiiiiiiiiiiiiiii|■■■     ■ д ■  |   |  言ったじゃないかぁ!
           |iiiiiiiiiiiiiiii|■■■■   ■■ ■■ ■  \_________
           |iiiiiiiiiiiiiiiiii■■■■■■■■■■■■__
           \iiiiiiiiiiiiiii■■■■■■■■■■■■iiヽ
             \iiiiiiiiiiiii■■■■■■■■■■■iiiiiii|
              |iiiiiiiiiiiiiiiii■■■■■■■■■■iiiiiiiii|
512デフォルトの名無しさん:2008/08/27(水) 14:10:50
>>510
それ単なるバグだろww
513デフォルトの名無しさん:2008/08/27(水) 14:12:16
もしかしてSAFE_DELETE(p)の(p)って仮引数ですか?
514デフォルトの名無しさん:2008/08/27(水) 14:12:41
>>510
ttp://programnet.hp.infoseek.co.jp/clangage/preprocessor.html
適当にググるだけでもこんなページ見つかるぞ
515デフォルトの名無しさん:2008/08/27(水) 14:13:22
>>513
もちろん引数よ
516デフォルトの名無しさん:2008/08/27(水) 14:14:57
ごめんなさい
MSDNライブラリーっていうところでずっと調べてたのですが
見つからなかったので・・・;;

>>514さんの教えてくれたサイトみたら解決しました

次からはMSDNライブラリーとググってわからなかったら質問します


お騒がせしました
517デフォルトの名無しさん:2008/08/27(水) 15:10:08
>>505
そんなマクロ要らん。安全性を確保したいなら、せめて auto_ptr とか、何かしらの
スマートポインタ使うほうが簡単で確実。
518デフォルトの名無しさん:2008/08/27(水) 16:05:40
ttp://www.hsjp.net/upload/src/up38625.txt

ファイルの読み込み・書き込みをするプログラムを作ろうとしてるのですが
コンパイルして実行するとコンソールから入力された文字列をcin.getlineで取る箇所で
入力を待たずに終了してしまいます。
何が原因でしょうか。
519デフォルトの名無しさん:2008/08/27(水) 16:09:56
>>518
たぶん最初に w と Enter を入力したろ?
cin >> rorw; で 'w' だけ読み取って、Enter はまだ読まれてない
次の cin.getline で残った Enter が読まれて終了
520デフォルトの名無しさん:2008/08/27(水) 16:33:05
>>519
改行を抜いて問題なく実行できました。
ありがとうございます。
521デフォルトの名無しさん:2008/08/27(水) 20:17:54
コールバック関数とはどういうものなのでしょうか。
WinAPIやMFCを使っていたのでコールバック関数とはてっきり
「何かの動作をした場合に走らせる関数」と思っていたのですが違いますよね。
調べると渡す関数によって動作が変わる関数のような説明が多いです。
例えば○○Func(10,10,AddFunc)だと20が返り、○○Func(10,10,DivFunc)なら1が返るなど。
つまりこの○○Funcがコールバック関数なのでしょうか。
「コールバック」という言葉から事前に登録した関数が何らかの動作の際に呼び戻されるという思い込みがあって
未だに曖昧ですっきりしませんorz
522デフォルトの名無しさん:2008/08/27(水) 20:21:59
そのAddFuncやDivFuncなどの呼ばれる方がコールバック関数
○○Funcなどの呼ぶ方は何か特別な名前で呼ぶとすれば高階関数かな
523521:2008/08/27(水) 20:41:12
>>522
レスありがとうございます。
つまり「アドレスを渡した先の関数で動作させる関数」をコールバック関数という認識でいいのでしょうか。
CやC++だとAPIにあるような関数があるわけではないので、これ以外にも思い込みの言葉がありそうで怖い・・・
524デフォルトの名無しさん:2008/08/27(水) 21:16:56
ファンクタと同じようなモンって認識でいいよね?
525デフォルトの名無しさん:2008/08/27(水) 21:21:00
お世話になります。VC++6を使っています。
Win32APIでファイル一覧を取得するのに_findfirst()、findnext()、findclose()を使うのは分かったのですが、
POSIXでいうところのseekdirに当たるものはないんでしょうか?
ない場合、なんとか実現する手段はありますでしょうか?
526デフォルトの名無しさん:2008/08/27(水) 21:24:06
boostのfilesystemでどう?
527デフォルトの名無しさん:2008/08/27(水) 21:30:39
窓の杜の週末ゲームを良く見る。
たまに凄いハイクオリティーなのあるよな
あれってやっぱりCで作ってるのか?
528デフォルトの名無しさん:2008/08/27(水) 21:36:04
>>525
自分でfindfirstと_findnextが得た_finddata_tを配列に貯めていけばいいんじゃないの?
529デフォルトの名無しさん:2008/08/27(水) 21:43:04
VISTAで.NET 2008だと VC++6.0でMFCを使用したアプリは動かない様ですが
win32APIだけを使用したものなら98SEで動作していたVC++のアプリは動作するんでしょうか?
また自作のDLL(同じくVC++で作成)も同様でしょうか?
530525:2008/08/27(水) 22:11:49
>>526
すいません。言い忘れがありました。
C言語でC++は使わない前提です。

>>528
なるほど。
ただ、行いたいのはwin32上でopendir()/readdir()を実装しかったのですが、
staticな変数に_finddata_tを保存して、最初のreaddir()時に云々するより、
opendir()関数内部で_findfirst()を行った後、seekdir()みたいなもので
参照ポイントをずらせないかなと思って質問しました。
531デフォルトの名無しさん:2008/08/27(水) 22:35:46
//-------------------------------------------------------------
// デフォルトコンストラクタ
//-------------------------------------------------------------
Renderer::Renderer()
: m_pD3D(0), m_pD3DDevice(0)
{
}

これの : ってつけるとどういう意味があるんですか?
メンバ関数にアクセスするためですか?
532デフォルトの名無しさん:2008/08/27(水) 22:44:02
「もし、>>531の質問に完全な答えを教えたら、>>531も私と同じように利口になるだろうが、それは望ましくないな。」
533デフォルトの名無しさん:2008/08/27(水) 22:44:09
>>531
メンバ変数の初期化じゃね?
534デフォルトの名無しさん:2008/08/27(水) 22:45:57
メンバ初期化リスト
535デフォルトの名無しさん:2008/08/27(水) 22:50:25
コンストラクタ初期化子ってやつですか

調べたら解決しました

ありがとうございました
536デフォルトの名無しさん:2008/08/27(水) 23:59:16
複数のデータを連結したバイナリファイルから、
freadでデータを一つずつ読み込みたいんですが、
最後のデータに到達したことを判断する方法ってありますでしょうか。

ファイルの終わりに到達したのにさらにfreadをした場合どうなるのでしょうか。

環境はVC++、Windowsアプリケーションです。
537デフォルトの名無しさん:2008/08/28(木) 00:03:02
>>536
freadの戻り値の説明を読む
http://msdn.microsoft.com/ja-jp/library/kt0etdcs(VS.80).aspx
538536:2008/08/28(木) 00:03:28
自己解決したかも。。
これでいいですか?
while(fread(pBuf, size, 1, fp) == size) {
}
539デフォルトの名無しさん:2008/08/28(木) 00:05:55
>>536
http://www.linux.or.jp/JM
ここ知ってるとこの先ずっとしあわせ
540デフォルトの名無しさん:2008/08/28(木) 00:25:05
テキストエディタをエディットコントロール使わずに自前で自作しようとしたら、
ウインドウに描画する文字列は再描画し続けないと駄目なのでメモリ上に取り込んで
おく、っていうやりかたであってますか?

ためしに100MBのテキストファイルを
notepadで開く -> notepadのメモリ使用量約200MB
秀丸で開く -> 秀丸のメモリ使用量約50MB
だったので秀丸ってどうやってるのかなとちょっと疑問に思ったもので
541デフォルトの名無しさん:2008/08/28(木) 00:27:34
ファイル全体を保持してるわけじゃないんでしょ。
542536:2008/08/28(木) 00:35:30
>>537
どうもありがとうございます。
戻り値は読み込んだサイズでなく、個数なんですね。
543デフォルトの名無しさん:2008/08/28(木) 06:10:46
int num = 0; //配列番号
double box = 0.0;//任意の数値
double data[ 3 ] = { 1, 2, 3 };

num = 0.4 * box;
でnumに小数点以下切り捨て(例1.2→1)の数値を入れるにはどうすればいいでしょうか?
544デフォルトの名無しさん:2008/08/28(木) 07:48:06
>>543
numはintだから何もしなくてもいいんじゃない
545デフォルトの名無しさん:2008/08/28(木) 07:50:48
>>543
intに変換した時点でなる
ただし四捨五入ではなく小数点すべて切り捨て

warningが気になるならキャスト(cast)調べろ(ただしあまり使うべきではない。その理由もキチンと把握すべし)

あとその場合、boxが10以上の場合
異常をきたすので、その対処も忘れずに
546デフォルトの名無しさん:2008/08/28(木) 08:02:28
static_cast<int>()
547545:2008/08/28(木) 08:06:16
ああ、済まない
「dataが10以上のときに」ではなく
「numが0より低いor4以上のときに」だな

>>546
ひけらかしたいのか教えたいのか
548デフォルトの名無しさん:2008/08/28(木) 08:08:04
dataでなくboxだた
549デフォルトの名無しさん:2008/08/28(木) 08:11:17
>>547
>キャスト(cast)調べろ(ただしあまり使うべきではない
>546
550デフォルトの名無しさん:2008/08/28(木) 08:18:23
微妙に論点ずれてる上に答えになってない
つーか君は会話出来ないのか?
551デフォルトの名無しさん:2008/08/28(木) 10:08:57
>>543
floor
552デフォルトの名無しさん:2008/08/28(木) 10:42:12
それだと型はdoubleのままだ。
553デフォルトの名無しさん:2008/08/28(木) 10:54:48
546じゃないけど546のレス以外の何ものでも無いと思う。
Cなら少し違うけど。

それに>>543の目的で「あまり使うべきではない」のも意味が分からない。
切り捨てのセマンティクス的にってことかな?
整数化のセマンティクスとして問題無いように思うけど。
554デフォルトの名無しさん:2008/08/28(木) 10:57:11
>>552
型変換自体は暗黙の変換を期待してるが floor を使う理由は
次のコードにおいて
#include<stdio.h>
#include<math.h>

int main(void){
int base=10000, a, b;
double ratio=0.7;

a=base*ratio;
b=floor(base*ratio);
printf("a=%d b=%d\n", a, b);

return 0;
}

Borland C++ Compiler 5.5.1 での出力結果は
6999 7000

gcc 3.4.5(MinGW) での出力結果は
7000 7000

と出力結果が異なる不具合を避けるため
555デフォルトの名無しさん:2008/08/28(木) 11:08:26
処理系間の浮動小数点数の誤差って程度問題じゃね?
完全に誤差無くそうとしたら大変だと思うけど・・・。
556デフォルトの名無しさん:2008/08/28(木) 12:51:04
10.2 * 100 = 1019
になるしな
557デフォルトの名無しさん:2008/08/28(木) 13:12:49
マネージコードでdllを作成することってできる?

dllのソース内でSytem::Stringを使おうとしたらC4747エラーがでちゃった
ソースの方に「#pragma unmanaged」宣言してるから仕方ないんだけどさ

なんかやり方あるんでしょうか?

環境はvc++2005でc++/clrでやってます
558デフォルトの名無しさん:2008/08/28(木) 13:15:18
>>557
時代に乗れなくてマネージコードが理解できないおじさんが通りますよ
C++はマネージコード廃止してくれないかな
559デフォルトの名無しさん:2008/08/28(木) 13:31:00
>>557
C++/CLIはC++とは別言語です。
専用スレがあるのでそちらへ。
560デフォルトの名無しさん:2008/08/28(木) 14:37:38
>>559
言語名間違えたまま検索して専用スレがないと思ってこっちにきてました
移動します
561デフォルトの名無しさん:2008/08/28(木) 20:18:48
char*の文字列に漢字をいれるとプログラムによって1バイトごとの中身が変わるのですが何が原因なのでしょうか。
sprintfを使ってchar*に入れたもので、文字列をprintfすると正しい漢字が表示されます。
ただしchar*の文字列を別のプログラムに渡したり受け取ったりすると正しく表示されません。
562デフォルトの名無しさん:2008/08/28(木) 20:23:27
はあ?
563デフォルトの名無しさん:2008/08/28(木) 20:38:31
これは難しい・・・・
564デフォルトの名無しさん:2008/08/28(木) 21:23:50
>char*の文字列を別のプログラムに渡したり
どうやって別のプログラムに渡してるんだ?
565デフォルトの名無しさん:2008/08/28(木) 21:41:38
>>564
単純にchar*文字列を1バイトずつファイルに入れているだけです。
渡す以前に
char str[256];
sprintf( str, "漢字" );
を実行したときのstrの中身が1バイトごと見ると違っていたりします。
デバッグでstrを見ると「漢字」が表示されます。
英数字は大丈夫(中身がバイト単位で一致)で、ひらがなも問題ありませんでした。
2つのプログラムで同じ漢字を使っても1文字でchar2つ分使ってたり1つで済んでいたりと違いがあります。
566デフォルトの名無しさん:2008/08/28(木) 22:05:44
>違っていたりします。
何と違うの?

別のプログラムの具体的な名前と、
渡したり受け取ったりというのを詳しく。
567デフォルトの名無しさん:2008/08/28(木) 22:22:36
使用している文字コードの違い
char型といってもSJIFやUTF8など色々あるので開発環境が違えば正常なデータのやり取りが出来なくなる危険性がある
ちなみにUnicodeは2バイト固定なのでTCHARとかで拾ってやれば漢字でも問題ない
質問者はともかく回答者まで知らなかったとかいうオチじゃないよな・・
568デフォルトの名無しさん:2008/08/28(木) 22:28:56
原因はそうだろうけど、
質問者のレベルがどの程度かを、ね。
569デフォルトの名無しさん:2008/08/28(木) 22:35:51
>>567
TCHARは2バイトとは限らない
570デフォルトの名無しさん:2008/08/28(木) 22:36:34
>>567
TCHARもどっかがUNICODEコンパイルせずでダメになるだろ。WCHARにしないと。
571デフォルトの名無しさん:2008/08/28(木) 22:38:47
>>567
話は逸れるけど、今時のUTF-16も1文字2バイト固定ではありませんよ。
572デフォルトの名無しさん:2008/08/28(木) 22:45:57
template <class T>
class A
{
};

template <class T, int I>
class B : public A<B<T, I>>
{
};

int main(int argc, char* argv[])
{
B<int, 5> b;
return 0;
}

Visual C++ 2008なら通るんだがg++だと通らない。

a.cpp:7: error: template argument 2 is invalid
a.cpp:7: error: template argument 1 is invalid

なぜじゃー
573デフォルトの名無しさん:2008/08/28(木) 22:46:07
m_pVB->Lock( 0, 0, (void**)&v, 0 );

(void**)&v
これってどういう意味なんですか?
&だから参照渡しかと思ったら*でポインタっぽい感じがしてよくわかりません・・・
574デフォルトの名無しさん:2008/08/28(木) 22:49:20
>Unicodeは2バイト固定
突っ込みたいがスレ違いなのでバナナ食べてくる
575デフォルトの名無しさん:2008/08/28(木) 22:52:09
>>573
& ってのは、変数を定義するときにつければ「〜型への参照」になるけど。
すでに存在する変数につければ「〜へのポインタ」になる。
つまり

int& a = 〜〜〜;
これは「 a は int 型への参照」を意味するが

int b;
f(&b);
これは「 b へのポインタを関数 f に渡す」になる。

つまりその
(void **)&v
は、「 v へのポインタを、void ** 型にキャストする」
ってことになる。
576デフォルトの名無しさん:2008/08/28(木) 22:56:01
ドライバのプログラミング(WDK)についての質問ってここでいいんでしょうか?
スレ違いだったらすみません
577デフォルトの名無しさん:2008/08/28(木) 22:56:47
>>567
友人とソケット通信を作って動かしたら文字化けしたの思い出した。
送信する文字列やサイズは合ってるのでソケットプログラムが原因だと半月対峙したのも今は昔。

>>573
恐らく頂点周りのかな。
575も書いてるけどvをvoid**型にキャストするだけ。
頂点の型は色々ある(ユーザーが作ると型名なんか全て一緒にならない)けど、結局は座標やUV値など中身は似たようなものなので
Lock関数でどんな型でも受け取って処理できるような形になってる。
578デフォルトの名無しさん:2008/08/28(木) 22:59:34
>>575 >>577
なるほど!
ありがとうございました
579デフォルトの名無しさん:2008/08/28(木) 23:05:08
もう1つだけ分からない点があるのですが
voidのあとに**を2つつける意味ってなんですか?
調べたら
===
C++でも任意のポインタから void * へは暗黙の型変換が可能です。
でも、void** は、void * ではありません。
ということです。

ちなみに、Cだと、void ** へも暗黙の型変換できてしまうようです。
===
という風に書いてあったのですが いまいち2個つける意味が理解できません

よかったら教えていただけませんか よろしくお願いします
580デフォルトの名無しさん:2008/08/28(木) 23:11:32
>>576
【WDM】Windows Driver Model相談室【デバドラ】
http://pc11.2ch.net/test/read.cgi/tech/1063453024/
581576:2008/08/28(木) 23:12:46
>>580
誘導ありがとうございます
582デフォルトの名無しさん:2008/08/28(木) 23:22:32
>>579
vを持った配列のアドレスといったら分かりやすいかな。
リンゴ(int)の配列がダンボール(int*)で、それの配列が店(int**)。
ダンボールに入れることが出来るのはリンゴだけ。
店にダンボールをいくつも置けるし、そのダンボールにリンゴを入れることも出来る。
店(int**)が今日は1番目のダンボール(int*)を使い、明日は5番目のダンボール(int*)を使う・・・とか店(int**)1つで管理できる。
voidの場合はアドレスの型を指定させない場合に使うので使い方は変わるけどね。
例えが宜しくないけど、ポインタのポインタってこんなイメージでも。

583デフォルトの名無しさん:2008/08/28(木) 23:27:52
>>582

おお!ありがとうございます!

理解できました

ポインタのポインタって感じですね
584デフォルトの名無しさん:2008/08/28(木) 23:28:31
>>582
ダンボール(int*)が本当にリンゴ(int)を入れてもいいダンボールなのかチェックが必要とかw
例え話はそのままで教えるよりも余計ややこしく感じるぜ
585デフォルトの名無しさん:2008/08/29(金) 06:19:58
>>572
× >>
○ > >
586デフォルトの名無しさん:2008/08/29(金) 06:21:26
マトリョーシカな世界だな
587デフォルトの名無しさん:2008/08/29(金) 10:46:45
テキストで書かれた"FF00CC"てな感じの文字列をバイナリに直しているのですが
文字列に"0A"が来ると改行コードと間違えるのか、変換されたバイナリが「0D0A」になってしまいます。
うまく対処する方法はないでしょうか?
windowsのコマンドプロンプトで利用しています。
int main(int argc, char *argv[]){
int c, sigbit, isSig;
isSig = 1;
while ((c = getc(stdin)) != EOF) {
if ('0' <= c && c <= '9') c -= '0';
else if ('a' <= c && c <= 'f') c = 0x0a + c - 'a';
else if ('A' <= c && c <= 'F') c = 0x0a + c - 'A';
else if (' ' == c || 0x0a == c || 0x0d == c || 0x09 == c) continue;
else {
fprintf(stderr, "invalid character %c\n", c);
break;
}
if (isSig) sigbit = c << 4;
else putc(sigbit | c, stdout);
isSig ^= 1;
}
return 0;
}
588素人:2008/08/29(金) 10:54:29
getcを使わずにfreadを使う!
589デフォルトの名無しさん:2008/08/29(金) 10:55:43
590デフォルトの名無しさん:2008/08/29(金) 10:55:50
変換が起きるのは書き込むときだろう
591デフォルトの名無しさん:2008/08/29(金) 11:02:23
シーンの作成時やレンダラーの初期化時に

HRESULTをいうのを使っているのですが
HRESULT Renderer::Initialize(HWND hWnd, BOOL isFullScreen, int clientWidth, int clientHeight)

LRESULTとの違いってなんですか?
LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

ウィンドウプロシージャルを定義するときはLのほうを使って
DirectXの初期化の時などはHを使うって事ですか?
592デフォルトの名無しさん:2008/08/29(金) 11:02:53
>>587
setmode()
593591:2008/08/29(金) 11:05:59
すいません書き込むスレ間違えました

WIN32APIスレ行ってきます

スレ汚しすいませんでした
594デフォルトの名無しさん:2008/08/29(金) 12:40:13
>589,592
ありがとうございました。
595デフォルトの名無しさん:2008/08/29(金) 19:36:10
classの中にstaticな関数をヘッダで定義したのですが、これをソースファイルで定義するときは
staticと書かなくてもいいですか?
596デフォルトの名無しさん:2008/08/29(金) 19:37:41
>>595
やってみれば分かるが要らない。
597デフォルトの名無しさん:2008/08/29(金) 22:19:08
admini権限を持っている作成したユーザーでvcvars32.bat実行した後、
cl使おうとしてもvcvars32.batを実行したdos窓でしか使えない…
これってsetコマンドの元からの仕様ですか?
Administratorユーザーならdos窓で普通にclが使えるんですが
598デフォルトの名無しさん:2008/08/29(金) 22:21:37
あ、ここC言語のスレですね。
Visual Cの専門スレに行った方がいいですね…
599デフォルトの名無しさん:2008/08/29(金) 22:22:40
>>597
環境変数いじればいいんじゃない?
XP なら
[マイコンピュータ]-[プロパティ]-[詳細設定]-[環境変数]
をいじって再起動すればおk
もしかしたらログオフ&ログインだけでもいけるかも
600デフォルトの名無しさん:2008/08/30(土) 01:00:22
>>585
ありがとう
601デフォルトの名無しさん:2008/08/30(土) 09:18:15
#include <iostream>

template<class T>
class Base
{
int m_values[T::Dimension];
};

class A : public Base<A>
{
enum { Dimension = 3, };
};

int main(int argc, char* argv[])
{
A a;
}

a.cpp: In instantiation of ‘Base<A>’:
a.cpp:10: instantiated from here
a.cpp:6: error: incomplete type ‘A’ used in nested name specifier
a.cpp:6: error: array bound is not an integer constant

こういうことってできない?
602デフォルトの名無しさん:2008/08/30(土) 09:58:42
>>601
Base<A>のm_valueの定義はAが先に実体化されてるのが前提になりますが、
Aの実体化はBase<A>より後にされますよね。
ならばBaseはAが定義されてることをどうやって知ればいいんでしょうか?
どうしても例のコードの機構が欲しいのなら
BaseにDimensionの定義を移譲するか、BaseやAより先に実体化される型にDimensionの定義を移譲して、
AやBaseはそれを参照するとするとかしかなさそうな気がします。
603デフォルトの名無しさん:2008/08/30(土) 10:26:46
>>602
ども

#include <iostream>

template<class T>
class Base
{
public:
void foo()
{
std::cout << T::Dimension << std::endl;
}
};

class A : public Base<A>
{
public:
enum { Dimension = 3, };
};

int main(int argc, char* argv[])
{
A a;
a.foo();
}

これなら通るんだがそういうもんなのか
604デフォルトの名無しさん:2008/08/30(土) 10:41:53
foo内部の名前の解決はa.foo();時点であるからAの実体化→コンストラクタ呼び出しの時点では問題無く通る
で、a.fooの呼び出しの時点でaの型Aはすでに実体化されてるんでBase<A>::foo内部でのA::Dimensionは問題なく解決できる…と
そういうカラクリみたい
これをよりわかりやすく確認するには、T::dimensionをT::xxxxxのようにAに無い名前にしたら、
エラーになるのはmain()でのa.foo();の行の時点でA a;の時点ではエラーにならない(=a.foo()をコメントアウトすれば通っちゃう)
とかそういう例も見ればいいと思う
605デフォルトの名無しさん:2008/08/30(土) 10:42:29
>>604
なるほど

とんくす!
606デフォルトの名無しさん:2008/08/30(土) 13:48:23
僕の通っているゲーム関連の専門学校で9月にC言語検定3級があるのだけど
例年の合格率は20%切ってると先生に言われた。

そんなに難しいのですか?

607デフォルトの名無しさん:2008/08/30(土) 13:53:38
>>606
問題が難しいんじゃない。 受ける層が(ry
608デフォルトの名無しさん:2008/08/30(土) 13:53:55
やる気のない専学生やら大学生やらがとりあえずで受けてるから低いんじゃないの?
3級は簡単だよ
609デフォルトの名無しさん:2008/08/30(土) 13:55:24
3級ってお遊びみたいなやつだろ。

ちなみに、その検定は1級とっても実務では役に立ちません。
610デフォルトの名無しさん:2008/08/30(土) 13:56:15
2級までは簡単だよ

1級は1600行くらいのソースコードを仕様書通りに変更したりするからそう簡単にはいかない
611デフォルトの名無しさん:2008/08/30(土) 13:57:57
3級20パーってどんだけw
612デフォルトの名無しさん:2008/08/30(土) 14:02:32
サーティファイのウェブサイトには平均53.5%って書いてあるから、3級は70%ぐらいなんじゃないの。
613デフォルトの名無しさん:2008/08/30(土) 14:11:23
20%っていうと基本情報の合格率と同じくらいだぞ・・・
614デフォルトの名無しさん:2008/08/30(土) 14:17:23
615デフォルトの名無しさん:2008/08/30(土) 14:36:15
父さん、そんな古い物を…
616デフォルトの名無しさん:2008/08/30(土) 15:05:39
>>614のマンガはリアルだな。俺の通ってる専門学校もそんなもんだ

自分はゲーム専門学校の2年で夏休み前から卒業製作(週15コマ)の話が持ち上がった。
俺は1年の頃から3DのRPGを創りたくて授業とは別に独学で毎日勉強していた(数学・物理・DirectX・アルゴリズムなど)
他の人たちは何創るのか聞いてみたら俺以外みんな似たような美少女系サウンドノベル。
先生が必ずチームになる事と言っていたのでどこかのチームに入らなければいけない。
僕が1年半必死になって勉強した成果は学校では発揮できないのであった。
家で創ろう
617デフォルトの名無しさん:2008/08/30(土) 15:17:59
>>616
おまいさんは腐海で腐らされないうちに逃げ出しておきなよ。

私の勤める会社にも、>614の典型のようなのが定期的に入ってくる。
就職できる分だけ頭はいいんだけど全く応用が利かないんだよね。

・何度説明しても変数という概念が理解できない
・1インチは25.4mmと教えているのにインチ→cmの変換関数を作れない
# 理由は「1インチが何cmか判らない」
・「何でプログラムを作るのにキーボードが必要なんですか?」

もうね。
618デフォルトの名無しさん:2008/08/30(土) 15:21:16
>・「何でプログラムを作るのにキーボードが必要なんですか?」
この考えを突き詰めると今のように中途半端にVSとかで切り貼りするよりも
新しいタイプのプログラミングモデルが出来るのかも知れない、かも知れないだけだけど
619デフォルトの名無しさん:2008/08/30(土) 15:29:56
>>617
さすがにそこまでひどいのは見た事無いな

全角空白が混じっててコンパイルできないってやつなら見た事あるけど
620デフォルトの名無しさん:2008/08/30(土) 15:31:21
キーボードめちゃくちゃ使うだろww
621デフォルトの名無しさん:2008/08/30(土) 15:34:18
キーボードなんか使うのは素人だけだ
玄人に必要なのはマウスのみ!
622デフォルトの名無しさん:2008/08/30(土) 15:35:48
もしかして手書き認識機能を使うのか!
623デフォルトの名無しさん:2008/08/30(土) 15:38:31
キーボードを使わずにプログラミングしてる姿が想像できない……
624デフォルトの名無しさん:2008/08/30(土) 15:39:14
音声認識でブツブツ・・・と
625デフォルトの名無しさん:2008/08/30(土) 15:43:14
>>624
なるほど!
それなら寝ながらプログラミングできるな!!
626デフォルトの名無しさん:2008/08/30(土) 16:11:24
質問です
std::string::size_type ret = str.find(0x09);
while (ret != str.npos && ret + 1 < str.length() ) {
  str.replace(ret, 1, " ");
  ret = str.find(0x09);
}
タブを半角スペース4つに置き換えるサンプルですが
whileの条件で、ret + 1 < str.length() は何のためにあるのでしょうか?

これがあると、ファイルの最後でタブが見つかっても置き換えされないと思うんだけど
627デフォルトの名無しさん:2008/08/30(土) 17:15:14
趣味でゲーム作ってるプログラマーです

猫が水泳するゲームを作りたいのですが
創り方のアドバイス?いただけませんか。
使える言語は
C/C++
OpenGL/DirectX
WIN32API
です
628デフォルトの名無しさん:2008/08/30(土) 17:16:51
言語が使えると言いながら使いこなせないならただのアホだろ
脳は腐る前に使えよ
629デフォルトの名無しさん:2008/08/30(土) 17:21:34
マルチスレッド使えばいいんじゃない?
630デフォルトの名無しさん:2008/08/30(土) 17:26:18
>>627
Cでアクションとかシューティングゲームのソース公開してるのを見て、真似をする。
631デフォルトの名無しさん:2008/08/30(土) 17:52:06
>>625
Vistaの音声認識でperlのプログラム書こうとするもうまく行かなくて、
最終的にキーボードつかっちゃう動画があったよな…
632デフォルトの名無しさん:2008/08/30(土) 19:24:15
C++についての質問です。
CTestAクラスの関数MsgAとCTestBクラスの関数MsgBがあります。
それぞれ void CTestA::MsgA(int) 、 void CTestB::MsgB(int) このような感じです。
加えてCTestCクラスにMsgC( void (*pFunc)(int) )があり、そこにMsgAとMsgBを渡したいのですが無理なのでしょうか。
どのようなクラスでも引数と戻り値があっていればMsgCに渡すことが出来、
MsgC内で
if( pFunc )
 pFunc( n );
のように実行できるようにしたいのですが、MsgCにクラスの関数を渡すことが出来ずに困っています。
void CTestA::Test(void){
〜略〜
pTestC->MsgC( (void*)( MsgA ) );
}
とやってもキャストが出来ずエラーが出ました。
クラスでなければMsgCに渡すことが出来たので、やはりクラスの関数は無理なのでしょうか。
633デフォルトの名無しさん:2008/08/30(土) 19:35:47
メンバ関数は、staticなものでない限りインスタンスが存在しなければ実行する事ができない。
よってMsgAはCTestAのインスタンスを必要とし、MsgBはCTestBのインスタンスを必要とする。
即ちMsgC( void (*pFunc)(int) )はどんなインスタンスも必要としない関数しか引数にとることが出来ず、
もし仮に何らかのインスタンスを必要とする関数を外部から実行したいのなら、インスタンスとメンバポインタを渡す必要がある。

ちなみにboostには、インスタンスとメンバ関数のポインタを渡せば、関数の属する型がどんな型であっても
動的に解決して実行してくれるものが存在する。
これは、テンプレート関数で実行をラップし、そのテンプレート関数のポインタを動的に操作しているに過ぎない。
634617:2008/08/30(土) 19:39:33
>>623
課題の書かれたメールからキーワードを抽出して検索、
見つかったサンプルっぽいコードをコピペすれば完成。
この間、マウス操作だけで行なってしまうわけ。
勿論、最初はコンパイルさえ通らない。
そうしたらエラーメッセージで検索して、
また適当に見つかったサンプルからコピペしてくる繰り返し。

それを見咎めて「目の前にキーボードがあるんだから、
課題ぐらい自分で打てよ」と言われたときの返事が
>「何でプログラムを作るのにキーボードが必要なんですか?」
というわけ。

他の二人は自分には向いてないと理解したし素直にやめたが、
このマウス野郎は親からクレームの電話が掛かってきたらしい。
# この親にしてこの子ありと言うか、まさにモンペ。
635デフォルトの名無しさん:2008/08/30(土) 19:42:24
>>632

関数のポインタを求めるメンバ関数を作るくらいなら、MsgCが求める
インターフェイスへのポインタを入力にして、MsgCの中でそれを呼ぶ。
仮想関数ってそのためのものだし。
メンバ関数のアドレスを入力にするという方法もある。

個人的にはどっちもおすすめではない。
オブジェクトのコンポジションで解決すべき内容な気がするし。
636632:2008/08/30(土) 21:21:20
>>633,635
ありがとうございます。
改めて色々考えてみましたが一筋縄ではいかないようですね。

想定している用途としてはCTestCクラスのインスタンスに別のクラスの関数を登録しておき、
CTestCクラスのインスタンスが一定回数呼び出されたら登録した関数を呼び出す。
他にもデストラクタに「削除」のメッセージを登録した関数に送るなども考えています。
登録する関数は様々なクラスのもの、関数名自体も不定・・・となれば頭を悩ませてしまいます。
テンプレート自体名前ぐらいしか知らないのですが、これを上手く使えば上記のことが解決するのでしょうか。
637デフォルトの名無しさん:2008/08/30(土) 22:50:32
テンプレートクラスを書くときって
cppは空でヘッダにバリバリ書いていくけど、
複数のcppからそのヘッダを読み込んで実体化すると、
その分バイナリの容量が増えることが多い?
638デフォルトの名無しさん:2008/08/30(土) 22:59:00
>>632

テンブレートなんて使わずに、
オブザーバパターンでググってみれ。


ここから先は有料だ。
639デフォルトの名無しさん:2008/08/30(土) 23:03:51
>>632のやりたい事が実現できるdelegateという仕組みが他の言語にはあってのう・・
640デフォルトの名無しさん:2008/08/30(土) 23:42:50
>>638
違うんでない?

Observerパターンはあるオブジェクトの振る舞いがなされたことを、
通知先のオブジェクトの型にかかわらずにインターフェイスを介して
行うこと。通知先の登録・削除があるのが普通。

639も言うとおり、MsgCをコールする際にインターフェイスを
求めるのはどちらかと言うとテンプレートメソッドに近いかと。
いちいち継承したりインターフェイスを実装したりするのがウザい
から、他の言語では delegate。

641デフォルトの名無しさん:2008/08/31(日) 00:21:36
デリゲートなんか使うのは設計が悪い。

そもそもデリゲートはstatic関数しか駄目じゃん。

たくさんコールバック関数があるとかいってるからもう少し整理して抽象化するべき。

よってオブザーバをすすめる。
642デフォルトの名無しさん:2008/08/31(日) 01:06:10
トランプの手札作り+シャッフルまで書いてますが
トランプデータが上手く格納されない、PCのビープ音連発するけど、解決策が全く見えない。

ソースUPしますので悪い所指摘お願いします。

環境はVC6.0です。

http://www.dotup.org/uploda/www.dotup.org0113.cpp.html
643デフォルトの名無しさん:2008/08/31(日) 01:18:58
>>636
関数じゃなくて、オブジェクトを登録して、RTTIでクラスを判別しつつ、適当なメソッドを呼び出すってのもありじゃね。

>>642
とりあえず、swp(int a, int b)がよろしくない。
swp(int& a, int& b)にするとか?
644デフォルトの名無しさん:2008/08/31(日) 01:48:04
>>641
お前は何を言ってるの?
645デフォルトの名無しさん:2008/08/31(日) 03:29:42
>>642
数値の入れ替え自体は std::swap を使えばおk
但し、配列同士の入れ替えはできないのでこんな感じ
std::swap(cards[ran1][0],cards[ran2][0]);
std::swap(cards[ran1][1],cards[ran2][1]);

cout に char を与えると char を文字コードとして出力する
数値として出力したければ int を cout に渡せばよい
C++ のキャストはよく知らんのでどう書くかは他の人に任せる

入れ替えのアルゴリズムについて
変数 cards は構造体もしくは class にすれば
std::random_shuffle(&cards[0], &cards[51+1]); // この場合は cards[0]〜cards[51] までの計 52 枚をシャッフルする
とかできる

または下記のアルゴリズムがそれなりに優秀
for(int i=0;i<52;i++){
ran2=rand()%(i+1);
std::swap(cards[i], cards[ran2]);
}
646デフォルトの名無しさん:2008/08/31(日) 03:43:59
>>645

レス有難う御座います。
他のところは自己解決しましたが、シャッフルの良い案が無くて詰ってました。
提示していただいたシャッフルアルゴリズム見ながらいじってみます。
647デフォルトの名無しさん:2008/08/31(日) 04:19:38
perl でいう CPAN みたいな、
各人がライブラリを公開している所ってある?
648626:2008/08/31(日) 04:39:59
ファイルって書いちゃったけど、文字列の間違いでした
strはstd::stringです
ret + 1 < str.length() が必要なのか誰か教えてください
649デフォルトの名無しさん:2008/08/31(日) 07:56:16
>>648
普通に考えて、タブを空白に変換するには先頭からのカラム数を意識する必要がある。
さもなくば、先頭からの連続したタブだけを対象にするとか。
そのどちらでも無いそのサンプルは、要はそのサンプルならではの仕様なんでしょ。
いずれにしても、「0x09」なんて書いているサンプルじゃ見るだけ無駄だよ。
650デフォルトの名無しさん:2008/08/31(日) 10:00:05
char型で、ワイド文字の関数にアクセスしたくないですか?
Wcharは色々と使いにくいんです。 
ファイル、ディレクトリアクセスに関わる所だけWcharに変換してアクセスしたら良いと思います
651デフォルトの名無しさん:2008/08/31(日) 10:00:23
コンパイラについての質問なんだが。。。

DJGPPのgxx.exe使おうと思ったら
Cannot execute "gcc.exe": No such file or directory(ENOENT)
てエラーでたんだが。。。

gxxってコンパイラの補助してるだけなの?
やっぱりcygwinとか入れてgcc使える状態にしなきゃだめなの?
652デフォルトの名無しさん:2008/08/31(日) 10:10:42
>>650
そうですか。じゃあそうしてください。
653デフォルトの名無しさん:2008/08/31(日) 10:14:37
メンバ関数全部仮想にしてもいいよね(´・ω・`)
654デフォルトの名無しさん:2008/08/31(日) 10:55:08
#include <stdio.h>

main()
{
int ia;

printf("好きな数字を入力してください:");
scanf("%d", &ia);
if (ia >= 0)
printf("+の数字が入力されました\n");
else
printf("-の数字が入力されました\n");
}

これをコンパイルしようとすると
rezserverd.libが見つかりませんって出るんですけど
どう対処すればいいですか?
655デフォルトの名無しさん:2008/08/31(日) 10:56:16
質問です。 データをバッファにため込んで書き出すクラスを作ったとします。
アクセスごとに、バッファのサイズを確認して書き出せば一応出来ますが
もしバッファが、49M貯まっていてあと1メガふえれば書き出す場合に
データはしばらく来なかったら、書き出されるバッファを占有し、電源切れたらデータも消えます。
タイマーみたいにしてアクセスが無い事を知る方法はありますか?
656デフォルトの名無しさん:2008/08/31(日) 11:00:30
>>655
デストラクタでフラッシュするようにしたら?
657デフォルトの名無しさん:2008/08/31(日) 11:08:51
>>654
本当にそのライブラリがないといわれるなら作成環境を1から作り直さないとやばそうな気が。
658デフォルトの名無しさん:2008/08/31(日) 11:16:03
>>651
環境変数 djgpp に djgpp.env のフルパスを設定しる
659デフォルトの名無しさん:2008/08/31(日) 11:26:42
>>654
開発環境がおかしい。
環境は何?
まぁ何であれ>>657の通り作り直さないといけないけど。
660デフォルトの名無しさん:2008/08/31(日) 11:27:08
>>651
gxx.exeが「djgppのgcc.exe」を呼び出してると思われ。

cygwinとかは要らないっしょ。
661デフォルトの名無しさん:2008/08/31(日) 11:36:08
>>660
readme読んだらそうらしい。
最低限必要なファイルが4つくらいに分かれて配布されてた。
英語でもreadme嫁ですね。
662デフォルトの名無しさん:2008/08/31(日) 11:40:27

>>659
開発環境はマトリョーシカです。

開発環境の構築を再確認してみます
663デフォルトの名無しさん:2008/08/31(日) 12:05:17
うちの専門学校に某ツクールで創ったゲーム持ち込もうとしてるやつがいる。
結構面白くてみんなから羨望のまなざしを受けてるんだけど、某ツクール作品で受かったやつっているのか?

流石に無いと思うんだが・・・。
664デフォルトの名無しさん:2008/08/31(日) 12:06:46
>>663
何の専門学校だよ
665デフォルトの名無しさん:2008/08/31(日) 12:06:49
書き込むスレ間違えました
スレ汚しすいません
666デフォルトの名無しさん:2008/08/31(日) 12:44:07
SetTimer SetWaitableTimerは使う用途は違うんですか?
667デフォルトの名無しさん:2008/08/31(日) 12:47:12
666です。わかりました。とおもいます。 Settimerは時間経ったら関数を呼び出し
SetWaitableTimerは時間経ったらシグナルを出すんですね。
668デフォルトの名無しさん:2008/08/31(日) 12:57:22
マルチスレッドの勉強をしているのですが、次であってますか?
どの排他処理が優れているとかはないですよね? 以前はどれか一つを学べば良いと思ってました。

クリティカルセクション ・・・ コードで止める
ミューテックス ・・・ リソースで止める
セマフォ ・・・ 回数で止める
SetWaitableTimer ・・・ 時間で止める
669デフォルトの名無しさん:2008/08/31(日) 12:59:13
うーん。
もう少しOSの勉強してからだと理解早いと思うよ。
670デフォルトの名無しさん:2008/08/31(日) 13:15:42
>>662

何それ
671デフォルトの名無しさん:2008/08/31(日) 13:24:18
ここみるとデッドロックは簡単に発生しそうなんですが
初心者がまあり考慮しなくても起こらないように出来るAPIやライブラリはありますか?

デッドロック - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF
672デフォルトの名無しさん:2008/08/31(日) 13:35:36
>>671
mutexは?
673デフォルトの名無しさん:2008/08/31(日) 14:06:20
ミューテックスだったらデットロックは発生しないんですか?
674デフォルトの名無しさん:2008/08/31(日) 14:27:48
>>673
性質を理解してれば発生しないように作ることは出来るよ
675デフォルトの名無しさん:2008/08/31(日) 14:46:14
ファイルを書き込む関数を作ったとして、参照で5Mの書き込み要求があった場合
それをコピーしておけば、他の書き込み待ちがあっても呼び出し先へ直ぐに復帰でき
元のメモリも自由になります。
もし、500Mの書き込みなら、メモリにコピーするのは大変で、書き込み完了まで待たせた方が良さそうです。
何メガ以内ならコピーしたら良いと思いますか?

676デフォルトの名無しさん:2008/08/31(日) 14:57:20
ファイルへread write read write とする場合、write write read  readの方が速いでしょうか?
677デフォルトの名無しさん:2008/08/31(日) 14:57:30
mutexでもデッドロックは発生する可能性がある
十分注意せよ
678デフォルトの名無しさん:2008/08/31(日) 15:17:30
スレッド使わなければ気にしなくていいんじゃね?
679デフォルトの名無しさん:2008/08/31(日) 15:44:01
>>676 速度は実測が基本。
680デフォルトの名無しさん:2008/08/31(日) 15:54:34
よく考えたら、バッファついてたら、Read優先したほうがいいですね。 
Writeは利用する側からすれば完了しているになっているので
681デフォルトの名無しさん:2008/08/31(日) 16:24:00
wavファイルから象の雄叫びを入力して
数値によってエコーの量が変わるプログラムを作りたいのですが
何から着手していいのかわかりません・・・・。

アドバイスもらえませんか?
682デフォルトの名無しさん:2008/08/31(日) 16:25:18
>>681
C/C++ の話になったらまたおいで。

サウンドプログラミング4
http://pc11.2ch.net/test/read.cgi/tech/1185340076/
683デフォルトの名無しさん:2008/08/31(日) 19:10:11
>>680
何を言いたいのかよくわからないが、一度「トランザクション」でぐぐって勉強がいいかも。
これ以上の話はスレ違いだから、続けるならどこか適当な場所で。
684デフォルトの名無しさん:2008/08/31(日) 21:40:47
BOOL isFullScreen = FALSE;
for(int i = 0; i < nCmdShow; i++) {
if(_stricmp((char*)&lpCmdLine[i], "/f") == 0) {
isFullScreen = TRUE;
break;
}
}

これの部分でif(_stricmp((char*)&lpCmdLine[i], "/f") == 0)

コマンドラインに/fがあればTRUEにするってことだと思うのですか
(char*)&lpCmdLine[i]はどういういみですか?
685デフォルトの名無しさん:2008/08/31(日) 21:43:04
(char*)(lpCmdLine+i)
686デフォルトの名無しさん:2008/08/31(日) 22:15:18
>>684
なんで質問部分の肝になるlpCmdLineの宣言をコピーしないの? つーか、取捨選択もできない馬鹿なら関数丸ごと貼りなさいよ。
687デフォルトの名無しさん:2008/08/31(日) 22:37:11
>>686 ごめんなさい

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

// フルスクリーンかどうかの判定
// コマンドラインに/fか/Fがあればフルスクリーンにする
BOOL isFullScreen = FALSE;
for(int i = 0; i < nCmdShow; i++) {
if(_stricmp((char*)&lpCmdLine[i], "/f") == 0) {
isFullScreen = TRUE;
break;
688デフォルトの名無しさん:2008/08/31(日) 22:42:05
__stricmp()に渡すためにLPSTRでは警告が出るから
型キャストして警告を消してるんだろう
689デフォルトの名無しさん:2008/08/31(日) 22:42:16
それなら、char*へのキャストは無駄以外の何物でもない(少なくともWin32では)。
&lpCmdLine[i]で全く問題ない。元のコード書いたやつが無知なだけだ。
690デフォルトの名無しさん:2008/08/31(日) 22:43:41
>>688
LPSTRはchar*のtypedefだぞ。
691デフォルトの名無しさん:2008/08/31(日) 22:49:28
というかこれだと
fで始まるオプションは"/f"しか使えないけどいいんだろうか
692デフォルトの名無しさん:2008/08/31(日) 22:50:29
ごめん大丈夫だった
寝るか
693デフォルトの名無しさん:2008/09/01(月) 02:01:38
コマンドラインの単純なプログラムで、Windowsのバーに表示させない方法ありますか?
常駐みたいな感じです。
694デフォルトの名無しさん:2008/09/01(月) 04:49:58
APIを使えばできます。
695デフォルトの名無しさん:2008/09/01(月) 09:51:21
int han[2]={0,0};

int hant(int f, int s)
{

if(f==1 && han[0]/100<=0) return han[0]+100;
else if(f==2 && han[0]/10%10<=0) return han[0]+10;
else if(f==3 && han[0]%10<=0) return han[0]+1;

if(s==1 && han[1]/100<=0) return han[1]+100;
else if(s==2 && han[1]/10%10<=0) return han[1]+10;
else if(s==3 && han[1]%10<=0) return han[1]+1;

}

数字1〜3を受け取り一回でも現れたら
1=100 2=10 3=1 の桁に1を入れて3桁の数字を返したいですが
何度やっても、0しか返してくれません。
何度読み直しても何処がいけないのか分かりません・・・
ヘルプお願いします。
696デフォルトの名無しさん:2008/09/01(月) 10:24:02
>>695
どれにも一致しなかったら何を返すんだい?
697デフォルトの名無しさん:2008/09/01(月) 10:28:36
>>695
han[ ]が初期化されている1回目はちゃんと動くはず
いったん値が保存されると2回目からは値を返さないよ
関数の最後にreturn han[0];とかいらないのか
698デフォルトの名無しさん:2008/09/01(月) 10:28:53
int v;


一応ちゃんと帰って
699デフォルトの名無しさん:2008/09/01(月) 10:31:33
698はミスったごめん
int v;
v = hant(0, 3);
みたいにするとhantの戻り値でちゃんと返ってきてるみたいだよ

0になるってもしかして
printf("%d, %d\n", han[0], han[1]);
みたいにhan[0]を表示しようとしていない?
700デフォルトの名無しさん:2008/09/01(月) 10:34:48
>>695
一応受け取る数字は1〜3以外はブロックしてます。

あと、この問題自己解決しました。

どうやらHant()が丸ごと動かなかったようで
Han[]のグローバル宣言をやめMain()内で宣言、Hant()もMain()に組み込むことで
何とか動いてます。
701デフォルトの名無しさん:2008/09/01(月) 10:45:35
>>700
元のままで、
int hant(……
 →
void hant(……

return han[0]+100;
 →
han[0]+=100;
他も同様

と変える。
702デフォルトの名無しさん:2008/09/01(月) 11:16:50
色々なアドバイス有難う御座います。
いま、プログラム自体は何とか動いてますが
Main()が無駄に膨らんできたのでげんなりしてます。

これからもお世話になると思うので、今まで書いたソースをUPしときます
一から自分で書くのは今回初めてなので悪い所があったらご指摘お願いします。

http://www.dotup.org/uploda/www.dotup.org2141.cpp

プログラムはマルバツゲーム、大体の動きが出来上がったので
次はAIを詰め込む予定です。
勝利判定がまた不十分な点は暫くスルーすることにしました。
703デフォルトの名無しさん:2008/09/01(月) 11:31:01
指摘項目
>void main()
基本的には間違い。

> char fil[5][5]={"0123","1","2","3"};
無駄。表示用文字管理とデータ管理は分けたほうがいい。
その所為で、入力処理の辺りがぐだぐだになっている。
つーか、肝心なまるとばつを置く場所が初期化されてないぞ。

> if(flag==0) cout <<" MARU \n";
> else if(flag==1) cout <<" BATU \n";
慣れないうちはブロック化推奨。

> //勝利判定の時間



> cout <<han[flag][0]<<" !!!!!!!!!!!!!! "<<han[flag][1]<<"\n"; //判定フィールド確認用
何この変なインデントと無駄な空行。
つーか、判定方法考えすぎで滅茶苦茶になってないか?
なんでわざわざ数値化しているんだ?
仮に、filがちゃんと管理されていればhanの配列なんていらんだろ。
例えば、fil[1][1] == 'O' && fil[1][2] == 'O' && fil[1][3] == 'O'みたいな愚直な判定で十分。
704デフォルトの名無しさん:2008/09/01(月) 12:37:21
>>703

main()の宣言について、少し調べてみます。


>> char fil[5][5]={"0123","1","2","3"};
>無駄。表示用文字管理とデータ管理は分けたほうがいい。
>その所為で、入力処理の辺りがぐだぐだになっている。
>つーか、肝心なまるとばつを置く場所が初期化されてないぞ

データ部分だけくりぬくってのはやりたいのですが
出力方法は配列しか思い浮かびませんでした。
初期化については、文字を一度クリアして同じ所に描画することなら
今猫でもわかるで調べてますが、上手く行ってません

>つーか、判定方法考えすぎで滅茶苦茶になってないか?
>なんでわざわざ数値化しているんだ?

最初は力業でやろうとしましたが、物凄い量のコードになりそうだったことと
CPU対戦を詰め込むとさらに増えそうだったので、数値化してみました。
>>704
海岸でいきなり1mもあるような砂の城を作ろうとしてもw
まずは30cmくらいの砂の山で我慢しておけって。
そうすれば城を作るにはどんな技術が必要になるのか見えてくるだろ。

と、例え話はさておき。
filは初期状態ではこうなっている。
0 1 2 3 \0
1 \0 \0 \0 \0
2 \0 \0 \0 \0
3 \0 \0 \0 \0
\0 \0 \0 \0 \0
一方、表示ルーチンではその内容を文字列としてではなく文字として出力している。
つまり、\0を出力しようとしているわけで、そこは明らかにおかしい。
更に言えば、文字単位でしか出力しないのなら、文字列として扱う必要もないということ。
また、表示用の0123なんて文字も、データとしては全く必要ない。
そこで私がこのレベルで書くなら、char fil[3][3]; for (int iy = 0; iy < 3; ++iy) for (int ix = 0; ix < 3; ++ix) fil[iy][ix] = ' ';とする。
# まぁ、定数の3は生では使わないが。
表示ルーチンも、最初から独立して考えればいい。
例えばこんな感じ。
void print(char const field[][3])
{
cout << "0123\n";
for (int iy = 0; iy < 3; ++iy) {
cout << iy + 1;
for (int ix = 0; ix < 3; ++ix) {
cout << field[iy][ix];
}
cout << '\n';
}
}
これなら、最初の表示にもループ中の表示にもそのまま使える。
706デフォルトの名無しさん:2008/09/01(月) 13:58:00
今のうちに見た目スッキリなソースを目指すよう、心掛けるんだ
707デフォルトの名無しさん:2008/09/01(月) 18:40:31
class A
{
public:
virtual void method(){..}
};

class B : public A
{
public:
void method();
};

こういう継承関係があって
vector<A> list;
B b;
list.push_back(b);
list[0].method();
こうやるとBのメソッドが呼ばれず直接Aに行くのだけど
Bに行かせるにはどうすればいいの?
708デフォルトの名無しさん:2008/09/01(月) 18:44:32
vector<A*> list;
B *b = new B();
list.push_back(b);
list[0]->method();

※deleteし忘れ注意
709デフォルトの名無しさん:2008/09/01(月) 18:52:54
それは
((B*)list[0])->method();
じゃなくて?
スマートじゃないな
710デフォルトの名無しさん:2008/09/01(月) 19:05:44
>>707 がうまくいかないのは、vector が内部に持ってるのは
push_back に渡された b を元にコピーコンストラクトした A で、
その A の method を呼んでるだけだから

vector に持たせるのがポインタだけなら
ポインタ自体をいくらコピーされても実体は B のままだから呼べる
でも解放し忘れやすいので vector<shared_ptr<A> > を使うべきという人もいる
711デフォルトの名無しさん:2008/09/01(月) 19:06:17
質問します。
ttp://homepage3.nifty.com/mmgames/c_guide/index.htmlを大体見たんですけどC++はまだ早いですか
それともほかに見たほうがいいサイトがあるのでしょうか。
教えてください。
712デフォルトの名無しさん:2008/09/01(月) 19:08:54
>>707
スライシングと言って、listに格納されたときにはBではなくAのオブジェクトになっている。
だもんで、一般的に継承を使うクラスではコピー禁止にすることが多い。

>>709
それじゃなんのための仮想関数ってことになるじゃないか。
713デフォルトの名無しさん:2008/09/01(月) 19:09:47
>>711
見ただけ?
得た知識を元に実際に何か役に立ちそうなプログラムを一度自分で作ってみるべき
714711:2008/09/01(月) 19:11:56
>>713
オセロは人対人のものは作りました。
それではまだだめでしょうか。
715デフォルトの名無しさん:2008/09/01(月) 19:14:57
>>714
自分がやりたいと思うことをやればいいじゃない。
716707:2008/09/01(月) 19:37:55
出来たんだけどもう1つ教えてください

B *b = new B();
list.push_back(b);
だといけるけど

void add(A *a){
list.push_back(a);
}
B *b = new B();
add(b);
list[0]->method();
ってあるとやっぱりAに行く
追加はメンバ関数で隠蔽したいんだけどこれはどうしたらいいの?
717デフォルトの名無しさん:2008/09/01(月) 19:49:03
#include <stdio.h>
#include <vector>
class A { public: virtual void method(){ printf("A::method\n"); }};
class B : public A { public: virtual void method(){ printf("B::method\n"); }};
class Foo {
std::vector<A*> list;
public:
void add(A *a){ list.push_back(a); }
void foo(){
B *b = new B();
add(b);
list[0]->method();
}
};
int main() { Foo().foo(); }

実行結果
B::method

>>716
そんなことにはならないが・・・
718デフォルトの名無しさん:2008/09/01(月) 19:52:50
ほんとつかえねーやつらだな
719デフォルトの名無しさん:2008/09/01(月) 19:53:25
初心者歓迎スレで何を
720デフォルトの名無しさん:2008/09/01(月) 19:54:49
>>711
ほかになんかC関係のサイト一つ眺めてみてスッと読めるようなら、
知識としてのCはいいんじゃない?
さっさとC++覚えて、いろんなもの作ってみればいいよ
721707:2008/09/01(月) 19:59:27
あれほんとだ
なんでだろ
722711:2008/09/01(月) 20:02:40
723デフォルトの名無しさん:2008/09/01(月) 22:02:21
デザインパターンのObserverパターン実装サンプルコードで、

//observerの抽象クラス
class Observer
{
protected: virtual ~Observer() = 0 { };
public: virtual void update() = 0;
};

//observerの具象クラスが共通に持つインターフェースのクラス
class DisplayElement
{
protected: virtual ~DisplayElement() = 0 { };
public: virtual void display() const = 0;
};

//observerの具象クラス(の1つ)
class ConcreteObserver : private Observer, private DisplayElement { ... };

こういったものがあります。
(subject側のクラスは、protectedなデストラクタを持つ抽象クラスを、public継承した具象クラスという形でした。)
・基底クラスのデストラクタがprotectedである理由
・具象クラスがprivate継承している理由
がよく分からないのですが、よろしければ教えていただけないでしょうか。
724デフォルトの名無しさん:2008/09/01(月) 22:25:35
・基底クラスのデストラクタがprotectedである理由
は基底クラスのポインタでdeleteされた時に派生クラスのデストラクタが呼ばれる様にするため

・具象クラスがprivate継承している理由
ConcreteObserver以外のクラスからupdate()やdisplay()を呼ばれたくないとか
725デフォルトの名無しさん:2008/09/01(月) 22:30:57
>>722
またそんな微妙なサイトを……
726711:2008/09/01(月) 22:34:18
>>725
では具体的にどういうサイトを見ればいいですか?
727デフォルトの名無しさん:2008/09/01(月) 22:37:20
つ[ここ]

宿題スレの宿題でも解いてみたら?
728デフォルトの名無しさん:2008/09/01(月) 22:49:05
テンプレート関数で

template<template<class T, class A=std::allocator<T>>class C, class T>
void func(C<T> arg);

vector<int> v;
func(v);

このように引き数に渡されたコンテナを、コンテナ型と中身の型とに
分けて知ることができますが、

template<template<class T, class A=std::allocator<T>>class C, class T>
class separator {
//C<T>のTの型が知りたい
typedef T param_t;
}

separator<vector<int>>::param_t val; //引数の数が合わない

テンプレートクラスでテンプレート引数に渡されたコンテナを分解することが
上手くできません。どう書けばいいのでしょうか?
729デフォルトの名無しさん:2008/09/01(月) 22:56:26
これで十分だよ。
template<class C>
class separator {
typedef typename C::value_type param_t;
};
730デフォルトの名無しさん:2008/09/01(月) 23:04:09
vectorだけならそれでもいいのですが、
テンプレート型全般に適用できる方法が無いか
知りたかったんですが。
731デフォルトの名無しさん:2008/09/01(月) 23:05:41
>>724は違うと思うな。
>>・基底クラスのデストラクタがprotectedである理由
>>は基底クラスのポインタでdeleteされた時に派生クラスのデストラクタが呼ばれる様にするため
→これはデストラクタにvirtualがついている理由。
 protectedにするとObserver型のポインタに対してdeleteできなくなり、Observerクラスを以下のようにポリモーフィックに使えなくなる。

Observer* p = new ConcreteObserver;
p->update();
delete p;

・具象クラスがprivate継承している理由は、上記と同じ。private継承すると、デストラクタをpublicに変えても上記コードはコンパイルエラーになる。

Observerクラスをポリモーフィックに使われないようにこうしてると思う。
732731:2008/09/01(月) 23:09:06
>>731

>>protectedにするとObserver型のポインタに対してdeleteできなくなり、Observerクラスを以下のようにポリモーフィックに使えなくなる。
間違えた。ポリモーフィックには使える。

Observer* p = new ConcreteObserver;
p->update();
delete p; //ここでコンパイルエラー

ちなみにprotectedデストラクタはvirtualつけない方が普通(推奨)と思うけどね。
733デフォルトの名無しさん:2008/09/01(月) 23:19:35
>>730
なら部分特殊化。
template<class>
class separator;

template<template<class, class> class C, class T, class A>
class separator<C<T, A> > {
public:
typedef T param_t;
};

separator<std::vector<int> >::param_t val;
734731:2008/09/01(月) 23:21:53
分かりづらいかも知れないので補足。

Observer* p = new ConcreteObserver;//private継承によってこれを禁止
p->update();
delete p; //protectedデストラクタによってこれを禁止
735724:2008/09/01(月) 23:26:02
うひょ盛大に間違えてたぜ
736デフォルトの名無しさん:2008/09/02(火) 00:46:02
NULLポインタにアクセスすると普通フォルトしますが、

int* i = NULL;
int x = *i; // フォルト

以下のようにするとフォルトが発生しません。
どうしてなのでしょうか?

int* i = NULL;
int& Int() { return *i; } // ここでフォルトが起きるはずでは?

int main(void) {
int* x = &Int(); // xにはちゃんとNULLが入っている

return 0;
}
737723:2008/09/02(火) 00:47:57
レスありがとうございます。
検証コードを書きつつ、なるほどと納得させていただきました。

ついでに、もう少し突っ込んでお聞きしたいのですが、
>>734で書いていただいたように、new/deleteからの多態性が禁止されている事は分かったのですが、
ConcreteObserver co;
Observer* pco = &co;
pco->update();
といった形での多態性は、サンプルコードでも肝として使用されています。

作者の意図がいまいち分からないので、もし自分がObserberパターンをコーディングするとしたら、
抽象クラスの仮想デストラクタをpublicにして、それをpublic継承して具象クラスを書くと思うのですが、
それではまずい事態を招きうるのでしょうか?
738デフォルトの名無しさん:2008/09/02(火) 00:53:37
>>733
そう書けたのですか!
感謝
739デフォルトの名無しさん:2008/09/02(火) 00:57:18
>>736
空ポインタをデリファレンスしたときの動作は未定義だから。
740デフォルトの名無しさん:2008/09/02(火) 00:59:08
>>736
参照を返すとき、実際に中身にアクセスするわけではありません。
従って、ポインタのポイント先の実体の参照を返すときにもポイント先にアクセスせずに、参照を返せるのです。
741デフォルトの名無しさん:2008/09/02(火) 02:30:38
g++ で、何故か関数のプロトタイプの宣言が変数として認識されてしまいます。
例えば以下のようなファイルをコンパイルしようとすると
----hoge.h-------
#ifndef h_hoge
#define h_hoge
#include "some_class_flags.h"
void check_error(some_class_flags err);
#endif
----hoge.cpp-----
#include "hoge.h"
#include <wx/wx.h>
void check_error(some_class_flags err){
if (err!=0) wxMessageBox(wxT("ERROR"),wxT("err"),wxOK);
}
---------------
hoge.h:4: error: variable or field ‘check_error’ declared void
hoge.h:4: error: ‘some_class_flags’ was not declared in this scope
というエラーが出てきます。どこがいけないのでしょうか?
742デフォルトの名無しさん:2008/09/02(火) 02:39:05
some_class_flagsが型として認識されてないんだろ
743741:2008/09/02(火) 02:45:46
>>742
私もそうだと思ったのですが、クラス名(またはTypedef名)に打ち間違いはなく、
実際のところ some_class_flagsは広く使われているライブラリのヘッダなので、
some_class_flags.h 自体に間違いが有る可能性も低いと思います。
744デフォルトの名無しさん:2008/09/02(火) 02:49:17
>実際のところ some_class_flagsは広く使われているライブラリのヘッダなので、
>some_class_flags.h 自体に間違いが有る可能性も低いと思います。

だってコンパイラが文句言ってんだろ
一度ヘッダファイル覗いてみ
745デフォルトの名無しさん:2008/09/02(火) 02:51:25
some_class_flagsをintに置換したらどうなるの?
746741:2008/09/02(火) 02:51:32
>>742
すいません、自己解決しました。
小文字のlと数字の1の読み違いだったようです。
自分の視力にWarningを吐くべきなのでしょうか。
747デフォルトの名無しさん:2008/09/02(火) 02:54:37
(#^ω^)
748デフォルトの名無しさん:2008/09/02(火) 03:30:17
フォントを変えろw
749デフォルトの名無しさん:2008/09/02(火) 04:46:47
メンバ関数の引数に列挙型を指定して、その内容によって
オーバーロードされたうちのどれかを実行する…なんてことはできませんか?
750デフォルトの名無しさん:2008/09/02(火) 05:06:01
>>749
内容によってって、同じ型なんだからオーバーロードでは無理だろ
値によって関数を呼び分ける関数作ればいい
751デフォルトの名無しさん:2008/09/02(火) 05:16:30
>750
ありがとうございます!その方法を利用させていただきます
752デフォルトの名無しさん:2008/09/02(火) 05:18:24
テンプレートの数値特殊化でもできるよね
753デフォルトの名無しさん:2008/09/02(火) 05:24:05
>752
こういった使い方もできるのですね
ありがとうございます。
754デフォルトの名無しさん:2008/09/02(火) 05:58:47
sprintf みたいな引数の数がいくらにでも増やせる関数ってどうやって作るんですかね?
755デフォルトの名無しさん:2008/09/02(火) 06:02:40
>>754
可変引数 c でぐぐれ
756デフォルトの名無しさん:2008/09/02(火) 06:08:22
va_start
va_arg
va_end

を使って作る
757デフォルトの名無しさん:2008/09/02(火) 10:52:55
Python の yield のようなことは C++ では不可能なんでしょうか?
ジェネレータ自体は関数オブジェクトとして代用できると
思うのですが、ジェネレータを書くに当たって yield のような
仕組みがあったら便利だなぁと思っています。
758デフォルトの名無しさん:2008/09/02(火) 12:01:05
SwitchToFiberとか
759デフォルトの名無しさん:2008/09/02(火) 15:31:57
ヘッダオンリーのライブラリが最近は多いみたいですが、
自分で作る場合どこまでヘッダオンリーで我を通していいものなのでしょう?
なんらかの指針、判断材料があったりするものでしょうか?
760デフォルトの名無しさん:2008/09/02(火) 15:54:14
>>755,756
ありがとう!
うーん、どうして boost の format はそれを使わないのでしょう?
ttp://boost.cppll.jp/HEAD/libs/format/doc/choices.html
一杯宣言しないといけないんだ。みたいなことを言っていますが、
それを使えばいいのですよね?
(自分の環境では化けるんだけど皆も?本当は EUC-JP みたい)
761デフォルトの名無しさん:2008/09/02(火) 16:07:20
>>760
そこに書いてある関数呼出の手法はva_*を使うものではない。
そもそもC++ではva_*での可変個引数が論外だから取り上げられていないだけ。
762デフォルトの名無しさん:2008/09/02(火) 17:40:59
>>760
型安全のため
763デフォルトの名無しさん:2008/09/02(火) 19:07:26
>>759
コンパイル時間が気になるかどうかじゃね?
764731:2008/09/02(火) 20:07:22
>>737
>>ConcreteObserver co;
>>Observer* pco = &co;
>>pco->update();

これってできないんじゃないかな。VC9だと以下のエラーになるよ。
error C2243: '型キャスト' : 'ConcreteObserver *' から 'Observer *' の変換は存在しますが、アクセスできません。
作者の意図は確かによく分からない。

public仮想デストラクタ&public継承でも大きな問題はないと思います。
765デフォルトの名無しさん:2008/09/02(火) 21:22:45
>>759
それ用の名前空間に収められるかどうか。

つまりそのヘッダに、実装のためだけに必要な、
#include<sys/socket.h>
とか入ってて、よその名前空間やグローバルを撒き散らすなら、
.cppに移すべき。
766765:2008/09/02(火) 21:26:40
もちろん、自クラスの引数にTCHARがあるときに、
そのヘッダに#include<windows.h>があるのは良い、
実装だけでなく、インターフェイス部分で使っているため。
767765:2008/09/02(火) 21:28:19
#include<tchar.h>に訂正しとく。
768デフォルトの名無しさん:2008/09/02(火) 21:48:03
>>737
通常は public な仮想デストラクタを持つ抽象クラスを public 継承すれば
問題ない。ただ、update メソッドが Subject 以外からも呼ばれ得ることを
危険視するなら、private 継承して this を Subject に渡すことで多態する
トリックが使える。こんな感じ(脳内コンパイル)。
class PrivateObserver : private Observer {
virtual void update(Subject* sub) {
// Subject 以外からは呼んで欲しくないメソッド
}
public:
PrivateObserver(Subject* sub) {
// private 継承している内部からは Observer として振舞える!!!
sub->AddObserver(this);
}
// ...
};
疑心暗鬼で眠れないあなたに。でもそのサンプルは謎だね。
769デフォルトの名無しさん:2008/09/02(火) 23:25:45
>>762
可変長引数の仮引数は格上げされてしまうのですね。
char, short --> int
float       --> double
あれ、でもそもそも %s 用な文字列ってどう処理しているのでしょう?
'\0' まで va_arg で進めるとかなんですかね?
770デフォルトの名無しさん:2008/09/02(火) 23:27:04
>>769
ポインタ
771デフォルトの名無しさん:2008/09/02(火) 23:27:08
んにゃ、たんなるconst char *として処理される。
まぁ、ポインタはvoid *に格上げされてしまうと解釈しておけば。
772デフォルトの名無しさん:2008/09/02(火) 23:48:03
>>770-771
なるほど。じゃあ std::string str を渡そうと思ったら、
sprintf("%s", &str);
--
va_arg(ap, std::string*);
みたいな?確かに &str は嫌ですね。
773723:2008/09/02(火) 23:50:22
>>764,768さん
レスありがとうございます。

最初にお詫びしなければいけないのは、>>737で出来ると書いたコードですが、出来ませんでした。
検証中、一時的にpublic継承に書き換えた部分を戻すのを忘れててコンパイルが通った、
という初歩的なミスで、大変申し訳ないです。
実際には、>>768で書いていただいたような形で実装されており、
それを出来るだけ簡易に不要な部分を省いて、と思いつつ、
"クラス内部からの呼び出し"という条件が抜けたまま、public継承のままだったためにコンパイルが通ってしまいました。
大人しく、サンプルをいじらずにそのまま書くべきだったと、猛省しています。

ぐだぐだな質問にも関わらず、分かりやすい解説をしていただいて、すっきりしました。
今の自分には理解がいっぱいいっぱいで、public継承でもとりあえずは問題ないという事で安心しつつ、
とてもいい勉強になったと思っています。
お付き合いいただいてありがとうございました。
774デフォルトの名無しさん:2008/09/03(水) 02:58:47
>>772
マジレスすると、std::string strを渡すのはprintf("%s", str.c_str())になるからやっぱりポインタ。
775デフォルトの名無しさん:2008/09/03(水) 03:36:03
VS2005を使っています。
'型キャスト' : ポインタを 'BYTE *' から 'DWORD' へ切り詰めます。
とWarningが出るのですが、sizeofしてみると同じ4byteなのですが、
なぜ切り詰めますになるんでしょうか?
776デフォルトの名無しさん:2008/09/03(水) 03:42:40
x64とIA-64ではBYTE *の大きさが8バイトになっている。
VC++2005では、64ビットで問題のある型変換も警告を出すオプションが標準で有効になっている。
777デフォルトの名無しさん:2008/09/03(水) 03:47:02
そうそう、それでx64/IA-64では8バイト、32ビットx86では4バイトになる整数型が色々ある。
Windows APIならそういう型を使うようにいつの間にか変わっているはず。

自分で書いた部分ならまあ好きなの選べ。
size_t, ptrdiff_t, (u)intptr_t, [WL]PARAM, LRESULT (U)INT_PTR, (U)LONG_PTR, etc...
778デフォルトの名無しさん:2008/09/03(水) 03:50:13
なるほど、じゃあこの警告がでるということは64ビットOSだとまずいって事なんですね。
ULONGLONGにしてみます。ありがとうございました。
779デフォルトの名無しさん:2008/09/03(水) 03:51:30
あ、リロードせずにすみません・・・
size_tでもいいんですね。
780デフォルトの名無しさん:2008/09/03(水) 03:55:40
>>774
えーと、実用的な例として string をもちだしたけど、
なんらかの構造体のポインタを渡すときは
func("%s", &struct);
va_arg(ap, struct*);
みたいな?ということをききたかった。
こんなかんじになってしまうんですかね?→ &
781デフォルトの名無しさん:2008/09/03(水) 03:58:16
で、& がいやだったりするから、
boost::format % std::string % std::string
みたいな形で引数とろうとしたのかなぁと。
782デフォルトの名無しさん:2008/09/03(水) 03:58:21
>>778
ULONGLONGだと32ビットでも8バイトのままだからそっちで無駄になる。
783デフォルトの名無しさん:2008/09/03(水) 08:56:05
>>778
本質的にはポインタ型で受けてないのが問題だと思う。

意図的にやってるならC++のキャストとコメントで意図を明示。

C99ならポインタを入れても安全な整数型(ptr_tだっけか)を使う方法もあるが、細かい状況が分からないと何が最適解かはわからない。
784デフォルトの名無しさん:2008/09/03(水) 13:04:41
Atlas C++の使い方が詳しく載ってるサイトってありますか?
785デフォルトの名無しさん:2008/09/03(水) 14:45:00
時代は64ビットマシンに移行しつつありますが、
その場合Cで扱うintも64ビットになりますか?
786デフォルトの名無しさん:2008/09/03(水) 14:45:50
64ビットになります
787デフォルトの名無しさん:2008/09/03(水) 14:46:49
>>785
OSがWindows7になるまで当分無理です
時代を先取りしたい人はLinuxでも使いましょう
788デフォルトの名無しさん:2008/09/03(水) 14:52:48
今のところ64ビットCPU+64ビットOSでもintは32ビットのままが多い
longは64ビットになったりならなかったりしてる
ILP64 LP64 LLP64 でぐぐってみるといいかもしれない
789デフォルトの名無しさん:2008/09/03(水) 15:30:06
>>788
ポインタだけ64ビットになって、intは32ビットのままだと困るなぁ。
WindowsのComboBoxとかListBoxとかのintパラメータに
ポインター入れて使ってるのに。
790デフォルトの名無しさん:2008/09/03(水) 15:32:49
>>789
そういうのはいつの間にやら書き変わっていて大抵int型でなくなっている。
791デフォルトの名無しさん:2008/09/03(水) 17:07:36
int32 とか int64 の類を使えばいいと思うよ
792デフォルトの名無しさん:2008/09/03(水) 17:29:43
俺はdouble使う
793デフォルトの名無しさん:2008/09/03(水) 17:45:28
Win32 APIのソースファイルの拡張子は.cか.cppのどっちを普通は使いますか。
ちなみにC言語でやっています。
794デフォルトの名無しさん:2008/09/03(水) 17:48:12
なら.cでいいだろ
795デフォルトの名無しさん:2008/09/03(水) 17:52:11
拡張子で Cコンパイラ C++コンパイラ 走らせるか区別してる系だと
Cで記述するのなら .c で、C++で記述するのなら .cpp ときっちり対応づけしたほうが良い

呼び出し規約まわりで変なことになるかもしれないしね (stdcall と cdecl)
796デフォルトの名無しさん:2008/09/03(水) 18:30:48
VC++6.0を使ってC言語の課題をやっているのですがディレクトリ作成で詰まりました。
.Netflameworkを使い、_chdirでディレクトリを作ろうと考えているのですが、このプログラムはUnix上では動かないのでしょうか?
797デフォルトの名無しさん:2008/09/03(水) 18:37:09
>>796
mono使ったらできるのかもしれない
798デフォルトの名無しさん:2008/09/03(水) 18:40:52
VC++6で.NET Frameworkはおかしいだろ。
仮にそうだとしてもMonoでもWin32なネイティブコードこみのプログラムを実行できるとは思えない。

VCのディレクトリ作る関数と言えば_mkdirだけど、Unixだとmkdir。
そこらへんマクロとかでなんとかすればなんとかなる。
799764:2008/09/03(水) 19:38:58
>>773
あ、そういうことね。

768はスーパーエスパーさんだね。
768のコードは確かPrivate Interfaceパターンと呼ばれる。
800デフォルトの名無しさん:2008/09/03(水) 20:22:18
***Scene.h***
// メッシュ
LPD3DXMESH m_pMesh; // LPD3DXMeshインターフェイスへのポインタ
LPD3DXBUFFER m_pD3DXMtrlBuffer; // メッシュのマテリアル情報を格納
DWORD m_numMtrl; // 属性情報の総数
***Scene.cpp***
// デフォルトコンストラクタ
Scene::Scene()
: m_pMesh(0), m_pD3DXMtrlBuffer(0), m_numMtrl(0L);
{
}

デフォルトコンストラクタにあるm_numMtrl(0L);のLってどういう意味ですか?
801デフォルトの名無しさん:2008/09/03(水) 20:28:32
64bitOSになっても
doubleは64bit、floatは32bitのまま?
802デフォルトの名無しさん:2008/09/03(水) 20:42:10
だいたいそう思っていいと思う。
今時みんなIEEE 754準拠。
803デフォルトの名無しさん:2008/09/03(水) 20:53:34
サンクス
804デフォルトの名無しさん:2008/09/03(水) 20:54:52
>>800
long
805デフォルトの名無しさん:2008/09/04(木) 21:30:41
GNUのリンカ(ld)に関する質問です。

class A
{
public:
 func_a();
 func_b(); // 外部のライブラリが必要な関数
}

このようなクラスがあり、とあるプログラムでA::func_a()のみを使いたいのですが、
このような場合でもfunc_b()が必要としているライブラリをリンクする必要があるのでしょうか?
(ちなみにfunc_a()はfunc_b()に依存していません。また両関数ともstaticではありません。)

とくにオプションをつけなければ undefined reference to (外部ライブラリの関数) というエラーが
出てリンクできないのですが、不必要な関数をリンクから外すオプションがあれば教えてください。
806デフォルトの名無しさん:2008/09/04(木) 21:51:48
>>805
不要なコードを削除するオプションがあったかどうかは覚えてないんだ
けど、A::func_a()の実装とA::func_b()の実装を別のオブジェクトファ
イルにして、ライブラリに突っ込んでおけばいと思う。

807デフォルトの名無しさん:2008/09/04(木) 21:54:58
DLLを、LIBに変換してDLLを不要に出来ますか?
808デフォルトの名無しさん:2008/09/04(木) 22:09:03
たぶんWindowsだろうが環境を書けよ
809デフォルトの名無しさん:2008/09/04(木) 22:36:04
>>807
DLLをLIBに変換しても、不要にはならないと思いますが?
810デフォルトの名無しさん:2008/09/04(木) 22:37:03
中身のあるLIBにできるかです。 WindowsXPです。
811デフォルトの名無しさん:2008/09/04(木) 22:37:58
C++とvisualC++は何が違うんですか?
812デフォルトの名無しさん:2008/09/04(木) 22:38:02
そのDLLのソースを持ってるならLIBに作り直しましょう
持ってないなら犯罪なのでやめましょう
813デフォルトの名無しさん:2008/09/04(木) 22:44:30
Windowsでlibつうと普通インポートライブラリのはなしになってしまうな
814デフォルトの名無しさん:2008/09/04(木) 23:41:11
>>805
たぶん、だけど

一般的に、メンバ関数と普通の(Cの)関数との違いは、
単に暗黙の引数thisを持つ事と、名前をマングリングしている事だけ。
で、libのラベルに関係するのは後者だけど
これは普通のCの関数と同様、objさえ別であれば使わないものはリンクしないようにできるはず。

ただし。
仮想関数は、vtblに載せる必要上、普通は全部リンクされるはず。
(もしかしたら賢いコンパイラ/リンカもあるかもしれないけど)
「vtblの何番目のエントリは呼び出されてない」なんて情報、
普通はobjに含まれることはないだろうから。
815デフォルトの名無しさん:2008/09/04(木) 23:50:17
>>811
C++ → 言語の名前
Visual C++ → MSが開発・販売している開発ソフトの名前
816デフォルトの名無しさん:2008/09/05(金) 00:40:20
与えられた任意の整数の階乗を求めるプログラムを書いたのですが、筆算のやり方で素直に乗算を計算しているため、
13500! を求めるのに48秒ほどかかってしまいます。
どうすれば、乗算の結果を素早く得られるのでしょうか?
どなたか教えて下さい。よろしくお願いします。
817デフォルトの名無しさん:2008/09/05(金) 00:41:27
スターリンの公式使っても近似値しか出んよ
818デフォルトの名無しさん:2008/09/05(金) 00:47:31
すみませんが
http://namidame.2ch.net/test/read.cgi/slotj/1216400588/
のスレで確率についてバトルしています

問題はサイコロで1が8回連続して出る確率です
バカが多すぎて疲れました
頭の良い皆様、論破してください
お願いします
819デフォルトの名無しさん:2008/09/05(金) 00:50:08
>>818
コピペうざい
820デフォルトの名無しさん:2008/09/05(金) 01:18:07
>>816
適当に作った同一ソースにて
C3 600MHz で 38秒
Core2Duo 2.66GHz で 2秒

環境が分からないとなんともいえない
821デフォルトの名無しさん:2008/09/05(金) 01:44:47
scheme(gauche)で書いてもathlon64 3000+で2秒かからんかった
822デフォルトの名無しさん:2008/09/05(金) 01:50:45
Acrobat9.0 ProfessionalのプラグインをAcrobat9.0 SDK + VS2005 Pro + Acro9PIWiz
(Acro9PIWiz:Acrobat9向けプラグインのプロジェクトテンプレート作成ツール。Acrobat9.0 SDKの中に入っている)
という環境で作成しています。

Acro9PIWizはデバッグ構成のテンプレートを作成するのですが、VisualStudioでリリース構成に
変更しビルドするとプラグイン自体は生成されても、Acrobat上で動作しません。
リリース構成でビルド、動作させるために必要な設定項目等をご存知でしたら教えてください。
823デフォルトの名無しさん:2008/09/05(金) 02:44:06
a.hに記述されているクラスAは、メンバ変数としてb.hのクラスBのインスタンスを持っています。
この状態で、B内でもA型のインスタンスを保持しておきたいとしたら、どうすれば良いのでしょうか?
a.hはすでにb.hをインクルードしてしまっていますので、b.hはa.hをインクルードできず、
そのままではB側で、Aは定義されていない識別子とされてしまいます。
824デフォルトの名無しさん:2008/09/05(金) 03:09:14
class Y;
こういうのを前に書いとけばよかろう
たぶん
825デフォルトの名無しさん:2008/09/05(金) 03:14:57
>824
関数のプロトタイプ宣言と同じことができるわけですね!
ありがとうございます
826デフォルトの名無しさん:2008/09/05(金) 03:16:21
>>816
それって何桁求めているの?
つーか、多倍長演算は自作? それとも既存ライブラリ?
long double精度程度でいいならc99で標準になったtgamma()で求められるけど。
827デフォルトの名無しさん:2008/09/05(金) 08:27:52
自作クラスを使ってるんだけど、13500!(49899桁)を求めるのに48秒もかかるっておかしいですね。
ちなみに、基数は10です。
プログラミング初心者なので、色々と無駄なコードが入ってるのは確かだと思うけど、
それにしても遅いですね・・・
828デフォルトの名無しさん:2008/09/05(金) 08:35:46
これつかえよ

http://www.cs.nyu.edu/exact/core/gmp/
http://d.hatena.ne.jp/verus/20080428/1209325536

あとここみる

著作権フリーのC++高速汎用多倍長演算を作るスレ
http://pc11.2ch.net/test/read.cgi/tech/1195865631/
829デフォルトの名無しさん:2008/09/05(金) 09:24:32
初心者の質問です。
関数がint型を参照で返したとき、++演算出来ますか?
830デフォルトの名無しさん:2008/09/05(金) 09:25:09
#include <stdio.h>
#include <gmp.h>

int main(int argc, char *argv[])
{
mpz_t n;
mpz_init_set_ui(n , 0);
mpz_fac_ui(n, 13500);
mpz_out_str(stdout, 10, n);
return 0;
}
そのものズバリですね
あと速すぎです、多分一生頑張ってもこの速度には追い付けないわ
831デフォルトの名無しさん:2008/09/05(金) 09:27:54
自己解決しました

#include <stdio.h>


int &f(int &n){ n=n+10; return n; }

main(){
int n=1;
f(n)++;
printf("%d\n",n);
}
832デフォルトの名無しさん:2008/09/05(金) 09:42:28
一つのクラスが何メモリ使っているか調べる方法ありませんか?
833デフォルトの名無しさん:2008/09/05(金) 09:51:26
ありません
834デフォルトの名無しさん:2008/09/05(金) 10:07:28
まぁまてw

>>832
一つのインスタンス分のサイズ?
それとも実行時の該当クラスの全インスタンス分のサイズ?
835デフォルトの名無しさん:2008/09/05(金) 10:16:56
クラスとして定義された変数のサイズです おねがいします
836デフォルトの名無しさん:2008/09/05(金) 10:17:36
コンストラクタ、デストラクタで 静的変数相手に±sizeof(*this)すれば良くね?
あ、継承されると話がややこしくなるか。
837デフォルトの名無しさん:2008/09/05(金) 10:22:12
ポインタで繋ぐ多分木とかのクラスも求まりますか?
838デフォルトの名無しさん:2008/09/05(金) 10:23:17
>>837
求まるように作ればね
839デフォルトの名無しさん:2008/09/05(金) 10:24:37
>>835
sizeof(クラス名)
840デフォルトの名無しさん:2008/09/05(金) 10:47:04
mapのメモリの開放方法教えて下さい。 swapで出来ないです。

main(){
int n,m;
map<unsigned int, unsigned int> q;
for(m=0;m<1000000;m++)q[m]=0;
cout<<"input key...\n";getchar();
q.swap(map<unsigned int, unsigned int>());
getchar(); return 0;}
841デフォルトの名無しさん:2008/09/05(金) 10:51:07
>>840
clear() じゃダメなのか?

swap() が使いたいなら
map<unsigned int, unsigned int>().swap(q)
じゃね?
842デフォルトの名無しさん:2008/09/05(金) 10:55:21

すべて解放してません。

clear() 
map<unsigned int, unsigned int>().swap(q)
q.swap(map<unsigned int, unsigned int>())
843デフォルトの名無しさん:2008/09/05(金) 10:58:52
解放してるかどうかどうやって調べてるの?
844デフォルトの名無しさん:2008/09/05(金) 11:00:26
タスクマネージャで、プログラム実行中と終了後を比べます。 25Mほどかわります。
845デフォルトの名無しさん:2008/09/05(金) 11:02:15
あーそりゃいけないな
プロセスがシステムにメモリをいつ返すかは最小ブロック単位があって
あまり小さいのは返さないよ

システムからメモリ持ってきたり取ってきたりするのは大きなオーバー
ヘッドがかかるから
846デフォルトの名無しさん:2008/09/05(金) 11:04:22
それよりも他のmapかvectorか何でもいいけどサイズを肥大させて
std::bad_allocを投げるまでの余裕を比較した方がいいよ
847デフォルトの名無しさん:2008/09/05(金) 11:34:14
実際にメモリが解放出来るやり方おしえてください
848デフォルトの名無しさん:2008/09/05(金) 11:36:06
C/C++からやってるならヒープ領域は触らぬ神に祟り無しだ
849デフォルトの名無しさん:2008/09/05(金) 11:45:05
横レスですが、ヒープ領域には触れないのが主流なやり方なんですか?
850デフォルトの名無しさん:2008/09/05(金) 11:47:30
>>849
流れ嫁よ
851デフォルトの名無しさん:2008/09/05(金) 11:49:27
>>847
mallocやデフォルトのnewを使わずに、
環境依存のシステムコールで、直接メモリを確保・開放すれば良い。
windowsならHeapAlloc。
852デフォルトの名無しさん:2008/09/05(金) 11:53:01
>>851
HeapAllocは>>845の処理を代行してくれるAPIだから、
直接GlobalAlloc使わないと
853デフォルトの名無しさん:2008/09/05(金) 11:55:41
>>851
VCのmalloc/newはHeapAllocに丸投げしてる

>>852
VirtualAllocをお使いください
854デフォルトの名無しさん:2008/09/05(金) 12:10:35
>>853
見てきた。
前はmalloc内でノード管理してた気がするけど、
今ほんと丸投げなんだな。

NTカーネルなら確かにOS任せで十分か。
855デフォルトの名無しさん:2008/09/05(金) 12:12:56
mapの機能が使いたい場合はどうすれば良いですか?
856デフォルトの名無しさん:2008/09/05(金) 12:16:01
話題がWin32のアセンブラの領域に入って来てるのか。
これ以上はWin32スレに行った方がいいと思うよ。

だいたいOSが平衡二分木なんて高級な機能を提供
しているのは見た事がない。
857デフォルトの名無しさん:2008/09/05(金) 12:17:23
Win32のアセンブラって何?
858デフォルトの名無しさん:2008/09/05(金) 12:18:39
>>857
それは既に挙げ足取りの領域
859デフォルトの名無しさん:2008/09/05(金) 12:19:03
アセンブラは取り消しだ
C/C++からWin32を扱うと読み替えてくれ
860デフォルトの名無しさん:2008/09/05(金) 12:20:08
Win32API質問箱 Build69
http://pc11.2ch.net/test/read.cgi/tech/1217687038/

ここ行って聞け。叩かれるのを覚悟でな。
861デフォルトの名無しさん:2008/09/05(金) 12:20:35
APIの実装なんて話してるスレはあるのか?
862デフォルトの名無しさん:2008/09/05(金) 12:21:46
ここ行っても何も
もう話終わってるけどなw
863デフォルトの名無しさん:2008/09/05(金) 12:24:00
>851-854
ありがとうございます
newを使う意味は薄いのですね
864デフォルトの名無しさん:2008/09/05(金) 12:24:39
しかしC/C++のランタイムシステムが管理しているヒープ領域に
直接VirtualAllocを適用すると、どう考えてもピープ領域が
破壊されて辻褄が合わなくなってエラー吐くだけだと思うが。

それでもどうしてもやりたいのならお好きなようにとしか言えない。
865デフォルトの名無しさん:2008/09/05(金) 12:30:08
>>860
そこはAPIの仕様、使い方のスレだろ
mallocやカーネルのメモリマネージャの実装の話とは別
>>851もwinを例に出しただけだしな

>>863
ちょっと待て、逆だ
866デフォルトの名無しさん:2008/09/05(金) 12:34:17
WindowXPだと良いSTLのアロケータありますか?
867デフォルトの名無しさん:2008/09/05(金) 12:35:54
boost::pool

実測してみたけどあまり大差ないけどな
868デフォルトの名無しさん:2008/09/05(金) 12:40:58
>>844
何の数字見てるの?「かわる」って増えるの?減るの?

プログラム実行中に 25M 使ってた分がプログラム終了後に返ってくるってことなら、
あたりまえな感じなんだけど。

プログラム終了後の数値をどうこうしたいなら、 malloc だろうが HeapAlloc だろうが
VirtualAlloc だろうが、どうにもならないよ。
869デフォルトの名無しさん:2008/09/05(金) 12:43:09
>>865
>>853は多分、GlobalAlloc/GlobalLockが既に古いAPIで
VirtualAlloc/VirtualLockに
置き換えられたってことを言ってるだけで、
HeapAllocの代わりにって意味じゃないと思うぞ。
870869:2008/09/05(金) 12:47:12
アンカミスった。
× >>865
○ >>864
871デフォルトの名無しさん:2008/09/05(金) 12:47:54
はじめまして
C++を仕事で使ってる人に質問なんですが マイクロソフトで無料でインストールできるコンパイラあるじゃないですか?
名前なんだったかな?
ビジュアルベーシックみたいな名前ですが 仕事でもあーゆー類いの物をつかうんですか?
872デフォルトの名無しさん:2008/09/05(金) 12:57:33
使う

VS Expressは商用利用可なので
873デフォルトの名無しさん:2008/09/05(金) 13:04:01
>>871
そうだよ。
他にも色々ツール買うと年間云十万するけど
874デフォルトの名無しさん:2008/09/05(金) 13:07:00
MSはOSを売るための宣伝みたいにして無償で提供するんでしょ。ただでもOSの利用者がふえれば元が取れる。
でもMS以外の会社だと無償はきびしいだろうとおもう。
875デフォルトの名無しさん:2008/09/05(金) 13:12:08
そーなんですか!
みなさんご丁寧にありがとうございます

perlとphpを少しだけやるんですが テキストエディタに書いていくじゃないですか?
あーゆーのイメージしてたので
みなさん どれぐらいのメモリのパソコン使ってらっしゃるんですか?
876デフォルトの名無しさん:2008/09/05(金) 13:19:14
2G
877デフォルトの名無しさん:2008/09/05(金) 13:23:38
Visual C++ はテキストエディタに書いていくイメージそのままだよ
Visual BASIC と同じだと思ったら大間違い
メモリは1G、でも最近不足ぎみ
4G欲しいと思ってる
878デフォルトの名無しさん:2008/09/05(金) 13:25:49
最近のVC++はC#みたいな機能がついてるぞ
879デフォルトの名無しさん:2008/09/05(金) 13:26:36
NETの機能をGUIで貼り付けるやつ
880デフォルトの名無しさん:2008/09/05(金) 13:42:48
中国語や韓国語やフランス語にも、EUC,JIS,SJIS,UTFのよなコード体系が複数ありますか?
あと世界標準のコードに変換するメジャーなライブラリはありますか?
881デフォルトの名無しさん:2008/09/05(金) 13:47:34
PHPとCは似てると思うよ
同じような関数もいっぱいあるし
基本的にエディタで書いていくのは同じだね
コンパイラで実行ファイル作成という処理が追加されるだけ

フォームアプリだと確かにVisualって感じはするな
882デフォルトの名無しさん:2008/09/05(金) 13:53:06
>>880
iconv
883デフォルトの名無しさん:2008/09/05(金) 13:54:32
>>880
少なくとも現地で従来用いられてきたものが少なくとも1つ、
それに加えUTF系が加わると言えば、どこも複数だな。

文字コード変換のライブラリは決定打がない気がするけど、
ICUが1番、Posixのiconv、IEのIMultiLanguage (mlang)が結構なんでもいける感じ。
884デフォルトの名無しさん:2008/09/05(金) 13:56:41
クアドコアのCPU使ってるんですが、コアの1つが100%になります。
どうやったら4つのコアとも使ってプログラムを実行できるんですか?
885デフォルトの名無しさん:2008/09/05(金) 13:58:44
MinGW developer オヌヌメ
VC++6.0の模倣品


今となってはこれ選ぶ意義は皆無ですか、そうですか(´・ω・`)
886デフォルトの名無しさん:2008/09/05(金) 13:59:57
>>884
そのプログラムを4つ同時に動かす。
887デフォルトの名無しさん:2008/09/05(金) 14:05:20
>>884
マルチスレッド
本気で4コア生かすのは素人にゃ無理
888デフォルトの名無しさん:2008/09/05(金) 14:05:30
>>882 >>883
とても参考になりましたトンクス 
889デフォルトの名無しさん:2008/09/05(金) 14:06:29
>>884
intel c++コンパイラで良いのでは
890デフォルトの名無しさん:2008/09/05(金) 14:21:18
>>887
やっぱり無理ですか・・・

>>884
今使ってます。
ちょっと調べてコード書き直してみます。
891デフォルトの名無しさん:2008/09/05(金) 15:27:49
すみません。文字コードを自動判別できるソフトはマイクロソフトのIMultiLanguageしかないんですか?
主要な世界各国言語の場合です。 それとも各種判定ルーチンを組み合わせたライブラリなんかありますか?
892デフォルトの名無しさん:2008/09/05(金) 15:31:34
世界各国言語をその現地の人に提出してもらって、ベイズ理論で特徴を求めておけば簡単に作れそうな気はします。無いですか?
893デフォルトの名無しさん:2008/09/05(金) 15:46:42
こんなのみつけました。

Universal Encoding Detector は Mozillaのコードが移植された、文字コードを判定するライブラリです。
http://www.python.jp/Zope/PyLog//1143645503/index_html

universalchardet / juniversalchardet
Mozillaのエンコーディング判別ライブラリであるuniversalchardetを切り出して、Cライブラリ化してみた。
http://www.void.in/wiki/Universalchardet
894デフォルトの名無しさん:2008/09/05(金) 16:08:02
C++でDLLを作っているのですが、
DLLからVCを立ち上げ、コンパイルして実行をやろうとしています。
コンパイルして実行まではできました。
ですが、実行が終わった時のイベントを取得することができません。
でWaitForBuild()メソッドを使って取得を行おうとすると、
何故か取得をすることができません。
WaitForBuild以外にも実行終了のイベントを受け取る方法はあるのでしょうか?
教えてください。

環境は Visual Studio 2005 Standardです。
895894:2008/09/05(金) 16:13:58
すいません。間違えました。
コンパイル終了のイベントが取得できていません。
の間違いでした。
896デフォルトの名無しさん:2008/09/05(金) 16:39:12
>823です。
お答えいただいてから、試行錯誤してみたのですが、
class B; と先行宣言してAで保持すると、AがBの構造を把握できないため、
B内のメンバ関数にアクセスできませんでした。これを、相互にメソッドを呼び出したいとすると、
一方のヘッダファイルなりソースファイルに関数定義の記述を移動するしかないのでしょうか?
できれば、異なるクラスのメンバ関数は分けて記述したいのですが…
897デフォルトの名無しさん:2008/09/05(金) 16:51:21
898デフォルトの名無しさん:2008/09/05(金) 16:53:28
> (注:すべての方が1週間でマスターできることを保証するものではありません)
899デフォルトの名無しさん:2008/09/05(金) 16:53:39
>>897
そんなもん個人差だ
くだらん質問すんなアホ
900デフォルトの名無しさん:2008/09/05(金) 17:03:47
a.hとa.cみたいに宣言と定義分けたら?
901デフォルトの名無しさん:2008/09/05(金) 17:05:04
>>897
Cでさくさくプログラムできる人が対象
902デフォルトの名無しさん:2008/09/05(金) 17:14:24
a.h: class A{ class B*b;void foo();}
b.h: class B{ class A*a;void foo();}
a.cpp#include <a.h> <b.h> void A::foo(){ b->foo(); };
b.cpp#include <a.h> <b.h> void B::foo(){ a->foo(); };
みたいな話。
903デフォルトの名無しさん:2008/09/05(金) 17:39:00
縦固定、横可変2次元配列の作り方教えて下さい。
ここまで出来たんですけど・・・p[0]などに配列を追加するのがわかりません。
vector<vector<int>*> p(N,NULL);

Nは十分に大きく、使わない番号も多くあり、vector<vector<int>>にするとメモリを圧迫してしまいます。
904デフォルトの名無しさん:2008/09/05(金) 17:41:01
C言語の入門書を買ったばかりの初心者です。(OSはVista)

足し算をするだけのプログラムを作って、試しに実行してみようかと思っていますが、PC上で実行するにはどうしたらいいでしょうか?

いくつかのフリーコンパイラを調べてみたのですが、以下の理由でできませんでした。

LSIC-86試食版(配布中止になっていた)
C++ Compiler 5.5/Turbo Debugger(ダウンロードできなかった)
lcc-win32(使用方法が分からなかった)

どなたかお願いします
905デフォルトの名無しさん:2008/09/05(金) 17:41:49
vector< vector<int> > p(N); では初期に550M使います。
vector< vector<int>*> p(N); は55Mくらいですみます。
906デフォルトの名無しさん:2008/09/05(金) 17:45:32
>>904
フリーでもまだまだある。Visual C++ 2008 ExpressとかCygwinとかMinGWとか。
907デフォルトの名無しさん:2008/09/05(金) 17:49:19
これだと最後の行でエラー出ます。どうしたらいいでしょうか?

typedef vector<int> vec;
vector<vec*> p(N);
p[0] = new vec;
p[0]->resize(10,3);
cout<<p[0][9]<<endl;
908デフォルトの名無しさん:2008/09/05(金) 17:50:51
自己解決しました。 cout<<(*p[0])[9]<<endl; でした。
909904:2008/09/05(金) 18:34:02
>>906
Gygwinをダウンロードしてみます。ありがとうございました!
910デフォルトの名無しさん:2008/09/05(金) 18:37:26
>>909
初心者ならCygwinはやめとけ……
Visual C++ ExpressかDegital Marsを薦める
911デフォルトの名無しさん:2008/09/05(金) 18:47:44
>>909
ギグウィンなんてねぇよw
>>910の言う通りVC++Expressにしておいた方が良い
912904:2008/09/05(金) 19:36:36
>>910-911

まさに暗礁に乗り上げていたところです…
了解しました、そちらで試してみます
913デフォルトの名無しさん:2008/09/05(金) 21:28:42
例外のクラスの中で
std::stringとかstd::vector使ってもいいですか?
914デフォルトの名無しさん:2008/09/05(金) 21:37:20
違法
915デフォルトの名無しさん:2008/09/05(金) 21:50:45
<stdexcept>否定する気ですか
runtime_errorとかみんなコンストラクタでstring引数に取っていますよ。
916デフォルトの名無しさん:2008/09/05(金) 22:00:05
例外が無限ループするとかなんとか
917デフォルトの名無しさん:2008/09/05(金) 22:06:02
// 4つの頂点からなら頂点バッファを作る
if(FAILED(pD3DDevice->CreateVertexBuffer(4*sizeof(MY_VERTEX),
D3DUSAGE_WRITEONLY,
MY_VERTEX,
D3DPOOL_MANAGED,
&m_pVB, NULL))) {
return E_FAIL;
}

\001\scene.cpp(45) : error C2275: 'Scene::MY_VERTEX' : この型は演算子として使用できません
エラーがでます どうすればいいでしょうか。。。
918デフォルトの名無しさん:2008/09/05(金) 22:07:32
DarkGDKにする
919デフォルトの名無しさん:2008/09/05(金) 22:07:35
吊るしかないんじゃね?
920デフォルトの名無しさん:2008/09/05(金) 22:09:10
すいません解決しました
第三引数にFVFを設定していませんでした
921デフォルトの名無しさん:2008/09/05(金) 22:15:53
>>920
トンマ ドベ アンポンタン ダボ アホ
922デフォルトの名無しさん:2008/09/05(金) 22:28:49
ここは酷いインターネットですね
923デフォルトの名無しさん:2008/09/05(金) 22:45:33
template<class T>
class HogeException : T
{
//なになに
};

こんなクラスで

テンプレート引数が何であれ、HogeExceptionなら
一箇所のcatchで受信する方法はないですか?
924デフォルトの名無しさん:2008/09/05(金) 22:47:41
catch (...) で全部ひっくるめて受け取る以外にない
925デフォルトの名無しさん:2008/09/05(金) 23:04:54
class Foo {};
template<class T>
class HogeException : T, public Foo
{
//なになに
};

catch(Foo& foo) { ... }

というので、どう
926デフォルトの名無しさん:2008/09/05(金) 23:13:29
そのそもテンプレートパラメータから派生するのは規格で認められてないんじゃなかったっけ?
927デフォルトの名無しさん:2008/09/05(金) 23:17:15
んなことねぇべ
928デフォルトの名無しさん:2008/09/05(金) 23:19:52
動くならいいんじゃないの
929デフォルトの名無しさん:2008/09/05(金) 23:33:11
>902
ありがとうございます!
単純なことだったんですね
930デフォルトの名無しさん:2008/09/05(金) 23:34:54
>900
はい。書いてるうちにグチャグチャになってしまって…
ありがとうございます
931デフォルトの名無しさん:2008/09/05(金) 23:45:18
>>>926
規格ではなく法律で禁じられています(嘘
932デフォルトの名無しさん:2008/09/05(金) 23:52:05
規格でNGならコンパイルできないのでは
933デフォルトの名無しさん:2008/09/06(土) 00:26:25
そんなことはない
934デフォルトの名無しさん:2008/09/06(土) 00:48:06
関数の引数の型にenumを指定すると、
そのenumに定義している列挙値しか指定できなくなるので、
保守しやすいかなと思ったんですが、これはどの環境でも "unsigned int?" になるんでしょうか?
935デフォルトの名無しさん:2008/09/06(土) 00:55:37
>>934
どの環境であってもならない、なぜなら
そもそもenumには負の整数も入られるから
936デフォルトの名無しさん:2008/09/06(土) 01:09:12
Cで組まれたシステムにC++で開発されたサブ機能をマージすることになったんだけど
なんかプロトタイプ宣言でエラーになります。
で、困ったことにOSがVxWORKでコンパイルエラーがシンタックスエラーw
具体的には
  short  func(CInput &in, COutput &out);
というふうに宣言されてて、どうも&が気に入らないようです。

で質問なのですが、C言語関数のプロトタイプ宣言が書かれているヘッダーファイルに
C++のプロトタイプ宣言を混在することはかのうでしょうか?
(コンパイラはC++に対応しています)
937デフォルトの名無しさん:2008/09/06(土) 01:14:46
extern "C"
938デフォルトの名無しさん:2008/09/06(土) 01:14:54
>>936
つ[extern "C"]
939デフォルトの名無しさん:2008/09/06(土) 01:16:20
extern Cで参照型も無問題になるんですかね
明日休日出勤なので試してみます;;
レスありがとう
940デフォルトの名無しさん:2008/09/06(土) 01:19:26
ならないだろ。
941デフォルトの名無しさん:2008/09/06(土) 01:19:48
無問題になるっつーか、寧ろ顕在化するなw
942デフォルトの名無しさん:2008/09/06(土) 02:32:33
あと、その関数を使う側もC++でコンパイルしないとまた&でエラーになるだろ。
x86のWindows/LinuxとかだとCでは単にポインタにすればいいけど、
VxWORKでもそれが可能かどうかは知らない。

C++でポインタを引数に取るラッパを作って、
Cではそっちだけを使うようにするってのが(規格合致という点からは)安全。
943デフォルトの名無しさん:2008/09/06(土) 03:30:19
その辺を突き詰めて考えていくといつのまにかCOMやCORBAや.NETの話に
944デフォルトの名無しさん:2008/09/06(土) 03:48:12
そのCOMでは、こんなことをやっている。
#ifdef __cplusplus
typedef IID& REFIID
#else
typedef IID* REFIID
#endif
945デフォルトの名無しさん:2008/09/06(土) 04:16:57
popen()とpclose()を使いたいんです
ググったりmanで引いたりしたところ、どちらもstdio.hにあるっぽいんですが
popen()は暗黙の宣言と言われてしまい、(ヘッダにはないけどリンクはしてるってことかな?)
pclose()は見つからず、コンパイルできません
(まぁpclose()だけ消せば動くことは動くんですが)

popen()とpclose()で読み込むべきヘッダの別パターン知りませんか?
もしくは別な勘違いをしているのでしょうか?

環境は
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --info
dir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable
-java-awt=gtk --host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 3.4.6 20060404 (Red Hat 3.4.6-3)
といった感じで
OSはCentOSです
946デフォルトの名無しさん:2008/09/06(土) 04:25:46
popen()の方は大丈夫でしたどうもすいません
947デフォルトの名無しさん:2008/09/06(土) 04:41:51
Visual C++ 2008 Express Edition
を使っています。
Cの勉強中です。

サイズが120byte有る構造体を100000個並べた配列が有ります。
stract abc{
……
};
stract abc b[100000];

これをバイナリで以下のように書き込むと、26個目までしか書き出されません(もしくは読み込まれません)。

FILE *fp;
fp=fopen("ファイル名","wb+");
fwrite(b,sizeof(abc),1,fp);
fclose(fp);

どのように対策すれば良いのでしょうか?
948デフォルトの名無しさん:2008/09/06(土) 04:44:50
すみません、sizeof(b)でした。
949デフォルトの名無しさん:2008/09/06(土) 04:45:44
fwiteがいちどにたくさんかきこめないんでしょ
一つずつか、1M程度ずつるーぷすればいいのでは
950デフォルトの名無しさん:2008/09/06(土) 04:53:04
ありがとうございます。
ループしたものを作ってみたのですが、
同じ問題が発生しました。
具体的には以下のようなプログラムです。
改善点は有りますか?

stract abc{
……
};
stract abc b[100000];

FILE *fp;
fp=fopen("ファイル名","wb+");
for(int i;i<100000;i++){
fwrite(b[i],sizeof(abc),1,fp);
}
fclose(fp);
951デフォルトの名無しさん:2008/09/06(土) 04:56:06
分割しろよwwww
952デフォルトの名無しさん:2008/09/06(土) 04:57:20
……分…割…?
953デフォルトの名無しさん:2008/09/06(土) 04:58:29
その前に誰かstractに突っ込めよ
954デフォルトの名無しさん:2008/09/06(土) 06:49:59
>>947
 最初のはたぶんfwrite()の第2引数の方の範囲を超えて整数オーバーフローでもしているか、書き込み可能最大Byteを超えているんだろう。
適度に分割したほうがいいと思うけど、ファイルアクセスは重たい処理だから、10個単位とか。
当然知って使っているとは思うけど、構造体はコンパイラによってCPUが扱いやすいように勝手に詰め物されるから(たとえば4Byteの倍数とかに)。

>>950
>>struct abc b[100000];
>>for(int i;i<100000;i++){
>>fwrite(b[i],sizeof(abc),1,fp);
>>}
for ( int i = 0; i < 100000; ++i ) {
fwrite(&b[i], sizeof(struct abc), 1, fp);
}
とか
for (int i = 0; i < 10000; i += 10 ) {
fwrite(b+i, sizeof(struct abc), 10, fp);
}
とかな
あとファイルが正常にオープンできたかちゃんとチェックしないとだめ
fwrite()の戻り値チェックとかC++でやっているみたいだからstruct abcがメンバ関数持ってたりな(読み込み時に死亡フラグがたつ)

まぁ、ネタとは思うけど
955デフォルトの名無しさん:2008/09/06(土) 08:19:33
>適度に分割したほうがいいと思うけど、ファイルアクセスは重たい処理だから、10個単位とか。
fwrite()もバッファリングされるからトータルサイズがオーバーしていなければ分割する必要が無いし、
分割する場合も10分割程度でいい。10個単位で10000回ループなんて阿呆すぎる。
956デフォルトの名無しさん:2008/09/06(土) 08:44:10
test.exe > log.txt
というコマンドラインで、ファイルではなくてメモリに出力を格納するにはどうしたらいいですか?
957デフォルトの名無しさん:2008/09/06(土) 08:44:46
>>956
パイプ
958デフォルトの名無しさん:2008/09/06(土) 08:46:59
よくわからないのでもう少しおしえてください
959デフォルトの名無しさん:2008/09/06(土) 08:48:00
ググレカスといいたいところだが、メモリに書き出してその後どうするんだ?
960デフォルトの名無しさん:2008/09/06(土) 08:51:38
出力内容に応じて処理するんです。 ファイルに書き出して読み込めばいいんですけど
かなり繰り返すため、そのロスをへらしたいです。
961デフォルトの名無しさん:2008/09/06(土) 08:53:36
マルチプロセスでググッたらいいと思うよ
962ネットより本:2008/09/06(土) 09:25:18
テラパッドにたどり着くまでに長い道のり・・・

いやあ、本によっては、ダウンロードのしかたまでくわしくのっているのだ。
導きが大切なのだ。

963デフォルトの名無しさん:2008/09/06(土) 10:05:23
その長い道のりの先にあるのが大いなる思い違いだとは……
964デフォルトの名無しさん:2008/09/06(土) 10:55:43
>>958
dir | grep txt
見たいな感じかな
965デフォルトの名無しさん:2008/09/06(土) 10:59:36
data.txtの中身が
111111
だったとして,これを
221111
と書き換えるにはどうすればいいでしょうか。
つまり,最初の2文字だけを2に書き換えて,
それ以降は最初のデータをそのまま残しておきたいのです。

FILE *fp;
char newdata[2] = {2, 2};
fp = fopen("data.txt", "wb");
fwrite(newdata, sizeof(char), 2, fp);
fclose(fp);

とすると,結果は
22
となってしまい,最初のデータが完全に消えてしまいます。。
966デフォルトの名無しさん:2008/09/06(土) 11:02:57
"rb+"
967デフォルトの名無しさん:2008/09/06(土) 11:08:15
>>966
ああ完璧にいけましたありがとうございます!
968デフォルトの名無しさん:2008/09/06(土) 12:43:28
うちは成果主義だから
R&Dプログラマーのできるやつは50万くらいもらってるなぁ
969デフォルトの名無しさん:2008/09/06(土) 12:52:27
Repeat and Destroy ?
970デフォルトの名無しさん:2008/09/06(土) 12:55:27
トップでそれってしょぼくね?
971デフォルトの名無しさん:2008/09/06(土) 13:03:34
1日50万円じゃね?
972デフォルトの名無しさん:2008/09/06(土) 13:04:02
そろそろ次スレだ
973デフォルトの名無しさん:2008/09/06(土) 13:15:25
いやまだ早い
974デフォルトの名無しさん:2008/09/06(土) 15:17:55
ある配列の先頭番地 p と、個数 s が与えられるとき、
コピーコンストラクタを使ってこれをコピーしたい。
コンストラクタ+代入演算子は使えない。

結果は配列の先頭番地と個数でほしい。
メモリ上で連続していないとまずい。

どうやったらいい?
975デフォルトの名無しさん:2008/09/06(土) 15:33:56
わかんね
976デフォルトの名無しさん:2008/09/06(土) 15:42:02
std::vector<T>(p, p+s)
977デフォルトの名無しさん:2008/09/06(土) 15:43:06
X *q = static_cast<X*>(malloc(sizeof(X)*s));
while(s--) new(q++) X(*p++);
978デフォルトの名無しさん:2008/09/06(土) 15:44:53
試していないけど多分こんな感じ。delete[]で解放できるように作るのは無理だと思ったからmalloc使っている。
#include <new>
#include <memory>
#include <cstdlib>
template<typename T>
std::pair<T*, std::size_t> array_copy(T* src, std::size_t n)
{
  if (T* p = static_cast<T*>(std::malloc(sizeof (T) * n)))
  {
    try
    {
      std::uninitialized_copy(src, src + n, p);
    }
    catch(...)
    {
      free(p);
      throw;
    }
    return std::make_pair(p, n);
  }
  throw std::bad_alloc();
}
これを解放するにはこうする。Tには型名を入れて。
for (std::size_t i = 0; i < n; ++i)
  p.first[i].~T();
std::free(p.first);
979デフォルトの名無しさん:2008/09/06(土) 16:20:23
>>976-978
サンクス!
いろいろ試してみる。
980デフォルトの名無しさん:2008/09/06(土) 17:32:43
そろそろ次スレだ
981デフォルトの名無しさん:2008/09/06(土) 20:25:16
質問なんですが、関数templateのDLL化って可能なんでしょうか。
オーバーライド関数のように、名前修飾の問題とかあって、ダメなんでしょうか。
982デフォルトの名無しさん:2008/09/06(土) 20:27:43
無理です。.hppでソースごと提供して下さい。
983デフォルトの名無しさん:2008/09/06(土) 20:31:40
>>981
ソースなしにどうやってインスタンス化するんだよ?
984デフォルトの名無しさん:2008/09/06(土) 20:32:01
 ありゃまっ・・・。

>>982
ありがとう、ございます。
985デフォルトの名無しさん:2008/09/06(土) 20:33:21
>>983
醤油で、なんとかなりませんか?
986デフォルトの名無しさん:2008/09/06(土) 20:33:53
おお、ソイソース
987デフォルトの名無しさん:2008/09/06(土) 20:34:32
>>986
しっ、しもた・・・。
醤油も使えないのか・・・。
988デフォルトの名無しさん:2008/09/06(土) 20:53:12
Visual C++ 2008 Express Editionを使ってC++でプログラミングしてます。

Windowsフォームアプリケーションテンプレートの作成をして、
タイマーのTickイベントの中でWindowsAPIを使いたいのですが、
WindowsAPIはともかく
#include <windows.h>とコールバック関数はどこに書けばよいのでしょうか?
989デフォルトの名無しさん:2008/09/06(土) 21:03:23
>>988
http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_01.html
あたりを参考にしてみてはどうだろうか
990デフォルトの名無しさん:2008/09/06(土) 21:18:19
Visual C++ 2008 Express Editionを使ってるんですけど、リソースファイルを追加しようとしても項目が見つかりません。
また、ほかの項目を選んでそれを強制的に.rcにすると「リソースの編集は Visual C++ Express SKU ではサポートされていません。」となってしまいます。
猫でもわかるWindowsプログラミングという本では、リソースファイルを追加する項目があるんですけどどういうことなんでしょうか。
991デフォルトの名無しさん:2008/09/06(土) 21:21:15
>>988
<windows.h>のインクルードはstdafx.hにまず1つと
あとそれ以外のヘッダに必要に応じて。

コールバック関数は普通のC++と同じで基本.cppファイル。
ただし、メンバ関数ならクラス定義内に書いてもよし。

>>990
Expressにはリソースエディタがついていない。
無理やり追加はできるはずだが、テキストファイルとしての編集しかできない。
992デフォルトの名無しさん:2008/09/06(土) 21:21:25
>>990
言われたとおり
express editionにリソース編集機能は無い
外部のリソースエディタを使え
993デフォルトの名無しさん:2008/09/06(土) 21:25:18
じゃあ猫の本のは一体…
994デフォルトの名無しさん:2008/09/06(土) 21:35:25
よく見たら猫の本の後ろのほうにも注意が書いてありました。
995デフォルトの名無しさん:2008/09/06(土) 21:53:19
WINDOWのログイン名とパスワードってC++でとれないですかねー
996デフォルトの名無しさん:2008/09/06(土) 21:54:02
日本語でおk
997デフォルトの名無しさん:2008/09/06(土) 22:41:29
998デフォルトの名無しさん:2008/09/06(土) 22:45:58
【初心者歓迎】C/C++室 Ver.59【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1220708712/

こんなかんじ?
999デフォルトの名無しさん:2008/09/06(土) 22:57:45
    l^ヽ'"'"~/^i、..、 ..、、
  ヾ        ∧__∧``;: 
  ミ   ´ ∀ ` (´・ω・)..:;:;  チュンチュンの時間です
  ッ       _ (つ|⌒|⌒|..;ミ  みなさんそろそろ寝ましょう
 (´彡,.     (,,_, ヽ(~^),(^~).ノ
     "'"'゙''""''''゙""´

1000デフォルトの名無しさん:2008/09/06(土) 23:00:22
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。