【初心者歓迎】C/C++室 Ver.38【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.38【環境依存OK】 - 暇つぶし2ch391:デフォルトの名無しさん
07/06/13 00:15:42
すいません、質問お願いします。
本日 -> という記号が出てきたんですが、どういった意味なんでしょう

よろしくお願いします。

392:デフォルトの名無しさん
07/06/13 00:20:34
アロー演算子といいます

よろぴくね

393:デフォルトの名無しさん
07/06/13 00:23:44
>>391
URLリンク(wisdom.sakura.ne.jp)
ここ見ると幸せな予感。

394:デフォルトの名無しさん
07/06/13 00:30:40
>>392-393
ありがとうございます。早速読んでみます

395:デフォルトの名無しさん
07/06/13 00:33:33
ヘッダファイルなんですが、以下をBorlandでコンパイルすると
「train.h 6: 宣言の構文エラー」となります。なぜでしょうか^^;
初心者ゆえ何卒ご指導願います。
---------------
#ifndef __TRAIN_H__
#define __TRAIN_H__

#include<stdio.h>

class Train
{
public:
Train();
void SetSpeed(int aspeed);
int GetSpeed();
void Run();
void Stop();
private:
int speed;
};

#endif // __TRAIN_H__

396:デフォルトの名無しさん
07/06/13 00:40:02
ファイルの拡張子、.cとかになってねぇか?
Borland詳しく知らないが、C言語でclass使えないぞ。

397:デフォルトの名無しさん
07/06/13 00:44:14
予約識別子死ね。

398:デフォルトの名無しさん
07/06/13 01:16:30
stdにsort()とstable_sort()があるけど
stable_sortの同じ値をもつ要素が複数存在していたときに、元の順序を崩さない
ってどういうときに重要になるの?
別関数を用意してまで保障する必要性がわからない。

399:デフォルトの名無しさん
07/06/13 01:20:20
ヒント:ソートに使った以外のデータメンバ

400:デフォルトの名無しさん
07/06/13 01:27:34
>>398
すでに出来上がっている順番待ちの行列を「今から年齢順に受付まーす」って
話になったとき、同じ年齢の人同士では元の順番を保持するのが平和的だと思います。

401:デフォルトの名無しさん
07/06/13 01:35:50
あとstable_sortは最悪条件の時の効率がsortより良い。

402:デフォルトの名無しさん
07/06/13 01:37:10
それを気にするなら、
ヒープソートのライブラリ拾うなり作るなりすればいいんじゃないかな。

403:デフォルトの名無しさん
07/06/13 01:48:03
std::sort_heap()

404:デフォルトの名無しさん
07/06/13 03:14:47
インデックスとアドレスを保持した構造体を使ってソートして、
それから位置を変更していけば、
安定かつ高速なソートができると思う。
作業領域が必要にはなるけどね。

405:デフォルトの名無しさん
07/06/13 03:22:42
それでも最適化なら・・・最適化ならきっと何とかしてくれる・・・!!

406:デフォルトの名無しさん
07/06/13 09:22:35
C++のthrow/catch

みたいな例外処理を何て呼ぶんですか?

407:デフォルトの名無しさん
07/06/13 09:26:41
>>406
「例外処理」でいいような気がするけど、「C++のthrow/catch」に限定するなら
「C++例外処理」とでも呼べば?

408:デフォルトの名無しさん
07/06/13 09:28:09
>C++例外処理

これの存在を知らない組み込みな人たちに伝えるので、
センセーショナルでクールな呼び名を教えて欲しいでつ。

409:デフォルトの名無しさん
07/06/13 09:34:50
C++言語的割り込み処理

410:デフォルトの名無しさん
07/06/13 09:36:43
それだ!

組み込みな人達から見ればセンセーショナルでクールでつね。











でも、自分から見れば八百長っぽくてダサダサ。

411:デフォルトの名無しさん
07/06/13 09:38:21
C++ってなんでfinallyがないの?
あったら、auto_ptr使わなくてもこんな感じで書けたりしませんか?

char *str = new char[256];
try {
  ...
  if (...) return;
  ...
} finally {
  delete [] str;
}
と、C/C++初めて1年の俺が適当に言ってみる。

412:デフォルトの名無しさん
07/06/13 09:41:27
>>411
逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、
finalliyはいらないという判断だったような気がする

413:デフォルトの名無しさん
07/06/13 09:42:02
>>411
そんな書き方をいったい何箇所にコピペするつもりだ?
RAII のほうが処理を局所化できていい。
finally しかない Java では実際にそういうコードのコピペが多くなる。

414:デフォルトの名無しさん
07/06/13 09:45:13
>>411
↓こっちのが楽だと思わんか?

std::string str(256);
...
if (...) return;
...

415:デフォルトの名無しさん
07/06/13 09:53:43
そうそう、確か、deleteを使わずにローカル変数オブジェクトがC++流儀だった希ガス。

416:デフォルトの名無しさん
07/06/13 09:54:43
>C++言語的割り込み処理

割り込み処理って、中断するだけで割り込みが終わったら元の処理に戻るんじゃなかったっけ?
なら意味違うかも。。。

417:デフォルトの名無しさん
07/06/13 10:48:04
割り込みはダメだろう・・・常識的に考えて。

例外処理は例外処理。
例外的な動作が起こった場合に行う処理。

418:デフォルトの名無しさん
07/06/13 10:52:15
食い込みはおk?

419:デフォルトの名無しさん
07/06/13 10:56:58
>例外的な動作が起こった場合に行う処理。

C言語の戻り値見て対処するのも”例外処理”って呼ばれるし、
これじゃ、区別付かないじゃん。

420:デフォルトの名無しさん
07/06/13 11:02:07
でも「C++例外処理」じゃ不満なんだろ。
センセーショナルでクールな・・・

       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
    /  `´  \
     ('A`)
     ノヽノヽ
       くく

「禿式例外処理」なんてどうだ?
組み込みのおっさん相手にはかなりセンセーショナルだろ。

421:デフォルトの名無しさん
07/06/13 11:03:25
>でも「C++例外処理」じゃ不満なんだろ。

当たり前だろ、C++の例外処理は、C++例外処理です。っていえないお。

>「禿式例外処理」なんてどうだ?

オヤジギャグ?

422:デフォルトの名無しさん
07/06/13 11:06:32
別に俺用語を生み出すのは構わないけど
他人とコミュニケーションを取るときには使わないでね

423:デフォルトの名無しさん
07/06/13 11:08:45
洋本でも普通にC++EHだしな

424:デフォルトの名無しさん
07/06/13 11:09:05
禿が作ったんだから禿式ってことね。
URLリンク(www.research.att.com)

エラーコードによる例外処理に対して区別するって意味なら、
例外オブジェクトによる例外処理って感じかなぁ。

425:デフォルトの名無しさん
07/06/13 11:15:26
儂の例外処理は108式まで……

426:デフォルトの名無しさん
07/06/13 11:27:04
構造化例外ってのは別物だっけ課?

427:デフォルトの名無しさん
07/06/13 11:38:04
例外を使わずに自前のChain of Responsibilityパターンを使ったエラーハンドラ機構を使うようにしましょう

428:デフォルトの名無しさん
07/06/13 12:42:32
>>419
それは言語的に特殊な構文が用意されてるわけじゃない。
あと、何でもかんでも名前で説明しようと思うからいけない。
そういう違いは名前以外の解説文で説明しなはれ。

429:デフォルトの名無しさん
07/06/13 13:04:41
配列の要素を全部同じ値に埋めるって関数があったと思うんですが、
forで回すのとその関数を使うのとではどちらが早いんですか?
もしくは、計測するのでその関数名教えてください。age

430:デフォルトの名無しさん
07/06/13 13:14:35
memsetのこと?

431:デフォルトの名無しさん
07/06/13 14:27:31
fill() だろ。

432:デフォルトの名無しさん
07/06/13 15:00:43
ostream::write って引数 const char* だけど、
何で const void* じゃないの?
クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?

433:デフォルトの名無しさん
07/06/13 15:05:48
>>432
writeは何をする関数かな?

434:デフォルトの名無しさん
07/06/13 15:12:29
あなたに愛を届ける関数です。

435:デフォルトの名無しさん
07/06/13 16:19:29
int main()
{
FILE *fp;
int c;
fp=fopen("sample.txt","r");
while((c=fgetc(fp))!=EOF)
putchar(c);
fclose(fp);
return 0;
}

このプログラムの動作でsample.txtが日本語でも大丈夫なようにしたいのですが、
fgetcをどう変えたら良いでしょうか?

436:デフォルトの名無しさん
07/06/13 16:26:24
>>435
それで大丈夫なように見えるけど、どうダメだったの?

437:デフォルトの名無しさん
07/06/13 16:33:31
>>436
すいません、putcharの下に一つ入れ忘れましたorz

int main()
{
FILE *fp;
int c;
fp=fopen("sample.txt","r");
while((c=fgetc(fp))!=EOF)
{
putchar(c);
putchar('\n');
}
fclose(fp);
return 0;
}

正しくはこうでした。

438:デフォルトの名無しさん
07/06/13 16:34:43
cが漢字の1バイト目だったら改行しない、でいいだろ
1バイト目かどうかの判断は文字コードによる

439:デフォルトの名無しさん
07/06/13 16:36:49
文字コードじゃなくて漢字コード、ね。
で、1バイト目を出力したことは覚えておいて
2バイト目は無条件に出力
3バイトの文字コードなら以下同様

440:デフォルトの名無しさん
07/06/13 16:48:56
>>439
ありがとうございます。
エラー内容と言われたことをよく考えたら
c=fgetc(fp);
putchar(c);
c=fgetc(fp);
putchar(c);
これで日本語一字を出力するんですね。
putcharってこれでやったら日本語を1バイトずつ区切って
ゴミ(?)の文字2つを出力するかと思ってました。

441:デフォルトの名無しさん
07/06/13 17:32:27
>>406-
構造化例外処理という言葉はあるにはあるのだが、
Windowsの例外処理の名称として有名なので使えない

442:デフォルトの名無しさん
07/06/13 17:58:33
>Windowsの例外処理

これってなんだけ?

443:デフォルトの名無しさん
07/06/13 18:16:48
>>433
そんなこと全く関係ないっしょ。
fwrite の引数の型が const void* だし。

444:デフォルトの名無しさん
07/06/13 18:19:30
関係ある。ちゃんと読め。
fwrite は、サイズと数を指定するだろ。
ストリームはストリームを指定するんだ

445:デフォルトの名無しさん
07/06/13 18:21:58
>>442
「構造化例外」つってんのにググりもしないとは。

>>443
それこそまったく関係がない。
「文字列を出力する」 ostream と
「何でも出力する」 fwrite() を比較するとは
頭大丈夫?

446:デフォルトの名無しさん
07/06/13 18:22:12
>>442
__try
__except
__finally

447:デフォルトの名無しさん
07/06/13 18:23:58
>>445
ostream は別に文字列だけ出力すればいいわけじゃないってのは、
ofstream と ios::binary の存在を考えれば分かると思うが。

448:デフォルトの名無しさん
07/06/13 18:24:54
>>444
要するに、あくまでバイトストリームを出力する、というスタンスを示すために、
write では引数を const char* としてるという理解でいいのか?

449:デフォルトの名無しさん
07/06/13 18:26:38
文字列をbyte列と言い換えればいいのでは、streamは

450:デフォルトの名無しさん
07/06/13 18:34:58
クラステンプレートbasic_ostreamのこともたまには思い出してあげてください
writeの引数はただのcharではなくテンプレート引数よ

451:デフォルトの名無しさん
07/06/13 18:36:15
ああ、そうか。
そういうことか・・・。
了解。分かった。

452:デフォルトの名無しさん
07/06/13 18:42:34
俺が思うに、basic_ostream::writeに対応するCの関数は、
fwriteではなくfputs/fputwsなのだろう

するとfwriteに対応するのはなんだろうという気になるが

453:デフォルトの名無しさん
07/06/13 18:52:56
いや、ヌル文字を無視するから、fputs とは対応しないと思う。
wostream::write がある以上、
fwrite と basic_ostream::write も対応しないんだろうな。

用途的には fwrite と ostream::write が対応するんだろうけど。

454:デフォルトの名無しさん
07/06/13 18:56:35
ところで、例えば int 値をバイナリでファイルに書き込みたいときは、

ofstream f("hoge", ios::binary);

int x = 0x12345678;
f.write(reinterpret_cast<const char*>(&x), sizeof x);

という風に使うんだよね?(エラー処理は略)

455:デフォルトの名無しさん
07/06/13 19:29:12
new されたサイズをプログラマが知る方法はないですか?

456:デフォルトの名無しさん
07/06/13 19:37:32
>>455
標準にはない

457:デフォルトの名無しさん
07/06/13 20:03:36
>>454
たしかに、そうなんだけどね。ただ、
 basic_ofstream<wchat_t> f;
のときは
 f.write(reinterpret_cast<const wchar_t*>(&x), sizeof(x) / sizeof(wchat_t));
になる。
const void* を引数にするとわけ分からなくならないか?

458:デフォルトの名無しさん
07/06/13 20:05:26
"wchat_t"?

459:デフォルトの名無しさん
07/06/13 20:11:26
>>457
それって意図したとおりに動かないんじゃないの
最終的に書き込む際にはバイト列に落とし込まなければならないんだから
char以外のストリームだと確実にエンコード変換がかかるだろ
単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる

write()で書いたものが変換をバイパスできるわけではないし

460:デフォルトの名無しさん
07/06/13 20:34:48
>>457
それは x のサイズが wchar_t のサイズで割り切れなければヤバいかと。
まあ、今回は x が int だから多分ほとんどの環境で大丈夫なんだろうけど。

const void* でわけわからなくなる点に関しては、
既にその点で了解してる。

バイナリで wchar_t 以外の値を書き込む場合は、
ostream::stream を使うしかないとういことやね。
char = 1バイトと決まってるし。

461:デフォルトの名無しさん
07/06/13 21:14:07
>>455 >>456
replacement newを書くというのはだめなのかな。

462:デフォルトの名無しさん
07/06/13 21:16:49
>>459
エンコード変換なんてかかるの?
basic_ofstreamはwchar_tだけ特殊化なんてことはしないと思うから、
charでかからないならwchar_tでもかからないと思うよ。
それとも、エンディアン変換の話か?

>>459
うん。割り切れない処理系がないとは言い切れないよね。正確には知らんけど^^
そもそも、stream系のクラスはバイト列を扱うこと自体が
向いていないってことを言いたかっただけだよ。

463:デフォルトの名無しさん
07/06/13 21:21:27
>>462
まぁ落ち着いてVCとかの標準C++ライブラリのソース見てみ。

464:デフォルトの名無しさん
07/06/13 21:38:59
C言語でプログラムを作ってコンパイルまでできているのに
いざコマンドプロンプトで実行して整数値を入力だとかするんだけど、
数回入力するとエラーがでるんだけどなんでなんだい?

465:デフォルトの名無しさん
07/06/13 21:40:41
コンパイルが通るからってバグが無いわけじゃないだろ

その情報だけじゃ何が原因かはわからんけど

466:デフォルトの名無しさん
07/06/13 21:42:18
文てきには間違ってないんだけど、
長い文を書いて作ると絶対なるんだよね。
行数の限界とかってないよね?

467:デフォルトの名無しさん
07/06/13 21:47:43
>>457
char 以外のストリームでバイナリ出入力っていうのがそもそも無理。

468:デフォルトの名無しさん
07/06/13 22:12:04
>>463
一応、STLportのソースをざっとみたけどそんな箇所は見あたらなかった。
少なくともSTLportでは、
ofstream::write → streambuf::sputn → streambuf::xsputn → char_traits<_Char>::assign
の順で文字などが出力されているのだけど、
このどこでエンコーディング変換を行うのかだけでもよかったら教えて欲しい。
多分、探し方が足りないだけだと思うので。

>>467
basic_ostream<char>でしか正しくバイナリストリームを扱えないにもかかわらず、
UTF8やUTF16、UCS4などに対しても適切なstreamクラスを提供せねばならんので、
charだけ特別ってわけにはいかなかったんだろうね。

469:デフォルトの名無しさん
07/06/13 22:14:37
学校で作ったライブラリがあって、ヘッダーファイルに
#define GameMain \
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)\
{\
MSG lpMsg;\
HWND hWnd;\
WNDCLASS myProg;\
(以下略)

って書いてるんだけど、家に帰っていざ作って入力すると全行にエラーが出て動かないんだ・・・
とりあえず、\消してやってみたりしても{に対応する関数がないとかエラーが出て動かない。

学校だと.net2003で、家だとVC2005なんだけど・・・何がどう間違っているんだかさっぱりだ。orz

470:デフォルトの名無しさん
07/06/13 22:14:47
>>468
足りんな。
そこまででは、I/Oバッファに書き込んでいるだけだ。
実際にI/Oバッファからファイルにフラッシュする時点で同時に
変換を行っているはずなので、そこを探せ。


471:デフォルトの名無しさん
07/06/13 22:18:50
>>469
どういうエラーだよ
\は次の文字と組み合わさるので
この場合は、\直後の改行が無効になるだけ
スペースとかまぎれこんでるとエラーになるぞ

472:デフォルトの名無しさん
07/06/13 22:19:40
>>469
}が全角だとか言う落ちはないよな?

473:デフォルトの名無しさん
07/06/13 22:24:58
キタ━━(゚∀゚)━━!!!!

474:デフォルトの名無しさん
07/06/13 22:35:19
>>471 >>472
半角だった。
今、見比べていて、唯一違った部分のコメント部分消したら動くようになった。
\とかとコメントって絡ませたらまずいってことを知ったよ。お騒がせして申し訳ない。orz

475:デフォルトの名無しさん
07/06/13 22:50:00
問題が発生したため、ta.exe を終了します。 ご不便をおかけして申し訳ありません。

コマンドプロンプトで実行したら絶対途中でエラーがでる。
なぜだよおい。

476:デフォルトの名無しさん
07/06/13 22:51:56
環境もコードも示さずにその質問に答えられるのはエスパーだけだな
まぁexeとかコマンドプロンプトとか言ってるし
Windowsなんだろうなってことぐらいはわかるが

477:デフォルトの名無しさん
07/06/13 22:53:56
まあ、どうせいまだにMBCSなんだろう>糞学校のソースコード
で、VS2003のIDEのデフォルト設定がMBCSで、
VS2005のデフォルトが、ようやく、ほんとうにようやくUnicodeに変わったので、
こけてるんじゃないか。

478:デフォルトの名無しさん
07/06/13 22:54:51
素人なもんですみません。windowsです。
でなにを示せばいいんだい。
ちなみに短い文ならエラーでないのに複雑な文になると途中で強制終了される。

479:デフォルトの名無しさん
07/06/13 23:00:51
>>459
Cのstdioだとバイナリモードなら変換がかからなかったはず
もしかしたら単に俺の使っているVisual C++固有の挙動なのかもしれないけど

>>468
locale関係で文字の変換の機能が提供されていて、
標準では(locale毎の)charとwchar_tの変換が用意されていることになっている
たしかcodecvtとかいうファセットがそれだったと思う

480:デフォルトの名無しさん
07/06/13 23:02:34
>>478
素人が手を出すもんじゃない。
大人しく一から言語の勉強をしなさい。

481:デフォルトの名無しさん
07/06/13 23:04:08
>>480
おそらくコマンドプロンプトがバグってると思われるんだけどな

482:デフォルトの名無しさん
07/06/13 23:10:04
ソース出せばいいと思うよ

483:デフォルトの名無しさん
07/06/13 23:11:04
>>481
わらた、おもしろすぎ。

484:デフォルトの名無しさん
07/06/13 23:13:38
>>481
windows入れなおせばいいと思うよ

485:デフォルトの名無しさん
07/06/13 23:26:52
>>470
最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。
たしかに変換してた。
勉強になった。ありがとう。

486:デフォルトの名無しさん
07/06/13 23:39:48
>>474
/* */ 型のコメントなら大丈夫だよ

487:デフォルトの名無しさん
07/06/13 23:46:04
>>857
へぇ、今まで自分もエラーは一括して-1返してた。
ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?

488:デフォルトの名無しさん
07/06/13 23:47:30
何誤爆しとんねんw

489:487
07/06/13 23:51:37
誤爆しました><
焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><


490:デフォルトの名無しさん
07/06/14 00:52:31
NULLは大抵 0 とか (void *)0 だと思うんですが、環境によっては ゼロ じゃない時もある、とききました。すなわち、
「NULLは 0」ということを前提としたプログラムは書くべきではないですか?
例えば…
void hoge(Foo *bar)
{
  // bar が NULL じゃなかったら
  if (bar != NULL) // こっちはいいけど
  if (bar)       // こう書く奴は死ぬべきでしょうか
    bar->...;
}

491:デフォルトの名無しさん
07/06/14 00:54:41
>>355
それらしい記述見つからないから、flushした方がいいのかなぁ。
ようわからん。

492:デフォルトの名無しさん
07/06/14 00:56:23
>>490 URLリンク(www.kouno.jp)

493:デフォルトの名無しさん
07/06/14 01:24:47
>>491
㌧。
俺も最新のドラフト見てるけど、
それにすらそれらしい記述が見つからないんだよな。
どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。

まあ、flush しといた方が無難そうだな。

494:デフォルトの名無しさん
07/06/14 19:27:21
スレリンク(tech板)l2
↑のスレで>>982のコードを書いたのですが、
このプログラムで非数字(たとえばaとか)が入力されると
プログラムが異常な動作となってしまいます。
これって普通どうやって対処するものなのでしょうか?

495:デフォルトの名無しさん
07/06/14 19:35:50
scanf の戻り値を確認して
0 なら 1 文字捨てて読み直す

496:デフォルトの名無しさん
07/06/14 20:18:35
>>495さんのレスを参考に変えてみたのですが、

for(i=0;i<3;i++){
printf("%d行目の\n",i+1);
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0)
printf("%d",array[i][j]);
j--;
}
こういうことかと思ったらやはり間違ってて、
「一文字捨てる」という概念がいまいち分からないです。
どう直したらarray[i][j]のエラー入力は無かったことにされて
再入力するようにできるんでしょうか?orz

497:デフォルトの名無しさん
07/06/14 20:35:41
int ret;
while(ret = scanf("%d", &array[i][j]), ret == 0) {
 scanf("%*c");
}
if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }

498:デフォルトの名無しさん
07/06/14 20:43:41
>>497
%*cって何やってるんだろうとググったらscanfに見たことも無い仕様が
いっぱいで今更ながらにビックリしてしまったです…。
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0){
scanf("%*c");
j--;
}
レスを参考にこんな感じで直したらいけそうな感じになりました!
scanfの入力エラーって結構よくあるわりに長いこと対処法が分からなかったのでとても助かりました。
教えて頂き本当にありがとうございます><

499:デフォルトの名無しさん
07/06/14 20:53:50
つか、getchar でいいような

500:デフォルトの名無しさん
07/06/14 21:12:28
>>499
getcharって文字入力用じゃないですか?
これで使う方法ってあります?


501:デフォルトの名無しさん
07/06/14 21:26:25
scanf("%*c"); の代わりに使ってみればいいじゃないの。

502:デフォルトの名無しさん
07/06/14 21:34:57
>>501
あぁあなるほど、そっちの方に使うのか!
getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。
それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz
ちょっとそちらでも試してきてみます><

503:デフォルトの名無しさん
07/06/14 22:46:34
結局のところ、scanf()の代わりにfgets()+sscanf()で充分ってことだね。

504:デフォルトの名無しさん
07/06/14 22:48:53
余計複雑になるだけだと思うが。

505:デフォルトの名無しさん
07/06/15 03:24:22
fgets+strtolにすれば10進数以外も使えて便利
文字が来ても対処簡単だし


506:デフォルトの名無しさん
07/06/15 04:02:27
1行につき数値1つ?

507:デフォルトの名無しさん
07/06/15 13:00:46
>>506
オイオイ、strtolは変換できなかった場所のポインタ返ってくるし
変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ


508:デフォルトの名無しさん
07/06/15 13:48:27
すまんす

509:デフォルトの名無しさん
07/06/15 15:35:13
C++の質問です。
学習用の簡単なクラス(名前をsampとします)があって、内部でintの値を保持してます。
そこに、friend関数でoperator+()を追加したいです。
最初、
samp operator+(samp & obj, int i)
samp operator+(int i, samp & obj)
としたところ、
obj = 10 + obj;
はOKだったのですが、
obj = 10 + obj1 + 10;
はコンパイルがエラーになりました。
そこで、
samp operator+(samp obj, int i)
samp operator+(int i, samp obj)
としたところ、コンパイルが通り、結果も意図した通りになりました。
これはなぜなのでしょうか?
ちなみに、operator+()の内部は以下のように書きました。

samp operator+(int i, samp obj)
{
samp temp;
temp.x = obj.x + i;
temp.y = obj.y + i;
temp.z = obj.z + i;
return temp;
}

引数の順序が反対の関数も内部は同じです。
今まで参照と実物とはまったく同じ扱いでいいと思っていたのですが、


510:デフォルトの名無しさん
07/06/15 15:43:21
samp operator+(samp & obj, int const & i) ;
samp operator+(int const & i, samp & obj) ;

511:デフォルトの名無しさん
07/06/15 15:56:02
>>510
そのように書き直してみましたが、コンパイル通りませんでした。
以下はコンパイルエラーのメッセージです。

> g++ samp.cpp
samp.cpp: In function 'int main()':
samp.cpp:50: error: no match for 'operator+' in 'operator+(((const int&)((const int*)(&10))), ((samp&)(& obj3))) + obj3'
samp.cpp:37: note: candidates are: samp operator+(const int&, samp&)
samp.cpp:28: note: samp operator+(samp&, const int&)

512:デフォルトの名無しさん
07/06/15 16:10:41
>>511
すまん、sampの分を忘れてた。

samp operator+(samp const & obj, int const & i) ;
samp operator+(int const & i, samp const & obj) ;

理由?
関数の戻り値はrvalueだからかな。

513:デフォルトの名無しさん
07/06/15 16:13:55
やたらと質問ばかりですいません。

operator||()って、定義するのが何か変な感じなのですが、
||って、そもそも
式A || 式B
などと書いて、
式Aまたは式Bのどちらかが真なら、真。
という意味ですよね?このとき、||の右側の値と左側の値とを
特にoperator||(式A, 式B)としてひとつの関数内で一緒に処理しなくては
ならないような状況ってないんじゃないか
と思うのですが、
,,,
ここまで書いてきて、なんだか自分でも意味が分からなくなってきました。
ぶっちゃけた話、operator||()が定義できてよかった、という状況って
ありますでしょうか?
よろしくお願いします。



514:デフォルトの名無しさん
07/06/15 16:18:52
C++再考かなにかで、画像をくっつける演算子に使っていた気がするな。
実装例では簡単にするため、たんなる文字列だったが。

operator , () より使い道はあるだろ。
こんなものBoostを実装できるような変態なやつらしか使わない。

515:デフォルトの名無しさん
07/06/15 16:23:16
>>512
教えてもらった書き方でコンパイルは通りました。
しかし、今度は
obj3 = 10 + obj3 + obj3 + 100;
と書くとコンパイルが通りません。
ずーっと御世話になってますので、ソースを張り付けます。

#include <iostream>
using namespace std;
class samp {
int x;
public:
samp(int i = 0) {x = i;}
friend samp operator+(int const & i, samp const & obj);
friend samp operator+(samp const & obj, int const & i);
};
samp operator+(samp const & obj, int const & i) {
samp temp;
temp.x = obj.x + i;
return temp;
}
samp operator+(int const & i, samp const & obj) {
samp temp;
temp.x = obj.x + i;
return temp;
}
int main() {
samp obj1(10), obj2(7), obj3;
obj3 = 10 + obj3 + obj3 + 100;
return 0;
}

516:デフォルトの名無しさん
07/06/15 16:31:38
>>514
そうなんですか。実は今独修C++を読んでいますが、そこに、operator,()は
特殊なのでこの本では扱わない、と書いてあって、不思議な感じがして
いました。たしかに手元のマシンでgrepしてみると出てきますね。

rpm -ql boost-devel | xargs egrep 'operator\,\('
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
...(略)

前このスレで、独修C++をやればそれなりに力が付く、とだれかが
書いていたのでこの本を勉強しているのですが、たしかにいい本だと
思ってます。でも、この本にも書いてないことがあるのですね。
この本を終えたら次はどういう本で勉強すべきでしょうか?



517:デフォルトの名無しさん
07/06/15 16:34:28
>>514
C++再考ですね。見てみます。
ありがとうございます。

518:デフォルトの名無しさん
07/06/15 16:36:00
ミスターoperatorでも目指してんのか

519:デフォルトの名無しさん
07/06/15 16:38:22
今見ている本が演算子のオーバーロードの章(6章)なので、
つい上記のような質問ばかりになってしまいました。


520:デフォルトの名無しさん
07/06/15 16:39:39
よっ、ミスターoperator!

521:257
07/06/15 16:40:19
friend samp operator+(samp const & obj1, samp const & obj2);
が必要

((10 + obj3) +obj3) + 100 の順に評価される

operator 演算子呼ばれた後のの戻り型を並べると
((samp) + samp) + int
~~~~~~~~~~~~~~~~ ここの演算定義がいない

522:デフォルトの名無しさん
07/06/15 17:03:04
>>521
なるほど。。。。その通りですね。定義したらコンパイルできました。
あと、constの役割(とくにint const &iのあたりとか)が気になるのですが、
それはもうすこし自分で調べてみます。

ありがとうございました。

523:デフォルトの名無しさん
07/06/15 17:10:09
>>520
いやいや。。
それにしても、C++はいろいろ複雑ですね。



524:デフォルトの名無しさん
07/06/15 17:18:12
質問なんですが、C/C++の開発環境でお勧めのものってありますか。
JavaのEclipseみたいにいきなり変なことを書いてもその場で教えてくれるやつってありますかね?
ソースコードを書くのが楽したいというのが要望です。

ちなみに、TurboC++を試してみましたがどうもしっくりこない。
というか、まだほとんど使っていないので分からないというのが正直なところです。


環境、WinXP 普通の32ビット
(MacやLinuxでもおk)
当方のスペック 大学3年 Javaは普通に使いこなせるという程度

525:デフォルトの名無しさん
07/06/15 17:19:06
よろしくお願いします。

526:デフォルトの名無しさん
07/06/15 17:54:37
Eclipseが使えるんなら、そいつにCDTを入れてみたら?

527:デフォルトの名無しさん
07/06/15 18:22:25
operator&&、operator||、operator, をオーバーロードすると短絡評価でなくなってしまう
見た目が一緒なのに評価のやり方が変わってしまうのであまり良くない

528:デフォルトの名無しさん
07/06/15 19:50:20
>>505
sscan系でも%iというものがあってな

>>512
intは値渡しでいいだろ

>>513
> operator||()が定義できてよかった、という状況って
Boost.Lambda

529:デフォルトの名無しさん
07/06/15 19:57:07
samp じゃなくて smap に見えた

530:デフォルトの名無しさん
07/06/15 19:57:36
>>524
VC++のアカデミックは?
アカデミックは超安かった希ガス

ところで、みんなは何使ってんだ?
俺はVStudioでC++とC#を中心にやってる。

531:デフォルトの名無しさん
07/06/15 20:10:29
VC++2005expressは無料だよ

532:デフォルトの名無しさん
07/06/15 20:40:21
express だな。
商用には使えないが、それはアカデミックも同じだな。

533:デフォルトの名無しさん
07/06/15 21:12:36
嘘言ってはいけません。
Expressも他のEditionと同じように、
商用利用を禁止する条項はない

534:デフォルトの名無しさん
07/06/15 21:27:41
VC++EEはリソースの扱いが難点だけど
それ以外は十分だな

535:デフォルトの名無しさん
07/06/15 21:30:29
>>533
前どっかのスレでそう聞いたんだけど、騙されてたのか。
ググったら商用に使えるって書いてたわ。ありがとう。

536:デフォルトの名無しさん
07/06/15 23:32:57
アカデミックも商用可能だな。

537:デフォルトの名無しさん
07/06/16 01:23:34
std::wofstream m_ofs;

void CLog::Write( LPCWSTR strMessage )
{
if( !m_ofs.is_open() ) return;

m_ofs << " Message:" << strMessage;
}

こういうものを作って

CLog log;
log.Write( L"てすと" );

という風に使うと

Message:

としか出力されません。何故でしょうか?

538:デフォルトの名無しさん
07/06/16 01:26:58
よく判らんけど、バッファリングされているからじゃないの?
フラッシュしたら?

539:デフォルトの名無しさん
07/06/16 01:27:16
ロケールの設定

540:デフォルトの名無しさん
07/06/16 01:34:54
Write( L"aa" )だと
Message:aaと普通に表示されます
日本語だけだめみたいです

>>539
ぐぐりました
こういうのが出てきたので→setlocale(LC_ALL,"Japanese")
付け足しましたが、解決ませんでした・・・


541:デフォルトの名無しさん
07/06/16 01:40:59
>>540
imbue()

ただし
URLリンク(forums.microsoft.com)

542:デフォルトの名無しさん
07/06/16 01:47:35
>>541
おお!解決しました!
ありがとうございます!

543:デフォルトの名無しさん
07/06/16 02:41:07
度々すいません __FUNCTION__ のwchar_t型というのはあるのでしょうか?

544:デフォルトの名無しさん
07/06/16 05:12:13
>>543
gcc の拡張だね。 static const char [] な変数と決められてるから、いまのことろ無いね。

545:デフォルトの名無しさん
07/06/16 05:36:40
wchar_t wfunc[sizeof __FUNCTION__];
swprintf(wfunc, sizeof __FUNCTION__, L"%s", __FUNCTION__);

とか自分で変換するしかないのかな。
バッファが必要だから、マクロ化するのも難しいな。
グローバル変数を使うのもアレだし・・・。

546:デフォルトの名無しさん
07/06/16 09:33:44
>>540
"japanese"より""を勧める

547:デフォルトの名無しさん
07/06/16 11:10:16
>>528
scanf系の関数だと何個変換できたかしか返ってこない
どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい

勉強レベルとか手抜き処理でいいならscanfでいいんだけど、
エラー検出とか入力の自由度とか考えて作ろうと思ったらscanfは使えないと思う
今のPCなんかだとあんまり問題にもならないかもしれないけど処理速度も遅いし


548:デフォルトの名無しさん
07/06/16 11:16:07
>>530
普段はcygwin上でgcc使ってるな
簡単なwinアプリもgccで作ってる

今の仕事の開発環境もcygwin+gccクロスコンパイラだったりする


549:デフォルトの名無しさん
07/06/16 11:21:21
>>547
それはわかる
1行目の10進以外もに反応しただけ

550:デフォルトの名無しさん
07/06/16 11:21:59
>>547
つ[%i]

って、>528に書かれているじゃないか。
ちょっと調べることもしないでえらそうに語るなよ。

551:デフォルトの名無しさん
07/06/16 11:23:48
ツーか、むしろ突っ込むならここだな。
>どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい

552:デフォルトの名無しさん
07/06/16 11:30:18
通りすがりのものだけど、>>550-551 のほうが変なこと言ってる

553:デフォルトの名無しさん
07/06/16 11:38:37
知らないくせに偉そうな事を言うってのが
とてもみっともないんだよね

554:デフォルトの名無しさん
07/06/16 11:41:57
あ、ちょっと違うか。
>>547は「どこまで変換したかscanfでは判定できない」と言っている。
これが、%nを知らない、「無知なのに偉そうなことを言って恥ずかしい」こと。
>>505の基数の自由度に関しては、確かにstrtolの方が便利。

555:デフォルトの名無しさん
07/06/16 11:51:44
最近Cの勉強を始めたのですが、いくつか質問したいことがあります。

講座などを見ると、Javaにできることは全部できると感じましたが、
Javaと同じようにやるのが難しいこととか、
Javaの感覚でやると間違いやすいこととか、ありますか?

それからヘッダというのはプログラム本体と同じように、
関数を定義したり、グローバルに使う変数を保持してもいいのでしょうか?

VCにはJavaのEclipseのように、打った瞬間コンパイルエラーを表示してくれたり、
3,4字打ったら当てはまる構文や変数名やクラス名を出してくれる機能はないのでしょうか?
それがないと、打ち間違いしそうです。

556:デフォルトの名無しさん
07/06/16 12:03:58
すみません。6年ほど前にVC++6.0を買ったんですが、入門者だった私にはどうにも難しくて
C言語のコマンドラインプログラムを勉強した程度です(独習C)のレベルです。

それから、JavaやPHPやASP.NETのWeb系の仕事をしたりしていたんですが、最近、Win32プログラムの昔買った本とかを
読んでみると結構理解できます。自分としてはVCへの憧れが強いので、MFCとかも勉強したいとおもっているのですが
いまさらMFCを勉強しても無駄でしょうか?C++の文法的知識はあります。

557:デフォルトの名無しさん
07/06/16 12:08:01
MFCをやる利点てあるかな?
全部C#でことたりね?

558:デフォルトの名無しさん
07/06/16 12:10:30
>>544 >>545
ありがとうございます。
全部ユニコードで統一したいので、面倒ですがいちいち変換することにします。

559:デフォルトの名無しさん
07/06/16 13:44:46
>>557
.NETのランタイム要らないとか?
MFCならスタティックリンクしたら
特にランタイムインストールしなくても動くし。

個人的には今からMFCやる意味はあんまり無いと思うけど。

560:デフォルトの名無しさん
07/06/16 14:02:04
ファイルに関するたくさんの情報を保持するクラスを作りたいんですが、
こういう時のメンバ変数はprivateにするのが基本なんですよね?
Setは1つで済むとしてもGetはメンバ変数と同じだけ用意するんですか?

561:デフォルトの名無しさん
07/06/16 14:16:15
>>560
必要に応じて。

562:デフォルトの名無しさん
07/06/16 14:30:56
>>561
ではこのやり方はおかしくないんですね。
なんかこれならpublicにした方が手っ取り早いなあとか思ったんですが
それはダメ!って色んなところで解説されてるので・・・
ありがとうございます。

563:デフォルトの名無しさん
07/06/16 14:41:34
どういう使い方をするのか知らないけど、publicにしたほうが手っ取り早いと感じるなら
クラスじゃなくて構造体を使うとかしたら?

564:デフォルトの名無しさん
07/06/16 15:00:11
>>562
駄目な理由を考えてみる

565:デフォルトの名無しさん
07/06/16 15:17:27
クラスにしたのはコンストラクタとデストラクタが使いたかったからです。
このクラスの変数には別のクラスから頻繁にアクセスする必要があって、
こういう場合隠蔽する意味あるのかな~?と。
かといって全部同じクラスにしちゃうと大きくなりすぎてこれもまた良くないよな・・・
とか思ってなかなか決められないんです。

566:デフォルトの名無しさん
07/06/16 15:20:29
あ、構造体でもコンストラクタとデストラクタは使えますね。
結局隠蔽すべきかそうでないのかの判断が良く分からないと言うか。

567:デフォルトの名無しさん
07/06/16 15:22:57
好きにしろ

568:デフォルトの名無しさん
07/06/16 15:28:29
>このクラスの変数には別のクラスから頻繁にアクセスする必要があって
まずこの設計が間違ってないかどうかを考えるべきだと思う

569:デフォルトの名無しさん
07/06/16 15:35:22
ですよね。
ちょっと検討しなおします。
ありがとうございました。

570:デフォルトの名無しさん
07/06/16 16:54:32
横からなんですけど>>556さんの質問に関連して、
現在独学でC/C++を勉強中でコンソールプログラムを色々作ってきた後、
GUIを作るのにWin32APIを勉強していて、
山本信雄さんの『はじめてのWindowsプログラミング』を読んだら、
Win32APIをそのまま扱うのは普通しなくてMFCで作る
みたいなことが書いてあったから次はMFCと思っていたのですが、
MFCやる利点がないということはこれからどう勉強を進めたら良いですか?




571:デフォルトの名無しさん
07/06/16 17:00:38
>>570
とりあえず.NETかそうでないほうをやるかで決めては

572:そう思えるかどうかが分岐点
07/06/16 17:06:41
MFCやればいいじゃん。趣味なら何の問題もないよ。
もう後がないとか、2005EEでできないとか、どうでもいいじゃん。

573:デフォルトの名無しさん
07/06/16 17:11:21
さすがにMFCはもうやめといたほうがいいだろ。
どうせまだ入り口程度しかやってないんだろ。
だったら早いうちに.Netへ移行しておけ。

574:デフォルトの名無しさん
07/06/16 17:15:07
>>571
今のスタンダートとしては.NETなのですか?
ていうかそうでないほうっていうのが何なのかも分からないですorz

>>572
今は趣味ですが大学卒業後プログラマになりたくて勉強しているので
実際に現場で役に立つものを勉強したいのです。

575:デフォルトの名無しさん
07/06/16 17:17:10
>>573
やはり.NETが良いんですね><
正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます><
ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか?
それともJavaとかも身に付けておいた方が良いのですか?

576:デフォルトの名無しさん
07/06/16 17:21:08
>>575
プログラマを目指すなら、MFCも.Netも要らない。
現場で使っているものをその場で使えるようになればいい。
その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。
その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。

577:デフォルトの名無しさん
07/06/16 17:21:19
プログラマになるなら最低7つは言語を習得しないとダメです。

578:デフォルトの名無しさん
07/06/16 17:34:41
下手な言語7つ覚えるよりC++をマスターするほうが遙かに難易度が高い件について

579:デフォルトの名無しさん
07/06/16 17:36:31
そもそも何を持ってマスターと言うのか?
C++0xとかまだ定まっていないというのに

580:デフォルトの名無しさん
07/06/16 17:36:53
難易度高くても、C++しかできないとな。
つぶしが利かない。

581:デフォルトの名無しさん
07/06/16 17:39:32
>>580
C++できたら他の言語なんて楽勝だろ。

582:デフォルトの名無しさん
07/06/16 17:41:42
楽勝だったら、7つ覚えておけよw

583:デフォルトの名無しさん
07/06/16 17:45:08
仕事で必要になるたびに覚えていけばいい

584:デフォルトの名無しさん
07/06/16 17:46:28
C++ が分かってれば、Java だの Ruby だの3日あれば使えるようになる。

585:デフォルトの名無しさん
07/06/16 17:47:52
いやぁ、C++からJavaはちょっと壁があるぞ。
C++言語を覚えただけじゃ、GUIもスレッドもないしな。

586:デフォルトの名無しさん
07/06/16 17:49:11
さらに言うと、現状javaの案件といえば、サーバーサイドだな。

587:デフォルトの名無しさん
07/06/16 17:50:03
>>585
でも逆の Java → C++ と違って挫折することはまずないだろ。

588:デフォルトの名無しさん
07/06/16 17:51:10
それで挫折する人間なら、C++覚える時点で挫折するよ。

589:デフォルトの名無しさん
07/06/16 17:59:05
GUI は言語の問題じゃなくてライブラリの問題だと思うが。

590:デフォルトの名無しさん
07/06/16 18:00:40
言語だけのC言語ベースでイインジャネ?
設計まで絡んだら知らん。

591:デフォルトの名無しさん
07/06/16 18:01:50
reinterpretって何て読むの?
ネット辞典で調べてもでてこん。

592:デフォルトの名無しさん
07/06/16 18:03:55
リインタープリット

593:デフォルトの名無しさん
07/06/16 18:12:53
文法だけではプログラマになれないよ。
そもそも質問主は、MFCか.Netかで迷ってるんだよ?
それでもライブラリだから論点が外れてるといえるか?

594:デフォルトの名無しさん
07/06/16 18:17:30
俺から見ればC/C++もJavaも難しいよ、お前らって頭良いんじゃね
いまだにfor(A;B;C){...}の判断,処理手順を間違えてるときあるしな。情けないよ
for(A;B;C){...}の判断,処理手順で混乱する香具師、手を挙げろ! .ノ
イテレータを作成してるときなんかあれ???、あれれれ?、なんで になるときあるニダ

595:デフォルトの名無しさん
07/06/16 19:20:14
>>594
慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。

596:デフォルトの名無しさん
07/06/16 20:22:02
俺はC++からJavaScript+HTMLをやったんだが。
C#には簡単に移行出来たな。

597:W
07/06/16 20:25:34
JavaScript+HTML

598:デフォルトの名無しさん
07/06/16 20:30:12
CやC++で
a = b = c = d;
としたら、段階的に処理を書くと、
a = b = (c = d); //まずcにdが代入される
a = (b = c) = d; //次にbにcが代入される
(a = b) = c = d; //最後にaにbが代入される
と言うことでいいのでしょうか?
詳しく教えてほしいです

599:デフォルトの名無しさん
07/06/16 20:34:46
a = (b = (c = d))
c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される

600:デフォルトの名無しさん
07/06/16 20:40:25
なるほど!
わかりやすい説明をありがとうございます!!

601:デフォルトの名無しさん
07/06/16 20:43:43
HTMLってプログラミング言語?

602:デフォルトの名無しさん
07/06/16 20:46:19
・変数がない
・ループ、条件分岐が書けない
・関数も書けない

修飾言語ではあるが、プログラム言語ではないかな

603:デフォルトの名無しさん
07/06/16 20:53:07
HTMLはマークアップ言語です。


604:デフォルトの名無しさん
07/06/16 21:01:38
>>602-603
トンです。
上でプログラミング言語と並んで書かれてたから
なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら
コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。

605:デフォルトの名無しさん
07/06/16 21:03:45
プリコンパイル済みヘッダーを作ったですが
デバッグモードではビルドできるのに、リリースにすると

error LNK2005: *** は既に ***.obj で定義されています。

というエラーが全部のファイルで発生してしまいます。
これは何故なんでしょうか?
環境はVS2005です

606:デフォルトの名無しさん
07/06/16 21:28:39
>>605 エラーです

607:デフォルトの名無しさん
07/06/16 21:32:24
特異な言語といえばSQLもそうだな。
一応Languageと名前についてるけど、
これをプログラミング言語と呼ぶのは
ちょっと抵抗ある。

608:デフォルトの名無しさん
07/06/16 21:49:46
ストアドとか書けば解るが、あれは十分にプログラム言語としての特徴を備えているような気が

609:デフォルトの名無しさん
07/06/16 21:51:48
SQLに制御構造をつけたのがストアドじゃないかね

610:デフォルトの名無しさん
07/06/16 21:58:45
HTMLだってLanguageと名前についてるだろ
SQLはプログラミング言語じゃなくて、データベース言語だろ

611:デフォルトの名無しさん
07/06/16 21:59:39
Languageは「言語」であって「プログラミング言語」ではないからな。

612:デフォルトの名無しさん
07/06/16 23:07:19
>>594
for(A; B; C) { D } で、
A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・
とか考えるのは効率が悪い。

グルングルンと実行されるみたいな流れを
もっとグラフィカルに頭に思い浮かべるのがコツ。
一旦処理の流れを線でつないで紙に書いて、
それを意識するもんだ。

613:デフォルトの名無しさん
07/06/16 23:08:18
HTML はプログラミング言語じゃなくてマークアップ言語。

TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。

614:デフォルトの名無しさん
07/06/16 23:56:37
SQLがチューリング完全でないことは明白。

615:デフォルトの名無しさん
07/06/17 00:22:00
何言ってるの?

616:デフォルトの名無しさん
07/06/17 08:02:03
わからないなら調べてから聞けよ

617:デフォルトの名無しさん
07/06/17 08:07:53
あ~い、とぅいまてぇ~ん♪

618:デフォルトの名無しさん
07/06/17 09:34:26
>>602
IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ

619:デフォルトの名無しさん
07/06/17 12:43:27
親クラスのprotectedな変数が、public継承した子クラスでは
publicにならずにprotectedなままなのは何故ですか?

親クラスのpublicな変数が、protected継承した子クラスでは
protectedになるのに。

publicよりもprotectedの方が強いと理解しておけばよいのでしょうか


620:デフォルトの名無しさん
07/06/17 12:46:05
そう理解しておけばおk
そしてプライベートが最強と

621:デフォルトの名無しさん
07/06/17 12:55:24
>>620
ありがとうございました。
そう理解しときます。


622:デフォルトの名無しさん
07/06/17 14:57:34
=演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、
thisポインタを戻り値にしない書き方ってありますか?

623:デフォルトの名無しさん
07/06/17 14:58:53
ありますよ

624:デフォルトの名無しさん
07/06/17 15:01:58
それは例えばどういった書き方でしょうか?


625:デフォルトの名無しさん
07/06/17 15:03:17
>>624 void operator = (...

626:デフォルトの名無しさん
07/06/17 15:04:43
a = b + c + d;の処理の流れって、

a = (b + c) + d; //まずbにcを加算
a = ((b + c) + d); //次にb+cの値にdを加算

最後に aに代入という流れで理解してよいのでしょうか?
詳しく教えてください。

627:デフォルトの名無しさん
07/06/17 15:06:25
デバッグ

628:デフォルトの名無しさん
07/06/17 15:06:57
デバッグする環境がありません・・・すいません。


629:デフォルトの名無しさん
07/06/17 15:09:12
>>625
マジサンキュー
課題が終わった

630:デフォルトの名無しさん
07/06/17 15:10:36
>>626
その例はその理解で正しい。
演算の順序は、演算子の優先順位と結合規則によって決まってる。

631:デフォルトの名無しさん
07/06/17 15:13:46
いや待て、a = b + (c + d)という解釈をしているかも知らん。

632:デフォルトの名無しさん
07/06/17 15:28:39
c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから
b+cが先だろ

633:デフォルトの名無しさん
07/06/17 16:40:39
>>630
しかし、順序が変更されても結果に影響が出ない範囲でなら
最適化で順序が入れ替えられる可能性はあるな。
ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は
そういうことは絶対にないが(コンパイラにバグでもない限り)。

634:デフォルトの名無しさん
07/06/17 16:56:56
>>633
コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?

635:デフォルトの名無しさん
07/06/17 17:08:24
???
誰もそんな事言ってないぞ?

636:デフォルトの名無しさん
07/06/17 17:14:59
結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。

637:デフォルトの名無しさん
07/06/17 18:18:51
a = b() + c() + d();

で、b, c, d の呼び出される順番は未定義だっけ?
結合順と、各項の評価順はまた別の話だよな。

638:デフォルトの名無しさん
07/06/17 18:37:07
fgetsの使い方で

fgets(buf, sizeof(buf), stdin);

のような常套句がありますが、これは sizeof(char) が1であることが
前提になっていますよね。もし sizeof(char) が2だったら、読み込む文字数が
想定した数の2倍になってしまうと思うのですが。

こういった書き方は問題ないのでしょうか。

639:デフォルトの名無しさん
07/06/17 18:40:16
>>638
sizeof(char)は常に1

640:デフォルトの名無しさん
07/06/17 18:41:57
>>638
sizeof(char)は絶対に1だから安心しる。

ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか
分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。

641:デフォルトの名無しさん
07/06/17 18:43:56
charが1バイトじゃなくて1バイトの定義がchar?

642:デフォルトの名無しさん
07/06/17 18:44:21
charは常に1バイト

643:638
07/06/17 18:47:09
レスありがとうございます。
charが常に1バイトというのは、規格で決まっているのですか?

644:デフォルトの名無しさん
07/06/17 18:48:49
>>643
決まってる。

ただ、「buf の型が char である」ということに依存しているから、
ここを変更したいと思った場合に変更を要するコードである事は確かだな。

645:デフォルトの名無しさん
07/06/17 18:50:14
誤解があるといけないから念のために言うけど、
char が 1 バイトというのは決まってるが、
1 バイトが 8 ビットである保証はない。
1 バイトが 9 ビットの環境もある。

646:デフォルトの名無しさん
07/06/17 18:51:29
1バイトのビット数を取得するマクロってありますか?

647:638
07/06/17 18:51:48
皆さんありがとうございました。勉強になりました。

648:デフォルトの名無しさん
07/06/17 18:57:42
アルバイトのヒト数を取得するユニクロってありますか?

649:デフォルトの名無しさん
07/06/17 19:19:40
>>646
CHAR_BIT

650:デフォルトの名無しさん
07/06/17 20:31:59
>>637
未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。

651:デフォルトの名無しさん
07/06/17 21:06:51
たまにはlimits.hも眺めよう

652:デフォルトの名無しさん
07/06/17 21:08:10
float.h も眺めようぜ

653:デフォルトの名無しさん
07/06/17 21:10:15
眺めすぎて惚れるなよ

654:デフォルトの名無しさん
07/06/17 21:21:25
やだ・・///

655:デフォルトの名無しさん
07/06/17 21:22:24
構造体やクラスを関数内で定義すること、
つまり、以下のようなことがしたいのですが
これは規格でできることが保証されていますか?

void hoge() {
 struct hage {
  ...
 };
 ...
}

656:デフォルトの名無しさん
07/06/17 21:23:44
>>655 C89 の頃から余裕で使える。

657:デフォルトの名無しさん
07/06/17 21:26:15
ちなみに関数内で関数は定義できません

658:デフォルトの名無しさん
07/06/17 21:33:03
>>656
ちゃんと規格で決まってるんですか。
知りませんでした。
どうも、ありがとうございます。

>>657
構造体やクラスの静的関数で代用するのが常套句になってますね。

659:デフォルトの名無しさん
07/06/17 21:44:49
GCC の拡張でよければ関数内関数は使えるんだけどな。確か。

660:デフォルトの名無しさん
07/06/17 22:29:53
関数内クラスをテンプレート引数に出来たらなぁ
と思うことがある

661:デフォルトの名無しさん
07/06/17 23:05:55
charのバイト数の件で便乗質問。
shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか?
決まってないのなら確実に2byteの型は有りますか?
また確実に4byteの型はありますか?

662:デフォルトの名無しさん
07/06/17 23:07:51
longは32bit以上というのはK&Rに書かれていた気がする。
というか規格原理主義者によると、1バイトが何ビットかも決められていないとか

663:デフォルトの名無しさん
07/06/17 23:17:52
>>661
#include <stdint.h> で int16_t と int32_t でおk。

664:デフォルトの名無しさん
07/06/17 23:20:56
>>661
sizeof (short) == 2と規格で定まっているわけではない
でも規格の最大値・最小値の規定から少なくとも16ビット以上あるということは導ける
同様に(662も書いてあるように)、longが少なくとも32ビットあるということも導ける

2バイトの方が欲しければ、C99なら<stdint.h>のint16_tやint_least16_tが使える
前者がぴったし16ビットの型(対応する型があれば用意されている)
後者は少なくとも16ビットの型(絶対に用意されている)

後者だけ必須なのは1バイトが8ビットでない環境の存在を考えれば納得

C++に今のところ<stdint.h>は、存在しないから
<boost/integer.hpp>や<boost/cstdint.hpp>で代用するくらいしかない

665:デフォルトの名無しさん
07/06/17 23:32:47
C/C++で処理系依存なのは、もう諦めるしかないんじゃないか?

666:デフォルトの名無しさん
07/06/17 23:48:09
必要以上に移植性を求めるのは不毛。
必要以上に移植性を失うのも愚かしいこと。

667:デフォルトの名無しさん
07/06/17 23:53:10
俺ッち、__propertyとか__finallyとか好きな訳だけど、使っちゃって委員会?^^

668:デフォルトの名無しさん
07/06/17 23:56:15
どうせ他の部分も環境依存しまくりなんだろ?
どんどん使っちゃえYO!

669:デフォルトの名無しさん
07/06/18 00:04:53
>>667
__closureも活用してもっと便利に!

670:デフォルトの名無しさん
07/06/18 00:13:58
勉強になるな。

671:デフォルトの名無しさん
07/06/18 00:19:27
#include <stdint.h>
VC6だと「そんなヘッダ見つからねーよ。死ねボケ。」って言われてしまった OTL。

672:デフォルトの名無しさん
07/06/18 00:47:53
質問
void hoge()
{
何かの処理
#ifdef DEBUG
  printf("Debug %s, nanka);
#endif
何かの処理
#ifdef DEBUG
  printf("Debug %s, nanka);
#endif
↑こんな調子で数百行位ある
}
こういう汚い関数を直したいんだが

void DebugPrint(char *str)
{
#ifdef DEBUG
  printf("Debug %s, str);
#endif
}
void hoge()
{
何かの処理
  DebugPrint(nanka);
何かの処理
  DebugPrint(nanka);
}
って感じに直したいんだが、やったら動作変わっちゃう?
#ifdefあんま使ったこと無いから教えてくださいな

673:デフォルトの名無しさん
07/06/18 00:48:22
そりゃそうだろ

674:デフォルトの名無しさん
07/06/18 00:49:09
>>673
すんません
分かり易く解説お願いします

675:673
07/06/18 00:49:19
>>671
の事ね

VC6が出来たのはだいぶ前だから

676:672
07/06/18 00:50:28
>>675
あ、すんません
タイミング良かったんで即レス来たのかと思っちゃいましたw

677:デフォルトの名無しさん
07/06/18 00:57:26
#ifdef DEBUG
  #define DEBUG_PRINT(a) printf("Debug %s, (a))
#else
  #define DEBUG_PRINT(a)
#endif


void hoge()
{
何かの処理
  DEBUG_PRINT(nanka);
何かの処理
  DEBUG_PRINT(nanka);
}

こういうのはよくやるな。
ただ、printfは引数の数が可変だから、引数の数にばらつきがあるとまた別の対策が必要になるが。

678:デフォルトの名無しさん
07/06/18 01:04:08
>>677
おぉ、なるほど

後、確認なんですけど、自分が書いた>>672だと動作変わっちゃうんですよね?

勉強として実際のソース見て動きを理解しろ
とか言われてるんですが、こんなソースばっかで
見づらくてしょうがないんで
何とかしたくて・・・
コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz

679:デフォルトの名無しさん
07/06/18 01:05:32
別に動きは変わらんと思うが

680:デフォルトの名無しさん
07/06/18 01:11:32
>>679
あ、そうなんですか?
ありがとうございます

個人的にはDebugPrintの部分は他から呼びたいので
関数化したいな~と思ってたんですけど、
#ifdefとかはコンパイル時に読み込まれるとか有ったので
動作変わっちゃうのかと・・・糞初心者ですんません
(もう、たまにソース直せと言われるとおっかなビックリっす・・・)


681:デフォルトの名無しさん
07/06/18 01:12:16
失礼、
×他から
○他からも


682:デフォルトの名無しさん
07/06/18 01:13:48
動きは変わらないが、
後者は関数呼び出しのオーバーヘッドが発生する。


683:デフォルトの名無しさん
07/06/18 01:20:02
関数本体の中にやたらと#ifdefなんかが入ってるのは、
あんまりいいコードとはいえないな。
「見づらくてしょうがない」というその感覚は限りなく正しい。
改善する方法をいろいろ考えるべきだな。


684:デフォルトの名無しさん
07/06/18 01:25:43
>>682
すいません

そのオーバーヘッドって遅くなるって事ですよね?
どの程度遅くなりますか?

>>683
ありがとうございます
パワハラ上司なんで聞くに聞けなくて
ここでたまに質問してます
見やすくしろって教えてくれたのもこのスレです


685:デフォルトの名無しさん
07/06/18 01:39:54
関数を呼び出すという処理は、それ自体スタック操作や
プログラムカウンタの移動などの処理が行われる。
だから、>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。
一方で>>677の方法だと、不要なときには関数呼び出し自体がなくなるので、
そういう心配がない。この方法が好んで使われる所以。

ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった
りしなければたいしたオーバーヘッドではないので問題にはならない。

でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって
美しくないとは思わないかい?


686:デフォルトの名無しさん
07/06/18 01:47:04
>>685
なるほど、詳しい解説ありがとうございます

せっかく用意したDebugPrintなのに
リリース等の時は実際は使わないのに
その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね
確かに綺麗じゃないですね

687:デフォルトの名無しさん
07/06/18 01:56:30
可変長引数マクロを使えるコンパイラならこんなこともできる
#if DEBUG
#define DebugPrint(...) fprintf(stderr, "\nDebugPrint : File %s - Line %d\n", __FILE__, __LINE__),fprintf(stderr, __VA_ARGS__)
#else
#define DebugPrint(...)
#endif

688:デフォルトの名無しさん
07/06/18 02:01:41
リリース版ではインライン関数にして、
コンパイラの最適化に期待する手もある。

689:デフォルトの名無しさん
07/06/18 02:02:11
/* 古いコンパイラで使える技 */
#if DEBUG
#define DebugPrint(args) printf args
#else
#define DebugPrint(args)
#endif

/* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */
DebugPrint(("%d\n", 1234));

690:デフォルトの名無しさん
07/06/18 02:03:19
古くなくてもできることないか?

691:デフォルトの名無しさん
07/06/18 02:03:47
>>687,>>689
おぉ、凄いですね

色々ご教授ありがとうございます

>>688
もし良ければその方法も教えて頂けないでしょうか・・・

692:デフォルトの名無しさん
07/06/18 02:16:33
1. インライン関数の定義を別ファイルに分ける

2. inline を INLINE マクロに置き換える
  INLINE マクロの定義は以下の通り(これは自分で定義する)

#ifdef NDEBUG
#define INLINE inline
#else
#define INLINE
#endif

3. リリース版の場合はヘッダファイルでインクルードする

#ifdef NDEBUG
#include "***.***"
#endif

4. デバッグ版の場合はソースファイルでインクルードする

#ifndef NDEBUG
#include "***.***"
#endif

693:デフォルトの名無しさん
07/06/18 02:16:49
#if DEBUG
#define DebugPrint printf
#else
#define DebugPrint (int)sizeof
#endif

694:デフォルトの名無しさん
07/06/18 02:17:09
C++なら、こんなことできるお

class DebugPrinter {
 DebugPrinter(const char *filename, int line) {...}
 void out(const char *format, ...) {...}
};

#if DEBUG
#define DebugPrint DebugPrinter(__FILE__, __LINE__).out
#else
#define DebugPrint
#endif

695:デフォルトの名無しさん
07/06/18 02:21:38
>>694 リリースでエラーにならないか?

696:デフォルトの名無しさん
07/06/18 02:30:28
>>695
エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。

697:デフォルトの名無しさん
07/06/18 02:30:35
>>695
たぶん、ならんよ。リリース時は
DebugPrint("%d, %d", f(x), f(y)); → ("%d, %d", f(x), f(y));
ってなるだけだから。

ただ、これがいやなら、>>693のようにsizeofしちゃうか、
dummyの関数作って
#if DEBUG
#define DebugPrint DebugPrinter(__FILE__, __LINE__).out
#else
inline DebugPrintDummy(const char *filename, ...) {}
#define DebugPrint DebugPrintDummy
#endif
って感じにしちゃうのがいいかもね

698:デフォルトの名無しさん
07/06/18 02:33:27
VC++ なら ((void)0) (VC6まで)か __noop (VC2002以降)にした方がいいね。

699:デフォルトの名無しさん
07/06/18 02:34:36
if(1); else に置換するという技もある。
多分最適化で消える。

700:デフォルトの名無しさん
07/06/18 02:39:27
>>697
関数 f が副作用を持ってたら問題があるな。

701:デフォルトの名無しさん
07/06/18 02:39:55
VC++ならTRACEで以上では?

702:デフォルトの名無しさん
07/06/18 02:41:56
皆さん
感謝、感激雨あられです

ちょっとF1見てる隙にこんなに書き込みが・・・

色々参考にさせてもらいます

703:デフォルトの名無しさん
07/06/18 02:52:34
何F1見てんだよこのヤロー

704:デフォルトの名無しさん
07/06/18 02:55:55
ああ、F1押すと長々と待たされた後で
役に立たないヘルプが出るよね

705:デフォルトの名無しさん
07/06/18 02:56:43
>>700
まあ、必要なら>>699で多分消せるじゃね?

>>701
TRACEは問題点は以下の3つ。
1,Windows限定
2,Boost.Formatなどの他の形式が使えない
3,出力先が変更できない
他にもあるかもしれんがよく分からん

706:デフォルトの名無しさん
07/06/18 02:57:53
必要ならって言うか、必須なんだぜ。

707:デフォルトの名無しさん
07/06/18 03:02:02
>>706
いや、そういう意味じゃなくて、
関数の副作用をどうしても消したいならって意味だお。
残したい場合も当然あるでしょ?

708:デフォルトの名無しさん
07/06/18 03:06:34
>>699 だと式のつもりが文になってしまうね。

709:デフォルトの名無しさん
07/06/18 03:10:09
ちょっと相談です。
言語はCでもC++でも構いません。
ちなみに開発環境はWin2000+VisualStudio2005です。

DLLで用意された、既存の関数 Func(char* str) を呼び出す必要があります。
この関数は、処理結果を文字列として str に返してくれます。
strに渡される文字列の長さは *不明* です。
DLL、および関数Funcの中身を弄ることは出来ないものとします。

この時、長さの不明なstrを、安全に処理するテクニックがあれば教えてください。


710:デフォルトの名無しさん
07/06/18 03:18:04
>>708
これならいけるかな?
#define DebugPrint 1 ? (void)0 : DebugPrintDummy

711:デフォルトの名無しさん
07/06/18 03:18:48
>>709
static str[100000000];
ではどうだ?
そうですか、足りませんかすいません。

712:デフォルトの名無しさん
07/06/18 03:19:32
>>709
Func を呼び出すことで、str の指すアドレスに
文字列が書き込まれるのであれば、安全に処理する方法は無いです

通常は、どの程度の長さが必要かを返す関数があったり、
渡したバッファの大きさを知らせる引数を付けたりします。

例えばFuncがファイル名を返す関数であるならファイルシステムが許す最大パス長などがあるので、
関数の仕様以外から最大の長さを決めることが出来るかも知れません

713:デフォルトの名無しさん
07/06/18 03:21:19
>>711
charが抜けた。すいません。

714:デフォルトの名無しさん
07/06/18 03:25:49
>>707
そういやそうだな。

715:709
07/06/18 03:28:23
即レスサンクス。
やっぱ無理そうですね。boostあたりでなんか何とかならないかなーとか淡い期待を抱いてましたが。

>711
とりあえず1万バイトくらいでがんばろうと思います。

>712
バッファサイズ関連のパラメータとか、実際に無いものは仕方ないんで諦めます(笑)


716:デフォルトの名無しさん
07/06/18 09:01:59
>>715
え、本当にどうしようもないの?
仕様上から決まる例(>>712 が言ってるMAX_PATH) とか、
NULL渡したら戻り値で必要length返るとかって挙動もないの?

そりゃDLLの設計が糞としか言いようがないが…

717:デフォルトの名無しさん
07/06/18 09:45:43
gets を安全に使うにはどうすればいいですか?
っていう質問と一緒だね。残念ながら無理だ。

718:デフォルトの名無しさん
07/06/18 10:59:41
仕様上から決まる例で32bit整数が最大値だとわかれば
常にその大きさの配列渡せば安心、かな

719:デフォルトの名無しさん
07/06/18 11:10:29
メモリ使い切って落ちるに1票

720:デフォルトの名無しさん
07/06/18 11:12:45
OS の API 直呼びで仮想メモリに頼ってしまう手もあるんジャマイカ?
それにしても 32bit 最大値はやりすぎだろうけど。

721:デフォルトの名無しさん
07/06/18 11:50:56
パイプとかその辺のOSの用意したプロセス間通信機能でどうにかするしかないんじゃね?

722:デフォルトの名無しさん
07/06/18 13:48:29
すいません、また質問させてください。

#include <iostream>
using namespace std;
class base {
public:
int a;
base(int x) {a=x;}
};
class sub1 : virtual public base {
public:
sub1() : base(0) {}
};
class sub2 : virtual public base {
public:
sub2() : base(0) {}
};
class sub3 : public sub1, public sub2 {};
int main() {
sub3 obj;
obj.a = 10;
return 0;
}


これがコンパイル通らないんですが、baseクラスに引数のないコンストラクタを
追加するとコンパイル通るようになります。virtual指定で継承すると、引数のない
コンストラクタを呼ぶというルールなのでしょうか?


723:デフォルトの名無しさん
07/06/18 14:17:15
#include <iostream>

namespace test_ {
  class base {
  public:
    base() { std::cout << "base::base()" << std::endl; }
    base(int x) { std::cout << "base::base(int x)" << std::endl; }
  };

  class derived1 : virtual public base {
  public:
    derived1() : base(0) { std::cout << "derived1::derived1()" << std::endl; }
    derived1(int x): base(x) { std::cout << "derived1::derived1(int x)" << std::endl; }
  };

  class derived2 : public derived1 {};
}
int main() {
  test_::derived2 a;
  return 0;
}
そのようですね
なので混乱を避けるために出来るだけデフォルトコンストラクタも定義しておきたいところです

724:デフォルトの名無しさん
07/06/18 14:53:20
>>722
>引数のないコンストラクタを呼
んでるじゃないか、自分で。
>sub3 obj;

725:709
07/06/18 15:00:50
>716
一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
3000とか4000とか飛んでるのを何度か見たことはありますが。

726:デフォルトの名無しさん
07/06/18 15:21:26
>>725
>一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
>3000とか4000とか飛んでるのを何度か見たことはありますが。

そりゃーDLLが糞でFAじゃね?
もしくは文書に反映されてないだけで仕様が4096に変わってるとか…。
仕様であるならstrncpyでもなんでもやって1024以内にすべきだし。
仕事絡みなら、バッファサイズ1024で書いて落ちる&再現性ありの状態を作って、クレームつけるとかかね。

まぁがんがれw

727:デフォルトの名無しさん
07/06/18 18:05:42
#include <iostream>
#include <string>
#include <boost/function.hpp>
#include <boost/bind.hpp>

class Writer { public: void run(const std::string& str) { std::cout << str << std::endl; } };

class Module1 {
public: typedef boost::function<void(const std::string&)> func_t;
private: func_t func;
public:
  Module1(func_t func_) : func(func_) {}
  void run() { func("message"); }
};

int main() {
  Writer w;
  w.run("test");

  using boost::bind;
  Module1 module(
    static_cast<Module1::func_t>( bind(&Writer::run, &w) )
    );
  module.run();
  return 0;
}
Writerクラスのrun()をコールバック関数として、boost::bindを使ってクラスModule1に渡します
Module1はboost::functionを用いてこのコールバック関数を保持します
これを実現したいのですがエラーどころか、コンパイラ(VC2005のcl.exe)が落ちます(汗
どうすればこの動作を実現できるんでしょうか?

728:デフォルトの名無しさん
07/06/18 18:09:09
自己解決しました
bind(&Writer::run, &w)→bind(&Writer::run, &w, _1)
引数とる場合はプレースホルダが要るんですね(汗

729:デフォルトの名無しさん
07/06/18 19:34:13
>>722
class sub3 : public sub1, public sub2
{
  sub3() : base(1) {}
};
仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている

730:デフォルトの名無しさん
07/06/18 20:43:11
こんばんは、皆さんに質問です
テンプレートの定数の引数をエレガントに記述する方法が分かりません

template <class Type, int Length> Array
{
   …Arrayの実装…
};

class Color : public Array< unsigned char, 3 > // RGBなので3
{
public:
   static const int ColorDimension = 3; // これは使えない…
   …Arrayの実装…
};

ここに出てくる3をエレガントに記述する方法が分かりません
グローバルで定義したりdefineディレクティブで定義したりは汚いですし、
無名namespaceやconst staticなグローバルの定数はヘッダなので避けたいです。

731:デフォルトの名無しさん
07/06/18 20:48:52
元々汚いんだからエレガントなんて求めなくて良い

732:デフォルトの名無しさん
07/06/18 20:50:52
少しはきれいに書ける方法としては派生元で定義してしまう方法ですが…

template <class Type, int Length> Array
{ …Arrayの実装… };

class ColorBase
{
public:
  const static int Dimension = 3;
}

class Color : public ColorBase, public Array< unsigned char, ColorBase::Dimension > // RGBなので3
{  …Arrayの実装… };

なんか微妙です…第一、継承する意味があるのかと…う~ん。
でもnamespaceだと関連性の記述があいまいです。

さらにはこんな方法もあるのですが…
class TColor<int Length> : public ColorBase, public Array< unsigned char, Length >
{  …Arrayの実装… };

typedef TColor<3> Color;

結局これでは定数をtypedefに移しただけで意味がなく、
const TColor::Dimension=3;
typedef TColor<TColor::Dimension> Color;
とまでして構造をめちゃくちゃにするのなら、
そのまま3って書いておいたほうがましな気がします。
何かよい方法があるのでしょうか?

733:デフォルトの名無しさん
07/06/18 20:53:19
>>731
では、その元々汚いものを綺麗にする方法を教えてください。

734:デフォルトの名無しさん
07/06/18 21:00:58
>>730
Arrayに手を付けていいなら、

template <class Type, int Length_> Array
{
public:
  static const int Length = Length_;
  //...
};

class Color : public Array<unsigned char, 3> // RGBなので3
{
public:
  static const int ColorDimension = Length;
  //...
};


735:デフォルトの名無しさん
07/06/18 21:10:10
int g1;int g2; int ga[10];
main(){
int li;int l2; int la[10]; int lb[10][10];

printf("%d\n", &g1);
printf("%d\n", &g2);
printf("%d\n", &l1);
printf("%d\n", &l2);

printf("%d\n", &l1-&l2);
}


↑のようなプログラムの
printf("%d\n", &l1-&l2);の表示結果の意味と
大局変数ga と局所変数la がどのように並んでいるのかを答えろって
課題なのですが、全くもって意味が分かりませんorz

ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
これはどういう事を意味しているのでしょうか?

ga[10]とla[10]に関してですが、これは[0]~[9]までの配列が用意されてるって事で良いんですかね?

ヒントの方よろしくお願いしますorz



736:デフォルトの名無しさん
07/06/18 21:14:01
なぜに&

737:デフォルトの名無しさん
07/06/18 21:15:51
>ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
>これはどういう事を意味しているのでしょうか?
「鼻から悪魔がでてきて私をたぶらかした結果である」

738:デフォルトの名無しさん
07/06/18 21:16:17
すみません、いくつか質問させてください。
1、ArrayクラスのLength変数はテンプレートが使用されたときに初期化されるのですか?
  int i = Array<int, 3>::Length;
  とかやったら(この例では最適化はされるでしょうが)アクセスしたその瞬間に
  初期化が行われるのでしょうか?

2、int i = Color::ColorDimension;
  とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?

ちなみに、せっかく答えていただいたのに恐縮ですが、
class Color : public Array<unsigned char, 3>
の、3がマジックナンバーとなっているのを何とかしたかったのですが…
やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。

739:730
07/06/18 21:18:19
あ、私は730で>>734さんに対してのコメントです

740:デフォルトの名無しさん
07/06/18 21:20:20
>>735
ヒント:課題スレではない


しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。


741:デフォルトの名無しさん
07/06/18 21:23:23
>>735
>printf("%d\n", &l1-&l2);の表示結果の意味と
ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
配列を指すポインタであれば、例えば
&la[4] + 3 = &la[7] であり、逆に &la[7] - &la[4] = 3 なわけだが
配列でもなんでもないポインタの引き算に意味なんかない。
メモリ上、int のサイズ分離れた場所に割り当てられていると
答えさせたいんだろうが、課題として激しく相応しくない。
>[0]~[9]までの配列が用意されてるって事で
おk。

742:デフォルトの名無しさん
07/06/18 21:27:19
クラスを増やしたり、
define使ったり、
グローバルなenum使ったり
namespaceを使ったり
できないのなら、それは不可能ってことだよ。
別にグローバルにColorDimensionを定義してもいいじゃん。

743:デフォルトの名無しさん
07/06/18 21:44:32
ここは格好良く可変引数取れるArrayにして
Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな
俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど

744:デフォルトの名無しさん
07/06/18 21:49:54
>>741
理論上は意味ないかもしれないけど、
実装を見るというのなら、意味ないこともないような気がしないでもない。

745:デフォルトの名無しさん
07/06/18 21:51:47
>>736
頭のおかしい講師に言ってくださいよorz
ほんと変な人で・・・
殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで
授業を進めるんです。

>>740
神様有難う。スレ違いだったんですか・・・。申し訳ないです。
&l1-&l2の件、理解しました。

>>741
神様レス有難う。
ga[10]とla[10]の件理解しました。


>ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
やっぱり、おかしいですよねえ??
Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。



746:730
07/06/18 21:54:59
>>742
グローバルの名前空間は絶対に汚せない環境というのがございまして…
#define COLOR_DIMENSION 3
class Color : public Array< unsigned char, COLOR_DIMENSION > // RGBなので3
{
  …Arrayの実装…
};
#undef COLOR_DIMENSION
とかwww、もう何がなんだか…
#undef _COLOR_DIMENSION 3
あたりで我慢っすかねぇ

>>743
しかし、ArrayはColorとはあんまり関係なかったりして…
そもそも、public継承なのかprivate継承なのかという問題までありまして…

template <int Dimension = 3> class Color : public Array< unsigned char, Dimension > // RGBなのでデフォルトは3
{
public:
   Color() { assert(Dimension==3); }
}
とか…いや、assertで比較している3がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも

747:594デフォルトの名無しさん
07/06/18 21:57:33
C言語の全角半角処理について二点程分からないので、宜しかったらアドバイスを頂けたらと思います。
仕様してるのはVisualStudio2005で、プロジェクトはWin32コンソールアプリケーションのMFC付与です。
(CDatabaseクラスとかCRecordsetクラス等も使うこともできます)。
現在、入力された文字列に「①全角記号、半角記号、全角数字、半角数字を一文字でも含むならエラー」
(つまり①の処理は漢字や平仮名カタカナや英字は入力出来ます)
という処理と、「②全角半角のハイフン以外の全角半角記号を一文字でも含むならエラー」
(②は、①の通過可能な条件に、全角半角数字が含まれます)
という処理と、「③全角半角の数字と全角半角のハイフンはOK」という処理の3つのロジックを組んでます。
半角記号や半角数字はASCIIコードを見ながら「for文で文字列を回してコードの中の記号を表す数字ならエラー」というロジックで
どうにかなってますが、②のハイフンの判別ができずに詰まってます。
使ってるソースは、
URLリンク(kansai2channeler.hp.infoseek.co.jp)
こちらの掲示板に
書き込んでおきます。
長くなりそうなので、続きの質問文はそっちのほうに書きます。
もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。

748:デフォルトの名無しさん
07/06/18 21:58:46
>>745
とりあえずグダグダうるせえ。




749:デフォルトの名無しさん
07/06/18 22:00:47
>730
というか、継承では"Color is an Array"が成立するかという問題がある
ので、素直に包含関係にしてしまえ。

750:デフォルトの名無しさん
07/06/18 22:03:07
>747
ShiftJISの仕様についてもうちっと調べるべき、かな。
まあ、一旦wcharに変換して扱う手もあるけどネ。

751:デフォルトの名無しさん
07/06/18 22:17:19
クラスと構造体の違いはデフォのアクセス制御以外に何かありますか?
継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?

752:デフォルトの名無しさん
07/06/18 22:21:47
classでレガシーな初期化はできなかった希ガス。
class Foo {int bar; int barz;} foo = {1, 2}
できたらごめん。

753:デフォルトの名無しさん
07/06/18 22:39:10
>752
全メンバをpublicにすればコンパイルできた。
まあ、当然といえば当然か。

754:デフォルトの名無しさん
07/06/18 22:49:14
サンクス。
しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。
内緒にしとくもんでもなかろうて。

755:デフォルトの名無しさん
07/06/18 23:00:50
質問
 1. 死ぬまでenumハックを使うべきなのか。
 2. 死ぬまでexportは使ってはならないのか。

756:デフォルトの名無しさん
07/06/18 23:07:21
>>755
1. そうです
2. そうです

早死にしないように気をつけて

757:デフォルトの名無しさん
07/06/18 23:10:24
1 VC6を窓から投げ捨てりゃいいんじゃね
2 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね

758:デフォルトの名無しさん
07/06/18 23:16:47
>>754
URLリンク(www.jisc.go.jp)


759:デフォルトの名無しさん
07/06/18 23:44:18
>738
初期化は実行時に起こる。
テンプレートが使用された時、というのはコンパイル時の話。

件の場合、定数化されてしまうというのを無視すると

int i = Array<int, 3>::Length;

とすると、Array<int, 3>::Length に相当する定義がコンパイル時に生成される。
で、その生成されたソース中に初期化が存在するから、コンパイルした結果のコードでも
初期化が実行される。タイミングは普通の初期化と一緒で main 到達前。

>2、int i = Color::ColorDimension;
>  とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?
実際には Color::ColorDimension は定数と見なされるので Array と無関係に単なる 3 として評価されると思われ。

760:デフォルトの名無しさん
07/06/19 06:38:16
いくつかのサイトで見られたのですが、
STARTUPINFO si = {sizeof (STARTUPINFO)};
は何をやっているんでしょうか?
STARTUPINFO si = {0};
や、
STARTUPINFO si;
memset(&si,0,sizeof (STARTUPINFO);
si.cb = sizeof(STARTUPINFO);
などなら分かるのですが。

761:760
07/06/19 07:24:58
あ、すみません。
構造体の第一メンバをsizeof (STARTUPINFO)で、
残りのメンバを0で初期化している事が分かりました。
値を設定してないと0で初期化されるようですが、
STARTUPINFO si = {};
のような使い方では0で初期化される保証はないのでしょうか?


762:デフォルトの名無しさん
07/06/19 07:59:43
>>760
定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。
また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。

>STARTUPINFO si = {};
コンパイル通った?

763:760
07/06/19 08:56:24
はい。VC2005でコンパイルが通り、結果も0で初期化されてることを確認しました。
コンパイル通らない可能性もあるんですね。それなら使いません。

あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると
「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。
これはmemset()が使われてるということなんでしょうか?

764:デフォルトの名無しさん
07/06/19 08:56:28
>>761
全部省略できるのは C++ だけ。

765:デフォルトの名無しさん
07/06/19 09:59:42
>>763
そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。

766:デフォルトの名無しさん
07/06/19 10:21:17
すみません、このスレでいいのか迷うんですが、
Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり
開始したりする方法を教えて下さい。
宜しくお願いします。

767:760
07/06/19 11:07:01
>>764
おお、なるほど。C++でした。
>>765
ありがとうございます。
みなさん、どうもありがとうございました。

768:766
07/06/19 12:48:11
解決しますた

769:デフォルトの名無しさん
07/06/19 12:57:26
今現在BMPの画像をexeファイルで表示する方法をやってるのですが
よろしければ必要最低限のプログラムのソースを教えていただけませんか?
よろしくお願いします。

770:デフォルトの名無しさん
07/06/19 13:01:28
>>769
>>1
>ただしその場合、質問者は必ず、環境を書きましょう。

771:デフォルトの名無しさん
07/06/19 13:10:27
>>469 とりあえずこれで"今現在BMPの画像"を表示できるプログラムができる
#include <stdio.h>

int main(){
printf("今現在BMPの画像");
return 0;
}

772:デフォルトの名無しさん
07/06/19 13:11:07
どうせWindowsだろ
猫でも読んどけ

773:デフォルトの名無しさん
07/06/19 13:47:09
丸投げは宿題スレ以外はだめ
今どこまで理解しててどこら辺がわからないのか書け

774:デフォルトの名無しさん
07/06/19 14:38:22
>>729
ありがとうございます。
なるほど、そうなってるんですか。。
しかし、以下のソースをコンパイルしようとしたところ、
sub3クラスでの仮想基底クラスのコンストラクタ呼び出し
(base(33)の呼び出し)はコンパイルを通すために必須でした。
ということは、
ー仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
+仮想基底クラスのコンストラクタは、多重継承になるクラス以降最派生クラスまで、毎クラスで指定することになっている
ということなのでしょうか?
(有効なのは最派生クラスでの呼び出しだけみたいですが、、、)



775:デフォルトの名無しさん
07/06/19 14:46:23
すいません、ソース貼り忘れた

#include <iostream>
using namespace std;
class base {
public:
int a;
base(int x) {
a=x;
cout << "x=" << x << endl;
}
};
class sub1 : virtual public base {
public: sub1() : base(0) {}
};
class sub2 : virtual public base {
public: sub2() : base(0) {}
};
class sub3 : public sub1, public sub2 {
public: sub3() : base(33) {}
};
class sub4 : public sub3 {
public: sub4() : base(1) {}
};
int main()
{
sub4 obj;
obj.a = 10;
return 0;
}

776:デフォルトの名無しさん
07/06/19 14:49:43
win32 SDKでwindowsプログラムの勉強をしているのですが、windowsプログラムを作製するにあたり
win32 apiとc言語標準ライブラリに同じような関数があった場合、Windowsではapiの方を使ったほうがよいのですか?
また、両者の使い分け基準って何かあるのですか?
たとえば、CopyMemoryとmemcpyは同じことをする関数なんですけど..どっち使うのべきか

777:デフォルトの名無しさん
07/06/19 14:56:41
環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。
趣味でやるなら好みでいいんじゃない?

778:デフォルトの名無しさん
07/06/19 16:30:34
try catchでわざと例外を出す方法を教えてください
今は変数を0の入った変数で割って例外を出しています

779:デフォルトの名無しさん
07/06/19 16:40:49
try catchじゃ例外は出せない

780:デフォルトの名無しさん
07/06/19 16:42:51
tryの中でcatchに飛ばす方法を教えてください

781:デフォルトの名無しさん
07/06/19 16:48:03
「C++ 例外」でググれ

782:デフォルトの名無しさん
07/06/19 17:01:37
このソースで
LINK : warning LNK4039: /SECTION オプションで指定されたセクション '.share' は存在しません。
がでるんだけど、何が悪いか教えてください。
どうやったらwarning消せますか。ちゃんと.shareが使える形で。

#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
HANDLE x = NULL;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

783:デフォルトの名無しさん
07/06/19 17:24:35
>>782
とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1

784:デフォルトの名無しさん
07/06/19 17:35:43
捕捉でごめんなさい。
debugだとでなくて、releaseだとでるみたい。

785:783
07/06/19 18:05:35
releaseでもでなかった printfでx見たいからコンソールにした 複数プロセス起動させるとxの値が増加したからshareされてると思う@vc7.1 winxp sp2
#include <stdio.h>
#include <windows.h>
#pragma comment(linker, "/SECTION:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()
int main(int ac, char** av)
{
 printf("%d\n", x);
 x += 1;
 MessageBox(NULL, TEXT("Press Enter key to continue"), TEXT("TINKO"), MB_OK);
 return 0;
}

786:デフォルトの名無しさん
07/06/19 18:59:16
>>785
まじですか。
こちらの環境はVS2005のExpress。
調べたらこんな差がわかった。でも、なんでかは不明。初期化されないからと推測。

コンパイルエラーが出ないソース。
#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 ++x;
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

つづく

787:デフォルトの名無しさん
07/06/19 19:01:28
コンパイルエラーが出るソース。
#include <windows.h>

#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
 MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
 return TRUE;
}

++x; がないだけ。
↑のは ×初期化されない ○一度も利用されることがない
かと思っています。

788:デフォルトの名無しさん
07/06/19 20:14:08
最適化で消されてるだけじゃないかな
/Faで.asm見ればわかるよ

789:デフォルトの名無しさん
07/06/19 22:00:05
スカトロCGを激しく集めるスレver27
スレリンク(ascii2d板:537番)

537 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/06/19(火) 21:47:45 ID:C++ilogK
>>528

 試 し た の か ? 

IDがC++


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch