スレを勃てるまでもないC/C++の質問はここで 2at TECH
スレを勃てるまでもないC/C++の質問はここで 2 - 暇つぶし2ch400:デフォルトの名無しさん
07/06/27 10:24:16
そうみたいです・・読みずらいってレベルじゃないですね。
一回全部のIFを書き直してみたんですがいくつか残して戻しましたよorz
ちなみに分岐はこんな風に書きました
A ? 処理:
B ? 処理:
C ? 処理: 0;

何もしないっていう処理は適当に当てはめたんですが
 0; で良いんでしょうか?

なんかこの書き方面白すぎてはまりそうですw
(もう既にはまってるか)

401:デフォルトの名無しさん
07/06/27 10:28:36
>>400
なるほど、処理の分岐に三項演算子を使いたかったのか。
意味的にそんな阿呆なことをする子には教えてあげません。

402:デフォルトの名無しさん
07/06/27 11:38:53
覚えたての言葉を使いたがる子供みたい

403:デフォルトの名無しさん
07/06/27 12:04:58
自分でも、埋め合わせに 0; を思いついた時にこんな馬鹿な話が・・・って思いましたw
でもそんないじわるされるとは予想外でしたwwっうぇw
と・・・こんな風にかく人少ないと思うので
誰かに指摘されるまでは0;やNULL;って書きます
いろいろありがとうございました

404:デフォルトの名無しさん
07/06/27 14:49:10
だから、阿呆だって指摘されているだろう。これ以上何を指摘されたいんだ?

405:デフォルトの名無しさん
07/06/27 15:59:22
ほうっておこうや
時に暖かく見守る事もしつよう(←なぜかry)な事なんだ

406:デフォルトの名無しさん
07/06/27 19:45:15
389みたいなやつを見ると、コーディング規約で3項演算子の使用を禁止したくなる気持ちが、よく分かる。


407:デフォルトの名無しさん
07/06/27 20:17:06
ふっふっふぅ、漏れの策定したコーディングガイドでは三項演算子の「代入用途以外の使用」を禁止している。

408:デフォルトの名無しさん
07/06/27 20:22:17
それよりも条件演算子の重ねがけを禁止すべき
こんなコードを書かれたらたまらん
x = p1 ? p2a ? at : af : p2b ? bt : bf; 

409:デフォルトの名無しさん
07/06/27 21:20:16
きちんとインデントで整理できてれば見やすくないか?
x = p1
  ? p2a
    ? at
    : af
  : p2b
    ? bt
    : bf;


410:デフォルトの名無しさん
07/06/27 21:46:34
でも条件とそれに対応する処理を列挙していくような書き方って
関数型プログラミング言語っぽくて面白い気がする

411:デフォルトの名無しさん
07/06/27 22:22:31
>A ? TRUEの処理 : FALSEの処理;
こう書いている時点で勘違いしているとおもう。
式1 ? 式2 : 式3

式1を評価して0以外なら式2の評価した値が、0なら式3を評価した値が
全体の評価結果になる。

>何もしないっていう処理は適当に当てはめたんですが
> 0; で良いんでしょうか?
こういう発想が出る時点で三項演算子を使うべきではない。

412:デフォルトの名無しさん
07/06/27 22:52:05
>>410
if文でいいじゃないか。

413:デフォルトの名無しさん
07/06/27 23:27:28
>>409
そこまでするくらいならif文でいい希ガス。

414:デフォルトの名無しさん
07/06/28 09:59:27
常にif文でいいじゃないかと言われる運命だなw
マクロで使用して、何をするかがマクロ名で明確にわかるときに使うかなあ。

415:デフォルトの名無しさん
07/06/28 19:56:25
クラスがなかなか覚えられません(´・ω・`)
「はじめてのC++」でもかなりのページしめてるけど、やっぱりそれぐらい大切ってこと?

416:デフォルトの名無しさん
07/06/28 20:22:14
クラス使わないなら C でも使っとけ、って言われるくらい。

417:デフォルトの名無しさん
07/06/28 21:09:18
>>415
「覚える」という言葉を使う時点で、間違っているのですよ。

「覚える」というのは、
セックスで例えるなら、ハウツー本を読み漁るだけの童貞君。

プログラミング言語は使いこなしてナンボ。
セックスで例えるなら、百人切りで鍛え上げたテクニック。


418:デフォルトの名無しさん
07/06/28 21:26:31
百人と浅い付き合いをするくらいなら、一人と深く付き合った方がより使いこなせると思うのだが。

419:デフォルトの名無しさん
07/06/28 21:40:31
C++でSTLを使うのは非常に上手だが、STLを使うことしかできない
そういう人みたいな感じになるぞ。

420:デフォルトの名無しさん
07/06/28 22:14:33
一人と深く付き合った事がある加藤鷹が理想

他の女に乗り換える時に楽

421:デフォルトの名無しさん
07/06/28 22:18:34
ちんこが持たねぇっす

422:デフォルトの名無しさん
07/06/28 22:43:11
C++でSTLとboostを非常に上手く使える人間だったら十分問題ないと思うけど

423:デフォルトの名無しさん
07/06/28 22:47:03
STLを使う/使える案件しかやらないのなら、いいんだよ。



424:デフォルトの名無しさん
07/06/29 00:24:37
ありがとう。やっぱりクラスは大切なのか
これからは積極的に使って身につけていくことにします(`・ω・´)

425:デフォルトの名無しさん
07/06/29 11:58:49
つーかいまどきC++は生産性が悪すぎ。

426:デフォルトの名無しさん
07/06/29 12:07:56
言語間での生産性の差ってそんなに大きくないだろう

427:デフォルトの名無しさん
07/06/29 12:23:40
全ての状況下に於いて、生産性だけが重要とは限らない

428:デフォルトの名無しさん
07/06/29 12:42:54
C++でtemplate meta programmingやマクロを駆使して書いたプログラムが強いところって何でしょう?
「皆が読めなくなるからやめろ、STLやtemplateも出来れば使うな、boostなんて以ての外」
って言うところも多いと聞きますが…

429:デフォルトの名無しさん
07/06/29 13:13:27
STL程度で「皆が読めなくなる」なんて、三流以下のソフトハウスでもなければ言われないと思いますが。

430:デフォルトの名無しさん
07/06/29 13:31:26
三流以下のソフトハウスが多いことの証左なんだろうさ。
ところで、>>428 の
>~が強いところって何でしょう?
が何を訊いてるんだかよく判らない。
「~に強い会社ないし集団はどこでしょう?」
の意だろうか。

431:デフォルトの名無しさん
07/06/29 15:12:02
STLの実装にバグがあってトラぶった時、STLなんて使うからだと言う人がいた。
たしかに、使ったSTLの実装は古く、メンテナンスされていないものだった。
だがしかし、その人が書いたSTL相当の独自のクラスにもバグがあった。

ちなみに一流の現場では、STLは使わず、もっと良いテンプレートライブラリを使うと思う。
STLはC++標準に入ってはいるものの、最善策ではないから。

432:デフォルトの名無しさん
07/06/29 16:37:08
C言語で、配列の個数を外部から入力することはできますか?
例えばa[n]という配列に対しnをscanfでキーボードから読みけませて、要素がn個の配列を作るといった感じです。

433:デフォルトの名無しさん
07/06/29 16:49:32
C99じゃなけりゃ、m(c)allocやalloca使うしかないかな

434:デフォルトの名無しさん
07/06/29 18:07:51
>>428
利点を挙げるとしたら、高度の抽象化に役立つということ。
問題は、それを必要とされない、あるいは必要性が理解されないということ。

435:デフォルトの名無しさん
07/06/29 21:28:52
>>432
おれがこの前教えてもらった方法
int *a,n;
scanf("%d",&n);
a=new int [n];//a[0]~[n]まで確保
Cだと無理なのかな

436:デフォルトの名無しさん
07/06/29 21:44:34
STLやtemplateもboostもstd::もしらないけどc++動かせるよ
どんな利点があるのか教えろ

437:デフォルトの名無しさん
07/06/29 21:46:11
つか、進化した言語の方が優れているなら、アセンブラもC言語も絶滅しているはずだろう
しかししてない
だから使える機能を使えばいい

438:デフォルトの名無しさん
07/06/30 00:59:45
>>436
delete[]のような後処理が要らないしrealloc相当のことができる
std::vectorが取っ掛かりには便利。
Boostは正規表現が実用的だろう。

439:デフォルトの名無しさん
07/06/30 05:31:00
>>438
そんなのはSTLの専売特許ではないしぃ。


440:デフォルトの名無しさん
07/06/30 15:41:07
標準もしくは準標準ってところが大事なのかと

441:デフォルトの名無しさん
07/06/30 19:26:00
STLがどんなにクソッタレでも、C++標準に入っている以上、しかたない。

あの万能ナイフっぷりには呆れるぜ。

442:デフォルトの名無しさん
07/06/30 20:33:49
こんな風にC++の標準関数まとめてくれてるサイトない?

URLリンク(cham.ne.jp)

443:デフォルトの名無しさん
07/06/30 22:26:36
ある

444:デフォルトの名無しさん
07/06/30 22:30:38
本スレテンプレのコレとか
URLリンク(www.cppreference.com)

445:デフォルトの名無しさん
07/06/30 22:48:49
>>439
436が使ったことないって言うから、
早速使えそうなものを薦めてみた。
うんちく語っても仕方がないと思ったし。

446:デフォルトの名無しさん
07/06/30 23:05:10
じゃあSTLはまぁそこそこ使える、かつ稲葉氏のページにあるものは一通り知っている
っていう人に対してお勧めのboost library(sandbox含む)を教えてください

447:デフォルトの名無しさん
07/07/01 09:48:04
STLは機能が多すぎて、つまり、注意事項が多すぎて、怖い。

オブジェクトを手っ取り早く永続化したくて、
一定のアドレスにオブジェクトを配置する、
カスタムなヒープを使う、カスタムなアロケータを
使うように指示して、それがちゃんと使われるのか、とか。


448:デフォルトの名無しさん
07/07/01 10:07:28
>>447
そんだけなら単にSTLコンテナ宣言してる場所をgrepすりゃいいだけじゃね
つか、STLに限った話じゃ全然ねー

STL使わんでも普通にmalloc()だのnewだの使われたくないんだろ?



アホじゃないの?

449:デフォルトの名無しさん
07/07/01 11:23:31
>>447
アロケータは使い方を知らないとハマるわな。

450:デフォルトの名無しさん
07/07/01 11:30:39
実装によってはアロケータをガン無視しちゃってるのがなかったっけ

451:デフォルトの名無しさん
07/07/01 13:23:33
setやmapをそのままシリアライズしたいって思うことあるよなぁ。

iteratorで舐めてファイルに書きだしたものを、
ファイルから読んで1つずつinsertするのは、
なーんか無駄っぽいんだ。


452:デフォルトの名無しさん
07/07/01 16:23:59
ライブラリにしとけばええやん。

453:デフォルトの名無しさん
07/07/01 20:32:59
>>452
そういうことではなくて、B木の構築コストがもったいない。


454:デフォルトの名無しさん
07/07/05 11:19:09
ほんと初歩的な事なんですが・・・
C言語には行とかいうのは関係なくて全部一行で書けるって聞いたんですが
#include<stdio.h> main()~
っていうのはどうやっても出来ないんでしょうか?

455:デフォルトの名無しさん
07/07/05 11:40:20
#include はC言語じゃなくてプリプロセッサ用

456:デフォルトの名無しさん
07/07/05 13:57:29
>>455
プリプロセッサっていうのは、コンパイルの時の処理ですよね
一行ずつ読み込む・・・から、
やっぱ、無理って事でしょうか?

457:デフォルトの名無しさん
07/07/05 14:08:36
ヘッダファイルの中から使う分だけ直接持ってくりゃいいべ

458:デフォルトの名無しさん
07/07/05 17:44:03
>>457
その手が、、、あった。。。ありがとうございました

459:デフォルトの名無しさん
07/07/05 22:25:40
標準ライブラリのヘッダの中身って結構処理系独自拡張のオンパレードだから、
あまりおすすめできないけどな。

460:デフォルトの名無しさん
07/07/05 22:26:50
7行プログラムとかlisp500とか書きたいんだろうか

461:デフォルトの名無しさん
07/07/06 00:07:56
プロトタイプと構造体とtypedefくらいだべ

462:デフォルトの名無しさん
07/07/08 06:21:10
大きな配列を確保する際、newやmallocだと確保できるのに、
プログラム中に最初から
double a[100000]
のように書くと実行時に確保できない旨のエラーがデルのは何故ですか?

463:デフォルトの名無しさん
07/07/08 06:41:41
スタック領域

464:デフォルトの名無しさん
07/07/08 06:51:11
>>462
staticでもつければ?

465:デフォルトの名無しさん
07/07/08 13:20:28
>>462
スタック領域が足りなくなるから。
環境によってはスタック領域を大きくできるぞ。

466:デフォルトの名無しさん
07/07/09 11:12:57
スタックとヒープの違いを把握しましょう

467:デフォルトの名無しさん
07/07/09 13:51:14
ご教授お願いします。

コード
URLリンク(kansai2channeler.hp.infoseek.co.jp)

不正なbreakですとなってしまいます。なぜでしょうか?

468:デフォルトの名無しさん
07/07/09 13:53:55
>>467
なんちゅうスタック破壊

469:467 ◆4usmhdjocU
07/07/09 14:01:12
すみません詳しく教えていただけると助かるのですが・・・

470:デフォルトの名無しさん
07/07/09 14:01:25
誤>printf("New string --->%s\n,tbl");
正>printf("New string --->%s\n",tbl);


471:デフォルトの名無しさん
07/07/09 14:01:59
>>467
このスレで何回も言ってることだが・・・。

・エラーメッセージの類いは、一字一句そのままコピペすること。
往々にして勝手に要約して端折った部分に大切な情報がある。
それが大切だと分かってないから、問題の原因が理解できない。

・デバッガでステップ実行すること。

がんばれ。

472:デフォルトの名無しさん
07/07/09 14:03:23
>>470
あーあ、答え書いちゃった。

プロセスを教えずにリザルトだけ教えていたら、
いつまでたっても467はヒヨコのままだぞ。

473:デフォルトの名無しさん
07/07/09 14:04:41
>>467
・forの書き方に問題があるから、不正なbreakになる。
・>468も指摘しているが、printf()の使い方にも間違いがある。

474:デフォルトの名無しさん
07/07/09 14:04:41
>>469
getsは危険です絶対に使ってはなりません。

475:467 ◆4usmhdjocU
07/07/09 14:07:17
C:\Documents and Settings\cp1\デスクトップ\testplog\test.cpp(39) : error C2043: 不正な 'break' です。
cl.exe の実行エラー: error C2043: 不正な 'break' です。


>>470
 ありがとうございます
>>471,472
わざわざ自分のことを考えていただきありがとうございます。
 しかし、エラーがでてなおりません。
 次はヒントでいいので教えていただけませんか?

476:デフォルトの名無しさん
07/07/09 14:07:40
標準関数でtolower()ってのがあるから、使う時はtolower()使ってね☆

477:467 ◆4usmhdjocU
07/07/09 14:08:19
とてつもない初歩的なミスでした・・・

聞いていたじぶんがはずかしくなりました><

お手数かけました

478:デフォルトの名無しさん
07/07/09 14:08:45
>>475
セミコロン


getsとかtolowerとか、練習で問題文写してるんだろうから
あんまり言うとわからなくなるぞ

479:467 ◆4usmhdjocU
07/07/09 14:08:52
>>476
勉強します^^

480:デフォルトの名無しさん
07/07/09 14:09:27
for(i = 0;i < max;i++);


481:467 ◆4usmhdjocU
07/07/09 14:10:14
>>478,480

ありがとうございました

482:デフォルトの名無しさん
07/07/09 14:26:19
そしてthruされる>473、>474……

483:デフォルトの名無しさん
07/07/09 14:52:12
LINK : fatal error LNK1104: ファイル "win32.lib" を開けません。
link.exe の実行エラー

これってどうやれば直りますか

484:デフォルトの名無しさん
07/07/09 14:52:58
そもそも、

固定の文字列を出力するのにprintfを使う
getsを使う

などという、
見習ってはいけない「お手本」を載せている、
クソッタレ参考書がいけないと思うんだよね。

いったい何十年前の本なんだよ、って感じ。

485:デフォルトの名無しさん
07/07/09 14:54:44
>>483
1. ライブラリ名が正しいか確認する
2. リンカのマニュアルを確認する


486:デフォルトの名無しさん
07/07/09 15:18:44
>>484
固定の文字列を出力するのにprintf()を使う以外の見習うべきお手本は何?

487:デフォルトの名無しさん
07/07/09 15:27:00
puts()

488:デフォルトの名無しさん
07/07/09 15:37:30
>>487
puts()に替えたら改行しちゃいました。どうしたらいいでしょう。

489:デフォルトの名無しさん
07/07/09 15:42:43
fputs()

490:デフォルトの名無しさん
07/07/09 15:49:06
どうせコンパイラが最適化でputs()に置き換えたりするんだからprintf()でいいじゃん。

491:デフォルトの名無しさん
07/07/09 15:56:06
そんなコンパイラはgccぐらいしか知らんが

492:デフォルトの名無しさん
07/07/09 16:10:55
打つ量の削減とかそういう理由で使い分けてる

493:デフォルトの名無しさん
07/07/09 16:19:48
わかっていない人のために説明すると・・・

printfの第一引数は、あくまでも書式を指定するための文字列である。
だから、
printf("100%元気") ;
なんてのは大間違いなわけ。

あえてprintfで任意の文字列を出力したいのであれば、
printf("%s", "100%元気") ;
とすべき。

そんな間抜けな間違いはしないよ、というかもしれないが、うっかりミスは恐ろしいし、
void PrintMessage(char* szMessage) {
printf(szMessage) ;
}
なんてことをやったりしたら、収拾がつかなくなる。

494:デフォルトの名無しさん
07/07/09 17:06:51
まあ
printf("%s\n", s);
なら
puts(s);
一択だわな。タイプ量が少なく効率も良い。
printf("%s", s);

fputs(s, stdout);
にするかどうかは気分次第だな。

改行を打ち出す時は
puts("");
が短いが、俺は
putchar('\n');
を使うことがおおいな。

495:デフォルトの名無しさん
07/07/09 17:11:41
inline void NEW_LINE() {
putchar('\n');
}

::NEW_LINEみたいにしたり(w

496:デフォルトの名無しさん
07/07/09 17:13:03
>>495
賢いのう、ワレ!

497:デフォルトの名無しさん
07/07/09 18:44:07
>>484
> いったい何十年前の本なんだよ、って感じ。

昔のBASICなどのPRINTと同じ感覚の老人が書いた本だろ。

498:デフォルトの名無しさん
07/07/09 18:46:41
printf(name) ;
printf("\n") ;
printf("ほげほげを入力してください。\n") ;
printf("入力できる数値の範囲は、fooからbarです。\n") ;

こんなの見たら卒倒するよ。

499:デフォルトの名無しさん
07/07/09 19:20:09
JavaやってからC++に戻ってくると>>498みたいに書きたくなる。

500:デフォルトの名無しさん
07/07/09 19:30:03
getsはともかく、printfは別にいいだろ
char配列そのままprintfに渡すのはまずいけど、
文字列リテラルなんかコンパイラによってはputsに置き換えたりする事もある

501:デフォルトの名無しさん
07/07/09 20:20:28
ループ成立w

502:デフォルトの名無しさん
07/07/09 20:32:46
別にprintfでもputs/fputsでも、そんなん好みの問題やん。

503:デフォルトの名無しさん
07/07/09 23:25:28
UDPの通信メッセージの最大長っていくつですか?(socket、bind、sendtoを使います)

SOCK_DGRAMで作成した場合は、固定長最大メッセージをサポート、
ってなってるから、約64KBまで送信できると思うのですが、イーサネットの
フレーム長が1500byteまでとか言う風に書いてあって、よく分からないのです。

オフィス用の一般的なPC(WinXP SP2、10BASE-T)の環境でテストプログラムを
作ったところ、一応60KBちょいまで送受信できたので64KBまでOKなのかな?

あと、さらに質問で、64KBまで送受信できるけどXXbyteを超えると信頼性が
著しく下がるとかありますか?
また、上のほうでも書きましたが、イーサネットで1500byteってのはアプリケーションでは
意識してないけれど、ネットワーク層(?)とかデータリンク層(?)とかのレイヤが
勝手にセグメント化してくれてるのでしょうか?

長々として申し訳ないのですが、どなたかお助けを。

504:デフォルトの名無しさん
07/07/10 00:05:05
TCP/IPではパケットサイズを期待してはいけない。それは下位層によって1バイトずつに分断されているかもしれない。
UDPではパケット到来順序を期待してはいけない。それは経路によって順不同に並べ替えられているかもしれない。
だっけ?

505:デフォルトの名無しさん
07/07/10 08:40:13
>>503
> UDPの通信メッセージの最大長っていくつですか?(socket、bind、sendtoを使います)

環境による。

通信バッファが小さくて長いUDPパケットを受け取れない人もいるし、
なかには、受け取れないどころか即死するヘボ実装の人もいる。

両側とも自分で書いたプログラムなら、通信の最初に、
送受信できる最大サイズを調べるためのメッセージ交換を入れたらどうかな。
最初は128バイトあたりで、送受信を確認できたら、サイズを2倍にしていくの。

> イーサネットのフレーム長が1500byteまでとか言う風に書いてあって

UDPパケットが長い場合、複数のイーサネットフレームに分割して送受信される。

> 64KBまで送受信できるけどXXbyteを超えると信頼性が著しく下がるとかありますか?

パケットサイズが可変なのに対して、パケットのCRCチェックサムのビット数が固定なので、
長さに比例してエラー検出能力が下がっていくけど、あんまり気にしない。
信頼性を気にするなら、更に自前で別のチェックサムを付けてUDPに載せるといい。


506:デフォルトの名無しさん
07/07/10 19:17:26
>>503>>505は釣りかい?
マジなら>>505はもう一度勉強な。

それから、UDPの送信フレーム数そのものに制限は無い。
どこで知ったかしらないが、64kbyteなんて制限はない。
恐らくAPIレベルの話だろう。64kbyte以上送りたければ、何度もAPIを呼べばいい。

受信側が受け取れなければ、単に破棄するだけだ。
それは、受け取り側が糞なんじゃなくて、そういう仕様。

UDPの通信フレームの最大長は、1500オクテット(=バイト)だが、
IP情報分を除くと1480バイトになる。経路が全てイーサネットで
組まれているのなら、APIレベルで1480バイト以下を送れば分割(フラグメント)は起こらない。
インターネットに流すのならもっと小さくする必要がある。

IPヘッダ専用のチェックサムはあるが、それはデータとは無関係。データ自身には何のチェックバイトもない。
イーサネットフレームのCRCはあるが、それは送信時のもので、異なるプロトコルにぶちあたるとコロリととれてしまう。
イーサネットフレームに戻るときにはCRCも戻るが、それは再構築されたものなので、送信時のものとは全く関係ない。

そもそも、UDPは、次の特徴をもっている。
>>504が言うとおりIPフレームの到来順序を期待してはいけない。
・戻されたIPフレームがどの順番に届くかは保証されない。
・IPフレームの一部が失われた場合、再送の手順は行わない。
・IPフレームは分割(フラグメント)されるかもしれないが、分割された順序を記憶するフィールドがあり、再構築されるようになっている。

UDPとは、
・本来、内部LANのように信頼性の高い部分で使用することを前提に策定された
・今は、動画や音声のように、一部が失われても十分機能する場合によく用いる

のですよ。ちなみにコレはIPv4の仕様。IPv6はこうとは限らない。

507:506
07/07/10 19:33:25
ちょっと訂正
APIで1480バイトを指定するのではなくて、
窓の手でMTUを指定する(Windowsの場合)。
社内LANだけの場合は1500にする。

508:デフォルトの名無しさん
07/07/10 21:13:41
このスレで良いのかわからないのですが、質問失礼します。
データ圧縮されたファイルの1文字当りの平均情報量は、テキストファイルのものに比べてどのように変化するんでしょうか?
できれば理由も説明してくだされれば幸いです。
よろしくお願いします。

509:デフォルトの名無しさん
07/07/10 21:26:20
圧縮後の情報量なんて、圧縮しているのだから1文字当たりの量は増えているとだけは言える。
どれくらいになるかは圧縮率次第。それがわからないと平均なんてわからない。

510:デフォルトの名無しさん
07/07/10 22:05:31
>>508
それ、学校の宿題か?


511:505
07/07/10 22:22:05
>>506
お前こそ勉強し直しだ。

> それから、UDPの送信フレーム数そのものに制限は無い。

用語は正しく。
UDPはメッセージもしくはパケットで数える。フレームとは言わない。

> どこで知ったかしらないが、64kbyteなんて制限はない。

UDPヘッダの長さフィールドが16ビットなので、64kbyte弱が上限。

> 恐らくAPIレベルの話だろう。64kbyte以上送りたければ、何度もAPIを呼べばいい。

複数回に分けてSendToを呼ぶと、複数のUDPパケット=メッセージになってしまう。
UDPは、TCPと違ってストリームではなくメッセージなので、意味が変ってしまう。

> 受信側が受け取れなければ、単に破棄するだけだ。
> それは、受け取り側が糞なんじゃなくて、そういう仕様。

なにその教科書どおりの話は。
世の中には、破棄せず不正なステートに陥ったりバッファオーバーフローしちゃう糞実装があるんだよ。

> UDPの通信フレームの最大長は、1500オクテット(=バイト)だが、
> インターネットに流すのならもっと小さくする必要がある。

んなのはIPよりも下のレイヤの話であって、
フラグメントを禁止したりしなければ、
下のレイヤのために小さくする必要はない。

現実には途中の経路のルーターが、
IPのレイヤで蹴落としてくれることがある。

512:505
07/07/10 22:30:23
> IPヘッダ専用のチェックサムはあるが、それはデータとは無関係。データ自身には何のチェックバイトもない。

嘘つき。
UDPパケットにもチェックサムはあって、それにはペイロードも含まれている。

ただし、
チェックサムは実装が必須とはされていないので、
相手がチェックサムを確認しない可能性もあるし、
こちらがチェックサムを付加しない可能性もある。

> ・本来、内部LANのように信頼性の高い部分で使用することを前提に策定された
> ・今は、動画や音声のように、一部が失われても十分機能する場合によく用いる

なんか違うなぁ。

コストをかけてコネクションを張る必要のないメッセージのやりとり、という用途も考えられていたし、
DNSなんかもUDPを使うんだけどなぁ。



513:デフォルトの名無しさん
07/07/10 22:40:45
コード
URLリンク(kansai2channeler.hp.infoseek.co.jp)
入力文
URLリンク(kansai2channeler.hp.infoseek.co.jp)
言語はCです。
コンパイル(gcc)して文をリダイレクトで入力したのですがどうしても一行目で
処理が終わってしまいます。何が問題なんでしょうか?

514:デフォルトの名無しさん
07/07/10 22:55:52
>>513
このスレで何度も言ってることなのだが・・・

デバッガでステップ実行しろ!

515:デフォルトの名無しさん
07/07/10 22:57:58
>>513
1行しか読んでないから
fgetsは1回実行されるだけじゃん

516:デフォルトの名無しさん
07/07/10 23:02:02
gccみたいな糞環境だとデバッガ使うのも一苦労でしょ^^
VC2005にきなさいな

517:デフォルトの名無しさん
07/07/10 23:03:30
VC2005でデバッグしてからgccにもってくのもあり

518:デフォルトの名無しさん
07/07/10 23:03:50
gdbの事かー

GUIフロントエンドでも使っとけ

519:503
07/07/10 23:07:50
>>505,506
サンクス。勉強になった。

で、再度質問で申し訳ないのですが、
要は、やりたい事が最大で5KBくらいのデータを送りたくて、
UDPについて調べてました。(TCP/IPは困ったことにノウハウが無い)

「IPフレームがどの順番に届くかは保証されない」ってのは
例えば4000byteのメッセージをsendtoすると、
1500byte(これをAとする)、1500byte(これをB)、1000byte(これをC)の
フレームに分けられて伝送される。
でも、受信側のアプリケーションでrecvfromした時にバッファに入っているデータが、
A+B+Cの順序で4000byteのこともあれば、B+C+Aの順序になっちゃうこともあるということでしょうか?

それとも1回のsendtoと1回のrecvfromだと、
こういうような順序の不都合は起きなかったりするのでしょうか?

自前のコードで1KB以下のメッセージでセグメント化するのは、
コードが煩雑になるのでできるだけ避けたいんですよね。



520:デフォルトの名無しさん
07/07/10 23:17:16
>>519
> B+C+Aの順序になっちゃうこともあるということでしょうか?

ない。


521:デフォルトの名無しさん
07/07/11 01:15:34
そもそも一回のrecvで全部取れる保証が無い。

522:デフォルトの名無しさん
07/07/11 08:49:29
>>521
それはTCPの場合ね。


523:603
07/07/11 09:11:40
>>505
水を得た魚のようにはしゃいじゃって。UDPヘッダを考慮に入れてなかったんだが、お前の反論はただの荒らしだ。

訂正:UDPヘッダには16ビット分のデータがある。64kbyteが限界
(イーサネット上ではIPパケットが1500バイトになるように分割。)

>用語は正しく。
用語は大切だが、ここではそれを議論してんじゃネーだろ。文脈を読めよ。

>> 受信側が受け取れなければ、単に破棄するだけだ。
>なにその教科書どおりの話は。
>世の中には、破棄せず不正なステートに陥ったりバッファオーバーフローしちゃう糞実装があるんだよ。

だーかーらー文脈にそって語れよ。質問者のテスト環境ではWindowsXPって書いてあるだろ。それに、教科書どおりなんて文句言うぐらいなら、用語にケチつけるな。

>> インターネットに流すのならもっと小さくする必要がある。
>フラグメントを禁止したりしなければ、
>下のレイヤのために小さくする必要はない。

下でちゃんと訂正してますー。はしゃぎすぎで良く読んでない証拠だな。

>> ・本来、内部LANのように信頼性の高い部分で使用することを前提に策定された
>> ・今は、動画や音声のように、一部が失われても十分機能する場合によく用いる
>コストをかけてコネクションを張る必要のないメッセージのやりとり、という用途も考えられていたし、

意図と使い方は違ってても問題ないし、たかだか一つの文句を増やすために引き合いにだしたのか?

>DNSなんかもUDPを使うんだけどなぁ。

DNSにUDP?まさに信頼できる接続の典型じゃないか。
お前、どういう形でインターネット使ってるにしろDNS指定されてるだろ?
いきなりDNSルートにつなぎに行かないだろ?

524:デフォルトの名無しさん
07/07/11 10:17:45
>>523
何も有益な話はないな。

525:デフォルトの名無しさん
07/07/11 12:01:24
>>603にプレッシャーがかかりました

526:デフォルトの名無しさん
07/07/11 16:26:50
scanfが入力を受け付けてくれなくて困っています。
char c,d;

printf("数値いれろ");
scanf("%c",&c);
printf("数値入れろ");
scanf("%c",&d);

って感じで実行すると

数値入れろ数値入れろ_(←カーソル)

二番目のscanfだけは入力出来る状態です。何が原因なのでしょうか。
OSはWindwosXPでコンパイラはBCC5.5です。

527:デフォルトの名無しさん
07/07/11 16:37:56
キーバッファからなんか喰ってるんだろ。

528:デフォルトの名無しさん
07/07/11 17:42:56
ファイルから標準入力へリダイレクトすることを考慮に入れず、
人間相手にインタラクティブに入力することだけを考えるなら、

printf("数値いれろ");
という表示をする前に、
すでに入力されているものがあれば、それを全て捨てる処理を入れる。

529:デフォルトの名無しさん
07/07/11 17:44:21
初心者は馬鹿の一つ覚えで
scanf()をfgets()→sscanf()に置換汁

530:デフォルトの名無しさん
07/07/11 17:44:36
毎度おなじみの言葉を言うの忘れてた。
デバッガ上でステップ実行しろ!

とりあえず、
1つ目のscanf("%c",&c);でcに何が入ってきているのか、
デバッガ上で確認してみよう。


531:デフォルトの名無しさん
07/07/11 17:53:41
>>529
そもそも、初心者向けの教科書の内容が古すぎるんだよな。
scanf系なんか、その存在すら教える必要ないのにな。

自分はscanf系を使ったのは、
C言語やりはじめて最初の一ヶ月くらいで、
その後15年間まったく使っていないよ。

使いもしないものを目に触れさせるだけでも無駄だし、
ましてや、それで新人がハマったりするようでは、有害だよ。

532:デフォルトの名無しさん
07/07/11 18:03:45
scanf()も使いどころを知っていれば便利なんだけどね


533:デフォルトの名無しさん
07/07/11 21:13:36
>>531
「scanf系」ってなんじゃらほい?

534:デフォルトの名無しさん
07/07/11 21:16:03
よくわからんが、sscanf()とかfscanf()とかじゃないの

535:デフォルトの名無しさん
07/07/11 21:21:18
一般的に、scanf()系のその他の関数の方は使い途あるんだけどご本尊が使いようが無くて困る。

536:デフォルトの名無しさん
07/07/11 21:48:03
>>535
fscanf()が使えるのならscanf()も使えるでしょ
scanf()は単にstdinに対するfscanf()なのだから

537:デフォルトの名無しさん
07/07/11 21:53:28
>>536
まぁ確かに、リダイレクトすれば使って使えなくも無いけどキー入力用としては使えないよね。

538:デフォルトの名無しさん
07/07/11 22:01:43
>>537
そんなことはないよ。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
これは以前宿題スレに貼り付けた四則演算が出来るだけのオモチャ電卓だが、
数値を入力する時にscanf()を用いている。getchar()で数値であることを
確認してからungetc()し、改めてscanf()で読んでいるから基本的には安全だ。
scanf()を用いないとすれば実数の入力はずっと面倒になるよ。

539:デフォルトの名無しさん
07/07/11 22:06:04
それならfgets()+sscanf()で充分な気が。と思ったが……
あーそうか、入力を放置したまま、部分ごとに解析できるから使いようが無いわけでもないか。

540:デフォルトの名無しさん
07/07/11 22:08:09
そこまでするんだったら、fgets+sscanfのほうがすっきりすると思う。

そもそも俺はfscanfも使わないだろ派。
scanf系はsscanfと(使ったことないけど)vsscanfだけあればいい
と思っているということも影響しているだろうけど。

541:デフォルトの名無しさん
07/07/11 22:19:39
>>540
fgets()だと行長に恣意的な制限が生じるでしょ。
>>538のやり方だとgetchar()とscanf()しか使っていないから
そういう制限は無いよ。幾ら長い式でも扱える。
倍精度浮動小数点数を使っている以上、実数のサイズに制限はあるけどね。

他にいくつか例を挙げよう。↓はワードカウンタ
#include <stdio.h>
int main() {
    int cnt = 0;
    while (scanf("%*s") != EOF)
        ++cnt;
    printf("%d\n", cnt);
    return 0;
}

542:デフォルトの名無しさん
07/07/12 10:07:18
別に生じないけど、getchar()使ってscanf系を使わない選択肢もあるべ

543:デフォルトの名無しさん
07/07/12 14:03:08
>>542
scanf()使わずにgetchar()だけで数値を読み込む処理作ろうとしたら
少なくとも数行のコードは必要になる。別にやるのは自由だが、
scanf()のが楽で簡潔ではあるよ。

544:デフォルトの名無しさん
07/07/12 15:22:33
>>543
C標準ライブラリ関数しか使わず、なおかつ、自前の関数もダメ
なんていう縛りがあれば、そうかもしれん。

自前の関数が使える or 豊富なライブラリを活用してよい
となれば、使いにくいscanfを騙し騙し使わなくてもいいだろう。

545:デフォルトの名無しさん
07/07/12 16:54:15
>>544
別にクセが分かっていれば全然使いにくくないが。
ま、初心者に薦める気にはならんけどな。

546:デフォルトの名無しさん
07/07/12 17:10:08
組み込みじゃあ、余分な機能のついた肥大な関数は避けたいところではある
ってそもそも入ってないけど、デバッグ用にprintfだけは作ったなあ・・・

547:デフォルトの名無しさん
07/07/12 17:13:16
>>546
scanf()は確かにでかいな。
printf()も、作るとしてもフル機能はいらないでしょう。

548:デフォルトの名無しさん
07/07/12 18:03:08
どっかで見たprintfやscanfの実装では、使わない機能を細かく取り外せるようになってた。


549:デフォルトの名無しさん
07/07/12 22:28:32
sscanf()の%*[^\n]なんかは便利だからついつい使いたくなる。

550:デフォルトの名無しさん
07/07/12 22:36:03
>>549
そうそう、使い方を知ってればscanf()は非常に便利

551:デフォルトの名無しさん
07/07/14 03:24:26
割り込みシグナルについて教えてください

#include<stdio.h>
#include<signal.h>
#include<setjmp.h>
jmp_buf jmpBuf;
void s(){longjmp(jmpBuf, -1);}
int main(){
char buff[20];
signal(SIGALRM,s);
alarm(5);
   if(0==setjmp(jmpBuf)) {
      printf("A");
      fflush(stdout);
      gets(buff);
      alarm(0);
   }
   else {
      printf("B");
   }
}

これをコンパイルするとこのようなエラーが出てしまいます

'SIGALRM' : 定義されていない識別子です。
'alarm': 識別子が見つかりませんでした
'alarm': 識別子が見つかりませんでした

定義されて無いみたいなんですが・・・
どうやったらSIGALRMとalarm()を使えるようになるんでしょうか?

552:デフォルトの名無しさん
07/07/14 04:07:09
POSIXな環境に移行すりゃいいんじゃないかね。

553:デフォルトの名無しさん
07/07/14 08:43:07
>>551
#include <unistd.h>

554:デフォルトの名無しさん
07/07/15 03:03:07
>>552
ありがとうございます
でも出てきたサイトが英語だぁ・・・頑張ってみます

>>553
検索してくうちにそのヘッダを使ってるコードも見つけたんですが
borlandにはそのヘッダは無いみたいです

555:デフォルトの名無しさん
07/07/15 03:05:49
unistd = UNIX standard

556:デフォルトの名無しさん
07/07/15 11:00:46
ぶっちゃけ、>>551には自分がUNIX向けのプログラムを書いているという自覚がないのだろう。
一番簡単な選択肢は、Linuxを使うこと。

Windows上でPOSIX環境を提供する代物もあるが、
そういうのを使いこなす余裕はなさそうだからな。


557:デフォルトの名無しさん
07/07/15 11:20:27
>>551
Windowsではシステムコールにシグナルで割り込んで
中断させるという手法は使えない。
ANSI Cをサポートするコンパイラならsignal()関数は使えるはずだが、
仕様は非常に限定的だし、Unixのシグナルと同じものだとは思わないほうがよい。

Windowsで時間がかかる可能性のあるI/Oを中断したい場合は、
非同期I/O、スレッド、イベント、といったものを使う。

558:デフォルトの名無しさん
07/07/15 22:41:08
ずっと独学で勉強してたせいかdouble型をずっとドウブル型って読んでた
先週初めてダブル型だって知ったよ(|||´・ω・`)

559:デフォルトの名無しさん
07/07/15 22:46:37
>>558
俺はドウブレって読んでた。

560:デフォルトの名無しさん
07/07/15 22:51:07
charはキャラと読む人も居るが、
URLリンク(www.research.att.com)
によると、チャーが正しいようだね

561:デフォルトの名無しさん
07/07/16 00:11:15
この例だとネストは少ないけど、実際は5段6段のネストがあると考えてもらって

テンプレート使ったプログラミングで
typename Foo< typename Hoge<Hage>::type >::type foo;
とかやるのが面倒なんで
#define DECLARE(T,name) \
typename Foo< typename Hoge<T>::type >::type name
みたいなマクロ使うのってあり?


562:デフォルトの名無しさん
07/07/16 00:35:18
勝手にしてください

563:デフォルトの名無しさん
07/07/16 00:50:59
typedefすら面倒なのかよ

564:デフォルトの名無しさん
07/07/16 00:56:32
関数オブジェクトならメンバ宣言内でのtypedefが使えるんだけど
普通の汎用関数ならTがテンプレートパラメータの時typedef使えないんで
そういうときの為に考えたんですけど
そういう場合でもtypedefを使って簡潔にする方法あるんですかね?

565:デフォルトの名無しさん
07/07/16 02:04:58
ないならそれ用のメタ関数を作ればいい。
これを使いたい関数の直前にでも書いておけばよし。
template<typename T>
struct Shortcut
{
typedef typename Foo<typename Hoge<T>::type>::type foo;
};
こうすればShortcut<Hage>::typeと言う具合に1段に減る。

ついでに言うと俺様ライブラリ内だったら、
Boostみたいに名前空間detailにでも放り込めばいいかもしれない。
(ほかにろくな使い道がないなら)

566:デフォルトの名無しさん
07/07/17 10:39:33
クラスの中にクラスを定義できるけど、
関数の中に関数を定義するにはどうすればいいの。

その関数の中でしか使わない関数なので、
クラスの中のスコープに入れてしまいたい。

567:デフォルトの名無しさん
07/07/17 10:40:23
もとい

×クラスの中のスコープに入れてしまいたい。
○関数の中のスコープに入れてしまいたい。

568:デフォルトの名無しさん
07/07/17 10:42:20
>>567
関数内関数はできないので、精精同じソース内に入れるくらいが関の山。
呼ばれる関数をstaticにしておけば、事実上外部からは見えなくなるからね。

569:デフォルトの名無しさん
07/07/17 11:06:24
>>568
ありがとう。

呼ばれる関数を、呼ぶ関数の名前のnamaspaceに入れることにしました。


570:デフォルトの名無しさん
07/07/17 22:04:32
生スペースか

571:デフォルトの名無しさん
07/07/18 02:33:18
関数の中に構造体を定義してその中に関数を定義する。

572:566
07/07/18 03:15:23
>>571
目から鱗です。

まさにそれを、STLまわりで無自覚のうちにやってました。反省します。

573:デフォルトの名無しさん
07/07/18 22:54:54
>>524
結局ごまかしてる

574:デフォルトの名無しさん
07/07/22 19:56:30
newされた量が別の所で管理されていると言うことは、
void *p = (void*)new Hoge_t[hugahuga];
delete[]p;
でもちゃんとsizet(Hoge_t) * hugahugaバイトの領域が開放されるんですか?

575:デフォルトの名無しさん
07/07/22 20:06:59
うん

576:デフォルトの名無しさん
07/07/22 20:10:20
>>574
解放はされるけど、そのコードでは、Hoge_tがデストラクタを持っていた場合、
デストラクタが呼ばれないのがまずいという別問題も忘れないでね。

577:デフォルトの名無しさん
07/07/24 17:28:14
今までVC6をつかっていたのですが環境をVS2005 C++に変えました。
メモリアクセス違反を不正なポインタにアクセスして出した場合、いままでは

catch(...)

で例外を捕捉できていたのですが2005にしたらできなくなってしまいました
原因もしくは解決方法をご存じの方がいましたらお願いいたします。

処理としては不正なポインタからローカルの変数に代入しているだけです。
よろしくおねがいします

578:デフォルトの名無しさん
07/07/24 17:38:12
ディスプレイの任意のピクセルの色情報を取得したいんですけど
どんなことをすれば出来るんでしょうか
普通に入ってるwindows.hとかでも出来ますか?

画面丸々ビットマップに変換して~
とかなら自分でも出来そうなんですけど、全然スマートじゃない気がするので

579:デフォルトの名無しさん
07/07/24 17:52:04
>>578
ディスプレイ=デスクトップとして、
デスクトップのDCを得る。 HDC hdc = GetDC(NULL);
HDCの任意の場所のピクセル情報を得る COLORREF rgb = GetPixel(hdc, x, y);

こんなんでどうか

580:デフォルトの名無しさん
07/07/24 17:59:54
>>579
おお、そんな便利な命令があったんですか
2,3時間ネットで調べて見てもダメだったんですが綺麗に解決しました。
ありがとうございます

581:デフォルトの名無しさん
07/07/24 19:23:04
>>577
コンパイラオプション/EHa使え

582:デフォルトの名無しさん
07/07/24 19:28:20
最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られないのですがなぜですか???
超初心な質問だと思いますが・・・
どなたか助言をお願いします

583:デフォルトの名無しさん
07/07/24 19:30:53
嗚呼、ぬるぽ

584:デフォルトの名無しさん
07/07/24 19:41:53
私も最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られますのですがなぜですか???
>>582は超初心な質問だと思いますが・・・
どなたか助言をお願いします

585:デフォルトの名無しさん
07/07/24 19:43:57
私も最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られないのですがなぜですか???
>>584も超初心な質問だと思いますが・・・
どなたか助言をお願いします

586:デフォルトの名無しさん
07/07/24 19:46:46
>>584
>>582が低脳だから


587:デフォルトの名無しさん
07/07/24 19:52:00
>>582
その「結果が得られない」というソースを張りたまえ。

588:デフォルトの名無しさん
07/07/24 19:56:25
ソースってなんでしょう???ウスターソースならウチにありますが・・・

589:582
07/07/24 19:58:19
なんだかよくわかりませんがもう一度コンパイルしたら
でてきました
どうもすいません

590:デフォルトの名無しさん
07/07/24 20:03:37
                           ____     
                         /_ノ  ヽ、_\    
   プギャアアアアアアアアアアアアアア     o゚((●)) ((●))゚o    
                      /::::::⌒(__人__)⌒::::: \ 
               (⌒)     |     |r┬-|     |  
           ,┌、-、!.~〈     |     | |  |     |   
            | | | |  __ヽ、   |     | |  |     |  
           レレ'、ノ‐´   ̄〉. \      `ー'     /   
            `ー---‐一' ̄                  

591:デフォルトの名無しさん
07/07/24 20:49:48
>>581

ありがとうございます。無事動作いたしました。
SEHというものを初めて知りましたが、便利ですね

592:デフォルトの名無しさん
07/07/27 08:19:12
連想配列を実現する関数のサンプルってどこかにありませんか?

593:デフォルトの名無しさん
07/07/27 08:22:35
>>592
std::map?

594:592
07/07/27 08:33:40
サンプルを自力で発見しました。
どうもお騒がせしました


595:デフォルトの名無しさん
07/07/27 08:34:27
>>593
C言語で連想配列を実現したかったんです。
舌足らずですみません。
で、こんなHPを見つけて事故解決しました。
URLリンク(ew-and-f.hp.infoseek.co.jp)

596:デフォルトの名無しさん
07/07/27 09:34:22
Cだとハッシュという言葉のが一般的だからなあ。

597:デフォルトの名無しさん
07/07/27 18:54:56
template <class T>
class foo
{
public:
T _data;
foo(const T& v){ _data = v; }
};
というクラスがあったとして

foo<int> foo1(4);
foo<double> foo2(2.5);

foo2 = foo1;
foo<double>foo3 = foo<int>(2);

という代入を実現したいのですがこれは可能でしょうか
テンプレートコンストラクタを作ろうとしたら当然無理でした

598:デフォルトの名無しさん
07/07/27 19:09:34
>>595
STLにあるのに、自分で作るの?

・・・たぶん学校の宿題なんだろうな・・・

599:デフォルトの名無しさん
07/07/27 19:14:03
事故解決したら危ない

600:デフォルトの名無しさん
07/07/27 19:36:30
>>598
C++じゃなくてCだそうだよ。

601:デフォルトの名無しさん
07/07/27 19:43:10
>>597
テンプレートのコンストラクタと代入演算子を用意するだけでは?
template<typename U>
foo(const foo<U>&);
template<typename U>
foo& operator =(const foo<U>&);

これとは関係ないが、コンストラクタでは代入ではなく初期化リスト使え。

602:デフォルトの名無しさん
07/07/27 20:09:03
>>597
あなたが実際にやろうとしていることは、

foo<double> foo_d = foo<int>(2) ;
ではなく、
double d = foo<int>(2) ;
だと思う。

とりあえず
operator T&() { return _data }
を用意すれば、コンパイラが持っているintからdoubleの変換が使われる。

603:デフォルトの名無しさん
07/07/27 20:11:17
ちなみに、
> テンプレートコンストラクタを作ろうとしたら当然無理でした
というのは、
template<class U>
foo(const foo<U>& u) { _data = u }
だったりしないか?

そりゃダメだ。
やはり、
double d = foo<int>(2)
をやろうとしている。

template<class U>
foo(const foo<U>& u) { _data = u._data }
でなければ。

604:デフォルトの名無しさん
07/07/28 00:50:15
>>601-603
回答ありがとうございます
解決できました

template <class U>
foo(const foo<U>& u)


605:デフォルトの名無しさん
07/07/28 00:54:31
途中送信してしまいました・・・

template <class U>
foo(const foo<U>& u)
{ _data = u._data; }

この形式でいけました
ちなみにクラステンプレートだとfoo<T>とfoo<U>とは
別のクラスになるようなので
_dataのゲッタを使って解決できました

ありがとうございました

606:デフォルトの名無しさん
07/07/28 02:44:33
>>605

>>597の通りなら、_dataはpublicだからgetterはいらないよ。
publicではない場合は・・・面倒くさいからgetterを使うか。

同じテンプレートのクラスどうしならいいけど、違っていたらダメだから、
副作用もあるけど、operator T&を用意したほうが便利だと思う。

607:デフォルトの名無しさん
07/07/28 07:50:35
ゲッタを用意するのとoperator T&を用意するのとでは、本質的には何も変わらないだろ。

608:デフォルトの名無しさん
07/07/28 07:55:49
getterを誰が呼ぶのか、getterを呼ぶコードを誰が書くのか、という点で違うと思う。


609:デフォルトの名無しさん
07/07/28 08:16:00
もうfriendにすればいいよ。
template<typename U>
friend class foo<U>;
auto_ptrとかshared_ptrもこんなことやってのかと思ったら、
getterあるから不要だった。

610:デフォルトの名無しさん
07/07/28 08:30:31
>>609
friendにしたところで、肝心のメンバ変数の名前が一致していないとダメだ。

ちなみにVC7.1では、そういうfriend宣言はできない・・・orz

611:デフォルトの名無しさん
07/07/28 14:11:55
Cで、ボタンを押すとファイルから1行ずつ読み取って描写するプログラムを作っています。
テキストの描写にはDrawTextを使っているのですが、うまくいかないので質問したいと思います。

例えば、長い文字列を描写した後、同じ場所に短い文字列を描写すると前の文字列の後ろの方が残ってしまうのです。
1回最小化してまた開くと、うまく表示されるのですが何が悪いのかよく分かりません。

こんな説明ですが、分かる方が居ましたらお願いします。



612:デフォルトの名無しさん
07/07/28 14:14:14
知らないけど、リフレッシュ

613:デフォルトの名無しさん
07/07/28 14:14:58
文字を書く前に、一旦後ろを真っ新に塗りつぶせばいい。

614:デフォルトの名無しさん
07/07/28 14:37:44
文字列に空白でもたくさんつけとけ。

615:デフォルトの名無しさん
07/07/28 14:39:42
あるいは自動で最小化→最大化とか

616:611
07/07/28 15:05:28
私の技術力の低さのせいで614さんと615さんの方法しか試せませんでしたが、なんとか解決できました。
提案して下さったみなさん、本当にありがとうございました!

617:デフォルトの名無しさん
07/07/28 18:18:44
えー
ちゃんと描画ハンドラを適切に実装しる

618:611
07/07/28 18:53:04
今までにコンソールアプリケーションを作る事はあったのですが、
windowsアプリケーションは初めてで、色々苦戦してます。

メッセージ等初歩的な事は理解できたのですが、分からないことが多いです。
描画ハンドラの適切な実装?を私は
InvalidateRectを呼び出して再描画させる事だと考えたのですが、うまくいかないようです。
見当違いなことを言っていたらすみません。


619:デフォルトの名無しさん
07/07/28 19:16:06
>>618
WindowsのGUIの基礎を勉強したほうがいいと思う。

断片的にやり方を調べてやっていると、
根本的なところを間違ったりするよ。

自前でチマチマやるくらいなら、
VCLとか使ったほうがいいかも。

620:デフォルトの名無しさん
07/07/28 19:20:28
>>618
見当違いなことを言い過ぎで恥ずかしいです。

621:611
07/07/28 19:30:50
今回質問をして、明らかに知識も技術も不足していることが分かりました。
もう一度基礎から勉強し直そうと思います。

指摘や指導して下さったみなさん、ありがとう。
次にこのスレに来るときは、もう少しレベルアップしてきます。
では。

622:デフォルトの名無しさん
07/07/28 21:19:59
>>621
し直す

というあたりが不安だ。
一度も勉強していないものを、どうやって し直す のかと。


623:デフォルトの名無しさん
07/07/28 21:50:39
お前さ、どんだけ上から目線なんだよ

624:デフォルトの名無しさん
07/07/28 22:07:01
お前さ、どんだけ下から目線なんだよ

625:デフォルトの名無しさん
07/07/28 22:13:23
#お前さ、どんだけ下から目線なんだよ

626:名無しさん@そうだ選挙に行こう
07/07/29 08:54:31
     ∧_∧
     ( ・ω・ ) <消しゴムが落ちたので拾ってください
      (====)
   ______( ⌒) )
 /\   ̄`J ̄ ̄ ̄\
  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄
         | |
       / \       □

627:名無しさん@そうだ選挙に行こう
07/07/29 09:47:56
##お前さ、どんだけ下から目線なんだよ

628:名無しさん@そうだ選挙に行こう
07/07/29 11:03:13
#ここに初心者に対するコメントをどうぞ

629:デフォルトの名無しさん
07/07/31 18:51:32
#include<stdio.h>
#include<window.h>
main(){
int i;
while(1){
printf("入力して下さい: ");
scanf("%d",&i);
Sleep(5000);//長い処理の代わり
printf("値:%d",i);
}
}
このようなプログラムの場合、sleepしてる間(長い処理)に
キーボードから標準入力を入れると次にscanfに回ってきたとき
sleepしてる間に打った数字が勝手に入ってしまうのですが、
scanfの後、キーボードからの標準入力をいったん停止することはできませんか?




630:デフォルトの名無しさん
07/07/31 18:55:36
読み捨てるしかありません。

631:デフォルトの名無しさん
07/07/31 19:36:16
すいません、読み捨てるって意味がよくわからないです。

632:デフォルトの名無しさん
07/07/31 19:41:46
すいません、これって超基本という感じもするのですが、、、
以下のソースをg++でコンパイルすると
最初の行とその次の行の結果が異なるのですが、
これは何故なのですか?

#include <iostream>
using namespace std;
int main()
{
cout << 1 + 0.05 * (0.25) / 90 << endl;
cout << 1 + 0.05 * (90/360) / 90 << endl;
return 0;
}





633:デフォルトの名無しさん
07/07/31 19:47:00
90 / 360 = 0 だから。
90.0 / 360 とかすれば同じになる。

634:デフォルトの名無しさん
07/07/31 19:53:59
int 型同士の演算はその結果も int 型
90/360 は 0.25 という結果が int 型に切り詰められてゼロになる

635:デフォルトの名無しさん
07/07/31 19:55:36
>>633
そうか!
ありがとうございます。
結構大きなソースを追いかけていたのですが、最後にようやく
上記の行が原因とわかりまして、でもなぜうまく動かないのか
わからなかったのですが、そうですよね、90も360もintになりますよね。
ありがとうございました。



636:デフォルトの名無しさん
07/07/31 19:56:20
>>634
ありがとうございました。

637:デフォルトの名無しさん
07/07/31 20:49:08
>>631
「scanf() 呼ぶ直前に、残った文字を全部読んでしまえ」ってことだろうが
それは無理。
 URLリンク(www.kouno.jp)

ついでに
 URLリンク(www.kouno.jp)

638:デフォルトの名無しさん
07/07/31 20:52:14
>>637
fflush使わずともscanf("%*[^\n]%*c");みたいにscanfだけでも何とかなる。

639:デフォルトの名無しさん
07/07/31 21:04:46
いや、
>読まれていな い文字は、O/Sレベルのバッファにもため込まれている可能性がある。
だから「それは無理。」なのだろう。
しかしこれはちょっと・・・元の>629はそんなシビアな話ではないと思う。

640:デフォルトの名無しさん
07/07/31 21:08:38
裏で字を食い続けるだけのスレッド動かせばいいんじゃね?

すげー無駄だけど

641:デフォルトの名無しさん
07/07/31 21:48:35
Aというファイルfopenで開き、fgetcでCString型の箱に格納。
Replaceで一部を置き換え、Bというファイルに書き出すというのは可能でしょうか。

642:デフォルトの名無しさん
07/07/31 21:57:17
>>641
そりゃぁできるでしょ。

643:デフォルトの名無しさん
07/07/31 22:00:23
CStringはTCHAR用なので、_gettc()ではなく(f)getc()を使うのなら
CStringAを使え

644:デフォルトの名無しさん
07/08/01 01:58:23
class Counter;
{
/* 略 */
int data[];
int total;
};
int main()
{
Counter counter(N); /* counter[i] = 0 */

クラスCounterは内部に配列を持っていて0で初期化されているとします
counter[i]の値をインクリメントしたとき自動的に
totalもインクリメントされるようにしたいのですが

Counter::inc(index)
{ data[index]++;total++; }
ではなく
Counter::operator ++ (int)で実現する方法はないでしょうか

class val



645:デフォルトの名無しさん
07/08/01 02:01:13
途中送信してしまいました・・・

class value
{
static int total;
int val;
/* 略 */
int operator ++();
};

というクラスを作れば実現できますが
これだとCounter c1,c2;としたときtotalが共有されてしまいます

646:デフォルトの名無しさん
07/08/01 02:02:48
最終的に
counter[i]++;
としたとき
counter.totalも++されるようにしたいのです

なにかいい方法があればご教授ください

647:デフォルトの名無しさん
07/08/01 03:22:28
テンプレートクラスをtypedefする方法ってありますか?

648:デフォルトの名無しさん
07/08/01 05:12:34
>>644-646
ちょっとサンプル作ってみたよ、参考にしてみてくだしあ><
URLリンク(2ch-library.com)

方針としてはDataの配列(サンプルではvectorだけど^^;)
を持つCounterから直接インクリメント演算子を呼び出すんでなくて、
間に別のクラスをかませるってやり方
サンプルではそのクラスが合計インクリメント数も保持しちゃうんだけど、
チョッと弄ればCounterクラスが合計を保持するようにも出来る
この場合はfriend指定使ってるけどboost::functionみたいなデリゲート使えば
必要な関数だけ渡してfriend指定なしにもできる

>>647
ちょっとエスパー回答だけど、例えば
foo< bar< hoge< hage<piyo> > > > …(*)
ってのをtypedefみたいにショートカットするなら
template <type T> struct foo2 {
  typedef typename foo< bar< hoge< hage<T> > > > type;
};
とでもして、foo2<piyo>::typeってすれば(*)と同じような意味になりtypedefみたいな使い方ができる
こういうのをメタ関数と呼ぶらしい

649:646
07/08/01 11:39:12
>>648

非常に参考になりました
Binderを内部クラスにする方向で進めてみます

どうもありがとうございました

650:デフォルトの名無しさん
07/08/01 11:39:21
すいません。質問です。
DXライブラリ(DirectXライブラリ)とVC++を使ってゲーム製作の学習中です。
スクリプトエンジンを作るため、テキストファイルを開いてstring型の配列に格納してファイルをクローズする、
という処理が上手く行きません。
ファイルを行と行ごとの内容でアクセス出来るようにしたいので、string型の二次元配列で最初は書いていたのですが、
上手く行きませんでした。
一昨日にvectorの存在を知って、早速試しているのですが、やはり上手く行きません。

vector<string> Scenario;
Scenario.resize(500);
char* ScenarioFile = "Log.txt";
char Buf[256];
int FileHandle = FileRead_open( ScenarioFile );
int i=0;
while(FileRead_eof(FileHandle) == 0){
FileRead_gets(Buf,256,FileHandle);
Scenario.push_back(Buf);
}
FileRead_close(FileHandle);

このように記述しているのですが、Scenario[0]から全て ・ としか表示されず、
どうやら漢字コードの半分だけを表示しているようだと予測しました。
完全に失敗です。
whileの中にブレークポイントいれてみると、Bufの内容はちゃんと1行まるまる入っています。
格納が上手くいっていないようです。

どうすればテキストファイル丸々をstring型配列に落とすことが出来るのでしょうか?
どんどん足していって、改行コード毎に1行と判別させるメソッドを組むしかないのでしょうか?

アホですいません。宜しくお願いします。


651:デフォルトの名無しさん
07/08/01 11:43:54
ファイルのエンコードの問題かな?
プログラムとファイルの双方のエンコードを確認してみては?

652:デフォルトの名無しさん
07/08/01 11:59:53
>>650
>Scenario.resize(500);
もしかして: Scenario.reserve(500);

653:650
07/08/01 12:12:39
すいません、誤解を招きそうな書き方をしてしまいました。
『Buf自体にはちゃんと1行入っていて、Scenario.puch_back(Buf)が出来ていないようです』という意味でした。
本当にすいません。

>>651さん
念のため、他のメソッドで使っているイベントデータを読み込んでみましたがダメでした。
ちなみに、そのメソッドはchar型で格納して1行ずつ表示したり、それをstrtok()に掛けるなど
の処理を行っています。こちらは動いています。

>>652さん
リザーブしてもダメでした……


おそらく、文法がちゃんと理解出来ていないせいだろうと思いますが、
例によって何が間違っているのか分からないという状態に陥っています(´・ω・`)
vector<string> a; a.reserve(500);と
string a[500];は、ひょっとすると配列としてはほぼ同じですか?


654:デフォルトの名無しさん
07/08/01 12:20:59
次の3つが、後にa[0]からa[499]までの要素が使えるという点で似たようなもの。
1. std::vector<std::string> a; a.resize(500);
2. std::vector<std::string> a(500);
3. std::string a[500];

push_backは現在の最終要素の後ろに追加するメンバ関数。
a.size()が500のときにpush_back(Buf)したら、
そのBufの内容はa[500]で参照することになる。


655:650
07/08/01 12:52:30
>>654さん
push_backの意味、理解出来ました!ありがとうございます。
ひょっとして、std::string Text[512];として、
Text[0]に1行目、Text[1]に二行目、という風に合計512行を
格納出来るんじゃないかという考え方は、そもそも間違っていますか?
char型のa[10]とstring型のa[10]は、どちらも10バイト分の要素を持つ配列、
という意味になってしまうのでしょうか?
てっきり、string型は1行を動的に格納出来る優れものだと思ってました……
行単位で保持しようという考え方が、そもそも無茶なのでしょうか。
ここまできて、ようやく、『ひょっとするとファイルオープンしたままのほうが
面倒が少なくていいんでね?』とか思い始めてきました……(´・ω・`)

ちなみに、リザーブせずにpush_backで継ぎ足していったら、要素を出力した瞬間に
『ハンドルされてない例外エラー』で停止しました……切ないです(´・ω・`)


656:デフォルトの名無しさん
07/08/01 13:03:43
>>655
stringは一行(というか可変長な文字列ひとつ)を扱うクラス。
stringの配列で、行ごとに扱うというのは別に間違ってないよ。

あと、reserveは使うとpush_backが早くなるかもしれないけど、
使わなくてもいいという代物。
reserveしないとエラーが出るというのは、別のとこに原因があるはず

657:650
07/08/01 13:19:33
>>656さん
ありがとうございます。
原因は、Scenario[0]を出力しようとしているところにありました。
そして、string型の要素が入ってるくせに、.c_str()が使えないようです。

諦めて、string Scenario[500]; にしてコードを適切に変えたら、
やりたかったこと(1行単位で格納)そのものは出来ました。
やはり、stringの考え方そのものは正しかったようです。
それはそれで嬉しいのですが、今度はvectorの使い方を理解出来ていないと
いうことが発覚して、非常に悔しいです。

改めて、また全く別の質問をさせてください。

vector<string> a(10);
と宣言しても、a. でリストに出てくるメソッドはvectorのもので、stringの .c_str()等が
使えないのはどうしてでしょうか?
また、a[0].にいたっては、リストすら表示されません。
a[0]にはstring型のデータが格納されていると考えるのは間違っていますか?

これが、string b[10];なら、b[0].c_str();が使えることは確認済みです。
てっきり、同じように扱える物だと思っていましたが、どうやら違うようです。

宜しくお願いします(涙)


658:デフォルトの名無しさん
07/08/01 13:38:24
いや、そんな感じだぞ。
vector<string> a(10);とすると、aは10個要素を持った状態になる。
a[0].でstringのメンバが出てこないのは、単にエディタが阿呆なだけだから諦めろ。

659:デフォルトの名無しさん
07/08/01 13:39:13
VC2005だとちゃんと表示されるぜ


660:デフォルトの名無しさん
07/08/01 14:06:47
VC2003だと所々怪しい。
ポインタと配列が組み合わさるとインテリセンスが働かないことがある。
VC6を使ってたときはもっとひどかった。

661:650
07/08/01 14:32:24
皆さん、本当にありがとうございます。
泥沼に入り込んだような絶望的状況の中、優しさに泣けてきます。
コーディング専用に使ってる古いノーパソの方はVC++2002でしたので、
メインPCに入っているVC++2005ExpressEditionのほうにソースコード移して、プロジェクト作り直してみました。
(2002と2005で互換性無いみたいで、余計なトラブル防ぐためです)

すると……出ます! vector<string> a; a.resize(500); で、 a[0]にちゃんとstringのメソッドが出ます!
やったぜ!

喜び勇んでデバッグビルド。

……LNK4217やらLNK2019やらLNK1120やら出まくりやがります……(´;ω;`)
どうやら、vectorを使うと出るっぽ……(コメントアウトすると出ない

とりあえずエラーコードを全部ググってみたのですが、正直、専門用語連打で今ひとつ原因が理解できていません。
もうちょっと格闘してみます。


662:デフォルトの名無しさん
07/08/01 14:35:53
#include <vector.h> とかやってるってオチはないだろうね

663:650
07/08/01 14:52:27
>>662さん
ちゃんと

#include "string"
#include "vector"

にしてます。
昼飯抜きでやってたので、いまちょっとラーメン食ってます。
今日は有給取ってまとまった時間があるんで頑張ります(^^)


664:デフォルトの名無しさん
07/08/01 15:00:07
ランタイムライブラリの設定がおかしくなっているような気がする。

665:デフォルトの名無しさん
07/08/01 15:44:18
C++のソースを他の言語に移植しているのですが、ちょっとこまったことがありました。

class Hoge
{
 Hoge();
 virtual ~Hoge();
}

といった、クラスがある場合、

ソース中、

 Hoge hoge;

として、動的生成ではなく、静的に宣言?した場合、
デストラクタ(~Hoge);は、スコープから外れると自動で呼ばれるものなのでしょうか?

自動で、呼ばれない言語に移植しているいじっているもので(Delphi)




666:デフォルトの名無しさん
07/08/01 15:45:22
>>665
試してみればわかると思うけど、YES

667:665
07/08/01 15:45:28
途中で、送信してしまいました。


自動で、静的な構造体の場合、デストラクタが呼ばれない言語に移植しているもので(Delphi)、
その場合は、手動でデストラクタを呼び出す必要があるということになりますよね。


668:650
07/08/01 15:46:10
いろいろ確認しましたが、やはり、vectorを使用するとリンカエラーが出るようです。
vector<int> i;
と宣言して未使用のままでも、エラーが出ます。
stringは問題なく使えます。
他のSTLについては、そもそも使い方をまだ学習していないのでインクルードすらしてません。
ノートの方でエラー出ないってのが不思議です……
どなたか、原因が分かる方いらっしゃいますか?

>>664
設定を戻したいのですが、どのようにしたら元に戻せるんでしょうか?
再配布用のVC++2005 SP1ランタイムは見付けましたが、多分、再配布用じゃないですよね(´・ω・`)

669:665
07/08/01 15:49:27
>>666
サンクスです。

こちらにも書いてありました。
C++編(言語解説) 第7章 コンストラクタとデストラクタ
URLリンク(www.geocities.jp)

newしない場合は、スコープ外れるときに自動で呼ばれるのですね。
newした場合は、deleteするときに呼ばれる、と・・・。


670:デフォルトの名無しさん
07/08/01 15:54:29
>>668
プロジェクトの設定でC/C++→コード生成で
ランタイムライブラリの設定をDLLからスタティックリンクライブラリにしてみたらどう?

671:650/668
07/08/01 16:10:06
>>670さん
ありがとうございます。
プロパティ→C/C++→コード生成→ランタイムライブラリ を見てみたところ、

マルチスレッド
マルチスレッド デバッグ
マルチスレッド DLL
マルチスレッド デバッグ DLL

の4つ選択肢があって、デフォルトではマルチスレッドデバッグDLL(Debugモードです。リリースだとマルチスレッドDLLになります)に
なっていましたので、スタティックリンクライブラリの意味が正直よく分かっていないのですが、
『マルチスレッドデバッグ』にしてみました。
やはりリンカエラーでます。

「LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。」
これだけ、新しい(?)エラーが出た……のかな???
他はLNK2019,LNK2001,LNK1120(fatal)です。

ざーーーーーっとMSDNやぐぐってヒットした質問掲示板を片っ端から見て行ってるのですが、自分と該当するものは
今のところ見付かっていません。

#include "vector"
vector<int> i;
の二行だけでエラー出るってやっぱおかしいですよね?


672:デフォルトの名無しさん
07/08/01 16:11:49
ライブラリ見てる先が違うのでは?

673:デフォルトの名無しさん
07/08/01 16:23:59
ライブラリの設定をマルチスレッドデバッグDLLに戻して
#include <vector>
でも駄目かね?

674:デフォルトの名無しさん
07/08/01 16:26:36
いやまずは、

char str[100][300];
string str [100];

で読む込むかやって見ろよ




675:デフォルトの名無しさん
07/08/01 16:28:33
char* ScenarioFile = "Log.txt";
char buf[500][256];
int FileHandle = FileRead_open( ScenarioFile );
int i=0;


while(FileRead_eof(FileHandle) == 0){
FileRead_gets(Buf[i], 256, FileHandle);
i++;
}
FileRead_close(FileHandle);

676:650/668
07/08/01 16:30:57
>>672
それだと、stringもダメになりませんかね?
stringは普通に使えてます。

>>673
戻してみて、#include <vector>にしましたがダメでした。
時間掛かるけど、再インストールしてみたほうがいいっすかね?


677:デフォルトの名無しさん
07/08/01 16:32:07
つか、なぜC/C++ライブラリや、windowsAPIを使わないのか教えろ

678:デフォルトの名無しさん
07/08/01 16:37:36
普通のやり方だと動くのか???

#include <fstream>
using namespace std;

fstream fp;
string str;
fp.open("Log.txt", ios::in );

do{
getline(fp, str);
cout<< str<<endl;
}while(!fp.eof());

679:650/668
07/08/01 16:38:12
>>674さん
>>675さん
ありがとうございます。
vectorを使わないで何とかする方法は皆さんのおかげで無事なんとかなりましたm(_ _)m
今は、VC++2005でvectorそのものが使えないという状態で困っております……

>>677
すいません。WinAPIはまだ学習していませんので、使い方が分かりません。
やっとポインターと参照送りを覚えて、STLの存在を知って2週間ばかりのど素人です……
C/C++ライブラリとは、STLのことですよね?
今はSTLのstringを覚えて、vectorに差し掛かったばかりです。


680:650/668
07/08/01 16:41:14
すいません、先ほど>>677にさん付けるの忘れてました。他意はありませんm(_ _)m

>>678
普通のやり方でももちろん動きます。特にDXライブラリが悪さしているとは思えません。
ぜんぜん関係ない、ごく普通のC++の部分でエラー吐いてますので……

vectorさえ使わなければ、エラーも出ず普通に動きます。
さし当たって今やろうとしていることには必要のないものですが、C++の学習が主な目的でもありますので、
使ったらエラーという状態だけは何とかしておきたいなと思っています……


681:デフォルトの名無しさん
07/08/01 16:43:02
2003もアンインスコして再インスコだな
標準でさえこのざまなんだからこの先どんな不具合が起こるかわからないって状況は普通に怖いぞ

682:デフォルトの名無しさん
07/08/01 16:46:06
↓のプログラムをDOSで実行すると、何故か画面がフリーズして
「問題が発生したため、終了します」という画面が出て実行できないのですが
何故なんでしょうか?文法上の誤りも自分で見る限りは特に無いと思うのですが・・・
混じれ酢お願いします。
改行が多すぎて一度に書き込めない様なので分割して書き込ませて頂きます

#include<stdio.h>
#include<string.h>




683:デフォルトの名無しさん
07/08/01 16:47:05
main(int argc, char* argv[])
{


char filename[256];
char key[128];
if(argc>2){strcpy(filename,argv[1]);
strcpy(key,argv[2]);}
else if(argc){
strcpy(filename,argv[1]);
printf("暗号キーを入力してください>");
scanf("%s",key);

} else {
printf("ファイル名を入力してください>");
scanf("%s",filename);
printf("暗号キーを入力してください>");
scanf("%s",key);

}

printf("ファイル名:%s\n",filename);
printf("暗号キー:%s\n",key);

return 0;}


684:デフォルトの名無しさん
07/08/01 16:47:23
vectorは殆ど使い道ないよ
初めから必要な領域を動的確保すればよい

685:デフォルトの名無しさん
07/08/01 16:49:38
>>682
実行するときに引数入れろよ

686:デフォルトの名無しさん
07/08/01 16:52:43
>>683
コマンドライン引数ないとargv[1]参照してエラー起きる

argcは少なくとも1だよ
argv[0]にはプログラム名が入ってるから

687:デフォルトの名無しさん
07/08/01 16:52:45
else if(argc>=2){ にしとけ

688:デフォルトの名無しさん
07/08/01 16:53:07
>>685
実行するときに引数を入れても同じ画面が出てエラーになります・・・

689:デフォルトの名無しさん
07/08/01 16:53:43
途中だったw

if文書きかえて

if(argc > 2) うんたら
else if(argc == 2)うんたら
else うんたら
にしる


690:デフォルトの名無しさん
07/08/01 16:54:24
>>684
それだと解放する手間がかかるでしょ。
例外に強くするためにもvectorに解放を任せるのは有用。

もしかして釣られた?

691:デフォルトの名無しさん
07/08/01 16:59:46
>>689
ありがとうございます!!やってみたらできました
こんなくだらないミスで質問をしてすみません・・・
皆さんありがとうございました

692:デフォルトの名無しさん
07/08/01 17:00:47
一つ一つ内容を増やしていって確保する領域が不明であるケースなんて
ほとんどないよ
それに、個数が多ければ一度に確保しておいた方が速いし、
個数が少なければ多めに確保しておけばエラーは出ない

多くても少なくてもvectorは使えない

693:650/668
07/08/01 17:01:09
>>684さん
なんとなく『最初から上手く設計すればいらないような……?』とは思っていたのですが……_| ̄|○
はっきり言って下さってありがとうございます。
踏ん切りが付きましたので、ひとまずvectorの学習は中断することにします。


あ、でもVC2005の再インストールだけは念のためしておこうと思います(^^;

皆さん、本当にありがとうございました!


694:デフォルトの名無しさん
07/08/01 17:02:41
例えば、100万個データ追加するのに
毎回vectorのメンバ関数で追加するより
a[i]=5とやった方が速いし見やすい

695:デフォルトの名無しさん
07/08/01 17:06:06
               .|   |  | |   |    |  | |   |   |   || | |
               .|   |  | レ  |    |  | |   |  J   || | |
    ∩___∩    |   |  |     J    |  | |  し     || | |
    | ノ\   ,_ ヽ  .|   レ |      |  レ|       || J |
   /  ●゛  ● |   .J      し         |     |       ||   J
   | ∪  ( _●_) ミ             .|    し         J|
  彡、   |∪|   |              .J                レ
 /     ∩ノ ⊃  ヽ
 (  \ / _ノ |  |
  \  "  /  | |
   \ / ̄ ̄ ̄ /
      ̄ ̄ ̄ ̄

696:デフォルトの名無しさん
07/08/01 17:08:56
>>692
reserve

>>694
resize

697:デフォルトの名無しさん
07/08/01 17:10:55
vectorの方が楽
それだけで使用価値があるとは思わないか


698:デフォルトの名無しさん
07/08/01 17:13:17
vectorの方が不便
だって[]での代入が装備されていない

699:デフォルトの名無しさん
07/08/01 17:13:43
>>698
はい?kwsk

700:デフォルトの名無しさん
07/08/01 17:16:27
template <typename T>とtempalte <class T>ってどう使い分けすれば良いんでしょうか?

701:>>699
07/08/01 17:18:39
#include <vector>
#include <iostream>
using namespace std;

main(){
vector<int> v;

v.push_back(1); cout << v[0]<<endl;
v[0]=2; cout << v[0]<<endl;

/* 逆にしたこっちはエラーになる

v[0]=2; cout << v[0]<<endl;
v.push_back(1); cout << v[0]<<endl;


*/

}

702:デフォルトの名無しさん
07/08/01 17:20:46
reserve();で確保すればエラー出ないんだな
しらんかった すまん

703:デフォルトの名無しさん
07/08/01 17:21:27
>>701
そんな使い方ありえないから実装されてない
使いたければオーバライドすればいいじゃん


704:デフォルトの名無しさん
07/08/01 17:26:07
>>700
好みの問題。
ただし、下みたいなテンプレートテンプレートではclassしか使えなかったはず。
template<template<typename T> class T>
こんな機能使わないけど。

705:デフォルトの名無しさん
07/08/01 17:28:39
>>702
reserveで押さえただけ領域は使ってはいけないところ。
vectorで使える要素は0番目からsize()の1つ手前の要素まで。
size()の値を変えるにはresize()。

特に要素がクラスオブジェクトだとコンストラクタが呼ばれていなかったり、
デストラクタが呼ばれた後だったりするのでわかりやすいけど、
組込型でも駄目なことに変わりはない。


706:デフォルトの名無しさん
07/08/01 17:29:21
vectorかnewかどっちがいいかは、巨大配列を確保したときに問われるだろう
何となくvectorは100M超の領域確保に向いていない気がするが・・・
速度、安定性において同程度ならvectorに統一した方がいい




707:デフォルトの名無しさん
07/08/01 17:30:12
>>701
それを不便というなら、比較対照にしてる組み込み型では
int *v = new int[0]
と宣言してるも同然じゃね?

708:デフォルトの名無しさん
07/08/01 17:31:28
>>706
それは仰るとおり
ほとんどの場合はvectorでも問題ないから
おれはvector使う


709:デフォルトの名無しさん
07/08/01 17:31:46
>>704
なるほど
複雑な特殊化をする時に必要となりそうな気がするのでメモっておきます

710:デフォルトの名無しさん
07/08/01 17:37:55
>>706
new[]はoperator new[]関数、newはoperator new関数、
vectorは、operator new関数で確保される。
共に<new>に存在し、operator newとoperator new[]で
異なる実装になっていることは考えづらい。殆どの処理系で、同一の実装だと見なして問題ないはず。
そして、operator newやoperator new[]を自分で定義すれば、メモリ確保ルーチンを差し替えられる。

またvector(やその他全てのコンテナ)はアロケータをテンプレート引数に取り、
それを差し替えることでもメモリ確保ルーチンを変更可能。

不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
それでも不安ならshared_array/scoped_arrayなんて選択肢もあるけどね。

711:デフォルトの名無しさん
07/08/01 18:01:21
>>710
>不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
是。reserve しとけば push_back も怖くない。

712:デフォルトの名無しさん
07/08/01 18:11:39
>>710
オーバーヘッドが掛かったり無駄に確保したりしていないかvector
new単体で使えば2倍の領域確保とかないだろうし

713:デフォルトの名無しさん
07/08/01 18:33:08


      |
      |
      |
      |              /  ̄   ̄ \
     (=)           /、          ヽ
     J >vector厨     |・ |―-、       |
                   q -´ 二 ヽ      |
                 ノ_ ー  |     |
                 \. ̄`  |      /
                   O===== |
                  /          |
                   /    /      |

714:650/668
07/08/01 18:35:00
戻りました。
VC++2005を修復インストールした結果、vector使ってもwarning LNK4217だけで済みました。
fatalなエラーでビルド失敗と言うことはないです。
やっぱ、何かが潰れていたっぽいっすね~。
これでダメなら再インストールしようと思っていましたが、無事に済んだようです。

LNK4217エラーは4つ出て、どれも内容は似ています。
warning LNK4217: ローカルで定義されたシンボル ??1exception@std@@UAE@XZ (public: virtual __thiscall std::exception::~exception(void)) が
フィクション __unwindfunclet$??0logic_error@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z$0 にインポートされました。

僕の今の知識レベルでは、なんのことやら意味不明です。
実用上問題ないなら、#pragma warningで切っておきます。
ありがとうございました。

あれからのログを見ていると、vectorもやっぱり押さえておきたい基本技術みたいですね。
折を見て勉強再開します。


715:デフォルトの名無しさん
07/08/01 18:51:31
念の為OSの再インストールからやり直したほうがいいよ

716:デフォルトの名無しさん
07/08/02 21:26:13
typedef std::vector<Hoge> VEC_HOGE;

を定義したいときにHoge は前方宣言で対応可能でしょうか?
それとも#include しなければいけませんか?

前方宣言の可付加の決まり方がいまいちわかりません。
よろしくお願い致します。

717:デフォルトの名無しさん
07/08/02 23:49:38
typedef std::vector<ちぺなめ Hoge> VEC_HOGE;

718:デフォルトの名無しさん
07/08/03 00:11:16
すみません、質問させてください。
Cのプログラムで、popenを使ってpingを打ちたいと思っています。
その時に、p=popen("ping www.google.co.jp", "w")のように
直接相手先を書くのではなく、文字配列に相手先を格納し、
それを用いてpingを打つ方法がわかりません・・。
一応ぐーぐる先生にお尋ねはしたのですが、わかりませんでしたorz
(聞き方がまずかったのかも知れませんが・・)
どうぞよろしくお願い致します。

719:デフォルトの名無しさん
07/08/03 00:31:34
sprintf使えばいいんじゃないの?

720:デフォルトの名無しさん
07/08/03 00:39:38
入門書読んだ方がいいんじゃないの。
ping先壊したって知らないよ?

721:デフォルトの名無しさん
07/08/03 00:54:31
system()じゃいかんのかね。

722:デフォルトの名無しさん
07/08/03 01:02:11
>>716 って何か意味あんの?

723:718
07/08/03 21:14:19
遅くなってしまいましたが、アドバイスありがとうございました。
正直自分でも、入門書レベルからやり直した方がいいなぁと
自覚はしているのですが、今回は時間に余裕がなかったもので、
ここでお尋ねした次第です・・すみません。ご忠告ありがとうございます。
system()ではどうかとのことですが、プログラムの中でpingの結果を
受け取って処理をしたかったので、今回はsystem()ではなくpopen()を使いました。
記載し忘れてしましたね。ごめんなさい。
sprintfですか。ちょっと試してみたいと思います。
皆様どうもありがとうございましたm(_ _)m

724:デフォルトの名無しさん
07/08/04 20:36:45
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします

725:デフォルトの名無しさん
07/08/04 20:40:50
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします

726:デフォルトの名無しさん
07/08/04 20:43:15
すいません 2回も書いてしまいましたorz

727:デフォルトの名無しさん
07/08/04 21:12:58
-1×-1=1
これ算数。

728:デフォルトの名無しさん
07/08/04 21:16:16
-1 + k

(k % 2) * 2 - 1

729:デフォルトの名無しさん
07/08/05 05:27:34
int v;
for(k=0;k<3;k++)
{
v=-1;
for(l=0;l<3;l++)
{
w[k][l] = v;
v*=-1;
}
}
でいいじゃん

730:デフォルトの名無しさん
07/08/05 06:31:29
>>727>>729
本気でそんなプログラミングしているのか?
桑原桑原。

731:デフォルトの名無しさん
07/08/05 06:39:44
>>730
桑原桑原。

732:デフォルトの名無しさん
07/08/05 07:07:12
w[k][i] = i&1 ? -1 : 1;
を提案します(ぉ

733:デフォルトの名無しさん
07/08/05 07:07:59
lだった…orz

734:デフォルトの名無しさん
07/08/05 10:40:58
>>729
int v = 1;
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = v * -1;
}
}

のほうがすっきり。

735:デフォルトの名無しさん
07/08/05 10:55:06
>>734
9つ全部-1にならない?

736:デフォルトの名無しさん
07/08/05 11:18:23
ここのつ、とう!
はい、よくできました♪

737:デフォルトの名無しさん
07/08/05 11:20:12
??

738:デフォルトの名無しさん
07/08/05 11:49:07
!!

739:デフォルトの名無しさん
07/08/05 11:50:44
3×3の行列の初期化くらいなら、
いちいちfor文で回したりせず、
double w[3][3] = { {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0} }
これでいいじゃないか。


740:デフォルトの名無しさん
07/08/05 11:58:06
例として3×3にしてるだけで、
実際はもっと大きいんじゃないのかな?

741:デフォルトの名無しさん
07/08/05 12:26:55
えー

for(k=0;k<3;k++)
のように、ハードコーディングしてるじゃん。

もし巨大だったり、任意のサイズだったら、そういうコードになるべ?

742:デフォルトの名無しさん
07/08/05 12:33:55
ていうかさ、
行列の問題なのか、
数列の生成の問題なのか、
切り分けてから質問してほしい。

743:デフォルトの名無しさん
07/08/05 12:57:18
全角数字使うなカス

744:デフォルトの名無しさん
07/08/05 18:49:04
揚げ足取り乙

745:デフォルトの名無しさん
07/08/05 18:52:32
揚げ足ってレベルじゃねぇぞカス

746:デフォルトの名無しさん
07/08/05 19:38:47
カスは自分のことを棚に上げる傾向にあります。

747:デフォルトの名無しさん
07/08/06 21:24:19

スレ違いだったらすいません。

アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。

そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!

seishinkeiki@hotmail.co.jp

748:デフォルトの名無しさん
07/08/06 21:27:03
本日中ってあと2時間半しかないぞ

749:デフォルトの名無しさん
07/08/06 21:28:22
バイナリエディタで書き換えたら使える

750:デフォルトの名無しさん
07/08/06 21:31:03
マルチすると来る人が居なくなるかもよ

751:デフォルトの名無しさん
07/08/06 21:32:25
マルチすると釣られる人が居なくなるよ

752:デフォルトの名無しさん
07/08/06 21:46:42
>>747
2万じゃ安いな・・8万でどうだ?

753:デフォルトの名無しさん
07/08/06 21:47:59
ちゃんと引継ぎしとけよ・・・

754:デフォルトの名無しさん
07/08/06 21:48:45
>(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
待遇悪くて逃げられたんか?

755:デフォルトの名無しさん
07/08/06 23:08:57
>>747
解析料が必要です。弊社なら50万円で納期2週間で考えてみましょう。
プログラムのソースによって見積もりのさじ加減はかなり違います。

756:デフォルトの名無しさん
07/08/06 23:13:25
2万とか・・・どんだけ買い叩いてんだよ

757:デフォルトの名無しさん
07/08/06 23:14:45
ローカルにプロクシ立てるとかすれば何もいじらずに済むんじゃね?

758:デフォルトの名無しさん
07/08/07 01:09:59
多重ループを一気に抜ける方法って、いちいちbreak文つけるか、gotoしかないんですか?

例えば、swtich文の中のif文で、break文以外の処理も行いたい時、
同じif文を二回書くことになるので、なんか無駄に長くなってしまうのですがorz

759:デフォルトの名無しさん
07/08/07 01:11:53
gotoつかやいいじゃん。

760:デフォルトの名無しさん
07/08/07 02:12:19
もうひとつある
そのループを別の関数に分離してreturn

761:デフォルトの名無しさん
07/08/07 03:22:37
賛否あるが、throwってのもある。

762:デフォルトの名無しさん
07/08/07 03:46:58
つか、何の言語?

763:デフォルトの名無しさん
07/08/07 07:36:16
スレを勃てるまでもないC/C++の質問はここで 2

764:762
07/08/07 09:25:29
うぁ、すれ立てるまでもない質問はここでスレだと思ってた!

765:デフォルトの名無しさん
07/08/07 10:06:26
(*´д`)σ))Д`)

766:デフォルトの名無しさん
07/08/07 15:07:36
棒倒し法で迷路を自動生成するプログラムを作ろうとしているんですが、すべての棒が同じ方向に倒れます。
下が棒を倒す部分の関数なんですが、どこが間違ってるのか教えてください。

void KnockDown(){
 int i,j;
 for(j=2;j<19;j+=2){
  for(i=2;i<19;i+=2){
   srand( (unsigned int)time(NULL) );
   switch (rand()%4){
   case 0:// 北
    if(maze[i][j-1]!=0) maze[i][j-1]=0;
    break;
   case 1:// 東
    if(maze[i+1][j]!=0) maze[i+1][j]=0;
    break;
   case 2:// 南
    if(maze[i][j+1]!=0) maze[i][j+1]=0;
    break;
   case 3:// 西
    if(maze[i-1][j]!=0) maze[i-1][j]=0;
    break;
   }
 }}
}

767:デフォルトの名無しさん
07/08/07 15:11:43
>>766
srand()は最初に呼ぶだけにしよう。

768:デフォルトの名無しさん
07/08/07 15:11:45
質問なのですが
動画にマイクで声をつけるのはどうやってやるんですか?
後、動画の編集の仕方も教えてください
よろしくおねがいします

769:デフォルトの名無しさん
07/08/07 15:14:09
板 違 い

770:デフォルトの名無しさん
07/08/07 15:21:32
>>766
0が壁で0以外が通路?何か違和感あるなw
あと、ランダムで決定したところにすでに壁ができていた場合どうなると思う?

771:デフォルトの名無しさん
07/08/07 17:07:05
質問です。
ウインドウズでメモリーリークを知るには_CrtDumpMemoryLeaks()を使いますが、
メモリースマッシュを知るにはどうすればいいのでしょうか?

##二重開放とかそういうことです。

772:デフォルトの名無しさん
07/08/07 18:54:14
>>766
一つ言わせてくれ。

質問する前に2つのことをすべし。
1. デバッガでステップ実行する。変数の値の中身も見ること。
2. 問題を切り分ける。

あなたの問題は、
すべての棒が同じ方向に倒れる
のではなく、
rand()%4が同じ値になる
でしょうに。


773:デフォルトの名無しさん
07/08/07 19:05:37
>>771
二重解放なら、
デバッグビルドをデバッガ上で走らせていれば、
デバッガのトレース出力にメッセージが出たと思う。

とりあえず、
_CrtSetDbgFlagで_CRTDBG_DELAY-_FREE_MEM_DFと_CRTDBG_CHECK-_ALWAYS_DFをオンにして、
わざと二重解放してみよう。

オーバーヘッドが多き過ぎるなら、
_CRTDBG_CHECK-_ALWAYS_DFはオフにして、
自分で_CrtCheckMemoryを呼ぶ。

_CrtSetAllocHookを使って、自分でチェックするのも手。

774:デフォルトの名無しさん
07/08/07 21:54:33
>>773
レスサンクス!!

デバッガが警告出してくれるっぽいですねぇ。
コレで安心してメモリ確保ができるってもんです。
当方、趣味グラマの初心者なのでメモリ確保が苦手なのです。
レスほんと、サンクス!



余談ですが、こういうの作ってました。
URLリンク(f20.aaa.livedoor.jp)
内容は参照カウンタ(本命)と配列クラス(デモ)です。
デバッグは済んでいないので使用は自己責任で。

それじゃー。:D

775:デフォルトの名無しさん
07/08/07 22:02:39
む!直リンできないか。

URLリンク(f20.aaa.livedoor.jp)
または、
URLリンク(f20.aaa.livedoor.jp)
から、取れるかも。

776:デフォルトの名無しさん
07/08/07 23:21:35
>>774
deleteした直後にNULLを代入するのは、
二重解放によるヒープの破壊を防ぐために良いことだが、
そうすると二重解放していてもチェックに引っかからないぞ!

NULLを代入するのをやめるか、
NULLの代わりに-1などのアリエナイ値を代入するのがいいかと。

777:デフォルトの名無しさん
07/08/07 23:26:58
へー

778:デフォルトの名無しさん
07/08/08 01:41:57
^←これどうやって入力するんでしょうか?いい加減コピペは卒業したい

779:デフォルトの名無しさん
07/08/08 01:43:44
キーボード右上「へ」のキー
ってか、ここはC/C++の質問スレなわけで・・・


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