[表示 : 全て 最新50 1-99 101- 2chのread.cgiへ]
Update time : 06/01 02:39 / Filesize : 36 KB / Number-of Response : 158
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



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

2 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:04:16 ]
おつ

3 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:08:01 ]
壱乙

4 名前:デフォルトの名無しさん [2008/06/15(日) 03:23:26 ]
おついち

5 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:25:08 ]
乙一

6 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 08:42:21 ]
インデントの話だが・・・
俺はどっちでもおk派。VCに貼り付けてCtrl + spaceで一発解決w

7 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 11:24:40 ]
(・ω・`)1乙 ←ポニーテール

 は思いつかなかったな〜
ちょっとてst

>>6
まぁでもコピペすらしない人多いと思うよw

8 名前:7 mailto:sage [2008/06/15(日) 11:30:45 ]
あぁん俺の環境じゃ も潰れるw
f();  
   f();  
f(); 	

9 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 11:40:37 ]
連投ごめん。ちょっとレス参照を。>>8

10 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 11:54:36 ]
>>8で書き込み時の文
   f();  
   f();  
	f(); 	

>>8を素のIE/禁断の壷+IEで表示及びコピペした場合
 の部分が潰れずに空白になる。コピペしても通常の半角空白。
他は潰れて消える。

>>8をjaneで表示及びコピペした場合
 の部分が潰れずに空白になる。コピペしても通常の半角空白。
 の部分はjane上では潰れずに空白になるけど、
コピペすると空白にならず、  になる。
&am;#9;は潰れて消える。



通常/専用ブラウザで読みやすくするのは全角スペースしかなさげ。
コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜



11 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 12:01:42 ]
ML系やHaskellやPythonみたいにインデントに文法上の意味がある言語は大変だよなー。
そういうスレを見てきた立場からすると「どうでもいいじゃん」って思ってしまう。

12 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 12:19:05 ]
>>11
見てきたけど、Haskellスレでは全角スペース推奨、
Python宿題スレはロダ推奨で、全角スペースが使われてて、
Python初心者スレでは全角スペース(主に質問者)と が使われてるね。

13 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 12:43:48 ]
>>10

> 通常/専用ブラウザで読みやすくするのは全角スペースしかなさげ。
 も表示だけなら潰れない、と読めたのだが気のせい?

> コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜
これはそのようだね

14 名前:10 mailto:sage [2008/06/15(日) 13:04:58 ]
>>13
> も表示だけなら潰れない、と読めたのだが気のせい?
ごめん素で間違えた。その通りです。

15 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 14:46:16 ]
2ch も pre コマンドを採用すればいいのにね。
メール欄に pre と書くと pre タグが使われるようにする奴。

16 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 14:53:46 ]
だな

17 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:40:57 ]
a=c;
b=a;

a=b=c;
って同じことですか?

18 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:45:13 ]
ちがう

19 名前:デフォルトの名無しさん [2008/06/15(日) 15:48:08 ]
まとめるとしたら
b=a=c;だな

20 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:54:45 ]
厳密に考えればそれも違うけどね。



21 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:10:05 ]
=は左結合だから
b=a=c;⇔b=(a=c);

でも
a=cが、aにcを代入した後のものを返すか、それ以前のaを返すかは未定。

22 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:13:30 ]
>>20
どう違うのか教えて欲しいです

23 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:15:14 ]
まー、普通のプリミティブなデータ型なら、そこまで気にする必要はないだろうけどね
基本的には同じと思っていいよ
ただ、それに囚われていちゃダメ

C++ならoperatorでやりたい放題だし

24 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:15:38 ]
>>22
20じゃないけど、
「ユーザー定義型のoperator=()の戻り値が、必ずしも*thisになってるとは限らない」
というのを考慮してるのでは。

25 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:16:57 ]
アセンブリの話する気か?

26 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 16:34:24 ]
aがvolatile指定されていた場合、
a=c; b=a; はaに対してwriteとreadが1回ずつ発生するが、
b=a=c; はaからreadする保証が無い。

ってことか?

27 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:42:39 ]
保証されると思う。

28 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:46:39 ]
>>25
できるよ。
以上。
↓次の方どうぞ

29 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:47:38 ]
>>21
何を言っとるんだお前は

30 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:51:54 ]
>>21
代入した値、つまりはcと同じ
を返すに決まってるだろ個の貸す



31 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:08:16 ]
CとC++を学び、そろそろGUIでゲームを作りたいのですが、
CかC++ベースでGUIプログラムを作るにはどうすればいいのでしょうか?
幅広く使用されている方法が望ましいです。

32 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:10:03 ]
>>31
directXのラッパーライブラリあたりでも使えばいいんじゃない?
dxlibとかyanesdkとか
あとSDLとかでも


33 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:30:44 ]
>>23 >>26はちゃんとわかってるな。
論理上保障されないという事態が起きるのは、
bがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。
スレッドが絡むとさらにカオスになるから触れないでおこう。
それ以外では気にすることではない。

34 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:31:51 ]
>bがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。 
aがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。 

ミスった

35 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:43:22 ]
aがレジスタの場合も動作が違ってくる。
組み込み系の話だけど。

36 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:46:45 ]
ああCPUその他のハードウェアによってはvolatileが
実現できない場合があるな

37 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:47:03 ]
=演算子の式の値をどうコンパイラが解釈してるかなんだよね
VC++2008の場合はvolatile bでbからロードしなおしていた

38 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 18:58:25 ]
>>32
どもども、調べてみます。DirectXが王道ですかね

39 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 19:06:23 ]
初心者向けのゲーム作る用の本とかは店においてるのはよく見るな

40 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 19:12:25 ]
>>17の俺は勉強始めたての素人で
今はまだ皆さんの回答の意味が理解できなさそうなのでとりあえず
a=b=cじゃなくてb=a=cだったら
同じことではないけどだいたい同じ
とだけ覚えておきます
ありがとうございました



41 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 19:19:21 ]
今勉強したての素人から脱したんだよ。

42 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 19:23:01 ]
普通にやってたら、この程度のことまず気にしてねーもんなw
まー、俺は=演算子を1行に複数に書くこと自体やらないが

43 名前:デフォルトの名無しさん [2008/06/15(日) 19:42:15 ]
質問です
環境はWindowsXP,言語はCです.

system関数(またはそれに近い関数)を使って別のプログラムを時間制限付きで起動させたいです
例えば,a.exeというプログラムを実行させて,30秒たっても処理が完了していなかったらa.exeを強制終了させたいです.
なにか良い方法はありますか

44 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 19:50:17 ]
>>43
CreateProcess / TerminateProcess

45 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 20:56:40 ]
>>43-44
内容にもよるけど、行儀のいい方法では無いな。

46 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 21:40:58 ]
でも行儀のいい方法は書かないんだね。

47 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 21:43:40 ]
処理が完了という判断は、a.exeのプロセスが生きているかどうかだけでいいのか?

48 名前:43 [2008/06/15(日) 22:20:34 ]
>>47
すみません,書き忘れました.
a.exe は処理が完了したら終了します.

>>44
どもありがとうございます
調べてみます

49 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 22:25:59 ]
>>46
強制終了って前提条件が既に行儀悪いからな。

50 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 23:16:20 ]
普通は数秒で終わるものがバグとかで終了しなかった場合、じゃないの?
俺はそう思ったけど。



51 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 23:18:47 ]
相手がコンソールプログラムならGenerateConsoleCtrlEventの方が
少しはマシかな。

52 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:23:19 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6924.txt
このポインタについてなんですが
p->nextには何のアドレスも入ってないのに
何で次の人のアドレスを指し示すことができるんでしょうか?
あるいはどこかでp->nextに何かの値が入ってるんでしょうか?

53 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:23:19 ]
#define offsetof(type, member) ((size_t)&((type*)0)->member)

このマクロの(type*)0->memberはどういう意味なのでしょうか?
0番地のtype型のメンバ変数memberでよいのでしょうか?

54 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:28:41 ]
>>53
そのとおりなんだけど、実際にはそんなものは存在しなくて、直後にアドレスを size_t に
無理やり変更することで offsetof() が返すべき値を取り出している、というところまで
合わせて意味を持つ。コンパイラの実装を知っている立場でなければ、真似しちゃいけない。

55 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:35:18 ]
>>52
よく読んでないけど last->next=p で入れてるんじゃね

56 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 03:40:04 ]
>>52
last->next=p;
last=p;
と分ければわかりやすいでしょうか。

57 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 11:50:32 ]
>>55-56
ありがとうございます
もう少しで分かりそうなんでもうちょっと頑張ります

58 名前:デフォルトの名無しさん [2008/06/16(月) 16:11:09 ]
事情によりコードはupできなくて申し訳ないのですが、質問させて下さい。
ヘッダで宣言したメンバ関数を.ccで実装するとき、いくつかの関数でmultiple definitionと言われてコンパイルできません。
インクルードガードはもちろんかけています。例えば、
[foo.h]
#ifndef _FOO_H_
#define _FOO_H_

class foo{
private:
int a,b,c;
pulic
int getA();
int getB();
int getC();
}

#endif

[foo.cc]
#include "foo.h"

int foo::getA(){return a;}
int foo::getB(){return b;}
int foo::getC(){return c;}
とかなっているときに、getAはOKなのにgetBとgetCのみmultiple definitionと言われるような状況です。
他にも、引数なしのコンストラクタはOKなのに、引数付きでオーバーロードしたコンストラクタのみ
mutiple definitonと言われたりします。
これらの現象は全て、問題の関数実装時にinline宣言すると消えます。これはどういう問題なのでしょうか。

59 名前:58 [2008/06/16(月) 16:12:37 ]
すみません>>58で、
public
のあとに:が抜けてました。
実際のコードではそういったミスはありません。

60 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:17:19 ]
>>58
現象を再現できる最低限の断片を作って張ってくれ。
尤も、その過程で原因が判ることもしばしばだが。

例えば、getA()がエラーにならないのは使ってないからじゃないかと思うが>58だけでは判断できん。



61 名前:58 [2008/06/16(月) 16:33:55 ]
>>60
すみませんが今すぐは作れないので、後でまた張りに来たいと思います。


62 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:23:38 ]
Cから呼び出したDLL内でEXCEPTION_ACCESS_VIOLATION (0xc0000005)
が発生した場合、それをC側から補足できますでしょうか?
例外が発生したことを上の関数に返したいのですが
難しいでしょうか?

よろしくお願いいたします。

63 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:42:36 ]
>>62
Windowsの話なら、WinAPIスレで過去に話題になってたかと。

64 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:48:36 ]
>>63
ありがとうございます。APIスレにいってきます。

65 名前:58 [2008/06/16(月) 19:27:04 ]
>>60
色々やってたら解決しました。
どうも元々ひとつだったヘッダファイルを細分化したときに、makefileの方で変なことをやってしまったのが原因ぽいです。
どうもありがとうございました。

66 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:05:22 ]
なんでカウント変数にiを使うのですか?
なにかの略なんですか?

67 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:07:00 ]
iterator

68 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:10:53 ]
indexの説もあったような

69 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:13:03 ]
特に理由は無いけどindexだと思ってた。idxってのもよくあるし

70 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:15:12 ]
古代FORTRANで、一文字トークンにaからhが予約されていて
ユーザーが自由に使えるものがiからしかなかったのがそもそもの由来。



71 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:17:04 ]
それたまに聞くけど、
  n
 Σa_i
 i=1
とか数学で使う際の i って
FORTRAN 以降で広まったものなのか?

72 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:22:38 ]
古代FORTRANの場合宣言なしで使える変数があって、
I,J,K,L,M,Nあたりが宣言なしで整数、
それ以外が宣言なしで実数だった。

73 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:24:29 ]
ありがとうございます

74 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:56:52 ]
>>71
まさか。
もっと昔から使われてるよ。

75 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:57:14 ]
>>72
そもそも整数がその範囲に割り当てられた理由もあるんじゃね?

76 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:57:48 ]
>>74
ですよねー。

77 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:58:55 ]
FORTRAN は数式を扱うことを目的に作られたから
イテレーションによく使われていた i から始まり、
整数値としてよく使われていた n までを整数にした、
と考えるのが自然な気がするよ。

78 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 22:10:58 ]
FORTRANのiはintegerのiだな。

79 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 22:16:35 ]
数学で使われる方のiがintegerのiとは考えんのかね。

80 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 22:17:57 ]
indexのiにきまってるだろ。



81 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 22:24:20 ]
H の後に I があるなんてJokeだよ

82 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:00:56 ]
LinuxもしくはOS Xでgccを使った場合の質問です。

- /usr/local/lib/libFOO.a
- bar.cxx

の2つがあり、bar.oとlibFOO.aを合体させて、
libbar.soというのを作りたいと思っています。
(libFOO.aも共有ライブラリの中に組み込んでしまいたい)
この場合、

$ g++ bar.cxx -o bar.o
したあとに、どのようにすれば良いのでしょうか。

83 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:23:06 ]
マニュアルを読めばいいと思うよ

84 名前:82 [2008/06/17(火) 01:23:16 ]
なんでそんなことをする必要があるかと言うと、
色々なライブラリを必要に応じて読み込むソフトがありまして、
そいつに自作のライブラリを読み込ませるためには、
必ず共有ライブラリじゃないと駄目なんです。

なので、libFOO.aを読み込ませる場合には、
一回自分で共有ライブラリを作らないといけない、と。

85 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:32:25 ]
>>84
分かりました、マニュアルを読んでくさい

86 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 04:26:59 ]
>>84
www.google.com/search?q=共有ライブラリ gcc

87 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 08:39:42 ]
>>81
HしてもIがなかったらJuniorが生まれてこないとは考えんのかね。

88 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 12:57:29 ]
>>87
望まれないJuniorっていう不幸もあるからなぁ

89 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:19:32 ]
Knockが足りなかったんだろう

90 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:21:14 ]
つまんないからやめろ



91 名前:デフォルトの名無しさん [2008/06/17(火) 19:06:29 ]
抽象的な質問で申し訳ないですが

あるクラスのメンバ関数を実装するとき、内部の処理をベタ書きすると
長くなるので、関数化したいことは良くあると思います。

このとき、その関数化したい処理そのものは、もとのメンバ関数の処理に比べて
低級な処理なので、同じクラスのメンバ関数として定義するのには違和感があります。
かといって、専用のクラスを作るほどではないと感じる場合があります。
こういう場合、どういった形で関数を定義するべきでしょうか。

例えば、積分をするためのループ処理1ステップ分を関数化して切り出したい場合などです。

92 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:07:38 ]
よくわからんがprivate関数じゃだめなの?

93 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:09:35 ]
アクセス制御で外からは見えない関数にすればいいよね

94 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:14:42 ]
内部クラスの静的メソッドでいいよ。

95 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:31:17 ]
ttp://www.cmagazine.jp/
C言語の本を買ったのですがサンプルソースのあるページにアクセスできません?
アク禁になっているのか知りたいので他の人アクセスできるか試してもらえませんか;;


96 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:42:58 ]
>>91
自分専用ライブラリを放り込んでおく場所を決めておくと良いよ。

97 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:43:16 ]
Cマガ休刊したんじゃないっけ?

98 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:47:50 ]
>>95
こんなときこそあれだ
web.archive.org/web/20060423121809/www.cmagazine.jp/src/index.html


99 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:01:15 ]
>>98
そのサイトもアクセスできません・・・。
スレ違いですが質問させてください。
代わりにソースプログラムを配布しているサイトご存じないですか?

100 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:03:59 ]
>>98 で落とせるけど。
文字コードは EUC な。



101 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:10:42 ]
>>100
ダウンロードできました!!
ありがとうございます><

102 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:57:50 ]
コピーコンストラクタを呼ばずにキャスト演算子使う方法はありますか?
こんなんでエラーが出ちゃって困ってます

class NoCopy{
public:
 NoCopy(int){}
private:
 NoCopy(const NoCopy &);
};

class Hoge{
private:
 operator NoCopy(){
  return NoCopy(i);
 }
};

int main(){
 Hoge h();
 static_cast<NoCopy>(h); //エラー!
 return 0;
}

103 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:00:42 ]
class NoCopy{
public:
 NoCopy(int){}
private:
 NoCopy(const NoCopy &);
};

class Hoge{
public:
 operator NoCopy(){
  return NoCopy(i);
 }
};

int main(){
 Hoge h();
 h.operator NoCopy(); //エラー!
 return 0;
}

104 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:05:33 ]
> Hoge h();
引数無しでHoge型を返す関数のプロトタイプ宣言

105 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:25:32 ]
>>102
何をしたいのか理解に苦しむけど、リファレンス返すのはどう?
#include <iostream>
#include <memory>
class NoCopy {
  int val_;
  NoCopy(const NoCopy&);
  NoCopy& operator=(const NoCopy&);
public:
  NoCopy(int val) : val_(val) {}
  void dump() const { std::cerr << val_ << std::endl; }
};
class Hoge {
  std::auto_ptr<NoCopy> nocopy_;
public:
  Hoge() : nocopy_(0) {}
  operator NoCopy&() {
    nocopy_ = std::auto_ptr<NoCopy>(new NoCopy(1));
    return *nocopy_.get();
  }
};
int main() {
  Hoge h;
  NoCopy& nocopy = h;
  nocopy.dump();
}

106 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:37:20 ]
別にコピー禁止クラスにキャストしたい訳じゃなくて
キャスト演算子が必ずコンストラクタを2回呼ぶのが気に食わなかっただけです
使い捨て一時オブジェクトのためにポインタ持たせたくないし、
直接関数呼び出しするくらいなら普通のメンバ関数にしようと思います
ありがとうございました

107 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:39:17 ]
ある圧縮ファイルの読み込み関数使ったら戻り値がバイナリデータへのvoid*なんですが
これをFILE構造体に変える方法ってありますか?
VC2008exp使ってます。





108 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:42:44 ]
>>106
最適化してるか?

109 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:51:36 ]
>>107
「FILE メモリストリーム」でググってみれば?

110 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:55:39 ]
>>108
してますけど、どちらかというと精神的な問題なので

でも規格読むとstatic_castでキャスト演算子呼ぼうとすると
一時オブジェクト作るのに絶対コピーコンストラクタ使うらしいので諦めました



111 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:58:03 ]
そんなあなたにPOD型

112 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:59:45 ]
>>110
戻り値最適化の話なんだけど。

113 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:05:36 ]
戻り値最適化って関数3段階経ても効くんですか?
戻り値最適化効いた結果が2回だと思ったんですけど

114 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:10:52 ]
とりあえず2回呼ばれるというコードはどれ

115 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:21:39 ]
#include <iostream>
struct X{
 X(){std::cout<<"X()"<<std::endl;}
 X(const X&){std::cout<<"X(X&)"<<std::endl;}
};
struct Y{
 operator X(){return X();}
};

int main(){
 Y y;
 static_cast<X>(y);
 return 0;
}

VC2008で
X()
X(X&)
って表示された

116 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:24:16 ]
g++ だと X() としか表示されないけど。
Release ビルドでもそうなる?

117 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:26:42 ]
失礼します。
Visual Studio 2005、C++言語でファイルストリームを用いたファイル入出力について質問させてください。

ifstream fin("test.txt");
のように相対パスで指定した場合は正常にファイルが開かれるのですが、

ifstream fin2("C:\\Documents and Settings\\ORESAMA\\デスクトップ\\test.txt");
と絶対パスで指定するとファイルが開けません。

(ちなみに、C言語風にfopen()を用いた場合は絶対パス指定でもファイルオープン出来ました。)

これはどのような原因が考えられ、またどのように対処すれば良いかご教授頂けないでしょうか。
何卒よろしくお願いします。

118 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:27:40 ]
Releaseでも同じだった
規格上はこっちが正しいんじゃないのかしら

119 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:28:07 ]
VC++ 2005 には fstream に日本語パスを渡すとファイルが開けないバグがあったはず。

120 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:29:25 ]
>>118
最適化レベルあげてみてもだめ?

規格上は、コピーコンストラクタを省略できる所は省略していいって仕様が別の所に書いてある。
すげー分かりにくいけど。



121 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:30:34 ]
ああ、バグじゃなくて、ロケール設定が必要だということらしい。
setlocale(LC_ALL, ""); と書いてみて。

122 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:31:09 ]
いや、バグはバグでいいのか。

123 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:40:17 ]
>>120
最適化設定色々いじくってみたがどうやっても2回呼ぶようだ

124 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:43:13 ]
>>123
VC++ の限界なのかね。

125 名前:117 mailto:sage [2008/06/18(水) 00:46:30 ]
>>119

即レスありがとうございます。
仰る通り試してみたところファイルは問題なくオープンできるようになりました。

しかし、setlocale()より後ろで

cout << "abcde\\あいうえお";
のように日本語の文字列を出力させようとすると、abcde\までが出力されて、プログラムが終了してしまいます。

何度も申し訳ありませんが、どうかご教示お願い申し上げます。

126 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:50:27 ]
>>117
VC++8.0以降はfstreamはワイド文字版のファイル名を受け付けるよ

127 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:51:51 ]
ということは L"..." にすればおk?

128 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:54:25 ]
うん。ちゃんとUTF-16に対応できて、C++なのにstd::setlocale()で
グローバルロケールを弄る必要も無いのが利点

難点は移植性がないことなので、気になるんならboostの力を借りるんだね

129 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:57:18 ]
ファイル名を変数で指定し出すとまたややこしい事になりそうですね。

130 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:59:08 ]
今なら全部UTF-16でコード書く方を勧めるけどね
Win98もサポートするとかなら別だけど



131 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 01:03:15 ]
ま、wchar_t*もchar*も受け取っちまうからねぇ

VC++8.0以降だとcodecvt<>もわりとまともに動くと思うので
string->wstring変換が簡単に書けるが
codecvt<>で使ってるmbstate_tって、一応標準のクセに
標準的な初期化手段すら定められていないという恐ろしい状態だったように思う

「VC++では」
mbstate_t mbs = { 0 };
で初期化できるはずだけど

132 名前:117 mailto:sage [2008/06/18(水) 01:09:50 ]
うーんごめんなさい。
せっかくレス頂いたのに文字フォーマットなどの知識が足りないようで今イチ理解できてません。
皆さんのレスを見る限り今の私にはとても難しそうなので、おとなしくfopen()を使いたいと思います。
こんな初心者の質問につきあって頂き、ありがとうございました。

133 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 01:21:05 ]
「FILE メモリストリーム」でググらなくても
バイト列からストリームで入出力する方法はわかるんですけどね。

知りたいのはFILE構造体を入力として受け付けるライブラリに
別のアーカイブライブラリからの出力であるバイト列をぶち込む方法なんです。

やっぱり前者のほうを書き換えるしかないのかな……。


134 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:05:23 ]
>>133
パイプでも使えばいいんじゃないの?
pipeで作って、FILE*が必要なほうにはfdopenして。

135 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:10:41 ]
>>125
そのとき、いったいどんなエラーメッセージが出てくるの?

136 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:15:58 ]
>>121>>128
C++ならstd::locale::global(std::locale(""));使ってあげてください。
中でsetlocaleも呼ぶので心配しなくて平気。

137 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:42:14 ]
>>117
バグかと思ってたんだけど、仕様らしい。
connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146870

めんどくさいけど標準ライブラリにマルチバイト文字を処理させようと思ったら
プログラム起動時に std::locale::global(std::locale("")) しとくのが正解みたい。

138 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 03:48:48 ]
VC++2005でstlで使用する場合
全体の設定はデフォルトのまま"C"にしておく。
std::locale::global(std::locale("C"))
iostream系を使う場合は個々にロケールを設定する。
std::wcout.imbue(std::locale(""))
std::wcin.imbue(std::locale(""))

VC++2008では確認した限り直ってる


139 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 10:13:21 ]
>>136
ctype以外のカテゴリをグローバルロケールに設定なんてしたくないよ
sstreamの数値フォーマッティングとかにまで影響があるし
やるならctypeだけに絞る

どっちみちWin32ならファイル名はUTF-16なんだから
ファイル名はUTF-16で扱っとかないと、「とりあえず日本語のファイルが開ける」
ようになるだけじゃん

140 名前:91 mailto:sage [2008/06/18(水) 12:57:25 ]
レス遅くなってすみません。ありがとうございました。
色々方法はあることがわかりました。
オブジェクト指向的にどれが正しいか…と考えるとよくわからなくなってしまいます。
privateメンバの中に書いてしまう方式で行こうかと思っています。



141 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 13:39:48 ]
> 134
なるほど。
ありがとう、やってみる。

char dat[8] = "message";
HANDLE pipe_r;
HANDLE pipe_w;
BOOL res = CreatePipe(&pipe_r, &pipe_w, NULL, sizeof(dat));
DWORD dwSize = sizeof(dat);
DWORD dwResult;
WriteFile(pipe_w, (LPCVOID)dat, dwSize, &dwResult, NULL);

int hCrt = _open_osfhandle((long)pipe_r, _O_TEXT);
FILE * fp;
fp = _fdopen(hCrt, "rb");

int n;
while((n = fgetc(fp)) != '\0'){
putchar(n);
}

fclose(fp);
// CloseHandle(pipe_r);
CloseHandle(pipe_w);

これでいいんかね?
この場合
CloseHandle(pipe_r);
するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?


142 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 16:55:20 ]
>>141
> するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
そういうこと。
_open_osfhandleの説明には、_closeが中でCloseHandleする、
_fdopenではfcloseが中で_closeすると書いてある。

あと、_open_osfhandleと_fdopenでモードの指定が食い違っているのと、
_open_osfhandleでのハンドルの型は、longではなく
intptr_t(またはINT_PTR)になっているということが気になった。

143 名前:デフォルトの名無しさん [2008/06/18(水) 17:13:35 ]
#include <iostream>

class intl{
public:
int il;
void setil(int &i){il=i;}
};

int main(){
int *i = new int;
*i = 1;
intl i_intl;
i_intl.setil(*i);
delete i;
std::cout << i_intl.il;
return 0;
}

というようなことをやると、1が出力されます。
私の理解ではintl::setil()は参照仮引数なので、呼び出し時に*iのアドレス、
つまりポインタiが渡され、*iとilが同一のメモリ領域を表すようになるのではと思います。
従ってiをdeleteしてしまうとilも消えるのではと思うのですが、そうなっていないようです。
私の考えのどこが間違っているでしょうか。よろしくお願いします。

144 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 17:24:12 ]
ii_intl.ilが参照でもポインタでもないから、
setilの中では、iからilへ値がコピーされている。

145 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 17:24:59 ]
deleteってのはオブジェクトをもう使わない、とシステムに返す命令。
中身をクリアするわけじゃない。
直後に i を参照すれば、その間に何の処理も行われないからメモリ上は前の値が残っている。
それを参照しているだけ。
いつどのタイミングで、このiの値が書き換えられるかは、誰にも予想できない。

146 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 17:26:08 ]
げ、恥ずかしい。
144のいうとおりだった。
145は早とちり。

147 名前:143 [2008/06/18(水) 17:35:28 ]
レスありがとうございます。
クラスintlの定義を変えて

class intl{
public:
int *il;
void setil(int &i){*il=i;}
};
とした場合はやはりdelete後もilが残り、

class intl{
public:
int *il;
void setil(int &i){il=&i;}
};
とした場合はdeleteによってilも消えるようです。

>>144によれば、iが参照渡しでかつilがポインタであっても
*il = i;
の場合はiのコピーが渡されるということのようですね…。
この場合、il自身はインスタンスi_intlが消えるまで生き残るということですよね?
うーん、ややこしい気がする…。

148 名前:143 mailto:sage [2008/06/18(水) 17:35:56 ]
sage忘れすみません。

149 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 17:58:20 ]
> int *il;
> void setil(int &i){*il=i;}

初期化してないポインタ il が指す場所に値を入れてるのでダメ。

150 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 18:58:58 ]
参照をポインタと似たようなもんだと思っていたら訳ワカメになるよ。
どうやらポインタのほうも理解していないようなので、
まずポインタとメモリの動的確保をきっちり勉強したほうがいいね。



151 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:19:58 ]
巷じゃMozilla Firefox 3.0の話題でもちきりだが、4.0世代はC++で開発するんだな・・・

152 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:20:52 ]
いまままではCC??

153 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:45:48 ]
memcpyは第三引数が0であっても正常に動作する事が保証されていますか?

154 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:06:29 ]
規格に 0 だとダメとか特に書いてないから 0 でも大丈夫。

155 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:07:42 ]
派生の質問だけど、第3引数が 0 で第1第2引数が NULL の場合はどうなんだろ。
memcpy の規格には領域が重なってるときは未定義ってことしか書いてないけど・・・。

156 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:10:46 ]
そういや、いつの間にか規格が文書内検索できるようになってた。
結構文句きてたんだろうな。

157 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:22:31 ]
Foxit Readerで見れなくなっちまった。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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