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


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

スレを勃てるまでもないC/C++の質問はここで 2



1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/


496 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 17:13:03 ]
>>495
賢いのう、ワレ!

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

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

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

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

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

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

501 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:20:28 ]
ループ成立w

502 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 20:32:46 ]
別にprintfでもputs/fputsでも、そんなん好みの問題やん。

503 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 00:05:05 ]
TCP/IPではパケットサイズを期待してはいけない。それは下位層によって1バイトずつに分断されているかもしれない。
UDPではパケット到来順序を期待してはいけない。それは経路によって順不同に並べ替えられているかもしれない。
だっけ?



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

環境による。

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

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

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

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

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

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


506 名前:デフォルトの名無しさん [2007/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 mailto:sage [2007/07/10(火) 19:33:25 ]
ちょっと訂正
APIで1480バイトを指定するのではなくて、
窓の手でMTUを指定する(Windowsの場合)。
社内LANだけの場合は1500にする。

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

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

510 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:05:31 ]
>>508
それ、学校の宿題か?


511 名前:505 mailto:sage [2007/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 mailto:sage [2007/07/10(火) 22:30:23 ]
> IPヘッダ専用のチェックサムはあるが、それはデータとは無関係。データ自身には何のチェックバイトもない。

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

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

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

なんか違うなぁ。

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



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

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

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



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

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

517 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:03:30 ]
VC2005でデバッグしてからgccにもってくのもあり

518 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:03:50 ]
gdbの事かー

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

519 名前:503 mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:17:16 ]
>>519
> B+C+Aの順序になっちゃうこともあるということでしょうか?

ない。


521 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:15:34 ]
そもそも一回のrecvで全部取れる保証が無い。

522 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 08:49:29 ]
>>521
それはTCPの場合ね。


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

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

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

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

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

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

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

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

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

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

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

524 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 10:17:45 ]
>>523
何も有益な話はないな。



525 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 12:01:24 ]
>>603にプレッシャーがかかりました

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

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

って感じで実行すると

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

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

527 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 16:37:56 ]
キーバッファからなんか喰ってるんだろ。

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

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

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

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

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


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

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

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

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


533 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 21:13:36 ]
>>531
「scanf系」ってなんじゃらほい?

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



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

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

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

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

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

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

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

541 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 10:07:18 ]
別に生じないけど、getchar()使ってscanf系を使わない選択肢もあるべ

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

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

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



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

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

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

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


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

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

551 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 04:07:09 ]
POSIXな環境に移行すりゃいいんじゃないかね。

553 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 08:43:07 ]
>>551
#include <unistd.h>

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

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



555 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:05:49 ]
unistd = UNIX standard

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

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


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

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

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

559 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 22:46:37 ]
>>558
俺はドウブレって読んでた。

560 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 22:51:07 ]
charはキャラと読む人も居るが、
ttp://www.research.att.com/~bs/bs_faq2.html#char
によると、チャーが正しいようだね

561 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:35:18 ]
勝手にしてください

563 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:50:59 ]
typedefすら面倒なのかよ

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



565 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:39:33 ]
クラスの中にクラスを定義できるけど、
関数の中に関数を定義するにはどうすればいいの。

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

567 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:40:23 ]
もとい

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

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

569 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 11:06:24 ]
>>568
ありがとう。

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


570 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 22:04:32 ]
生スペースか

571 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 02:33:18 ]
関数の中に構造体を定義してその中に関数を定義する。

572 名前:566 mailto:sage [2007/07/18(水) 03:15:23 ]
>>571
目から鱗です。

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

573 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 22:54:54 ]
>>524
結局ごまかしてる

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



575 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 20:06:59 ]
うん

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

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

catch(...)

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

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

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

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

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

こんなんでどうか

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

581 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:23:04 ]
>>577
コンパイラオプション/EHa使え

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

583 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:30:53 ]
嗚呼、ぬるぽ

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



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

586 名前:デフォルトの名無しさん [2007/07/24(火) 19:46:46 ]
>>584
>>582が低脳だから


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

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

589 名前:582 mailto:sage [2007/07/24(火) 19:58:19 ]
なんだかよくわかりませんがもう一度コンパイルしたら
でてきました
どうもすいません

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

591 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 20:49:48 ]
>>581

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

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

593 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 08:22:35 ]
>>592
std::map?

594 名前:592 mailto:sage [2007/07/27(金) 08:33:40 ]
サンプルを自力で発見しました。
どうもお騒がせしました




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

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






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

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

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