【初心者歓迎】C/C++室 Ver.58【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.58【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
08/08/06 20:56:17
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.57【環境依存OK】
スレリンク(tech板)

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

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

2: ◆3.JjF77I26
08/08/06 20:59:15
2get

3:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/07 01:34:19
>>4
つかさちゃんきゃわあああああああああああ!!!!!!!!!!!!
つかさちゃんとちゅっちゅしたいよ~

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

7:デフォルトの名無しさん
08/08/07 01:49:47
>>6
ポインタが初期化されていない

8:デフォルトの名無しさん
08/08/07 16:54:51
うははははは

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

11:デフォルトの名無しさん
08/08/08 00:54:54
>>9
9割自分で答えが導けてるじゃないか

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

12:デフォルトの名無しさん
08/08/08 00:55:10
浮動小数点数でwikiれば自ずとわかる

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

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


15:デフォルトの名無しさん
08/08/08 01:00:46
な・・なんだと・・・

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

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

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

16:デフォルトの名無しさん
08/08/08 01:03:13
数学者?

17:デフォルトの名無しさん
08/08/08 01:18:35
>>15
すばらしい。

18:デフォルトの名無しさん
08/08/08 01:22:30
車輪の再発見、数学屋のサヨナラ
URLリンク(jp.youtube.com)


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

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

21:デフォルトの名無しさん
08/08/08 10:53:10
もじれすってなに?

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

23:デフォルトの名無しさん
08/08/08 11:47:26
URLリンク(www.rupan.net)
上記ファイルの内容は、キュー構造をint型配列を用いて実装したものです。
これは、リストを用いてキュー構造を実装したものと比較して、完全に劣るものでしょうか?
占有するメモリ量の点で劣っているのは分かっています。

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


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

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

28:24
08/08/08 12:46:26
>>26
解決しました。ありがとうございます。



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

30:デフォルトの名無しさん
08/08/08 12:57:54
地震だ><

31:デフォルトの名無しさん
08/08/08 14:41:50
キューならstd::dequeかboost::circular_bufferが良いのじゃないかな

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

33:デフォルトの名無しさん
08/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
08/08/08 21:11:20
関係ありそうなところをはっときます。直リンクがうまくいくかわかりませんが…。

libevent/event.h (BSDL) URLリンク(toku.xdisc.net)
libevent/buffer.c (BSDL) URLリンク(toku.xdisc.net)
testcode.c (as-is でお願いします) URLリンク(toku.xdisc.net)

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

36:デフォルトの名無しさん
08/08/08 21:23:53
URLリンク(www.linux.or.jp)
free() はポインタ ptr が指すメモリ空間を解放する。
このポインタは、以前に呼び出された malloc(), calloc(), realloc() のいずれかが返した値でなければならない。

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

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



37:32
08/08/08 21:36:55
>>35
よくわかりました。ものすごく勘違いしていました!
free(buffer->buffer); しているものと空目していました。
ありがとうございます!

38:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/08 22:53:35
初期化リストが使えないとか
その例だと意味無いが

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

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

42:デフォルトの名無しさん
08/08/09 07:47:52
newで確保した領域の容量ってsizeofで求められないんですか?
byte *p=new byte [1000];
int size=sizeof(p);
ってしてもsizeof(p)が実行されなんですが何で?

43:デフォルトの名無しさん
08/08/09 08:04:28
>>42
実行されます。
ポインタのサイズが返ります。

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

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

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

47:デフォルトの名無しさん
08/08/09 12:15:15
>>46
必要な精度、引数の制約条件は?

48:46
08/08/09 12:52:21
>>47
精度は単精度floatです。
制約条件っていうのがよくわからないので教えてください

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

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

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

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

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

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

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

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

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

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

56:デフォルトの名無しさん
08/08/09 16:34:22
あーくたんもカワユイ

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

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

58:デフォルトの名無しさん
08/08/09 17:08:08
>55

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

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

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

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


59:デフォルトの名無しさん
08/08/09 17:25:52
ゲームだとタスクシステムとかかなぁ

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

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

62:デフォルトの名無しさん
08/08/09 20:15:29
× Windows限定
× VC限定

63:デフォルトの名無しさん
08/08/09 20:17:03
>>62
ワロタ

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

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

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

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

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

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

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

67:デフォルトの名無しさん
08/08/09 21:02:13
アジャイル?

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








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

69:デフォルトの名無しさん
08/08/09 21:05:36
XP?

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

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

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

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

75:デフォルトの名無しさん
08/08/09 21:44:03
>>73
struct hoge a;

...;

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

76:デフォルトの名無しさん
08/08/09 21:52:47
a = hoge();

77:デフォルトの名無しさん
08/08/09 21:53:49
>>72
Shot(ctrlmode, bullet, &MyShip, shot);

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

78:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/09 22:16:58
>>78
配列がまずいのですかね?

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

80:デフォルトの名無しさん
08/08/09 22:19:24
MyShip *MyShipってありなのかぁ…

81:デフォルトの名無しさん
08/08/09 22:24:44
>>79
結果は同じって同じエラーってこと?

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

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

84:デフォルトの名無しさん
08/08/09 23:09:26
どんなエラーよ?

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


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

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

88:デフォルトの名無しさん
08/08/09 23:13:49
std::bad_allocでググれば。

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

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

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

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


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

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

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

97:デフォルトの名無しさん
08/08/10 01:00:10
ソースをUTF-8か何かで書いてるのかな

98:デフォルトの名無しさん
08/08/10 05:48:46
これって問題あるでしょうか?

struct hoge {
int x;
};

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

99:デフォルトの名無しさん
08/08/10 06:09:09
問題なし

100:デフォルトの名無しさん
08/08/10 08:14:01
>>98
問題あり

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

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

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

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

105:デフォルトの名無しさん
08/08/10 08:49:34
遅れてすみません

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

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

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

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

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

109:デフォルトの名無しさん
08/08/10 11:53:58
いいもも~

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

111:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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
08/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:デフォルトの名無しさん
08/08/10 13:46:47
const_iteratorだからじゃね

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

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

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

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

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

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

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

122:120
08/08/10 17:27:06
>>121
そうでしたか。
回答ありがとうございました。

123:120
08/08/10 17:32:00
よく考えたら連続していない配列って・・・。
お恥ずかしい限りです。

124:デフォルトの名無しさん
08/08/10 19:07:36
URLリンク(www.rupan.net)
URLリンク(www.rupan.net)
URLリンク(www.rupan.net)
上から、main.cpp,sample.h,sample.cpp です。すべて同じディレクトリに配置されています。

staticメンバ変数についての質問なのですが、上のファイルのように
ヘダファイル内のクラスでstatic変数dataを宣言し、同名cppファイル内で定義しようとすると、
main.cppで「Error: 外部シンボル 'Sample::data' が未解決」と出てしまいます。
int Sample::data = 0; の記述をヘッダファイル内に移動させればコンパイル通りますが、
解説しているサイトなどを見る限り、これは良くない書き方のような気がします。
どこに問題があるのか、ご教授ください。

125:デフォルトの名無しさん
08/08/10 19:11:02
少しスレ違いかもしれませんが、VC++で作った実行ファイルについての質問です。

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

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

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

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

128:デフォルトの名無しさん
08/08/10 19:27:39
ごめん。大嘘コイた。

多分-c

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

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

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

132:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/10 21:41:28
>>132
鼻から悪魔。

134:デフォルトの名無しさん
08/08/10 21:42:01


135:デフォルトの名無しさん
08/08/10 21:49:05
>>132
delete p;
の上にprintfを入れて試してみては?

136:132
08/08/10 21:58:43
>>135
試してみた。呼ばれないみたいだね。


137:デフォルトの名無しさん
08/08/10 22:13:19
そりゃvoid*で型情報消してるし

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

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

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

140:135
08/08/10 22:28:54
>>138
gccならwarning deleting void* is undefinedって警告がでた。

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

142:デフォルトの名無しさん
08/08/11 00:01:16
それ構造体か?構造体の配列とかでやってないか?

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

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

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

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

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

150:デフォルトの名無しさん
08/08/11 10:35:42
else if{
}

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

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

それ以外は同じ

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

URLリンク(www.kijineko.co.jp)

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


153:デフォルトの名無しさん
08/08/11 10:43:23
>>151㌧!

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

155:152
08/08/11 14:09:51
>>154
あ、そうだ。それを聞いたことがある。

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

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

157:デフォルトの名無しさん
08/08/11 17:43:39
トラウマというやつですね

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

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

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

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

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

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

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


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

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

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

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

167:デフォルトの名無しさん
08/08/12 00:44:37
>>166
アロー演算子

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

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

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



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

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

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

172:デフォルトの名無しさん
08/08/12 01:19:40
タイプを楽にするためですよ

173:デフォルトの名無しさん
08/08/12 01:42:22
そういうのって糖衣構文と言うのだったかな?

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

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

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

176:デフォルトの名無しさん
08/08/12 02:21:39
ptrptr-->m

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


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

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

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

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

183:デフォルトの名無しさん
08/08/12 16:00:44
サン・クスコ

184:デフォルトの名無しさん
08/08/12 16:13:38
どういたしマチュピチュ

185:デフォルトの名無しさん
08/08/12 16:46:23
マンコ=カパックがどうしたの?

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

187:デフォルトの名無しさん
08/08/13 05:04:55
nothrow

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

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

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

192:188
08/08/14 08:14:20

>>189-191

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

193:デフォルトの名無しさん
08/08/14 16:13:51
C++のコンパイルの仕方がわかりません

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

195:デフォルトの名無しさん
08/08/14 16:24:59
>>193はそういう質問なんだろうか

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

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

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

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

198:デフォルトの名無しさん
08/08/14 16:48:42
Visual Studio 2008だと思います

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

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

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

202:デフォルトの名無しさん
08/08/14 17:01:23
有難う御座います。解決しました

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

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

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

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

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

209:デフォルトの名無しさん
08/08/14 17:49:48
そうでした
もうしわけありませんでした

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

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

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

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

215:208
08/08/14 18:26:09
>>210
なるほど。

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

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

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

これじゃエラーか

double (*)[2] だな

218:デフォルトの名無しさん
08/08/14 19:22:40
ポインタ引数を使うのが普通かな。

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

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

220:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/14 20:11:45
>>220
×return pt1->num;
○return pt;

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

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

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

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

お騒がせしました。

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

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

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

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

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

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

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

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

233:デフォルトの名無しさん
08/08/14 21:57:13
>>232
そうですか。

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

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

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

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

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

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

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

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

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

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

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

243:デフォルトの名無しさん
08/08/15 16:10:33
>>242
シングルトンの方が見通しが良くね?

244:デフォルトの名無しさん
08/08/15 16:23:28
無理しないでグローバルな構造体でいいじゃん^^;

245:デフォルトの名無しさん
08/08/15 16:30:15
>>244
アクセッサは欲しい

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

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

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

248:デフォルトの名無しさん
08/08/15 18:40:17
ひょっとしてCですか?

249:デフォルトの名無しさん
08/08/15 18:50:45
ドラゴンブックに

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

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

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

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

254:デフォルトの名無しさん
08/08/16 13:53:34
>>253
ないです。

255:デフォルトの名無しさん
08/08/16 13:57:02
sizeofnakami()

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


257:デフォルトの名無しさん
08/08/16 14:19:00
>>253
環境依存でよければあるよ

258:デフォルトの名無しさん
08/08/16 17:05:41
わたし環境依存それわからなーず

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

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

261:デフォルトの名無しさん
08/08/16 17:47:01
不安ならなんでも括弧つけとけ、損はしない

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

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


263:デフォルトの名無しさん
08/08/16 17:54:21
把握

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

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

266:265
08/08/16 19:57:42
ごめんなさい。勘違いしていました。


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

269:デフォルトの名無しさん
08/08/17 10:52:00
読み辛いし、普通にtypedef使おうぜ・・・

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

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

272:デフォルトの名無しさん
08/08/17 17:05:16
typedefを使わないと理解出来ない馬鹿は去れ。

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

274:デフォルトの名無しさん
08/08/17 17:28:27
人の事はどうでもいいから自分の恥を知れ。

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

276:デフォルトの名無しさん
08/08/17 17:38:24
ageて言うほど悔しかったかワロスwwwwwwwww

277:デフォルトの名無しさん
08/08/17 17:39:14
来るものは拒まず、馬鹿は去れ

278:275
08/08/17 17:39:44
>>276
sageチェック外す癖が付いてたんだよ悪かったな

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

280:デフォルトの名無しさん
08/08/17 17:41:54
( ゚Д゚ )y-~~

281:デフォルトの名無しさん
08/08/17 17:57:51
>>272-280
なんという夏休み。

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

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

283:デフォルトの名無しさん
08/08/17 18:06:12
どう分からないんだ

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

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

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

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

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

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

288:デフォルトの名無しさん
08/08/17 19:56:26
typedefがわからんて…

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

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

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

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

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

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

293:289
08/08/17 22:40:10
>>291
動きました。ありがとうございます。
-> と ->* は全く違うんですね…。

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


294:デフォルトの名無しさん
08/08/17 22:47:11
__thiscallとか移植性ないんだからやめろよ

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

296:デフォルトの名無しさん
08/08/17 22:49:16
boost::ptr_vectorだったorz

297:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/18 20:58:41
>>297
これ何?

299:デフォルトの名無しさん
08/08/18 21:01:21
自分で考えろカス

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

301:デフォルトの名無しさん
08/08/18 21:19:30
それなら「ない」

302:デフォルトの名無しさん
08/08/18 21:20:20
>>297
なんか言えよ

303:デフォルトの名無しさん
08/08/18 21:22:36
void (**(func1()))();

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

304:デフォルトの名無しさん
08/08/18 21:56:09
何故括弧を一つ増やしたし

305:デフォルトの名無しさん
08/08/19 07:30:48
c/c++で開発経験者にお聞きしたいのですが、
コボルみたいにコードインスペクションは現場でやりますか
また、ソースを読み上げたりハードコピーにマーカーでチェック、机上チェックなんかも
やったりしますか?

306:デフォルトの名無しさん
08/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
08/08/19 07:37:57
Obj-CのNSLog();使ってエラー表示させてるけどそこは気にしない方向でお願いします。
NSLog([NSString stringWithFormat:@"Send Error:%d",errno]);

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

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


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


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

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

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

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

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

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

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch