[表示 : 全て 最新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を使おう

432 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:31:23 ]
>>424
Hoge hoge1; 
の場合、hoge1の寿命がその関数(あるいはブロック)に縛られる。
関数を抜けた後もhoge1を維持することは出来ないし、関数を抜ける前にhoge1を消すことも出来ない。

Hoge *hoge2 = new Hoge();
の場合、hoge2の寿命は自分でコントロールできる。
関数を抜けようが抜けなかろうが、deleteするまでは消えないし、deleteすればいつでも消せる。

433 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:35:35 ]
配列は動的確保、自動開放するvectorがあるけど 変数は動的確保、自動開放する命令ってないよね?
Hogeクラスが5Mとか使うとは想像していないのだろうか?

434 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:36:37 ]
auto_ptrのことか?ちょっと違うか?

435 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:57:06 ]
class Hoge{ char x[10000]; };

auto_ptr< Hoge > hog(new Hoge);

こうやって使うのか 勉強になった でもアクセスが*付けないと駄目で不便だよね

436 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:02:26 ]
そんなあなたに
boost::scoped_array
boost::shared_array

437 名前:424 mailto:sage [2007/12/17(月) 22:06:21 ]
しょうもない質問に答えてくれてありがとうございます

とりあえず普通に宣言しておけば大丈夫だ
なんて思ってた自分が馬鹿でした・・・
しっかりdeleteする必要がありますが、
なるべく動的確保にしておいた方が良いんですね

もうすこし自分でも調べてみようと思います
ありがとうございました

438 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:10:48 ]
int型やchar型やdouble型の変数を動的確保するのは止めよう
あとループの変数も動的確保するのは止めよう
判断基準は、メモリを消費するかどうかだろう

439 名前:!=438 mailto:sage [2007/12/17(月) 22:27:09 ]
>>438
判断基準に「(ループ内など)速度が必要か否か」も加えるといいかも。
10万回、100万回のループになると毎回newするのも…

まぁ、その場合は最初にnewして使いまわせ、って話になるわけだが。



440 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:30:32 ]
ループ内で毎回な別領域の確保が必要な場合はあるけどね・・・
流用できるなら内部でしたらだめだな

441 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 22:38:19 ]
基本的にループの変数は直前に確保した方が良いのかなあ
以前から使っている変数だと、レジスタにのっている可能性は低いし、ループで使うからと言って移動はしないよね?
for( int )だと最適化されそう

442 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:12:40 ]
>>441
変数の用途が明確な方が最適化対象になりやすい。

443 名前:デフォルトの名無しさん [2007/12/17(月) 23:42:33 ]
別のスレッドで返答がもらえなかったのでこちらで。

なぜcallocは2引数関数なのでしょうか。ゼロクリアするだけならmallocのように1引数でも可能だとおもいます。
2引数のほうが最適化しやすいからだときいたことがありますが、具体的にはどのような最適化が考えられるでしょうか?


444 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:51:31 ]
callocのcて何て意味?

445 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:52:34 ]
>>443
例えば80486以降のインテル系CPUはSTOSB STOSW STOSDという三つの命令があり、
それぞれバイト、ワード、ダブルバイト単位でレジスタから転送を行う。
他のCPUでもサイズに応じた専用のインストラクションを持っていることはよくある。
そのどれを使うかとかいったヒントになる可能性があると思う。

446 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:53:00 ]
clear?


447 名前:445 mailto:sage [2007/12/17(月) 23:53:15 ]
ダブルバイトってなんだよ。ダブルワードの間違いな。

448 名前:デフォルトの名無しさん [2007/12/17(月) 23:56:16 ]
>>445
なるほど。ありがとうございます。
しかしその程度なら、要求されたサイズの下位数ビットを見れば判断できる気もするが・・・。

449 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 00:05:43 ]
>>443

callocは一応「配列を確保する関数」だからじゃない?

最適化に関しては↓がヒントになるかも。
www.bohyoh.com/CandCPP/FAQ/FAQ00096.html




450 名前:デフォルトの名無しさん [2007/12/18(火) 00:09:54 ]
>>449
最適化については何も解説していないような・・・


451 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 01:03:49 ]
>>420
ファンダメンタルかよ

452 名前:デフォルトの名無しさん [2007/12/18(火) 02:16:52 ]
signed型へ<<や>>演算したときの結果の符号ビットや符号拡張有無って
規格で決まっていますか?


453 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 02:32:06 ]
>>452 いいえ。

454 名前:デフォルトの名無しさん [2007/12/18(火) 09:57:37 ]
C++ 初心者です。C++ でこんなコードを見かけたのですが、 struct S { S( int x ) : x_( x ) {} int x() { return x_; } int x_; }; 2 行目の意味がわかりません。とくに x_( x ) {} の部分が頭の中でパーズできないんですが、これは何を定義しているの?

455 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 09:59:38 ]
: x_( x ) だな
x_をxで初期化している

コンストラクタ初期化子とかでぐぐると幸せになるかも

456 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 10:37:10 ]
この書き方で「2行目の意味が」ってのも凄いな
ナチュラルな喧嘩の売り方するなぁと感心したw

457 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 10:42:22 ]
コンストラクタの初期化子で配列の初期化ってできる?

458 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 11:07:46 ]
>>457
組み込み配列についてはできません。 std::vector ならできます。

459 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 11:26:54 ]
>>458
ありがとう
じゃあコンストラクタ内で普通に代入するか


もう一つ質問
固定長配列にvectorを使う意味ってある?
あるとしたら何?



460 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 11:34:14 ]
>>459
サイズの管理も一緒にしてくれる。
未来永劫何があってもサイズが変わらない場合を除けば、この利点は小さくない。

461 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 11:35:23 ]
>>459
多くの実装では assert() などでデバッグ用の範囲チェックが入っている。
begin(), end() があるので標準アルゴリズムが使いやすい。
要素の比較に基づく比較演算子が定義されている。
安全で軽い swap() が使える。

462 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:02:09 ]
C言語でvoid型の関数を任意の場所で終了させるにはどうすればいいのでしょうか?
何か値を返せる関数ならreturnすればいいと思うのですが
voidなのでreturnをすると怒られてしまいました

463 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:04:39 ]
return;

464 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:05:52 ]
>>462
void func(){
return;
}

465 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:09:42 ]
>>462
void func()
{
...;
goto end;
...;
end:
}
or
void func()
{
...;
if (0) {
...;
}
}

466 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:15:41 ]
>>460-461
サンクス

467 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:16:11 ]
ああ、なるほど
値さえ返さなきゃ怒られないんですね
0を返しておりました

468 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:20:25 ]
>>460
static const int foo[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
みたいな固定長配列なら、sizeof(foo) / sizeof(* foo)でsize()相当だと思うが、それでもメリットだと?

469 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:23:26 ]
STLのコンテナとして使える



470 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:26:16 ]
boost::array

471 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:50:19 ]
じゃあそれポートして使いまする

472 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:51:25 ]
固定長配列テンプレートはいいよね
余分な領域取らないし

473 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 12:59:15 ]
boost::checked_deleteってそんなに役に立つか?

474 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:03:58 ]
初心者でも何か作れる物はないだろうか?

475 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:05:18 ]
>>474
アドレス帳
ノベルゲーム
etc

476 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:07:47 ]
>>475
ノベルゲームを作れるお勧めのwindows上で動く
アプリとかありませんかね。


477 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:20:59 ]
C言語でいいじゃん
printfとscanfで作れるぞ

478 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:25:14 ]
おまえらって何が目的でC言語使ってんの?

479 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:29:21 ]
>>473
なんで役に立たないと思うの?
あと、 boost スレに行ったほうがいいかもね。



480 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:45:48 ]
>>478
プログラミングするのが楽しいから

481 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:18:50 ]
まともに仕事で使おうとすると、
boostなんてフリーのライブラリは、
使用許可がおりない件について

誰が責任もてるの、って怒られるぜよ

482 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:34:04 ]
boostからポートした自作ライブラリを使うんだよ

483 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:36:43 ]
それを言い出すと、gccや下手すればLinuxそのものも使えなくなる罠。

484 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:41:40 ]
>>483
プロジェクトの種類や客の流儀とかなんとかで、
そのとおりな制約がつく仕事も実際、けっこうある。

・・・いや、あった。もう地獄から永久に開放されて
こんな時間に2chしてる俺にはどうでもいい話

485 名前:デフォルトの名無しさん [2007/12/18(火) 15:46:46 ]
参照のつかいかたがよくわからないので教えてください。POCO::Loggerというライブラリをつかっています。
hasがLoggerのポインタを返して、getが参照を返します。createで作ります。
POCO::Logger* buff = POCO::Logger::has("hoge");
if (buff == NULL) {
  // 無いから作る
  POCO::Logger& logger = POCO::Logger::create("hoge");
  logger.information("@@@@@");
} else {
  // あるから使う
  POCO:Logger& logger = POCO::Logger:get("hoge");
  logger.information("@@@@@");
}
// @ほんとはここでlogger.information("@@@@@")にして、↑の@@@@@出力部分は消して共通化したい
というコードは動くんですが、最終行で出力する処理を入れて
共通化したいんですけど、参照ってポインタみたいにいれないでおくとかができないと思っています。
このような実装はみなさんどのようにされていますか?

486 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:51:11 ]
>>481
フリーとは言っても誰が作ってると思う?
使用許可を出さない奴本人に
『おまえが判断できる程のレベルかよ?』
って言い返す。

487 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:52:29 ]
>>479
不完全型のチェックにしか使えないよね。
全く役に立たないとは思わないけど、あえて使う意味はあるのかと。

488 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 16:13:45 ]
>>485
POCO::Logger & logger = buff == NULL ? POCO::Logger::create() : POCO::Logger::get();
logger.information();

489 名前:デフォルトの名無しさん [2007/12/18(火) 16:22:40 ]
>>488
ぉぉすばらしい。ありがとうございます。そのような発想はありませんでした。
ちょっとトリッキーな気がするのですが、C++で参照を使うときは常識ですか?



490 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 16:45:28 ]
C++と言わず参照と言わず、割と使うけど。
Cでもこんなのとか。
FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r");

491 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 17:52:49 ]
>>490 の
FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r");
って どのように分解(解釈)されるの?

492 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 17:57:10 ]
>>491
fileNameがNULLだったらstdin、そうでなければfileNameをfopen()した結果をfpに代入。

493 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:05:23 ]
>>492
有難うございます。日本語ではそうなるのですか。
すみません、この1行をC言語に1行ごと(ステップ)に分解して書いたらどうなるのですか?

494 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:11:18 ]
FILE *fp ;
if( fileName == NULL )
{
fp = stdin ;
}
else
{
fp = fopen(fileName,"r");
}

495 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:12:19 ]
まあ、参照は初期化必須だから、>>488を分割して書く事は出来ないがな。

496 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:12:26 ]
FILE * fp =
fileName == NULL
? stdin
: fopen(fileName, "r");

497 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:13:39 ]
boost::optionalをパクればいい

498 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:23:44 ]
>>494
有難うございました
そうなるのですか、なんか>>490だと読みにくいですね

>>495
となると、参照のときは読みにくい構文使うしかないということですね

499 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:56:32 ]
>>498
俺が三項演算子を使うときは、条件部を必ず(単項式であっても)括弧で括ってる。
>>490の例の場合は、
FILE * fp = (fileName == NULL) ? stdin : fopen(fileName, "r");
まぁ、この辺は各々のスタイルの問題。

読みにくさについては内容の複雑さによりけりで、たとえば
int n = (hoge) ? 10 : 20;
程度の内容をif-else文で書くと、俺の感覚だと「無駄に物々しい」感じがして、逆にわかりにくいかな。



500 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:12:34 ]
三項演算子は禁止、
って、けっこうコーディングルールにされることが多い

501 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:18:45 ]
生粋の三項演算子erな漏れには辛い職場だ

502 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:29:24 ]
>>498
こんなんでもいんじゃね?

POCO::Logger* buff = POCO::Logger::has("hoge"), *logger;
if (buff == NULL) {
  // 無いから作る
  logger = &POCO::Logger::create("hoge");
} else {
  // あるから使う
  logger = &POCO::Logger:get("hoge");
}
logger->information("@@@@@");

というかhas()が返すアドレスの実体はgetで得られるインスタンスとは別物なん?
同一ならそのまま使えるだろうけど

503 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:29:27 ]
ff

504 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:36:13 ]
例外処理のthrowのメリットは?
普通に関数にとばすのはだめなのかい

505 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:21:22 ]
普通に関数に飛ばすとは、どういうやり方?
throwは関数の呼び出し元の呼び出し元の呼び出し元の・・・にずーっと遡っていけるところに意味がある

506 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:23:41 ]
昔のCのように、abort()を呼ぶとかそういう話?

507 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:53:58 ]
>>504の考える例外的な事態というのは、その場でプログラムを終了するタイプ「のみ」なんじゃないかな。
確かに、すぐ終了するのであれば、例外処理の存在意義である「簡潔かつ強力に特定の段取りまで戻る」
能力は要らないからね。

>>504
でも、例外発生後もまだプログラムを続行させる場合、「関数に飛ばして」例外処理を実現しようとすると、
結構面倒というか、入り組んでしまうことがある。
f1()から呼んだf2()から呼んだf3()から呼んだf4()の中で何か「例外的な状態」になった場合、f4()内に
if (失敗したという証拠) {
  例外処理();
  return 失敗したという合図;
}
を書くだけでなく、場合によってはf2()やf3()も、その「合図」がちゃんとf1()のもとへ帰っていけるよう、
バケツリレーのような構造の実現に協力しなくちゃならなくなったりするわけだ。
その例外は、自分とは直接関係ないことなのにね。

508 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:01:10 ]
ただやっぱり、Joelもいってるように、例外はきちんと
ハンドリング出来ているかが、コード面を眺めたくらいでは
すぐには判らないという弱点があるね。

戻り値ベース:
fp = fopen(filename, "w");
fwrite( var, 1,len,fp );     //ププ。エラー処理忘れやがんの。

例外ベース:
fs = new FileStream( filename, WRITE );
fs.Write( var ); //ファイル無かったら例外投げるから、
                   //呼ぶ側で対処しろと言うことかな〜?

509 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:07:30 ]
>>420
インターフェースが結構違うのでわからないんです

参考に見た6.0の解説を上げてみると
〜〜〜
左フレームのFileメタブをクリックして、Source FileのGlSampleView.cppファイルを開く
右のフレームに現れるソースファイル上で、右クリック。表示メニューのClassWizardを選択する←この時点で分からない
ここでViewクラスのメッセージ処理をカスタマイズする。
メッセージ欄から「WM_CREATE」を選択して関数追加ボタンをクリックする。
するとOnCreate()関数がGlSampleView.cppファイルに自動的に追加される。
〜〜〜

クラスウィザードのようなものは別の方法で見つけたんですがすると4行目のWM_CREATEが無い
といったように前に進みません



510 名前:339 mailto:sage [2007/12/18(火) 22:32:05 ]
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic initializer for '_Ios_init''(void)" (??__E_Ios_init@std@@YAXXZ) で参照されました。
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)" (??__F_Ios_init@std@@YAXXZ) で参照されました。
1>D:\ta\c\works\online\Debug\dos.exe : fatal error LNK1120: 外部参照 2 が未解決です。


===index.cpp====
#include <iostream>

int main() {
std::cout << "Kitty on your lap";
return 0;
}
===============

/O2 /D "_MBCS" /FD /EHsc /MT /Fo"Debug\\" /Fd"Debug\vc80.pdb" /nologo /c /TP /errorReport:prompt

/OUT:"D:\ta\c\works\online\Debug\dos.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\dos.exe.intermediate.manifest"
/SUBSYSTEM:CONSOLE /ERRORREPORT:PROMPT kernel32.lib


リンクがうまくいってないってことかな?
ちゃんとライブラリフォルダをC:\Program Files\Microsoft Platform SDK\Libに設定しているのだが・・。

511 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:00:25 ]
たまに見かけるけとKitty on your lapて何なん?
調べてみたらゲームみたいだけどあれが元ネタ?

512 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:35:44 ]
>>510

iostreamってSDKじゃないだろ。


513 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:36:20 ]
猫でも分かるの人がサンプル文字列に使ってたな。
さらなる元ネタはよくわからないが。

514 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 00:07:13 ]
古いギャルゲーのタイトル

515 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:29:06 ]
問題分が
以下の手順を従い、経路選択アルゴリズムを評価せよ。

通信の発生:ランダムに送受信ノードを決定する。
通信の確定:与えられた送受信ノードの経路を決定し、その経路上のリンクの空き容量を1Mbpsだけ減少させる。
         ただし、空き容量のないリンクが存在する場合、この通信は確立しなかったものとして、何も行わない。
通信の終了:n回前に発生した通信の経路上の空き容量を1Mbpsだけ増加させる。ただし、その通信が確立していなかった場合には何も行わない。
評価:10000回の通信を発生させ、そのうちで確立できなかった通信の割合を求める。
試行の繰り返し:nの値を変えながら、上記の試行を繰り返す


プログラム自体(kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5554.txt)は拾ってこれたのですが
どこにグラフを入力していいのか分からなく困っています。
ちなみにグラフは以下に書きます
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5555.txt
左と中央がノードで右がそれをつなぐリンクの容量です。

516 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:38:58 ]
宿題スレへ

517 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 02:08:39 ]
>>508
戻り値だってコード面見てエラー処理の抜けは気づきにくい。

Joel とかが言ってるのは、エラー処理に問題のあるコードと
適切なコードとの違いが微妙すぎるって言う問題。まぁこっちの問題も
一緒といえば一緒なんだけどな。処理の順番とか。

518 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 09:00:37 ]
VC++ 2005での関数インライン化について教えてください。
通常、インライン関数は定義をヘッダに書かないとコンパイル
できませんが、/LTCGオプションでリンク時のモジュール間
インラインを指定すると以下のようなコードがビルド可能
だと思ったのですが、実際はリンクエラーとなります。
もちろんinlineキーワードを外すとビルドできます。
/LTCGを指定してもinlineキーワードを付けるとインライン
対象関数の定義は呼び出しソースファイルから可視でなくて
はいけないのでしょうか?/LTCGのリンク時モジュール間
インラインの正しい使用法を教えてください。

//aaa.hヘッダーファイル
double MySquare(double);

//aaa.cppソースファイル
inline double MySquare(double d)
{
 return d * d;
}

//bbb.cppソースファイル
#include "aaa.h"

int main()
{
 double d = MySqiare(3.14);
}

519 名前:デフォルトの名無しさん [2007/12/19(水) 09:15:43 ]
よく空間的局所性の高いコードは速いとかいいますけど、最近のx86で
あるアドレスの値を読み込むと、その先何バイト位がキャッシュに載るんですか?



520 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 09:46:40 ]
VC8(VC2005)で

template<class T>
std::list<T>::iterator MoveListItr(std::list<T> *pLst)
〜略〜

というSTLのイテレータを返すテンプレートが、イテレータの記述部分
(std::list<T>::iterator)で「型ではない」とエラーが出ます。

VC7まではこれで通ったのですが、文法に問題があるのでしょうか?
それともVCの問題なのでしょうか?

521 名前:デフォルトの名無しさん [2007/12/19(水) 09:53:01 ]
template<class T>
      typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)

522 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:00:51 ]
>>520
typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)
って書けばいいんじゃないかな。

いわゆる特殊化ってやつがあるせいで、classname<T>::hogeという記述だけでは、
hogeが値なのか型名なのか断定できない。
そういう場合、「これは型名ですよ」というのをコンパイラに教えるために、typenameを書く。

今回のVC7と8の違いは、「ここは関数の戻り値の型を書く場所だから、型名に決まってるよな」
とコンパイラが判断したか否か、の違いだと思うんだけど、
VC7の気が利いているのか、VC8が「VC7が無視した何らかの可能性」を見て断定を避けたのか、
どっちなのかは俺にはわからないや。

523 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:03:56 ]
単に規格に準拠するようにしただけじゃねえの?

524 名前:デフォルトの名無しさん [2007/12/19(水) 10:12:15 ]
>いわゆる特殊化ってやつがあるせいで
特殊化は無関係

525 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:13:50 ]
>>521-523
なるほど、そうだったんですか。
おかげで解決しました、ありがとうございます。

526 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 10:46:02 ]
ループが止まりません><

#include<stdio.h>

#define N 20

main(){
char ch[N],a,word='^';
int num,i,j;

j=0;
printf("Input your name.(When the input is finished,type ^.)\n");

for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);
}
printf("target:");
scanf(" %c",&a);

for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
printf("%c=%d\n",a,j);
}
}

527 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:04:06 ]
>>526
最初のループの終了条件がおかしい。

528 名前:りょう ◆RyOrlro88Q mailto:sage [2007/12/19(水) 11:09:43 ]
ループは自己解決><

次は判定に問題が…><

529 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:30:49 ]
jが増えない><

#include<stdio.h>

#define N 20

main(){
char ch[N],a,word='^';
int num,i,j;

j=0;
printf("Input your name.(When the input is finished,type ^.)\n");

for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);

if(ch[num]==word){
break;
}
}
printf("target:");
scanf(" %c",&a);

for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
}
printf("%c=%d\n",a,j);
}



530 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:34:56 ]
ちったあ自分で考えないと成長しないぜ

531 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:40:58 ]
考えてるけどわからないんです><

532 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:43:39 ]
>>528
他にも色色問題が。scanf()で一文字ずつ入力なんて阿呆なことしないで、
fgets()で1行分まるっと入力してしまえばいいじゃん。
あと、'^'による終了判定も無意味。

533 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:45:26 ]
つーか、>529ではループの判定条件がバグったままじゃんw

534 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:46:26 ]
何故増えないんだと思う?
具体的な場所はともかく、どの辺が間違ってそうな気がする?

本当はデバッガを使うのが良いんだろうが、printfデバッグっていう手法だってある。
それっぽい箇所にprintfを挿入するだけで見えてくるかもよ。

535 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:47:57 ]
ブロックの前後や中で満たすべき条件を式のかたちで書き出してみてはどうか

536 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:51:01 ]
紙と鉛筆使って机上でプログラムを実行してみるのもいい。
どこで意図しない動作になっているかすぐ分かる。

537 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:53:22 ]
>>518について詳しい人いませんか?

538 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:57:29 ]
解決できました><

ありがとうございましたm(__)m

>>532
それが指定なんですよ><

>>534
そんな方法なんて知りませんでした><

539 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:01:09 ]
ほほぉ。それじゃ、スレよごしの罰として完成したソースを貼ってもらおうか。



540 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:06:58 ]
>>118
ttp://ml.tietew.jp/cppll/cppll/thread_articles/11083#ar11086

541 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:07:22 ]
>>537
inline指定無しでも最適化でインライン展開してくれるんじゃないの?
明示的にinline指定したい積極的な理由でもあるなら兎も角、そうでないならコンパイラに任せたら?
つーか、iccだとinline指定をつけると却ってコンパイラが混乱するみたいだ。

542 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:11:03 ]
>>540
番号間違ってる。
しかし、そのリンク先のエピたんの弁によれば、
inline指定してある関数を別の翻訳単位から見つけてくるiccはおかしなことになるね。

543 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:22:09 ]
7.1.2.4を見てextern inlineにしたら通った

544 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:00:43 ]
// aaa.h
extern inline double MySquare(double);

// aaa.cpp
double MySquare(double d){...}

// main.cpp
#include "aaa.h"

int main() {
 double d = MySquare(3.14);
}

一応gcc3.4とvc8でいけた
external linkageなinline指定つきの関数宣言がどうたらこうたら書いてあるけど理屈はよくわかんね

545 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:28:11 ]
>>540
>>541
>>542
>>543
ストラップ本にはinline定義とあるので、おそらく
無理なんでしょうね。
extern inline定義にしたらVC 2005では実行できましたが、
g++ v4では無理でした。移植性考えたらやはり素直にヘッダーに
定義を書いたほうが無難ですね。

546 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:30:36 ]
>>544
extern inlineを宣言につけるんですか。
試して見ます。

547 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:37:55 ]
>>544
g++ v4でもリンクできましたが、
定義にinlineつけないとインライン展開されて
ないかもしれないですね。


548 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:55:07 ]
VC++ 2008でもテンプレートのexport定義はサポート
されてないんだな

549 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:58:09 ]
>>548
別に規格に違反してないからね



550 名前:デフォルトの名無しさん [2007/12/19(水) 14:35:53 ]
kernel: pid xxxx (a.out), uid yyyy: exited on signal 11 (core dumped)
というメッセージがログに残っている場合は何を調べればいいのでしょうか?

551 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:38:34 ]
VCEEにMFCついてないかー/(^o^)\

552 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:52:40 ]
>>50
coreファイルを調べるのが王道


553 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:58:45 ]
>>550
signal 11はSEGVだから、要はセグメンテーションフォルトを起こしたってこった。
まぁ、メモリアクセス周りでバグってるんだろ。

554 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:02:26 ]
>>551
TurboC++ExpressだったらMFC付いてたかもしれん。

555 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:32:15 ]
>>554
把握した、WinAPI直接とか死にそうだからVB.NETかC#いじってくる

556 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:36:26 ]
どっちもとか正規表現あるから戻ってこれなくなりそう

557 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:20:06 ]
bitsetよりvector<bool>のほうが性能が上のことが判明した

#include <iostream>
#include <vector>
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000

int n,m,cl;

cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=1;
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=1;
cl=clock()-cl;cout<<cl<<endl;
}

558 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:30:20 ]
自前の関数のほうが断トツで早かった

#include <iostream>
#include <vector>
#include "crc.h"
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000
int n,m,cl;
char *rnd =new char[N];
for(n=0;n<N;n++)rnd[n]=rand()&1;

cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
unsigned int k,l, *c=new unsigned int [1+(N>>5)];
for(n=0;n<(N>>5);n++)c[0]=0;
for(m=0;m<10;m++)for(n=0;n<N;n++){
k=n>>5; l=n&31; c[k] |= (rnd[n]<<l);}
cl=clock()-cl;cout<<cl<<endl;
}

559 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:30:52 ]
>>557
うちの環境ではbitsetの方が5倍速いんだが
bitset -> 143
vector -> 890
VC2005, C2D E6850



560 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:37:09 ]
>>559
MinGWやVCCで計ってみたけど、環境によって変わるらしいね でも自前のビット演算が最速だった
558のcrc.hはいりません

561 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:41:06 ]
>>560
gcc 3.4.4(cygming special)でもbitsetのほうが早かった
bitset -> 171
vector -> 687
自作は知らん

562 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:42:41 ]
>>558のほうでやってくれ 最適化されてループしていない可能性がある 初めのやつでは 

563 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:45:57 ]
VC2005
bitset -> 460
vector -> 1876
自前 -> 137
やはりbitsetaのが早い

564 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:49:50 ]
でも、どの環境でも自前でビット演算するのが一番みたいだね

565 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:58:54 ]
まあ問題領域によるだろう
早さだけを求めるならbitsetに限らず自分で書いた方がことが多いだろうね

566 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:59:00 ]
>>557
./a.gcc.O3
220000
400000
./a.gcc.O3.msse2
150000
390000
./a.gcc.O3.msse2.funroll-loops
150000
420000
./a.icc.xT.O3.ipo
140000
260000
./a.icc.fast
140000
250000


567 名前:566 mailto:sage [2007/12/19(水) 17:03:18 ]
おっと、書き忘れた。Xeon5160@3.00GHzね。
で、>558のほう。
--
./a.gcc.O3
440000
1010000
120000
./a.gcc.O3.msse2
410000
1010000
120000
./a.gcc.O3.msse2.funroll-loops
400000
1010000
130000
./a.icc.fast
420000
570000
130000
./a.icc.xT.O3.ipo
420000
570000
130000

568 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:17:10 ]
ポインタのアドレス計算について質問です。
#include <stdio.h>

int main(int argc, char *argv[]){
int *ptr;
int ary[] = {1, 2, 3, 4, 5, 0};
ptr = ary;

while(*ptr != 0){
printf("%d address = %u\n", *ptr, ptr);
++ptr;
}

return 0;
}

上記のプログラムを実行すると、アドレスは4番地ずつ進みます。
使っている参考書ではint型データは2番地ずつ進んでいますが、これは環境によって確保される記憶領域が違うということで宜しいでしょうか?
またfloat型の場合、使っている参考書ではint型の2倍、4バイト長ですが当方の環境だとint型と同じ4バイト長でした。
これも環境によって違うのでしょうか?

569 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:21:58 ]
ふつうはintは32bit 64bitパソコンは64鴨しれない



570 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:23:26 ]
その昔の参考書を投げ捨てろ。
16ビット環境主流の時代に書かれた本じゃないかい?

intのサイズは基本的に環境依存。16bitコンパイラは16bit、32bitコンパイラは32bit。

571 名前:568 mailto:sage [2007/12/19(水) 20:32:30 ]
>>569-570
有り難うございます。
環境によって違うのですね。
今、使っている本は
www.amazon.co.jp/dp/4756102700/
です。
難関と言われているポインタの説明がとてもわかりやすかったし、中盤まできたのでこのまま使っていきたいです。
さすがに捨てるのは勿体無いと思うので。

572 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:36:13 ]
intはサイズが環境依存だから、longを使え、

・・・って、その昔、仕様をカン違いしてるヤツが偉そうに
コーディングルールを決めることがよくあった。

573 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:37:32 ]
参考までにDOSコンパイラ(Turbo C++ 1.01)でのsizeof(int)とsizeof(long)実行結果
up.mugitya.com/img/Lv.1_up43982.png

32bitコンパイラだと両方とも4になる。

574 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:42:47 ]
>>568
www.oklab.org/language_c/lp64.html

575 名前:デフォルトの名無しさん [2007/12/19(水) 22:09:32 ]
IntelのCPU(x86)で、doubleとlong doubleはどうちがいますか?

576 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:47:06 ]
doubleは64ビット(IEEE 754倍精度)、
long doubleは80ビット(IEEE 754拡張倍精度)のことが多い。
Visual C++ 32ビット(どっちも64ビット)のように例外もある。

577 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:51:46 ]
失礼します。
どこで質問していいか判らず、何でも知ってそうなここに来ました。

ブーンスタジオをインストールしようとすると
DllRegisterServerへの呼び出しはエラーコード0x80070005により失敗しました。

と出るんですがどういう意味ですか?
当方PC歴1ヶ月で、全く解りません。
エラーコードググっても???です。
どうか、教えてください。




578 名前:デフォルトの名無しさん [2007/12/19(水) 22:58:12 ]
>>576
ありがとうございます。拡張倍精度というのがあるんですね。

579 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:07:38 ]

以下のファイルを構造体の配列に取り込みたいです。
-------------
a_yumi, 9, f
m_mana, 4, f
h_ryohko, 10, f
m_konomi, 12, f
m_kana, 4, f
。。。
-------------

struct data{
  char name[10];
  char age[10];
  char sex[10];
} g_data[NUM];

int main( void ){
 。。。
}

ファイルは開いてみないと大きさが分からないものとします。
"NUM"を可変に(ファイルのデータ数ピッタリに)取り込むことはできないでしょうか?
できればC++は使わずに、Cのみでやりたいです。お願いします。



580 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:10:37 ]
>>577
PC初心者板かソフトウェア板へいけ

581 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:14:12 ]
>>580
すみませんでした。
行ってきます

582 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:14:33 ]
>>577 半年ROMれバカ野郎

583 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:14:41 ]
>>577
この辺で聞いてみるとか?


【ニコニコ】BOON SUTAZIO Part4【ブラウザ】
pc11.2ch.net/test/read.cgi/software/1197298402/


584 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:15:13 ]
>>579
realloc()を使うとか、
リンクリストにするとか
で可能。



585 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:16:45 ]
>584
どもありがとうございます。
ググってきます。

586 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:05:26 ]
言語 C++
質問内容
 1.struct SHoge { char a; short b; int c; };と定義する。
 2.SHoge obj; と実体を作成する。
 上記の場合、objのアライメント(?)はいつも同じでしょうか?
質問の背景
 1.struct SHogeBase { char a; short b; int c; };と定義する。
 2.struct SHoge :public SHogeBase { void Save(FILE *f){fwrite(this, sizeof(SHogeBase),1,f); void Load(FILE* f){略}; }
 見たいに、メンバ変数のセーブ、ロードを行っており、タマタマ動作しているのですが、これがタマタマなのか、
 それともあらゆるC++環境で正常動作が保障されているのか、が知りたい。
足りない情報等あれば指摘お願いします。

587 名前:デフォルトの名無しさん [2007/12/20(木) 00:08:39 ]
>>586
OSが変わったりCPUが変わったらレイアウトも変わる罠。

588 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:10:37 ]
詰め物が幾ら入るかは処理系定義のお話なのです。

589 名前:586 mailto:sage [2007/12/20(木) 00:14:48 ]
>>587
OS・CPU(コンパチ品除く)が変わる場合、再コンパイルリンクコンパイルが入り、実行ファイルが新たに作成されますよね。
その実行ファイルは同じOS・CPUでは確実に正常動作するのでしょうか?
正常動作するならば、>>586 見たいなソースはありなんですかね?



590 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:14:50 ]
>>586
同じコンパイラの同じバージョンを使って同じオプションを指定してる限りは、いつも同じでいいかと思うけど
コンパイラが変わったりコンパイルオプションを変えたりすると変わることがある

591 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:17:20 ]
>>589
OSやCPUまでも変わる可能性があるなら、かなり厳しい
intのサイズも変わるしエンディアンも変わるし

592 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:38:27 ]
んやー・・・同じ実行バイナリで実行出来る環境なら概ね正しく動くだろ。

593 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 01:24:56 ]
>>586
メンバーアクセスしてればアラインメントの影響は
考えなくていいだろ。基本的にメモリレイアウトに
依存するようなコードは回避すべきじゃないのかね。

594 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 01:28:16 ]
unionとかは回避すべきなのか

595 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 01:30:24 ]
それはまた話が別でしょう。

596 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:13:15 ]
int型の変数aに50のいう数字が入っています。
これをchar型の配列b[]に5, 0と格納するのはどうすればいいですか?

597 名前:デフォルトの名無しさん [2007/12/20(木) 02:17:19 ]
b[1] = a/10;
b[0] = a%10;


598 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:18:41 ]
b[0] = '0'+a/10;
b[1] = '0'+a%10;

599 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:27:43 ]
sprintf(b,"%d",a);



600 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:37:30 ]
>>599
KY

601 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:38:51 ]
すまん、そういう場面だったのか……

602 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:39:15 ]
黙れカス

603 名前:596 mailto:sage [2007/12/20(木) 03:18:09 ]
ありがとうございました。

604 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 14:28:02 ]
すみません、printf関数のフォーマットに関する質問があります。


今、

printf("%20s%20s%20s", "hoge", "huga", "piyo");

という風に出力幅を20に指定したいんですが、
一箇所一箇所に20と書くのが不恰好のような気がしています。

もう少しスマートな書き方はありませんか?

605 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 14:36:35 ]
>>604
20を変数にして、動的に与えてやることはできる。

606 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 14:42:09 ]
>>604
静的にやるとしてもこんなもん↓

#define COLUMN_WIDTH "20"
printf("%" COLUMN_WIDTH "s%" COLUMN_WIDTH "s%" COLUMN_WIDTH "s",
"hoge", "huga", "piyo");



607 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 14:45:25 ]
#define prints(s) printf("%20s",s)

prints("hoge");
prints("huga");

608 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 14:47:21 ]
むしろこうだな

int i;
char *str[] = {"hoge", "huga", "piyo"};
for(i=0; i<sizeof(str); ++i)
printf("%20s", str[i]);

609 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 16:04:02 ]
int width = 20;
printf("%*s%*s%*s", width,"hoge", width, "huga", width,"piyo");



610 名前:デフォルトの名無しさん [2007/12/20(木) 16:10:51 ]
C++でtrim関数の使い方わかる人います?
#include <boost/algorithm/string.hpp>
をincludeすると、エラーがでて
c:\program files\microsoft visual studio\vc98\include\boost\algorithm\string\yes_no_type.hpp(22) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
c:\program files\microsoft visual studio\vc98\include\boost\algorithm\string\yes_no_type.hpp(23) : see reference to class template instantiation 'boost::algorithm::size_descriptor<I>' being compiled
c:\program files\microsoft visual studio\vc98\include\boost\range\detail\common.hpp(114) : fatal error C1506: unrecoverable block scoping error
っておっしゃるのですが?別にboost使わない方法があればいいのですが・・・。

611 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 16:21:27 ]
とりあえずVC6をなんとかしろと

612 名前:610 mailto:sage [2007/12/20(木) 16:37:22 ]
>>611
どういう事でしょうか?

613 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 16:39:32 ]
>>612
VC6は古すぎて実用に耐えないので、捨てろ
ということ。


614 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 16:49:22 ]
VC6は2004はアップデートで出ている
VC2003toolkitより新しい

615 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:04:48 ]
for ( std::vector<unsigned char>::iterator it = array.begin(); it != array.end(); it++ )
{
  *it = (*it >= threshold ) ? 1 : 0;
}

この処理をstd::for_each()を使って書くにはどうすればいいでしょうか?

616 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:08:49 ]
できれば別関数に書かず、for_each()に収めたいです。

617 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:14:04 ]
void f(unsigned char& r)
{
 r = (r >= threshold) ? : 1 : 0;
}

foreach(array.begin(), array.end(), f);

ダメかもしれんが。

618 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:15:06 ]
foreach ×
for_each ○

619 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:16:26 ]
自分の力だけで解け。

英語を自分の力だけで解けと言われれば、辞書等の使用は厳禁であるが
プログラミングでは全く正反対である、むしろ人に聞くのさえ認められる



620 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:16:57 ]
ぎゃあああああ、スレってか板違い失礼orz

621 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:31:49 ]
aが0ではない または bが0ではない または c==d
という文は
if ( (a|b) or (c==d) )
if( a|b| (c xor d) )
と書けると思いますがどっちのほうがはやいでしょうか?

622 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:38:50 ]
>>621
なんで xor になるのか理解不能だが、コンパイラが適切に最適化してく
れるので、細かい表記の差は気にしないで理解し易く書くべし。

if (a || b || c == d)


623 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:41:34 ]
計算してみたところa==b と、!(a^b)の計算速度は同じみたいです

624 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:44:33 ]
>>622
c=dならば、c xor dは0になります 
正しくはその否定でした

625 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:57:44 ]
フラグのgirlfriendがずっと0のままで1になりません。
また、sexというポインタを参照するとセグメンテーションフェイルドになります。
どうすればいいですか?

626 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 17:58:50 ]
>>625
マ板へ逝け

627 名前:デフォルトの名無しさん [2007/12/20(木) 18:05:18 ]
FILE **fp;
fp[i] = fopen(filename,"w");

みたいな使い方はでき・・・ませんよね

628 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 18:11:16 ]
FILE* fp[NUM]

629 名前:デフォルトの名無しさん [2007/12/20(木) 18:11:32 ]
www.stage6.com/user/iris4d/video/1864152/Hatsune-Miku-meets-Toro-and-Kuro-トロステ第343回




630 名前:615 mailto:sage [2007/12/20(木) 18:14:16 ]
すみません。for_each()でなくてもいいです。
>>615のfor文の処理を、標準C++のファンクタやboostを使って書くにはどうすればいいですか?
難しければ>>617さんのように書こうと思います。

631 名前:615 mailto:sage [2007/12/20(木) 18:33:26 ]
自己解決しました。以下で期待した動作が得られました。
std::transform(array.begin(), array.end(), array.begin(), std::bind2nd(std::greater_equal<unsigned char>(), threshold));
スレ汚し失礼しました。>>617さんありがとうございました。

632 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 18:49:12 ]
>>627
領域確保すればできる

633 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 19:02:50 ]
fopenはやめたほうがいい
winAPIなら1500個同時に開ける fopenはエラー起こす

634 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 23:01:05 ]
>>631
using namespace boost::lambda;
std::for_each(array.begin(),array.end(),if_then_else(_1>threshold,_1=xxx,_1=yyy));

でもいいのかしらん。xxx, yyy は何か入れ替えるとして。

635 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:09:36 ]
class B
{
protected:
 class BI {};
};
class D : public B
{
 class DI : public BI {}; // (1)
};

VC++6では、(1)のところでBIが定義されていないと言われます。
class DI : public B::BI {};
とすればBIは見つかりますが、今度はprotectedにはアクセスできないと言われます。
BIをpublicにすると、コンパイルできます。
これって合法だと思うのですが、標準規格ではどうなのでしょうか。VCがおバカなだけ?

636 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:09:40 ]
>>633
Windows環境だと判断した理由は?

637 名前:デフォルトの名無しさん [2007/12/21(金) 00:28:06 ]
`void' expected `pointer to unsigned char'
すいません、このような質問で申し訳ないのですがお答えください。
上のようなエラーが出たのですが、
これはどのように解釈すればいいのでしょうか?

voidが符号なしchar型へのポインターを予期した???

ちょっと意味がわからないです・・・・

638 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:28:15 ]
>>635
俺もいいと思うけどどうなんだろう。少なくとも g++ は warning 無しで通るね。

639 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:31:22 ]
VC++6の時点で
あらゆることが起こりうるのでバカバカしい



640 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:35:26 ]
VC++2005が最強

641 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:36:15 ]
>>637
unsigned char* を期待したのに void が渡された

関数コールで引数指定し忘れたとかそういうオチ?


642 名前:デフォルトの名無しさん [2007/12/21(金) 00:46:13 ]
>>641
UART_1_PutString(itoa(line,iData,10));

ここでエラーが出ています。引数指定し忘れというのは??
すいません、勉強不足で・・・・

643 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:57:45 ]
>>635
VC++ 2008 でも問題ない。

644 名前:635 mailto:sage [2007/12/21(金) 00:59:50 ]
>>638-639
自分もバカバカしいと思いながらも、完全には自信がなくて・・・。
でもg++でOKなら、それが正しそうですね。
どうやらVC++6は、内部クラスは外側のクラスにとっての
暗黙のfriendにはならないようです。
ありがとうございました。

645 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 08:12:04 ]
>>642

>UART_1_PutString(itoa(line,iData,10));

UART_1_PutString()の宣言はどうなってる?

>引数指定し忘れというのは??

関数の引数が足りないんじゃないか、と言うこと。


646 名前:デフォルトの名無しさん [2007/12/21(金) 11:17:26 ]
>>645
UART_1_PutString()の宣言は・・・・されていません。


関数の引数が足りないっていうのはitoa関数のって事ですか??




647 名前:デフォルトの名無しさん [2007/12/21(金) 11:27:04 ]
>>645
連投すいません。

UART_1_PutString()の宣言はvoidです。



648 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 11:29:28 ]
>>647
ちゃんと書こうよ。その書き方じゃ
void UART_1_PutString(?)
? UART_1_PutString(void)
void UART_1_PutString(void)
のどれかわからない。


649 名前:デフォルトの名無しさん [2007/12/21(金) 11:32:44 ]
すいません・・・
void UART_1_PutString()です。



650 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 11:40:49 ]
>>649
#include <PSoCAPI.h> しないで自分で宣言を書いたりしてないよね?


651 名前:デフォルトの名無しさん [2007/12/21(金) 11:47:39 ]
>>650
#include <PSoCAPI.h>はしています。

UART_1_PutString(itoa(line,iData,10)); で

`UART_1_PutString'; found `void' expected `pointer to unsigned char'
というエラーが出てくるという事は、itoa関数に問題があるのでしょうか?


652 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 12:56:12 ]
itoaの戻り値は文字列なの?


653 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 12:58:56 ]
>>651
UART_1_PutString() と itoa() の宣言をコピーして見せるべし。


654 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 13:07:31 ]
>>651
UART_1_PutStringが引数を取らない関数なのに
unsigned char * 型の引数(itoa(line,iData,10))を渡すからエラーなんだろ。
UART_1_PutStringの使い方が間違ってるから確認しろ。

655 名前:651 [2007/12/21(金) 14:06:00 ]
>>652-654
void main()
{
int iData;
char line[10];

M8C_EnableGInt;

ADCINCVR_2_Start(ADCINCVR_2_HIGHPOWER);
ADCINCVR_2_SetResolution(8);
ADCINCVR_2_GetSamples(0);

UART_1_CmdReset();
UART_1_Start(UART_1_PARITY_NONE);

for(;;)
{
while(ADCINCVR_2_fIsDataAvailable() == 0);

iData = ADCINCVR_2_iGetData();
ADCINCVR_2_ClearFlag();

char line[10];
UART_1_CmdReset();
UART_1_PutString(itoa(line,iData,10));

UART_1_PutChar('\n');
}
}

このようなプログラムです。。。

656 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:35:59 ]
>>655
>653

657 名前:651 [2007/12/21(金) 14:43:06 ]
あとはvoid main()の上に
#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.h>
が記述してあるだけで、全てなのですが・・・



658 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:50:52 ]
もしかして、C用のインクルードファイルをC++から直にインクルードしているって落ち?

659 名前:651 [2007/12/21(金) 15:01:44 ]
ちょっとわかんないです・・・・



660 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 15:14:42 ]
えい面倒だ。コマンドライン若しくはコンパイラの出力を全部晒せ。

661 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 15:35:56 ]
>>657
stdlib.h や PSoCAPI.h の中に atoi() や UART_1_PutString() の宣言
があるはずだから、それをここに示して欲しい。

それらがないと、ここで見ている人は正しい仕様がわからないのでアド
バイスしにくい。コンパイラの種類なども示してくれるとベター。


662 名前:651 [2007/12/21(金) 15:38:00 ]
>>660
改行多すぎエラーが出るため分割します。


#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.h>

void main()
{
int iData;
char line[10];

M8C_EnableGInt;

ADCINCVR_2_Start(ADCINCVR_2_HIGHPOWER);
ADCINCVR_2_SetResolution(8);
ADCINCVR_2_GetSamples(0);

UART_1_CmdReset();
UART_1_Start(UART_1_PARITY_NONE);

663 名前:651 [2007/12/21(金) 15:41:05 ]
>>660

for(;;)
{
while(ADCINCVR_2_fIsDataAvailable() == 0);

iData = ADCINCVR_2_iGetData();
ADCINCVR_2_ClearFlag();

UART_1_CmdReset();

UART_1_PutString(itoa(line,iData,10));
UART_1_PutChar('\n');
}

}



664 名前:651 [2007/12/21(金) 15:41:28 ]
出力
Starting MAKE...
creating project.mk
lib/adcincvr_2.asm
lib/adcincvr_2int.asm
lib/dac8_2.asm
lib/psocconfig.asm
lib/psocconfigtbl.asm
lib/uart_1.asm
lib/uart_1int.asm
lib/uart_1plus.asm
./boot.asm
./main.c
!E ./main.c(32): type error in argument 1 to `UART_1_PutString'; found `void' expected `pointer to unsigned char'
!E ./main.c(32): can't recover from syntax error.


adconv1_vup_usart - 2 error(s) 0 warning(s) 15:39:51


665 名前:651 [2007/12/21(金) 15:45:27 ]
>>661
stdlib.hの中身@。。これも分割します。

#ifndef __STDLIB_H
#define __STDLIB_H
#include <_const.h>

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#ifndef NULL
#define NULL 0
#endif
#include <limits.h>
#define RAND_MAX INT_MAX

#ifndef __SIZE_T
#define __SIZE_T
typedef unsigned int size_t;
#endif

#if defined(_HC12)
#pragma nonpaged_function atof exit
#endif

666 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 15:46:00 ]
情報が欠けているので確信はないけど、

たぶん itoa() が値を返さない仕様で、UART_1_PutString(char*)
に渡せない。
itoa(line, iData, 10);
UART_1_PutString(line);
にすればokかもしれない。



667 名前:651 [2007/12/21(金) 15:46:06 ]
>>661
stdlib.hの中身A。。

char *ftoa(float f, int *status);

int abs(int);
double atof(CONST char *);
int atoi(CONST char *);
long atol(CONST char *);
void itoa(char *string, unsigned int value, int base);
void ltoa(char *string, unsigned long value, int base);
int rand(void);
void srand(unsigned);
long strtol(CONST char *, char **, int);
unsigned long strtoul(CONST char *, char **, int);

#if !defined(_M8C)
void abort(void);
void *calloc(size_t, size_t);
void exit(int);
void free(void *);
void *malloc(size_t);
void _NewHeap(void *start, void *end);
void *realloc(void *, size_t);
#endif

#endif


668 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 16:01:38 ]
VC++2008を使っているのですが、ソースファイル変更を施していない上に、ソースファイルが存在しているのに、逆アセンブリ表示でしかデバッグができません。
これは何か知らないうちに変な設定をしてしまったからなんでしょうか?

どなたかご存知の方いらっしゃいましたらご教授ください。

669 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 16:02:08 ]
はい、ダミアンが正解だったようです。



670 名前:668 mailto:sage [2007/12/21(金) 16:03:13 ]
ちなみにビルドの際にも、ソースファイルはプロジェクト中に存在しています。

671 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 16:03:24 ]
>>668
VisualStudio専用スレがあるからそちらでどうぞ。

672 名前:668 mailto:sage [2007/12/21(金) 16:05:07 ]
はい。

673 名前:デフォルトの名無しさん [2007/12/21(金) 17:39:14 ]
>>666
ありがとうございました。解決できました。

674 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 18:30:39 ]
WinXP,VC++2005について質問です.
DOSコマンドのassoとftypeのように,特定の拡張子に関連付けされた
アプリケーションをできればフルパスで取得したいのですが,
VC++で可能でしょうか?

675 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 21:04:40 ]
関連付けならレジストリのHKEY_CLASSES_ROOT以下を見ればいい。

676 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 22:22:15 ]
HDD片方だけぶっ壊れたせいで復旧作業泣ける、嫌になってレジストリ削除とエントリ削除結構適当だから不安

あー、もうしにたい

677 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 22:37:01 ]
ごばくだうわあああorz

678 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 01:32:45 ]
初めて見たんだけど、’あっそ’ってどんなコマンドなん?

679 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 07:10:49 ]
>>678
assocの間違いだと思う。



680 名前:デフォルトの名無しさん [2007/12/22(土) 10:03:06 ]
>>485です
回答くださったみなさん、ありがとうございます。
三項演算子は勉強になりました。
>>502の参照からポインタとって操作するのがわかりやすかったので、
この方法でいこうと思います。
has()が返すアドレスの実態はgetで得られるインスタンスと一緒です。

681 名前:674 mailto:sage [2007/12/22(土) 10:24:21 ]
>>678,679

すみません.assocの間違えです.
c++でできるコマンドがありましたらお願いします.

682 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 10:34:14 ]
>>674 >>681
それは OS 無しで知りえない情報だから system (みたいなもの)
使うしかないんじゃないの?


683 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:02:30 ]
クラス配列の要素数の求め方を教えてください。

class_array = new Class[10]();
sizeof( class_array ) / sizeof( class_array[0]);

てやっても0になってしまいます。
sizeof( class_array ) ってすると4になるんですが、
この4が何かが分かりません。
例えば普通の10個の要素を持つ配列をsizeofすると、配列のサイズが返りますよね。
クラス配列にsizeofすると、また別の意味の値を返すのでしょうか。

684 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:04:52 ]
>>683
sizeof(class_array)/sizeof(class)じゃ無理?

685 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:13:35 ]
>>684
レスありがとうございます。
できないです…。結果は0になりました。
sizeof( class_array ) が 4
sizeof( CLASS ) が 16
になっていました。

普通の配列にsizeofすると配列のサイズが返ってくるのに、
クラス配列にsizeofした時、配列は16*10=160のサイズを持っている
はずなのに、4しか返ってこないということは、、、
どういう事なんですか??

686 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:13:56 ]
>>683
class_array はただのポインタだろ。そうじゃなきゃ new [] の結果は受け取れないはず。

687 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:16:27 ]
ああ、new

688 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:20:27 ]
>>686
なるほど、sizeof( class_array ) では、ただのポインタのサイズを返しているわけですね。
sizeof(またはそれ以外)を使用してクラス配列全体のサイズを調べるにはどのようにすればよいでしょうか。

689 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:23:34 ]
>>688
sizeof にこだわらなければ 10 に決まってんだろ。
即値を繰り返すのが嫌なら定数なり変数なりに入れとけ。
配列と別の変数でサイズを持ってるのが嫌なら std::vector にしとけ。



690 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:23:59 ]
new[]したもので、要素数を後から知る方法はない。
std::vectorでも使っておけ。

691 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:29:13 ]
恐らくだけど、newに拘る必要はないんじゃないか?

newを知らずに使っているように見受けられる

692 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:30:42 ]
vectorを調べてきました。
こんな便利なものがあったなんて、、
std::vectorを使います!
答えてくださった方々ありがとうございました!

693 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:34:17 ]
>>691
クラス配列の要素を動的に増やしたり、減らしたりしたかったのです。
mallocはコンストラクタが動かないと聞いたんで、newを使っていました。
その結果sizeofで要素数を求めようと頑張っていたのですが、
vectorでなんとかなりそうな気がします。
ありがとうございました。

694 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:37:49 ]
CやC++でGUIなユーティリティを作る場合何を使うのがベターなんでしょうか?
先日本職さんの知り合いに聞いたところMFCだと言っていました
それと同時にCやC++で作るならゲームかなぁみたいなことも言っていました

やはりCやC++でGUIというのはあんまりベターじゃないんでしょうか?
API直接だとかデザイナついたやつだとか、もしくははなからCは使わないだとか

695 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:41:20 ]
趣味でやるのか、仕事でやるのか
自分だけで使うのか、人に売るのか
これからも続けていきたいのか、今回作ったら終わりなのか

もろもろの事情による

696 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:43:00 ]
>>695
一応趣味で、これからも使っていく予定です
人に売る気はないですが、良さそうなものが出来たら公開してみたりしたいなぁくらいには考えています

697 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:45:58 ]
C++Builderかね。

698 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:46:29 ]
MFC WTL ATL ボーランドC++

699 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:50:00 ]
趣味ならCやC++だけと言わずC#にも手を伸ばしてみるのはどうだろうか



700 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:52:30 ]
売るつもりが無いならC#は楽でいいな

701 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:02:48 ]
C#は一応手を出したことがあるんですが、デザイナがあるだけでどうもそれに頼り切ってしまって
そのせいかどうも感覚を掴めない
まだWinAPIで試行錯誤していた時の方が気が楽でしたorz

とりあえず今Turbo++Explorerとやらをダウンロード中です。
最終的にはVC++を買うことになりそうだなぁ

702 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:09:11 ]
プログラミング勉強中なのですが質問させて下さい。
あるファイルから内容を読み取ってデータを抽出して別のファイルに書き出すプログラムを作りたいのですが
#include "fstream"

using namespace std;
void main(int argc, char *argv[]){
ifstream f1;
f1.open(argv[1],ios::in);
中略
f1.close();

ofstream f2;
f2.open("data.txt",ios::out);
中略
f2.close();
}
このようなプログラムを実行するとD&Dしてプログラムを実行した時ofstream f2;以降の書き込み動作が出来ていないようなのです。
何がいけないかいろいろ試してみたのですが、ファイルを読み込む部分をソースから消して書き込む場所だけにしてみても
D&Dして実行すると駄目で、D&Dしないで実行すると普通に書き込めるみたいなのですが
これはどういう理由からなんでしょうか。

703 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:35:07 ]
>>702
>D&Dして実行する

って、何をどうやって実行してるの?
その場合って、argvに対象のファイル名がちゃんと渡ってくるものなの?

704 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:39:35 ]
>>703
上記のプログラムをコンパイルしてできたexeに読み込ませたいtxtをD&Dで実行ということです。
途中にcout << argv[1]を入れてみたところD&Dしたtxtはフルパスで格納されていました。
ですが ofstream f2("data.txt",ios::out);のdata.txtへの書き込みが出来ない状態です。

追記ですがコンパイルはVC++2005です。

705 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:47:27 ]
いや、きっとdata.txtは出力されている。
PCの中を検索すればどこかにあるはずだ。

argv[1]が絶対パスだったら、f2で書き込むファイルも
argv[1]のファイルと同じフォルダになるよう絶対パスで指定するという風にすればいい。

706 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:10:01 ]
printfで\の半角は表示できませんか?

707 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:10:51 ]
>>705
argv[1]で絶対パス渡すと後のファイルオープンのパスに影響与えてしまうってことですかね?
確かに絶対パスを渡したら指定のフォルダにきちんと出力されました。
ありがとうございます。

708 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:19:16 ]
>>706
printf("\\");で出力されるのが、半角円記号だというのなら、
それはそういう風にフォントが出来ているから。

日本では、歴史的経緯で半角バックスラッシュが用いられるべきところに半角円記号が使われる。
今更、円記号とバックスラッシュに分離しようとしてもおそらく極めて困難。

709 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:39:52 ]
>>706
フォントに依存するんじゃないかと



710 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 17:03:42 ]
turboC++Explorer落としに行ったけどあれでよかったのだろうか

711 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 18:31:41 ]
>>707
もう解決したようだけど、
D&Dでは作業フォルダに注意ね

712 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:18:03 ]
std::vector<unsigned char> buffer( 100, 0 )

buffer[100][0]という意味ですか?

713 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:19:14 ]
100個確保して0が入っているという意味
buffer[100]=0

714 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:25:09 ]
std::vectorでは二次配列は確保できないのですか?

715 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:25:43 ]
あ、、こうやればいいいのか
std::vector<unsigned char> buffer[a][b];

716 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:28:45 ]
>>715
vectorをa×b個作るの?

vector<vector<unsigned char> >では?

717 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:29:55 ]
>>714
std::vector<std::vector<unsigned char> > vec(100, std::vector<unsigned char>(10));

718 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:31:39 ]
thx!


719 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:36:02 ]
>>713
1行目と2行目が違うのだが・・・



720 名前:デフォルトの名無しさん [2007/12/22(土) 21:11:53 ]
Cのdouble型で表せる最大の数と最小の数はなんですか?

721 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:12:57 ]
環境による
64ビットが普通だけど

722 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:14:05 ]
>>721
計算した値がdouble型の精度を超えてたらエラーとするにはどうしたらいいですか?

723 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:16:00 ]
代入前に比較

724 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:16:30 ]
具体的にどうやるんですか?

725 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:16:48 ]
代入前に比較

726 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:20:26 ]
演算できる上限はどうなってるんだろうな、代入時に分割して代入するとか意味はあるんだろうか

727 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:22:16 ]
BCBだとlong doubleは10バイトなのに、なんでVC++だとdoubleと変わらない8バイトなんですか

728 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:24:18 ]
>>727
俺の自作コンパイラでは9バイトだぜ

729 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:26:01 ]
unsigned long long int=unsigned long long int*unsigned long long int
これで溢れる時
unsigned long long int=(unsigned long long int*unsigned long long int)/2
実際の何割とか決めてって話か



730 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:32:25 ]
double型の演算が大きすぎてコンパイラが停止するのを制御できますか?

731 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:44:53 ]
>>727
MSのも16bit用のコンパイラは10バイトだった。最終はVC++1.5だったか。
10 byte realがIntel x87の内部形式で他と互換が無いこと、
Intel自身も将来的に実数のSMIDを予定してたので10 byte realを
データ型として扱うのは非推奨だったことから廃止した。

732 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:47:21 ]
これはどこが駄目ですか? 実行中にエラーになります

for(n=0;n<1000;n++){
try {x=x*x;}
catch (...) {break;}
}

733 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:47:50 ]
int n; double x=3;が入ります

734 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:53:59 ]
>>732
まずエラーメッセージ嫁。意味が分からなければコピペして見せろ。
ソース貼るならコンパイルできるようにしてくれ。
n や x の宣言が無いのでなんともいえない。

735 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:55:52 ]
xが凄まじい勢いで増えるから

736 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:55:54 ]
>>732
double でも確実にオーバーフローするだろ。何がしたいんだ?

737 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:01:26 ]
オーバーフローを起こしたらbreakするにはどうしたらいいんですか

738 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:09:38 ]
>>737
演算前に比較。

739 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:10:34 ]
それはどうやるんですか



740 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:12:48 ]
演算する前に、演算後にオーバフローするかを比較する。

741 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:13:19 ]
それはどうやるんですか

742 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:16:45 ]
オーバーフローしないように式変形する。

743 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:17:22 ]
オーバーフローの例外は察知できませんか

744 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:19:36 ]
例外なんて起こらない。

745 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:37:39 ]
POD型(intとかcharとか)の演算で例外は投げられない。

このようなプリミティブな型の演算が例外を投げるようにすると
実行速度及びCとの互換性に影響がある、と、びよよーん先生はお考えになった。
いや、知らんけど。


746 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:49:51 ]
では最大値をしるにはどうしたらいいんですか?
#define とかは使わない方法ありますか

747 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:50:52 ]
float.h に定義されている

748 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:52:36 ]
#define で定義されている値を使わずに求める方法はありますか

749 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:52:58 ]
C++ なら std::numeric_limits<double> でどうぞ。



750 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:53:54 ]
std::numeric_limit<double>::max()

751 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:54:26 ]
ごめん。numeric_limits が正しい。

752 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:05:55 ]
たとえばunsigned int型なら足す続けると0に戻って最大値が判明するけど
そういうのはできないですか

753 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:07:25 ]
>>752
>足す続けると
日本語を母国語としない方ですか?

それはさておき、double値はそういうわけにはいきません。

754 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:08:00 ]
>>752
符号無し整数型以外は、演算で値が範囲外になると未定義動作。

755 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:08:57 ]
なんでそんな事をやりたいのかが分からんが、
double でそういう事をやる場合は、かなり難しい。
小数のフォーマット(環境依存)に依存するし、
非正規化数というのがまた状況をややこしく・・・。

756 名前:754 mailto:sage [2007/12/22(土) 23:09:01 ]
ん?符号付き整数は未定義動作だけど、不動小数点数型は実装依存で
可能かもしれないな。

757 名前:754 mailto:sage [2007/12/22(土) 23:09:48 ]
ごめん。 s/不動/浮動/

758 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:09:49 ]
でも限度を超えたら増え続けないから
n < n+1が成り立たなくなるよね

759 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:11:11 ]
>>756
環境依存でいいのなら方法はそりゃあるけども。



760 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:12:23 ]
>>758 だから何?

761 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:13:16 ]
何に対して「でも」なんだろう?

762 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:22:03 ]
ここは一問一答スレですか?

763 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:35:54 ]
>>727
BCBの場合はDelphiのExtended型との互換性のほうが大きいかも

764 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:55:55 ]
void MsgBox( int a )
{

char s[20];
sprintf(s, "%d", a);
MessageBox(NULL, s , NULL , MB_OK );

};

直接数字を表示したいのだが、一回文字列に変換しないといけないのかな?

765 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:03:39 ]
直接数字を表示できるMessageBoxを作ったらいいじゃないか

766 名前:デフォルトの名無しさん [2007/12/23(日) 01:12:22 ]
標準ライブラリとかで見かける名前空間の名前がついてない
「::operator new」 とか「::operator delete」ってなぜ
「std::operator new」とか「std::operator delete」じゃないんですか?

767 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:20:26 ]
クラスのデータメンバに配列があって、この配列にコンストラクタ時に初期値入れたいのですがどうすればいいんですかね・・・?
class DATA
{
private:
int t;
public:
DATA(int x=5)
{
t=x;
}
};
であればコンパイルは通るのですが、
class DATA
{
private:
int t[2];
public:
DATA(int x[]=5)←???
{
for(int i=0;i<2;i++)t[i]=x[i];
}
};
だとできないんです・・・

768 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:29:27 ]
DATA()
{
t[0]=t[1]=5;
}

でいいだろ なぜ()内にいれるのか不明

769 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:35:00 ]
まず、配列のそものは引数にとれない
ポインタで渡す。
参照は。。どうだっけ?



770 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:41:33 ]
>>764
WindowsのMessageBoxのことだと思うけど、文字列に直さないとダメ。

MessageBox(NULL, (boost::lexical_cast<std::string>(a)).c_str(),NULL , MB_OK);
とか

>>766
::newはstd::のnewじゃないから。
実体はどうだか知らんけど。

771 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:55:39 ]
>>767
配列はポインタ渡しがいいと思う。
やりたいことは、コンストラクタのオーバーロードで出来ると思う。

DATA(int* x) {
for (int i = 0; i < 2; i++) {
t[i] = x[i]; // xの要素数が2以上ないと未定義
}
}
DATA( ) {
for (int i = 0; i < 2; i++) {
t[i] = 5;
}
}

要素数をマジックナンバにするのはよくないので、
適当にコンスタント宣言しときましょう。
const int T_ARRAY_MAX = 2; とか、センスないな。

772 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 02:07:22 ]
>>768
>>769
>>771
お蔭様で問題解決できました!
どうもありがとうございました。。

773 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 02:17:27 ]
>>766
Koenig自動照合ができないからジャマイカ?
operator new(size_t)では引数の型からstdを見に行くと
いう判断ができない気がする。

774 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 03:33:13 ]
あるブログで見かけた記事。
C++では共用体の代わりにreinterpret_castを用いるらしい。

1: int main( void )
2: {
3: int x = 0x01234567;
4: char *c = new char[4];
5:
6: c = reinterpret_cast<char*>( &x );
7:
8: return 0;
9: }

だからC++は安全で便利なんだね!!


775 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 04:20:54 ]
・・・どこからつっこめばいいんだ

776 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 04:24:47 ]
アナル

777 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 08:57:29 ]
anonymous 共用体が導入されたりと、
C++ では共用体はより強化されてるんだがな。

#include <iostream>

int main()
{
union {
int x;
char c[sizeof(int)];
};

x = 0x01234567;
for(int i = 0; i < sizeof(int); ++i) {
std::cout << static_cast<int>(c[i]) << std::endl;
}
}

778 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 09:42:24 ]
>>766
名前探索の都合上。
クラス型をnewするとき、クラス自身、基底クラス、大域名前空間という
自然な順にoperator newを探せるようになっている

779 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:37:22 ]
名前検索の順序だけど、Koenig照合は考えないとして、
Effective C++第三版の166ページのとおりだと以下になるけど
クラス自身と基底クラスが異なる名前空間にある場合は
4.は間違いですよね?

1.ローカルスコープ
2.クラス自身
3.基底クラス
4.基底クラスを含む名前空間(間違いと思う)
5.大域名前空間

VC++ 2008で試したところ、

1.クラス自身
2.基底クラス
3.クラス自身を含む名前空間
4.クラス自身を含む名前空間を含む名前空間

(外側の名前空間へ向かって繰り返し)

5.大域名前空間

でした。



780 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:38:14 ]
ローカルスコープが抜けていました。訂正します。

VC++ 2008で試したところ、

1.ローカルスコープ
2.クラス自身
3.基底クラス
4.クラス自身を含む名前空間
5.クラス自身を含む名前空間を含む名前空間

(外側の名前空間へ向かって繰り返し)

6.大域名前空間

でした。


781 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:45:06 ]
すいません。
非常に悩んだのですが、多分ここが一番知っている方がいらっしゃると思って質問させて頂きます。
cc `Wand-config --cflags --cppflags` wand.c `Wand-config --ldflags --libs`
というコンパイルオプションをmakefileにしたいんですが、
どうやればこれ、makeの文法に直せるんでしょうか?
Wand-configというのはアプリケーションの名前で、/opt/local/binにインストールしてあります。

782 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:03:27 ]
>>781
Wand-config … の出力を CFLAGS に入れときゃいいんじゃないの?
ImageMagick か。

783 名前:デフォルトの名無しさん [2007/12/23(日) 14:44:43 ]
質問です。

C++からCの関数を呼び出すためにヘッダをincludeしたのですが
ヘッダにC++の予約語(new)が構造体のメンバ変数として定義されていて
コンパイルが通りません。

ヘッダファイルを変更せずに対応する方法はありますか?

環境はRedHatでGCC(G++)でコンパイルしようとしています。
最悪、個別にextern "C"で再定義すればよいのかなと思いますが
それはやりたくないので。。。

784 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:46:27 ]
>>783
> 最悪、個別にextern "C"で再定義すればよいのかなと思いますが

それは多分通らないと思う。extern "C" はそういうのじゃないから。

多分ヘッダファイルを変更するしかないと思うんだよなぁ

785 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:56:07 ]
>>783
#define new new_hoge
#include "header.h"
#undef new

とか駄目かね

786 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 14:58:58 ]
>>782
なるほど!
助かりました。
しかしなんでこんなややっこしい方法をImageMagickはとってるんだ。
おまけに全然日本語の情報ないし。
そこそこ歴史あるアプリなのに。

787 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:07:52 ]
>>784
そうなんですか。
こまりましたね

>>785
newだけだったらよいのですが、なんかあるたびにそれをやるのは
ちょっと辛いです

普通に問題になりそうだしなんか回避策ないんですかね
ググってもそれっぽいのは出てこないし

788 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:10:03 ]
C++固有のキーワードで、変数名に使いそうなものってそれほどなさそうだけどなあ

789 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:15:24 ]
>>786
むしろ合理的とも言えると思うけど。つまり、option は変わる可能性
がある(時代、OS, architecture 等によって)わけだから、自身に
compile/load option を聞いてやるというだけ。特に大量に画像処理する
可能性を考えると細かいオプションも重要になってくることもありうるし。

俺は Magick++ 使ってるけど、多機能過ぎる程多機能で大変便利。
あと、使い易い。



790 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:18:04 ]
>>787
素直にヘッダ書き換えるのが一番じゃないのかな。特によく使うなら。
単にコピーして直したバージョン作ればいいだけでしょ。

791 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:23:56 ]
または>>785の内容のヘッダファイルを作成して、
それをincludeすればいい。

792 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:25:05 ]
>>790
いや、触れないヘッダなんですよね
ほかのパッケージだから
なんでC++からCを呼び出したいってのもあるんだけど

なんで知ってる人いたら教えてくださいな

793 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 15:28:47 ]
>>792
そのヘッダで宣言されている関数を呼ぶ、Cのソースを一つはさめばいいだろ。

794 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 16:42:52 ]
型と順番があってれば問題ないはずだから
ライブラリ利用側だけヘッダを書き換えて使うとか。

795 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:08:08 ]
CP932なマルチバイト文字列をCP932なワイド文字列に変換する簡単な方法ってないですか?
Windows上でgcc 3.4.5(Mingw)を使ってます。

796 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:48:04 ]
ああ、筋トレ気持ちいい

797 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:48:36 ]
ごめん

798 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:49:35 ]
>>796
スジトレ?どこのスジだよ。裏スジか?

799 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 21:00:47 ]
柔道部出身がマになっちゃう時代なんだよ・・・



800 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 22:09:56 ]
うちにも短髪でえらくがたい良いのいるな

801 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 23:18:13 ]
うちには男子校上がりのいい男がいる
のんけでも平気で食っちゃうらしくておそれられてる

802 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 23:23:47 ]
なんだ?クリスマスに備えて職場のイイ男自慢大会か?悪くないな

803 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 01:13:34 ]
>CP932なワイド文字列
って何?

804 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 01:19:10 ]
>>803
間違えました。正しくは「ワイルドな文字」です。申し訳ありません。

805 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 02:52:11 ]
liboctaveを使って行列演算しようと思っているのですが、構造体内で行列の宣言をすることはできるのですか?

806 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 05:44:10 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5574.zip

以上のzipファイル内Cプログラムを組んでいるのですが、どうにもうまくいかず立ち往生してしまいました。
同梱のテキストファイルに大よその概要を入れておいたので、何とか力になってもらえないでしょうか。


807 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:15:06 ]
>>806

*p = next(p);
だと、pが指し示す先の中身を書き換えるからおかしくなってんじゃないか?
next() は構造体へのポインタを返すようにしたほうが良くないか。


808 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 09:52:36 ]
ワイルドな文字って何だよw

文字コードを変換したいならとりあえず iconv 使えばいい。

809 名前:806 mailto:sage [2007/12/24(月) 10:11:12 ]
正直なところ言わんとしていることは理解できましたが、
結局どこをどう手直しすればいいのかわかりませんでした。
申し訳ないですがプログラム自体の手直しをしていただけると幸いです(;´д⊂)




810 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 10:35:19 ]
VC2008EEのなんですけど。
ヘッダの一部分を特定の.CPPからインクルードされたときだけ
有効にするにはどうすればいいんでしょうか?

811 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 10:38:55 ]
>>810
#if
とか
#ifdef

812 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 10:42:12 ]
>>808
WindowsのAPIだとワイド文字=UNICODEな扱いで、
それ以外のワイド文字に出来ないので…
iconvも素でワイド文字を扱おうとすると難しいようなカンジです。
結局自前で書いても20行くらいに収まったのでそれでなんとかしました。

813 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 11:59:01 ]
VC2005でSSE使ってLONGLONGを足したり引いたりするにはどうしますか?

814 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 14:36:00 ]
__FUNCTION__ マクロって標準なんでしょうか?
それとも Visual C++ でしか使えないのでしょうか?
デバッグ用のコードの中で多用しているのですが,
いいのかなぁ,と思って.

815 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 14:46:36 ]
BOOST_CURRENT_FUNCTIONの定義見てみるといいよ。

816 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:19:37 ]
クリスマスに彼女が居ないんですがどうすればいいですか?

817 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:26:49 ]
クリスマスに彼女が居ないんですがで2ちゃれ
腐るほど同じような書き込みがあるから

818 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:51:08 ]
さっきからC/C++と3Pしようとしてるんですが、
C++が「Cとはもうそりが合わなくなった」とか言って3Pに応じてくれません。
どうしたらいいですか?

819 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:52:53 ]
吉利支丹の祝いらしいが幕府がおそろしゅうてかなわんわ



820 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:58:27 ]
>>818
extern "C" かな?

821 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:02:32 ]
>>818
そりゃ論理的に無理だな。

822 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:09:10 ]
99年から仲が悪くなったんだろうな

823 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:44:03 ]
>>818
delete from C where standard = 1999;

824 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:47:59 ]
こうじゃないのか。
delete standard from C where year = 1999

825 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:49:20 ]
delete standard C where = 1999;

826 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:51:30 ]
C/C++で書けよw

827 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:52:16 ]
std::string と strsafe.h は 共存できないですか?

828 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:28:43 ]
IBSQL *sql = new TIBSQL();
sql->SQL->Add("DELETE standard FROM C WHERE year = 1999");
sql->Close();
sql->Prepare();
sql->ExecQuery();
delete sql;

829 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:05:26 ]
>>809

↓こういうこと。全部はやんないよ。

struct LIST *next(struct LIST *next_p)
{
  struct LIST *p = next_p;
  …
p = next_p->next;
  …
  return p;
}

ポイントは以下の二つ。
 ・引数の next_p に代入するのは止める。見通しが悪くなる。
 ・戻り値はポインタに。




830 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:44:12 ]
>>827
できないと思う理由は?

831 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:17:03 ]
<string>の中が警告だらけになる気がするね。
そこでは安全に文字列関数を使っていると仮定して良いのだけど。

strsafe.hの関数は使うけど、既存関数の使用で警告を出さないようにする方法があると思う。

832 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:28:12 ]
そういや未だstrcpyで警告出る理由わからないや

833 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:43:01 ]
>>832
char tmp[10];
strcpy( tmp, "abcdefghij" );
文字列リテラルなら分かりやすいけど、
これが argv[1] だったりすると?

834 名前:806 mailto:sage [2007/12/25(火) 01:27:12 ]
>>829
丁寧にありがとうございます。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5579.c

こんな感じになりました。が、やっぱりループから抜け出せなくなりました。
一応一周できてるので辿る値、順序は間違っていないと思うのですが、何が悪いのかやはりわかりません…

835 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 09:26:13 ]
>>834

 *p = *next(p);

↑これは

 p = next(p);

じゃないのか?
でないと p が示している先の値を書き換える。


836 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 10:36:02 ]
テスト

837 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 13:16:42 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5581.c
惑星の公転を例にN体問題のシミュレーションをするプログラムを↑のようにして作って
実行したのですが、
datファイルをみると振り子の運動のような形になっていて円(楕円)軌道を周回していないです。

どの辺を修正すればよいのでしょうか?

838 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 13:57:04 ]
デバッグは自分でやれ

839 名前:836 [2007/12/25(火) 15:31:48 ]
>>838
まあ、やってもわからないから聞いてるんですけどね。
やってわかるなら最初から聞きにきませんよ。

どっかの計算結果がおかしいのは明白でしょうけど・・・



840 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:34:14 ]
class Hoge{
public:
 Hoge();
private:
 int m;
};

みたいなクラスがあったとして。

Hoge::Hoge()
: m(0)
{}



Hoge::Hoge(){
 m = 0;
}

ではどこが違うの?

841 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:39:25 ]
逆切れktkr

プログラムとは関係ない周辺専門知識を要するんだから、
最低限、座標算出式の数式とかを書いてくれないと、正直ソース読む気にもならんな。

842 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:42:53 ]
>839
実はさっきからいろいろ見てはいるんだけど、いまいちわかんない。
とりあえずdistの挙動が怪しげなので、見てみるといいかも。
あと、new_xはいいけど、new_vって必要?

843 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:48:20 ]
const int m;

に換えてみれば分かる。

844 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:54:26 ]
RGBからYUV2に変換したいんですがどこか参考になるサイトありませんか?

845 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 16:02:06 ]
逆数

846 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 16:03:52 ]
1秒間に60回ピッタリと処理を繰り返すにはどうすればいいですか?

847 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 16:07:11 ]
60回やる→次の秒まで待つ

848 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 16:18:37 ]
>>840
上はmを0で初期化してる。
下はmに0を代入してる。

849 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:00:04 ]
C言語とC++の違いって何かあるんですか。



850 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:06:29 ]
Cに機能が加わったのがC++

851 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:18:24 ]
C言語とC++だと、細かいところで微妙に文法に互換がなくて、
それが混乱のもとになったりするよな。

C言語のプログラムといいつつ、だいたいC++コンパイラ
でコンパイルして使うから、C言語とC++の文法が
ゴチャゴチャになったプログラムが現実にいっぱい存在する。

C++にベターCの要素なんて入れないほうが、スッキリした気がする。

852 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:27:50 ]
C++にベターCの要素を入れたとか根本から間違ってるぞ

853 名前:842 mailto:sage [2007/12/25(火) 17:51:46 ]
>839
すまん、ずっと悩んでたの、単にgnuplotの使い方でこっちが大ポカやらかしてただけだった。
plot "Point2.dat" usi 4,6
              ~
orz...

答えは>842であってる。new_vがいらない。
前のvじゃなく、できたてほやほやのaから計算したvを使って位置を出してください。

854 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 17:57:22 ]
逆ギレするだけのことはありますね

855 名前:842 mailto:sage [2007/12/25(火) 18:00:03 ]
ちょっとまて、俺は逆ギレした奴じゃない。

856 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 18:32:20 ]
>>855
なんで逆ギレしてないんだよ、キレろよ

857 名前:806 mailto:sage [2007/12/25(火) 18:39:14 ]
うおおおおお動いた(⊃д⊂)
ありがとうございます…もっかい集中的にポインタ勉強せにゃぁ…

858 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:00:09 ]
>>858
死ね

859 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:00:33 ]
Ctrl+C



860 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:48:33 ]
>>851
あまり汚いプロクラムは嫌われるんですかね。
とりあえず簡単な文法とか紹介してくれませんか?

861 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:56:02 ]
そんくらい調べろよ・・・

862 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 20:06:53 ]
糞すぎワロタ
遠慮せずに死ね

863 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 20:15:45 ]
自殺するくらいなら会社やめろよ。
マジで

864 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 20:38:20 ]
あと人いるとこで飛び降りもな・・

865 名前:デフォルトの名無しさん [2007/12/26(水) 01:38:36 ]
演算子delete [] で質問です。
下のように書いて実行するとdeleteのところで落ちるのですが、
これはdelete []が配列の各要素に演算子delete を実行した後に
スタック領域にあるオブジェクトをdeleteしようとするから落ちるということで正しいでしょうか?
またdeleteはヒープ領域にあるオブジェクトにしか実行できないのでしょうか?

int main()
{
int *x[10] ;
for( int i = 0 ; i < 10 ; ++i )
{
x[i] = new int(i) ;
}
delete [] x ;
}

866 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 01:54:13 ]
>これはdelete []が配列の各要素に演算子delete を実行した後に
実行しません。

newしたものをdeleteしてください。

867 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 07:54:04 ]
new を10回呼び出したなら delete を10回呼ぼう。
new [] を1回呼び出したなら delete [] を1回呼ぼう。

868 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 09:19:21 ]
基底クラスをインターフェイスとしてサブクラスに機能を実装しているクラスがあります

今回、新しくサブクラスを用意することになりました。
しかし、今まであるメソッドに3つパラメーターを渡してあげてたのですが
新しいサブクラスのみ5つパラメーターを渡さないといけないようになってしまいました
他の部分に出来るだけ変更を少なく、今回の仕様を適応する良い方法あるのでしょうか?

恐らく元の設計も良くなかったのでしょうが
設計の段階でパラメーター数の変化に影響されにくい作り込みというのは可能なのでしょうか?

869 名前:865 mailto:sage [2007/12/26(水) 09:38:56 ]
>866,867
ありがとうございます。deleteについてもう一度勉強しなおします。



870 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 09:53:33 ]
>>868
そのクラスの目的も分からないし、
サブクラスを使ってる側を見ないと何ともいえないが。

>他の部分に出来るだけ変更を少なく、今回の仕様を適応する良い方法あるのでしょうか?
新しいサブクラスで該当のメソッドだけオーバーロード。

>設計の段階でパラメーター数の変化に影響されにくい作り込みというのは可能なのでしょうか?
引数にオブジェクト(クラス)を取るようなモジュール構成を考える、とか。

871 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 09:57:22 ]
Win32APIなんかはパラメータは構造体で取って最初のメンバに構造体サイズ入れさせてそれでバージョン分けとかしてるな

872 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 10:38:19 ]
>>870
研究用に使う測定器を管理するプログラムなんですが
今回の測定器だけ微妙に仕様がことなってまして扱えるパラメータが増えてますorz

>新しいサブクラスで該当のメソッドだけオーバーロード。
基底クラスのポインタでサブクラスを示した場合、オーバーロードした関数は見えないのでは?

やはり構造体で受けた方が良いのかなぁ

873 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 11:31:19 ]
動けばいいだけなら、unionなstruct作る
間違えてパラメータが来る可能性があるなら、
そのstructに区別がつくようなパラメータを追加する。

オブジェクト指向的には、基底パラメータクラス作って
その派生オブジェクトを渡すのがいいんだろうけど
そこまでするほどのものかは開発規模や環境による。


874 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 12:14:13 ]
>>873
基底クラスの仮想関数の引数では基底パラメータクラスのポインタを受けて
サブクラスで内部的に引数を派生パラメータクラスのポインタに移し直して処理する
というのはありでしょうか?

大分日本語でOKにな文章ですが察してやってくださいorz

875 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 12:56:25 ]
>>874
必然的にそうなる。
キャストはちゃんとdynamic_castでcast失敗したときのコードもちゃんと書いておく。

あとパラメータオブジェクトの生存期間をよくよく考えて実装すればOK
テストプログラムではスタックから確保したオブジェクトをポインタ渡しにしたが
実際のプログラムではポインタのオブジェクトが開放されてしまい、
不正なメモリ参照で落ちることは容易に推測できる。

newして渡してやって、開放は受け取ったほうが、終了したら行うようにすればいいと思う。


876 名前:デフォルトの名無しさん [2007/12/26(水) 16:43:51 ]
ウィンドウをクラスにする意味ってあるの?

877 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:10:53 ]
>>876
あるよ

878 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:15:59 ]
VS2005 VC
文字列char*型から、double型への変換は
atof( char* 何某);でいいけど
float型への変換はどうしたらいい?

879 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:16:15 ]
>>877
あるの?



880 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:16:38 ]
>>879
おまえは有無を聞いた

881 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:18:59 ]
>>879
やっぱり無いかも

882 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:20:27 ]
>>878
atofの結果をfloatでキャスト

883 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:27:06 ]
>>882サンクス
882ですが、今手元に、コンパイラ無いけど
char* str;
double n;
n = atof( str );
static_cast<fioat>( n );
これでOK?


884 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:28:03 ]
↑スマン
878デツ

885 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:32:39 ]
あらゆるウィンドウは多重継承されていくんだ・・・!

886 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:38:07 ]
>>883
float n = atof(str);
これで十分

887 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:57:49 ]
>>886
サンクス
>>878=883ですが
その変換して、警告が出たんで聞いたんですが・・・
警告無視していいの?

888 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:12:57 ]
>>887
安全なキャストではないからね

889 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:13:59 ]
趣味グラマだけど警告は大目に見てるけど本職さんはそうはいかないんだろうな



890 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:14:31 ]
×趣味グラマだけど
○趣味グラマだから

891 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:24:49 ]
>>878=883ですが
趣味とか本職さんの問題ではないと思うんだけど
char型1バイト=8ビット
float型は4バイト=32ビット
double 型は 8バイト=64ビット
結論は、C99では、
char型文字列からfloat型
この変換をサポートする、関数は準備されてないってことですね。

892 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:27:36 ]
static_castなら警告はでないけど

893 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:36:19 ]
>>889
うーむ、そんなもんなのかなぁ。
俺はいつも警告レベルを最大にして、それを全部潰さないと気が済まないんだけど、
これは「俺が趣味グラマだから」こだわれることなのかな、と思ってた。

894 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:40:08 ]
趣味グラマだから、本職より入念に危うい場所を潰してもいいしその逆でもいいんだろ?

895 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:40:17 ]
msvcのWallは最凶

896 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:41:12 ]
>>893

Warningは、実はバグのことがあるので、基本は全部潰したほうが良い。
あまり時間がなくて、どうでもいいwarning(「使ってない変数があるよ」とか)の
場合はスルーすることもある。

あと、昔作られたコードでは、「動いているから直さない」と言うことが結構ある。


897 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:41:51 ]
アドベンチャーゲームの作り方を教えてくれる人いませんか?

898 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:43:37 ]
ゲーム製作技術板にGO
ttp://pc11.2ch.net/gamedev/

899 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:45:48 ]
プロンプトで牧場物語やってた時期がありました、あれは習作向けだな



900 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:47:36 ]
double→floatで警告出るのは桁が切りつめられて精度が下がるから。
浮動小数点型なら精度下がるだけだから、再度倍精度にキャストとかしない限りは問題なす。

int→shortだと危険だけど。

901 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:48:10 ]
アドベンチャーゲームならバッチファイルで作った記憶が‥‥

902 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:40:34 ]
スパゲッティコード生成してくれるスクリプトあったよな、なんていったっけ

903 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:49:42 ]
俺俺

904 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:52:55 ]
俺俺がポインタのポインタみたく見える

905 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:53:54 ]
そりゃ病気だ

906 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:58:56 ]
浮動小数点型は「上から」数桁を保存する。
整数型「下から」数桁を保存する。
だな。

907 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:05:00 ]
俺がポインタだ

908 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:06:01 ]
俺がポインタだとすると実体は何処にあるんだ

909 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:07:04 ]
俺が実体だ



910 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:09:04 ]
俺って実体がないんじゃね・・・?あれ?うわああああああああ


っていうホラーだったんだよ!

911 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:12:10 ]
感感俺俺

912 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:13:31 ]
>>907-911
そこらの講座よりポインタについて理解できました
ありがとうございます

913 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:14:16 ]
>>908
ポインタだって実体だ、つまりポインタという役割を持って生まれたお前という存在が
確かにここに居るということだ、自信を持て。

とか、仄かに学習効果のあるネタ書くべきかな、初心者スレ的には。

914 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:17:53 ]
CASLをちょっと習ってポインタを理解した俺はおかしかったのか

今回の例で書くと連想配列になりそうで困る

915 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:18:09 ]
>>913
ポインタみたいな奴って結構多いよな

916 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:20:03 ]
安価とかのがわかりやすかろう

917 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:20:12 ]
嫌な役割だなw

918 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:20:47 ]
実体俺へのポインタの実体って親の子供みたいな

919 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:22:26 ]
>>916
よくアンカだけ書き込む奴がいるけど、あれが俺ポインタか



920 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:22:37 ]
実体俺へのポインタの実体は子供で実体が子供のポインタ変数名が親か

921 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:22:54 ]
>>914
MASM やってポインタを理解した俺もいる。

922 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:23:30 ]
俺はC#やってポインタを理解した

923 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:23:37 ]
ポインタ変数俺の実体が>>922だとすると*俺==&俺に

924 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:24:14 ]
>>923>>922>>923にしてくださいorz

925 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:24:44 ]
ちげーよ*いらねえようわあああ

926 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:25:18 ]
*の使い方が複数あるのが混乱の元かもな

927 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:25:44 ]
>>923-924
それはきっとthisポインタだ

928 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:26:54 ]
そこの説明したかったわけじゃなかろう

929 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:30:33 ]
俺ポインタってthisポインタのことだったのか



930 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:31:12 ]
thisポインタだとすると俺俺はどうなる

931 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:32:04 ]
誰彼10円

932 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:36:48 ]
WindowsAPI関係の質問はダメですか?

933 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:38:00 ]
APIスレあるだろう

934 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:38:35 ]
>>932
こういうスレもあるけど
pc11.2ch.net/test/read.cgi/tech/1196874830/

935 名前:デフォルトの名無しさん [2007/12/26(水) 21:46:08 ]
質問なんですが、標準のnewって本当にそんなに遅いのでしょうか?
下のようにpoolを作ってnewの実行時間と比較してみたのですが差が出ません
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp>
#include <iostream>
#include <time.h>
using namespace std;
struct Abc{
int x;
int y;};
int main(){
clock_t start1,end1,start2,end2 ;
boost::object_pool<Abc> p;
start1 = clock() ;
for( int i = 0 ; i < 0xffffff ; ++i ) {
Abc* x = p.construct();
}
end1 = clock() ;
printf("%.10f\n",(end1-start1)/CLOCKS_PER_SEC ) ;
start2 = clock() ;
for( int i = 0 ; i < 0xffffff ; ++i ) {
Abc* x = new Abc();
}
end2 = clock() ;
printf("%.10f\n",(end2-start2)/CLOCKS_PER_SEC ) ;
return 0;}


936 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:46:17 ]
>>933-934
どうもありがとうございます


937 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:48:55 ]
>>935
newの実装次第じゃ?
同じWindows用コンパイラでもVCとBCBじゃメモリマネージャの振るまい全然違うし

938 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:49:45 ]
newを連続して呼ぶだけではダメ。ベンチにならない。
途中でdeleteしたり、サイズの違う連中もnew-deleteしたりしないと。

939 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:50:49 ]
video.google.com/videoplay?docid=2914803742593360351



940 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:56:48 ]
時間の計り方間違ってね?
windowsのquerryperformancecounterを使ったprogress_timerで測定したら
0xffff回でもpool使った方が20倍くらい速いんだけど

941 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:59:45 ]
>>935
趣味でちまちまと俺Lispを作ってて、型はすべてスマートポインタで扱ってるんだけど、
自分でメモリプール作って標準newと取り替えたら、スクリプトの実行速度が確か5割増しくらいになった。
開発環境はBCB6(これでCUIプログラム作ってるのって変かもしれんけど、そこはスルーしてw)。

942 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:01:44 ]
>>941
FsstMM+標準newのテストもきぼんぬ

943 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:06:01 ]
mallocはMT用ライブラリをリンクすると中でロックしてたりするしなー

944 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:17:36 ]
クラス設計について詳しく書いてあるサイトとか本とかないだろうか?

C一通り終えてC++に移ったんだけれども、一先ず手元の本でテンプレートに入る前辺りまで進んだ
そこでおさらいも兼ねて適当なプログラムでも組もうと思ったんだけど、実際に組んでみると
クラス設計すんごい死ねる

945 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:19:30 ]
向き不向きがあるから注意な、ゲームとかCのが良かったり

946 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:25:21 ]
UNIX環境でC言語を利用して音声ファイルを利用したいと思っています。
キーボードを入力したら音声が再生できるようになればよいのですが
検索したところWindows環境でのplaysound()という関数は見つかったのですが
UNIX環境で使う関数が見つかりませんでした。
どなたか教えていただけないでしょうか?

947 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:31:25 ]
>>944
クラス設計はオブジェクト指向のスキルが必要だから、
オブジェクト指向の本を読むといいよ

クラスは、似たようなオブジェクトに共通する特性を表現したものだから、
まずはクラスとして表したい対象の共通的な特性が何かを考えて、
その対象がどういったデータと動作を持っているかを考えればいい。

例えば、おまいと俺の共通特性として、うんこする ってのを抽出したとするよ

そうするとPersonクラスにはputOutUnko()なんてメンバ関数が定義されるわけだよ
腹の中にはうんこが溜まってるんだから、うんこがどれぐらい溜まってるかっていうデータを持ってるわけだ
そうなると、volumeOfUnko なんていうメンバ変数が必要だよね

class Person
{
public:
  void putOutUnko() {
    if(volumeOfUnko > 0) {
      volumeOfUnko--;
    }
    return;
  }
private:
  int volumeOfUnko;
};

948 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:31:52 ]
「UNIXでは」、と一言ですませられる関数・APIは「無い」
/dev/dspに書き込んだり、KDEのライブラリ叩いたり、
gstreamを叩いたり、環境によって全然別

949 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:34:04 ]
>>948を翻訳すると、UNIXには標準の音声ライブラリがありません、ということ
だからライブラリを探す旅に出なさい、と



950 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:36:45 ]
逆に言えば、探せばライブラリは余裕で見つかる。

951 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:38:29 ]
>>947
なるほど・・・まだC++の感覚を掴んでないようですorz
どうしても基本はCにあってクラスを利用する、という使い方しかできてないです

例えばそのPersonクラスがあったとして人が複数人居た場合Personクラスのオブジェクトを複数作るんですよね?
そういう時にPerson1とPerson2があるとして、Person1が何かするとPerson2に影響が出るような場合Person1のメンバ関数内でPerson2のメンバ変数を書き換える必要なんかが出てしまうと思うんです
そういうのがいくつか出てきて、クラス設計の失敗だろうか?と思ったんですが、なんかすごい勘違いしてそうです。
指摘してもらえると助かりますorz

952 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:47:08 ]
デザインパターンの本を読めば世界が変わるよ。

953 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:03:43 ]
>>951
人の定義をPersonというクラスで行ったわけだから、個別の太郎やら花子ちゃんは、変数として宣言していく
Person taro;
Person hanako;
taro.putOutUnko();
hanako.putOutUnko();

ここまではいいとして、
taroがhanakoのメンバ変数を直接いじるようなことはしない。

オブジェクト間の作用は「メッセージ」という考え方によって行われる。

この相互作用は設計の段階では、太郎やら花子みたいな具体的なオブジェクトではなく、Personといった抽象的なレベルで考える。

ここで、Personをうんこの国の国民とする。
うんこの国にはうんこの王様がいて、国民にうんこしろ、と命令できる。

この命令(メッセージ)を国民に伝えるには、王様が国民のputOutUnkoを呼び出せばいい。

954 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:04:49 ]
と、その前に、王様と国民の関係を明確にしないといけない。
ここでは、王様は国民を管理する立場とする。国民は王様に管理される立場。

だから王様と国民は 1 : n の関係になる。

以上のことをC++として実装するとこうなる。

class King {
public:
  // うんこ命令関数
  void orderUnko(string& name) {
    map<string, Person>::iterator ite = kokumin.find(name); // 国民を名前で探す
    if( ite != kokumin.end() ) {
      // 探している国民が見つかったら
      ite->second.putOutUnko(); // うんこをしてもらう(国民への愛のメッセージ)
    }
  }
private:
  map<string, Person> kokumin; // 国民を名前で管理する
};

955 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:18:59 ]
Kingクラスのメンバ関数はstaticにはしないんだろうか

テンプレートってやつだろうか、まだやってないんだがなんとなくわかったかもしれない
しかしite->second.putOutUnko();のsecondってなんだろう
iteに見つかった国民の名前が格納されているとしたらsecondにはその国民nオブジェクト名が入ってるのか・・?
んなわけないよなぁorz

956 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:19:28 ]
>779
errata に載ってたべ。
www.aristeia.com/BookErrata/ec++3e-errata_frames.html

957 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:27:09 ]
>>955
mapのイテレータの
firstはstring(ここでは国民の名前)、
secondはPerson(国民オブジェクト)
をそれぞれ示している


first second
┌─┬───┬──────┐
│1│ "太郎"│ Person taro; │
  2 "花子" | Person hanako;|


罫線ずれまくり、マンドクセ

Kingのメンバ関数orderUnkoはstaticにしない
具体的な王様が存在するわけだから
King ore;
ore.orderUnko("sakura");

とかやって、さくらたんに排泄を強要したりしてハァハァ

958 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:30:02 ]
あ、なるほど

mapとやらに識別子(国民名)と該当オブジェクトへのポインタかなんかを宣言する時に格納していくのか
Kingのメンバ関数からPersonのメンバ関数が呼び出せるのは、普通だよな

なるほどさんくす、最初にテンプレートの方をやってくることにするぜ、助かりました

959 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:36:24 ]
横から失礼、そのKingを複数宣言する必要がある場面でどういった場面なんでしょうか?



960 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:50:59 ]
今回の場合は、ある特定のうんこの国に着目したから、Kingオブジェクトは1つしか登場しない。

でも、視点を変えて、国がたくさんある場合は話が違ってくる。
うんこの国が複数存在して、首脳会議とかやると、国の数だけ王様にご登場いただかなければならない

まぁ、ここらへんは実際の分析対象の事情による。
プログラムってのは目的があって存在するわけだから、その目的に沿ったように分析しなきゃいけない。

分析の話ついでに、
分析対象は視点によって認識のされ方が変化していくってのを忘れないで。

今回は王様と国民の関係に限定して分析したけど、
王様の家族からすれば、王様は父親だったり夫だったりするわけ。
だから、分析するときには、どういう視点で分析しなきゃいけないのかをまず決めとかなきゃいけない。

今のケースだと、王様と国民の関係って視点で分析したけど、
首脳会議なんか出てきて、国家間の視点に移行したわけだよ。これはこれで、話が違ってくるよね。
「視点が変わった」ってところを強く意識するのを忘れないでね、って話。

961 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:54:28 ]
なるほど、map<int,string,Person>とかにして国を識別するわけではないんですね、ありがとうございました。

962 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:01:49 ]
いや、そのnは要らない。
仮に、float型の変数fに必要だと言うのならfloat f = float(atof(str))でいい。
勿論、float f = atof(str)だけでも構わないし、float f = static_cast<float>(atof(str))としても構わないが。

963 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:21:56 ]
どが3個くらいつく素人ですが・・・。

>>960
うんこ国同士の相互性や関係性をモデル化したプログラムを作るのと、
うんこ国内でのうんこ内政をモデル化したプログラムを作る場合とで、
うんこ国王に実装させるべきメソッドが変わってくるということでしょうか。

964 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:23:26 ]
そもそも国王は必要なんでしょうか…。
とか思い出すと一行も書けなくなる。

965 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:25:05 ]
うんこをさせる、働かせる、給料をやる、とかPersonクラスにある関数と同じ数だけKingクラスのメンバ関数が増えていくんじゃないの

966 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:26:10 ]
国王が必要ない程度ならクラスを使わなくても良さそうな・・・?

俺は>>965と同じ解釈してた

967 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:28:03 ]
taro.Insert(hanako);
上のコードでメモリリークしている様なのですが‥‥

968 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:36:20 ]
サイズが合わないんじゃないの?

969 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:37:58 ]
taroにガベージコレクタを被せてください。



970 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:39:49 ]
>>967
下剤使いすぎたんじゃないの?

971 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 01:34:56 ]
>>963
まったくもって、そのとおり
もしかすると、いくつか似たようなメソッドが出てくるのかもしれないけど、視点は違ってくる。

世の中に万能なプログラムなど存在しなくて、
目的に合わせて作っていかなきゃいけないという現実が何よりの証拠。

>>964
目的がうんこするだけなら、国王なんていらんのです
ここでは、オブジェクト間の関係を示すため、
うんこの国をふと思いついたので、そういう設定にしただけです

仮にあなた自身の「うんこをするという行為」について分析した場合、
トイレやトイレットペーパー、あなたといったオブジェクトが関係として表れて来るのです。
水を流す、尻をふく、うんこする、というように

はい、うんこは素晴らしいのです

>>965
そんなことはないです
基本的に、それぞれが持っている動作は異なる

例えば、国王が国会での審議を下すという動作を持っているとしても、国民は持たない。
これはそれぞれの「役割」が異なるから。

国王が国民に直接給料をやる、ってことはしないので、
雇い主というクラスに、国民に給料あげるという責務を負わせる。
ここでも、視点が変わったから、これまでのクラスは考え直さなきゃいけない。雇い主だって国民の一部なわけだし。

972 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 01:37:34 ]
使わない引数の警告を除く

gcc #pragma unused

VC7 or 8 で
unusedインライン関数にあたる関数(可変長引数でOK)を探してます

973 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 01:48:42 ]
#pragma warning(disable:警告番号)
ではダメ?

974 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 01:51:07 ]
後戻りを防ぐためにも、設計は上流からね。アジャイルっぽくガシガシ作るのはそれを覚えてからでも遅くない。

975 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 01:55:47 ]
>>971
つまり、クラスを作るとなると必ずどこかで1:nが成立するということでしょうか?
今回の場合複数用意されるであろうPersonクラスがあり、それを管理・操作するKingクラスがある、というような


976 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:46:29 ]
ダウンキャストってもの凄い勢いで嫌われてるけどダウンキャスト無しで何とかなる物?

基底クラスのインターフェイス設計が悪いと言われればそれまでだが
派生したオブジェクトを基底クラスのポインタで受けないといけないときとかキャストしないといけないシーンが多すぐるorz

977 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:58:07 ]
dynamic_cast使ってキャスト失敗時の処理きちんとやっておけば問題ないんじゃね?

978 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 10:07:54 ]
>>277
Effective C++なんか読んでみるとダウンキャストするよりは
派生クラスのポインタで示すか、
それが出来なければ基底クラスにデフォルトでは何もしない仮想関数を追加しろっていってるけど

機能を追加するたびそんなことやってたらインターフェイス部分が肥大化して
高い位置にあるクラスに対するインターフェイスとしては使いにくくなるわけで・・・

やはり設計は計画的にということなのかorz

979 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 10:13:33 ]
ヘルパ関数にすればいい



980 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 10:26:22 ]
ヘルパ関数とはなんでしょうか?
ぐぐってみたけどいまいち納得のいく説明がないです・・・

981 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 12:47:14 ]
>>868
亀杉だがあらかじめ引数が変化することが分かってるなら動的引数なんて方法もあるな

982 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:31:36 ]
取得したデータをfile.txtというテキストファイルを自動生成してそこに出力したくて

//取得データのfile.txtファイルの自動生成
FILE *fp;
fp = fopen("file.txt","w");

と書きました。
コンパイルしたら

error C2065: 'fp' : 定義されていない識別子です。

と表示されました。fpというのはどのような宣言をすればいいのでしょうか。
環境はWindows XP Pro SP2、メモリ2G、VC++2005(Express)です。
アドバイスお願いします。

983 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:39:16 ]
>>982
そのコードを見る限りでは、それで問題なさそうだよ。

・#include <stdio.h> があるか
・C++ではなくCなら変数宣言はブロックの先頭じゃなきゃいけない
・直前のコメントを消してみる
などをチェキ


984 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:57:35 ]
>>983
#include<stdio.h>がありませんでした。
追加してみたけど変わりませんでした。

Cとかかれていたサンプルプログラムをいじっているのですが拡張子が*.cppなのでC++なのでしょうか。
int main(){
直後に
FILE *fp;
を置いたらエラーが消えました!
ありがとうございました!

もうひとつ質問で申し訳ないのですが
*.cはC言語でしょうけど*.cppというのはCでもC++でもあるのでしょうか。
判別方法というのはあるのでしょうか。


985 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:11:53 ]
>>984
大概のコンパイラは*.cをC、.cppをC++と見なしてコンパイルする。
C99以外のCなら大抵の場合C++としても通るから、普通は.cppで問題ない。
(ただしDLLのソースとかでエクスポート関数がある場合は注意)

986 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:12:00 ]
>>984
一般的なコンパイラならファイル名が*.cppならC++とみなして
コンパイルすると思うけど、
それをCとしてコンパイルする手段はあるだろうし、
あなたがどうやってコンパイルしているかわからないので、
何とも言えず。

気になるようだったら、main()の最初に
#ifdef __cplusplus
printf("C++なの\n");
#else
printf("Cなの\n");
#endif
とでも入れてどっちが表示されるか試してみるといいかもね。


987 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:14:04 ]
>>985-986
なるほど〜。
ありがとうございます。

コンパイルの方法は
VC++のソリューションエクスプローラーのソースファイルを右クリックする
といった方法でやっています。


988 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:07:49 ]
へぇ、VC++では右クリックでコンパイルされるのか。珍しいI/Fだな。

989 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:18:43 ]
コンテキストメニューからソースファイル単位のコンパイルってことだろ



990 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 17:31:22 ]
template<bool>
struct CompileTimeChecker
{
CompileTimeChecker(...);
};
template<> struct CompileTimeChecker<false> {};

#define STATIC_CHECK(expr, msg)\
 {\
  class ERROR_##msg {}; \
  (void)sizeof(CompileTimeChecker<(expr) != 0>(ERROR_##msg()));\
 }

int main()
{

 STATIC_CHECK(true, HOGEHOGE)

}

Modern C++のCompileTimeCheckerというコンパイル時にエラーチェック
をするマクロなのですが、コンパイルが通るはずの条件で呼び出して
も、VC++ 2008では以下のエラーが出てコンパイルできません。

関数型へのキャストが正しくありません。
'CompileTimeChecker<__formal> (main::ERROR_HOGEHOGE (__cdecl *)(void))':
sizeof オペランドが正しくありません。

g++ v4でも
関数へのsizeof?が不正だといわれます。何か間違ってるところはありますか?
本のソースそのままなのですが。

991 名前:990 mailto:sage [2007/12/27(木) 17:39:24 ]
ちなみにBCCでは通りました。

992 名前:990 mailto:sage [2007/12/27(木) 18:00:30 ]
どうやらsizeofに一時オブジェクトを渡すのは不正みたいですね。
以下でうまくいくようです。著者はどうやってコンパイルできたか
疑問です。コンパイラの違いでしょうか?ソースも間違っている
みたいです。

template<bool>
struct CompileTimeChecker
{
 CompileTimeChecker(...){} //定義が必要だった
};

#define STATIC_CHECK(expr, msg) \
{\
 class ERROR_##msg {};\
 CompileTimeChecker<(expr) != 0> c = CompileTimeChecker<(expr) != 0>((ERROR_##msg())); \
 (void)sizeof(c); \
}

993 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:10:10 ]
>>992
BCCしか使ってないんじゃね?

994 名前:990 mailto:sage [2007/12/27(木) 18:16:35 ]
>>993
いくつかのコンパイラで試したと書いてありましたが
それらでは問題なかったんでしょうね。
もはや (void)sizeof(c); \ の行は不要ですね。
どうやらエラーが出ていたのは一時オブジェクトではなく
sizeof(Widget())という形が関数に対してsizeofが行われて
いると判断されてたみたいです。これはもちろん不正ですが。

995 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:27:19 ]
995

996 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:33:48 ]
pc11.2ch.net/test/read.cgi/tech/1198755167/
はい新スレ
>>1の名前は気にしないでくれ。間違えた。

997 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:36:50 ]
擦れた手乙埋め

998 名前:998 mailto:sage [2007/12/27(木) 20:41:39 ]
99−

999 名前:999 mailto:sage [2007/12/27(木) 20:42:00 ]
999666999666

1000!



1000 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:42:22 ]
1000は俺が取るよ。

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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