【初心者歓迎】C/C++室 Ver.58【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/08/06(水) 20:56:17ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.57【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1216215558/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0003デフォルトの名無しさん
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: : : :\ 変な勘違いしないでよね!
0004デフォルトの名無しさん
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/ イ / ノ
0005デフォルトの名無しさん
2008/08/07(木) 01:34:19つかさちゃんきゃわあああああああああああ!!!!!!!!!!!!
つかさちゃんとちゅっちゅしたいよ〜
0006デフォルトの名無しさん
2008/08/07(木) 01:47:42普通に実行するとエラー吐いて終了してしまいます。こういう場合どんな原因が考えられますか?
0007デフォルトの名無しさん
2008/08/07(木) 01:49:47ポインタが初期化されていない
0008デフォルトの名無しさん
2008/08/07(木) 16:54:510009デフォルトの名無しさん
2008/08/08(金) 00:49:32while( i != 7.0f) {
i += 0.1f;
}
これだとwhileで7が認識されず終わらない。
0.2とか色々数値を変えても終わらない。
でもi += 1だと終わる。
なぜか 1を半分に割っていく数値0.5,0.25.0.125といった数値なら抜けれる。
謎過ぎてもう頭がパーンしそう。
誰か原因わかる人居ますか?
0010デフォルトの名無しさん
2008/08/08(金) 00:54:18そこまで分かってるなら、もう分かるだろ。
0011デフォルトの名無しさん
2008/08/08(金) 00:54:549割自分で答えが導けてるじゃないか
2進数で小数を表現すると、0.5、0.25、0.125…しか正確に表せないからだよ
でも丸めが出るから処理系によって上手く「動いてしまう」ときもある。
0012デフォルトの名無しさん
2008/08/08(金) 00:55:100013デフォルトの名無しさん
2008/08/08(金) 00:56:02浮動小数点数(float/double)で表現できる数値について
0014デフォルトの名無しさん
2008/08/08(金) 00:57:28>なぜか 1を半分に割っていく数値0.5,0.25.0.125といった数値なら抜けれる。
これは、そのヒントっぽいな。本人はわかってなかったり。
0015デフォルトの名無しさん
2008/08/08(金) 01:00:46そんな法則があったのかw
自力でその法則を発見した俺は数学者になる素質があるな、と思った。
とりあえずおまいらありがとう。
0016デフォルトの名無しさん
2008/08/08(金) 01:03:130017デフォルトの名無しさん
2008/08/08(金) 01:18:35すばらしい。
0018デフォルトの名無しさん
2008/08/08(金) 01:22:30ttp://jp.youtube.com/watch?v=c2SURtxy6i0
0019デフォルトの名無しさん
2008/08/08(金) 01:58:580020デフォルトの名無しさん
2008/08/08(金) 10:28:33一行ごとにもじれすを抜き出す方法を教えてくださいm(_ _)m
0021デフォルトの名無しさん
2008/08/08(金) 10:53:100022デフォルトの名無しさん
2008/08/08(金) 10:55:11fgets()は? あるいはcin.getline()とか。
0023デフォルトの名無しさん
2008/08/08(金) 11:47:26上記ファイルの内容は、キュー構造をint型配列を用いて実装したものです。
これは、リストを用いてキュー構造を実装したものと比較して、完全に劣るものでしょうか?
占有するメモリ量の点で劣っているのは分かっています。
0024デフォルトの名無しさん
2008/08/08(金) 12:08:50XP 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%
002524
2008/08/08(金) 12:11:15CString 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;
}
0026デフォルトの名無しさん
2008/08/08(金) 12:15:230でターミネートしてないだけじゃない?
MB2WC()のlenをlen+1にすれば解決する予感。
0027デフォルトの名無しさん
2008/08/08(金) 12:39:28たぶん配列のキューの方が速い
要素を追加/削除するたびにメモリの確保/解放をせずに済む
リストのキューは、追加/削除するたびにノードを確保/解放する必要がある
メモリ効率は、配列のキューは要素が空いててもその分のメモリを解放できない点で無駄があるが、
リストのキューも要素ごとに次のノードを指すポインタが必要という点でやはり無駄な部分がある
どっちが特に優れているというわけではない
状況に応じて使い分けるもの
002824
2008/08/08(金) 12:46:26解決しました。ありがとうございます。
0029デフォルトの名無しさん
2008/08/08(金) 12:55:17ありがとうございました。
キューのサンプルを探したところ、リストを用いたものばかりだったので
疑問に思い、質問した次第です。
0030デフォルトの名無しさん
2008/08/08(金) 12:57:540031デフォルトの名無しさん
2008/08/08(金) 14:41:500032デフォルトの名無しさん
2008/08/08(金) 14:58:10ありがとうございます。
わざわざ作らずとも、すでに用意されているのですね
0033デフォルトの名無しさん
2008/08/08(金) 21:09:10C は初心者ながらも単機能な 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() して大丈夫なのでしょうか。
003432
2008/08/08(金) 21:11:20libevent/event.h (BSDL) http://toku.xdisc.net/cgi/up/vcc/nm0687.txt
libevent/buffer.c (BSDL) http://toku.xdisc.net/cgi/up/vcc/nm0688.txt
testcode.c (as-is でお願いします) http://toku.xdisc.net/cgi/up/vcc/nm0689.txt
0035デフォルトの名無しさん
2008/08/08(金) 21:20:12if(0x609100 != NULL) free(0x609100);
free(0x606080);
になると思いますよ
0036デフォルトの名無しさん
2008/08/08(金) 21:23:53free() はポインタ ptr が指すメモリ空間を解放する。
このポインタは、以前に呼び出された malloc(), calloc(), realloc() のいずれかが返した値でなければならない。
これ以外のポインタを指定したり、すでに free(ptr) が実行されていたりした場合の動作は定義されていない。
ptr が NULL の場合には、なんの動作も行われない。
003732
2008/08/08(金) 21:36:55よくわかりました。ものすごく勘違いしていました!
free(buffer->buffer); しているものと空目していました。
ありがとうございます!
0038デフォルトの名無しさん
2008/08/08(金) 22:22:48呼び出すことはナンセンスと書いてあるが、実際どういう弊害があるんですか?
これでいい気がするんだけど。
ClassA& operator=(const ClassA& rhs)
{
メンバ変数 = rhs.メンバ変数;
return (*this);
}
ClassA::ClassA(const ClassA& rhs)
{
(*this) = rhs;
}
0039デフォルトの名無しさん
2008/08/08(金) 22:53:35その例だと意味無いが
0040デフォルトの名無しさん
2008/08/08(金) 23:52:12もしoperator =はthisがすでに初期化済みであることを前提にしたコードを書いた場合、
コピーコンストラクタの中では初期化されていないので=演算子を使えないという事態に陥ってしまう。
そうでないとしても、時と場合にもよるが一般的にデフォルト構築+代入演算はコピーコンストラクタよりコストがかかるとされている。
Effective C++に載っていなかった気がするからここに書くけど、
こうやって、=演算子はコピーコンストラクタ(とswap)を使って実装できる。元ネタはExceptional C++。
ClassA& operator=(const ClassA& rhs)
{
ClassA tmp(*this);
tmp.swap(rhs);
return *this;
}
0041デフォルトの名無しさん
2008/08/08(金) 23:58:59「覚えておくこと」のところに共通の処理は別の関数に実装すれば良い
みたいなこと書いてあるし
「代入は既に存在するモノの値を変えるのに使う。
まだ存在していないモノに対して行うのはおかしい」って事だと読み取ったけど
0042デフォルトの名無しさん
2008/08/09(土) 07:47:52byte *p=new byte [1000];
int size=sizeof(p);
ってしてもsizeof(p)が実行されなんですが何で?
0043デフォルトの名無しさん
2008/08/09(土) 08:04:28実行されます。
ポインタのサイズが返ります。
0044デフォルトの名無しさん
2008/08/09(土) 08:42:21どうして>42みたいな質問する奴ってこれだけの文章もまともに書けないんだろうな。
しかも、ちょっと探せばすぐに見つかるのに。
004538
2008/08/09(土) 10:55:23参考になります。
コストはかかるがoperator=をそれなりに実装しておけば問題ないってことですかね。
0046デフォルトの名無しさん
2008/08/09(土) 12:12:19高速であればテーブルじゃなくてもいいです
環境はcygwin上のgccで、math.hとかはあります
0047デフォルトの名無しさん
2008/08/09(土) 12:15:15必要な精度、引数の制約条件は?
0049デフォルトの名無しさん
2008/08/09(土) 14:02:30引数ってんだから、その形式とか範囲とかじゃね?
三角関数系はゲームとかだと360度やラジアンでやるより
一周を0xffや0xffffにしたほうが扱いやすいし…、とかそういう
ことだと思うが。あ、おれ47じゃないから
0050デフォルトの名無しさん
2008/08/09(土) 14:23:07形式はfloatで1周1024で分割
ってかんじでいいんですかね?
0051デフォルトの名無しさん
2008/08/09(土) 14:38:220052デフォルトの名無しさん
2008/08/09(土) 14:39:3045度ごとに場合分けして、小さい方を大きい方で割って、
まあ2048倍して、テーブル2048個から0〜1023を返すようにすりゃいんじゃない?
倍にしてるのは気分的に。
0053デフォルトの名無しさん
2008/08/09(土) 14:40:501/8のテーブル量で済むわ
0054デフォルトの名無しさん
2008/08/09(土) 16:25:420055デフォルトの名無しさん
2008/08/09(土) 16:33:17いつも設計に悩まされ、綺麗な形にできません。
起動した瞬間開始する単純な2Dシューティングから始まり、
メニュー画面を追加し、一時停止画面を追加し、
エロゲーみたいな会話画面をはさみ、3D描画を入れたりと、
機能追加するごとに、設計がぐだぐだで汚くなっていきます。
プログラムは2chとグーグルだけで覚えたので、
他人が作ったアプリのソース全体を見たことがないんですが、
アプリケーション全体の設計を勉強するにはどうすればいいでしょうか?
何かお勧めの本があったら教えてもらえませんか。
0056デフォルトの名無しさん
2008/08/09(土) 16:34:220057デフォルトの名無しさん
2008/08/09(土) 16:43:22適当なデザインパターンの本を読んでふむふむと思いつつ、
あとは習うより慣れろで行くしかないと思う。
俺も同じような時期があったから一言だけ言わせてもらうと、
『本当に必要のないものは実装するな』の一言に尽きる。
>>54
こたんはなんか犯罪の香り
0058デフォルトの名無しさん
2008/08/09(土) 17:08:08まずは構造化プログラミングですね。>57の言うようにデザインパターンとかってのもあるけど、
>起動した瞬間開始する単純な2Dシューティングから始まり、
>メニュー画面を追加し、一時停止画面を追加し、
>エロゲーみたいな会話画面をはさみ、3D描画を入れたりと、
>機能追加するごとに、設計がぐだぐだで汚くなっていきます。
を見る限りでは、オブジェクトとのマッピングや責務分割を考えるよりも、スパゲッティっぽくなってるのをちゃんと整理する力をつけるのが先かと。
あと、今時、全てを一つのEXEで作らなくても良い、と言うのも重要。
0059デフォルトの名無しさん
2008/08/09(土) 17:25:520060デフォルトの名無しさん
2008/08/09(土) 19:09:19ありがとう
ずっと確保した容量が返ってくるものだと勘違いして使ってた
0061デフォルトの名無しさん
2008/08/09(土) 19:42:010062デフォルトの名無しさん
2008/08/09(土) 20:15:29× VC限定
0063デフォルトの名無しさん
2008/08/09(土) 20:17:03ワロタ
006455
2008/08/09(土) 20:31:01まだ、何ができるかをちゃんと把握してないので、
思いついたものや試しをどんどん追加実装してるのが一番問題っぽいですが、
習作なので仕方ないかなとも思います。
実装するものの全体像を把握するまで、慣れるしかないですかね。
>>58
EXEを分割できるとは知りませんでした。
そういう場合、複数EXEで共用するモジュールを作ったりするんでしょうか。
それともまったく独立して複数作るんですか?
0065デフォルトの名無しさん
2008/08/09(土) 20:57:30ゲームプログラマーから一言。
あとからいくらでも追加に耐えられるように組むこと。
全体像なんて最初から最後まで同じである保証なんてどこにも無いよ〜
>EXEを分割できるとは知りませんでした。
ニュアンスが違うんじゃないか?
ゲームだったらEXE一個だよ。分割なんか考えなくていい。
まあ機能ごとにDLLに分解するのはあると思うが、まだそんなこと考えなくてもいいだろう。
0066デフォルトの名無しさん
2008/08/09(土) 21:00:01拡張性を無視して作って変更が出たら作り直すって手法なかったっけ?
一回やってみたいと思ってるんだが勇気がなんだ
0067デフォルトの名無しさん
2008/08/09(土) 21:02:130068デフォルトの名無しさん
2008/08/09(土) 21:04:26>拡張性を無視して作って変更が出たら作り直すって手法なかったっけ?
かってにすればーw
冗談じゃねー、1回作り直すのに数年かかるわ!
0069デフォルトの名無しさん
2008/08/09(土) 21:05:360070デフォルトの名無しさん
2008/08/09(土) 21:09:07ああ、そんなんだった、調べてみる
>>68
>冗談じゃねー、1回作り直すのに数年かかるわ!
俺もそう思うんだ、だからやってみたことはない。
でも手法として確立してるからにはどうにかなるのだろうとは思う。
ちょっと調べてみていけそうなら今度提案してみる。
0071デフォルトの名無しさん
2008/08/09(土) 21:14:430072デフォルトの名無しさん
2008/08/09(土) 21:32:10また質問になりますすみません。
環境は>>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[]){略}
どこがいけないのでしょうか?
0073デフォルトの名無しさん
2008/08/09(土) 21:35:51宣言のときなら struct hoge a = {0}; でできると思いますが。
全ての中身に対して = 0 をするコードを書くしかないですか。
0074デフォルトの名無しさん
2008/08/09(土) 21:37:22それ以外の場合は0を意味する値を代入するしかありません。
0075デフォルトの名無しさん
2008/08/09(土) 21:44:03struct hoge a;
...;
struct hoge zero = {0};
a = zero;
0076デフォルトの名無しさん
2008/08/09(土) 21:52:470077デフォルトの名無しさん
2008/08/09(土) 21:53:49Shot(ctrlmode, bullet, &MyShip, shot);
void Shot(int shot_ctrl_flg, Image* Star,MyShip *MyShip,Bullet shot[]){略}
0078デフォルトの名無しさん
2008/08/09(土) 21:55:23引数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);
こうじゃね?
0079デフォルトの名無しさん
2008/08/09(土) 22:16:58配列がまずいのですかね?
両方ともやりましたが結果は同じでした・・・
0080デフォルトの名無しさん
2008/08/09(土) 22:19:240081デフォルトの名無しさん
2008/08/09(土) 22:24:44結果は同じって同じエラーってこと?
0082デフォルトの名無しさん
2008/08/09(土) 22:55:22メモリは4G積んでるんでメモリが足りなくて確保できないってことではないと思うんですが
newで確保できるのは1521090492byteまでって決まってたりするんですか?
0083デフォルトの名無しさん
2008/08/09(土) 22:57:400084デフォルトの名無しさん
2008/08/09(土) 23:09:26他にもOSとかコンパイラとか色々あるじゃん。書くことが。
0085デフォルトの名無しさん
2008/08/09(土) 23:09:59mlock.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;
}
0086デフォルトの名無しさん
2008/08/09(土) 23:13:25そもそもWindowsでは32ビットアプリで32ビット(2GiB)以上のメモリ空間をアクセスする単純な手段は提供されていません。
大人しく64ビットアプリを作るか、ありえないメモリ戦略を諦めることをお勧めします。
0087デフォルトの名無しさん
2008/08/09(土) 23:13:45タスクマネージャでみるとメモリのコミットチャージは
newで確保前は470MB/3826MBで充分空いてます
0088デフォルトの名無しさん
2008/08/09(土) 23:13:490089デフォルトの名無しさん
2008/08/09(土) 23:17:44ありがとうございます。32ビットでも2Gまでならいけるはずですよね
とりあえずこんなに確保するつもりは無いんですが、色々試したら[1521090492]
を超えたところでエラーがでたので興味本位できいてみただけです。
>>88
ググったら色々情報でてきた。あとは自分で調べてみることにします
0090デフォルトの名無しさん
2008/08/09(土) 23:23:14ゲーム作ったことないけどテストパターンが割りと膨大になりそうにおもう。
0091デフォルトの名無しさん
2008/08/09(土) 23:34:15「壮大な一歩を踏み出すぞ〜」と意気込んで、とりあえずwxWidgetsプロジェクトではなく
以下のコードをビルド、出来上がったexeをコマンドプロンプトにて実行しました。
#include <iostream>
using namespace std;
int main()
{
cout << "こんにちわ世界" << endl;
}
日本語は文字化けしてしまったので、プロンプトのフォントをMSゴシックに変えたんですが
それでも駄目で、壮大な一歩を踏み外してしまいました。
Unicodeがらみの文字化けというところまでは分かるのですが、解決策が分かりません。
Code::Blocks WikiのWxWindowsQuickRefに書かれているBuild wxWidgetsはすでに終えたのですが、
まだwxWidgetsを使う所まで行ってないので、関係ないだろうし。
Code::BlocksとwxWidgetsでC++を始めようと考えていたのですが、かなり道は険しいようです……。
0092デフォルトの名無しさん
2008/08/09(土) 23:41:13ソースコードの文字コードを変えてみては?
0093デフォルトの名無しさん
2008/08/09(土) 23:43:182歩目も怪しい。
0094デフォルトの名無しさん
2008/08/10(日) 00:00:03C++ならmainでreturnしないとreturn 0:したことになるって規則があって問題ない。
省略していいかどうかはまた別問題。
0095デフォルトの名無しさん
2008/08/10(日) 00:02:54単に日本語を表示したいのか
0096デフォルトの名無しさん
2008/08/10(日) 00:23:39g++なら--input-charset=cp932 --exec-charset=cp932でどう?
Code::Blocksでどう設定するかは知らないけど。
0097デフォルトの名無しさん
2008/08/10(日) 01:00:100098デフォルトの名無しさん
2008/08/10(日) 05:48:46struct hoge {
int x;
};
hoge *ptr;
hoge &ref = *ptr;
ptr = new hoge; //参照を作った後に確保
ref.x = 1; //参照からアクセス
0099デフォルトの名無しさん
2008/08/10(日) 06:09:090100デフォルトの名無しさん
2008/08/10(日) 08:14:01問題あり
0101デフォルトの名無しさん
2008/08/10(日) 08:23:27refの指している先はnewされたところではない。
0102デフォルトの名無しさん
2008/08/10(日) 08:32:10hoge &ref = *ptr;
のところで落ちるんじゃない?
ptrは無効なポインタだからね、この時点で。
0103デフォルトの名無しさん
2008/08/10(日) 08:43:02そこから見直すべきだな。
0104デフォルトの名無しさん
2008/08/10(日) 08:44:01試して落ちたの?
中身へのアクセスは無いからそこじゃ落ちないと思うけど。俺は試してないw
0105デフォルトの名無しさん
2008/08/10(日) 08:49:34>>80
それはまずいですかね?
別の名前に変えてみます
>>81
言葉が足りませんでした、すみません
まさにその通りです
0106デフォルトの名無しさん
2008/08/10(日) 08:52:57そうかもね
「動かしてない」って書いたジャン・・
0107デフォルトの名無しさん
2008/08/10(日) 09:05:21実装的にも、大抵は「どこを指してるかわからないポインタ変数の指すアドレス」をコピーして別の変数に保持するだけだろうから
HDDをフォーマットしてスパムメールを送りまくってももおかしくない、はず。
0108デフォルトの名無しさん
2008/08/10(日) 09:56:02おかしいと思います。文章が。
0109デフォルトの名無しさん
2008/08/10(日) 11:53:580110デフォルトの名無しさん
2008/08/10(日) 11:57:43中学生の太もも??
いいももだよねーーー
ハァハァハァハァハァハァハァ
0111デフォルトの名無しさん
2008/08/10(日) 12:46:00(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)成功
}
}
0112デフォルトの名無しさん
2008/08/10(日) 12:57:20MYTYPE::hogeがconstでないから、const MYTYPEに対してhogeを呼べない。
試しに↓やってみ。
const MYTYPE x;
x.hoge();
↓のようにhogeにconstを付ければok。
struct MYTYPE {
void hoge() const;
};
void MYTYPE::hoge() const {
...
}
0113111
2008/08/10(日) 13:36:10ありがとうございます。関数にconstをつけることで(1)(2)ともにコンパイルに成功することができました。ただ、
>const MYTYPE x;
のように、変数宣言の時にconstをつけた場合に
>void hoge() cosnt;
とすればよいと自分なりに解釈したのですが、変数宣言は上で書いたとおり
map<string, vector<MYTYPE> > mapA;
とMYTYPEにconstをつけていません。どこでconstがついたのか教えていただけないでしょうか。
たびたびで申し訳ありませんが、よろしくお願いします。
0114デフォルトの名無しさん
2008/08/10(日) 13:46:470115デフォルトの名無しさん
2008/08/10(日) 14:25:37>どこでconstがついたのか
根本的に勘違いしてる。オブジェクトがconstかどうかと、
メンバ関数のconst指定は、まったく無関係ではないが
基本的に別物
0116111
2008/08/10(日) 14:27:47const_iterator → iterator とすると、エラーになりませんでした。
イテレータについてまだ理解していないので、勉強したいと思います。
ありがとうございました。
0117111
2008/08/10(日) 14:34:27>>113の解釈は間違っているということですね。
オブジェクトのconstとメンバ関数のconst指定について調べていきたいと思います。
ご指摘、ありがとうございます。
0118デフォルトの名無しさん
2008/08/10(日) 14:40:31世の中難しいものだ
0119デフォルトの名無しさん
2008/08/10(日) 14:44:38イテレータについての理解があまりなく、参考書丸写ししてました。
0120デフォルトの名無しさん
2008/08/10(日) 17:12:14この関数はメモリ上で連続していない配列に対しても動作は保証されているんでしょうか?
0121デフォルトの名無しさん
2008/08/10(日) 17:16:50各要素は連続している必要があります。
0123120
2008/08/10(日) 17:32:00お恥ずかしい限りです。
0124デフォルトの名無しさん
2008/08/10(日) 19:07:36ttp://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; の記述をヘッダファイル内に移動させればコンパイル通りますが、
解説しているサイトなどを見る限り、これは良くない書き方のような気がします。
どこに問題があるのか、ご教授ください。
0125デフォルトの名無しさん
2008/08/10(日) 19:11:02リリースビルドした実行ファイルを覗くと、pdbファイルへのパスがそのまま残っているのですが、
これは他の数、例えば0x00等で塗りつぶしてしまってもいいのでしょうか?
問題なく動いているように見えますが、異常終了した際になにか不具合がでたりしませんか?
0126デフォルトの名無しさん
2008/08/10(日) 19:12:35失礼しました、コンパイラはBorland C++ 5.5.1です。
0127デフォルトの名無しさん
2008/08/10(日) 19:25:40BCCなら、多分Makefileの問題じゃないかね?
コンパイルするときに分割コンパイルするオプション付いてる?
-oか何かだと思うけど。
0128デフォルトの名無しさん
2008/08/10(日) 19:27:39多分-c
0129デフォルトの名無しさん
2008/08/10(日) 19:38:36ありがとうございます!ご指摘のとおりでした。
0130デフォルトの名無しさん
2008/08/10(日) 20:31:47そんな面倒なことしなくてもコンパイラオプションで消せる。
0131デフォルトの名無しさん
2008/08/10(日) 21:29:52ありがとうございます。
なんでデフォでリリースビルドにデバッグ情報埋め込んでるのやら……
0132デフォルトの名無しさん
2008/08/10(日) 21:35:02delete時にデストラクタが呼ばれるでしょうか?
class test
{
int *p;
public:
test(){
p = new int();
}
~test(){
delete p;
}
};
int main()
{
void *ptr = (void*)(new test());
delete ptr;
return 0;
}
0133デフォルトの名無しさん
2008/08/10(日) 21:41:28鼻から悪魔。
0134デフォルトの名無しさん
2008/08/10(日) 21:42:010135デフォルトの名無しさん
2008/08/10(日) 21:49:05delete p;
の上にprintfを入れて試してみては?
0137デフォルトの名無しさん
2008/08/10(日) 22:13:190138デフォルトの名無しさん
2008/08/10(日) 22:15:03new void;とかできませんよね?なぜ?どうして?
0139デフォルトの名無しさん
2008/08/10(日) 22:20:42リリース版でもデバッグできるって結構便利だと俺は思う。
>>138
エラーにしたいという要望だけはboost::checked_delete使えば叶う。
あと、boost::shared_ptr<void>だとデストラクタが呼ばれるというマジックもある。
0141デフォルトの名無しさん
2008/08/10(日) 23:59:16gccで構造体を = {0} して初期化すると、「最初以外の、他の中身の初期化子(?)がない」っていう警告が出るんだけど、
これは無視してもいいの?
0142デフォルトの名無しさん
2008/08/11(月) 00:01:160143デフォルトの名無しさん
2008/08/11(月) 00:15:36struct 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 ってやってるんだけど、問題ないんだったら、これだけ警告でないようにできないかな…
0144デフォルトの名無しさん
2008/08/11(月) 00:32:29struct tm a = {0, 0, 0, 0, 0, 0, 0, 0, 0};
にすると出なくなるような気がしないでもない。
0145デフォルトの名無しさん
2008/08/11(月) 10:02:02offsetに使用するパラメータが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)>;
よろしくお願いいたします
0146デフォルトの名無しさん
2008/08/11(月) 10:09:31そもそもクラス(非PODか?)では、変数が宣言順に配置されるという保証がなかったと思う。
危険コードかもよ。
0147デフォルトの名無しさん
2008/08/11(月) 10:15:39こらこら
クラスは変数が宣言順に配置されるぞ
メンバ関数だけは別扱いだけど
メンバ関数ポインタも宣言順に配置される
0148デフォルトの名無しさん
2008/08/11(月) 10:20:49そのコードの目的が分からん
offsetofを使わずに済むコードを考えた方がいいんじゃない
見てていらつくコードなんだけど
0149デフォルトの名無しさん
2008/08/11(月) 10:23:110150デフォルトの名無しさん
2008/08/11(月) 10:35:42}
と
else{
if{
}
}
とで内部的に違いありますか?
見た目的にネストは浅くした方がいいのかな?
0151デフォルトの名無しさん
2008/08/11(月) 10:36:40前者はelseの後に複文が書けない
後者は複文が書ける
それ以外は同じ
0152デフォルトの名無しさん
2008/08/11(月) 10:40:10非PODだと「変数が宣言順に配置されるという保証がない」ではなくて、
「offsetofマクロが正常動作する保証がない」だった。
(自分は規格を読んでないから↓の受け売りだけど)
ttp://www.kijineko.co.jp/tech/cppemb/alignment.html
まあ145のコード通りならPODだから問題なさそうだけど、
いつPODでなくなるか分からないから怖いな。
0153デフォルトの名無しさん
2008/08/11(月) 10:43:230154デフォルトの名無しさん
2008/08/11(月) 14:01:01一般論?
なら順序が保証されるのはアクセス指定子が間に挟まらない場合だけだった気がする。
0156デフォルトの名無しさん
2008/08/11(月) 17:40:19ソースの上下と逆だった覚えがある。
それ以来構造体のメンバの順番に依存したコードは書かなく
なったので、構造体が拡張されたC++ではどうなのか気にした
こともないやw
0157デフォルトの名無しさん
2008/08/11(月) 17:43:390158デフォルトの名無しさん
2008/08/11(月) 20:29:460159デフォルトの名無しさん
2008/08/11(月) 20:32:15されます
宣言順です
並べた初期化子の順ではありません
0160デフォルトの名無しさん
2008/08/11(月) 20:44:050161デフォルトの名無しさん
2008/08/11(月) 20:45:56struct hoge {
int a;
int b;
};
hoge h = {1,2};//h.a==1,h.b==2
0162デフォルトの名無しさん
2008/08/11(月) 20:46:48それでやっと最低限。しかも資格持っていないC言語分かってる
連中とまったく対等くらい
0163デフォルトの名無しさん
2008/08/11(月) 20:48:41あの程度は研修で叩き込まれたらすぐ身に付くレベル
他の要素のほうが重要視されるだろう
0164デフォルトの名無しさん
2008/08/11(月) 20:52:45スレ違いの質問に答えていただきありがとうございました。
0165デフォルトの名無しさん
2008/08/11(月) 22:01:41ゲームプログラマーとして(大手に)就職したいなら、普通に
大卒か院卒で、趣味でゲーム一本でも作っておけ。
チームで作ってメインプログラマ兼取りまとめ役とか
だとポイント高いよ。
0166デフォルトの名無しさん
2008/08/12(火) 00:41:38これはどういう意味ですか?
こんな感じで使われているようです。
node->setMaterialFlag(EMF_LIGHTING, true);
また何と呼ばれてますか?
->でgoogleで検索かけてもかからないので困ってます。
0167デフォルトの名無しさん
2008/08/12(火) 00:44:37アロー演算子
(*node).setMaterialFlag(EMF_LIGHTING, true)
の書き方が違うだけ
0168デフォルトの名無しさん
2008/08/12(火) 00:45:51class CHoge
{
setMaterialFlag(XXX, bool){}
};
0169デフォルトの名無しさん
2008/08/12(火) 00:50:21わかりました。
即レスしていただきありがとうございました。
0170デフォルトの名無しさん
2008/08/12(火) 01:01:33どちらかに統一すると困るケースが思いつかないのですが、
何か理由があるのでしょうか?
0171デフォルトの名無しさん
2008/08/12(火) 01:05:54*(p + i)で事が足りるのにp[i]と書けるのと同じ理由で、
(* p).mで事が足りるけれどもp->mと書けるようにしてある。
0172デフォルトの名無しさん
2008/08/12(火) 01:19:400173デフォルトの名無しさん
2008/08/12(火) 01:42:220174デフォルトの名無しさん
2008/08/12(火) 01:51:12ジェネリックプログラムで楽で、メリットがあるのではと思ったんですよ。
そういうメリットを捨てて*や->を使わせてるのは、
ポインタからメンバにアクセスするのに*をつかわないで直接
ptr.mで良いようにしてしまうと、言語仕様として何か不都合が
あるからなのかなと、疑問に思ったわけで。
0175デフォルトの名無しさん
2008/08/12(火) 02:10:080176デフォルトの名無しさん
2008/08/12(火) 02:21:390177デフォルトの名無しさん
2008/08/12(火) 02:38:000178デフォルトの名無しさん
2008/08/12(火) 08:35:01C++では「.」はオーバーロードできない(させない)という差がある。
->はオーバーロードできる。いろんな都合で現状のルールに落ち
着いてるようだ。
0179デフォルトの名無しさん
2008/08/12(火) 09:23:530180デフォルトの名無しさん
2008/08/12(火) 10:05:56使っている環境のgccで警告を厳しくすると、stlに対して大量の警告がでてしまうので、うっとおしいんです
スクロールしないと見たい警告みれないですし
自分でstl側をいじれる環境ではないです
0181デフォルトの名無しさん
2008/08/12(火) 13:55:55A *a=new A[100];
A b[10][10];
とした時に
&((((*A)[10])a)[i][j]) - a == &(b[i][j]) - b
これって常に成り立ちますか?
0182デフォルトの名無しさん
2008/08/12(火) 14:08:37要するに要素数10の配列へのポインタへ強引にキャストして
成り立つかというわけでしょ。
そりゃ成り立つわ。
0183デフォルトの名無しさん
2008/08/12(火) 16:00:440184デフォルトの名無しさん
2008/08/12(火) 16:13:380185デフォルトの名無しさん
2008/08/12(火) 16:46:230186デフォルトの名無しさん
2008/08/13(水) 03:51:24ずっと
p=new int [1000];
if(p==NULL){〜
みたいな意味ないことしてた…
0187デフォルトの名無しさん
2008/08/13(水) 05:04:550188デフォルトの名無しさん
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;
}
0189デフォルトの名無しさん
2008/08/14(木) 06:19:58先頭から見て行くか別の文字コードにするしか手は無いよ。
0190デフォルトの名無しさん
2008/08/14(木) 06:49:20SJISの1バイト目領域⊂2バイト目領域だから、これはいかんともしがたい。
0191デフォルトの名無しさん
2008/08/14(木) 07:54:46律儀に先頭から見る必要は必ずしもないけれど、1バイトずつ遡る関数を作ったところで効率はさほどよくならないね。
0193デフォルトの名無しさん
2008/08/14(木) 16:13:510194デフォルトの名無しさん
2008/08/14(木) 16:15:11エイホが書いたドラゴンブックとか、アマゾンで「コンパイラ」関連の書籍を読んでみては?
0195デフォルトの名無しさん
2008/08/14(木) 16:24:59・ソースの拡張子をcppにしてみよう
・ccではなくc++コマンドを使おう
・makeのサフィックスルールなんかも気をつけよう
とかいうはなしかと思ってしまった
0196デフォルトの名無しさん
2008/08/14(木) 16:44:050197デフォルトの名無しさん
2008/08/14(木) 16:46:04それがわからなきゃこっちもエスパー回答しかできない
0198デフォルトの名無しさん
2008/08/14(木) 16:48:420199デフォルトの名無しさん
2008/08/14(木) 16:49:37コマンドプロンプトはあきらめて、普通にビルドしてはいけないのですか?
0200デフォルトの名無しさん
2008/08/14(木) 16:56:47でもその前に vcvars32.bat を実行してからにしてね。
0201デフォルトの名無しさん
2008/08/14(木) 16:57:07コマンドプロンプトの方が手軽に見えたので
0202デフォルトの名無しさん
2008/08/14(木) 17:01:230203デフォルトの名無しさん
2008/08/14(木) 17:14:100204デフォルトの名無しさん
2008/08/14(木) 17:16:58まずローカル変数を返さないように注意しろよ。
次に受け取った配列の先頭アドレスを返すようにするか、
もしくは配列そのものを返したければ構造体の中に配列を入れて
返すようにする。
0205デフォルトの名無しさん
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;
}
0206デフォルトの名無しさん
2008/08/14(木) 17:42:510207デフォルトの名無しさん
2008/08/14(木) 17:45:080208デフォルトの名無しさん
2008/08/14(木) 17:49:19これ笑いどころ?
0209デフォルトの名無しさん
2008/08/14(木) 17:49:48もうしわけありませんでした
0210デフォルトの名無しさん
2008/08/14(木) 17:54:39static領域に確保したらつまらないコードを吐くもんで
わざとそうした
0211デフォルトの名無しさん
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' に変換できません。
0212デフォルトの名無しさん
2008/08/14(木) 18:14:30>double [2]lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope) {
0213デフォルトの名無しさん
2008/08/14(木) 18:19:000214デフォルトの名無しさん
2008/08/14(木) 18:23:34どちらにしろ関数を抜けた時点で実体がなくなるわけだが。
構造体にして返すなり工夫をしろ
0216デフォルトの名無しさん
2008/08/14(木) 18:26:20アドバイスありがとうございました
0217デフォルトの名無しさん
2008/08/14(木) 18:26:25これじゃエラーか
double (*)[2] だな
0218デフォルトの名無しさん
2008/08/14(木) 19:22:40double lineIntersect(double *L1Point, double L1Slope, double *L2Point, double L2Slope, double* ans1, double* ans2)
0219211
2008/08/14(木) 19:32:40まだ途中ですができそうな気がしてきました。
結果が出たら報告します。
0220デフォルトの名無しさん
2008/08/14(木) 20:03:47using 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]をどこかで使えばいいのでしょうか。
0221デフォルトの名無しさん
2008/08/14(木) 20:11:45×return pt1->num;
○return pt;
0222デフォルトの名無しさん
2008/08/14(木) 20:12:56○struct Point *lineIntersect)
それから構造体へのポインタを渡しているので
戻り値は別にvoidでもよい。
0223デフォルトの名無しさん
2008/08/14(木) 20:13:53できんな。
返せたと思ったら配列へのポインタだった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;
}
0224デフォルトの名無しさん
2008/08/14(木) 20:37:03C言語の本をもう一度やり直してきます。
参考にしたいので誰か時間のある人がいたら
実行できるソース書き込んでもらえたら幸いです。
お騒がせしました。
0225デフォルトの名無しさん
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;
}
0226デフォルトの名無しさん
2008/08/14(木) 20:40:33すべき。他の変数は全部privateにしてしまう。
0227デフォルトの名無しさん
2008/08/14(木) 20:51:25#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;
}
0228デフォルトの名無しさん
2008/08/14(木) 20:56:25ありがとうございます!
参考にさせてもらいます。
0229デフォルトの名無しさん
2008/08/14(木) 21:37:19しかし日頃からC++を使い慣れている人には気持ちはわかる。
特にプログラムが大規模になればなるほどC流儀よりもC++流儀の方が
プログラムをコントロールする労力が遙かに少ない事がわかってくる。
namespaceの必要性も最初は理解できないだろうが、プログラムが大きく
なると必然的に必要性がわかってくるし。
0230デフォルトの名無しさん
2008/08/14(木) 21:49:25using 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さんのレスを見て自分なりにコードを書いてみました。無事実行できました。コードで直したほうがいいところがあったら指摘お願いします。
0231デフォルトの名無しさん
2008/08/14(木) 21:52:18いいんじゃね?特に問題となるような点はないみたいだ。
当初の質問の『関数から配列を返す』という話題からは
かけ離れてしまったけどそれはいいんだね?
0232デフォルトの名無しさん
2008/08/14(木) 21:54:00それも自分で納得できるように理解したいのですが
今のスキルじゃちょっときついのでC言語の本をもう一度読み返してからチャレンジしようと思います。
色々ありがとうございました。
0233デフォルトの名無しさん
2008/08/14(木) 21:57:13そうですか。
構造体へのポインタを使えば「データそのものを書き換えてくれ」と
委譲できるし、構造体を返すのは通常オーバーヘッドが大きいので
Cの流儀としてもあまりお勧めできない。
だから構造体へのポインタさえ理解すれば大抵の場合はそれでいいと思う。
0234デフォルトの名無しさん
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;
}
0235デフォルトの名無しさん
2008/08/14(木) 23:50:41//こんなの
template<class T>
} catch(T Obj) {
〜〜
0236デフォルトの名無しさん
2008/08/14(木) 23:58:59もう少し具体的に何がしたいのかを書けば誰か親切な人が考えてくれるかも。
0237デフォルトの名無しさん
2008/08/15(金) 12:14:24何がしたいのか分からないのでこれが解決になるのかは分からんが。
0238デフォルトの名無しさん
2008/08/15(金) 15:42:47class A:public Base{};
class B:public Base{};
みたいな感じで、
class A内で、Baseの値を変えたとき、
class BのBaseの値も変わっているようにするにはどうすればいいのでしょうか?
0239デフォルトの名無しさん
2008/08/15(金) 15:45:58そんなことをするくらいなら、class Bがclass Aを継承すればいいんじゃね?
0240デフォルトの名無しさん
2008/08/15(金) 15:48:580241デフォルトの名無しさん
2008/08/15(金) 16:00:19宣言と実態をごっちゃにしていそうな気がするので、何をしたいのか詳しく。
0242デフォルトの名無しさん
2008/08/15(金) 16:00:56メンバをすべてstaticにしたらかっこいいYO!
0243デフォルトの名無しさん
2008/08/15(金) 16:10:33シングルトンの方が見通しが良くね?
0244デフォルトの名無しさん
2008/08/15(金) 16:23:280245デフォルトの名無しさん
2008/08/15(金) 16:30:15アクセッサは欲しい
0246デフォルトの名無しさん
2008/08/15(金) 18:35:18使われている変数や関数を解析するパーサみたいなものが作りたいのですが、
こういうのって一行まるごと読んで正規表現で抜き出したりって方法でいいんでしょうか。
効率的といいますか、定石みたいなのがあれば教えてください。
0247デフォルトの名無しさん
2008/08/15(金) 18:39:400248デフォルトの名無しさん
2008/08/15(金) 18:40:170249デフォルトの名無しさん
2008/08/15(金) 18:50:450250デフォルトの名無しさん
2008/08/15(金) 18:59:100251デフォルトの名無しさん
2008/08/15(金) 19:00:24プリプロセッサに通した後のファイルを読むようにすると随分と楽になる
0252デフォルトの名無しさん
2008/08/15(金) 19:05:00Cのソースコードを正規表現でパースすることは原理的に不可能であることがわかってる。
厳密でなくていいならどうとでも出来るけど、
そんなことを考えるより既存のライブラリやツールで処理した方がてっとりばやい。
ctags とかではいかんのか?
0253デフォルトの名無しさん
2008/08/16(土) 13:52:50sizeof()だとポインタそのもののサイズが取得される
0254デフォルトの名無しさん
2008/08/16(土) 13:53:34ないです。
0255デフォルトの名無しさん
2008/08/16(土) 13:57:020256デフォルトの名無しさん
2008/08/16(土) 13:57:18呼び出した関数の中とか、現在のスコープにおいてその配列の要素数が
わからない場所でsizeofを使ってもそのポインタのサイズしか得られない。
要素数はなんらかの方法で渡さなきゃならない
0257デフォルトの名無しさん
2008/08/16(土) 14:19:00環境依存でよければあるよ
0258デフォルトの名無しさん
2008/08/16(土) 17:05:410259デフォルトの名無しさん
2008/08/16(土) 17:39:58それは標準の方法では決してできないことを平然とやってのける魔法の道具
しかし環境が変わると途端に動かなくなる諸刃の剣
0260デフォルトの名無しさん
2008/08/16(土) 17:40:35代入かつ否定 はこれでおk?
0261デフォルトの名無しさん
2008/08/16(土) 17:47:01ダメ。
代入をカッコで囲んでそれを否定する。
0263デフォルトの名無しさん
2008/08/16(土) 17:54:210264デフォルトの名無しさん
2008/08/16(土) 19:16:54int size=10;
void(**ppfunc)(void);
ppfunc=new void(*)(void)[size];
とかだとコンパイルが通らない。typedefするしかないのかね
0265デフォルトの名無しさん
2008/08/16(土) 19:55:53C的に考えても、(void **) の意味がよくわからないのですが。(void *) でだめですか?
0266265
2008/08/16(土) 19:57:420267デフォルトの名無しさん
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;
}
0268デフォルトの名無しさん
2008/08/16(土) 20:57:19new void(*[10])();が通らなかったので見逃してた。
なるほど、括弧で囲めばいいのか。ありがとう。
0269デフォルトの名無しさん
2008/08/17(日) 10:52:000270デフォルトの名無しさん
2008/08/17(日) 14:45:500271デフォルトの名無しさん
2008/08/17(日) 16:09:51基本は new T[N] で、この書式に合わせるためには typedef が必要だとわかっている。
typedef を使わない書き方を知る必要は無いよ。
0272デフォルトの名無しさん
2008/08/17(日) 17:05:160273デフォルトの名無しさん
2008/08/17(日) 17:18:440274デフォルトの名無しさん
2008/08/17(日) 17:28:270275デフォルトの名無しさん
2008/08/17(日) 17:37:460276デフォルトの名無しさん
2008/08/17(日) 17:38:240277デフォルトの名無しさん
2008/08/17(日) 17:39:140279デフォルトの名無しさん
2008/08/17(日) 17:41:090280デフォルトの名無しさん
2008/08/17(日) 17:41:540281デフォルトの名無しさん
2008/08/17(日) 17:57:51なんという夏休み。
>>264
今日び配列newなんてやめておいた方が良い。
std::vectorか、boost::arrayあたりを。
それにC++的には関数ポインタより関数オブジェクトを。
0282デフォルトの名無しさん
2008/08/17(日) 18:05:15教えてください
釣りではありません
本当です
0283デフォルトの名無しさん
2008/08/17(日) 18:06:120284デフォルトの名無しさん
2008/08/17(日) 18:07:51嫌だね。
人にプログラミング上の事まで強制される謂われはないし
0285デフォルトの名無しさん
2008/08/17(日) 18:09:09typedef int a; //変数宣言の形にtypedef修飾子をつけるとaという型の宣言になる
0286デフォルトの名無しさん
2008/08/17(日) 18:12:11そんな分かりにくい説明なんか読むんじゃありません
typedef 元の型 新しく宣言する型;
これで分からなかったらもうどうしようもない
0287デフォルトの名無しさん
2008/08/17(日) 18:22:05元の型 typedef 新しく宣言する型;
という元の型の後の修飾でも有効
0288デフォルトの名無しさん
2008/08/17(日) 19:56:260289デフォルトの名無しさん
2008/08/17(日) 20:44:19あるいは他のクラスのメンバ関数ポインタを保持させ、
呼び出すことは可能でしょうか?また、それはどのような方法でしょうか?
次レスに、実験したソースを付けます(インデントは全角スペース)。
プログラムの意図は、
・自身のメンバ関数ポインタによる自身のメンバ関数の呼び出し
・同じ変数による、他のクラスのメンバ関数ポインタによる他のクラスのメンバ関数の呼び出し
の二つです。
多少、形が変わっても構いません。
ご存知の方、よろしくお願いします。
0290289
2008/08/17(日) 20:45:42class 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;
}
0291デフォルトの名無しさん
2008/08/17(日) 21:17:24何がしたいのかいまいちわかんないけど、(Obj->*Obj->PFunc)();じゃね?
0292デフォルトの名無しさん
2008/08/17(日) 22:30:400293289
2008/08/17(日) 22:40:10動きました。ありがとうございます。
-> と ->* は全く違うんですね…。
>何がしたいのか
まず、あらかじめ別の型で動的確保した領域で、線形リストをクラスで組んでメンバ関数を使おうとしました。
しかし、その場合、仮想関数はなぜか使えませんでした。
仮想関数を呼び出すとコンパイラはエラーを出さないんですが、実行時に停止するんです。
そこで、関数ポインタを入れ替えることにし、このような形になりました。
かなり横着している気はしますが…。
0294デフォルトの名無しさん
2008/08/17(日) 22:47:110295デフォルトの名無しさん
2008/08/17(日) 22:48:290296デフォルトの名無しさん
2008/08/17(日) 22:49:160297デフォルトの名無しさん
2008/08/18(月) 14:43:56void (**(**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;
}
0298デフォルトの名無しさん
2008/08/18(月) 20:58:41これ何?
0299デフォルトの名無しさん
2008/08/18(月) 21:01:210300デフォルトの名無しさん
2008/08/18(月) 21:06:06ポインタとか関数へのポインタを返す関数へのポインタとかの
ソースをいきなり貼られてるのは何の意味があるのかと思って。
0301デフォルトの名無しさん
2008/08/18(月) 21:19:300302デフォルトの名無しさん
2008/08/18(月) 21:20:20なんか言えよ
0303デフォルトの名無しさん
2008/08/18(月) 21:22:36こんな関数のプロトタイプ宣言初めてみたぞ。
まあ書けばいくらでも複雑に書けるんだろうけど、
デザパタの生成パターンでもこんな書き方はしないし。
0304デフォルトの名無しさん
2008/08/18(月) 21:56:090305デフォルトの名無しさん
2008/08/19(火) 07:30:48コボルみたいにコードインスペクションは現場でやりますか
また、ソースを読み上げたりハードコピーにマーカーでチェック、机上チェックなんかも
やったりしますか?
0306デフォルトの名無しさん
2008/08/19(火) 07:33:51char *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;
0307306
2008/08/19(火) 07:37:57NSLog([NSString stringWithFormat:@"Send Error:%d",errno]);
は
printf("Send Error:%d¥n",errno);
とほぼ同じです。
0308デフォルトの名無しさん
2008/08/19(火) 07:44:27#define EBADF 9 /* Bad file number */
ならsocketIDが無効
socket( )の戻り値は確認してる?
0309デフォルトの名無しさん
2008/08/19(火) 07:54:04数値の意味がわからないなら文字列にすれば
NSLog([NSString stringWithFormat:@"Send Error:%s", strerror(errno)]);
0310306
2008/08/19(火) 08:15:49ありがとうございます。
socket()の戻り値は確認していて、connect()及びrecv()は問題なく行えています。
socketIDがガベージコレクションで解放されちゃったのかもしれないのでその辺りで探ってみます。
>>309
文字列にできたんですか。ありがとうございます。
0311デフォルトの名無しさん
2008/08/19(火) 09:07:33NSLog(@"format",...);
って書けた気がする。
0312デフォルトの名無しさん
2008/08/19(火) 23:22:50プロジェクトの性質によって色々だとは思うが、
絶対ないと断言できるのは「読み上げ」だな。
やれるもんならやってみろ。
0313デフォルトの名無しさん
2008/08/19(火) 23:39:10>ソースを読み上げたりハードコピーにマーカーでチェック、机上チェック
そんなアナクロなこと、COBOLでだってやりませんよ。
0314デフォルトの名無しさん
2008/08/19(火) 23:53:35俺は「コードレビュー」はやったことはある
紙の無駄だけどプリントアウトしたソース使って
ただ、(若手の)教育と(協力会社さんなどの)スキル把握(もちろん
悪いところは直してもらう)が主な目的だったんで、約束事として
つねにやってたわけじゃない
0315デフォルトの名無しさん
2008/08/20(水) 22:23:44同名のcppファイルでそのhppファイルをインクルードし、cppファイルにメンバ関数の
定義を記述したのですが、コンパイルしようとすると、cppファイルのメンバ関数定義に
ついて未解決の外部シンボルとなってしまいます。
WinMain関数の記述されているファイルにhppファイルだけでなく、直接
cppファイルをインクルードすると、コンパイルが通ります。
未解決の外部シンボル となってしまう原因は何なのでしょうか?
環境はVisual Studio2005です。
0316デフォルトの名無しさん
2008/08/20(水) 22:42:03cl main.cpp sub,cpp
とやるか
cl /c sub.cpp
cl main.cpp sub.obj
0317デフォルトの名無しさん
2008/08/20(水) 22:46:350318デフォルトの名無しさん
2008/08/20(水) 22:56:09ありがとうございます。コマンドラインから個別にコンパイルしてやるか、
同時に指定してやるかということですね。
もしかして、こういった構成だと、統合開発環境からはコンパイルできないのでしょうか…
>317
クラス、及びメンバ関数の宣言とメンバ関数の定義を両方ともhppファイルに
記述した状態だと動作していたので、それはないとは思うのですが…
0319デフォルトの名無しさん
2008/08/20(水) 23:12:050320デフォルトの名無しさん
2008/08/20(水) 23:16:11int HOGE::hogehoge(void)
{
}
0321デフォルトの名無しさん
2008/08/20(水) 23:18:50それはないw
何のための統合開発環境なんだかわからなくなるって
0322デフォルトの名無しさん
2008/08/20(水) 23:22:02すみません、原因がわかりました。
大騒ぎしといてわざわざレスまで頂いて、本当に申し訳ありませんでした。
テンプレートだから、っぽいです。
0323デフォルトの名無しさん
2008/08/20(水) 23:23:200324デフォルトの名無しさん
2008/08/20(水) 23:25:56それかComeau C++を使うか
0325デフォルトの名無しさん
2008/08/20(水) 23:42:08そういうのもあるのですね
でもヘッダに書かないとダメならダメでも良いんです。
広く外部に公開するものでもありませんので…
0326305
2008/08/20(水) 23:50:09んだけどこれ見えないようにできますか?
0328デフォルトの名無しさん
2008/08/21(木) 11:35:35ソースに書き込んでいるものは見えちゃってもしょうがないよね
暗号化するとかしかないんじゃない?
ソースで見える文字列は見えちゃうと思った方がいい
ありがとう。簡単にどうこうできるものじゃないのね
諦めます
0330デフォルトの名無しさん
2008/08/21(木) 12:12:070331デフォルトの名無しさん
2008/08/21(木) 15:00:030332デフォルトの名無しさん
2008/08/21(木) 23:09:22以外に、C++的にもっと良い方法はありますか?それとも上記の方法が無難でしょうか?
0333デフォルトの名無しさん
2008/08/21(木) 23:32:21C++的に?
こういうのは言語の問題ではない。数学の問題だ。
最良のアルゴリズムを導いて、それを言語で表すだけ。
0334デフォルトの名無しさん
2008/08/21(木) 23:40:44何か自分の知らない役立つ関数があるかもしれない…と思い質問しました。
三平方の定理の方法でも特に問題ないので、そっちを使いたいと思います
ありがとうございました。
0335デフォルトの名無しさん
2008/08/21(木) 23:55:51http://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html
boost についてはこちら
http://ja.wikipedia.org/wiki/Boost
0336デフォルトの名無しさん
2008/08/21(木) 23:56:03つhttp://pelab.nagaokaut.ac.jp/kondolab/convenience/source/hypot1.cpp
0337デフォルトの名無しさん
2008/08/22(金) 00:05:19ありがとうございます。今回の目的以外にもかなり便利なライブラリが
あるようですね。勉強になります。
>336
ずばりな回答ですね。ありがとうございます!
こういった形で公開されていると、非常に参考になります
0338デフォルトの名無しさん
2008/08/22(金) 00:21:58math.h にhypot()があるお
試しにコンパイルしてみたらやっぱり遅かったお(g++ 4.1, 1.6GHz)
register 着けたけど、sqrt()呼び出しが最速だったお
ライブラリは、汗で(ry
0339デフォルトの名無しさん
2008/08/22(金) 00:26:55DLLが作成したウィンドウがまだ残ってるのにFreeLibrary()して
DispatchMessage()が既に開放されたDLLのウィンドウプロシージャを呼ぼうとして落ちた。
0340デフォルトの名無しさん
2008/08/22(金) 00:30:00平方根ぐらいはFPUが1サイクルで計算できるから
下手に四則演算にばらさないほうがいいってことだろう。
0341デフォルトの名無しさん
2008/08/22(金) 00:53:156回も割り算してるからな。そりゃsqrtのほうが速いわ
0342デフォルトの名無しさん
2008/08/22(金) 01:06:150343デフォルトの名無しさん
2008/08/22(金) 01:27:240344デフォルトの名無しさん
2008/08/22(金) 01:50:230345338
2008/08/22(金) 02:40:24boostの実装ぱくったら爆速だったお、やほお。最適化(-O2)したけどね。
実際にあのアルゴリズムで解が出るとは、驚きだおおおお。
0346デフォルトの名無しさん
2008/08/22(金) 03:14:370347デフォルトの名無しさん
2008/08/22(金) 04:49:53「特定の条件」の判定は問題無くできたけど、肝心のファイルコピーが出来ません
void copy_last()のkekkaかkekkaAが毎回0で失敗しています
CopyFileは
BOOL CopyFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists
);
なので、ファイル名をLPCTSTRで
LPCTSTR moto=_T("last.dat");
LPCTSTR saki=_T("last2.dat");
int kekka=CopyFile(moto,saki,false);
こんな感じにしてるのですがダメでした
LPCTSTR moto="last.dat";
LPCTSTR saki="last2.dat";
でも同じでした
どのようにファイル名を指定すればコピー出来るのでしょうか?
環境はBCC Developer+Vista SP1+Borland C++builder 5.0 です
0348デフォルトの名無しさん
2008/08/22(金) 07:21:14Vistaか
書き込み権限の関係?
とりあえず
DWORD GetLastError(void);
でエラーの原因を絞れ
0349デフォルトの名無しさん
2008/08/22(金) 09:32:30絶対パスで指定すればいいなんてことはない?
0350デフォルトの名無しさん
2008/08/22(金) 12:00:36GetLastError、そういうのもあるのか!
32でした
ファイルサイズ取得する時に開いたハンドルが原因でした
CloseHandleで無事コピー出来ました
ありがとうございます
0351デフォルトの名無しさん
2008/08/22(金) 13:34:13そのコードに
x = x ? x : -x; // x = fabs(x); と同じ結果だが高速な方法。
って行があるんだけど、おかしくね?
-xになるのはx==0の時だけで、fabs(x)と同じになんてならないよね?
0352デフォルトの名無しさん
2008/08/22(金) 14:05:57ほんとうは分かってかってるだろwww
x >= x ? x : -x;
の間違いだってw
0353デフォルトの名無しさん
2008/08/22(金) 14:07:32だろJK
0354デフォルトの名無しさん
2008/08/22(金) 14:07:350355デフォルトの名無しさん
2008/08/22(金) 14:10:140356デフォルトの名無しさん
2008/08/22(金) 14:12:38環境に合わせて最適化してるfabsのほうが速いと思うんだが、2002年の記事だからそんなものなのか?
0357351
2008/08/22(金) 14:23:02しかし単純ミスにしては・・・。「負は偽」と誤解してそう。
0358デフォルトの名無しさん
2008/08/22(金) 15:20:520359デフォルトの名無しさん
2008/08/22(金) 16:12:14struct sample {
std::stringstream m_ssData;
}
みたいな記法を考えているんですが、変でしょうか??
mとかいらないですかね??
なにかセオリーのようなものがあったら教えていただきたく。
0360359
2008/08/22(金) 16:15:480361デフォルトの名無しさん
2008/08/22(金) 16:18:32ん?何か間違ったこと言ったか?
世の中で使われてる浮動小数点形式は、符号ビットを0にするという
比較的簡単な操作だけで絶対値が求まるようにできている。
それに対して、浮動小数点数が0より大きいかどうかを判断するには、
符号ビットを見ただけでは十分ではなく、値全体を眺めてNaNでないことを
確かめないといけないので、より時間がかかる。
だから、0と比較→符号反転は明らかに無駄。
0362デフォルトの名無しさん
2008/08/22(金) 16:19:59クラス名・変数名に迷ったら書き込むスレ。Part12
http://pc11.2ch.net/test/read.cgi/tech/1206118762/
0363359
2008/08/22(金) 16:21:050364デフォルトの名無しさん
2008/08/22(金) 16:46:09x &= 0x7FFFFFFF
みたいなことはできないのですか?
0365デフォルトの名無しさん
2008/08/22(金) 16:48:50やればいいんじゃないですか?
0366デフォルトの名無しさん
2008/08/22(金) 18:17:54これからその値を取り出してintでもlongにでも入れたいんだが。。
どうすればいいかわからんからキミたち教えて
0367デフォルトの名無しさん
2008/08/22(金) 18:20:46strtolでもつかって炉
0368デフォルトの名無しさん
2008/08/22(金) 18:29:22素早い応答感謝。
おとなしくstrtol使ってくる。
0369デフォルトの名無しさん
2008/08/22(金) 19:08:090370デフォルトの名無しさん
2008/08/22(金) 19:11:230371デフォルトの名無しさん
2008/08/22(金) 19:16:100372デフォルトの名無しさん
2008/08/22(金) 21:16:00浮動小数点の形式がIEEEなのかはたまた別なのかは定義されていないから環境依存が激しくなると思われ。
といいつつ大概は先頭ビットを0にする処理で終わらせてるが。
0373デフォルトの名無しさん
2008/08/22(金) 21:19:370374デフォルトの名無しさん
2008/08/22(金) 21:37:42いやいや、そうじゃなくて、CPU内部ではフラグ倒すだけの操作だってことを言いたかった。
ビット操作で符号フラグをクリアしろという意味じゃない。
>>356で「環境に合わせて最適化してる」と書いたとおりです。
0375デフォルトの名無しさん
2008/08/22(金) 22:50:50template <unsigned int N>
inline double pow(double v){
return v * pow<N-1>(v);
}
template <>
inline double pow<0>(double v){
return 1;
}
使用例:pow<4>(3)
コンパイル後:3*3*3*3 ?
コンパイラはbcc使ってます。デバッグモードじゃ展開されないみたいだし、
リリースモードだと、アセンブラが分かりません;〜;
よろしくお願いします。
0376デフォルトの名無しさん
2008/08/22(金) 22:53:16問題はbccがまともかどうかということだが……。
0377デフォルトの名無しさん
2008/08/22(金) 22:59:36gccの例で恐縮だが、printf("%g\n", pow<4>(3))したらprintf("%g\n", 81.)相当に展開された。
0378デフォルトの名無しさん
2008/08/22(金) 23:05:56試しにpow<4>(argc)したらこんなことになったけど。
--
cvtsi2sd 8(%ebp), %xmm1
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, 4(%esp)
--
# アセンブラ読めなくても掛け算3回連続ってのは判るでしょ。
0379デフォルトの名無しさん
2008/08/22(金) 23:27:04定数畳込みがされるかどうか聞きたかったんじゃ。
0380デフォルトの名無しさん
2008/08/22(金) 23:29:30ところでもう一つ質問なのですが、
template<unsigned int n,unsigned int i>
struct h{
static inline double hill1(double t,double p[n]){
return p[i]*t + h<n,i-1>::hill1(t,p);
}
};
template<unsigned int n>
struct h<n,0>{
static inline double hill1(double t,double p[n]){
return p[0];
}
};
このテンプレートでh<1,0>::hill1(0,hoge);とした時に下のテンプレートが適用されないみたいなんですが
原因がよく分かりません。エラー文は
最大 VIRDEF 数を超過した; 再帰をチェック
と出ています。また、よろしくお願いします。
0381デフォルトの名無しさん
2008/08/22(金) 23:56:54プラグマか何かあるんじゃないかな。上限ぐらい上げられると思うけど。
VCの#pragma inline_depthみたいな
0382デフォルトの名無しさん
2008/08/23(土) 00:08:420383デフォルトの名無しさん
2008/08/23(土) 00:15:221.
次のような式で表される数列が与えられたとする。
a0=1,a1=1,an=an-1+2an-2
int型の整数n(n≧0)を受け取り、上記の数列anの値をa0からanまで全て表示する関数printa(n)を作成せよ。
2.
要素数2個のdouble型の配列xy(xy[0]にはx座標、xy[1]にはy座標が納められている)と2行2列のdouble型の2次元配列Aを受け取り、座標(x,y)のAによる1次変換を求めて、その結果を配列xyに格納する返却値無しの関数LinearTrance(xy,A)を作成せよ。
3.
文字列の納められた文字型の配列sとstailを受け取り、sの末尾にstailの文字列が含まれているかどうかを調べ、含まれている場合には1、含まれていない場合には0を返す関数strcmptail(s,stail)を作成せよ。
4.
4個の文字列"abc.txt","xyz.jpg","foo.txt","bar.mp3"と文字列"txt"を受け取り、文字列の末尾に"txt"を含む文字列かあるかどうかを調べて、あればその文字列全てを表示するプログラムを作成せよ。ただし問3で作成した関数を用いること。
見づらいかもですが、よろしくお願いします。
0384デフォルトの名無しさん
2008/08/23(土) 00:18:46宿題程度は自分でやれといいたいが。
0385デフォルトの名無しさん
2008/08/23(土) 00:23:23BCCが関数テンプレートの部分特殊化に対応してるか怪しいような。
対応してても、ぐぐったらちょっとバグがあるらしいので
標準に完全準拠してると期待しない方がいい。
インライン展開で無限ループしてるんじゃない?下の特殊化版を消してコンパイル結果が
同じならそういうことかと。
0386デフォルトの名無しさん
2008/08/23(土) 00:29:16すみません、そちらに書き込みます。
0387デフォルトの名無しさん
2008/08/23(土) 00:36:07特定ファイルだけ警告出さないようにするというのはできますか?
それというのも少し環境が変わって以前使っていた警告オプションだとSTLに対して大量の警告がでるようになってしまい、
これを何とかしたいんです
0388デフォルトの名無しさん
2008/08/23(土) 00:37:450389デフォルトの名無しさん
2008/08/23(土) 00:39:44これをクリアするのは至難の業ですね・・・Umm
0390デフォルトの名無しさん
2008/08/23(土) 01:17:200391デフォルトの名無しさん
2008/08/23(土) 01:22:07BCC5.9.3(C++Builder2007の付属品)だとちゃんと動くよ。
0392デフォルトの名無しさん
2008/08/23(土) 09:46:52template<unsigned int i>
struct f{
template<unsigned int n>
static inline double hill(double t,double p[n]){
return p[i] * Bernstein<n,i>(t) + f<i>::hill<n>(t,p);
}
};
template<>
struct f<0>{
template<unsigned int n>
static inline double hill(double t,double p[n]){
return p[0] * Bernstein<n,0>(t);
}
};
main:
こうしたら一見コンパイルは通るんですが
0393デフォルトの名無しさん
2008/08/23(土) 09:49:59続きですが、上のやつだと
f<2>::hill<1>
が関数として見られないらしく関数ポインタに代入しようとすると”式の構文エラー”と出てしまいます。
これも不正あるいはBCCの未対応によるものなんでしょうか
0394デフォルトの名無しさん
2008/08/23(土) 21:41:55そうですか
どうもありがとうございました
なんとかならないのかなぁ
0395デフォルトの名無しさん
2008/08/23(土) 22:30:01grepでおk
0396デフォルトの名無しさん
2008/08/24(日) 01:18:13普通どのくらいファイルを分割するものでしょうか?
1プロジェクトのソースの総サイズが160KBで、
ヘッダを含めて110ファイルになったんですが、
これって分割しすぎですか?
0397デフォルトの名無しさん
2008/08/24(日) 01:31:391ファイルの平均が1.5Kか。
こういうのに正解はないから好きにすればいいとは思うけど、普通よりだいぶ細かく分割してるのは違いないな。
0398デフォルトの名無しさん
2008/08/24(日) 01:44:59どうもありがとうございます。
0399デフォルトの名無しさん
2008/08/24(日) 02:05:03私は1クラス2ファイル(hとcpp)を目安に分けてる
構造体なんかは関連するクラスにまとめちゃうことが多いな
0400デフォルトの名無しさん
2008/08/24(日) 08:10:200401デフォルトの名無しさん
2008/08/24(日) 09:05:02作ることになるからさらに増えるからなぁ
0402デフォルトの名無しさん
2008/08/24(日) 10:19:02一つの処理を行う過程で複数の関数にまたがるような処理
汎用的に使えそうな関数を書く場合
こういうソースを分けてるなぁ
0403デフォルトの名無しさん
2008/08/24(日) 11:56:29Superのデストラクタで「純粋仮想関数を呼んだ」っていうランタイムエラーが出ます。
SuperのデストラクタでSubの release()を呼びたいんですが、どうすればいいでしょうか?
template <class T>
class Super{
public:
virtual ~Super(){
static_cast<T*>(this)->release();//ここでランタイムエラー
}
virtual void release() = 0;
};
class Sub{
public:
void release(){}
};
環境はVisualStudio2003のVC++です。
0404デフォルトの名無しさん
2008/08/24(日) 11:58:21class Sub : public Super<Sub>{
public:
void release(){}
};
0405デフォルトの名無しさん
2008/08/24(日) 12:04:10public:
void release(){}
~Sub(){}
};
0406デフォルトの名無しさん
2008/08/24(日) 12:13:11もうSubオブジェクトは無くなっていると考える。
Subにデストラクタは設けられないの?
0407デフォルトの名無しさん
2008/08/24(日) 12:33:00おっしゃるとおり、Subのデストラクタでrelease()を呼び出すようにしました。
全子クラスのデストラクタでrelease()を実行するので、親のデストラクタで呼び出したかったんですが。
0408デフォルトの名無しさん
2008/08/24(日) 12:39:210409デフォルトの名無しさん
2008/08/24(日) 12:41:470410407
2008/08/24(日) 13:21:08親クラスに解放処理の中身はかけないのです。
0411デフォルトの名無しさん
2008/08/24(日) 13:25:510412デフォルトの名無しさん
2008/08/24(日) 13:26:49継承しなくても包含でいいんじゃないかという気もする。
0413デフォルトの名無しさん
2008/08/24(日) 13:46:20継承をテンプレートに変えればできるかも。
0414デフォルトの名無しさん
2008/08/24(日) 15:07:23__int8、__int16、__int32、__int64
のような、サイズが定まった整数型が存在します
自分は .NET のようにサイズが定まってる方が好きですし
型名にサイズが記されてて分かり易いので使っていこうかなと思っています
(long long int みたいな名称はちょっと微妙な感じ・・・)
が、これらの型についてググっても意外に使用しているコードが少ないです
非標準だからでしょうか?
これらの型のメリット、デメリットってどんなのがあるんでしょうか?
やっぱり、あんまり使わない方がいいんでしょうか?
よろしくお願いします
0415デフォルトの名無しさん
2008/08/24(日) 15:11:36strlenとかのライブラリ関数はそんな型使ってないから整合性に困るし
非標準ってのもあるかもしれないが、それだけならC99標準に合わせて
int8_t int16_t int32_t int64_t に typedef して使うのがいいんじゃないかな
0416デフォルトの名無しさん
2008/08/24(日) 15:30:22ありがとうございます
元はといえば long long int という型名が嫌だったので別名を探してました
VS2008 で動かしてみたら C99 の int32_t って対応してないみたいですね
ググっても Linux関連が大量に出てきた・・・
VC++ では
typedef で INT8、INT16、INT32、INT64 というのがあったので
コイツらを使っていこうと思います
ありがとうございました
0417デフォルトの名無しさん
2008/08/24(日) 15:46:010418デフォルトの名無しさん
2008/08/24(日) 20:22:23#include <algorithm>
#include <set>
#include <functional>
int main()
{
char ch[] = {
'N', 'B', 'J', 'K', 'E', 'C', 'G', 'D',
'A', 'C', 'F', 'I', 'L', 'M', 'L', 'B', 'G', 'H'
};
int size = sizeof(ch);
std::set<char, std::greater<char> > s2(std::greater<char>() );
for (int i = 0; i < size; ++i) {
if (!s2.insert(ch[i] ).second) { // 15 行目
std::cout << "失敗\n";
}
}
}
これをビルドしようとすると、エラーになります。何がダメなのでしょうか?
(15) : error C2228: '.insert' の左側はクラス、構造体、共用体でなければなりません
(15) : error C2228: '.second' の左側はクラス、構造体、共用体でなければなりません
visual studio 2005 standardをつかってます
0419デフォルトの名無しさん
2008/08/24(日) 20:44:270420デフォルトの名無しさん
2008/08/24(日) 20:48:37○ std::set<char, std::greater<char> > s2;
キモイ std::set<char, std::greater<char> > s2((std::greater<char>()));
0421デフォルトの名無しさん
2008/08/24(日) 21:04:47なるほど
std::set<char, std::greater<char> > s2(std::greater<char>() );
の部分を std::set<char, std::greater<char> > を返す
s2という関数の宣言と解釈されたということですね
>>420
どちらでもうまくいきました。ありがとう
C++標準ライブラリの使い方 完全ガイド では>>418の様に書かれてるんだけどな・・・
0422デフォルトの名無しさん
2008/08/24(日) 21:07:50バイナリエディタにつっこんだ後、機械語が横の方にでるんだけど、日本語に翻訳するにはどうすればいいか教えてください
0423デフォルトの名無しさん
2008/08/24(日) 21:09:56このスレはC/C++の質問だけにしてください
0424デフォルトの名無しさん
2008/08/24(日) 21:15:21大量のパケットが流れている状態だとリアルタイムに取ることができません
(秒間60パケット程度になると1秒間の分を1.5秒くらいかけて取り込む結果に・・・)
最適化などで高速化を頑張ってみましたが一向に改善されません
ループ処理を軽くすれば解決できるような問題なんでしょうか
0425デフォルトの名無しさん
2008/08/24(日) 21:21:43データ量がどれだけか分からないけど
ギガビットイーサで400Mbps(=50MB)の受信があったとすると
かなりの負荷になるな
でもジャンボフレーム16kとして60パケットなら100kB程度
余裕で処理できそうな気はする
0426デフォルトの名無しさん
2008/08/24(日) 21:23:59具体的なデータ量は120バイト前後のバラバラのパケットが秒間58個+α流れてくる状態です
これしきのことでどうして酷いタイムラグが起きるのか悩んでます
0427デフォルトの名無しさん
2008/08/24(日) 21:27:10計算違うw
16kBx60=1MB程度になる
0428デフォルトの名無しさん
2008/08/24(日) 21:31:51うはw
std::set<char, std::greater<char> > s2((std::greater<char>()));
って書くとBCCではコンパイルエラーになるわ
0429デフォルトの名無しさん
2008/08/24(日) 21:32:20ブロッキングモードで読んでるのが原因とか?
0430デフォルトの名無しさん
2008/08/24(日) 21:44:32Winsock2ではブロッキングモードがあるのは知っているのですが
Winpcapを使った場合でも同様のものがあるんでしょうか
取得までのタイムアウト値を設定できるとのことなので
ぎりぎり動く範囲の2msに今は設定しています
0431デフォルトの名無しさん
2008/08/24(日) 21:46:45C/C++と関係なさすぎ
0432デフォルトの名無しさん
2008/08/24(日) 21:56:42友人が英語サイトから有用そうな情報を引っ張ってきてくれたので
もう暫く頑張ってみようと思います
ありがとうございました
0433デフォルトの名無しさん
2008/08/24(日) 23:08:46いいオープンソースありまっか?
0434デフォルトの名無しさん
2008/08/24(日) 23:09:44SourceForge へいってみればあると思うよ
0435デフォルトの名無しさん
2008/08/25(月) 02:07:35例:
int *pint = reinterpret_cast< int * >( new char[sizeof(int)] );
delete pint; <-これで正しいんですか?
0436デフォルトの名無しさん
2008/08/25(月) 02:17:51delete [] reinterpret_cast<char*>(pint);
っていうか最初の reinterpret_cast が要らんような気がするんだが。
new int じゃダメなのか?
0437デフォルトの名無しさん
2008/08/25(月) 05:07:36そういうやばいことやるようなケースならmalloc/free使ったほうが明示的で良い気はする
0438デフォルトの名無しさん
2008/08/25(月) 11:48:33#include<string>
#include<map>
class hoge{
private:
std::string m_name;
public:
hoge(std::string name) : m_name(name){}
};
std::map<int, hoge> hogelist;
このとき hogelist に新しいメンバを追加する際
hoge のコンストラクタに引数を指定する方法を教えてください
当然ながら hogelist[1]("hogehoge"); はダメでした
0439デフォルトの名無しさん
2008/08/25(月) 11:57:45#include <utility>
hogelist.insert(std::make_pair(1, "hogehoge"));
0440438
2008/08/25(月) 12:05:58ありがとうございます
助かりました
今は必要ないのですが、>>438 と同様の状況で
コンストラクタに複数の引数を渡したい場合の書き方について
ご存知であれば教えてください
0441デフォルトの名無しさん
2008/08/25(月) 12:13:43hogelist.insert(std::make_pair(1, hoge("hogehoge", ...)));
0443デフォルトの名無しさん
2008/08/25(月) 13:14:14Aがデストラクタを持たない親クラスで、
Bがテンプレートを持つクラスで、それを継承したC、D、Eで多態を表したいです。
Bのテンプレート引数には子クラス(C、D、E)を渡さないといけない状況です。
具体的には、ATLのCWindowを継承しているCWindowImplを継承して自分用のclassを作ったんですが、
mapに入れて管理しておいて、参照しているところがなくなったら削除しようと、shared_ptr<CWindow>で入れてみたんですが、
CWindowにvirtaulなデストラクタがなくてshared_ptrでdeleteしようとすると未定義な動作になるようです。
0444デフォルトの名無しさん
2008/08/25(月) 13:34:08諦める。
0445デフォルトの名無しさん
2008/08/25(月) 13:50:030446デフォルトの名無しさん
2008/08/25(月) 13:50:10CWindowを継承しないとだめなの?
CWindowImplのprivateメンバに直接アクセスするわけじゃなければ、
CWindow*のメンバ変数を所有するクラスを作って、
場合によりそれを継承するとかじゃ無理?
0447デフォルトの名無しさん
2008/08/25(月) 13:51:19virtual ~Foo(){}
virtual CWindow *GetCWindow() = 0;
};
のようなクラスを作り、自分用のクラスに多重継承させ、
shared_ptr<CWindow> の代わりに shared_ptr<Foo> を使う
0448デフォルトの名無しさん
2008/08/25(月) 13:52:00いやいや、shared_ptrなら仮想デストラクタを持っていなくても、
正しくデストラクタが呼ばれるから問題ない。
shared_ptr<> p(new MyWindow);というように最派生クラスの型へのポインタを
直接shared_ptrのコンストラクタに渡せば平気。
このときのshared_ptrのテンプレート引数はMyWindowでもATL::CWindowでも果てはvoidでも大丈夫。
仕組みが知りたければここ読め。
http://d.hatena.ne.jp/Cryolite/20060108
0449デフォルトの名無しさん
2008/08/25(月) 14:26:29おぉ、それは知らなかった。
こういう利便性があるとsharedじゃない単なるポインタ版も欲しくなるね。
0450443
2008/08/25(月) 14:38:11>>444
できればなにか回避する方向でいきたいと。
>>445, 447
間にあるクラス(B)がテンプレートクラスなのでかまさせられないのです。
一番下の子クラス(C)でテンプレート引数として自分を指定するので。
>>446
ATLのCWindowを継承したいのが目的なので、コンポジションではだめなのです。
すべてのメソッドにラッパーメソッドをかますとなると、結構大変そうというのが理由です。
>>448
なるほど、boostのshared_ptrなら、大丈夫だとは。
自分が代入された時の型を覚えておくなんてすばらしいですね。
これを元にして解決してみます。ありがとうございました。
結論としては、virtaulなデストラクタを持たないクラスを継承して多態を表したいときは、
生成した型に合わせてdeleteすればよいということですね。
ありがとうございました。
0451デフォルトの名無しさん
2008/08/25(月) 14:58:520452443
2008/08/25(月) 15:04:03boostを参考にしてみます。ありがとうございます。
0453デフォルトの名無しさん
2008/08/25(月) 15:17:53C++0xのunique_ptrは参照カウントないんでそういう感じに近いと思う。
0454デフォルトの名無しさん
2008/08/25(月) 16:26:500455デフォルトの名無しさん
2008/08/25(月) 16:45:20もしかして: virtual
0456デフォルトの名無しさん
2008/08/25(月) 20:54:16Aの処理
Bの処理(しばらく処理が戻ってこない命令含む)
}
↑のようなのがあって
Aの処理はできるだけガンガン回したいのにBが邪魔なんだ
そこでマルチスレッドでAとBを分割してやれば
Bの制御が戻ってこない間もAをブンブン回せる?
0457デフォルトの名無しさん
2008/08/25(月) 20:59:26ループ1{
ループ2{
Aの処理
}
Bの処理(しばらく処理が戻ってこない命令含む)
}
0458デフォルトの名無しさん
2008/08/25(月) 21:02:31ありがとうございます
でもそれをやるとAを何回かまわしてBをやった時
またAに戻るまでにタイムラグができてしまわない?
0459デフォルトの名無しさん
2008/08/25(月) 21:18:24int global_area[1000];
int main(){
int* arr = new(global_area) int[10];
for(int cnt=0;cnt<10;++cnt){
arr[cnt] = 1;
}
return 0;
}
上記のソースはplacement newで領域を確保しようとしています。
コンパイルすると、
'operator new[](unsigned int,int *)' に一致するものが見つからない
と表示されてしまいます。new演算子のオーバーロードが必要ということでしょうか?
もしそうだとすると、この場合、どこにそれを記述すればよいのでしょうか?
コンパイラはBCC++5.5です。
0460デフォルトの名無しさん
2008/08/25(月) 21:24:23gcc3.4.5(MinGW)だけどエラー出ないぞ。
0461デフォルトの名無しさん
2008/08/25(月) 21:29:40AとBが同じリソース(ファイルとかVRAMとかメモリ)の書き換えを行うようなことをしてなければ、
そのままマルチスレッドでも良いと思うよ。
0462デフォルトの名無しさん
2008/08/25(月) 21:38:50どうせ馬鹿なんだから、最初から小出しにしないで用件全て晒せよ。
0463デフォルトの名無しさん
2008/08/25(月) 21:39:24ちょっと敷居が高いですが頑張ってみます
スレッドが回ってる時にCloseHandleってやってしまうとまずいですか?
0464デフォルトの名無しさん
2008/08/25(月) 23:05:49ありがとうございます。
そうですか…何故かうちの環境だとエラーとなるのです。
条件変えて試してみます
0465デフォルトの名無しさん
2008/08/25(月) 23:08:03どうも、ぺこり
実プログラムでは下のようにmalloc/freeで行っているのですが、
それをnew/deleteで行った場合の開放の仕方がわからず質問しました
PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);
free(functionClassDeviceData);
0466デフォルトの名無しさん
2008/08/25(月) 23:30:030467デフォルトの名無しさん
2008/08/26(火) 00:22:06PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData =
PSP_INTERFACE_DEVICE_DETAIL_DATA( &buf[0] );
とかでいいんじゃないもう
0468デフォルトの名無しさん
2008/08/26(火) 00:31:30「オブジェクトが解体される直前に呼び出され、内部で指定された処理を実行する」
以外に、自動的に(ユーザーの見えないところで)何か処理を行っているのでしょうか?
0469デフォルトの名無しさん
2008/08/26(火) 00:32:57どうしてそう思ったの?
0470デフォルトの名無しさん
2008/08/26(火) 00:33:18仮想関数テーブルを基本クラスのものに戻して、
基本クラスのデストラクタを呼ぶ
0471デフォルトの名無しさん
2008/08/26(火) 00:45:19ありがとうございます。継承を遡っているのですね。
注意します。
>469
ttp://www.geocities.jp/ky_webid/cpp/language/036.html
こちらのコンテンツを読んでいる際に、明示的にデストラクタを呼び出している
のが、たんにデストラクタを明示的に呼び出すことが可能という説明なのか、
必ず呼び出さなければならないのか釈然としなかったからです。
0472デフォルトの名無しさん
2008/08/26(火) 00:51:500473デフォルトの名無しさん
2008/08/26(火) 14:19:27の方法での実装をみるとvoid*を経由しているようです
void*を経由した場合、以下の継承関係だとエラーになるんですが、どうやったら回避できますか?
型情報がいったんなくなるので多重継承の場合は無理なのかなぁと思っています。
(shared_ptrのソースはむつかしくて読めてません)
class AAA {};
class BBB {
public:
virtual BOOL x() = 0;
};
class FFF : public AAA, public BBB {
public:
BOOL x() {return 0;}
};
FFF* fff = new FFF();
AAA* aaa = fff;
void* vvv = aaa;
FFF* buf = static_cast<FFF*>(vvv);
delete buf;
0474デフォルトの名無しさん
2008/08/26(火) 15:10:56そのAAA*→void*→FFF*って変換が一般にできるは分からない。
けど、BoostとVC++9の実装を見てみたが、delete自体は問題ない。
どっちもshared_ptr用とは別にdelete用のポインタを保持していて、
それはずっとFFF*だったりFFF*→void*→FFF*だったりする。
0475デフォルトの名無しさん
2008/08/26(火) 15:25:06渡してdeleterを作成させなきゃダメでしょ。
0476デフォルトの名無しさん
2008/08/26(火) 15:36:04void*を経由した時に多重継承だとオフセットわかんなくなりませんか?
>>473のコードだけでも落ちたのでそうなるかなと。
>>475
生成時に渡しててもvoid*経由してたら落ちると思います。
>>448のコードでも多重継承のやつをdynamic_scoped_ptr<AAA> buf(new FFF());で落ちます。
0477デフォルトの名無しさん
2008/08/26(火) 15:48:14X*からvoid*へ変換してまたX*へ戻すっていう風に、void*にする前と後で同じ型の場合なら、
void*にする前と後でビットパターンが変化しなければうまくいく。
あと、dynamic_scoped_ptrじゃなくて、boost::shared_ptrで試してみ。
dynamic_scoped_ptrほど単純な仕組みではないからうまくいくはず。
0478Mr.yutori
2008/08/26(火) 15:53:11教えてください。
0479デフォルトの名無しさん
2008/08/26(火) 15:56:15unknown
0480デフォルトの名無しさん
2008/08/26(火) 15:59:41そんなものは無いので忘れるといいよ
0481デフォルトの名無しさん
2008/08/26(火) 16:35:49#include <cstring>
template <typename TYPE>
// TYPE max(const TYPE& a, const TYPE& b) // なんかこっちだどだめ *****
TYPE max(TYPE a, TYPE b)
{
return (a > b) ? a : b;
}
template <>
inline char *max(char *a, char *b)
{
std::cout << "char *" << std::endl;
return (strcmp(a, b) > 0) ? a : b;
}
int main()
{
char *s = "fdada"; char *p = "fff";
std::cout << max(s, p) << std::endl;
return 0;
}
コメントアウトした方がダメなのはなぜですか?
0482デフォルトの名無しさん
2008/08/26(火) 16:40:31char *max(char* const& a, char* const& b)
にしないとテンプレートと合わないんじゃないか?
0483デフォルトの名無しさん
2008/08/26(火) 17:08:19shared_ptrのソースの読めた部分だけで、shared_ptrのまねをして
>>448のdeleterにポインタ渡すようにしてvoid*を経由しないようにしたらできました。
レスくれたかた、ありがとう。
0484デフォルトの名無しさん
2008/08/26(火) 17:10:41確か<utility>にstd::maxが入ってるからそれとぶつかるんでは?
0485デフォルトの名無しさん
2008/08/26(火) 17:16:20C++に使える最強のクラスをまとめたヘッダーファイルが3万で売ってると聞いたのですが
詳細が書いてあるサイトご存じありませんか?
0486デフォルトの名無しさん
2008/08/26(火) 17:29:110487デフォルトの名無しさん
2008/08/26(火) 17:30:25TYPEをそのままchar *に置き換えてみれば違いがわかるんじゃない?
0488デフォルトの名無しさん
2008/08/26(火) 17:33:18Boost使っちゃだめだった?
それなら、shared_ptr.hppをコピーして名前だけ変えたほうが手っ取り早いと思うけど。
あるいはVC++2008なら、SP1あてればshared_ptrも付いてくるし。
0489デフォルトの名無しさん
2008/08/26(火) 18:19:06勉強のために理解したかったので今後、何かするときはboost::shared_ptrを使おうと思います。
今まで継承するクラスは仮想デストラクタがないといけないという思い違いをしていましたので、
目から鱗がぼろぼろでした。ありがとう。
0490デフォルトの名無しさん
2008/08/26(火) 19:33:22基底クラスとする派生クラスB,C,D...と#include していくのは行儀の悪い方法ですか?
0491デフォルトの名無しさん
2008/08/26(火) 20:10:110492デフォルトの名無しさん
2008/08/26(火) 20:14:13レスありがとうございます。
別の方法を探ります
0493デフォルトの名無しさん
2008/08/26(火) 21:46:14__LINE__
とかの__の部分の意味
について解説してるサイトご存じないですか?
これについて理解できなくて・・・・。
0494デフォルトの名無しさん
2008/08/26(火) 21:54:020495デフォルトの名無しさん
2008/08/26(火) 21:57:31ただのマクロです行数に置き換えてくれます
意味とかいわれてもわかりません
0496デフォルトの名無しさん
2008/08/26(火) 22:00:58>>495 ありがとうございました!
0497デフォルトの名無しさん
2008/08/26(火) 22:58:58多分、アンダースコアを連続で付ける意味を知りたいのだと思うが、その辺の話は、
MSDN - Deep C++ 「予約名」
http://msdn.microsoft.com/ja-jp/library/cc440188.aspx
このページの説明が分かり易いと思う。
0498デフォルトの名無しさん
2008/08/26(火) 23:49:20全部が全部shared_ptr使うわけでもないだろうし、
スーパークラスとなる可能性があるクラスは、
仮想デストラクタを作っといたほうが行儀はいいと思うよ、一応
0499デフォルトの名無しさん
2008/08/27(水) 00:39:09お答えいただいていただきありがとうございます
つまり全部参照にするか、全部値渡しにするかどっちかじゃないとだめだということ・・・?
0500デフォルトの名無しさん
2008/08/27(水) 00:47:050501デフォルトの名無しさん
2008/08/27(水) 00:50:06指定した型のときだけ違う動作させるものじゃないんですか?
0502デフォルトの名無しさん
2008/08/27(水) 01:06:31そうそう。
だから、TYPE max(const TYPE& a, const TYPE& b)を特殊化したものも、
またTYPE max(const TYPE& a, const TYPE& b)のシグネチャに一致しないといけないということ。
クラステンプレートならまた話は別だけど。
0503デフォルトの名無しさん
2008/08/27(水) 01:46:57ありがとうございます
TYPE max(const TYPE& a, const TYPE& b)の特殊化であってこれに沿っていないといけないのですね
関数のオーバーロードみたいなものでなんでもいいのかと思っていました
どうもありがとうございました
0504デフォルトの名無しさん
2008/08/27(水) 10:31:58template <typename TYPE>
TYPE max(const TYPE& a, const TYPE& b);
char *max(char *a, char *b);
あと、誰もつっこんでいないけど、<cstring>ならstd::strcmpだ。
0505デフォルトの名無しさん
2008/08/27(水) 13:58:47#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
これについて解説していただけませんか
よろしくお願いします・・・。
SAFE_DELETE(p)の意味がわかりません・・・
0506デフォルトの名無しさん
2008/08/27(水) 14:01:11なにを解説したらいいの?#defineの動作?
0507デフォルトの名無しさん
2008/08/27(水) 14:03:45ありがとうございました
0508デフォルトの名無しさん
2008/08/27(水) 14:05:380509デフォルトの名無しさん
2008/08/27(水) 14:06:14最終解脱まだ??
0510デフォルトの名無しさん
2008/08/27(水) 14:08:55だとすると文にDIGITを置くと30と同じじゃないですか
その文だと
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
になってて
そのあと(p)が何度も出てくるんですけどSAFE_DELETEが見当たらないのでどういう意味なのか疑問に思いました
0511デフォルトの名無しさん
2008/08/27(水) 14:09:59__|_______|_ ■■■■■■■■
|iiiiiiiiiiiiiiiii| ■■■■■■■■■ナニヤッテンダヨ!バカモノガァ!
|iiiiiiiiiiiiiiiii| ■■■■√ === │
|iiiiiiiiiiiiiiiii|■■■■√ ~ ミ ノノノ 彡 |
|iiiiiiiiiiiiiiii|■■■√ ∀ ∀ \
|iiiiiiiiiiiiiiii|■■■ ∵ (● ●) ∴│ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|iiiiiiiiiiiiiiii|■■■ 丿■■■( │< 常にageとけって
|iiiiiiiiiiiiiiii|■■■ ■ д ■ | | 言ったじゃないかぁ!
|iiiiiiiiiiiiiiii|■■■■ ■■ ■■ ■ \_________
|iiiiiiiiiiiiiiiiii■■■■■■■■■■■■__
\iiiiiiiiiiiiiii■■■■■■■■■■■■iiヽ
\iiiiiiiiiiiii■■■■■■■■■■■iiiiiii|
|iiiiiiiiiiiiiiiii■■■■■■■■■■iiiiiiiii|
0512デフォルトの名無しさん
2008/08/27(水) 14:10:50それ単なるバグだろww
0513デフォルトの名無しさん
2008/08/27(水) 14:12:160514デフォルトの名無しさん
2008/08/27(水) 14:12:41ttp://programnet.hp.infoseek.co.jp/clangage/preprocessor.html
適当にググるだけでもこんなページ見つかるぞ
0515デフォルトの名無しさん
2008/08/27(水) 14:13:22もちろん引数よ
0516デフォルトの名無しさん
2008/08/27(水) 14:14:57MSDNライブラリーっていうところでずっと調べてたのですが
見つからなかったので・・・;;
>>514さんの教えてくれたサイトみたら解決しました
次からはMSDNライブラリーとググってわからなかったら質問します
お騒がせしました
0517デフォルトの名無しさん
2008/08/27(水) 15:10:08そんなマクロ要らん。安全性を確保したいなら、せめて auto_ptr とか、何かしらの
スマートポインタ使うほうが簡単で確実。
0518デフォルトの名無しさん
2008/08/27(水) 16:05:40ファイルの読み込み・書き込みをするプログラムを作ろうとしてるのですが
コンパイルして実行するとコンソールから入力された文字列をcin.getlineで取る箇所で
入力を待たずに終了してしまいます。
何が原因でしょうか。
0519デフォルトの名無しさん
2008/08/27(水) 16:09:56たぶん最初に w と Enter を入力したろ?
cin >> rorw; で 'w' だけ読み取って、Enter はまだ読まれてない
次の cin.getline で残った Enter が読まれて終了
0520デフォルトの名無しさん
2008/08/27(水) 16:33:05改行を抜いて問題なく実行できました。
ありがとうございます。
0521デフォルトの名無しさん
2008/08/27(水) 20:17:54WinAPIやMFCを使っていたのでコールバック関数とはてっきり
「何かの動作をした場合に走らせる関数」と思っていたのですが違いますよね。
調べると渡す関数によって動作が変わる関数のような説明が多いです。
例えば○○Func(10,10,AddFunc)だと20が返り、○○Func(10,10,DivFunc)なら1が返るなど。
つまりこの○○Funcがコールバック関数なのでしょうか。
「コールバック」という言葉から事前に登録した関数が何らかの動作の際に呼び戻されるという思い込みがあって
未だに曖昧ですっきりしませんorz
0522デフォルトの名無しさん
2008/08/27(水) 20:21:59○○Funcなどの呼ぶ方は何か特別な名前で呼ぶとすれば高階関数かな
0523521
2008/08/27(水) 20:41:12レスありがとうございます。
つまり「アドレスを渡した先の関数で動作させる関数」をコールバック関数という認識でいいのでしょうか。
CやC++だとAPIにあるような関数があるわけではないので、これ以外にも思い込みの言葉がありそうで怖い・・・
0524デフォルトの名無しさん
2008/08/27(水) 21:16:560525デフォルトの名無しさん
2008/08/27(水) 21:21:00Win32APIでファイル一覧を取得するのに_findfirst()、findnext()、findclose()を使うのは分かったのですが、
POSIXでいうところのseekdirに当たるものはないんでしょうか?
ない場合、なんとか実現する手段はありますでしょうか?
0526デフォルトの名無しさん
2008/08/27(水) 21:24:060527デフォルトの名無しさん
2008/08/27(水) 21:30:39たまに凄いハイクオリティーなのあるよな
あれってやっぱりCで作ってるのか?
0528デフォルトの名無しさん
2008/08/27(水) 21:36:04自分でfindfirstと_findnextが得た_finddata_tを配列に貯めていけばいいんじゃないの?
0529デフォルトの名無しさん
2008/08/27(水) 21:43:04win32APIだけを使用したものなら98SEで動作していたVC++のアプリは動作するんでしょうか?
また自作のDLL(同じくVC++で作成)も同様でしょうか?
0530525
2008/08/27(水) 22:11:49すいません。言い忘れがありました。
C言語でC++は使わない前提です。
>>528
なるほど。
ただ、行いたいのはwin32上でopendir()/readdir()を実装しかったのですが、
staticな変数に_finddata_tを保存して、最初のreaddir()時に云々するより、
opendir()関数内部で_findfirst()を行った後、seekdir()みたいなもので
参照ポイントをずらせないかなと思って質問しました。
0531デフォルトの名無しさん
2008/08/27(水) 22:35:46// デフォルトコンストラクタ
//-------------------------------------------------------------
Renderer::Renderer()
: m_pD3D(0), m_pD3DDevice(0)
{
}
これの : ってつけるとどういう意味があるんですか?
メンバ関数にアクセスするためですか?
0532デフォルトの名無しさん
2008/08/27(水) 22:44:020533デフォルトの名無しさん
2008/08/27(水) 22:44:09メンバ変数の初期化じゃね?
0534デフォルトの名無しさん
2008/08/27(水) 22:45:570535デフォルトの名無しさん
2008/08/27(水) 22:50:25調べたら解決しました
ありがとうございました
0536デフォルトの名無しさん
2008/08/27(水) 23:59:16freadでデータを一つずつ読み込みたいんですが、
最後のデータに到達したことを判断する方法ってありますでしょうか。
ファイルの終わりに到達したのにさらにfreadをした場合どうなるのでしょうか。
環境はVC++、Windowsアプリケーションです。
0537デフォルトの名無しさん
2008/08/28(木) 00:03:02freadの戻り値の説明を読む
http://msdn.microsoft.com/ja-jp/library/kt0etdcs(VS.80).aspx
0538536
2008/08/28(木) 00:03:28これでいいですか?
while(fread(pBuf, size, 1, fp) == size) {
}
0539デフォルトの名無しさん
2008/08/28(木) 00:05:55http://www.linux.or.jp/JM
ここ知ってるとこの先ずっとしあわせ
0540デフォルトの名無しさん
2008/08/28(木) 00:25:05ウインドウに描画する文字列は再描画し続けないと駄目なのでメモリ上に取り込んで
おく、っていうやりかたであってますか?
ためしに100MBのテキストファイルを
notepadで開く -> notepadのメモリ使用量約200MB
秀丸で開く -> 秀丸のメモリ使用量約50MB
だったので秀丸ってどうやってるのかなとちょっと疑問に思ったもので
0541デフォルトの名無しさん
2008/08/28(木) 00:27:340543デフォルトの名無しさん
2008/08/28(木) 06:10:46double box = 0.0;//任意の数値
double data[ 3 ] = { 1, 2, 3 };
num = 0.4 * box;
でnumに小数点以下切り捨て(例1.2→1)の数値を入れるにはどうすればいいでしょうか?
0544デフォルトの名無しさん
2008/08/28(木) 07:48:06numはintだから何もしなくてもいいんじゃない
0545デフォルトの名無しさん
2008/08/28(木) 07:50:48intに変換した時点でなる
ただし四捨五入ではなく小数点すべて切り捨て
warningが気になるならキャスト(cast)調べろ(ただしあまり使うべきではない。その理由もキチンと把握すべし)
あとその場合、boxが10以上の場合
異常をきたすので、その対処も忘れずに
0546デフォルトの名無しさん
2008/08/28(木) 08:02:280547545
2008/08/28(木) 08:06:16「dataが10以上のときに」ではなく
「numが0より低いor4以上のときに」だな
>>546
ひけらかしたいのか教えたいのか
0548デフォルトの名無しさん
2008/08/28(木) 08:08:040549デフォルトの名無しさん
2008/08/28(木) 08:11:17>キャスト(cast)調べろ(ただしあまり使うべきではない
>546
0550デフォルトの名無しさん
2008/08/28(木) 08:18:23つーか君は会話出来ないのか?
0551デフォルトの名無しさん
2008/08/28(木) 10:08:57floor
0552デフォルトの名無しさん
2008/08/28(木) 10:42:120553デフォルトの名無しさん
2008/08/28(木) 10:54:48Cなら少し違うけど。
それに>>543の目的で「あまり使うべきではない」のも意味が分からない。
切り捨てのセマンティクス的にってことかな?
整数化のセマンティクスとして問題無いように思うけど。
0554デフォルトの名無しさん
2008/08/28(木) 10:57:11型変換自体は暗黙の変換を期待してるが floor を使う理由は
次のコードにおいて
#include<stdio.h>
#include<math.h>
int main(void){
int base=10000, a, b;
double ratio=0.7;
a=base*ratio;
b=floor(base*ratio);
printf("a=%d b=%d\n", a, b);
return 0;
}
Borland C++ Compiler 5.5.1 での出力結果は
6999 7000
gcc 3.4.5(MinGW) での出力結果は
7000 7000
と出力結果が異なる不具合を避けるため
0555デフォルトの名無しさん
2008/08/28(木) 11:08:26完全に誤差無くそうとしたら大変だと思うけど・・・。
0556デフォルトの名無しさん
2008/08/28(木) 12:51:04になるしな
0557デフォルトの名無しさん
2008/08/28(木) 13:12:49dllのソース内でSytem::Stringを使おうとしたらC4747エラーがでちゃった
ソースの方に「#pragma unmanaged」宣言してるから仕方ないんだけどさ
なんかやり方あるんでしょうか?
環境はvc++2005でc++/clrでやってます
0558デフォルトの名無しさん
2008/08/28(木) 13:15:18時代に乗れなくてマネージコードが理解できないおじさんが通りますよ
C++はマネージコード廃止してくれないかな
0559デフォルトの名無しさん
2008/08/28(木) 13:31:00C++/CLIはC++とは別言語です。
専用スレがあるのでそちらへ。
0560デフォルトの名無しさん
2008/08/28(木) 14:37:38言語名間違えたまま検索して専用スレがないと思ってこっちにきてました
移動します
0561デフォルトの名無しさん
2008/08/28(木) 20:18:48sprintfを使ってchar*に入れたもので、文字列をprintfすると正しい漢字が表示されます。
ただしchar*の文字列を別のプログラムに渡したり受け取ったりすると正しく表示されません。
0562デフォルトの名無しさん
2008/08/28(木) 20:23:270563デフォルトの名無しさん
2008/08/28(木) 20:38:310564デフォルトの名無しさん
2008/08/28(木) 21:23:50どうやって別のプログラムに渡してるんだ?
0565デフォルトの名無しさん
2008/08/28(木) 21:41:38単純にchar*文字列を1バイトずつファイルに入れているだけです。
渡す以前に
char str[256];
sprintf( str, "漢字" );
を実行したときのstrの中身が1バイトごと見ると違っていたりします。
デバッグでstrを見ると「漢字」が表示されます。
英数字は大丈夫(中身がバイト単位で一致)で、ひらがなも問題ありませんでした。
2つのプログラムで同じ漢字を使っても1文字でchar2つ分使ってたり1つで済んでいたりと違いがあります。
0566デフォルトの名無しさん
2008/08/28(木) 22:05:44何と違うの?
別のプログラムの具体的な名前と、
渡したり受け取ったりというのを詳しく。
0567デフォルトの名無しさん
2008/08/28(木) 22:22:36char型といってもSJIFやUTF8など色々あるので開発環境が違えば正常なデータのやり取りが出来なくなる危険性がある
ちなみにUnicodeは2バイト固定なのでTCHARとかで拾ってやれば漢字でも問題ない
質問者はともかく回答者まで知らなかったとかいうオチじゃないよな・・
0568デフォルトの名無しさん
2008/08/28(木) 22:28:56質問者のレベルがどの程度かを、ね。
0569デフォルトの名無しさん
2008/08/28(木) 22:35:51TCHARは2バイトとは限らない
0570デフォルトの名無しさん
2008/08/28(木) 22:36:34TCHARもどっかがUNICODEコンパイルせずでダメになるだろ。WCHARにしないと。
0571デフォルトの名無しさん
2008/08/28(木) 22:38:47話は逸れるけど、今時のUTF-16も1文字2バイト固定ではありませんよ。
0572デフォルトの名無しさん
2008/08/28(木) 22:45:57class A
{
};
template <class T, int I>
class B : public A<B<T, I>>
{
};
int main(int argc, char* argv[])
{
B<int, 5> b;
return 0;
}
Visual C++ 2008なら通るんだがg++だと通らない。
a.cpp:7: error: template argument 2 is invalid
a.cpp:7: error: template argument 1 is invalid
なぜじゃー
0573デフォルトの名無しさん
2008/08/28(木) 22:46:07(void**)&v
これってどういう意味なんですか?
&だから参照渡しかと思ったら*でポインタっぽい感じがしてよくわかりません・・・
0574デフォルトの名無しさん
2008/08/28(木) 22:49:20突っ込みたいがスレ違いなのでバナナ食べてくる
0575デフォルトの名無しさん
2008/08/28(木) 22:52:09& ってのは、変数を定義するときにつければ「〜型への参照」になるけど。
すでに存在する変数につければ「〜へのポインタ」になる。
つまり
int& a = 〜〜〜;
これは「 a は int 型への参照」を意味するが
int b;
f(&b);
これは「 b へのポインタを関数 f に渡す」になる。
つまりその
(void **)&v
は、「 v へのポインタを、void ** 型にキャストする」
ってことになる。
0576デフォルトの名無しさん
2008/08/28(木) 22:56:01スレ違いだったらすみません
0577デフォルトの名無しさん
2008/08/28(木) 22:56:47友人とソケット通信を作って動かしたら文字化けしたの思い出した。
送信する文字列やサイズは合ってるのでソケットプログラムが原因だと半月対峙したのも今は昔。
>>573
恐らく頂点周りのかな。
575も書いてるけどvをvoid**型にキャストするだけ。
頂点の型は色々ある(ユーザーが作ると型名なんか全て一緒にならない)けど、結局は座標やUV値など中身は似たようなものなので
Lock関数でどんな型でも受け取って処理できるような形になってる。
0578デフォルトの名無しさん
2008/08/28(木) 22:59:34なるほど!
ありがとうございました
0579デフォルトの名無しさん
2008/08/28(木) 23:05:08voidのあとに**を2つつける意味ってなんですか?
調べたら
===
C++でも任意のポインタから void * へは暗黙の型変換が可能です。
でも、void** は、void * ではありません。
ということです。
ちなみに、Cだと、void ** へも暗黙の型変換できてしまうようです。
===
という風に書いてあったのですが いまいち2個つける意味が理解できません
よかったら教えていただけませんか よろしくお願いします
0580デフォルトの名無しさん
2008/08/28(木) 23:11:32【WDM】Windows Driver Model相談室【デバドラ】
http://pc11.2ch.net/test/read.cgi/tech/1063453024/
0582デフォルトの名無しさん
2008/08/28(木) 23:22:32vを持った配列のアドレスといったら分かりやすいかな。
リンゴ(int)の配列がダンボール(int*)で、それの配列が店(int**)。
ダンボールに入れることが出来るのはリンゴだけ。
店にダンボールをいくつも置けるし、そのダンボールにリンゴを入れることも出来る。
店(int**)が今日は1番目のダンボール(int*)を使い、明日は5番目のダンボール(int*)を使う・・・とか店(int**)1つで管理できる。
voidの場合はアドレスの型を指定させない場合に使うので使い方は変わるけどね。
例えが宜しくないけど、ポインタのポインタってこんなイメージでも。
0583デフォルトの名無しさん
2008/08/28(木) 23:27:52おお!ありがとうございます!
理解できました
ポインタのポインタって感じですね
0584デフォルトの名無しさん
2008/08/28(木) 23:28:31ダンボール(int*)が本当にリンゴ(int)を入れてもいいダンボールなのかチェックが必要とかw
例え話はそのままで教えるよりも余計ややこしく感じるぜ
0585デフォルトの名無しさん
2008/08/29(金) 06:19:58× >>
○ > >
0586デフォルトの名無しさん
2008/08/29(金) 06:21:260587デフォルトの名無しさん
2008/08/29(金) 10:46:45文字列に"0A"が来ると改行コードと間違えるのか、変換されたバイナリが「0D0A」になってしまいます。
うまく対処する方法はないでしょうか?
windowsのコマンドプロンプトで利用しています。
int main(int argc, char *argv[]){
int c, sigbit, isSig;
isSig = 1;
while ((c = getc(stdin)) != EOF) {
if ('0' <= c && c <= '9') c -= '0';
else if ('a' <= c && c <= 'f') c = 0x0a + c - 'a';
else if ('A' <= c && c <= 'F') c = 0x0a + c - 'A';
else if (' ' == c || 0x0a == c || 0x0d == c || 0x09 == c) continue;
else {
fprintf(stderr, "invalid character %c\n", c);
break;
}
if (isSig) sigbit = c << 4;
else putc(sigbit | c, stdout);
isSig ^= 1;
}
return 0;
}
0588素人
2008/08/29(金) 10:54:290589デフォルトの名無しさん
2008/08/29(金) 10:55:43http://www.google.com/search?q=stdout+binモード
0590デフォルトの名無しさん
2008/08/29(金) 10:55:500591デフォルトの名無しさん
2008/08/29(金) 11:02:23HRESULTをいうのを使っているのですが
HRESULT Renderer::Initialize(HWND hWnd, BOOL isFullScreen, int clientWidth, int clientHeight)
LRESULTとの違いってなんですか?
LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
ウィンドウプロシージャルを定義するときはLのほうを使って
DirectXの初期化の時などはHを使うって事ですか?
0592デフォルトの名無しさん
2008/08/29(金) 11:02:53setmode()
0593591
2008/08/29(金) 11:05:59WIN32APIスレ行ってきます
スレ汚しすいませんでした
0594デフォルトの名無しさん
2008/08/29(金) 12:40:13ありがとうございました。
0595デフォルトの名無しさん
2008/08/29(金) 19:36:10staticと書かなくてもいいですか?
0596デフォルトの名無しさん
2008/08/29(金) 19:37:41やってみれば分かるが要らない。
0597デフォルトの名無しさん
2008/08/29(金) 22:19:08cl使おうとしてもvcvars32.batを実行したdos窓でしか使えない…
これってsetコマンドの元からの仕様ですか?
Administratorユーザーならdos窓で普通にclが使えるんですが
0598デフォルトの名無しさん
2008/08/29(金) 22:21:37Visual Cの専門スレに行った方がいいですね…
0599デフォルトの名無しさん
2008/08/29(金) 22:22:40環境変数いじればいいんじゃない?
XP なら
[マイコンピュータ]-[プロパティ]-[詳細設定]-[環境変数]
をいじって再起動すればおk
もしかしたらログオフ&ログインだけでもいけるかも
0600デフォルトの名無しさん
2008/08/30(土) 01:00:22ありがとう
0601デフォルトの名無しさん
2008/08/30(土) 09:18:15template<class T>
class Base
{
int m_values[T::Dimension];
};
class A : public Base<A>
{
enum { Dimension = 3, };
};
int main(int argc, char* argv[])
{
A a;
}
a.cpp: In instantiation of ‘Base<A>’:
a.cpp:10: instantiated from here
a.cpp:6: error: incomplete type ‘A’ used in nested name specifier
a.cpp:6: error: array bound is not an integer constant
こういうことってできない?
0602デフォルトの名無しさん
2008/08/30(土) 09:58:42Base<A>のm_valueの定義はAが先に実体化されてるのが前提になりますが、
Aの実体化はBase<A>より後にされますよね。
ならばBaseはAが定義されてることをどうやって知ればいいんでしょうか?
どうしても例のコードの機構が欲しいのなら
BaseにDimensionの定義を移譲するか、BaseやAより先に実体化される型にDimensionの定義を移譲して、
AやBaseはそれを参照するとするとかしかなさそうな気がします。
0603デフォルトの名無しさん
2008/08/30(土) 10:26:46ども
#include <iostream>
template<class T>
class Base
{
public:
void foo()
{
std::cout << T::Dimension << std::endl;
}
};
class A : public Base<A>
{
public:
enum { Dimension = 3, };
};
int main(int argc, char* argv[])
{
A a;
a.foo();
}
これなら通るんだがそういうもんなのか
0604デフォルトの名無しさん
2008/08/30(土) 10:41:53で、a.fooの呼び出しの時点でaの型Aはすでに実体化されてるんでBase<A>::foo内部でのA::Dimensionは問題なく解決できる…と
そういうカラクリみたい
これをよりわかりやすく確認するには、T::dimensionをT::xxxxxのようにAに無い名前にしたら、
エラーになるのはmain()でのa.foo();の行の時点でA a;の時点ではエラーにならない(=a.foo()をコメントアウトすれば通っちゃう)
とかそういう例も見ればいいと思う
0605デフォルトの名無しさん
2008/08/30(土) 10:42:29なるほど
とんくす!
0606デフォルトの名無しさん
2008/08/30(土) 13:48:23例年の合格率は20%切ってると先生に言われた。
そんなに難しいのですか?
0607デフォルトの名無しさん
2008/08/30(土) 13:53:38問題が難しいんじゃない。 受ける層が(ry
0608デフォルトの名無しさん
2008/08/30(土) 13:53:553級は簡単だよ
0609デフォルトの名無しさん
2008/08/30(土) 13:55:24ちなみに、その検定は1級とっても実務では役に立ちません。
0610デフォルトの名無しさん
2008/08/30(土) 13:56:151級は1600行くらいのソースコードを仕様書通りに変更したりするからそう簡単にはいかない
0611デフォルトの名無しさん
2008/08/30(土) 13:57:570612デフォルトの名無しさん
2008/08/30(土) 14:02:320613デフォルトの名無しさん
2008/08/30(土) 14:11:230614デフォルトの名無しさん
2008/08/30(土) 14:17:23ttp://www.geocities.jp/hetadana/suzuki/2.jpg
0615デフォルトの名無しさん
2008/08/30(土) 14:36:150616デフォルトの名無しさん
2008/08/30(土) 15:05:39自分はゲーム専門学校の2年で夏休み前から卒業製作(週15コマ)の話が持ち上がった。
俺は1年の頃から3DのRPGを創りたくて授業とは別に独学で毎日勉強していた(数学・物理・DirectX・アルゴリズムなど)
他の人たちは何創るのか聞いてみたら俺以外みんな似たような美少女系サウンドノベル。
先生が必ずチームになる事と言っていたのでどこかのチームに入らなければいけない。
僕が1年半必死になって勉強した成果は学校では発揮できないのであった。
家で創ろう
0617デフォルトの名無しさん
2008/08/30(土) 15:17:59おまいさんは腐海で腐らされないうちに逃げ出しておきなよ。
私の勤める会社にも、>614の典型のようなのが定期的に入ってくる。
就職できる分だけ頭はいいんだけど全く応用が利かないんだよね。
・何度説明しても変数という概念が理解できない
・1インチは25.4mmと教えているのにインチ→cmの変換関数を作れない
# 理由は「1インチが何cmか判らない」
・「何でプログラムを作るのにキーボードが必要なんですか?」
もうね。
0618デフォルトの名無しさん
2008/08/30(土) 15:21:16この考えを突き詰めると今のように中途半端にVSとかで切り貼りするよりも
新しいタイプのプログラミングモデルが出来るのかも知れない、かも知れないだけだけど
0619デフォルトの名無しさん
2008/08/30(土) 15:29:56さすがにそこまでひどいのは見た事無いな
全角空白が混じっててコンパイルできないってやつなら見た事あるけど
0620デフォルトの名無しさん
2008/08/30(土) 15:31:210621デフォルトの名無しさん
2008/08/30(土) 15:34:18玄人に必要なのはマウスのみ!
0622デフォルトの名無しさん
2008/08/30(土) 15:35:480623デフォルトの名無しさん
2008/08/30(土) 15:38:310624デフォルトの名無しさん
2008/08/30(土) 15:39:140625デフォルトの名無しさん
2008/08/30(土) 15:43:14なるほど!
それなら寝ながらプログラミングできるな!!
0626デフォルトの名無しさん
2008/08/30(土) 16:11:24std::string::size_type ret = str.find(0x09);
while (ret != str.npos && ret + 1 < str.length() ) {
str.replace(ret, 1, " ");
ret = str.find(0x09);
}
タブを半角スペース4つに置き換えるサンプルですが
whileの条件で、ret + 1 < str.length() は何のためにあるのでしょうか?
これがあると、ファイルの最後でタブが見つかっても置き換えされないと思うんだけど
0627デフォルトの名無しさん
2008/08/30(土) 17:15:14猫が水泳するゲームを作りたいのですが
創り方のアドバイス?いただけませんか。
使える言語は
C/C++
OpenGL/DirectX
WIN32API
です
0628デフォルトの名無しさん
2008/08/30(土) 17:16:51脳は腐る前に使えよ
0629デフォルトの名無しさん
2008/08/30(土) 17:21:340630デフォルトの名無しさん
2008/08/30(土) 17:26:18Cでアクションとかシューティングゲームのソース公開してるのを見て、真似をする。
0631デフォルトの名無しさん
2008/08/30(土) 17:52:06Vistaの音声認識でperlのプログラム書こうとするもうまく行かなくて、
最終的にキーボードつかっちゃう動画があったよな…
0632デフォルトの名無しさん
2008/08/30(土) 19:24:15CTestAクラスの関数MsgAとCTestBクラスの関数MsgBがあります。
それぞれ void CTestA::MsgA(int) 、 void CTestB::MsgB(int) このような感じです。
加えてCTestCクラスにMsgC( void (*pFunc)(int) )があり、そこにMsgAとMsgBを渡したいのですが無理なのでしょうか。
どのようなクラスでも引数と戻り値があっていればMsgCに渡すことが出来、
MsgC内で
if( pFunc )
pFunc( n );
のように実行できるようにしたいのですが、MsgCにクラスの関数を渡すことが出来ずに困っています。
void CTestA::Test(void){
〜略〜
pTestC->MsgC( (void*)( MsgA ) );
}
とやってもキャストが出来ずエラーが出ました。
クラスでなければMsgCに渡すことが出来たので、やはりクラスの関数は無理なのでしょうか。
0633デフォルトの名無しさん
2008/08/30(土) 19:35:47よってMsgAはCTestAのインスタンスを必要とし、MsgBはCTestBのインスタンスを必要とする。
即ちMsgC( void (*pFunc)(int) )はどんなインスタンスも必要としない関数しか引数にとることが出来ず、
もし仮に何らかのインスタンスを必要とする関数を外部から実行したいのなら、インスタンスとメンバポインタを渡す必要がある。
ちなみにboostには、インスタンスとメンバ関数のポインタを渡せば、関数の属する型がどんな型であっても
動的に解決して実行してくれるものが存在する。
これは、テンプレート関数で実行をラップし、そのテンプレート関数のポインタを動的に操作しているに過ぎない。
0634617
2008/08/30(土) 19:39:33課題の書かれたメールからキーワードを抽出して検索、
見つかったサンプルっぽいコードをコピペすれば完成。
この間、マウス操作だけで行なってしまうわけ。
勿論、最初はコンパイルさえ通らない。
そうしたらエラーメッセージで検索して、
また適当に見つかったサンプルからコピペしてくる繰り返し。
それを見咎めて「目の前にキーボードがあるんだから、
課題ぐらい自分で打てよ」と言われたときの返事が
>「何でプログラムを作るのにキーボードが必要なんですか?」
というわけ。
他の二人は自分には向いてないと理解したし素直にやめたが、
このマウス野郎は親からクレームの電話が掛かってきたらしい。
# この親にしてこの子ありと言うか、まさにモンペ。
0635デフォルトの名無しさん
2008/08/30(土) 19:42:24関数のポインタを求めるメンバ関数を作るくらいなら、MsgCが求める
インターフェイスへのポインタを入力にして、MsgCの中でそれを呼ぶ。
仮想関数ってそのためのものだし。
メンバ関数のアドレスを入力にするという方法もある。
個人的にはどっちもおすすめではない。
オブジェクトのコンポジションで解決すべき内容な気がするし。
0636632
2008/08/30(土) 21:21:20ありがとうございます。
改めて色々考えてみましたが一筋縄ではいかないようですね。
想定している用途としてはCTestCクラスのインスタンスに別のクラスの関数を登録しておき、
CTestCクラスのインスタンスが一定回数呼び出されたら登録した関数を呼び出す。
他にもデストラクタに「削除」のメッセージを登録した関数に送るなども考えています。
登録する関数は様々なクラスのもの、関数名自体も不定・・・となれば頭を悩ませてしまいます。
テンプレート自体名前ぐらいしか知らないのですが、これを上手く使えば上記のことが解決するのでしょうか。
0637デフォルトの名無しさん
2008/08/30(土) 22:50:32cppは空でヘッダにバリバリ書いていくけど、
複数のcppからそのヘッダを読み込んで実体化すると、
その分バイナリの容量が増えることが多い?
0638デフォルトの名無しさん
2008/08/30(土) 22:59:00テンブレートなんて使わずに、
オブザーバパターンでググってみれ。
ここから先は有料だ。
0639デフォルトの名無しさん
2008/08/30(土) 23:03:510640デフォルトの名無しさん
2008/08/30(土) 23:42:50違うんでない?
Observerパターンはあるオブジェクトの振る舞いがなされたことを、
通知先のオブジェクトの型にかかわらずにインターフェイスを介して
行うこと。通知先の登録・削除があるのが普通。
639も言うとおり、MsgCをコールする際にインターフェイスを
求めるのはどちらかと言うとテンプレートメソッドに近いかと。
いちいち継承したりインターフェイスを実装したりするのがウザい
から、他の言語では delegate。
0641デフォルトの名無しさん
2008/08/31(日) 00:21:36そもそもデリゲートはstatic関数しか駄目じゃん。
たくさんコールバック関数があるとかいってるからもう少し整理して抽象化するべき。
よってオブザーバをすすめる。
0642デフォルトの名無しさん
2008/08/31(日) 01:06:10トランプデータが上手く格納されない、PCのビープ音連発するけど、解決策が全く見えない。
ソースUPしますので悪い所指摘お願いします。
環境はVC6.0です。
http://www.dotup.org/uploda/www.dotup.org0113.cpp.html
0643デフォルトの名無しさん
2008/08/31(日) 01:18:58関数じゃなくて、オブジェクトを登録して、RTTIでクラスを判別しつつ、適当なメソッドを呼び出すってのもありじゃね。
>>642
とりあえず、swp(int a, int b)がよろしくない。
swp(int& a, int& b)にするとか?
0644デフォルトの名無しさん
2008/08/31(日) 01:48:04お前は何を言ってるの?
0645デフォルトの名無しさん
2008/08/31(日) 03:29:42数値の入れ替え自体は std::swap を使えばおk
但し、配列同士の入れ替えはできないのでこんな感じ
std::swap(cards[ran1][0],cards[ran2][0]);
std::swap(cards[ran1][1],cards[ran2][1]);
cout に char を与えると char を文字コードとして出力する
数値として出力したければ int を cout に渡せばよい
C++ のキャストはよく知らんのでどう書くかは他の人に任せる
入れ替えのアルゴリズムについて
変数 cards は構造体もしくは class にすれば
std::random_shuffle(&cards[0], &cards[51+1]); // この場合は cards[0]〜cards[51] までの計 52 枚をシャッフルする
とかできる
または下記のアルゴリズムがそれなりに優秀
for(int i=0;i<52;i++){
ran2=rand()%(i+1);
std::swap(cards[i], cards[ran2]);
}
0646デフォルトの名無しさん
2008/08/31(日) 03:43:59レス有難う御座います。
他のところは自己解決しましたが、シャッフルの良い案が無くて詰ってました。
提示していただいたシャッフルアルゴリズム見ながらいじってみます。
0647デフォルトの名無しさん
2008/08/31(日) 04:19:38各人がライブラリを公開している所ってある?
0648626
2008/08/31(日) 04:39:59strはstd::stringです
ret + 1 < str.length() が必要なのか誰か教えてください
0649デフォルトの名無しさん
2008/08/31(日) 07:56:16普通に考えて、タブを空白に変換するには先頭からのカラム数を意識する必要がある。
さもなくば、先頭からの連続したタブだけを対象にするとか。
そのどちらでも無いそのサンプルは、要はそのサンプルならではの仕様なんでしょ。
いずれにしても、「0x09」なんて書いているサンプルじゃ見るだけ無駄だよ。
0650デフォルトの名無しさん
2008/08/31(日) 10:00:05Wcharは色々と使いにくいんです。
ファイル、ディレクトリアクセスに関わる所だけWcharに変換してアクセスしたら良いと思います
0651デフォルトの名無しさん
2008/08/31(日) 10:00:23DJGPPのgxx.exe使おうと思ったら
Cannot execute "gcc.exe": No such file or directory(ENOENT)
てエラーでたんだが。。。
gxxってコンパイラの補助してるだけなの?
やっぱりcygwinとか入れてgcc使える状態にしなきゃだめなの?
0652デフォルトの名無しさん
2008/08/31(日) 10:10:42そうですか。じゃあそうしてください。
0653デフォルトの名無しさん
2008/08/31(日) 10:14:370654デフォルトの名無しさん
2008/08/31(日) 10:55:08main()
{
int ia;
printf("好きな数字を入力してください:");
scanf("%d", &ia);
if (ia >= 0)
printf("+の数字が入力されました\n");
else
printf("-の数字が入力されました\n");
}
これをコンパイルしようとすると
rezserverd.libが見つかりませんって出るんですけど
どう対処すればいいですか?
0655デフォルトの名無しさん
2008/08/31(日) 10:56:16アクセスごとに、バッファのサイズを確認して書き出せば一応出来ますが
もしバッファが、49M貯まっていてあと1メガふえれば書き出す場合に
データはしばらく来なかったら、書き出されるバッファを占有し、電源切れたらデータも消えます。
タイマーみたいにしてアクセスが無い事を知る方法はありますか?
0656デフォルトの名無しさん
2008/08/31(日) 11:00:30デストラクタでフラッシュするようにしたら?
0657デフォルトの名無しさん
2008/08/31(日) 11:08:51本当にそのライブラリがないといわれるなら作成環境を1から作り直さないとやばそうな気が。
0658デフォルトの名無しさん
2008/08/31(日) 11:16:03環境変数 djgpp に djgpp.env のフルパスを設定しる
0659デフォルトの名無しさん
2008/08/31(日) 11:26:42開発環境がおかしい。
環境は何?
まぁ何であれ>>657の通り作り直さないといけないけど。
0660デフォルトの名無しさん
2008/08/31(日) 11:27:08gxx.exeが「djgppのgcc.exe」を呼び出してると思われ。
cygwinとかは要らないっしょ。
0661デフォルトの名無しさん
2008/08/31(日) 11:36:08readme読んだらそうらしい。
最低限必要なファイルが4つくらいに分かれて配布されてた。
英語でもreadme嫁ですね。
0662デフォルトの名無しさん
2008/08/31(日) 11:40:27>>659
開発環境はマトリョーシカです。
開発環境の構築を再確認してみます
0663デフォルトの名無しさん
2008/08/31(日) 12:05:17結構面白くてみんなから羨望のまなざしを受けてるんだけど、某ツクール作品で受かったやつっているのか?
流石に無いと思うんだが・・・。
0664デフォルトの名無しさん
2008/08/31(日) 12:06:46何の専門学校だよ
0665デフォルトの名無しさん
2008/08/31(日) 12:06:49スレ汚しすいません
0666デフォルトの名無しさん
2008/08/31(日) 12:44:070667デフォルトの名無しさん
2008/08/31(日) 12:47:12SetWaitableTimerは時間経ったらシグナルを出すんですね。
0668デフォルトの名無しさん
2008/08/31(日) 12:57:22どの排他処理が優れているとかはないですよね? 以前はどれか一つを学べば良いと思ってました。
クリティカルセクション ・・・ コードで止める
ミューテックス ・・・ リソースで止める
セマフォ ・・・ 回数で止める
SetWaitableTimer ・・・ 時間で止める
0669デフォルトの名無しさん
2008/08/31(日) 12:59:13もう少しOSの勉強してからだと理解早いと思うよ。
0670デフォルトの名無しさん
2008/08/31(日) 13:15:42何それ
0671デフォルトの名無しさん
2008/08/31(日) 13:24:18初心者がまあり考慮しなくても起こらないように出来るAPIやライブラリはありますか?
デッドロック - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF
0672デフォルトの名無しさん
2008/08/31(日) 13:35:36mutexは?
0673デフォルトの名無しさん
2008/08/31(日) 14:06:200674デフォルトの名無しさん
2008/08/31(日) 14:27:48性質を理解してれば発生しないように作ることは出来るよ
0675デフォルトの名無しさん
2008/08/31(日) 14:46:14それをコピーしておけば、他の書き込み待ちがあっても呼び出し先へ直ぐに復帰でき
元のメモリも自由になります。
もし、500Mの書き込みなら、メモリにコピーするのは大変で、書き込み完了まで待たせた方が良さそうです。
何メガ以内ならコピーしたら良いと思いますか?
0676デフォルトの名無しさん
2008/08/31(日) 14:57:200677デフォルトの名無しさん
2008/08/31(日) 14:57:30十分注意せよ
0678デフォルトの名無しさん
2008/08/31(日) 15:17:300679デフォルトの名無しさん
2008/08/31(日) 15:44:010680デフォルトの名無しさん
2008/08/31(日) 15:54:34Writeは利用する側からすれば完了しているになっているので
0681デフォルトの名無しさん
2008/08/31(日) 16:24:00数値によってエコーの量が変わるプログラムを作りたいのですが
何から着手していいのかわかりません・・・・。
アドバイスもらえませんか?
0682デフォルトの名無しさん
2008/08/31(日) 16:25:18C/C++ の話になったらまたおいで。
サウンドプログラミング4
http://pc11.2ch.net/test/read.cgi/tech/1185340076/
0683デフォルトの名無しさん
2008/08/31(日) 19:10:11何を言いたいのかよくわからないが、一度「トランザクション」でぐぐって勉強がいいかも。
これ以上の話はスレ違いだから、続けるならどこか適当な場所で。
0684デフォルトの名無しさん
2008/08/31(日) 21:40:47for(int i = 0; i < nCmdShow; i++) {
if(_stricmp((char*)&lpCmdLine[i], "/f") == 0) {
isFullScreen = TRUE;
break;
}
}
これの部分でif(_stricmp((char*)&lpCmdLine[i], "/f") == 0)
コマンドラインに/fがあればTRUEにするってことだと思うのですか
(char*)&lpCmdLine[i]はどういういみですか?
0685デフォルトの名無しさん
2008/08/31(日) 21:43:040686デフォルトの名無しさん
2008/08/31(日) 22:15:18なんで質問部分の肝になるlpCmdLineの宣言をコピーしないの? つーか、取捨選択もできない馬鹿なら関数丸ごと貼りなさいよ。
0687デフォルトの名無しさん
2008/08/31(日) 22:37:11int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// フルスクリーンかどうかの判定
// コマンドラインに/fか/Fがあればフルスクリーンにする
BOOL isFullScreen = FALSE;
for(int i = 0; i < nCmdShow; i++) {
if(_stricmp((char*)&lpCmdLine[i], "/f") == 0) {
isFullScreen = TRUE;
break;
0688デフォルトの名無しさん
2008/08/31(日) 22:42:05型キャストして警告を消してるんだろう
0689デフォルトの名無しさん
2008/08/31(日) 22:42:16&lpCmdLine[i]で全く問題ない。元のコード書いたやつが無知なだけだ。
0690デフォルトの名無しさん
2008/08/31(日) 22:43:41LPSTRはchar*のtypedefだぞ。
0691デフォルトの名無しさん
2008/08/31(日) 22:49:28fで始まるオプションは"/f"しか使えないけどいいんだろうか
0692デフォルトの名無しさん
2008/08/31(日) 22:50:29寝るか
0693デフォルトの名無しさん
2008/09/01(月) 02:01:38常駐みたいな感じです。
0694デフォルトの名無しさん
2008/09/01(月) 04:49:580695デフォルトの名無しさん
2008/09/01(月) 09:51:21int hant(int f, int s)
{
if(f==1 && han[0]/100<=0) return han[0]+100;
else if(f==2 && han[0]/10%10<=0) return han[0]+10;
else if(f==3 && han[0]%10<=0) return han[0]+1;
if(s==1 && han[1]/100<=0) return han[1]+100;
else if(s==2 && han[1]/10%10<=0) return han[1]+10;
else if(s==3 && han[1]%10<=0) return han[1]+1;
}
数字1〜3を受け取り一回でも現れたら
1=100 2=10 3=1 の桁に1を入れて3桁の数字を返したいですが
何度やっても、0しか返してくれません。
何度読み直しても何処がいけないのか分かりません・・・
ヘルプお願いします。
0696デフォルトの名無しさん
2008/09/01(月) 10:24:02どれにも一致しなかったら何を返すんだい?
0697デフォルトの名無しさん
2008/09/01(月) 10:28:36han[ ]が初期化されている1回目はちゃんと動くはず
いったん値が保存されると2回目からは値を返さないよ
関数の最後にreturn han[0];とかいらないのか
0698デフォルトの名無しさん
2008/09/01(月) 10:28:53一応ちゃんと帰って
0699デフォルトの名無しさん
2008/09/01(月) 10:31:33int v;
v = hant(0, 3);
みたいにするとhantの戻り値でちゃんと返ってきてるみたいだよ
0になるってもしかして
printf("%d, %d\n", han[0], han[1]);
みたいにhan[0]を表示しようとしていない?
0700デフォルトの名無しさん
2008/09/01(月) 10:34:48一応受け取る数字は1〜3以外はブロックしてます。
あと、この問題自己解決しました。
どうやらHant()が丸ごと動かなかったようで
Han[]のグローバル宣言をやめMain()内で宣言、Hant()もMain()に組み込むことで
何とか動いてます。
0701デフォルトの名無しさん
2008/09/01(月) 10:45:35元のままで、
int hant(……
→
void hant(……
return han[0]+100;
→
han[0]+=100;
他も同様
と変える。
0702デフォルトの名無しさん
2008/09/01(月) 11:16:50いま、プログラム自体は何とか動いてますが
Main()が無駄に膨らんできたのでげんなりしてます。
これからもお世話になると思うので、今まで書いたソースをUPしときます
一から自分で書くのは今回初めてなので悪い所があったらご指摘お願いします。
http://www.dotup.org/uploda/www.dotup.org2141.cpp
プログラムはマルバツゲーム、大体の動きが出来上がったので
次はAIを詰め込む予定です。
勝利判定がまた不十分な点は暫くスルーすることにしました。
0703デフォルトの名無しさん
2008/09/01(月) 11:31:01>void main()
基本的には間違い。
> char fil[5][5]={"0123","1","2","3"};
無駄。表示用文字管理とデータ管理は分けたほうがいい。
その所為で、入力処理の辺りがぐだぐだになっている。
つーか、肝心なまるとばつを置く場所が初期化されてないぞ。
> if(flag==0) cout <<" MARU \n";
> else if(flag==1) cout <<" BATU \n";
慣れないうちはブロック化推奨。
> //勝利判定の時間
>
>
>
> cout <<han[flag][0]<<" !!!!!!!!!!!!!! "<<han[flag][1]<<"\n"; //判定フィールド確認用
何この変なインデントと無駄な空行。
つーか、判定方法考えすぎで滅茶苦茶になってないか?
なんでわざわざ数値化しているんだ?
仮に、filがちゃんと管理されていればhanの配列なんていらんだろ。
例えば、fil[1][1] == 'O' && fil[1][2] == 'O' && fil[1][3] == 'O'みたいな愚直な判定で十分。
0704デフォルトの名無しさん
2008/09/01(月) 12:37:21main()の宣言について、少し調べてみます。
>> char fil[5][5]={"0123","1","2","3"};
>無駄。表示用文字管理とデータ管理は分けたほうがいい。
>その所為で、入力処理の辺りがぐだぐだになっている。
>つーか、肝心なまるとばつを置く場所が初期化されてないぞ
データ部分だけくりぬくってのはやりたいのですが
出力方法は配列しか思い浮かびませんでした。
初期化については、文字を一度クリアして同じ所に描画することなら
今猫でもわかるで調べてますが、上手く行ってません
>つーか、判定方法考えすぎで滅茶苦茶になってないか?
>なんでわざわざ数値化しているんだ?
最初は力業でやろうとしましたが、物凄い量のコードになりそうだったことと
CPU対戦を詰め込むとさらに増えそうだったので、数値化してみました。
0705そもそも猫なんか見ているから……
2008/09/01(月) 13:13:00海岸でいきなり1mもあるような砂の城を作ろうとしてもw
まずは30cmくらいの砂の山で我慢しておけって。
そうすれば城を作るにはどんな技術が必要になるのか見えてくるだろ。
と、例え話はさておき。
filは初期状態ではこうなっている。
0 1 2 3 \0
1 \0 \0 \0 \0
2 \0 \0 \0 \0
3 \0 \0 \0 \0
\0 \0 \0 \0 \0
一方、表示ルーチンではその内容を文字列としてではなく文字として出力している。
つまり、\0を出力しようとしているわけで、そこは明らかにおかしい。
更に言えば、文字単位でしか出力しないのなら、文字列として扱う必要もないということ。
また、表示用の0123なんて文字も、データとしては全く必要ない。
そこで私がこのレベルで書くなら、char fil[3][3]; for (int iy = 0; iy < 3; ++iy) for (int ix = 0; ix < 3; ++ix) fil[iy][ix] = ' ';とする。
# まぁ、定数の3は生では使わないが。
表示ルーチンも、最初から独立して考えればいい。
例えばこんな感じ。
void print(char const field[][3])
{
cout << "0123\n";
for (int iy = 0; iy < 3; ++iy) {
cout << iy + 1;
for (int ix = 0; ix < 3; ++ix) {
cout << field[iy][ix];
}
cout << '\n';
}
}
これなら、最初の表示にもループ中の表示にもそのまま使える。
0706デフォルトの名無しさん
2008/09/01(月) 13:58:000707デフォルトの名無しさん
2008/09/01(月) 18:40:31{
public:
virtual void method(){..}
};
class B : public A
{
public:
void method();
};
こういう継承関係があって
vector<A> list;
B b;
list.push_back(b);
list[0].method();
こうやるとBのメソッドが呼ばれず直接Aに行くのだけど
Bに行かせるにはどうすればいいの?
0708デフォルトの名無しさん
2008/09/01(月) 18:44:32B *b = new B();
list.push_back(b);
list[0]->method();
※deleteし忘れ注意
0709デフォルトの名無しさん
2008/09/01(月) 18:52:54((B*)list[0])->method();
じゃなくて?
スマートじゃないな
0710デフォルトの名無しさん
2008/09/01(月) 19:05:44push_back に渡された b を元にコピーコンストラクトした A で、
その A の method を呼んでるだけだから
vector に持たせるのがポインタだけなら
ポインタ自体をいくらコピーされても実体は B のままだから呼べる
でも解放し忘れやすいので vector<shared_ptr<A> > を使うべきという人もいる
0711デフォルトの名無しさん
2008/09/01(月) 19:06:17ttp://homepage3.nifty.com/mmgames/c_guide/index.htmlを大体見たんですけどC++はまだ早いですか?
それともほかに見たほうがいいサイトがあるのでしょうか。
教えてください。
0712デフォルトの名無しさん
2008/09/01(月) 19:08:54スライシングと言って、listに格納されたときにはBではなくAのオブジェクトになっている。
だもんで、一般的に継承を使うクラスではコピー禁止にすることが多い。
>>709
それじゃなんのための仮想関数ってことになるじゃないか。
0713デフォルトの名無しさん
2008/09/01(月) 19:09:47見ただけ?
得た知識を元に実際に何か役に立ちそうなプログラムを一度自分で作ってみるべき
0715デフォルトの名無しさん
2008/09/01(月) 19:14:57自分がやりたいと思うことをやればいいじゃない。
0716707
2008/09/01(月) 19:37:55B *b = new B();
list.push_back(b);
だといけるけど
void add(A *a){
list.push_back(a);
}
B *b = new B();
add(b);
list[0]->method();
ってあるとやっぱりAに行く
追加はメンバ関数で隠蔽したいんだけどこれはどうしたらいいの?
0717デフォルトの名無しさん
2008/09/01(月) 19:49:03#include <vector>
class A { public: virtual void method(){ printf("A::method\n"); }};
class B : public A { public: virtual void method(){ printf("B::method\n"); }};
class Foo {
std::vector<A*> list;
public:
void add(A *a){ list.push_back(a); }
void foo(){
B *b = new B();
add(b);
list[0]->method();
}
};
int main() { Foo().foo(); }
実行結果
B::method
>>716
そんなことにはならないが・・・
0718デフォルトの名無しさん
2008/09/01(月) 19:52:500719デフォルトの名無しさん
2008/09/01(月) 19:53:250720デフォルトの名無しさん
2008/09/01(月) 19:54:49ほかになんかC関係のサイト一つ眺めてみてスッと読めるようなら、
知識としてのCはいいんじゃない?
さっさとC++覚えて、いろんなもの作ってみればいいよ
0721707
2008/09/01(月) 19:59:27なんでだろ
0723デフォルトの名無しさん
2008/09/01(月) 22:02:21//observerの抽象クラス
class Observer
{
protected: virtual ~Observer() = 0 { };
public: virtual void update() = 0;
};
//observerの具象クラスが共通に持つインターフェースのクラス
class DisplayElement
{
protected: virtual ~DisplayElement() = 0 { };
public: virtual void display() const = 0;
};
//observerの具象クラス(の1つ)
class ConcreteObserver : private Observer, private DisplayElement { ... };
こういったものがあります。
(subject側のクラスは、protectedなデストラクタを持つ抽象クラスを、public継承した具象クラスという形でした。)
・基底クラスのデストラクタがprotectedである理由
・具象クラスがprivate継承している理由
がよく分からないのですが、よろしければ教えていただけないでしょうか。
0724デフォルトの名無しさん
2008/09/01(月) 22:25:35は基底クラスのポインタでdeleteされた時に派生クラスのデストラクタが呼ばれる様にするため
・具象クラスがprivate継承している理由
ConcreteObserver以外のクラスからupdate()やdisplay()を呼ばれたくないとか
0725デフォルトの名無しさん
2008/09/01(月) 22:30:57またそんな微妙なサイトを……
0727デフォルトの名無しさん
2008/09/01(月) 22:37:20宿題スレの宿題でも解いてみたら?
0728デフォルトの名無しさん
2008/09/01(月) 22:49:05template<template<class T, class A=std::allocator<T>>class C, class T>
void func(C<T> arg);
vector<int> v;
func(v);
このように引き数に渡されたコンテナを、コンテナ型と中身の型とに
分けて知ることができますが、
template<template<class T, class A=std::allocator<T>>class C, class T>
class separator {
//C<T>のTの型が知りたい
typedef T param_t;
}
separator<vector<int>>::param_t val; //引数の数が合わない
テンプレートクラスでテンプレート引数に渡されたコンテナを分解することが
上手くできません。どう書けばいいのでしょうか?
0729デフォルトの名無しさん
2008/09/01(月) 22:56:26template<class C>
class separator {
typedef typename C::value_type param_t;
};
0730デフォルトの名無しさん
2008/09/01(月) 23:04:09テンプレート型全般に適用できる方法が無いか
知りたかったんですが。
0731デフォルトの名無しさん
2008/09/01(月) 23:05:41>>・基底クラスのデストラクタがprotectedである理由
>>は基底クラスのポインタでdeleteされた時に派生クラスのデストラクタが呼ばれる様にするため
→これはデストラクタにvirtualがついている理由。
protectedにするとObserver型のポインタに対してdeleteできなくなり、Observerクラスを以下のようにポリモーフィックに使えなくなる。
Observer* p = new ConcreteObserver;
p->update();
delete p;
・具象クラスがprivate継承している理由は、上記と同じ。private継承すると、デストラクタをpublicに変えても上記コードはコンパイルエラーになる。
Observerクラスをポリモーフィックに使われないようにこうしてると思う。
0732731
2008/09/01(月) 23:09:06>>protectedにするとObserver型のポインタに対してdeleteできなくなり、Observerクラスを以下のようにポリモーフィックに使えなくなる。
間違えた。ポリモーフィックには使える。
Observer* p = new ConcreteObserver;
p->update();
delete p; //ここでコンパイルエラー
ちなみにprotectedデストラクタはvirtualつけない方が普通(推奨)と思うけどね。
0733デフォルトの名無しさん
2008/09/01(月) 23:19:35なら部分特殊化。
template<class>
class separator;
template<template<class, class> class C, class T, class A>
class separator<C<T, A> > {
public:
typedef T param_t;
};
separator<std::vector<int> >::param_t val;
0734731
2008/09/01(月) 23:21:53Observer* p = new ConcreteObserver;//private継承によってこれを禁止
p->update();
delete p; //protectedデストラクタによってこれを禁止
0735724
2008/09/01(月) 23:26:020736デフォルトの名無しさん
2008/09/02(火) 00:46:02int* i = NULL;
int x = *i; // フォルト
以下のようにするとフォルトが発生しません。
どうしてなのでしょうか?
int* i = NULL;
int& Int() { return *i; } // ここでフォルトが起きるはずでは?
int main(void) {
int* x = &Int(); // xにはちゃんとNULLが入っている
return 0;
}
0737723
2008/09/02(火) 00:47:57検証コードを書きつつ、なるほどと納得させていただきました。
ついでに、もう少し突っ込んでお聞きしたいのですが、
>>734で書いていただいたように、new/deleteからの多態性が禁止されている事は分かったのですが、
ConcreteObserver co;
Observer* pco = &co;
pco->update();
といった形での多態性は、サンプルコードでも肝として使用されています。
作者の意図がいまいち分からないので、もし自分がObserberパターンをコーディングするとしたら、
抽象クラスの仮想デストラクタをpublicにして、それをpublic継承して具象クラスを書くと思うのですが、
それではまずい事態を招きうるのでしょうか?
0738デフォルトの名無しさん
2008/09/02(火) 00:53:37そう書けたのですか!
感謝
0739デフォルトの名無しさん
2008/09/02(火) 00:57:18空ポインタをデリファレンスしたときの動作は未定義だから。
0740デフォルトの名無しさん
2008/09/02(火) 00:59:08参照を返すとき、実際に中身にアクセスするわけではありません。
従って、ポインタのポイント先の実体の参照を返すときにもポイント先にアクセスせずに、参照を返せるのです。
0741デフォルトの名無しさん
2008/09/02(火) 02:30:38例えば以下のようなファイルをコンパイルしようとすると
----hoge.h-------
#ifndef h_hoge
#define h_hoge
#include "some_class_flags.h"
void check_error(some_class_flags err);
#endif
----hoge.cpp-----
#include "hoge.h"
#include <wx/wx.h>
void check_error(some_class_flags err){
if (err!=0) wxMessageBox(wxT("ERROR"),wxT("err"),wxOK);
}
---------------
hoge.h:4: error: variable or field ‘check_error’ declared void
hoge.h:4: error: ‘some_class_flags’ was not declared in this scope
というエラーが出てきます。どこがいけないのでしょうか?
0742デフォルトの名無しさん
2008/09/02(火) 02:39:050743741
2008/09/02(火) 02:45:46私もそうだと思ったのですが、クラス名(またはTypedef名)に打ち間違いはなく、
実際のところ some_class_flagsは広く使われているライブラリのヘッダなので、
some_class_flags.h 自体に間違いが有る可能性も低いと思います。
0744デフォルトの名無しさん
2008/09/02(火) 02:49:17>some_class_flags.h 自体に間違いが有る可能性も低いと思います。
だってコンパイラが文句言ってんだろ
一度ヘッダファイル覗いてみ
0745デフォルトの名無しさん
2008/09/02(火) 02:51:250746741
2008/09/02(火) 02:51:32すいません、自己解決しました。
小文字のlと数字の1の読み違いだったようです。
自分の視力にWarningを吐くべきなのでしょうか。
0747デフォルトの名無しさん
2008/09/02(火) 02:54:370748デフォルトの名無しさん
2008/09/02(火) 03:30:170749デフォルトの名無しさん
2008/09/02(火) 04:46:47オーバーロードされたうちのどれかを実行する…なんてことはできませんか?
0750デフォルトの名無しさん
2008/09/02(火) 05:06:01内容によってって、同じ型なんだからオーバーロードでは無理だろ
値によって関数を呼び分ける関数作ればいい
0751デフォルトの名無しさん
2008/09/02(火) 05:16:30ありがとうございます!その方法を利用させていただきます
0752デフォルトの名無しさん
2008/09/02(火) 05:18:240753デフォルトの名無しさん
2008/09/02(火) 05:24:05こういった使い方もできるのですね
ありがとうございます。
0754デフォルトの名無しさん
2008/09/02(火) 05:58:470755デフォルトの名無しさん
2008/09/02(火) 06:02:40可変引数 c でぐぐれ
0756デフォルトの名無しさん
2008/09/02(火) 06:08:22va_arg
va_end
を使って作る
0757デフォルトの名無しさん
2008/09/02(火) 10:52:55ジェネレータ自体は関数オブジェクトとして代用できると
思うのですが、ジェネレータを書くに当たって yield のような
仕組みがあったら便利だなぁと思っています。
0758デフォルトの名無しさん
2008/09/02(火) 12:01:050759デフォルトの名無しさん
2008/09/02(火) 15:31:57自分で作る場合どこまでヘッダオンリーで我を通していいものなのでしょう?
なんらかの指針、判断材料があったりするものでしょうか?
0760デフォルトの名無しさん
2008/09/02(火) 15:54:14ありがとう!
うーん、どうして boost の format はそれを使わないのでしょう?
ttp://boost.cppll.jp/HEAD/libs/format/doc/choices.html
一杯宣言しないといけないんだ。みたいなことを言っていますが、
それを使えばいいのですよね?
(自分の環境では化けるんだけど皆も?本当は EUC-JP みたい)
0761デフォルトの名無しさん
2008/09/02(火) 16:07:20そこに書いてある関数呼出の手法はva_*を使うものではない。
そもそもC++ではva_*での可変個引数が論外だから取り上げられていないだけ。
0762デフォルトの名無しさん
2008/09/02(火) 17:40:59型安全のため
0763デフォルトの名無しさん
2008/09/02(火) 19:07:26コンパイル時間が気になるかどうかじゃね?
0764731
2008/09/02(火) 20:07:22>>ConcreteObserver co;
>>Observer* pco = &co;
>>pco->update();
これってできないんじゃないかな。VC9だと以下のエラーになるよ。
error C2243: '型キャスト' : 'ConcreteObserver *' から 'Observer *' の変換は存在しますが、アクセスできません。
作者の意図は確かによく分からない。
public仮想デストラクタ&public継承でも大きな問題はないと思います。
0765デフォルトの名無しさん
2008/09/02(火) 21:22:45それ用の名前空間に収められるかどうか。
つまりそのヘッダに、実装のためだけに必要な、
#include<sys/socket.h>
とか入ってて、よその名前空間やグローバルを撒き散らすなら、
.cppに移すべき。
0766765
2008/09/02(火) 21:26:40そのヘッダに#include<windows.h>があるのは良い、
実装だけでなく、インターフェイス部分で使っているため。
0767765
2008/09/02(火) 21:28:190768デフォルトの名無しさん
2008/09/02(火) 21:48:03通常は public な仮想デストラクタを持つ抽象クラスを public 継承すれば
問題ない。ただ、update メソッドが Subject 以外からも呼ばれ得ることを
危険視するなら、private 継承して this を Subject に渡すことで多態する
トリックが使える。こんな感じ(脳内コンパイル)。
class PrivateObserver : private Observer {
virtual void update(Subject* sub) {
// Subject 以外からは呼んで欲しくないメソッド
}
public:
PrivateObserver(Subject* sub) {
// private 継承している内部からは Observer として振舞える!!!
sub->AddObserver(this);
}
// ...
};
疑心暗鬼で眠れないあなたに。でもそのサンプルは謎だね。
0769デフォルトの名無しさん
2008/09/02(火) 23:25:45可変長引数の仮引数は格上げされてしまうのですね。
char, short --> int
float --> double
あれ、でもそもそも %s 用な文字列ってどう処理しているのでしょう?
'\0' まで va_arg で進めるとかなんですかね?
0770デフォルトの名無しさん
2008/09/02(火) 23:27:04ポインタ
0771デフォルトの名無しさん
2008/09/02(火) 23:27:08まぁ、ポインタはvoid *に格上げされてしまうと解釈しておけば。
0772デフォルトの名無しさん
2008/09/02(火) 23:48:03なるほど。じゃあ std::string str を渡そうと思ったら、
sprintf("%s", &str);
--
va_arg(ap, std::string*);
みたいな?確かに &str は嫌ですね。
0773723
2008/09/02(火) 23:50:22レスありがとうございます。
最初にお詫びしなければいけないのは、>>737で出来ると書いたコードですが、出来ませんでした。
検証中、一時的にpublic継承に書き換えた部分を戻すのを忘れててコンパイルが通った、
という初歩的なミスで、大変申し訳ないです。
実際には、>>768で書いていただいたような形で実装されており、
それを出来るだけ簡易に不要な部分を省いて、と思いつつ、
"クラス内部からの呼び出し"という条件が抜けたまま、public継承のままだったためにコンパイルが通ってしまいました。
大人しく、サンプルをいじらずにそのまま書くべきだったと、猛省しています。
ぐだぐだな質問にも関わらず、分かりやすい解説をしていただいて、すっきりしました。
今の自分には理解がいっぱいいっぱいで、public継承でもとりあえずは問題ないという事で安心しつつ、
とてもいい勉強になったと思っています。
お付き合いいただいてありがとうございました。
0774デフォルトの名無しさん
2008/09/03(水) 02:58:47マジレスすると、std::string strを渡すのはprintf("%s", str.c_str())になるからやっぱりポインタ。
0775デフォルトの名無しさん
2008/09/03(水) 03:36:03'型キャスト' : ポインタを 'BYTE *' から 'DWORD' へ切り詰めます。
とWarningが出るのですが、sizeofしてみると同じ4byteなのですが、
なぜ切り詰めますになるんでしょうか?
0776デフォルトの名無しさん
2008/09/03(水) 03:42:40VC++2005では、64ビットで問題のある型変換も警告を出すオプションが標準で有効になっている。
0777デフォルトの名無しさん
2008/09/03(水) 03:47:02Windows APIならそういう型を使うようにいつの間にか変わっているはず。
自分で書いた部分ならまあ好きなの選べ。
size_t, ptrdiff_t, (u)intptr_t, [WL]PARAM, LRESULT (U)INT_PTR, (U)LONG_PTR, etc...
0778デフォルトの名無しさん
2008/09/03(水) 03:50:13ULONGLONGにしてみます。ありがとうございました。
0779デフォルトの名無しさん
2008/09/03(水) 03:51:30size_tでもいいんですね。
0780デフォルトの名無しさん
2008/09/03(水) 03:55:40えーと、実用的な例として string をもちだしたけど、
なんらかの構造体のポインタを渡すときは
func("%s", &struct);
va_arg(ap, struct*);
みたいな?ということをききたかった。
こんなかんじになってしまうんですかね?→ &
0781デフォルトの名無しさん
2008/09/03(水) 03:58:16boost::format % std::string % std::string
みたいな形で引数とろうとしたのかなぁと。
0782デフォルトの名無しさん
2008/09/03(水) 03:58:21ULONGLONGだと32ビットでも8バイトのままだからそっちで無駄になる。
0783デフォルトの名無しさん
2008/09/03(水) 08:56:05本質的にはポインタ型で受けてないのが問題だと思う。
意図的にやってるならC++のキャストとコメントで意図を明示。
C99ならポインタを入れても安全な整数型(ptr_tだっけか)を使う方法もあるが、細かい状況が分からないと何が最適解かはわからない。
0784デフォルトの名無しさん
2008/09/03(水) 13:04:410785デフォルトの名無しさん
2008/09/03(水) 14:45:00その場合Cで扱うintも64ビットになりますか?
0786デフォルトの名無しさん
2008/09/03(水) 14:45:500787デフォルトの名無しさん
2008/09/03(水) 14:46:49OSがWindows7になるまで当分無理です
時代を先取りしたい人はLinuxでも使いましょう
0788デフォルトの名無しさん
2008/09/03(水) 14:52:48longは64ビットになったりならなかったりしてる
ILP64 LP64 LLP64 でぐぐってみるといいかもしれない
0789デフォルトの名無しさん
2008/09/03(水) 15:30:06ポインタだけ64ビットになって、intは32ビットのままだと困るなぁ。
WindowsのComboBoxとかListBoxとかのintパラメータに
ポインター入れて使ってるのに。
0790デフォルトの名無しさん
2008/09/03(水) 15:32:49そういうのはいつの間にやら書き変わっていて大抵int型でなくなっている。
0791デフォルトの名無しさん
2008/09/03(水) 17:07:360792デフォルトの名無しさん
2008/09/03(水) 17:29:430793デフォルトの名無しさん
2008/09/03(水) 17:45:28ちなみにC言語でやっています。
0794デフォルトの名無しさん
2008/09/03(水) 17:48:120795デフォルトの名無しさん
2008/09/03(水) 17:52:11Cで記述するのなら .c で、C++で記述するのなら .cpp ときっちり対応づけしたほうが良い
呼び出し規約まわりで変なことになるかもしれないしね (stdcall と cdecl)
0796デフォルトの名無しさん
2008/09/03(水) 18:30:48.Netflameworkを使い、_chdirでディレクトリを作ろうと考えているのですが、このプログラムはUnix上では動かないのでしょうか?
0797デフォルトの名無しさん
2008/09/03(水) 18:37:09mono使ったらできるのかもしれない
0798デフォルトの名無しさん
2008/09/03(水) 18:40:52仮にそうだとしてもMonoでもWin32なネイティブコードこみのプログラムを実行できるとは思えない。
VCのディレクトリ作る関数と言えば_mkdirだけど、Unixだとmkdir。
そこらへんマクロとかでなんとかすればなんとかなる。
0799764
2008/09/03(水) 19:38:58あ、そういうことね。
768はスーパーエスパーさんだね。
768のコードは確かPrivate Interfaceパターンと呼ばれる。
0800デフォルトの名無しさん
2008/09/03(水) 20:22:18// メッシュ
LPD3DXMESH m_pMesh; // LPD3DXMeshインターフェイスへのポインタ
LPD3DXBUFFER m_pD3DXMtrlBuffer; // メッシュのマテリアル情報を格納
DWORD m_numMtrl; // 属性情報の総数
***Scene.cpp***
// デフォルトコンストラクタ
Scene::Scene()
: m_pMesh(0), m_pD3DXMtrlBuffer(0), m_numMtrl(0L);
{
}
デフォルトコンストラクタにあるm_numMtrl(0L);のLってどういう意味ですか?
0801デフォルトの名無しさん
2008/09/03(水) 20:28:32doubleは64bit、floatは32bitのまま?
0802デフォルトの名無しさん
2008/09/03(水) 20:42:10今時みんなIEEE 754準拠。
0803デフォルトの名無しさん
2008/09/03(水) 20:53:340804デフォルトの名無しさん
2008/09/03(水) 20:54:52long
0805デフォルトの名無しさん
2008/09/04(木) 21:30:41class A
{
public:
func_a();
func_b(); // 外部のライブラリが必要な関数
}
このようなクラスがあり、とあるプログラムでA::func_a()のみを使いたいのですが、
このような場合でもfunc_b()が必要としているライブラリをリンクする必要があるのでしょうか?
(ちなみにfunc_a()はfunc_b()に依存していません。また両関数ともstaticではありません。)
とくにオプションをつけなければ undefined reference to (外部ライブラリの関数) というエラーが
出てリンクできないのですが、不必要な関数をリンクから外すオプションがあれば教えてください。
0806デフォルトの名無しさん
2008/09/04(木) 21:51:48不要なコードを削除するオプションがあったかどうかは覚えてないんだ
けど、A::func_a()の実装とA::func_b()の実装を別のオブジェクトファ
イルにして、ライブラリに突っ込んでおけばいと思う。
0807デフォルトの名無しさん
2008/09/04(木) 21:54:580808デフォルトの名無しさん
2008/09/04(木) 22:09:030809デフォルトの名無しさん
2008/09/04(木) 22:36:04DLLをLIBに変換しても、不要にはならないと思いますが?
0810デフォルトの名無しさん
2008/09/04(木) 22:37:030811デフォルトの名無しさん
2008/09/04(木) 22:37:580812デフォルトの名無しさん
2008/09/04(木) 22:38:02持ってないなら犯罪なのでやめましょう
0813デフォルトの名無しさん
2008/09/04(木) 22:44:300814デフォルトの名無しさん
2008/09/04(木) 23:41:11たぶん、だけど
一般的に、メンバ関数と普通の(Cの)関数との違いは、
単に暗黙の引数thisを持つ事と、名前をマングリングしている事だけ。
で、libのラベルに関係するのは後者だけど
これは普通のCの関数と同様、objさえ別であれば使わないものはリンクしないようにできるはず。
ただし。
仮想関数は、vtblに載せる必要上、普通は全部リンクされるはず。
(もしかしたら賢いコンパイラ/リンカもあるかもしれないけど)
「vtblの何番目のエントリは呼び出されてない」なんて情報、
普通はobjに含まれることはないだろうから。
0815デフォルトの名無しさん
2008/09/04(木) 23:50:17C++ → 言語の名前
Visual C++ → MSが開発・販売している開発ソフトの名前
0816デフォルトの名無しさん
2008/09/05(金) 00:40:2013500! を求めるのに48秒ほどかかってしまいます。
どうすれば、乗算の結果を素早く得られるのでしょうか?
どなたか教えて下さい。よろしくお願いします。
0817デフォルトの名無しさん
2008/09/05(金) 00:41:270818デフォルトの名無しさん
2008/09/05(金) 00:47:31http://namidame.2ch.net/test/read.cgi/slotj/1216400588/
のスレで確率についてバトルしています
問題はサイコロで1が8回連続して出る確率です
バカが多すぎて疲れました
頭の良い皆様、論破してください
お願いします
0819デフォルトの名無しさん
2008/09/05(金) 00:50:08コピペうざい
0820デフォルトの名無しさん
2008/09/05(金) 01:18:07適当に作った同一ソースにて
C3 600MHz で 38秒
Core2Duo 2.66GHz で 2秒
環境が分からないとなんともいえない
0821デフォルトの名無しさん
2008/09/05(金) 01:44:470822デフォルトの名無しさん
2008/09/05(金) 01:50:45(Acro9PIWiz:Acrobat9向けプラグインのプロジェクトテンプレート作成ツール。Acrobat9.0 SDKの中に入っている)
という環境で作成しています。
Acro9PIWizはデバッグ構成のテンプレートを作成するのですが、VisualStudioでリリース構成に
変更しビルドするとプラグイン自体は生成されても、Acrobat上で動作しません。
リリース構成でビルド、動作させるために必要な設定項目等をご存知でしたら教えてください。
0823デフォルトの名無しさん
2008/09/05(金) 02:44:06この状態で、B内でもA型のインスタンスを保持しておきたいとしたら、どうすれば良いのでしょうか?
a.hはすでにb.hをインクルードしてしまっていますので、b.hはa.hをインクルードできず、
そのままではB側で、Aは定義されていない識別子とされてしまいます。
0824デフォルトの名無しさん
2008/09/05(金) 03:09:14こういうのを前に書いとけばよかろう
たぶん
0825デフォルトの名無しさん
2008/09/05(金) 03:14:57関数のプロトタイプ宣言と同じことができるわけですね!
ありがとうございます
0826デフォルトの名無しさん
2008/09/05(金) 03:16:21それって何桁求めているの?
つーか、多倍長演算は自作? それとも既存ライブラリ?
long double精度程度でいいならc99で標準になったtgamma()で求められるけど。
0827デフォルトの名無しさん
2008/09/05(金) 08:27:52ちなみに、基数は10です。
プログラミング初心者なので、色々と無駄なコードが入ってるのは確かだと思うけど、
それにしても遅いですね・・・
0828デフォルトの名無しさん
2008/09/05(金) 08:35:46http://www.cs.nyu.edu/exact/core/gmp/
http://d.hatena.ne.jp/verus/20080428/1209325536
あとここみる
著作権フリーのC++高速汎用多倍長演算を作るスレ
http://pc11.2ch.net/test/read.cgi/tech/1195865631/
0829デフォルトの名無しさん
2008/09/05(金) 09:24:32関数がint型を参照で返したとき、++演算出来ますか?
0830デフォルトの名無しさん
2008/09/05(金) 09:25:09#include <gmp.h>
int main(int argc, char *argv[])
{
mpz_t n;
mpz_init_set_ui(n , 0);
mpz_fac_ui(n, 13500);
mpz_out_str(stdout, 10, n);
return 0;
}
そのものズバリですね
あと速すぎです、多分一生頑張ってもこの速度には追い付けないわ
0831デフォルトの名無しさん
2008/09/05(金) 09:27:54#include <stdio.h>
int &f(int &n){ n=n+10; return n; }
main(){
int n=1;
f(n)++;
printf("%d\n",n);
}
0832デフォルトの名無しさん
2008/09/05(金) 09:42:280833デフォルトの名無しさん
2008/09/05(金) 09:51:260834デフォルトの名無しさん
2008/09/05(金) 10:07:28>>832
一つのインスタンス分のサイズ?
それとも実行時の該当クラスの全インスタンス分のサイズ?
0835デフォルトの名無しさん
2008/09/05(金) 10:16:560836デフォルトの名無しさん
2008/09/05(金) 10:17:36あ、継承されると話がややこしくなるか。
0837デフォルトの名無しさん
2008/09/05(金) 10:22:120838デフォルトの名無しさん
2008/09/05(金) 10:23:17求まるように作ればね
0839デフォルトの名無しさん
2008/09/05(金) 10:24:37sizeof(クラス名)
0840デフォルトの名無しさん
2008/09/05(金) 10:47:04main(){
int n,m;
map<unsigned int, unsigned int> q;
for(m=0;m<1000000;m++)q[m]=0;
cout<<"input key...\n";getchar();
q.swap(map<unsigned int, unsigned int>());
getchar(); return 0;}
0841デフォルトの名無しさん
2008/09/05(金) 10:51:07clear() じゃダメなのか?
swap() が使いたいなら
map<unsigned int, unsigned int>().swap(q)
じゃね?
0842デフォルトの名無しさん
2008/09/05(金) 10:55:21すべて解放してません。
clear()
map<unsigned int, unsigned int>().swap(q)
q.swap(map<unsigned int, unsigned int>())
0843デフォルトの名無しさん
2008/09/05(金) 10:58:520844デフォルトの名無しさん
2008/09/05(金) 11:00:260845デフォルトの名無しさん
2008/09/05(金) 11:02:15プロセスがシステムにメモリをいつ返すかは最小ブロック単位があって
あまり小さいのは返さないよ
システムからメモリ持ってきたり取ってきたりするのは大きなオーバー
ヘッドがかかるから
0846デフォルトの名無しさん
2008/09/05(金) 11:04:22std::bad_allocを投げるまでの余裕を比較した方がいいよ
0847デフォルトの名無しさん
2008/09/05(金) 11:34:140848デフォルトの名無しさん
2008/09/05(金) 11:36:060849デフォルトの名無しさん
2008/09/05(金) 11:45:050850デフォルトの名無しさん
2008/09/05(金) 11:47:30流れ嫁よ
0851デフォルトの名無しさん
2008/09/05(金) 11:49:27mallocやデフォルトのnewを使わずに、
環境依存のシステムコールで、直接メモリを確保・開放すれば良い。
windowsならHeapAlloc。
0852デフォルトの名無しさん
2008/09/05(金) 11:53:01HeapAllocは>>845の処理を代行してくれるAPIだから、
直接GlobalAlloc使わないと
0853デフォルトの名無しさん
2008/09/05(金) 11:55:41VCのmalloc/newはHeapAllocに丸投げしてる
>>852
VirtualAllocをお使いください
0854デフォルトの名無しさん
2008/09/05(金) 12:10:35見てきた。
前はmalloc内でノード管理してた気がするけど、
今ほんと丸投げなんだな。
NTカーネルなら確かにOS任せで十分か。
0855デフォルトの名無しさん
2008/09/05(金) 12:12:560856デフォルトの名無しさん
2008/09/05(金) 12:16:01これ以上はWin32スレに行った方がいいと思うよ。
だいたいOSが平衡二分木なんて高級な機能を提供
しているのは見た事がない。
0857デフォルトの名無しさん
2008/09/05(金) 12:17:230858デフォルトの名無しさん
2008/09/05(金) 12:18:39それは既に挙げ足取りの領域
0859デフォルトの名無しさん
2008/09/05(金) 12:19:03C/C++からWin32を扱うと読み替えてくれ
0860デフォルトの名無しさん
2008/09/05(金) 12:20:08http://pc11.2ch.net/test/read.cgi/tech/1217687038/
ここ行って聞け。叩かれるのを覚悟でな。
0861デフォルトの名無しさん
2008/09/05(金) 12:20:350862デフォルトの名無しさん
2008/09/05(金) 12:21:46もう話終わってるけどなw
0863デフォルトの名無しさん
2008/09/05(金) 12:24:00ありがとうございます
newを使う意味は薄いのですね
0864デフォルトの名無しさん
2008/09/05(金) 12:24:39直接VirtualAllocを適用すると、どう考えてもピープ領域が
破壊されて辻褄が合わなくなってエラー吐くだけだと思うが。
それでもどうしてもやりたいのならお好きなようにとしか言えない。
0865デフォルトの名無しさん
2008/09/05(金) 12:30:08そこはAPIの仕様、使い方のスレだろ
mallocやカーネルのメモリマネージャの実装の話とは別
>>851もwinを例に出しただけだしな
>>863
ちょっと待て、逆だ
0866デフォルトの名無しさん
2008/09/05(金) 12:34:170867デフォルトの名無しさん
2008/09/05(金) 12:35:54実測してみたけどあまり大差ないけどな
0868デフォルトの名無しさん
2008/09/05(金) 12:40:58何の数字見てるの?「かわる」って増えるの?減るの?
プログラム実行中に 25M 使ってた分がプログラム終了後に返ってくるってことなら、
あたりまえな感じなんだけど。
プログラム終了後の数値をどうこうしたいなら、 malloc だろうが HeapAlloc だろうが
VirtualAlloc だろうが、どうにもならないよ。
0869デフォルトの名無しさん
2008/09/05(金) 12:43:09>>853は多分、GlobalAlloc/GlobalLockが既に古いAPIで
VirtualAlloc/VirtualLockに
置き換えられたってことを言ってるだけで、
HeapAllocの代わりにって意味じゃないと思うぞ。
0871デフォルトの名無しさん
2008/09/05(金) 12:47:54C++を仕事で使ってる人に質問なんですが マイクロソフトで無料でインストールできるコンパイラあるじゃないですか?
名前なんだったかな?
ビジュアルベーシックみたいな名前ですが 仕事でもあーゆー類いの物をつかうんですか?
0872デフォルトの名無しさん
2008/09/05(金) 12:57:33VS Expressは商用利用可なので
0873デフォルトの名無しさん
2008/09/05(金) 13:04:01そうだよ。
他にも色々ツール買うと年間云十万するけど
0874デフォルトの名無しさん
2008/09/05(金) 13:07:00でもMS以外の会社だと無償はきびしいだろうとおもう。
0875デフォルトの名無しさん
2008/09/05(金) 13:12:08みなさんご丁寧にありがとうございます
perlとphpを少しだけやるんですが テキストエディタに書いていくじゃないですか?
あーゆーのイメージしてたので
みなさん どれぐらいのメモリのパソコン使ってらっしゃるんですか?
0876デフォルトの名無しさん
2008/09/05(金) 13:19:140877デフォルトの名無しさん
2008/09/05(金) 13:23:38Visual BASIC と同じだと思ったら大間違い
メモリは1G、でも最近不足ぎみ
4G欲しいと思ってる
0878デフォルトの名無しさん
2008/09/05(金) 13:25:490879デフォルトの名無しさん
2008/09/05(金) 13:26:360880デフォルトの名無しさん
2008/09/05(金) 13:42:48あと世界標準のコードに変換するメジャーなライブラリはありますか?
0881デフォルトの名無しさん
2008/09/05(金) 13:47:34同じような関数もいっぱいあるし
基本的にエディタで書いていくのは同じだね
コンパイラで実行ファイル作成という処理が追加されるだけ
フォームアプリだと確かにVisualって感じはするな
0882デフォルトの名無しさん
2008/09/05(金) 13:53:06iconv
0883デフォルトの名無しさん
2008/09/05(金) 13:54:32少なくとも現地で従来用いられてきたものが少なくとも1つ、
それに加えUTF系が加わると言えば、どこも複数だな。
文字コード変換のライブラリは決定打がない気がするけど、
ICUが1番、Posixのiconv、IEのIMultiLanguage (mlang)が結構なんでもいける感じ。
0884デフォルトの名無しさん
2008/09/05(金) 13:56:41どうやったら4つのコアとも使ってプログラムを実行できるんですか?
0885デフォルトの名無しさん
2008/09/05(金) 13:58:44VC++6.0の模倣品
今となってはこれ選ぶ意義は皆無ですか、そうですか(´・ω・`)
0886デフォルトの名無しさん
2008/09/05(金) 13:59:57そのプログラムを4つ同時に動かす。
0887デフォルトの名無しさん
2008/09/05(金) 14:05:20マルチスレッド
本気で4コア生かすのは素人にゃ無理
0889デフォルトの名無しさん
2008/09/05(金) 14:06:29intel c++コンパイラで良いのでは
0891デフォルトの名無しさん
2008/09/05(金) 15:27:49主要な世界各国言語の場合です。 それとも各種判定ルーチンを組み合わせたライブラリなんかありますか?
0892デフォルトの名無しさん
2008/09/05(金) 15:31:340893デフォルトの名無しさん
2008/09/05(金) 15:46:42Universal Encoding Detector は Mozillaのコードが移植された、文字コードを判定するライブラリです。
http://www.python.jp/Zope/PyLog//1143645503/index_html
universalchardet / juniversalchardet
Mozillaのエンコーディング判別ライブラリであるuniversalchardetを切り出して、Cライブラリ化してみた。
http://www.void.in/wiki/Universalchardet
0894デフォルトの名無しさん
2008/09/05(金) 16:08:02DLLからVCを立ち上げ、コンパイルして実行をやろうとしています。
コンパイルして実行まではできました。
ですが、実行が終わった時のイベントを取得することができません。
でWaitForBuild()メソッドを使って取得を行おうとすると、
何故か取得をすることができません。
WaitForBuild以外にも実行終了のイベントを受け取る方法はあるのでしょうか?
教えてください。
環境は Visual Studio 2005 Standardです。
0895894
2008/09/05(金) 16:13:58コンパイル終了のイベントが取得できていません。
の間違いでした。
0896デフォルトの名無しさん
2008/09/05(金) 16:39:12お答えいただいてから、試行錯誤してみたのですが、
class B; と先行宣言してAで保持すると、AがBの構造を把握できないため、
B内のメンバ関数にアクセスできませんでした。これを、相互にメソッドを呼び出したいとすると、
一方のヘッダファイルなりソースファイルに関数定義の記述を移動するしかないのでしょうか?
できれば、異なるクラスのメンバ関数は分けて記述したいのですが…
0897デフォルトの名無しさん
2008/09/05(金) 16:51:21一週間ではとてもマスターできる気がしないんですが
0898デフォルトの名無しさん
2008/09/05(金) 16:53:280899デフォルトの名無しさん
2008/09/05(金) 16:53:39そんなもん個人差だ
くだらん質問すんなアホ
0900デフォルトの名無しさん
2008/09/05(金) 17:03:470901デフォルトの名無しさん
2008/09/05(金) 17:05:04Cでさくさくプログラムできる人が対象
0902デフォルトの名無しさん
2008/09/05(金) 17:14:24b.h: class B{ class A*a;void foo();}
a.cpp#include <a.h> <b.h> void A::foo(){ b->foo(); };
b.cpp#include <a.h> <b.h> void B::foo(){ a->foo(); };
みたいな話。
0903デフォルトの名無しさん
2008/09/05(金) 17:39:00ここまで出来たんですけど・・・p[0]などに配列を追加するのがわかりません。
vector<vector<int>*> p(N,NULL);
Nは十分に大きく、使わない番号も多くあり、vector<vector<int>>にするとメモリを圧迫してしまいます。
0904デフォルトの名無しさん
2008/09/05(金) 17:41:01足し算をするだけのプログラムを作って、試しに実行してみようかと思っていますが、PC上で実行するにはどうしたらいいでしょうか?
いくつかのフリーコンパイラを調べてみたのですが、以下の理由でできませんでした。
LSIC-86試食版(配布中止になっていた)
C++ Compiler 5.5/Turbo Debugger(ダウンロードできなかった)
lcc-win32(使用方法が分からなかった)
どなたかお願いします
0905デフォルトの名無しさん
2008/09/05(金) 17:41:49vector< vector<int>*> p(N); は55Mくらいですみます。
0906デフォルトの名無しさん
2008/09/05(金) 17:45:32フリーでもまだまだある。Visual C++ 2008 ExpressとかCygwinとかMinGWとか。
0907デフォルトの名無しさん
2008/09/05(金) 17:49:19typedef vector<int> vec;
vector<vec*> p(N);
p[0] = new vec;
p[0]->resize(10,3);
cout<<p[0][9]<<endl;
0908デフォルトの名無しさん
2008/09/05(金) 17:50:510909904
2008/09/05(金) 18:34:02Gygwinをダウンロードしてみます。ありがとうございました!
0910デフォルトの名無しさん
2008/09/05(金) 18:37:26初心者ならCygwinはやめとけ……
Visual C++ ExpressかDegital Marsを薦める
0911デフォルトの名無しさん
2008/09/05(金) 18:47:44ギグウィンなんてねぇよw
>>910の言う通りVC++Expressにしておいた方が良い
0912904
2008/09/05(金) 19:36:36まさに暗礁に乗り上げていたところです…
了解しました、そちらで試してみます
0913デフォルトの名無しさん
2008/09/05(金) 21:28:42std::stringとかstd::vector使ってもいいですか?
0914デフォルトの名無しさん
2008/09/05(金) 21:37:200915デフォルトの名無しさん
2008/09/05(金) 21:50:45runtime_errorとかみんなコンストラクタでstring引数に取っていますよ。
0916デフォルトの名無しさん
2008/09/05(金) 22:00:050917デフォルトの名無しさん
2008/09/05(金) 22:06:02if(FAILED(pD3DDevice->CreateVertexBuffer(4*sizeof(MY_VERTEX),
D3DUSAGE_WRITEONLY,
MY_VERTEX,
D3DPOOL_MANAGED,
&m_pVB, NULL))) {
return E_FAIL;
}
\001\scene.cpp(45) : error C2275: 'Scene::MY_VERTEX' : この型は演算子として使用できません
エラーがでます どうすればいいでしょうか。。。
0918デフォルトの名無しさん
2008/09/05(金) 22:07:320919デフォルトの名無しさん
2008/09/05(金) 22:07:350920デフォルトの名無しさん
2008/09/05(金) 22:09:10第三引数にFVFを設定していませんでした
0921デフォルトの名無しさん
2008/09/05(金) 22:15:53トンマ ドベ アンポンタン ダボ アホ
0922デフォルトの名無しさん
2008/09/05(金) 22:28:490923デフォルトの名無しさん
2008/09/05(金) 22:45:33class HogeException : T
{
//なになに
};
こんなクラスで
テンプレート引数が何であれ、HogeExceptionなら
一箇所のcatchで受信する方法はないですか?
0924デフォルトの名無しさん
2008/09/05(金) 22:47:410925デフォルトの名無しさん
2008/09/05(金) 23:04:54template<class T>
class HogeException : T, public Foo
{
//なになに
};
catch(Foo& foo) { ... }
というので、どう
0926デフォルトの名無しさん
2008/09/05(金) 23:13:290927デフォルトの名無しさん
2008/09/05(金) 23:17:150928デフォルトの名無しさん
2008/09/05(金) 23:19:520929デフォルトの名無しさん
2008/09/05(金) 23:33:11ありがとうございます!
単純なことだったんですね
0930デフォルトの名無しさん
2008/09/05(金) 23:34:54はい。書いてるうちにグチャグチャになってしまって…
ありがとうございます
0931デフォルトの名無しさん
2008/09/05(金) 23:45:18規格ではなく法律で禁じられています(嘘
0932デフォルトの名無しさん
2008/09/05(金) 23:52:050933デフォルトの名無しさん
2008/09/06(土) 00:26:250934デフォルトの名無しさん
2008/09/06(土) 00:48:06そのenumに定義している列挙値しか指定できなくなるので、
保守しやすいかなと思ったんですが、これはどの環境でも "unsigned int?" になるんでしょうか?
0935デフォルトの名無しさん
2008/09/06(土) 00:55:37どの環境であってもならない、なぜなら
そもそもenumには負の整数も入られるから
0936デフォルトの名無しさん
2008/09/06(土) 01:09:12なんかプロトタイプ宣言でエラーになります。
で、困ったことにOSがVxWORKでコンパイルエラーがシンタックスエラーw
具体的には
short func(CInput &in, COutput &out);
というふうに宣言されてて、どうも&が気に入らないようです。
で質問なのですが、C言語関数のプロトタイプ宣言が書かれているヘッダーファイルに
C++のプロトタイプ宣言を混在することはかのうでしょうか?
(コンパイラはC++に対応しています)
0937デフォルトの名無しさん
2008/09/06(土) 01:14:460938デフォルトの名無しさん
2008/09/06(土) 01:14:54つ[extern "C"]
0939デフォルトの名無しさん
2008/09/06(土) 01:16:20明日休日出勤なので試してみます;;
レスありがとう
0940デフォルトの名無しさん
2008/09/06(土) 01:19:260941デフォルトの名無しさん
2008/09/06(土) 01:19:480942デフォルトの名無しさん
2008/09/06(土) 02:32:33x86のWindows/LinuxとかだとCでは単にポインタにすればいいけど、
VxWORKでもそれが可能かどうかは知らない。
C++でポインタを引数に取るラッパを作って、
Cではそっちだけを使うようにするってのが(規格合致という点からは)安全。
0943デフォルトの名無しさん
2008/09/06(土) 03:30:190944デフォルトの名無しさん
2008/09/06(土) 03:48:12#ifdef __cplusplus
typedef IID& REFIID
#else
typedef IID* REFIID
#endif
0945デフォルトの名無しさん
2008/09/06(土) 04:16:57ググったりmanで引いたりしたところ、どちらもstdio.hにあるっぽいんですが
popen()は暗黙の宣言と言われてしまい、(ヘッダにはないけどリンクはしてるってことかな?)
pclose()は見つからず、コンパイルできません
(まぁpclose()だけ消せば動くことは動くんですが)
popen()とpclose()で読み込むべきヘッダの別パターン知りませんか?
もしくは別な勘違いをしているのでしょうか?
環境は
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --info
dir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable
-java-awt=gtk --host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 3.4.6 20060404 (Red Hat 3.4.6-3)
といった感じで
OSはCentOSです
0946デフォルトの名無しさん
2008/09/06(土) 04:25:460947デフォルトの名無しさん
2008/09/06(土) 04:41:51を使っています。
Cの勉強中です。
サイズが120byte有る構造体を100000個並べた配列が有ります。
stract abc{
……
};
stract abc b[100000];
これをバイナリで以下のように書き込むと、26個目までしか書き出されません(もしくは読み込まれません)。
FILE *fp;
fp=fopen("ファイル名","wb+");
fwrite(b,sizeof(abc),1,fp);
fclose(fp);
どのように対策すれば良いのでしょうか?
0948デフォルトの名無しさん
2008/09/06(土) 04:44:500949デフォルトの名無しさん
2008/09/06(土) 04:45:44一つずつか、1M程度ずつるーぷすればいいのでは
0950デフォルトの名無しさん
2008/09/06(土) 04:53:04ループしたものを作ってみたのですが、
同じ問題が発生しました。
具体的には以下のようなプログラムです。
改善点は有りますか?
stract abc{
……
};
stract abc b[100000];
FILE *fp;
fp=fopen("ファイル名","wb+");
for(int i;i<100000;i++){
fwrite(b[i],sizeof(abc),1,fp);
}
fclose(fp);
0951デフォルトの名無しさん
2008/09/06(土) 04:56:060952デフォルトの名無しさん
2008/09/06(土) 04:57:200953デフォルトの名無しさん
2008/09/06(土) 04:58:290954デフォルトの名無しさん
2008/09/06(土) 06:49:59最初のはたぶんfwrite()の第2引数の方の範囲を超えて整数オーバーフローでもしているか、書き込み可能最大Byteを超えているんだろう。
適度に分割したほうがいいと思うけど、ファイルアクセスは重たい処理だから、10個単位とか。
当然知って使っているとは思うけど、構造体はコンパイラによってCPUが扱いやすいように勝手に詰め物されるから(たとえば4Byteの倍数とかに)。
>>950
>>struct abc b[100000];
>>for(int i;i<100000;i++){
>>fwrite(b[i],sizeof(abc),1,fp);
>>}
for ( int i = 0; i < 100000; ++i ) {
fwrite(&b[i], sizeof(struct abc), 1, fp);
}
とか
for (int i = 0; i < 10000; i += 10 ) {
fwrite(b+i, sizeof(struct abc), 10, fp);
}
とかな
あとファイルが正常にオープンできたかちゃんとチェックしないとだめ
fwrite()の戻り値チェックとかC++でやっているみたいだからstruct abcがメンバ関数持ってたりな(読み込み時に死亡フラグがたつ)
まぁ、ネタとは思うけど
0955デフォルトの名無しさん
2008/09/06(土) 08:19:33fwrite()もバッファリングされるからトータルサイズがオーバーしていなければ分割する必要が無いし、
分割する場合も10分割程度でいい。10個単位で10000回ループなんて阿呆すぎる。
0956デフォルトの名無しさん
2008/09/06(土) 08:44:10というコマンドラインで、ファイルではなくてメモリに出力を格納するにはどうしたらいいですか?
0957デフォルトの名無しさん
2008/09/06(土) 08:44:46パイプ
0958デフォルトの名無しさん
2008/09/06(土) 08:46:590959デフォルトの名無しさん
2008/09/06(土) 08:48:000960デフォルトの名無しさん
2008/09/06(土) 08:51:38かなり繰り返すため、そのロスをへらしたいです。
0961デフォルトの名無しさん
2008/09/06(土) 08:53:360962ネットより本
2008/09/06(土) 09:25:18いやあ、本によっては、ダウンロードのしかたまでくわしくのっているのだ。
導きが大切なのだ。
0963デフォルトの名無しさん
2008/09/06(土) 10:05:230964デフォルトの名無しさん
2008/09/06(土) 10:55:43dir | grep txt
見たいな感じかな
0965デフォルトの名無しさん
2008/09/06(土) 10:59:36111111
だったとして,これを
221111
と書き換えるにはどうすればいいでしょうか。
つまり,最初の2文字だけを2に書き換えて,
それ以降は最初のデータをそのまま残しておきたいのです。
FILE *fp;
char newdata[2] = {2, 2};
fp = fopen("data.txt", "wb");
fwrite(newdata, sizeof(char), 2, fp);
fclose(fp);
とすると,結果は
22
となってしまい,最初のデータが完全に消えてしまいます。。
0966デフォルトの名無しさん
2008/09/06(土) 11:02:570967デフォルトの名無しさん
2008/09/06(土) 11:08:15ああ完璧にいけましたありがとうございます!
0968デフォルトの名無しさん
2008/09/06(土) 12:43:28R&Dプログラマーのできるやつは50万くらいもらってるなぁ
0969デフォルトの名無しさん
2008/09/06(土) 12:52:270970デフォルトの名無しさん
2008/09/06(土) 12:55:270971デフォルトの名無しさん
2008/09/06(土) 13:03:340972デフォルトの名無しさん
2008/09/06(土) 13:04:020973デフォルトの名無しさん
2008/09/06(土) 13:15:250974デフォルトの名無しさん
2008/09/06(土) 15:17:55コピーコンストラクタを使ってこれをコピーしたい。
コンストラクタ+代入演算子は使えない。
結果は配列の先頭番地と個数でほしい。
メモリ上で連続していないとまずい。
どうやったらいい?
0975デフォルトの名無しさん
2008/09/06(土) 15:33:560976デフォルトの名無しさん
2008/09/06(土) 15:42:020977デフォルトの名無しさん
2008/09/06(土) 15:43:06while(s--) new(q++) X(*p++);
0978デフォルトの名無しさん
2008/09/06(土) 15:44:53#include <new>
#include <memory>
#include <cstdlib>
template<typename T>
std::pair<T*, std::size_t> array_copy(T* src, std::size_t n)
{
if (T* p = static_cast<T*>(std::malloc(sizeof (T) * n)))
{
try
{
std::uninitialized_copy(src, src + n, p);
}
catch(...)
{
free(p);
throw;
}
return std::make_pair(p, n);
}
throw std::bad_alloc();
}
これを解放するにはこうする。Tには型名を入れて。
for (std::size_t i = 0; i < n; ++i)
p.first[i].~T();
std::free(p.first);
0979デフォルトの名無しさん
2008/09/06(土) 16:20:23サンクス!
いろいろ試してみる。
0980デフォルトの名無しさん
2008/09/06(土) 17:32:430981デフォルトの名無しさん
2008/09/06(土) 20:25:16オーバーライド関数のように、名前修飾の問題とかあって、ダメなんでしょうか。
0982デフォルトの名無しさん
2008/09/06(土) 20:27:430983デフォルトの名無しさん
2008/09/06(土) 20:31:40ソースなしにどうやってインスタンス化するんだよ?
0984デフォルトの名無しさん
2008/09/06(土) 20:32:01>>982
ありがとう、ございます。
0985デフォルトの名無しさん
2008/09/06(土) 20:33:21醤油で、なんとかなりませんか?
0986デフォルトの名無しさん
2008/09/06(土) 20:33:530987デフォルトの名無しさん
2008/09/06(土) 20:34:32しっ、しもた・・・。
醤油も使えないのか・・・。
0988デフォルトの名無しさん
2008/09/06(土) 20:53:12Windowsフォームアプリケーションテンプレートの作成をして、
タイマーのTickイベントの中でWindowsAPIを使いたいのですが、
WindowsAPIはともかく
#include <windows.h>とコールバック関数はどこに書けばよいのでしょうか?
0989デフォルトの名無しさん
2008/09/06(土) 21:03:23http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_01.html
あたりを参考にしてみてはどうだろうか
0990デフォルトの名無しさん
2008/09/06(土) 21:18:19また、ほかの項目を選んでそれを強制的に.rcにすると「リソースの編集は Visual C++ Express SKU ではサポートされていません。」となってしまいます。
猫でもわかるWindowsプログラミングという本では、リソースファイルを追加する項目があるんですけどどういうことなんでしょうか。
0991デフォルトの名無しさん
2008/09/06(土) 21:21:15<windows.h>のインクルードはstdafx.hにまず1つと
あとそれ以外のヘッダに必要に応じて。
コールバック関数は普通のC++と同じで基本.cppファイル。
ただし、メンバ関数ならクラス定義内に書いてもよし。
>>990
Expressにはリソースエディタがついていない。
無理やり追加はできるはずだが、テキストファイルとしての編集しかできない。
0992デフォルトの名無しさん
2008/09/06(土) 21:21:25言われたとおり
express editionにリソース編集機能は無い
外部のリソースエディタを使え
0993デフォルトの名無しさん
2008/09/06(土) 21:25:180994デフォルトの名無しさん
2008/09/06(土) 21:35:250995デフォルトの名無しさん
2008/09/06(土) 21:53:190996デフォルトの名無しさん
2008/09/06(土) 21:54:020997デフォルトの名無しさん
2008/09/06(土) 22:41:29おぬぬめ
0998デフォルトの名無しさん
2008/09/06(土) 22:45:58http://pc11.2ch.net/test/read.cgi/tech/1220708712/
こんなかんじ?
0999デフォルトの名無しさん
2008/09/06(土) 22:57:45ヾ ∧__∧``;:
ミ ´ ∀ ` (´・ω・)..:;:; チュンチュンの時間です
ッ _ (つ|⌒|⌒|..;ミ みなさんそろそろ寝ましょう
(´彡,. (,,_, ヽ(~^),(^~).ノ
"'"'゙''""''''゙""´
1000デフォルトの名無しさん
2008/09/06(土) 23:00:2210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。