【初心者歓迎】C/C++室 Ver.58【環境依存OK】
at TECH
1:デフォルトの名無しさん
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
>>151d!
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){〜
みたいな意味ないことしてた…
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4367日前に更新/83 KB
担当:undef