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


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

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



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

331 名前:デフォルトの名無しさん [2007/12/15(土) 16:57:51 ]
ソースの行数とかクラスの数とかを計測したいのですが
何かいいソフトはないでしょうか? Linuxです

332 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 17:10:37 ]
>>331
行数は wc でいけるでしょ。クラスの数は grep でだいたいいけそうだけど、
doxygen とか使ったほうがいいかもね。

333 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 17:11:37 ]
最近プログラミングをはじめたのですがWindowsXP+VC2005環境でexeファイルにtxtファイルをドラッグ&ドロップして
fstreamでファイル操作する簡単なプログラムを作ろうと思ったのですが

ifstream file;
file.open(argv[1]);

こんな感じでargv[1]からファイルパスを受け取ろうとしてるのですが
平仮名片仮名がフルパスやファイル名に含まれているとエラーが出て開けません
argv[1]からフルパス受け取ると2バイト文字は扱えないのでしょうか?

ユニコード文字、マルチバイト文字の二つのコンパイルを試しましたが駄目でした。

334 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 17:17:06 ]
受け取れる
ドラックや入力する時点で空白で分離されているのでは

335 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 17:18:51 ]
>>332
空行やコメントのみの行を除外したり、
関数の中身のみの行数を数えたり、とか、
いろいろしたいとなると wc だけじゃ辛いかもね。

336 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 17:19:58 ]
>>333
VC2005 の fstream には日本語ファイル開けないバグがある。
www.google.co.jp/search?q=vc2005+fstream+setlocale

337 名前:333 mailto:sage [2007/12/15(土) 17:23:09 ]
>>334 >>336
回答ありがとうございます。

VC2005特有の症状ってことですかね、検索しても全然わからないで困り果てていたので助かりました。

338 名前:331 [2007/12/15(土) 17:29:46 ]
>>332>>335
ありがとう。なんとかなった

339 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 17:30:57 ]
>>327
200でも-1でも0x7fffffffでもint n;Foo(n);でもコンパイル通ったよ。
ちなみにsizeof(Foo) == 4だった。

やっぱ列挙型引数でも範囲外チェックしなければいかんのかね…



340 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 18:28:20 ]
>>339
>>327で書いたのは規格の話。
コンパイルが通ろうが実行できようが、規格上はは未定義。
つまり0〜15以外の値については実装依存。

341 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 18:50:13 ]
列挙子って、少なくとも int 以上のサイズになるんじゃなかったっけ? 規格上は。

342 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 18:51:31 ]
規格の話してるんなら C か C++ か、章番号とか、ちゃんと示してくれ。

343 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:05:39 ]
それを言うなら >340 だって

344 名前:デフォルトの名無しさん [2007/12/15(土) 19:07:00 ]
>>343
文盲乙

345 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:09:23 ]
アンカを付けないなら誤解される事は覚悟しなきゃダメだ。

346 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:10:15 ]
まあ>>342は規格の話してるんなら、って明言してるわけだし文盲乙は適当だな

347 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:17:16 ]
そもそも >341 のみに対するレスか >340-341 の両方に対するレスかが不明

348 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:19:51 ]
規格の話って言ってるじゃん

両方というかすべてに対してとるべきだし、本人はとられることに文句は言えないと

349 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:27:34 ]
VC2005でwcoutに出力しています。
全角などが含まれているとそれ以降wcoutが動作しなくなる問題があって
>>333さんの問題と同じ原因かと思うのですが、
特定のスレッドのみC++ロケールを変更するにはどうしたらよいのでしょうか?
  std::locale::global(std::locale(""));
すると全スレッドに適用されてしまうので今回は使えません



350 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:32:13 ]
wcoutを使わずcoutで処理する

351 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:32:50 ]
locale 関連ってホンマ実装がいい加減なコンパイラが多くて困る。

352 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:33:36 ]
外国人が作っているからな゜

353 名前:339 mailto:sage [2007/12/15(土) 19:35:14 ]
>>340
VCが規格違反しているわけではないってことでいいのかな?
まあどちらにしてもコンパイル通る以上対策はせなあかんということだが…
ともかくサンクス。

354 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:36:24 ]
strがワイド文字のときの出力法


int n=WideCharToMultiByte(CP_ACP, 0, str, -1,NULL,0,NULL,NULL);
char *putf = new char[n+1];
n=WideCharToMultiByte(CP_ACP,0,str,-1,putf,n,NULL,NULL);
cout<<putf<<endl;

355 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:40:56 ]
シャンピーとどいたー\(^o^)/

356 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 19:41:28 ]
ごばくー/(^o^)\

357 名前:349 mailto:sage [2007/12/15(土) 19:53:53 ]
cout << "うはwwwおkww";

ありがとうございます orz

358 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:09:37 ]
初心者ですお願いします
何も入力されてないの(エンターーのみ)をデータとして扱うにはどうしたらいいでしょうか?
初歩的ですいません

359 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:15:00 ]
>>358
scanf("%d",・・・); みたいにしてるとか?




360 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:26:53 ]
getch()の戻り値はエンターの時どうなんだろ

361 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:32:50 ]
シャンピーとどいたー\(^o^)/

362 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:33:44 ]
ごばくー/(^o^)\

363 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:41:01 ]
>>359
yes

364 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:45:02 ]
エンターいれっと普通に13返ってくるな

365 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:45:45 ]
>>363
int n;
char line[100];
fgets(line, sizeof(line), stdin);
if (line[0] == '\n') {
  // エンターだけ
}
else {
  sscanf(line, "%d", &n)
}


366 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 21:14:43 ]
>>365
thanx

367 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 22:59:08 ]
>>353
規格違反ではないね。実装依存だから何でもアリ。
VCの実装がそういうふうに対応しているという
だけのことだね。

368 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:51:11 ]
質問です。
OSはMacOS X 104.11です。
#include <stdio.h>

int main (int argc, char *argv[]){
fprintf(stdout, "%s¥n", argv[1]);

return;
}
というプログラムを書いたのですが、
いざ実行させるときに、引数に
桜木 花道とやると、桜木 花道
桜木 花道とやると、桜木
しか出力されません。
なんとか回避したいのですが、どのようにすれば良いでしょうか?

369 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:55:25 ]
半角空白は区切られる
あきらめろ



370 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:56:15 ]
argv[2]
も出力する

371 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 05:59:50 ]
ああ、マジですかorz
それって、OSのバグとかじゃなくて
C言語の文字列の表現の仕様ですかね?
半角を入れると
桜木'¥0' 花道'¥0'
ってなるんでしょうか?

372 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 06:15:23 ]
そういうことだな

373 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 06:19:36 ]
うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
こんな問題に出会うとは!
どうしよう。鬱だ。寝よう。

374 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 08:13:42 ]
>>368
program "桜木 花道"

375 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 08:47:55 ]
>>371
C言語の文字列の表現の問題というよりは、コンソールの仕様(コマンドラインに入力した文字列を
半角で引数を区切る)かな。
自分でシェルを作って、引数の区切りを半角文字以外で指示できれば argv[1] = "桜木 花道" も可能だよ。

argv[]にどういう文字列が渡されるかもC言語の規格の範疇だっけ?


376 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 09:09:48 ]
>>375

JIS規格見てみたが、「文字列へのポインタでなければならない」としか書いてないな。



377 名前:375 mailto:sage [2007/12/16(日) 09:20:01 ]
>>374に書いてあるように、わざわざ自前シェルを作らなくても
たいていのプラットフォームでは "" で囲めば事足りるね。なぜか忘れてたorz


378 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 09:40:06 ]
>>373
program "安西 先生"

379 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 10:06:12 ]
#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[]){
 if (strcmp("安西 先生", argv[1]) == 0) {
  fprintf(stdout, "あきらめたら?\n");
 } else {
  fprintf(stdout, "%s\n", argv[1]);
 }
 return 0; //mainの戻り値をint指定したら戻り値返さないとコンパイルエラー
}



380 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 10:19:34 ]
今時のコンパイラはエラーになるのか

381 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 10:23:58 ]
>>373
> うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
> こんな問題に出会うとは!
> どうしよう。鬱だ。寝よう。
>
>>368 のプログラムでそれは大げさだろ。>>370 がまっとうな解答だと思うが。
argc に情報あるんだし。

382 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 11:42:47 ]
VS2005MFCですが、OnKeyDown()関数で受け取ったint型のアスキーコードを、
元の文字に変換してstd::string型の変数に代入するにはどうしたらいいですか?
int n = 0x30; //キーボードの0を押下して得られるアスキーコード
nをstring型の0に変換したい
intからCString型の例は結構あちこちで、散見してるんですが・・・・


383 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 11:57:01 ]
382です自己解決しましたがもっといい方法があったら教えてください
#include <iostream>
#include "stdio.h"
#include <string>

int main()
{
 int n = 0x30;
 std::string str;
 str = ( char )n;
 std::cout << str << std::endl;
 return 0;
}

384 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 11:58:44 ]
>>382
代入: s.assign(1, static_cast<char>(n))
変換: std::string(1, static_cast<char>(n))

385 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 12:00:25 ]
str = static_cast<char>(n) が正解だね。これに何か不満でもあるの?

386 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 12:05:56 ]
>>384
>>385
サンクス

387 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:24:32 ]
C一通りやったつもりでいるし解説も読んだんだけど未だよくわからない、その過程過程が載っているとこでもないだろうか

int main (int argc, char *argv[]){←こいつなんですが

エントリポイントの引数ってことは解説サイト等見たところでもプログラムが実行させる時に渡されるものだというのはわかりました。
また、形態が文字列で、スペースで区切られ、argv[]の要素数がargcに入るのもわかりました。

でもその、プログラムが実行するときに渡される、という意味がさっぱりわかりません
例えばなんらかのソフトウェアをダウンロードし、自身で使うとき(ブラウザでもマルチメディアプレーヤでもなんでも)
.exeのファイルをクリックした際何かが渡っているんでしょうか?
ダブルクリックをして起動するだけですし、だとすると明示的にint argc, char *argv[]と書かなくてもいいことになってしまいそうで

すんごいこんがらがってます

int main (int argc, char *argv[]){でぐぐると解説が結構出るのですがもうさっぱりです

388 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:42:53 ]
>>387
例えばアイコンにファイルをD&Dして起動した場合、
argvにはそのファイルのパスが渡される。

コマンドプロンプトから起動する場合は、
任意のオプションを文字列として渡すことができる。


389 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:48:55 ]
コマンドプロンプトやファイル名を指定して実行では、
hege.exe /x /yのように実行ファイルの後に文字列(コマンドライン引数)を指定できる。
これがCのプログラムでは、mainの引数で受け取れるということ。
Windowsでは関連付け起動、実行ファイルへのドロップ&ドロップ起動などでもコマンドライン引数が使われる。



390 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 16:59:43 ]
>>388-389
早々にありがとうございます。

つまり先ほど例に出したものだと
WebブラウザならばそいつにhtmlファイルをD&Dするとそのhtmlファイルのパスが渡り、ブラウザが起動し、そのhtmlの内容を表示するとか
マルチメディアプレーヤなら音楽ファイルをD&Dするとその音楽ファイルのパスが渡り、プレーヤが起動し、その音楽が再生されるとか
といった具合でしょうか


391 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 17:14:11 ]
そういうこと。
ただし、ウインドウへのD&Dは全く別の仕組みなんで混同しないでね。

392 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 17:50:31 ]
UNIX使うと良くわかる。
#include <stdio.h>
int main (int argc, char *argv[]){
int i;
printf("argc = %d¥n",argc);
for(i = 0; i < argc;i++)
printf("argv[%d]=%s¥n",i,argv[i]);
}
exit(0);
}

ちなみにここ最近でargv[]で何が出来ないこれが出来ないと質問してるのは俺!
みんなありがとう!

393 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 17:53:31 ]
returnいらないの?exitの定義知らないんであれだけど

394 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 18:04:39 ]
exit()使ってるのにstdlib.hをインクルードしてないな。
ってか普通は return 0; だろ。


395 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 18:06:46 ]
つかエスケープ文字が全角だったり

396 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 19:49:45 ]
C++の入門書をやり終えました。
ですがいまいち、クラスの利点がわかりません。
部品化して便利になるというイメージはあるのですが。
まだC言語っぽい書き方をしてしまいます(C++っぽい書き方もいまいちわかりませんが)。
クラスの利点やC++の書き方について書かれた書籍ってありますか?

397 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:14:03 ]
>>396
>クラスの利点がわかりません。
まずは標準ライブラリを使いこなすところから始めたら?
そうしてクラスの利点が分かれば、自分で作ろうという気にもなるだろう

398 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:14:27 ]
>>396
適切な本を薦められなくて申し訳ないけど、まずは本で勉強するだけでなく
実際に書いてみて試行錯誤することが大切だと思うよ。

基本文法さえ分かったなら、あとはとりあえず自分であれこれ書いてみて、
まずいクラス設計をして使いにくいと感じたり、エラーが起きて原因を解決したり、
こういうことをしたいけどどう書いていいか分からないと悩んだり、
そういうことを経験したほうが深く理解できるよ。

そのうち、こういうことをするとうまくまとめて書きやすい、分かりやすい、などの利点が見えてくるはず。

本に載っている「正しいやり方」だけを学んでそれをなぞるだけだと、
理解したつもりになっていて実は分かっていない、ということになりがち。

仕事なら早く身につける必要があるだろうけど、学生や趣味でやるなら時間をかけてもいいんじゃない?

399 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:28:34 ]
クラスの勉強と思って簡単なゲームを作ってみたんだけれども、クラス間のやり取りが面倒すぎてやめた

あるAクラス内の配列をBクラスのメンバ関数から参照したいとき、とか
friendってのもあったがそんなこというと全部のクラスにfriendつける必要でるし、
クラスのうまい利用の仕方とか載ってる本探すべきっぽいなぁ



400 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:43:17 ]
C++でnewしたヤツをdeleteする時、
newした時の型のままのポインタをdeleteしないとダメ?

キャストされて別の型になってるポインタをdeleteしても
大丈夫?

401 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:44:45 ]
>>400
virtual

402 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:57:41 ]
>>400
new したときのクラスの基底クラスにキャストされてるポインタは、その基底クラスが
virtual なデストラクタを持っていれば delete できる。

403 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 00:14:23 ]
>>399
何がやりたかったのかわからんが、多分それはクラス設計ミス。

404 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 00:16:01 ]
>>399
参照するだけなら、クラスAの配列の要素にアクセスするメンバ関数をinlineで作るとか

405 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 03:59:03 ]
クラスの設計って難しいよねぇ。
PDO(PHPね)とか使うと、オブジェクト指向すげぇ!って感動するけれど、
自分でいざ、クラス設計してねって言われると、Orz。
何かコツがあるのかしらん?
Cのライブラリでも、構造体使ってうまくオブジェクト指向っぽいもの?を実現しているのを見ると、
感激する!

406 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 06:07:46 ]
もっとレベルの高い環境に触れないとわからんよ

407 名前:399 mailto:sage [2007/12/17(月) 09:21:57 ]
クラス設計、やっぱそういう本探してこよう・・

一応やってたのは、配列にフィールドというかマップのフラグみたいなものを格納したいた。
配列の要素内には数値が入っていて、それによってその1マスがどういう状態なのか示すように。

で、よくわからずクラスをマップごとに分けてたんだ、例えばドラクエでいうと宿屋の中と町の中が別クラス
そんな状態で宿屋で休むと町の様子が変化したりetcをやろうとして爆発した

408 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:46:43 ]
>>396
個人的には398に同意だけど、初学者向けの本であれば
「ゼロから学ぶ C++」(日経BP)って本に、CからC++への
移行時の要点ということで、クラスや継承を使うと便利な
ケースと使わない方がいいケースとか、is-a、has-a関係
とかの基本的な話が簡潔に載ってた気がするので、
立ち読みしてみてもいいかも。
ただかなり平易なので、ネットで効率よく検索できれば
不必要(または物足りない)かもしれないけど。

409 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:47:57 ]
長文失礼、ちょっとC++プログラムのコーディングでいい方法があれば誰か教えて下さい。

今、簡単なライブラリ的なクラスを作りました。それは継承されることを前提として
います。仮にそれをKihonとしておきます。

今、Kihonの派生クラスHaseiを作りました。HaseiからKihonを使う方法ですがまず、Kihonの
メンバ関数を通じて必要なパラメータ(privateな変数)を設定します。次にHaseiに
double func(double x)なメンバ関数を定義します。これはKihonクラスでvirtual関数として
宣言されているものです。その後、Kihonのrunを実行するとHaseiのfuncが利用されて
処理が行われるというものです。一回のrunでfuncは何度も呼ばれます。

問題なのはHaseiで異なる二つの処理をKihonのrunにさせるにはどうしたらいいものかということ
です。つまり、異なる相異なる2関数に対してKihonのrunを実行するにはどうすればいいのかと
いうことです。しかも後に実行されるrunが前に実行されたrunの結果を使う必要があります。

初心者なりに考えた方法ですと・・・
0, Haseiのオブジェクトh0を作る。
1, Haseiのfunc関数を作る。この関数内で別のクラス、__Haseiのオブジェクトh1を作る。__Haseiは
Kihonを継承している。
2, 最初のrunで必要なメンバ関数funcを__Haseiで定義する。
3, Haseiのfunc関数からh1.runとして最初のrunを行う。
4, h0.runとして二度目のrunを行う。
(メンバ変数の設定に関しては説明略)。

実際、この方法だととりあえずは動作するのですが次のような問題点があります。
・__HaseiからHaseiのプライベートメンバにアクセスできない。(friendでは次項が解決不能…)
・実はHasei自体もライブラリ的に実装を隠蔽してしまいたいため、__Haseiのfuncを変更
出来るようにしたい。(ちなみにHaseiのfuncは固定。)

多重継承をうまく使うと解決できそうにも思えるのですが賢い、実装方法はないでしょうか。
お力をいただけると幸いです。根本的にKihonの設計に対する指摘でもお願いします。



410 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:59:51 ]
>>409
いろいろわからん。コード書け。あと __ は使うな。

411 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:25:04 ]
>>409
適当に思い浮かんだ単語

スレッド
static メンバー
boost

412 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:54:23 ]
「初心者なりに考えた方法ですと・・・」の部分、ただしコードを全部書くとさらに長大になってしまうので
掻い摘んで。(409のHasei→Hasei0、__Hasei→Hasei1とした)

class Kihon{
virtual double func(double x){return 0.0;} /* =0としてしまってもよい */
public:
double run()
{
... /* runの実装部分 */
for (j = 1; j <= n; j++)
func (x); /* funcは何度も呼ばれる */
return ret; /* 計算結果を返す */
}
};

class Hasei1: public Kihon
{
double y;
double func(double x){return x*sin(x+y);} /* 計算対象 */
public:
void set_y(double y){this->y = y;}
};


413 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:54:54 ]
class Hasei0: public Kihon
{
double func(double x){
Hasei1 h1;
h1.set_y(x);
... /* h1のprivate変数を設定など */
return 1.0 - h1.run();
}
};

int main()
{
Hasei0 h0;
.....
cout << h0.run();
.....
}

例えばx*sin(x+y)の多重積分を想定している感じです。実際にはこれ以外にもたくさんありますが。
本来ですと計算対象は(例えば別のクラスを宣言することや、関数へのポインタでもいいですが)自由に変更出来ること、
そもそもHasei0も1も実装は隠蔽してしまいたい、計算対象はパラメータを含んでいるので本当はクラスとして実装
したいというのがありますが恐らく、これでは無理でしょうからいいアイディアはあるでしょうかという意味です。
よろしくお願いします。

414 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 13:01:11 ]
boostって知りませんでした。ちょっと調べてみます。

415 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 13:01:37 ]
>>409
多重継承だけは使うな。
あとでワケわかんなくなる。


416 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 15:15:36 ]
>>413
ようわからんがtemplateとかboost::bind(std::bind1st, std::bind2nd)使えばよさそうな気がする。ファンクタも調べた方がいいかも。
試しに同じような事するの書いてみた。

template<typename Func> double kihon(Func func)
{
 for (j = 1; j <= n; j++)
  func(x);
 return ret;
}
double hasei1(double x, double y) { return return x*sin(x+y); }
double hasei0(double x) { return 1.0 - kihon(boost::bind(&hasei1, _1, x)); }

int main()
{
 kihon(&hasei0);
}

417 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 16:17:11 ]
>>416
本当にどうもありがとうございます。まだ、自分のプログラムでは解決していませんが言わんとしていることが
よくわかります。たしかにテンプレートを関数のポインターに使えば解決しそうです。C++は初めてなので
参考になります。重ね重ね、ありがとうございます。


418 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:05:37 ]
あるライブラリ(A)をラップした、全く同一のインターフェイスが使えるDLL(B)を作りたいのです。
つまり、DLL(B)はライブラリ(A)のすべての関数をエクスポートします。

これを実現するために(とりあえずwin32環境限定の話)
ライブラリ(A)をDLL(B)にスタティックリンクさせ、ライブラリ(A)の各関数宣言に
__declspec(dllexport)をつけたファイルをDLL(B)からインクルードさせたのですが、
どうもこれでは上手くいかないようで、DLL(B)からライブラリ(A)の関数がエクスポートされていませんでした。
そこで質問なのですが、DLLからライブラリを直接エクスポートすることは可能なのでしょうか?
もし可能ならやり方を教えていただけるとありがたいです。

(ライブラリ(A)をDLLにするという方法はとりあえず却下でお願いします。
今は別の方法としてライブラリ(A)のソースファイルを直接DLL(B)に追加しています)

419 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:48:06 ]
VC++2005StandardでMFC使おうとしてるんですが
ウェブで調べてもVC6.0系の使い方ばかりで全然分かりません
2005のMFCの入門的なサイトってないですか?
できればopengl を絡めたところがいいんですが



420 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:55:07 ]
MFCはマイクロソフトファンダメンタルクラスだろ? バージョンによって言語(クラス)の使い方が変わるかよ
6用でも関係ないだろ

421 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 19:05:27 ]
クラスウィザードとかを使うのに、IDEのどこのボタン押して、どの選択肢を選べばいいのか?
・・・ってのを知りたいのじゃね?

422 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 19:53:19 ]
そういやVC2008EEが来るな

423 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 20:02:56 ]
VC2005でもういいです

424 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:09:24 ]
Hoge hoge1;
Hoge *hoge2 = new Hoge();

の違いがよくわからないのですが
newした場合、普通に宣言するより良いことがあったりしますか?

425 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:15:06 ]
>>424
絵に描いたような初心者か、釣りか、のどっちかだな

426 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:17:47 ]
ヒープ領域は量が多い (ハードディスクもメモリ代わりになる)
自分で変数の領域を開放できる
ヒープに確保すれば、高速な動作が必要な変数をスタック領域、レジスタ領域に割り当てられやすくなる

427 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:19:40 ]
大量にメモリ食うやつは全部newとかにしておけばよい 
実メモリを多く空けておくことが大事

428 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:21:41 ]
STL 頼ってるから最近 new 使ってないな…

429 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:27:03 ]
メモリどうこうより、初心者には寿命の違いを説明した方がいいのではなかろうか



430 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:27:30 ]
調べてきたけど、スタック領域はコンパイル時に決定されるらしい
メモリ食うやつは、動的に確保しないとプログラム終了までスタック領域として確保されっぱなしってことだ
他のプログラムや自分のプログラム内でもメモリ確保が難しくなるということだ

431 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:31:08 ]
30バイト以上の確保は動的確保にしようぜ newやvectorやstringを使おう






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

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

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