[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/22 20:21 / Filesize : 245 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

487 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 02:11:36 ]
>>486
ストリームを引数にとればいいんじゃねーの?

488 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 02:23:55 ]
>>486
ストリームを大域変数にすればいいんじゃねーの?

489 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 02:48:25 ]
>>486
ストリームを参照で取る
constで取ったらあかんよ

490 名前:デフォルトの名無しさん [2008/03/07(金) 03:42:36 ]
>>486
(ofstream& fout[], ifstream& fin[])
ってことですか??
参照型の配列は許されないとかなるんですが。。。
困り果てた。

491 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 03:47:08 ]
>>490
何故いきなり配列に? >486では一言もそんな話が……

492 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 03:50:43 ]
>>490
常考参照のポインタだろ

*&fout

493 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 04:00:42 ]
#include <iostream>
これで通る

#include <fstream>

void sub(std::fstream* f)
{
 f[0];
}

int main()
{
 std::fstream f[10];

 sub(f);
}

494 名前:デフォルトの名無しさん [2008/03/07(金) 04:17:54 ]
>>493
すいません、素人目からはさっぱりなんですが。。。
fout,fin???どうなったのでしょうか??

495 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 04:25:17 ]
>>494
配列だったらリファレンスではなくポインタで渡せばいいだけの話。



496 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 04:28:51 ]
>>494
あんた>486=>490? >489に答えがあるのに、それをどう曲解したのか>490になって、
>491の質問を無視して>494みたいなこと言われても最早誰も対処できないぞ。

497 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 07:12:46 ]
もらった回答をすっ飛ばす奴の神経がわからんね。
漢字読むのが面倒臭いからって、上の行↑を「もらったをすっばすのがわからんね」と読んで
「うーん、さっぱりわかりません」とか一人で勝手に困ってるようなものだろ。

498 名前:デフォルトの名無しさん [2008/03/07(金) 08:49:37 ]
どっちでもいいといえば どっちでもいいのですが、
現在ゲームを作ってまして、敵の動きを実装するのですが、
C言語で関数のポインタを保持し、タイミングが来たら 保持していた関数を呼び出すのと
C++で、基本のクラスを用意し、それから派生してポリモーフィズムで呼び出すのと どちらが良いでしょうか

開発規模は個人なのでそれほど多くならないです、ですがまだ、仕様が決まってないのでなんともいえないのです。

なにが不満かというと
Cだと 関数だらけになってしまう
C++だと 開発に時間がかかったら保守が大変そうなことです

499 名前:デフォルトの名無しさん [2008/03/07(金) 09:01:36 ]
作ったことがないが、C++に一票

500 名前:デフォルトの名無しさん [2008/03/07(金) 09:03:21 ]
迷ったらC++。これ鉄則。

501 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:54:41 ]
>>498
Commandパターン or Callback by template

502 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:07:04 ]
くだらない質問で申し訳ありません。

namespace myname{
hogehogehoooge;
}; //←

namespace mymyname{
hagehagehaaage;
} //←

コンパイル自体はどっちでも通ったのですが、どっちが本来の文法的に正しいのでしょうか。

503 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:25:44 ]
コンパイラ的には上のセミコロンは空文があるってだけかと

504 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:43:35 ]
>503
なるほど、納得しました。

505 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:33:34 ]
物凄くくだらない質問なのですが教えてください

double x=1.0; int y = 10000;
int z = y * x;

この場合z=yって成り立つのでしょうか?



506 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:36:02 ]
>>505
成り立つよ
浮動小数点の誤差がどうとか言う観点だよな?

507 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:57:06 ]
はい、そうです
ありがとうございました

508 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:07:28 ]
メンバに変数しかないクラス(ようするに構造体)を継承して、
それらのポインタをdynamic_castしたい場合、親クラスに
virtualな関数を無理やり入れておくしかないのでしょうか?

509 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:09:33 ]
>>508
dynamic_castの意味分かって言ってる?

510 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:10:34 ]
>>508
手っ取り早く済ませたいならそうだね。

手間がかかってもいいなら、たぶん dynamic_cast の必要性を
見直したほうがいいんだろうけど。

511 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:23:55 ]
>>509,510
関数テーブルで引数が違う関数をまとめる場合に、
引数型を全部派生にして親クラスのポインタを
受け取るようにしとくと、キャストミスも無くて便利かなと
思ったんですが。
多分設計見直したほうが良いパターンなんでしょうね。

512 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:49:54 ]
デストラクタを仮想にしておけば良いんじゃないかな

このパターンで自分もはまったな
引数に<list>をとるか可変長引数とか配列とか色々やり用はあるな


513 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:23:58 ]
>>511
つテンプレートの特殊化

514 名前:468 [2008/03/07(金) 16:44:37 ]
www.borujoa.org/upload/source/upload17235.txt

すみません。ド素人のプログラマですが、質問です。
なるべく上のファイルを利用してファイルソートを行いたいのですが、
これからどうすればいいのかわからず手が止まっております。
ソースではなく文章でいいので答えていただけますか?
filesortがファイルをソートする関数部分です。
つまりVectorとsortを使って何とかしたいわけですが、
この書き方であると要素ごとでしかソートできません。
もちろん要素だけのソートはできました。
なんかあとちょっと弄ればできそうな気がするんですが、
僕の脳ではどうしようもありません。
どなたかご指導ください。

私的にはsetさえ使えば100人力じゃぁみたいな感じになるので、
setを使いたくありません。その点も含めてよろしくお願いいたします。

あとこのソース見て「ここをこうした方がいいのでは?」と思う人はご指摘ください。
よろしくお願いいたします。勉強になります。

開発環境:CentOS 5
コンパイラ:g++
コンパイルエラー:無し

515 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:49:15 ]
クラスについてさっぱりわかってないからこんなこと思うのかも知れませんが、
クラスの公開メンバ関数のアドレスを外部に教えてあげて、
そこから直接クラスの関数にアクセスすることってできますか?

具体的に言うと、Wik32APIでの、ウィンドウプロシージャに、クラスのメンバ関数を使いたいのですが…



516 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:06:28 ]
>514
filesortの中身をちらっと読んだだけ。

・カンマ区切りを取り出す常套手段は
 1:スペース記号、タブ記号をすべて別の文字列で一旦置換
 2:カンマ記号をすべてスペースに置換
 3:stringstreamに流し込んで >> を使って読み込む
 4:1:で入れ替えてたのを元にもどす
 です。こうした方がいいです。

・名前を入れ替えたいだけじゃないんですよね?
 今のあなたのファイルは「名前データを取り出して、それをベクターに格納。そのベクターをソート」
 している「だけ」ですよ。
 あきらめてsetを使うか、set相当のものを自分で書くか、
 そうでなければsort相当のものを自分で書いてください。

・fin>>temp
 この部分は、もし入力ファイル中にスペースがあると困るのではないかと。
 nameに「Richard Feynman」って入ったら、Richardで切れますけど、いいんですか?
 一行取り出したいならgetlineを使いましょう。


517 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:07:45 ]
>>511
普通の関数は仮想にするなよ
つEffective C++ 第38項

ダウンキャストはやめよう
つEffective C++ 第39項

というかEffective C++を購入して一読する事を強く勧める。

518 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:12:53 ]
>>515
メンバ関数の実装は、クラスのポインタを引き渡していることが多い。
(thisポインタが引数としてわたっている)。
よって、関数ポインタを取ってきたところで、メンバ以外からマトモに使えません。

519 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:31:14 ]
>>513
511じゃないが参考までにどういう形で実装するのか教えてくれませんか?
テンプレートを使った経験がないのでどういう風に使うのか見当がつきません

520 名前:452 mailto:sage [2008/03/07(金) 18:21:57 ]
>>455-456
亀ですがレスthx
Winsockと同時に使うから文字列をstd::stringじゃなくてchar*で使ってたんですが、
例外処理さえつければ>>452のコードで大丈夫ですよね
あと、>>455のカマを掘られたって言うのがどうことかちょっと気になるんですが・・・

521 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:07:56 ]
>>518
やっぱ駄目なんですか。
共通プロシージャ用意してmapしたのを検索する方向で考えてみます。

522 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:31:55 ]
>>515
web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/

523 名前:デフォルトの名無しさん [2008/03/07(金) 19:42:31 ]
>>521
staticなメンバ関数なら問題ない

524 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:48:12 ]
>>523
staticメンバ関数はstaticなメンバしかイジれないじゃん。

525 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:31:15 ]
>>524
そうだよ。単にクラスという名前空間に閉じ込め、
protected/privateにできるという程度の意味しかない。

どっかからインスタンスへのポインタを得て、非静的なメンバ関数を呼ぶのが
静的メンバ関数のウィンドウプロシージャの仕事。
>>522



526 名前:デフォルトの名無しさん [2008/03/07(金) 20:34:15 ]
>>524
オブジェクトを作らずに呼び出そうとしてるんだからメンバなんていじる必要ない気が

527 名前:デフォルトの名無しさん [2008/03/07(金) 20:42:15 ]
>>515
サンクという手法でウィンドウプロシージャを書き換えて、ウィンドウハンドルの代わりにthisをスタックに積んでメンバ関数にジャンプさせれば?

528 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:47:14 ]
boost::function

529 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:35:51 ]
>>528
どうやってやるのさ

530 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:38:29 ]
>>523-527
あ、オブジェクトではなく、クラスにひも付けすればよいのですね。

有り難うございました!

531 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:39:03 ]
とあるクラスの派生クラス郡の中で一つの派生クラスだけ
関数の引数が異なることになってしまいました

こういう場合はどうしたらよいでしょうかorz

532 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:51:31 ]
設計しなおす

533 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:52:10 ]
>>531
全クラスに引数増やすとか(そしてデフォルト引数をつけておくとか)、
その派生クラスだけ別のメンバ関数で余分の引数を設定しておくとか、
引数の集合を何かクラスにまとめて、上位の概念に置き換えることで引数を共通にするとか。

534 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:53:54 ]
dynamic_castしろと悪魔が囁いているぜ

535 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:56:46 ]
>531
1. きっとやりたいことが間違ってるから考え直す。
2. boost::any とか boost::variant とかでぶちかます。

まぁもう少しやりたいことを詳細に説明するべきだろうね。



536 名前:531 mailto:sage [2008/03/08(土) 02:14:02 ]
とある計測器と連携して、とあるプロセスを監視してそのデータをモニタに表示するのですが
今回のプロセスだけ表示させたいパラメータの数が増えてしまいました

監視プロセスが複数同時に走っていて、そのうち3つを同時に表示するようにするため
表示対象をユーザーが切り替えられるようにするため
表示クラスに監視クラスのポインタをつかって保持させています
監視クラスに
GetData(int OutputA, int dataB,int dataC)
という関数をよういしていたのですが
最新の計器が監視できるパラメータが増えてしまって・・・orz

537 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:22:28 ]
>>536
そのシグニチャでGetだと言うのなら、参照かポインタ渡しじゃないの?
まあそれはいいとして。
パラメータの種類を指定して、データを1種類だけGetする関数を作ったら?

538 名前:デフォルトの名無しさん [2008/03/08(土) 02:38:59 ]
void calc(int& m, fstream* fio);

int main(void)
{
fstream fio[10];
char filename[10];
int m, steps;
steps = 7;
fio[0].open("calc0.dat");
m = 1;
while(m <= steps){
sprintf(filename, "calc%d.dat", m);
fio[m].open(filename, ios::in | ios::out);
m++;
}
m = 1;
while(m <= steps){
calc(m, fio);
m++;
}
return 0;
}

539 名前:デフォルトの名無しさん [2008/03/08(土) 02:43:13 ]
void calc(int& m, fstream* fio)
{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77

基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?

540 名前:デフォルトの名無しさん [2008/03/08(土) 02:43:52 ]
void calc(int& m, fstream* fio)
{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77
基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?

541 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:11:50 ]
>>540
>どこか間違っていますか?
あんたの説明。
結果がどうなったのか、どうなるつもりだったのか(これは全てcalc0.datと同じになるということか)、
実行した環境と処理系は何か、位のことは書いても罰は当たらんよ。

542 名前:511 mailto:sage [2008/03/08(土) 11:33:07 ]
昨日の続きなんですが、引数のの違う関数を
まとめた関数テーブルって、どう実装するのが
良いでしょうか?
>512のようにlistや可変長引数だと、個数が
違う場合には有効ですが、構造体を渡す場合には
無理があると思えます。
(構造体の要素をPOD型に分解してlist化するとか?)

>513で書かれた特殊化では、どう実装するのかが
全く閃きませんorz
キャストを使う以外で違った構造体やクラスを
スムーズに(できれば低コストで)渡す方法ってあるのでしょうか?

543 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 11:41:16 ]
>>542
昨日の続きと言われても状況を把握するために過去に遡って読むのは面倒なので目的を詳しく。
まぁ、よくあるGUIライブラリの実装などでは構造体を丸ごと渡すのではなく汎用ポインタを渡す形が多いけどね。

544 名前:511 mailto:sage [2008/03/08(土) 11:42:33 ]
なお今自分が使ってた方法だとこんな感じです。

class ArgBase { //引数親
public:
 virtual ~ArgBase(){};
}

class Arg1 : public ArgBase {
public:
 int arg;
}
//以下必要なだけArgBaseを引き継いだ構造体を作る

//関数テーブル
typedef bool(*pFunc)(ArgBase*) FUNCPTR;
FUNCPTR fuctable[10];
fnctable[0] = Func1;

//関数例
bool Func1(ArgBase *pArg) {
 //これがArg1が必要な関数なら
 Arg1 *ptr = dynamic_cast<Arg1*>(pArg);
 if(ptr == NULL) return FALSE;
 //処理
 return TRUE;
}

545 名前:デフォルトの名無しさん [2008/03/08(土) 15:49:36 ]
久しぶりにプログラムを組むのですが、初歩的なことが分からないので
教えてください。昔


float a;
a=1.0

と1ではなく1.0にしなさいと教わったのですが、その詳しい理由を
忘れました。
どうしてなのでしょうか?




546 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:56:19 ]
>>545
1.0も中途半端だな。1.0fと書け。
1と書くとそれはint型になる。
1.0と書くとdouble型になる。
1.0fと書くとfloat型になる。
intやdoubleからfloatへの変換は警告が出る可能性があるので、
代入先と同じ型にしておけということ。生成される機械語は同じだろうけど。

547 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:23:22 ]
>>543
やはり間違わないように気をつけてvoid*で渡してキャストするのが
常套手段なんですかね。

548 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:25:25 ]
あと、
typedef bool(*pFunc)(ArgBase*) FUNCPTR;
じゃなくて
typedef bool(*FUNCPTR)(ArgBase*);
でしたorz

549 名前:デフォルトの名無しさん [2008/03/08(土) 17:09:29 ]
現在、勉強がてらに、Windows用のクラスライブラリを無意味に作ってるのですが
dynamic_castって良い機能ですねぇ
基本クラスに無意味に仮想関数を突っ込まなくても、派生クラスの機能が使えるなんて嬉しすぎる


550 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:12:08 ]
dynamic_cast禁止

551 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:12:19 ]
は?

552 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:12:46 ]
すげークラスライブラリきた

553 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:24:08 ]
俺も今無意味にgtkのラッパークラスライブラリ作ってるよ!

Window wnd("sample",MAIN_WINDOW);
vBox box(MAIN_WINODW);
Label sample_label("sample",MAIN_WINDOW);
Button ok_button("OK",MAIN_WINDOW);

CREATE(MAIN_WINDOW);

ok_button.clicked(func);

box << sample_label << ok_button;
wnd << box;

CONSTRUCT(MAIN_WINDOW);

みたいにmain関数の中で書いたらコンパイルが通るようになるやつ。
今マニピュレーター実装中。

554 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:26:54 ]
これだから演算子多重定義が叩かれるわけだ。

555 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:49:29 ]
>>550
ごめんねごめんね(*‘ω‘ *)
void __fastcall TForm1::N1Click(TObject *Sender) {
 TMenuItem* menu = dynamic_cast<TMenuItem*>(Sender);
 switch(menu->GroupIndex)  {
  case 1:
   switch(static_cast<TSortDirection>(menu->Tag)) {
    case sortLarge:
     break;
    case sortSmall:
     break;
   }
   break;
   case 2:
    switch(static_cast<TLogOutputMode>(menu->Tag)) {
     case logList:
      break;
     case logSingleLine:
      break;
    }
    break;
 }
 UpdateTitle();
}




556 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:05:19 ]
Cらしいプログラムですなあw

557 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:05:55 ]
これなら適切にdynamic_castを使っている場面に見える。

558 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:08:50 ]
TForm1とかN1Clickとかいただけない

559 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:17:40 ]
すみません。えらく単純な質問なんですが、
C++で「なんでもいいからキーを押すと続行」
というのはどうすれば実現できるのでしょうか?
文字列や数字を読み取らせる方法は知ってますし、
ググればいくらでも出てくるのですが、
「いったん入力待ちしていかなるキーを押しても構わず実行」
という風にしたいのです。

もちろん数字読み取らせて適当な数+ENTERという風に組めば
手間が増えるだけで大体同じことはできるます。
しかし、あるデータの異常値の原因を調べるため、
異常のたびにそのデータをグラフにして打ち出させたいんですが
たぶん三万回くらいやらなきゃならないんです・・・

560 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:25:40 ]
OSによる

561 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:26:01 ]
そこでpdcurses(ncurses)

562 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:27:06 ]
enterキーのみ反応でいいならgetchar()でもなんでもいけそうな気がする

563 名前:560 mailto:sage [2008/03/08(土) 18:33:28 ]
ありがとうございます。getcharでいけました

564 名前:デフォルトの名無しさん [2008/03/08(土) 18:33:56 ]
>546
ありがとうございます。
元がfloatなのにいらないお節介しなくても良さそうなのに。


565 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:34:05 ]
559の間違いです。すいません



566 名前:デフォルトの名無しさん [2008/03/08(土) 18:46:22 ]
msxml6.dllを使ってXMLのデータを取得しようと思っているのですが、
要素の属性の取り方だけ分かりません。
どのように取り出せばいいのでしょうか?

567 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:48:37 ]
>>564
>元がfloatなのにいらないお節介しなくても良さそうなのに。
大きな勘違いをしている悪寒。

568 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:22:34 ]
もうなんて言うか、初心者とかそういうレベルですらないんですけど、
昨日小一時間このミスに気づかなくてバグと死闘していたので…

int a,c,x;
unsigned int b;

x = max(-c, min(x, a - b));
としたとき、

(a-b)がunsigned intとして評価されてしまうのですが、

こういうとき、オペレーターの戻り値の語ってどうやって決まるんですか?
どこかの本では、大きい方に丸められるとか何とか書いてあった気がするんですが…
実際どのような規則になっているんでしょうか?

569 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:30:35 ]
>>568
算術型の標準変換、整数の格上げとか
そんなもんどの本にも載ってるだろ。

570 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:30:57 ]
>>564
>元がfloatなのにいらないお節介しなくても良さそうなのに。
もとがdoubleの値(1.0)をおまいが勝手にfloat型の変数に入れようとしているのを
コンパイラさんは(おせっかいかなと思いながらも)教えてくれようとしている。

レベルアップするためにも、人の忠告は素直に聞こうな。

571 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:35:44 ]
>>570
おまえはサル

572 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:37:00 ]
サルなら反省できる

573 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:43:39 ]
>>570
お前・・・なんという読解力のなさ・・

574 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:46:59 ]
>>570の言うことは間違ってないような・・・

575 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:48:09 ]
>>570は正しい事を言っている気がするが
オレも読解力がないのだろうか



576 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:53:38 ]
皆無

577 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:54:05 ]
レスをたどると元々は
float a = 1;
のような気がする

578 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:59:33 ]
>>577
それだとfloat変数の初期化だよね。
もともとは以下のようにfloat←doubleの代入だったはず。
>float a;
>a=1.0


579 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:08:18 ]
>>569
持ってる本は2冊ともunsignedまでは書いてないんだが…
駄目なの使ってるのね…(一つは学校指定だけど)


算術型 標準変換 でググったら見つかりました、有り難う。

long double > double > float > unsigned long int > long int > unsigned int > int
int > unsigned int だとばっかり思ってた。
(表現力が大きい方に…ってかいてあるからマイナスが表現できる方が上なのかと…
 よく考えてみたら、表現できる値の絶対値はunsignedの方が大きいけど。)

580 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:15:02 ]
>>566
DOMだったら、selectNodesとかselectSingleNodeとかを使えばいいよ。

581 名前:デフォルトの名無しさん [2008/03/08(土) 21:20:47 ]
>578
最初に書き込んだものです。
多分みなさんが思っているよりもっと初歩的なことが
分かっていないのだと思います。
正直doubleとfloatの違いが精度の違いでfloatがメモリ確保の
ためだけに使われるぐらいにしか考えていません。
情報落ちや桁落ちの問題でここまでするのでしょうか?

正しい解釈はこうですか?

int a;
float b;
double c;

a=1;
b=1.0f;
c=1.0;




582 名前:デフォルトの名無しさん [2008/03/08(土) 21:23:45 ]
>581
すいません。もう少し質問させてください。
何のためにここまでするのかと言う部分です。
情報落ち、桁落ち、丸め誤差、その他
このうちのどれですか?


583 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:31:40 ]
おっもくそ大量の数値データを扱うときはdoubleじゃなくてfloatにするなぁ・・・
で、単純に、floatを準備したからにはfloatを突っ込む。と。

584 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:37:28 ]
>>581
何をどう解釈しているのか分からないが…。

1や1.0などの定数自身も型を持っていることは理解している?
その定数をどの型の変数に代入するかに無関係に、定数自身が型を持っている。
1 ← int型
1U ← unsigned int型
1.0 ← double型
のように。

>情報落ち、桁落ち、丸め誤差、その他
この場合は、その他。
実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現できる。

ここで指摘されているのは、定数の書式としてfloat型の定数を表現できるのだから
それを使用したほうが適切だろう、ということ。

精度の大きい型の値を精度の小さい型の変数に代入しても、桁落ちなどがなければ全く問題ない。
桁落ちなどがあるとしても、それを意図して書いているなら動作としては正しい。
でも意図したものかどうかプログラムを他人が読んでも分からないので、そのような場合は明示的なキャストをしたほうがいいこともある。
この場合はキャストなんかせず、定数を明示的にfloat型で書けばいい。

585 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:39:04 ]
定数の1は整数型だが、実数に変換しても何にも問題ないので
int a = 1;
float b = 1;
double c = 1;
としてしまうなぁ。
# ただし、float b = 1.0としてしまうとdouble値からfloat値からのキャストになるのでコンパイラによっては巧くないね。



586 名前:デフォルトの名無しさん [2008/03/08(土) 22:09:18 ]
>584-585
早速のレスありがとうございます。
よく分かりました。

>この場合は、その他。
>実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現で>きる。

そう思っていたのに何故そこまでこだわるのだろうと思っていたら、
定数の型のことを言っていたんですね。


587 名前:デフォルトの名無しさん [2008/03/08(土) 22:20:53 ]
マルチスレッドのプログラムでSTLは使えないと聞いたのですが、本当ですか?
あと、_PTHREADSをdefineすれば使えるとも聞いたのですが、、、
googleしても、結構昔の情報が多くて実際のところはどうなのかよく分かりませんでした。







[ 続きを読む ] / [ 携帯版 ]

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

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