- 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
- 445 名前:デフォルトの名無しさん [2008/03/06(木) 23:10:44 ]
- 以下のコードでファイルの2番目のバイトだけを
書き換えようとしたんですが 全く何も代わりません #include <stdio.h> int main(void){ FILE *fp; char cIn; char cOut = 'X'; int cnt; fp = fopen("test.txt", "rb+"); fread(&cIn, 1, 1, fp); printf("%c\n", cIn); cnt = fwrite(&cOut, 1, 1, fp); printf("%d\n", cnt); fclose(fp); return 0; } <test.txtの内容↓> ABCDEFG <出力結果↓> A 1 これはどう理解したらいいんでしょうか? BCとVCで試してみました
- 446 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:20:59 ]
- freadしてA読んで、表示した(出力1行目)
fwriteして次のBをXで上書きして、(test.txtの中身変化) 要素数の1が戻ってきて表示(出力2行目) 何が不思議なんだ?
- 447 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:21:31 ]
- >>445
readからwriteに切り替える時、もしくはwriteからreadに切り替える時は 必ず間にfseek()を挟む事。
- 448 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:39:54 ]
- >>445
コンパイル君のぼやき 「freadとfwriteに&使わないで下さいよ。あと、辞書ぐらい買ってくださいよ。 何でもかんでも私に聞かないで下さいよ。なんでもかんでもプリントにしないでくさいよ。 宣言するんだったらまともに宣言してくださいよ。main関数の引数ぐらい使ってくださいよ」
- 449 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:43:29 ]
- Visual C++についてなのですが、
分割コンパイルについていまいちよくわかりません。 main.ccp ClassA.ccp Def.h ClassA.h resource.h と5つあって、 main.ccpではDef.hがインクルード、 ClassA.hでもDef.hがインクルードされ、Classの宣言と、インラインでのメンバの定義、 ClassA.ccpではClassA.hとDef.hがインクルードされています。 また、Def.hではresource.hがインクルードされているほか、#ifdnefを使って重複しないようにしています。 ビルドをすると、C2143構文エラーなど、ものすごい沢山のエラーが出てきてしまいます。 このようにヘッダとソースファイルを分割する場合、どのようにインクルード等をすればよいのでしょうか。
- 450 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:48:48 ]
- > ClassA.ccpではClassA.hとDef.hがインクルードされています。
とりあえずこのDef.hはインクルードしなくていいいような・・・
- 451 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:49:48 ]
- >>449
その文面だけを見る限り、ファイル分割のしかたもインクルードの仕方 も問題ないよ。エラーが出るのはファイルの内容がどこか間違っている とか、何かの定義が足りないとか。
- 452 名前:デフォルトの名無しさん [2008/03/06(木) 23:51:02 ]
- newを使って確保した領域をポインタとして返す関数を作ったんですけど、開放するにはどうすればいいんですか?
個人的には↓の方法でできるような気がするのですが、できるかどうか心配なので教えてください char *func(){ char *buf = new char[1024]; //bufにデータを入れる return buf; } int main(){ char *ptr = func() //ptrであんな処理やこんな処理 delete [] ptr; }
- 453 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:51:16 ]
- 膨大な数のエラーと聞くと、本当に何か書き間違えている気がする。
- 454 名前:デフォルトの名無しさん [2008/03/06(木) 23:55:48 ]
- 初心者も上級者もnew使うならクラスでつかえよな
解放する方法を間違えたり、しなかったりする クラスならデストラクタがする
- 455 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:56:25 ]
- >>452
どうでも話にはなるが、 メイン関数のファンクがカマを彫られたって泣いてるが、 わかっててほられたのかほられてないのか気になる。
- 456 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:56:44 ]
- >>452
それで特に問題はないが、 void func(std::vector<char>& buf) { buf.resize(1024); // buf にデータを入れる } int main() { std::vector<char> buf; func(buf); // buf であんな処理やこんな処理 } とやった方が面倒がないし例外とかあっても確実にメモリが解放されるから安全で便利。
- 457 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:57:05 ]
- >>454
それ・・・なんの冗談?
- 458 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:57:48 ]
- 日本語はおかしいが、要するに RAII ってことじゃね?
- 459 名前:デフォルトの名無しさん [2008/03/06(木) 23:58:43 ]
- string buf
buf.reserve(1024) &buf[0] でも良い
- 460 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:59:30 ]
- それはちょっと・・・。
length 変わらないじゃんか。
- 461 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:59:47 ]
- >>451
あってますか… 1行目初っぱなから Naive_Grid_Class.cpp(4): error C2143: 構文エラー : ';' が 'NaiveGridCtrl::ChkhCtrl' の前にありません。 などと出てきて(下のようなコード) #include "DefHeader.h" #include "Naive_Grid_Class.h" BOOL NaiveGridCtrl::ChkhCtrl(){ return (BOOL)hCtrl; } もう何が何だかさっぱりなんですが…
- 462 名前:デフォルトの名無しさん [2008/03/07(金) 00:01:05 ]
- >>457
class ABC { char *buf; ABC(){確保} ~ABC(){解放} }; main(){ ABC x; } とやれば簡単って事
- 463 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:03:17 ]
- 呼ばれたタイミングだけでnewしたいとは限らんだろうに
- 464 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:04:43 ]
- >>461
class NaiveGridCtrl の最後の ; を忘れているんじゃないか?
- 465 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:08:16 ]
- 質問です。
前から思ってたんだけど、 メモリの解放以外にデストラクタって使い道あるの?
- 466 名前:デフォルトの名無しさん [2008/03/07(金) 00:09:25 ]
- データの残りを書き出す
- 467 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:11:43 ]
- リソースの開放
- 468 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:22:56 ]
- 質問です。
C++で住所録を作っているのですがソートができません。 構造体に名前、住所、年齢、電話番号・・・など 項目ごとに入れるところまではできたのですが、 名前、住所、年齢、電話番号・・・など項目ごとに分かれているので、 名前なら名前だけがソートされてしまい他のはそのまま。 名前をソートしたらその順序で他の項目が付いてくるようにするには、 どうしたらいいのでしょうか。
- 469 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:24:16 ]
- >>468
まず、どうやってソートしてるんだ? そこのプログラムみせてみ
- 470 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:24:24 ]
- >>468
え?なんでそうなるのさ? ソートした順に構造体を並べ替えればいいだけじゃんw
- 471 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:25:22 ]
- 名前だけ入れ替えてるんじゃねw
- 472 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:26:52 ]
- 構造体にしてる意味がねぇw
- 473 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:27:37 ]
- 名前をソートするんじゃなくて、名前のソート順通りに構造体のオブジェクトをソートするんだ。
- 474 名前:デフォルトの名無しさん [2008/03/07(金) 00:33:47 ]
- int i = 1;
while(i <= 10){ fout[i].open("dat$i.dat"); fout[i] << i <<'\n'; i++; } てな感じでデータファイルを10個作りたいのですが、 ""の内のiは変数と見てくれなくて困ってます。 何かいい方法ありませんか??
- 475 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:36:20 ]
- >>474
あたりまえだろw こうすればいい char filename[100]; sprintf( filename, "dat$%d.dat", i ); fout[i].open( filename );
- 476 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:36:50 ]
- >>474 stringstream
- 477 名前:デフォルトの名無しさん [2008/03/07(金) 00:37:46 ]
- >>468
#include <iostream> #include <string> #include <set> using namespace std; class memberlist{ public: string name; string tel; string adress; memberlist(string a, string b,string c){ name=a; tel=b; adress=c;} bool operator<(const memberlist& a)const{ if(name<a.name)return 1;return 0;} }; main(){ set<memberlist> x; x.insert(memberlist("山田太一","030000000","東京都")); x.insert(memberlist("明石家明","077777777","沖縄県")); x.insert(memberlist("佐藤一郎","051111111","大阪府")); set<memberlist>::iterator p; for(p = x.begin(); p!=x.end(); p++){ cout<< p->name <<" "<< p->tel <<" "<< p->adress <<endl; }}
- 478 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:41:10 ]
- >>463
どちらにしろ管理クラスに入れとけば デストラクタが勝手に delete してくれるだろ。
- 479 名前:445 mailto:sage [2008/03/07(金) 01:06:00 ]
- みなさんドモドモ
>>447 それそれ。それです。 fseek(fp, 0, SEEK_CUR); が必要みたいなんですが これがわからない。 カレントポジションから0バイト進めるのは 何もしないのと同じなのではないのでしょうか? OSのAPIなどの場合 readしてそのままwriteする事でファイル位置が 自然に進む事が多い気がする訳ですが この仕様はよくわからないです これはC(ライブラリ)の明示された仕様なのでしょうか?
- 480 名前:445 mailto:sage [2008/03/07(金) 01:12:39 ]
- そうそう。あと一つ・・・
fwriteで1バイト書き込めたはずなのに その1バイトはどこへ行ってしまったんでしょうか・・・
- 481 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:13:18 ]
- >>479
APIと違って、バッファリングするのが前提だからfseek()などでバッファを同期を取ることに決められている。
- 482 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:16:55 ]
- >>461
Naive_Grid_Class.h の最後に ; が足りないとか、 BOOLの定義がどこにもないとか。
- 483 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:17:54 ]
- >>480
同期を取っても書き換わらない?
- 484 名前:デフォルトの名無しさん [2008/03/07(金) 01:22:57 ]
- >>475
そのようにすれば、できました! ありがとうございます。 >>476 stringstreamも勉強します。
- 485 名前:445 mailto:sage [2008/03/07(金) 01:49:51 ]
- >>481
なるほど。仕様ですか・・・ 多分FILE構造体の内容とかから必然なのかな? 直感的には把握が難しかったです >>483 fseekはさめば書き換わりますが、 はさんでなくてもfwriteの結果が1というのが 納得いかず・・・ 試しにfread/fwrite/fseek(fp, 0, SEEK_END) というのもやってはみたけれどやはり書き換わらず・・・
- 486 名前:デフォルトの名無しさん [2008/03/07(金) 02:03:11 ]
- int main(){
fin.open("aaa... fout.open("bbb... function(....); } function(.....){ fout << "thanks" <<'\n'; } のようにmain関数でデータファイルを開いて、 function関数の中に開いたファイル持ってきて、書き込みたいんですけど。 どうするのがいいのでしょうか?
- 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にしなさいと教わったのですが、その詳しい理由を 忘れました。 どうしてなのでしょうか?
|

|