[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 02/14 10:29 / Filesize : 83 KB / Number-of Response : 315
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2008/08/06(水) 20:56:17 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

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

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

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

2 名前: ◆3.JjF77I26 mailto:sage [2008/08/06(水) 20:59:15 ]
2get

3 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 01:34:19 ]
>>4
つかさちゃんきゃわあああああああああああ!!!!!!!!!!!!
つかさちゃんとちゅっちゅしたいよ〜

6 名前:デフォルトの名無しさん [2008/08/07(木) 01:47:42 ]
gdbで一行ずつ見ていくとSegmentationFault出さずに終了するんだけど
普通に実行するとエラー吐いて終了してしまいます。こういう場合どんな原因が考えられますか?

7 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 01:49:47 ]
>>6
ポインタが初期化されていない

8 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 16:54:51 ]
うははははは

9 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:54:18 ]
>>9
そこまで分かってるなら、もう分かるだろ。



11 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:54:54 ]
>>9
9割自分で答えが導けてるじゃないか

2進数で小数を表現すると、0.5、0.25、0.125…しか正確に表せないからだよ
でも丸めが出るから処理系によって上手く「動いてしまう」ときもある。

12 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:55:10 ]
浮動小数点数でwikiれば自ずとわかる

13 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:56:02 ]
>>9
浮動小数点数(float/double)で表現できる数値について

14 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:57:28 ]
学校の宿題なんだろ。
>なぜか 1を半分に割っていく数値0.5,0.25.0.125といった数値なら抜けれる。
これは、そのヒントっぽいな。本人はわかってなかったり。


15 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 01:00:46 ]
な・・なんだと・・・

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

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

とりあえずおまいらありがとう。

16 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 01:03:13 ]
数学者?

17 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 01:18:35 ]
>>15
すばらしい。

18 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 01:22:30 ]
車輪の再発見、数学屋のサヨナラ
ttp://jp.youtube.com/watch?v=c2SURtxy6i0


19 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 01:58:58 ]
少数を比較するときは範囲で比較しようって学校で教えてくれなかったんか?

20 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 10:28:33 ]
複数行の文章が書いてあるテキストファイルから
一行ごとにもじれすを抜き出す方法を教えてくださいm(_ _)m



21 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 10:53:10 ]
もじれすってなに?

22 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 10:55:11 ]
文字列のことだろうか。
fgets()は? あるいはcin.getline()とか。

23 名前:デフォルトの名無しさん mailto:sage [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%

25 名前:24 [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 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 12:15:23 ]
>>24-25
0でターミネートしてないだけじゃない?
MB2WC()のlenをlen+1にすれば解決する予感。


27 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 12:39:28 ]
>>23
たぶん配列のキューの方が速い
要素を追加/削除するたびにメモリの確保/解放をせずに済む
リストのキューは、追加/削除するたびにノードを確保/解放する必要がある

メモリ効率は、配列のキューは要素が空いててもその分のメモリを解放できない点で無駄があるが、
リストのキューも要素ごとに次のノードを指すポインタが必要という点でやはり無駄な部分がある
どっちが特に優れているというわけではない
状況に応じて使い分けるもの

28 名前:24 [2008/08/08(金) 12:46:26 ]
>>26
解決しました。ありがとうございます。



29 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 12:55:17 ]
>>27
ありがとうございました。
キューのサンプルを探したところ、リストを用いたものばかりだったので
疑問に思い、質問した次第です。

30 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 12:57:54 ]
地震だ><



31 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 14:41:50 ]
キューならstd::dequeかboost::circular_bufferが良いのじゃないかな

32 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 14:58:10 ]
>31
ありがとうございます。
わざわざ作らずとも、すでに用意されているのですね

33 名前:デフォルトの名無しさん mailto:sage [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() して大丈夫なのでしょうか。

34 名前:32 mailto:sage [2008/08/08(金) 21:11:20 ]
関係ありそうなところをはっときます。直リンクがうまくいくかわかりませんが…。

libevent/event.h (BSDL) toku.xdisc.net/cgi/up/vcc/nm0687.txt
libevent/buffer.c (BSDL) toku.xdisc.net/cgi/up/vcc/nm0688.txt
testcode.c (as-is でお願いします) toku.xdisc.net/cgi/up/vcc/nm0689.txt

35 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 21:20:12 ]
>>33 のアドレスでいうと
if(0x609100 != NULL) free(0x609100);
free(0x606080);
になると思いますよ

36 名前:デフォルトの名無しさん mailto:sage [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 の場合には、なんの動作も行われない。



37 名前:32 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 22:53:35 ]
初期化リストが使えないとか
その例だと意味無いが

40 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:58:59 ]
実害はないんじゃないの?
「覚えておくこと」のところに共通の処理は別の関数に実装すれば良い
みたいなこと書いてあるし

「代入は既に存在するモノの値を変えるのに使う。
 まだ存在していないモノに対して行うのはおかしい」って事だと読み取ったけど

42 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 08:42:21 ]
>ってしてもsizeof(p)が実行されなんですが何で?
どうして>42みたいな質問する奴ってこれだけの文章もまともに書けないんだろうな。
しかも、ちょっと探せばすぐに見つかるのに。

45 名前:38 [2008/08/09(土) 10:55:23 ]
>>39-41
参考になります。
コストはかかるがoperator=をそれなりに実装しておけば問題ないってことですかね。

46 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 12:12:19 ]
atan2のテーブルを高速参照したいんだが何かいい方法はないですか?
高速であればテーブルじゃなくてもいいです
環境はcygwin上のgccで、math.hとかはあります

47 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 12:15:15 ]
>>46
必要な精度、引数の制約条件は?

48 名前:46 mailto:sage [2008/08/09(土) 12:52:21 ]
>>47
精度は単精度floatです。
制約条件っていうのがよくわからないので教えてください

49 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:02:30 ]
>>48
引数ってんだから、その形式とか範囲とかじゃね?
三角関数系はゲームとかだと360度やラジアンでやるより
一周を0xffや0xffffにしたほうが扱いやすいし…、とかそういう
ことだと思うが。あ、おれ47じゃないから

50 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:23:07 ]
>>49
形式はfloatで1周1024で分割
ってかんじでいいんですかね?



51 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:38:22 ]
それだったら、単にテーブルを作るだけでいいと思うが。

52 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:39:30 ]
atan2だと、引数の精度(x,y)がfloatで、戻り値の角度が一周1024ってこと?
45度ごとに場合分けして、小さい方を大きい方で割って、
まあ2048倍して、テーブル2048個から0〜1023を返すようにすりゃいんじゃない?
倍にしてるのは気分的に。

53 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:40:50 ]
あ、ちょっと違うか、1週1024なら45度の範囲だとその
1/8のテーブル量で済むわ

54 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:25:42 ]
どうでもいいけど、atanをあーたんと読むとちょっとカワイイよな

55 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:33:17 ]
独学でC++、DirectX、Win32APIでゲームを作り始めたんですが、
いつも設計に悩まされ、綺麗な形にできません。

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

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

何かお勧めの本があったら教えてもらえませんか。

56 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 16:34:22 ]
あーくたんもカワユイ

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

>>54
こたんはなんか犯罪の香り

58 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:08:08 ]
>55

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

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

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

あと、今時、全てを一つのEXEで作らなくても良い、と言うのも重要。


59 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:25:52 ]
ゲームだとタスクシステムとかかなぁ

60 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 19:09:19 ]
>>43
ありがとう
ずっと確保した容量が返ってくるものだと勘違いして使ってた



61 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 19:42:01 ]
確保サイズが知りたい場合は_msizeだそうな(注:Windows限定)

62 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:15:29 ]
× Windows限定
× VC限定

63 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:17:03 ]
>>62
ワロタ

64 名前:55 mailto:sage [2008/08/09(土) 20:31:01 ]
>>57
まだ、何ができるかをちゃんと把握してないので、
思いついたものや試しをどんどん追加実装してるのが一番問題っぽいですが、
習作なので仕方ないかなとも思います。
実装するものの全体像を把握するまで、慣れるしかないですかね。

>>58
EXEを分割できるとは知りませんでした。
そういう場合、複数EXEで共用するモジュールを作ったりするんでしょうか。
それともまったく独立して複数作るんですか?

65 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 20:57:30 ]
>実装するものの全体像を把握するまで、慣れるしかないですかね。
ゲームプログラマーから一言。

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

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

ゲームだったらEXE一個だよ。分割なんか考えなくていい。
まあ機能ごとにDLLに分解するのはあると思うが、まだそんなこと考えなくてもいいだろう。

66 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:00:01 ]
>>65
拡張性を無視して作って変更が出たら作り直すって手法なかったっけ?
一回やってみたいと思ってるんだが勇気がなんだ

67 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:02:13 ]
アジャイル?

68 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:04:26 ]
>>66
>拡張性を無視して作って変更が出たら作り直すって手法なかったっけ?
かってにすればーw








冗談じゃねー、1回作り直すのに数年かかるわ!

69 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:05:36 ]
XP?

70 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:09:07 ]
>>67>>69
ああ、そんなんだった、調べてみる
>>68
>冗談じゃねー、1回作り直すのに数年かかるわ!
俺もそう思うんだ、だからやってみたことはない。
でも手法として確立してるからにはどうにかなるのだろうとは思う。
ちょっと調べてみていけそうなら今度提案してみる。



71 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:14:43 ]
XPでなんとなく理解できたのはペアプログラミングくらいだったな

72 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:35:51 ]
構造体の中身を全て = 0 にするにはどうしたらいいですか。
宣言のときなら struct hoge a = {0}; でできると思いますが。
全ての中身に対して = 0 をするコードを書くしかないですか。

74 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:37:22 ]
構造体の中身が全て整数型なら0にmemsetすることで実現できます。
それ以外の場合は0を意味する値を代入するしかありません。

75 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:44:03 ]
>>73
struct hoge a;

...;

struct hoge zero = {0};
a = zero;

76 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 21:52:47 ]
a = hoge();

77 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:16:58 ]
>>78
配列がまずいのですかね?

両方ともやりましたが結果は同じでした・・・

80 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:19:24 ]
MyShip *MyShipってありなのかぁ…



81 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:24:44 ]
>>79
結果は同じって同じエラーってこと?

82 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:55:22 ]
newでchar型の配列を1521090492個以上確保したらエラーがでるのですが何故でしょうか?
メモリは4G積んでるんでメモリが足りなくて確保できないってことではないと思うんですが
newで確保できるのは1521090492byteまでって決まってたりするんですか?

83 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 22:57:40 ]
それはコンパイラを作った人に訊いてくれ。

84 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:09:26 ]
どんなエラーよ?

他にもOSとかコンパイラとか色々あるじゃん。書くことが。


85 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:13:25 ]
>>85
そもそもWindowsでは32ビットアプリで32ビット(2GiB)以上のメモリ空間をアクセスする単純な手段は提供されていません。
大人しく64ビットアプリを作るか、ありえないメモリ戦略を諦めることをお勧めします。

87 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:13:45 ]
OSはXPx64でコンパイラはVisualStudio2008Proです
タスクマネージャでみるとメモリのコミットチャージは
newで確保前は470MB/3826MBで充分空いてます

88 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:13:49 ]
std::bad_allocでググれば。

89 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:17:44 ]
>>86
ありがとうございます。32ビットでも2Gまでならいけるはずですよね
とりあえずこんなに確保するつもりは無いんですが、色々試したら[1521090492]
を超えたところでエラーがでたので興味本位できいてみただけです。
>>88
ググったら色々情報でてきた。あとは自分で調べてみることにします

90 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:23:14 ]
ゲームでアジャイルとかできるんかね。
ゲーム作ったことないけどテストパターンが割りと膨大になりそうにおもう。



91 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:41:13 ]
>>91
ソースコードの文字コードを変えてみては?

93 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 23:43:18 ]
なんでもいいけど、int main なら値返そうよ。
2歩目も怪しい。


94 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 00:00:03 ]
>>93
C++ならmainでreturnしないとreturn 0:したことになるって規則があって問題ない。
省略していいかどうかはまた別問題。

95 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 00:02:54 ]
UNICODEで文字列を表示したいのか
単に日本語を表示したいのか

96 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 00:23:39 ]
>>91
g++なら--input-charset=cp932 --exec-charset=cp932でどう?
Code::Blocksでどう設定するかは知らないけど。

97 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 01:00:10 ]
ソースをUTF-8か何かで書いてるのかな

98 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 05:48:46 ]
これって問題あるでしょうか?

struct hoge {
int x;
};

hoge *ptr;
hoge &ref = *ptr;
ptr = new hoge; //参照を作った後に確保
ref.x = 1;     //参照からアクセス

99 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 06:09:09 ]
問題なし

100 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:14:01 ]
>>98
問題あり



101 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:23:27 ]
問題あり。
refの指している先はnewされたところではない。

102 名前:デフォルトの名無しさん [2008/08/10(日) 08:32:10 ]
動かしてないけど
hoge &ref = *ptr;
のところで落ちるんじゃない?
ptrは無効なポインタだからね、この時点で。

103 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:43:02 ]
そもそもなんでnewしたいんだ?
そこから見直すべきだな。

104 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:44:01 ]
>>102
試して落ちたの?
中身へのアクセスは無いからそこじゃ落ちないと思うけど。俺は試してないw

105 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 08:49:34 ]
遅れてすみません

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

>>81
言葉が足りませんでした、すみません
まさにその通りです

106 名前:デフォルトの名無しさん [2008/08/10(日) 08:52:57 ]
>>104
そうかもね
「動かしてない」って書いたジャン・・

107 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 09:05:21 ]
規格的に、どこを指してるかわからないポインタに"*"を適用した時点で、鼻から悪魔が出るかもしれない、はず。
実装的にも、大抵は「どこを指してるかわからないポインタ変数の指すアドレス」をコピーして別の変数に保持するだけだろうから
HDDをフォーマットしてスパムメールを送りまくってももおかしくない、はず。

108 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 09:56:02 ]
>HDDをフォーマットしてスパムメールを送りまくってももおかしくない、はず。
おかしいと思います。文章が。

109 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 11:53:58 ]
いいもも〜

110 名前:デフォルトの名無しさん [2008/08/10(日) 11:57:43 ]
>>109
中学生の太もも??
いいももだよねーーー
ハァハァハァハァハァハァハァ



111 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 {
...
}

113 名前:111 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:46:47 ]
const_iteratorだからじゃね

115 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 14:25:37 ]
>>113
>どこでconstがついたのか
根本的に勘違いしてる。オブジェクトがconstかどうかと、
メンバ関数のconst指定は、まったく無関係ではないが
基本的に別物

116 名前:111 mailto:sage [2008/08/10(日) 14:27:47 ]
>>114
const_iterator → iterator とすると、エラーになりませんでした。
イテレータについてまだ理解していないので、勉強したいと思います。
ありがとうございました。

117 名前:111 mailto:sage [2008/08/10(日) 14:34:27 ]
>>115
>>113の解釈は間違っているということですね。
オブジェクトのconstとメンバ関数のconst指定について調べていきたいと思います。
ご指摘、ありがとうございます。

118 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 14:40:31 ]
わざわざconst_iteratorを使ってるからには、constになることくらいわかってるんだと思ってた
世の中難しいものだ

119 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 14:44:38 ]
>>118
イテレータについての理解があまりなく、参考書丸写ししてました。

120 名前:デフォルトの名無しさん [2008/08/10(日) 17:12:14 ]
C言語の標準ライブラリ関数qsortについての質問です
この関数はメモリ上で連続していない配列に対しても動作は保証されているんでしょうか?



121 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 17:16:50 ]
>>120
各要素は連続している必要があります。

122 名前:120 mailto:sage [2008/08/10(日) 17:27:06 ]
>>121
そうでしたか。
回答ありがとうございました。

123 名前:120 mailto:sage [2008/08/10(日) 17:32:00 ]
よく考えたら連続していない配列って・・・。
お恥ずかしい限りです。

124 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:11:02 ]
少しスレ違いかもしれませんが、VC++で作った実行ファイルについての質問です。

リリースビルドした実行ファイルを覗くと、pdbファイルへのパスがそのまま残っているのですが、
これは他の数、例えば0x00等で塗りつぶしてしまってもいいのでしょうか?
問題なく動いているように見えますが、異常終了した際になにか不具合がでたりしませんか?

126 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:12:35 ]
>124
失礼しました、コンパイラはBorland C++ 5.5.1です。

127 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:25:40 ]
>>124>>126
BCCなら、多分Makefileの問題じゃないかね?

コンパイルするときに分割コンパイルするオプション付いてる?
-oか何かだと思うけど。

128 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:27:39 ]
ごめん。大嘘コイた。

多分-c

129 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:38:36 ]
>127-128
ありがとうございます!ご指摘のとおりでした。

130 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 20:31:47 ]
>>125
そんな面倒なことしなくてもコンパイラオプションで消せる。



131 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:29:52 ]
>>130
ありがとうございます。
なんでデフォでリリースビルドにデバッグ情報埋め込んでるのやら……

132 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:41:28 ]
>>132
鼻から悪魔。

134 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:42:01 ]
_

135 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:49:05 ]
>>132
delete p;
の上にprintfを入れて試してみては?

136 名前:132 mailto:sage [2008/08/10(日) 21:58:43 ]
>>135
試してみた。呼ばれないみたいだね。


137 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 22:13:19 ]
そりゃvoid*で型情報消してるし

138 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 22:15:03 ]
じゃあどうしてvoid*型の変数をdelete/delete[]しようとするとエラーが出るようにはならないんですか?
new void;とかできませんよね?なぜ?どうして?

139 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 22:20:42 ]
>>131
リリース版でもデバッグできるって結構便利だと俺は思う。

>>138
エラーにしたいという要望だけはboost::checked_delete使えば叶う。
あと、boost::shared_ptr<void>だとデストラクタが呼ばれるというマジックもある。

140 名前:135 mailto:sage [2008/08/10(日) 22:28:54 ]
>>138
gccならwarning deleting void* is undefinedって警告がでた。



141 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 23:59:16 ]
>>73なんだけど
gccで構造体を = {0} して初期化すると、「最初以外の、他の中身の初期化子(?)がない」っていう警告が出るんだけど、
これは無視してもいいの?

142 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 00:01:16 ]
それ構造体か?構造体の配列とかでやってないか?

143 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 00:32:29 ]
なら
struct tm a = {0, 0, 0, 0, 0, 0, 0, 0, 0};
にすると出なくなるような気がしないでもない。

145 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:09:31 ]
>>145
そもそもクラス(非PODか?)では、変数が宣言順に配置されるという保証がなかったと思う。
危険コードかもよ。

147 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:15:39 ]
>>146
こらこら
クラスは変数が宣言順に配置されるぞ
メンバ関数だけは別扱いだけど
メンバ関数ポインタも宣言順に配置される

148 名前:デフォルトの名無しさん [2008/08/11(月) 10:20:49 ]
>>145
そのコードの目的が分からん
offsetofを使わずに済むコードを考えた方がいいんじゃない
見てていらつくコードなんだけど

149 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:23:11 ]
C++でクラス内でoffsetofを使うのは大抵委譲を使う場合だな

150 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:35:42 ]
else if{
}

else{
  if{
  }
}
とで内部的に違いありますか?
見た目的にネストは浅くした方がいいのかな?



151 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:36:40 ]
>>150
前者はelseの後に複文が書けない
後者は複文が書ける

それ以外は同じ

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

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

まあ145のコード通りならPODだから問題なさそうだけど、
いつPODでなくなるか分からないから怖いな。


153 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 10:43:23 ]
>>151d!

154 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 14:01:01 ]
>>147
一般論?
なら順序が保証されるのはアクセス指定子が間に挟まらない場合だけだった気がする。

155 名前:152 mailto:sage [2008/08/11(月) 14:09:51 ]
>>154
あ、そうだ。それを聞いたことがある。

156 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 17:40:19 ]
昔、sunかどっかのCコンパイラのstructのメンバの順番が
ソースの上下と逆だった覚えがある。

それ以来構造体のメンバの順番に依存したコードは書かなく
なったので、構造体が拡張されたC++ではどうなのか気にした
こともないやw

157 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 17:43:39 ]
トラウマというやつですね

158 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:29:46 ]
仮に配置が宣言順にならない場合も、初期化子の実行順は保証されますか?

159 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:32:15 ]
>>158
されます
宣言順です
並べた初期化子の順ではありません

160 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:44:05 ]
C言語検定の1級をもってるとゲームプログラマーとして就職するときどのくらい有利ですか?



161 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:45:56 ]
宣言順にならないとき、Cスタイルの初期化はプログラマの意図した通りになる?
struct hoge {
int a;
int b;
};
hoge h = {1,2};//h.a==1,h.b==2

162 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:46:48 ]
>>160
それでやっと最低限。しかも資格持っていないC言語分かってる
連中とまったく対等くらい

163 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:48:41 ]
こころなしか足しになる程度であんまり意味は無いんじゃないかと
あの程度は研修で叩き込まれたらすぐ身に付くレベル
他の要素のほうが重要視されるだろう

164 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:52:45 ]
なるほど、じゃあ線形代数ができる等 のほうが強みになるってことですか。
スレ違いの質問に答えていただきありがとうございました。


165 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 22:01:41 ]
>>164
ゲームプログラマーとして(大手に)就職したいなら、普通に
大卒か院卒で、趣味でゲーム一本でも作っておけ。

チームで作ってメインプログラマ兼取りまとめ役とか
だとポイント高いよ。

166 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:41:38 ]
->
これはどういう意味ですか?
こんな感じで使われているようです。
node->setMaterialFlag(EMF_LIGHTING, true);

また何と呼ばれてますか?
->でgoogleで検索かけてもかからないので困ってます。

167 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:44:37 ]
>>166
アロー演算子

(*node).setMaterialFlag(EMF_LIGHTING, true)
の書き方が違うだけ

168 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:45:51 ]
あるクラスの実体である、node変数のsetMaterialFlag()メンバ関数を呼び出している

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



169 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:50:21 ]
>>167-168
わかりました。
即レスしていただきありがとうございました。

170 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:01:33 ]
なんでメンバのアクセスって.と->に分けてるんだろう。
どちらかに統一すると困るケースが思いつかないのですが、
何か理由があるのでしょうか?



171 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:05:54 ]
>>170
*(p + i)で事が足りるのにp[i]と書けるのと同じ理由で、
(* p).mで事が足りるけれどもp->mと書けるようにしてある。

172 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:19:40 ]
タイプを楽にするためですよ

173 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:42:22 ]
そういうのって糖衣構文と言うのだったかな?

174 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:51:12 ]
いや、ポインタでも実体でもどちらも.か->に統一してくれたほうが
ジェネリックプログラムで楽で、メリットがあるのではと思ったんですよ。

そういうメリットを捨てて*や->を使わせてるのは、
ポインタからメンバにアクセスするのに*をつかわないで直接
ptr.mで良いようにしてしまうと、言語仕様として何か不都合が
あるからなのかなと、疑問に思ったわけで。

175 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 02:10:08 ]
なんか数ヶ月前にも似たような話題があった。

176 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 02:21:39 ]
ptrptr-->m

177 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 02:38:00 ]
歴史的経緯は知らんが状態を持つイテレータを使うので . と->の両方が無いと困る。


178 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 08:35:01 ]
Cのころからそうだったのを受け継いでいるのはおいといて、
C++では「.」はオーバーロードできない(させない)という差がある。
->はオーバーロードできる。いろんな都合で現状のルールに落ち
着いてるようだ。

179 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 09:23:53 ]
Dだとどっちも . でいけるって話なかったっけ?

180 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 10:05:56 ]
gccで特定のファイルというか場所というかインクルードしたファイルに対してだけ警告がでないようにはできますか?
使っている環境のgccで警告を厳しくすると、stlに対して大量の警告がでてしまうので、うっとおしいんです
スクロールしないと見たい警告みれないですし
自分でstl側をいじれる環境ではないです



181 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 14:08:37 ]
>>181
要するに要素数10の配列へのポインタへ強引にキャストして
成り立つかというわけでしょ。
そりゃ成り立つわ。

183 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 16:00:44 ]
サン・クスコ

184 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 16:13:38 ]
どういたしマチュピチュ

185 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 16:46:23 ]
マンコ=カパックがどうしたの?

186 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 03:51:24 ]
今知ったんだけど、newって失敗したらNULLを返すと思ってたけど違うのね
ずっと
p=new int [1000];
if(p==NULL){〜
みたいな意味ないことしてた…

187 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 05:04:55 ]
nothrow

188 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 06:19:58 ]
要するにSJISの2バイト目が\の文字の対策ってことだよね?
先頭から見て行くか別の文字コードにするしか手は無いよ。

190 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 06:49:20 ]
>>188
SJISの1バイト目領域⊂2バイト目領域だから、これはいかんともしがたい。



191 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:54:46 ]
>>188
律儀に先頭から見る必要は必ずしもないけれど、1バイトずつ遡る関数を作ったところで効率はさほどよくならないね。

192 名前:188 mailto:sage [2008/08/14(木) 08:14:20 ]

>>189-191

解答ありがとうございます.
遡るのは面倒なので wstring に変換して調べることにします.

193 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:13:51 ]
C++のコンパイルの仕方がわかりません

194 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:15:11 ]
>>193
エイホが書いたドラゴンブックとか、アマゾンで「コンパイラ」関連の書籍を読んでみては?

195 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:24:59 ]
>>193はそういう質問なんだろうか

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

とかいうはなしかと思ってしまった

196 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:44:05 ]
あの、プロンプトからcppファイルをコンパイルしたいんですけど、どういうコマンドを打てばいいのか解らないんです。

197 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:46:04 ]
使ってるコンパイラは何よ?
それがわからなきゃこっちもエスパー回答しかできない

198 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:48:42 ]
Visual Studio 2008だと思います

199 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:49:37 ]
>>196
コマンドプロンプトはあきらめて、普通にビルドしてはいけないのですか?

200 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:56:47 ]
VC9ならcl ソースファイル名 だよ。
でもその前に vcvars32.bat を実行してからにしてね。



201 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 16:57:07 ]
>>199
コマンドプロンプトの方が手軽に見えたので

202 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:01:23 ]
有難う御座います。解決しました

203 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:14:10 ]
関数の戻り値を配列に場合どう記述すればいいのでしょうか?

204 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:16:58 ]
>>203
まずローカル変数を返さないように注意しろよ。
次に受け取った配列の先頭アドレスを返すようにするか、
もしくは配列そのものを返したければ構造体の中に配列を入れて
返すようにする。

205 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:42:51 ]
構造体にしまった意味が無いだろwwwww

207 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:45:08 ]
だって配列そのものを返すには?って聞かれたんだもんwww

208 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:49:19 ]
>struct Int *a = (struct Int *)malloc(sizeof(struct Int));
これ笑いどころ?

209 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:49:48 ]
そうでした
もうしわけありませんでした

210 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:54:39 ]
>>208
static領域に確保したらつまらないコードを吐くもんで
わざとそうした



211 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:19:00 ]
ローカル変数のアドレスだと・・・

214 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:23:34 ]
(double *)[2]

どちらにしろ関数を抜けた時点で実体がなくなるわけだが。
構造体にして返すなり工夫をしろ

215 名前:208 mailto:sage [2008/08/14(木) 18:26:09 ]
>>210
なるほど。

>>211
だからぁ、向こうで書かれた注意を全く無視してんじゃねぇよ。

216 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:26:20 ]
構造体の考え方で記述してみます
アドバイスありがとうございました

217 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:26:25 ]
>(double *)[2]

これじゃエラーか

double (*)[2] だな

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

double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope, double* ans1, double* ans2)

219 名前:211 mailto:sage [2008/08/14(木) 19:32:40 ]
構造体を利用して記述しています。
まだ途中ですができそうな気がしてきました。
結果が出たら報告します。

220 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:11:45 ]
>>220
×return pt1->num;
○return pt;

222 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:12:56 ]
×double lineIntersect(Point* pt1)
○struct Point *lineIntersect)

それから構造体へのポインタを渡しているので
戻り値は別にvoidでもよい。

223 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:37:03 ]
221さんと222さんの方法を試しても同じエラーが出たので
C言語の本をもう一度やり直してきます。

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

お騒がせしました。

225 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:40:33 ]
それともう少し言えばC++ならlineIntersectはメンバ関数に
すべき。他の変数は全部privateにしてしまう。

227 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:56:25 ]
>>225>>226>>227
ありがとうございます!
参考にさせてもらいます。

229 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:37:19 ]
C++を単なるBetter Cとして使うだけならそこまでする必要はない罠。
しかし日頃からC++を使い慣れている人には気持ちはわかる。

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

namespaceの必要性も最初は理解できないだろうが、プログラムが大きく
なると必然的に必要性がわかってくるし。

230 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:52:18 ]
>>230
いいんじゃね?特に問題となるような点はないみたいだ。

当初の質問の『関数から配列を返す』という話題からは
かけ離れてしまったけどそれはいいんだね?

232 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:54:00 ]
>>231
それも自分で納得できるように理解したいのですが
今のスキルじゃちょっときついのでC言語の本をもう一度読み返してからチャレンジしようと思います。
色々ありがとうございました。

233 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:57:13 ]
>>232
そうですか。

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

だから構造体へのポインタさえ理解すれば大抵の場合はそれでいいと思う。

234 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:50:41 ]
catchで受け取る型をテンプレートにしたいのですが無理ですか?

//こんなの
template<class T>
} catch(T Obj) {
〜〜

236 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:58:59 ]
むりだお。 最低限共通の基底クラスから派生させるとかしないとだめ。
もう少し具体的に何がしたいのかを書けば誰か親切な人が考えてくれるかも。

237 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:14:24 ]
クラステンプレートか関数テンプレートの定義内で、テンプレート引数型でcatchすることは出来るんじゃない。
何がしたいのか分からないのでこれが解決になるのかは分からんが。

238 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:42:47 ]
class Base{};
class A:public Base{};
class B:public Base{};
みたいな感じで、
class A内で、Baseの値を変えたとき、
class BのBaseの値も変わっているようにするにはどうすればいいのでしょうか?

239 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:45:58 ]
>>238
そんなことをするくらいなら、class Bがclass Aを継承すればいいんじゃね?

240 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:48:58 ]
Baseが基底となる全クラスのインスタンスで値を共有したいならBaseの値をstaticにすればいい。



241 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:00:19 ]
>>238
宣言と実態をごっちゃにしていそうな気がするので、何をしたいのか詳しく。

242 名前:デフォルトの名無しさん [2008/08/15(金) 16:00:56 ]
>>238
メンバをすべてstaticにしたらかっこいいYO!

243 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:10:33 ]
>>242
シングルトンの方が見通しが良くね?

244 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:23:28 ]
無理しないでグローバルな構造体でいいじゃん^^;

245 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 16:30:15 ]
>>244
アクセッサは欲しい

246 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:35:18 ]
ソースコードの書かれたテキストを読んで、
使われている変数や関数を解析するパーサみたいなものが作りたいのですが、
こういうのって一行まるごと読んで正規表現で抜き出したりって方法でいいんでしょうか。

効率的といいますか、定石みたいなのがあれば教えてください。

247 名前:デフォルトの名無しさん [2008/08/15(金) 18:39:40 ]
一行づつで問題が発生しないならそれでいいんじゃね

248 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:40:17 ]
ひょっとしてCですか?

249 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:50:45 ]
ドラゴンブックに

250 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 18:59:10 ]
yaccとかbisonを使う方向の方が幸せになれそうだが



251 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:00:24 ]
>>246
プリプロセッサに通した後のファイルを読むようにすると随分と楽になる

252 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:05:00 ]
>>246
Cのソースコードを正規表現でパースすることは原理的に不可能であることがわかってる。
厳密でなくていいならどうとでも出来るけど、
そんなことを考えるより既存のライブラリやツールで処理した方がてっとりばやい。
ctags とかではいかんのか?

253 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:52:50 ]
配列のポインタから中身サイズを取得する方法ありますか?
sizeof()だとポインタそのもののサイズが取得される

254 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:53:34 ]
>>253
ないです。

255 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:57:02 ]
sizeofnakami()

256 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:57:18 ]
間違ってるかもしれないけど、
呼び出した関数の中とか、現在のスコープにおいてその配列の要素数が
わからない場所でsizeofを使ってもそのポインタのサイズしか得られない。
要素数はなんらかの方法で渡さなきゃならない


257 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 14:19:00 ]
>>253
環境依存でよければあるよ

258 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:05:41 ]
わたし環境依存それわからなーず

259 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:39:58 ]
環境依存・・・
それは標準の方法では決してできないことを平然とやってのける魔法の道具
しかし環境が変わると途端に動かなくなる諸刃の剣

260 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:40:35 ]
if( ! a=Test() )
代入かつ否定 はこれでおk?



261 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:47:01 ]
不安ならなんでも括弧つけとけ、損はしない

262 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:47:44 ]
>>260
ダメ。

代入をカッコで囲んでそれを否定する。


263 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:54:21 ]
把握

264 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:16:54 ]
関数へのポインタの配列を動的に確保するにはどうすればいい?
int size=10;
void(**ppfunc)(void);
ppfunc=new void(*)(void)[size];
とかだとコンパイルが通らない。typedefするしかないのかね

265 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:55:53 ]
>>264
C的に考えても、(void **) の意味がよくわからないのですが。(void *) でだめですか?

266 名前:265 mailto:sage [2008/08/16(土) 19:57:42 ]
ごめんなさい。勘違いしていました。


267 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:57:19 ]
>>267
new void(*[10])();が通らなかったので見逃してた。
なるほど、括弧で囲めばいいのか。ありがとう。

269 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 10:52:00 ]
読み辛いし、普通にtypedef使おうぜ・・・

270 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:45:50 ]
知っておくのも損は無いだろう。typedefで省略して良いのは基本を理解していてなぜtypedefが必要なのかを知っている者のみ。



271 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 16:09:51 ]
>>270
基本は new T[N] で、この書式に合わせるためには typedef が必要だとわかっている。
typedef を使わない書き方を知る必要は無いよ。

272 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:05:16 ]
typedefを使わないと理解出来ない馬鹿は去れ。

273 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:18:44 ]
そりゃtypedefを使わない奴は馬鹿だが関数宣言における他演算子と比べた時の優先順位を理解できない奴も馬鹿だろ

274 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:28:27 ]
人の事はどうでもいいから自分の恥を知れ。

275 名前:デフォルトの名無しさん [2008/08/17(日) 17:37:46 ]
初心者歓迎ってスレタイに書いてあるのに馬鹿は去れとか

276 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:38:24 ]
ageて言うほど悔しかったかワロスwwwwwwwww

277 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:39:14 ]
来るものは拒まず、馬鹿は去れ

278 名前:275 mailto:sage [2008/08/17(日) 17:39:44 ]
>>276
sageチェック外す癖が付いてたんだよ悪かったな

279 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:41:09 ]
馬鹿に限って煽りをスルーできないんだよな( ´ー`)y−~~

280 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:41:54 ]
( ゚Д゚ )y−~~



281 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 17:57:51 ]
>>272-280
なんという夏休み。

>>264
今日び配列newなんてやめておいた方が良い。
std::vectorか、boost::arrayあたりを。
それにC++的には関数ポインタより関数オブジェクトを。

282 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:05:15 ]
typedefがよくわかりません
教えてください
釣りではありません
本当です

283 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:06:12 ]
どう分からないんだ

284 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:07:51 ]
>>281
嫌だね。
人にプログラミング上の事まで強制される謂われはないし

285 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:09:09 ]
int a; //aという変数の宣言
typedef int a; //変数宣言の形にtypedef修飾子をつけるとaという型の宣言になる

286 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:12:11 ]
typedefのあとに変数宣言の形とか考えたこともなかった
そんな分かりにくい説明なんか読むんじゃありません

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

これで分からなかったらもうどうしようもない

287 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:22:05 ]
ちなみにtypedef修飾子は他の修飾子がそうである様に
元の型 typedef 新しく宣言する型;
という元の型の後の修飾でも有効

288 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:56:26 ]
typedefがわからんて…

289 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:44:19 ]
質問です。C++のクラスのメンバに、自身のクラスのメンバ関数ポインタ、
あるいは他のクラスのメンバ関数ポインタを保持させ、
呼び出すことは可能でしょうか?また、それはどのような方法でしょうか?

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

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

の二つです。
多少、形が変わっても構いません。
ご存知の方、よろしくお願いします。

290 名前:289 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:17:24 ]
>>290
何がしたいのかいまいちわかんないけど、(Obj->*Obj->PFunc)();じゃね?

292 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:30:40 ]
->*が出てくるときはまず設計ミス

293 名前:289 mailto:sage [2008/08/17(日) 22:40:10 ]
>>291
動きました。ありがとうございます。
-> と ->* は全く違うんですね…。

>何がしたいのか
まず、あらかじめ別の型で動的確保した領域で、線形リストをクラスで組んでメンバ関数を使おうとしました。
しかし、その場合、仮想関数はなぜか使えませんでした。
仮想関数を呼び出すとコンパイラはエラーを出さないんですが、実行時に停止するんです。
そこで、関数ポインタを入れ替えることにし、このような形になりました。
かなり横着している気はしますが…。


294 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:47:11 ]
__thiscallとか移植性ないんだからやめろよ

295 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:48:29 ]
boost::ptr_funでも使ってポリモーフィズムすりゃいいんじゃね?

296 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:49:16 ]
boost::ptr_vectorだったorz

297 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:58:41 ]
>>297
これ何?

299 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:01:21 ]
自分で考えろカス

300 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:06:06 ]
いやそういう意味ではなくて、何の質問もないのに関数への
ポインタとか関数へのポインタを返す関数へのポインタとかの
ソースをいきなり貼られてるのは何の意味があるのかと思って。



301 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:19:30 ]
それなら「ない」

302 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:20:20 ]
>>297
なんか言えよ

303 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:22:36 ]
void (**(func1()))();

こんな関数のプロトタイプ宣言初めてみたぞ。
まあ書けばいくらでも複雑に書けるんだろうけど、
デザパタの生成パターンでもこんな書き方はしないし。

304 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:56:09 ]
何故括弧を一つ増やしたし

305 名前:デフォルトの名無しさん mailto:sage [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;

307 名前:306 [2008/08/19(火) 07:37:57 ]
Obj-CのNSLog();使ってエラー表示させてるけどそこは気にしない方向でお願いします。
NSLog([NSString stringWithFormat:@"Send Error:%d",errno]);

printf("Send Error:%d¥n",errno);
とほぼ同じです。

308 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:44:27 ]
>>306
#define EBADF 9 /* Bad file number */
ならsocketIDが無効
socket( )の戻り値は確認してる?


309 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:54:04 ]
>>306
数値の意味がわからないなら文字列にすれば
NSLog([NSString stringWithFormat:@"Send Error:%s", strerror(errno)]);


310 名前:306 [2008/08/19(火) 08:15:49 ]
>>308
ありがとうございます。
socket()の戻り値は確認していて、connect()及びrecv()は問題なく行えています。
socketIDがガベージコレクションで解放されちゃったのかもしれないのでその辺りで探ってみます。

>>309
文字列にできたんですか。ありがとうございます。



311 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 09:07:33 ]
関係ないけど7bit asciiのみなら
NSLog(@"format",...);
って書けた気がする。

312 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:22:50 ]
>>305
プロジェクトの性質によって色々だとは思うが、
絶対ないと断言できるのは「読み上げ」だな。
やれるもんならやってみろ。

313 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:39:10 ]
>>305
>ソースを読み上げたりハードコピーにマーカーでチェック、机上チェック
そんなアナクロなこと、COBOLでだってやりませんよ。

314 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 23:53:35 ]
>>305
俺は「コードレビュー」はやったことはある
紙の無駄だけどプリントアウトしたソース使って

ただ、(若手の)教育と(協力会社さんなどの)スキル把握(もちろん
悪いところは直してもらう)が主な目的だったんで、約束事として
つねにやってたわけじゃない






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<83KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef