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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.54【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1210694402/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2008/06/15(日) 03:04:16
おつ
3デフォルトの名無しさん:2008/06/15(日) 03:08:01
壱乙
4デフォルトの名無しさん:2008/06/15(日) 03:23:26
おついち
5デフォルトの名無しさん:2008/06/15(日) 03:25:08
乙一
6デフォルトの名無しさん:2008/06/15(日) 08:42:21
インデントの話だが・・・
俺はどっちでもおk派。VCに貼り付けてCtrl + spaceで一発解決w
7デフォルトの名無しさん:2008/06/15(日) 11:24:40
(・ω・`)1乙 ←ポニーテール

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

>>6
まぁでもコピペすらしない人多いと思うよw
87:2008/06/15(日) 11:30:45
あぁん俺の環境じゃ も潰れるw
f();  
   f();  
f(); 	
9デフォルトの名無しさん:2008/06/15(日) 11:40:37
連投ごめん。ちょっとレス参照を。>>8
10デフォルトの名無しさん:2008/06/15(日) 11:54:36
>>8で書き込み時の文
   f();  
   f();  
	f(); 	

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

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



通常/専用ブラウザで読みやすくするのは全角スペースしかなさげ。
コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜
11デフォルトの名無しさん:2008/06/15(日) 12:01:42
ML系やHaskellやPythonみたいにインデントに文法上の意味がある言語は大変だよなー。
そういうスレを見てきた立場からすると「どうでもいいじゃん」って思ってしまう。
12デフォルトの名無しさん:2008/06/15(日) 12:19:05
>>11
見てきたけど、Haskellスレでは全角スペース推奨、
Python宿題スレはロダ推奨で、全角スペースが使われてて、
Python初心者スレでは全角スペース(主に質問者)と が使われてるね。
13デフォルトの名無しさん:2008/06/15(日) 12:43:48
>>10

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

> コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜
これはそのようだね
1410:2008/06/15(日) 13:04:58
>>13
> も表示だけなら潰れない、と読めたのだが気のせい?
ごめん素で間違えた。その通りです。
15デフォルトの名無しさん:2008/06/15(日) 14:46:16
2ch も pre コマンドを採用すればいいのにね。
メール欄に pre と書くと pre タグが使われるようにする奴。
16デフォルトの名無しさん:2008/06/15(日) 14:53:46
だな
17デフォルトの名無しさん:2008/06/15(日) 15:40:57
a=c;
b=a;

a=b=c;
って同じことですか?
18デフォルトの名無しさん:2008/06/15(日) 15:45:13
ちがう
19デフォルトの名無しさん:2008/06/15(日) 15:48:08
まとめるとしたら
b=a=c;だな
20デフォルトの名無しさん:2008/06/15(日) 15:54:45
厳密に考えればそれも違うけどね。
21デフォルトの名無しさん:2008/06/15(日) 16:10:05
=は左結合だから
b=a=c;⇔b=(a=c);

でも
a=cが、aにcを代入した後のものを返すか、それ以前のaを返すかは未定。
22デフォルトの名無しさん:2008/06/15(日) 16:13:30
>>20
どう違うのか教えて欲しいです
23デフォルトの名無しさん:2008/06/15(日) 16:15:14
まー、普通のプリミティブなデータ型なら、そこまで気にする必要はないだろうけどね
基本的には同じと思っていいよ
ただ、それに囚われていちゃダメ

C++ならoperatorでやりたい放題だし
24デフォルトの名無しさん:2008/06/15(日) 16:15:38
>>22
20じゃないけど、
「ユーザー定義型のoperator=()の戻り値が、必ずしも*thisになってるとは限らない」
というのを考慮してるのでは。
25デフォルトの名無しさん:2008/06/15(日) 16:16:57
アセンブリの話する気か?
26デフォルトの名無しさん:2008/06/15(日) 16:34:24
aがvolatile指定されていた場合、
a=c; b=a; はaに対してwriteとreadが1回ずつ発生するが、
b=a=c; はaからreadする保証が無い。

ってことか?
27デフォルトの名無しさん:2008/06/15(日) 17:42:39
保証されると思う。
28デフォルトの名無しさん:2008/06/15(日) 17:46:39
>>25
できるよ。
以上。
↓次の方どうぞ
29デフォルトの名無しさん:2008/06/15(日) 17:47:38
>>21
何を言っとるんだお前は
30デフォルトの名無しさん:2008/06/15(日) 17:51:54
>>21
代入した値、つまりはcと同じ
を返すに決まってるだろ個の貸す
31デフォルトの名無しさん:2008/06/15(日) 18:08:16
CとC++を学び、そろそろGUIでゲームを作りたいのですが、
CかC++ベースでGUIプログラムを作るにはどうすればいいのでしょうか?
幅広く使用されている方法が望ましいです。
32デフォルトの名無しさん:2008/06/15(日) 18:10:03
>>31
directXのラッパーライブラリあたりでも使えばいいんじゃない?
dxlibとかyanesdkとか
あとSDLとかでも
33デフォルトの名無しさん:2008/06/15(日) 18:30:44
>>23 >>26はちゃんとわかってるな。
論理上保障されないという事態が起きるのは、
bがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。
スレッドが絡むとさらにカオスになるから触れないでおこう。
それ以外では気にすることではない。
34デフォルトの名無しさん:2008/06/15(日) 18:31:51
>bがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。 
aがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。 

ミスった
35デフォルトの名無しさん:2008/06/15(日) 18:43:22
aがレジスタの場合も動作が違ってくる。
組み込み系の話だけど。
36デフォルトの名無しさん:2008/06/15(日) 18:46:45
ああCPUその他のハードウェアによってはvolatileが
実現できない場合があるな
37デフォルトの名無しさん:2008/06/15(日) 18:47:03
=演算子の式の値をどうコンパイラが解釈してるかなんだよね
VC++2008の場合はvolatile bでbからロードしなおしていた
38デフォルトの名無しさん:2008/06/15(日) 18:58:25
>>32
どもども、調べてみます。DirectXが王道ですかね
39デフォルトの名無しさん:2008/06/15(日) 19:06:23
初心者向けのゲーム作る用の本とかは店においてるのはよく見るな
40デフォルトの名無しさん:2008/06/15(日) 19:12:25
>>17の俺は勉強始めたての素人で
今はまだ皆さんの回答の意味が理解できなさそうなのでとりあえず
a=b=cじゃなくてb=a=cだったら
同じことではないけどだいたい同じ
とだけ覚えておきます
ありがとうございました
41デフォルトの名無しさん:2008/06/15(日) 19:19:21
今勉強したての素人から脱したんだよ。
42デフォルトの名無しさん:2008/06/15(日) 19:23:01
普通にやってたら、この程度のことまず気にしてねーもんなw
まー、俺は=演算子を1行に複数に書くこと自体やらないが
43デフォルトの名無しさん:2008/06/15(日) 19:42:15
質問です
環境はWindowsXP,言語はCです.

system関数(またはそれに近い関数)を使って別のプログラムを時間制限付きで起動させたいです
例えば,a.exeというプログラムを実行させて,30秒たっても処理が完了していなかったらa.exeを強制終了させたいです.
なにか良い方法はありますか
44デフォルトの名無しさん:2008/06/15(日) 19:50:17
>>43
CreateProcess / TerminateProcess
45デフォルトの名無しさん:2008/06/15(日) 20:56:40
>>43-44
内容にもよるけど、行儀のいい方法では無いな。
46デフォルトの名無しさん:2008/06/15(日) 21:40:58
でも行儀のいい方法は書かないんだね。
47デフォルトの名無しさん:2008/06/15(日) 21:43:40
処理が完了という判断は、a.exeのプロセスが生きているかどうかだけでいいのか?
4843:2008/06/15(日) 22:20:34
>>47
すみません,書き忘れました.
a.exe は処理が完了したら終了します.

>>44
どもありがとうございます
調べてみます
49デフォルトの名無しさん:2008/06/15(日) 22:25:59
>>46
強制終了って前提条件が既に行儀悪いからな。
50デフォルトの名無しさん:2008/06/15(日) 23:16:20
普通は数秒で終わるものがバグとかで終了しなかった場合、じゃないの?
俺はそう思ったけど。
51デフォルトの名無しさん:2008/06/15(日) 23:18:47
相手がコンソールプログラムならGenerateConsoleCtrlEventの方が
少しはマシかな。
52デフォルトの名無しさん:2008/06/16(月) 02:23:19
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6924.txt
このポインタについてなんですが
p->nextには何のアドレスも入ってないのに
何で次の人のアドレスを指し示すことができるんでしょうか?
あるいはどこかでp->nextに何かの値が入ってるんでしょうか?
53デフォルトの名無しさん:2008/06/16(月) 02:23:19
#define offsetof(type, member) ((size_t)&((type*)0)->member)

このマクロの(type*)0->memberはどういう意味なのでしょうか?
0番地のtype型のメンバ変数memberでよいのでしょうか?
54デフォルトの名無しさん:2008/06/16(月) 02:28:41
>>53
そのとおりなんだけど、実際にはそんなものは存在しなくて、直後にアドレスを size_t に
無理やり変更することで offsetof() が返すべき値を取り出している、というところまで
合わせて意味を持つ。コンパイラの実装を知っている立場でなければ、真似しちゃいけない。
55デフォルトの名無しさん:2008/06/16(月) 02:35:18
>>52
よく読んでないけど last->next=p で入れてるんじゃね
56デフォルトの名無しさん:2008/06/16(月) 03:40:04
>>52
last->next=p;
last=p;
と分ければわかりやすいでしょうか。
57デフォルトの名無しさん: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宣言すると消えます。これはどういう問題なのでしょうか。
5958:2008/06/16(月) 16:12:37
すみません>>58で、
public
のあとに:が抜けてました。
実際のコードではそういったミスはありません。
60デフォルトの名無しさん:2008/06/16(月) 16:17:19
>>58
現象を再現できる最低限の断片を作って張ってくれ。
尤も、その過程で原因が判ることもしばしばだが。

例えば、getA()がエラーにならないのは使ってないからじゃないかと思うが>58だけでは判断できん。
6158:2008/06/16(月) 16:33:55
>>60
すみませんが今すぐは作れないので、後でまた張りに来たいと思います。
62デフォルトの名無しさん:2008/06/16(月) 17:23:38
Cから呼び出したDLL内でEXCEPTION_ACCESS_VIOLATION (0xc0000005)
が発生した場合、それをC側から補足できますでしょうか?
例外が発生したことを上の関数に返したいのですが
難しいでしょうか?

よろしくお願いいたします。
63デフォルトの名無しさん:2008/06/16(月) 17:42:36
>>62
Windowsの話なら、WinAPIスレで過去に話題になってたかと。
64デフォルトの名無しさん:2008/06/16(月) 17:48:36
>>63
ありがとうございます。APIスレにいってきます。
6558:2008/06/16(月) 19:27:04
>>60
色々やってたら解決しました。
どうも元々ひとつだったヘッダファイルを細分化したときに、makefileの方で変なことをやってしまったのが原因ぽいです。
どうもありがとうございました。
66デフォルトの名無しさん:2008/06/16(月) 20:05:22
なんでカウント変数にiを使うのですか?
なにかの略なんですか?
67デフォルトの名無しさん:2008/06/16(月) 20:07:00
iterator
68デフォルトの名無しさん:2008/06/16(月) 20:10:53
indexの説もあったような
69デフォルトの名無しさん:2008/06/16(月) 20:13:03
特に理由は無いけどindexだと思ってた。idxってのもよくあるし
70デフォルトの名無しさん:2008/06/16(月) 20:15:12
古代FORTRANで、一文字トークンにaからhが予約されていて
ユーザーが自由に使えるものがiからしかなかったのがそもそもの由来。
71デフォルトの名無しさん:2008/06/16(月) 20:17:04
それたまに聞くけど、
  n
 Σa_i
 i=1
とか数学で使う際の i って
FORTRAN 以降で広まったものなのか?
72デフォルトの名無しさん:2008/06/16(月) 20:22:38
古代FORTRANの場合宣言なしで使える変数があって、
I,J,K,L,M,Nあたりが宣言なしで整数、
それ以外が宣言なしで実数だった。
73デフォルトの名無しさん:2008/06/16(月) 20:24:29
ありがとうございます
74デフォルトの名無しさん:2008/06/16(月) 20:56:52
>>71
まさか。
もっと昔から使われてるよ。
75デフォルトの名無しさん:2008/06/16(月) 20:57:14
>>72
そもそも整数がその範囲に割り当てられた理由もあるんじゃね?
76デフォルトの名無しさん:2008/06/16(月) 20:57:48
>>74
ですよねー。
77デフォルトの名無しさん:2008/06/16(月) 20:58:55
FORTRAN は数式を扱うことを目的に作られたから
イテレーションによく使われていた i から始まり、
整数値としてよく使われていた n までを整数にした、
と考えるのが自然な気がするよ。
78デフォルトの名無しさん:2008/06/16(月) 22:10:58
FORTRANのiはintegerのiだな。
79デフォルトの名無しさん:2008/06/16(月) 22:16:35
数学で使われる方のiがintegerのiとは考えんのかね。
80デフォルトの名無しさん:2008/06/16(月) 22:17:57
indexのiにきまってるだろ。
81デフォルトの名無しさん:2008/06/16(月) 22:24:20
H の後に I があるなんてJokeだよ
82デフォルトの名無しさん: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デフォルトの名無しさん:2008/06/17(火) 01:23:06
マニュアルを読めばいいと思うよ
8482:2008/06/17(火) 01:23:16
なんでそんなことをする必要があるかと言うと、
色々なライブラリを必要に応じて読み込むソフトがありまして、
そいつに自作のライブラリを読み込ませるためには、
必ず共有ライブラリじゃないと駄目なんです。

なので、libFOO.aを読み込ませる場合には、
一回自分で共有ライブラリを作らないといけない、と。
85デフォルトの名無しさん:2008/06/17(火) 01:32:25
>>84
分かりました、マニュアルを読んでくさい
86デフォルトの名無しさん:2008/06/17(火) 04:26:59
87デフォルトの名無しさん:2008/06/17(火) 08:39:42
>>81
HしてもIがなかったらJuniorが生まれてこないとは考えんのかね。
88デフォルトの名無しさん:2008/06/17(火) 12:57:29
>>87
望まれないJuniorっていう不幸もあるからなぁ
89デフォルトの名無しさん:2008/06/17(火) 13:19:32
Knockが足りなかったんだろう
90デフォルトの名無しさん:2008/06/17(火) 13:21:14
つまんないからやめろ
91デフォルトの名無しさん:2008/06/17(火) 19:06:29
抽象的な質問で申し訳ないですが

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

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

例えば、積分をするためのループ処理1ステップ分を関数化して切り出したい場合などです。
92デフォルトの名無しさん:2008/06/17(火) 19:07:38
よくわからんがprivate関数じゃだめなの?
93デフォルトの名無しさん:2008/06/17(火) 19:09:35
アクセス制御で外からは見えない関数にすればいいよね
94デフォルトの名無しさん:2008/06/17(火) 19:14:42
内部クラスの静的メソッドでいいよ。
95デフォルトの名無しさん:2008/06/17(火) 19:31:17
ttp://www.cmagazine.jp/
C言語の本を買ったのですがサンプルソースのあるページにアクセスできません?
アク禁になっているのか知りたいので他の人アクセスできるか試してもらえませんか;;
96デフォルトの名無しさん:2008/06/17(火) 19:42:58
>>91
自分専用ライブラリを放り込んでおく場所を決めておくと良いよ。
97デフォルトの名無しさん:2008/06/17(火) 19:43:16
Cマガ休刊したんじゃないっけ?
98デフォルトの名無しさん:2008/06/17(火) 19:47:50
99デフォルトの名無しさん:2008/06/17(火) 20:01:15
>>98
そのサイトもアクセスできません・・・。
スレ違いですが質問させてください。
代わりにソースプログラムを配布しているサイトご存じないですか?
100デフォルトの名無しさん:2008/06/17(火) 20:03:59
>>98 で落とせるけど。
文字コードは EUC な。
101デフォルトの名無しさん:2008/06/17(火) 20:10:42
>>100
ダウンロードできました!!
ありがとうございます><
102デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/06/17(火) 21:05:33
> Hoge h();
引数無しでHoge型を返す関数のプロトタイプ宣言
105デフォルトの名無しさん: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デフォルトの名無しさん:2008/06/17(火) 23:37:20
別にコピー禁止クラスにキャストしたい訳じゃなくて
キャスト演算子が必ずコンストラクタを2回呼ぶのが気に食わなかっただけです
使い捨て一時オブジェクトのためにポインタ持たせたくないし、
直接関数呼び出しするくらいなら普通のメンバ関数にしようと思います
ありがとうございました
107デフォルトの名無しさん:2008/06/17(火) 23:39:17
ある圧縮ファイルの読み込み関数使ったら戻り値がバイナリデータへのvoid*なんですが
これをFILE構造体に変える方法ってありますか?
VC2008exp使ってます。



108デフォルトの名無しさん:2008/06/17(火) 23:42:44
>>106
最適化してるか?
109デフォルトの名無しさん:2008/06/17(火) 23:51:36
>>107
「FILE メモリストリーム」でググってみれば?
110デフォルトの名無しさん:2008/06/17(火) 23:55:39
>>108
してますけど、どちらかというと精神的な問題なので

でも規格読むとstatic_castでキャスト演算子呼ぼうとすると
一時オブジェクト作るのに絶対コピーコンストラクタ使うらしいので諦めました
111デフォルトの名無しさん:2008/06/17(火) 23:58:03
そんなあなたにPOD型
112デフォルトの名無しさん:2008/06/17(火) 23:59:45
>>110
戻り値最適化の話なんだけど。
113デフォルトの名無しさん:2008/06/18(水) 00:05:36
戻り値最適化って関数3段階経ても効くんですか?
戻り値最適化効いた結果が2回だと思ったんですけど
114デフォルトの名無しさん:2008/06/18(水) 00:10:52
とりあえず2回呼ばれるというコードはどれ
115デフォルトの名無しさん: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デフォルトの名無しさん:2008/06/18(水) 00:24:16
g++ だと X() としか表示されないけど。
Release ビルドでもそうなる?
117デフォルトの名無しさん: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デフォルトの名無しさん:2008/06/18(水) 00:27:40
Releaseでも同じだった
規格上はこっちが正しいんじゃないのかしら
119デフォルトの名無しさん:2008/06/18(水) 00:28:07
VC++ 2005 には fstream に日本語パスを渡すとファイルが開けないバグがあったはず。
120デフォルトの名無しさん:2008/06/18(水) 00:29:25
>>118
最適化レベルあげてみてもだめ?

規格上は、コピーコンストラクタを省略できる所は省略していいって仕様が別の所に書いてある。
すげー分かりにくいけど。
121デフォルトの名無しさん:2008/06/18(水) 00:30:34
ああ、バグじゃなくて、ロケール設定が必要だということらしい。
setlocale(LC_ALL, ""); と書いてみて。
122デフォルトの名無しさん:2008/06/18(水) 00:31:09
いや、バグはバグでいいのか。
123デフォルトの名無しさん:2008/06/18(水) 00:40:17
>>120
最適化設定色々いじくってみたがどうやっても2回呼ぶようだ
124デフォルトの名無しさん:2008/06/18(水) 00:43:13
>>123
VC++ の限界なのかね。
125117:2008/06/18(水) 00:46:30
>>119

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

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

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

何度も申し訳ありませんが、どうかご教示お願い申し上げます。
126デフォルトの名無しさん:2008/06/18(水) 00:50:27
>>117
VC++8.0以降はfstreamはワイド文字版のファイル名を受け付けるよ
127デフォルトの名無しさん:2008/06/18(水) 00:51:51
ということは L"..." にすればおk?
128デフォルトの名無しさん:2008/06/18(水) 00:54:25
うん。ちゃんとUTF-16に対応できて、C++なのにstd::setlocale()で
グローバルロケールを弄る必要も無いのが利点

難点は移植性がないことなので、気になるんならboostの力を借りるんだね
129デフォルトの名無しさん:2008/06/18(水) 00:57:18
ファイル名を変数で指定し出すとまたややこしい事になりそうですね。
130デフォルトの名無しさん:2008/06/18(水) 00:59:08
今なら全部UTF-16でコード書く方を勧めるけどね
Win98もサポートするとかなら別だけど
131デフォルトの名無しさん:2008/06/18(水) 01:03:15
ま、wchar_t*もchar*も受け取っちまうからねぇ

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

「VC++では」
mbstate_t mbs = { 0 };
で初期化できるはずだけど
132117:2008/06/18(水) 01:09:50
うーんごめんなさい。
せっかくレス頂いたのに文字フォーマットなどの知識が足りないようで今イチ理解できてません。
皆さんのレスを見る限り今の私にはとても難しそうなので、おとなしくfopen()を使いたいと思います。
こんな初心者の質問につきあって頂き、ありがとうございました。
133デフォルトの名無しさん:2008/06/18(水) 01:21:05
「FILE メモリストリーム」でググらなくても
バイト列からストリームで入出力する方法はわかるんですけどね。

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

やっぱり前者のほうを書き換えるしかないのかな……。
134デフォルトの名無しさん:2008/06/18(水) 02:05:23
>>133
パイプでも使えばいいんじゃないの?
pipeで作って、FILE*が必要なほうにはfdopenして。
135デフォルトの名無しさん:2008/06/18(水) 02:10:41
>>125
そのとき、いったいどんなエラーメッセージが出てくるの?
136デフォルトの名無しさん:2008/06/18(水) 02:15:58
>>121>>128
C++ならstd::locale::global(std::locale(""));使ってあげてください。
中でsetlocaleも呼ぶので心配しなくて平気。
137デフォルトの名無しさん:2008/06/18(水) 02:42:14
>>117
バグかと思ってたんだけど、仕様らしい。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146870

めんどくさいけど標準ライブラリにマルチバイト文字を処理させようと思ったら
プログラム起動時に std::locale::global(std::locale("")) しとくのが正解みたい。
138デフォルトの名無しさん: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デフォルトの名無しさん:2008/06/18(水) 10:13:21
>>136
ctype以外のカテゴリをグローバルロケールに設定なんてしたくないよ
sstreamの数値フォーマッティングとかにまで影響があるし
やるならctypeだけに絞る

どっちみちWin32ならファイル名はUTF-16なんだから
ファイル名はUTF-16で扱っとかないと、「とりあえず日本語のファイルが開ける」
ようになるだけじゃん
14091:2008/06/18(水) 12:57:25
レス遅くなってすみません。ありがとうございました。
色々方法はあることがわかりました。
オブジェクト指向的にどれが正しいか…と考えるとよくわからなくなってしまいます。
privateメンバの中に書いてしまう方式で行こうかと思っています。
141デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/06/18(水) 17:24:12
ii_intl.ilが参照でもポインタでもないから、
setilの中では、iからilへ値がコピーされている。
145デフォルトの名無しさん:2008/06/18(水) 17:24:59
deleteってのはオブジェクトをもう使わない、とシステムに返す命令。
中身をクリアするわけじゃない。
直後に i を参照すれば、その間に何の処理も行われないからメモリ上は前の値が残っている。
それを参照しているだけ。
いつどのタイミングで、このiの値が書き換えられるかは、誰にも予想できない。
146デフォルトの名無しさん:2008/06/18(水) 17:26:08
げ、恥ずかしい。
144のいうとおりだった。
145は早とちり。
147143: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が消えるまで生き残るということですよね?
うーん、ややこしい気がする…。
148143:2008/06/18(水) 17:35:56
sage忘れすみません。
149デフォルトの名無しさん:2008/06/18(水) 17:58:20
> int *il;
> void setil(int &i){*il=i;}

初期化してないポインタ il が指す場所に値を入れてるのでダメ。
150デフォルトの名無しさん:2008/06/18(水) 18:58:58
参照をポインタと似たようなもんだと思っていたら訳ワカメになるよ。
どうやらポインタのほうも理解していないようなので、
まずポインタとメモリの動的確保をきっちり勉強したほうがいいね。
151デフォルトの名無しさん:2008/06/18(水) 20:19:58
巷じゃMozilla Firefox 3.0の話題でもちきりだが、4.0世代はC++で開発するんだな・・・
152デフォルトの名無しさん:2008/06/18(水) 20:20:52
いまままではCC??
153デフォルトの名無しさん:2008/06/18(水) 20:45:48
memcpyは第三引数が0であっても正常に動作する事が保証されていますか?
154デフォルトの名無しさん:2008/06/18(水) 22:06:29
規格に 0 だとダメとか特に書いてないから 0 でも大丈夫。
155デフォルトの名無しさん:2008/06/18(水) 22:07:42
派生の質問だけど、第3引数が 0 で第1第2引数が NULL の場合はどうなんだろ。
memcpy の規格には領域が重なってるときは未定義ってことしか書いてないけど・・・。
156デフォルトの名無しさん:2008/06/18(水) 22:10:46
そういや、いつの間にか規格が文書内検索できるようになってた。
結構文句きてたんだろうな。
157デフォルトの名無しさん:2008/06/18(水) 22:22:31
Foxit Readerで見れなくなっちまった。
158デフォルトの名無しさん:2008/06/19(木) 01:18:31
失礼します。
整数nを入力したときにn重for文として動作する関数を作る方法はありますでしょうか?

具体的には、

int* hoge = new int [n];
のように動的に確保した配列に

for(int i=i0;i<imax;i++){
hoge[0] = i
for(int j=j0;j<jmax;j++){
 hoge[1] = j;
...
//n-1回目ループ
for(int k=k0;k<kmax;k++){
hoge[n-1] = k;
//hogeに関する作業
}
}
...
}}
のようにして、
hoge[n]={i0,j0,...k0}
hoge[n]={i0,j0,...k0+1}
...
hoge[n]={imax,jmax,...kmax}
のように、nが変わってもhogeに値を代入できる関数です。

何卒よろしくおねがいします。
159デフォルトの名無しさん:2008/06/19(木) 01:20:12
それはそんなループにしなくてもいいと思うんだが。
160デフォルトの名無しさん:2008/06/19(木) 01:23:23
その例の理解に苦しむが、多分再帰を使うことで解決できるように思う
161デフォルトの名無しさん:2008/06/19(木) 01:29:13
Mecabをつかって簡単な人工無能のようなものをつくりたいのですが
ttp://mecab.sourceforge.net/libmecab.html の最後のほうのコンパイル方法の
>% cl -DDLL_IMPORT -I. example.c libmecab.lib
がわからなくて導入さえ出来ません

ど素人丸出しな質問で申し訳ありませんがどういう意味なのか教えてください
162デフォルトの名無しさん:2008/06/19(木) 01:30:10
>>158 こんな感じでやるといいのでは
#include<stdio.h>
#define N 3
void show(const int hoge[])
{
int i;
for(i = 0; i < N; i ++) printf("%d ", hoge[i]);
printf("\n");
}

int main()
{
static const int hoge_min[N] = {0,0,0};
static const int hoge_max[N] = {2,4,9};
int hoge[N], i;
for(i = 0; i < N; i ++) hoge[i] = hoge_min[i];
while(hoge[0] != hoge_max[0]) {
show(hoge);
for(i = N-1; i >= 0; i --)
if(hoge[i]++ == hoge_max[i])
hoge[i] = hoge_min[i];
else
break;
}
return 0;
}
163デフォルトの名無しさん:2008/06/19(木) 01:33:00
>>161
マイクロソフトのコンパイラが必要だよ
VC Expressでもいれるといい
164158:2008/06/19(木) 01:47:26
>>162
素早い回答ありがとうございます。

しかし、実行してみたら動作に疑問がありましたので、
さらにもう一点よろしいでしょうか?

結果が
000
001
002
003
...
と期待通りなのですが、
最後が
149
で終わってしまい、
hoge_max[0]まではカウンタが回ってくれません。
単純にhoge_max[0]を1多く設定すればよいのでしょうが、
この点うまくいかないでしょうか?

>>

165デフォルトの名無しさん:2008/06/19(木) 01:56:10
C++のクラスのメンバ関数で

delete this;

ってアリなんでしょうか。
もちろん、delete thisはその関数の末尾に置かれており、
それ以後、開放したインスタンスにアクセスすることはありません
166デフォルトの名無しさん:2008/06/19(木) 01:56:49
C++でクラスを作るときに
コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子のほかに
これは必ず定義しておいた方が良いものってありますか?
167デフォルトの名無しさん:2008/06/19(木) 01:58:38
なお、そのクラスのインスタンスは、全てnew演算子でつくり、
自動変数としてインスタンスを生成することはないものとします
168デフォルトの名無しさん:2008/06/19(木) 01:59:08
すみません>>167>>165の注釈です
169デフォルトの名無しさん:2008/06/19(木) 02:05:22
>>165
普通はやらないけど別にdelete this自体はしてもいいと思うよ
170デフォルトの名無しさん:2008/06/19(木) 02:11:42
>>169
レスありがとうございます

ゲーム作ってて、キャラクターにAIクラスへのポインタを持たせて、
AIクラスを切り替えることで、行動を制御しようと思っています。
AIクラスを切り替える場合に、新しいAIクラスを作った後、今までのAIクラスを消す必要があったので、
delete thisするのが適当かな、と思ったのです
171デフォルトの名無しさん:2008/06/19(木) 02:13:50
その使い方は全然適切じゃない。
172デフォルトの名無しさん:2008/06/19(木) 02:15:34
切り替えるところでdelete 今までのAI;すればいいことじゃないのかな
173デフォルトの名無しさん:2008/06/19(木) 02:19:01
AIを切り替える判断も、切り替えるために新しいAIクラスを生成するのも、AIクラスの仕事なんです
キャラクターは毎フレームAIクラスのメンバ関数を呼び出し続けるだけ
こんな感じで this->AI.update(this)
174デフォルトの名無しさん:2008/06/19(木) 02:21:50
訂正
this->AI->update(this)
ですね
175デフォルトの名無しさん:2008/06/19(木) 02:29:23
>>166
「クラスによる」「プログラムによる」という当たり前のことがまず前提としてあって、
その上で定番的なものを挙げるなら、operator==()、operator<()、operator!()、あたりかなぁ。
176デフォルトの名無しさん:2008/06/19(木) 02:32:50
>>164
実行してみたけどコードは読んでない?
答え書くのは簡単だけど、ちょっとは考えてみようや。


最後までループが回らないというのであれば、ループの判定箇所になにかある、と考えてみる
>>162作のサンプルコードでは、ループの判定を行っている箇所が3箇所あるのはわかるかな?

1. while(hoge[0] != hoge_max[0])
2. for(i = N-1; i >= 0; i --)
3. if(hoge[i]++ == hoge_max[i])

それぞれが何をやってるかを考えればどう変えればいいかわかるはず
あなたが自分で書いているように、hoge[0]以外はhoge_max[i]まで回ってて、hoge[0] だけ hoge_max[0]まで回らないんだから
177デフォルトの名無しさん:2008/06/19(木) 02:55:40
>>173
なぜそこまでAIにやらせたがるのかわからないけど、
新しいAIの最初の仕事を、古いAIの削除にするとかどうかな
178デフォルトの名無しさん:2008/06/19(木) 09:08:45
>>173-174
それ、 AI が中で delete this したらキャラクタが持ってるポインタ AI を更新しないと
いけないはずなんだけど、どうなってるんだ?
179158:2008/06/19(木) 09:19:20
>>176
あ。。こう書かれたらわかりました。
ありがとうございます。
180デフォルトの名無しさん:2008/06/19(木) 09:26:12
delete thisをしない
181デフォルトの名無しさん:2008/06/19(木) 10:12:26
別にしてもいいんじゃね?

各AIは、キャラクタへのポインタを持っていて、
今のAIが次のAIを作成、キャラクタのAIを次のAIに変更して、AIは自殺

ってことだよね?何も問題ないかと。
182デフォルトの名無しさん:2008/06/19(木) 10:17:08
#defineだとnamespace使えないですよね?

enumとかはnamespaceに閉じ込められるんでしたっけ?
183デフォルトの名無しさん:2008/06/19(木) 10:17:17
delete thisをするようなメソッドを含むクラスを
auto変数として呼び出したとき危険じゃない?
184デフォルトの名無しさん:2008/06/19(木) 10:20:45
>>182 はい。はい。
185デフォルトの名無しさん:2008/06/19(木) 10:21:13
>>183 >167-168
186デフォルトの名無しさん:2008/06/19(木) 10:26:20
>>185
見落としてた

あとはnew[]でインスタンスを生成したときも危ない罠
187デフォルトの名無しさん:2008/06/19(木) 11:11:03
プログラミング組めって言われたんだがさっぱりわからんすorz
基数変換の簡単なやつといわれたんだかさっぱり・・・

m進数→10進数→n進数という過程で
元:2〜16進数(選択)→変換先:2〜16進数(選択)

とりあえず途中までコピペで組んでみたんだけど結果がおかしいし
誰かご教授願います。


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

int main(void){

int a, kisu1, kisu2, keta, data10shin, i, j,result,kisu;
char motoData[128];
int opeData_10shin[128], convertedData[128];
//置換用
int taiouData_int[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
char taiouData_char[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int dataMoto[128], data2shin[128];

188デフォルトの名無しさん:2008/06/19(木) 11:12:13
printf("***** 基数変換 *****\n");
printf("変換元の基数を入力して下さい\n");
scanf("%d", &kisu1);
printf("変換元の数値を入力して下さい\n");
scanf("%s", motoData); //charデータとして処理
printf("変換先の基数を入力してください。\n");
scanf("%d", &kisu2);


for (keta=0; motoData[keta]!='\0'; keta++){
}


for (i = 0; i<keta; i++){
for (j=0; j<16; j++){
if (motoData[i]==taiouData_char[j]){
opeData_10shin[keta-i-1]=taiouData_int[j];
break;
}
}
}
189デフォルトの名無しさん:2008/06/19(木) 11:12:31
基数変換の考え方を復習しよう!
190デフォルトの名無しさん:2008/06/19(木) 11:12:55
do{
a /= 10;
keta += 1;
} while (a > 0);

;
for (i=keta-1; i>=0; i--){
dataMoto[i] = (int)(a/pow(10, i));
a -= dataMoto[i]*pow(10, i);


result = 0;
for (i=0; i<keta; i++){
result += dataMoto[i] * pow(kisu, i);

}


a = data10shin; //変換作業用のコピー



i = 0;
while(a!=0){
data2shin[i] = a * 2;
191デフォルトの名無しさん:2008/06/19(木) 11:13:33


printf("%4d進数:%s\n", kisu1, motoData);
printf("⇒%2d進数:", kisu2);
for (i=keta-1; i>=0; i--){
for (j=0; j<16; j++){
if (convertedData[i]==taiouData_int[j]){
printf("%c", taiouData_char[j]);
}
}
}
printf("\n");

return 0;
}
}

192デフォルトの名無しさん:2008/06/19(木) 11:16:26
>>186
new [] が危ないなら new(std::nothrow) とか new(std::nothrow) [] とかも危ないな。

コンストラクタ(コピー〜も含めて全部)を private にすればいいんだけどね。
193デフォルトの名無しさん:2008/06/19(木) 12:38:52
>> 142
遅ればせながら多謝。
int hCrt = _open_osfhandle((long)pipe_r, _O_TEXT);

int hCrt = _open_osfhandle((intptr_t)pipe_r, _O_RDONLY);

に変更しました。

ところで
>>141
のソースのfp使って
char buffer[2];
fread((LPVOID)buffer, 1, 2, fp);
fseek(fp,0,SEEK_SET);
fread((LPVOID)buffer, 1, 2, fp);
とやると2回目のfreadに失敗するんだけど
fseekってなんか制限あるんだろうか?
194デフォルトの名無しさん:2008/06/19(木) 12:42:20
パイプはシークできないよ
195デフォルトの名無しさん:2008/06/19(木) 13:34:57
>>194
Σ(゚д゚|||)

もうおとなしくテンポラリファイル用意するかな・・・・・・。
196デフォルトの名無しさん:2008/06/19(木) 22:51:12
STLのlistコンテナで、iteratorが指している要素と、その次の要素を同時に使いたい場合どうしたらよいでしょうか。

例えば
std::list<point> points 点列リスト
std::list<point>::iterator itr = points.begin() とりあえず最初に合わせる

Vec::Vec(point1,point2) 2点から成るベクトルを作成する、Vecクラスのコンストラクタ

このとき
Vec v1(*itr, *++itr)
とかすると、最初の*itrまでインクリメントされてしまいます。
ダミーのiteratorを用意するくらいしか思いつかないのですが、他に方法はあるでしょうか。
197デフォルトの名無しさん:2008/06/19(木) 22:56:20
std::list<point>::iterator itr0 = itr;
itr++;
Vec v1(*itr0, *itr);

ダミーって。
198デフォルトの名無しさん:2008/06/19(木) 22:57:20
ifstreamとofstreamの良い解説サイトないですか?
検索してみても出てくるのは簡単な使い方ばかりで、まとまったものが見つかりません。
リファレンスのようなものが見たいです。
お願いします。
199デフォルトの名無しさん:2008/06/19(木) 22:59:34
>>198
規格書、思う存分知り尽くすがいい
200デフォルトの名無しさん:2008/06/19(木) 23:02:03
DLL作成のいろはが書かれたサイト、もしくは参考書はないでしょうか?

検索してもヒットするのはさらっとソースコードが書かれているだけのページばかりで、
いろはがまったく解りませんでした。
201デフォルトの名無しさん:2008/06/19(木) 23:02:59
すみません初心者です。
ポインタと配列のところで参ってしまってるんですが・・・

本に拠ると int test[5]; で、test = &test[0]; というのはなんとなく理解できたんですが、
仮に ans = avg(test); のtestを参照渡ししたとして、
渡されたパラメーターがdouble avg(int t[]){の様に、
int型の配列に参照渡しされているんですが・・・

test = &test[0]; というのはアドレスにも関わらず、
int型の配列に参照渡しが可能な理由というのはなんなのでしょうか?

配列にはアドレスを参照渡しできると考えていいんでしょうか?

返信宜しくお願いします。
202デフォルトの名無しさん:2008/06/19(木) 23:03:52
>>197
やはりそれが常識的な方法ですか。
普通のリスト構造の*nextポインタを使って *(itr.next)みたいにできる方法があるかなーというイメージでした。
その方法でやりたいと思います。どうもありがとうございました。
203デフォルトの名無しさん:2008/06/19(木) 23:10:12
>>201
配列を保持している変数の実体は、配列の先頭要素のアドレス。
つまり、int型の配列はアドレスを意味しているため、型が合っているので渡せる。

その場合であれば、
double avg(int t[]){} ≒ double avg(int *t){} になる。
204201:2008/06/19(木) 23:20:32
>>203
どうもありがとうございます。
配列そのものをアドレスと認識してもいいんでしょうか?
205デフォルトの名無しさん:2008/06/19(木) 23:21:31
>>201
関数の引数で配列を宣言すると、それはポインタの宣言になる。
規格書の 6.7.5.3 の 6 にこう書かれている。
> A declaration of a parameter as ``array of type'' shall be adjusted to ``pointer to type''
206201:2008/06/19(木) 23:30:13
>>205
どうも!
なるほど、だから double avg(int t[]){} ≒ double avg(int *t){}
ポインタを利用したものに変換できるんですね。
207デフォルトの名無しさん:2008/06/19(木) 23:35:03
≒じゃなくて完全に=だからな
208デフォルトの名無しさん:2008/06/19(木) 23:54:12
>>202
常識的つーか、引数の評価順が不定だからそうしないとやばい。
boost使えるんならboost::next()が使える。
209デフォルトの名無しさん:2008/06/20(金) 04:11:05
>>200
別にそんな、「いろは」という程の知識は要らないよ。
だから詳細なサイトとか参考書が見つからない(見つかりにくい)のだと思う。

その「さらっと書かれたソースコード」だけでも、DLL作成に必要なことの多くを
既に説明してしまっているかもしれない。
210デフォルトの名無しさん:2008/06/20(金) 08:27:55
>>204
注意だけど配列=ポインタではないからね。

他の人の回答は「関数の引数の場合」という前提だからね。
211デフォルトの名無しさん:2008/06/20(金) 10:13:33
>>200
VC++とするが、
$ cat hello.c
const char *greet(void) { return "hello, world"; }

$ cat hello.def
EXPORTS
    greet

こんな感じのソースをつくって、
$ cl -LD hello.c hello.def

とかやればすればDLLとインポートライブラリが出来る。
「いろは」レベルでは何も難しいことはないぞ。

ていうか
http://msdn.microsoft.com/ja-jp/library/1ez7dh12%28VS.80%29.aspx
よめ
212デフォルトの名無しさん:2008/06/20(金) 10:20:35
内部ロジックからGUIに幾つかのパラメータを渡して表示させたいのですが

引数にパラメータ番号をとり、それに応じた返り値を渡すようにするか
パラメータを集めた構造体を返すか
引数に配列やlist、vectorの参照をとって、そこに値を格納させるか

どういう方法が一般的ですか?
213デフォルトの名無しさん:2008/06/20(金) 10:23:51
アクセサーを渡してそれ経由で。
214デフォルトの名無しさん:2008/06/20(金) 10:35:34
>>213
アクセサーを渡すとはどういう事でしょうか?
内部ロジックのpublicメンバとして値を引き渡す関数を公開しようと考えていたのですが
それとは別の方法なのでしょうか?

機能追加でパラメーターが変化してしまう可能性があるので
パラメータひとつずつにアクセサ関数を用意するのは避けたいのですが・・・
215デフォルトの名無しさん:2008/06/20(金) 10:45:05
内部ロジックにGUIをいろいろと考慮したメンバ関数を持たせるのは美しくない。
内部ロジックには値を得るためのクラスのインスタンスを渡す関数だけ追加して、
GUIとの調整はそのクラスでやるようにすればいい。
つーか
> 引数にパラメータ番号をとり、それに応じた返り値を渡すようにするか
これこそ「機能追加でパラメータが変化」するたびにif文で切り分けたり
関数テーブルで飛ぶような読みにくいソースを弄ることになると思うんだが。
216デフォルトの名無しさん:2008/06/20(金) 10:55:20
>>212
MVCでぐぐれ
217デフォルトの名無しさん:2008/06/20(金) 10:59:24
クラスの中に同じクラスのポインタを持たせている場合、
そのポインタを使ってprivateメンバにアクセスできてしまうのですが、
これは環境依存などではない仕様なのでしょうか?

VS2005上で書いたソース

class A
{
private:
int m_val;
A* m_pNext;
public:
void SetNext(A* pNext)
{
m_pNext = pNext;
m_pNext->m_val = 1234; // エラーにならない
}
};

A a1, a2;
a1.SetNext(&a2);
a1.m_val = 1111; // エラーになる
218デフォルトの名無しさん:2008/06/20(金) 11:08:39
>>215
有り難う御座います
パラメータの読み出しを行う中継クラスを用意するのですか

ロジッククラスにパラメータクラスのインスタンスを保有させておいて、GUIにはその参照を渡すようにする
インターフェイスの整合はパラメータクラスとGUIクラスの間で対応する

質問続きで申し訳ありませんが
機能追加があり得るということを考えると、パラメータクラスの基底クラスのポインタを渡すことになりそうですが
この場合はGUI側でキャストして対応、でよいのでしょうか?
参考書や解説サイトではキャストは良くないと言うことですが・・・
219デフォルトの名無しさん:2008/06/20(金) 11:19:46
>>217 大丈夫。その仕様で標準規格のとおり。
220デフォルトの名無しさん:2008/06/20(金) 11:27:21
>>219
ありがとうございます
そういう仕様で行きたいと思います
221217:2008/06/20(金) 11:28:28
>>219
ありがとうございます。
同じクラス同士なら別オブジェクトのprivateメンバをいじれてしまうのですね。
なんか気持ち悪いです。
222デフォルトの名無しさん:2008/06/20(金) 11:34:04
>>218
機能が増えたら基底クラスを拡張するだろ。常考
223デフォルトの名無しさん:2008/06/20(金) 12:36:37
>>221
他のクラスから触れないようにする指定であって、自分の管理下のメンバは触れないと困ると思うけど
自分が管理するんだから同じクラスの他のオブジェクトを受け付けるインターフェースを持たない設計にすればいいだけのことではなくて?
224デフォルトの名無しさん:2008/06/20(金) 14:26:00
こんちわ!質問です。
WinApiのBitBltってクリッピングしてくれるんですか?
テストコード書いたんですけど、自分でクリッピングしなくても動いてしまったのでちょっと不安です。
225デフォルトの名無しさん:2008/06/20(金) 14:30:57
デザパタ厨がとおりますよっと

>>218のやりたいことは恐らく
機能追加はDecorator パターン
値の取得はChain of Responsibility パターン
で解決する予感
226デフォルトの名無しさん:2008/06/20(金) 20:52:39
>>224
API は API スレに行くと幸せ

Win32API質問箱 Build67
http://pc11.2ch.net/test/read.cgi/tech/1212931246/
227デフォルトの名無しさん:2008/06/20(金) 21:00:04
GDIの関数を、本当にC言語固有のものだと思ったのだろうか
228デフォルトの名無しさん:2008/06/21(土) 03:46:42
みなさんUNICODEへの対応はしていますか?
過去のプログラムへの対応はともかく、これから1から作るものに関しては対応しておいた方が良いのでしょうか?
229デフォルトの名無しさん:2008/06/21(土) 05:26:39
プラットフォーム次第だろ
Unicodeにかまけて肝心のShiftJIS以外でバグ出してたら世話ないという考え方もある
230デフォルトの名無しさん:2008/06/21(土) 07:18:29
>>228
Shift JISに対応してないと困るんだが。
231デフォルトの名無しさん:2008/06/21(土) 07:24:32
>>228 がWindowsを前提としているとは限らない件
232デフォルトの名無しさん:2008/06/21(土) 09:22:19
>>163
ありがとうございます
試してみます
233デフォルトの名無しさん:2008/06/21(土) 09:24:40
stdio.hが無かったらプログラムが動かないから、漠然と「プログラムを動かすための原動力」みたい思ってて、
でもstdio.hもヘッダファイルである以上、C言語で書かれてると思ったのですが、
いざ開いて見てみるとよくわからん文字列や関数(?)みたいなののオンパレードだったのですが、
こういう「原動力ファイルを作るための言語及び法則」みたいなのってあるんでしょうか?
それともやっぱあれも純粋なC言語なのでしょうか?
それとも「stdio.hが原動力」という発想が間違ってるのでしょうか?

なんかよくわからん質問ですみません
234デフォルトの名無しさん:2008/06/21(土) 09:57:35
>>233
なにもかも間違ってる
235デフォルトの名無しさん:2008/06/21(土) 10:20:46
>>233
stdio.h → std io h → standard IO header → 標準入出力用のヘッダ

>それともやっぱあれも純粋なC言語なのでしょうか?
純粋なC言語。
マクロが読めてないだけでは。「C言語 プリプロセッサ」でググッてみ。
236デフォルトの名無しさん:2008/06/21(土) 10:23:32
>>233
stdio.hファイル内のプロトタイプ宣言は呪文だ。
#incude<stdio.h>は呪文を発動させるおまじないだ。
237デフォルトの名無しさん:2008/06/21(土) 10:58:27
>>234
>>235
ありがとう
勉強しなおしてきます
238デフォルトの名無しさん:2008/06/21(土) 10:59:49
シーザー暗号(英数字のみ記号は含まない)を復号化するプログラムを組もうとしているのですが
const intで文字コードの値で使う部分にA〜Zとa〜zに1〜26。
0〜9に27〜36を入れて入力された変位分分ずらして今度はconst charで何番目かを読み
同時に36を越えた場合は、ソノ値から36を引いた値で出すようにしているのですが値が重複してしまう事があるんですが何故なんでしょうか?
239デフォルトの名無しさん:2008/06/21(土) 11:07:41
俺の読解力を超えました。
プログラム言語でおk
240デフォルトの名無しさん:2008/06/21(土) 11:17:05
>>238
なんとなくナローイング変換が絡んでそうだが、よくわからんのでソースうp
241デフォルトの名無しさん:2008/06/21(土) 11:25:50
ttp://www2.uploda.org/uporg1493972.txt
こんな感じに書いて修正したんで、多分動くはずですが・・・
242デフォルトの名無しさん:2008/06/21(土) 11:38:06
文字が37種類あるのか
243デフォルトの名無しさん:2008/06/21(土) 11:45:51
普通に文字の変換が1から開始だからchar似なおすためのは37まであるんだろ?
244デフォルトの名無しさん:2008/06/21(土) 11:57:44
>>241
ざーっと見た感じ暗号化も復号化もそれでできるんじゃね?
245デフォルトの名無しさん:2008/06/21(土) 11:58:43
宿題は宿題スレへ
246デフォルトの名無しさん:2008/06/21(土) 12:22:18
宿題じゃないですよ。
C++勉強してて何作ろうか→子供の頃暗号とかつくったなぁ→暗号でぐぐる→ああ、シーザー暗号っていうのやってみようか。ですので
247デフォルトの名無しさん:2008/06/21(土) 12:42:11
>>246
勉強の目的は別にして、宿題とかでなく、勉強の派生で興味や趣味からプログラミングをしようとしているんだから、
その過程で発生した問題に対しては手軽に回答を得ようとせずに、いろいろと自分で情報を漁って解決するのが楽しいんじゃないのか?
248デフォルトの名無しさん:2008/06/21(土) 12:43:29
>>241
出来てるように見えるんだが。
重複ってもしかしてaChangeCtoIで0になる部分のことか?

ch = aChangeCtoI[quiz[i]]+heni;

    ↓

ch = aChangeCtoI[quiz[i]]==0 ? 0 : aChangeCtoI[quiz[i]]+heni;
249デフォルトの名無しさん:2008/06/21(土) 15:11:47
ifstreamとofstreamを使ってファイルの読み込み/書き込みをしたのですが、
ファイル名が日本語の時、エクスプローラで見るとファイル名が文字化けしています。
読み込みも書き込みもちゃんとできるんですが、なぜ文字化けするのでしょう?
環境はWinXPで、VC2008EEを使っています。
250デフォルトの名無しさん:2008/06/21(土) 15:17:58
ファイル名に全角使わないでやってみ
251デフォルトの名無しさん:2008/06/21(土) 15:18:01
>>249 >117-139
252249:2008/06/21(土) 16:43:42
レスthx

>>250
半角のみのファイル名は問題ないのですが、全角が含まれる時に文字化けするのが気になりました。

>>251
ロケールを設定したら文字化けしなくなりました。
253デフォルトの名無しさん:2008/06/21(土) 18:36:49
オセロゲームを作ってみようと思って基本は出来たんですが
cinの仕様で文字を入れると延々とループしてしまうのでcharで入力してチェックしようとしたのですが
二桁のchar型の数値を直そうとすると二桁に対応すると一桁がだめに一桁に対応すると二桁がためになってしまうのですが
直すのに何かいい手はないでしょうか?
254デフォルトの名無しさん:2008/06/21(土) 18:39:24
>>253
三行目意味がわかんない
255デフォルトの名無しさん:2008/06/21(土) 18:42:07
256デフォルトの名無しさん:2008/06/21(土) 18:50:04
>>254
char in[]=" "; に大して20という文字列を入れて
これを、INTの20として使うにはどうしたらいいんでしょうか
257デフォルトの名無しさん:2008/06/21(土) 18:51:38
>>256
atoi(in)
258デフォルトの名無しさん:2008/06/21(土) 18:54:55
INTのC
259デフォルトの名無しさん:2008/06/21(土) 18:59:42
>>256
なんでそんな短いの?
260デフォルトの名無しさん:2008/06/21(土) 19:00:40
桁制限でもしてんじゃね?
261デフォルトの名無しさん:2008/06/21(土) 19:00:49
2バイトの領域に20という2文字(3バイト)の文字列を入れるとかないわ
262デフォルトの名無しさん:2008/06/21(土) 19:01:19
>>257
出来ました、ありがとうございます。

>>259
半角スペースを入れてしまったので""の間が狭いんだと思います。
263デフォルトの名無しさん:2008/06/21(土) 19:02:20
>>261
専ブラのポップアップで見たらギリギリ足りてる
264デフォルトの名無しさん:2008/06/21(土) 19:02:36
>>259
" "のこと?
2chだと半角スペースの連続が一つになるから、それだと思う。
265デフォルトの名無しさん:2008/06/21(土) 19:02:59
>>263
確かに。これは気づかなかったわ。
266デフォルトの名無しさん:2008/06/21(土) 19:05:53
ム板は連続する半角スペースもそのまま表示させて欲しいお
267デフォルトの名無しさん:2008/06/21(土) 19:08:43
標準で<PRE>を挿入しろ!
って、<PRE>で表示されるんだっけ?w
268デフォルトの名無しさん:2008/06/21(土) 19:11:07
前スレの最後の方と、
>>6-16で出てるインデントの話と同じだな。

ほんと支障出るから困るよな・・・。
pre付けて欲しいよ。
269デフォルトの名無しさん:2008/06/21(土) 19:11:35
"&nbsp;&nbsp;"でがんばれ
専ブラには変換オプションがあるはず
270200:2008/06/21(土) 19:17:57
>>209
記述されている要素のそれぞれが何を意味していているのか?
がサパーリだったので「いろは」から噛み砕いての解説を必要としていたのですが、
どうにも見つかりませんでした。

>>211
msdnだけで(自分は)ソースコードはかけないので、
「いろは」の書かれたサイト(や参考書)が欲しかったのです。

どうでもいいけど、VC++前提で$catはねぇだろ……
271デフォルトの名無しさん:2008/06/21(土) 19:22:55
さしあたって

>>211
に書かれている程度の記述は理解できたのですが、
DLLに限らず、オブジェクトのリンク関連は解ってない部分が多いです。

文法の解説はいくらでもサイトや参考書が見つかりますけれど、
各環境のコンパイラ、リンカへの指定法についてはなかなか見当たらないのが
ムガーーーッです。
272デフォルトの名無しさん:2008/06/21(土) 19:25:16
>>270
その要素(コンパイルオプションとか、キーワード)でググれば良いんじゃね?
273デフォルトの名無しさん:2008/06/21(土) 20:53:09
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7002.txt
初心者の俺から見ると物凄い偉業に見えるんですけど
プログラマってこれくらい楽勝で作れちゃうものだったりしますか?
274デフォルトの名無しさん:2008/06/21(土) 21:02:03
>>273
プログラム的には難しいところは全然無いよ。
ただ、頭が柔らかくないとダメ。
大きい企業の職業プログラマの人達は苦手な人が多いんじゃないかな?
(偏見だけどね)
275デフォルトの名無しさん:2008/06/21(土) 21:03:27
>>273
つみ重ねだな。一度ものにした技は比較的に楽に使えるようになる。そういうのをどれだけ知ってるかが強さだ。迷路作成も解くのも重要な基本アルゴリズムだ。
じっくり読むんだ。
276デフォルトの名無しさん:2008/06/21(土) 21:30:21
>>273
大きく分けて2つ、
「手でやるならどうするか」(ロジック)を考える能力と、
それをソフトウェアにやらせる技術があって、
両方出来る人も居れば、前者はあまり得意でない人も居る。
迷路なんかは前者の能力が主に必要だろうね。

確かに職業プログラマの人は苦手なの多いかもしれないけど、
彼等はgoogle先生に聞いたり、SE陣を揃えたり、
研究所との共同開発したりとチートが使えるからねw
277デフォルトの名無しさん:2008/06/21(土) 21:31:43
別に職業プログラマでなくてもgoogle先生は使えるだろw
278デフォルトの名無しさん:2008/06/21(土) 21:32:08
この迷路、ゴールまでのルートが何通りもできる迷路ですね。迷路と言えば複雑な1本道を作らないと。
もっといいアルゴリズムがいくつかあります。クグれば見つかりますよ。
279デフォルトの名無しさん:2008/06/21(土) 21:33:28
簡単すぎるし余裕だと思われ。
280デフォルトの名無しさん:2008/06/21(土) 22:01:02
質問なんですが、VC2008Expressと
DXライブラリを使用していてファイルの読み込みをしようとすると
error C2065: 'ifstream' : 定義されていない識別子です。
と出てコンパイルできません。コンソールだと上手くいくのですが
ソース一部

#include <fstream>
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
//省略

ifstream ifs("test.txt");
//省略
return 0;
}
281デフォルトの名無しさん:2008/06/21(土) 22:03:34
std::ifstream
282デフォルトの名無しさん:2008/06/21(土) 22:03:40
>>280
ifstreamはstd名前空間につつまれてるんで
std::つけるかusingつかえ
283デフォルトの名無しさん:2008/06/21(土) 22:13:36
うああ初歩的なミスでした
ありがとうございます
284デフォルトの名無しさん:2008/06/21(土) 22:30:40
異種の型でできた連結リストのクラスを作りたいのですが、どうすればいいでしょうか。
int型のリスト、double型のリスト、というものではなく、
1つ目の要素がintで、2つ目がdoubleで、といったものです。

ひとまず次の要素を指すポインタを用意しよう、と思ったところで、
その型をどうすればいいか分からなくなってしまいました。
285デフォルトの名無しさん:2008/06/21(土) 22:34:49
struct node {
 struct node *next;
 int type;  // 0=int, 1=double, ...
 union {
  int i;
  double d;
 } data;
};
こんな感じ?
286デフォルトの名無しさん:2008/06/21(土) 22:39:43
質問です。XPです。VC(コマンドプロンプト使用)です。

自分の参考書には書いていなくて、細かすぎてググるにも探しきれませんでした。

C++で、
クラスCが、仮想基底クラスA(パブリック派生)をもつクラスBから、パブリック派生した場合…
つまり
A->B→C
(説明のために、->は基底クラスによるパブリック派生、→は通常のパブリック派生とします。

このとき、AにはAのデータの、BにはAの、CにはBのコンストラクタ初期化子が記述されているんですが、

Cを初期化するときに、自動的にBの、そしてそこからAのコンストラクタが呼び出されて欲しいところなんですが、
どうやらBのコンストラクタを呼び出そうとする前に、Aのコンストラクタが呼び出されるみたいなんです。
(それによってコンパイラからAのデフォルトコンストラクタを求められる。
BにAのコンストラクタ初期化子がせっかくあるのにCにまた書かなければならないというのはおっくうです!
これが悩みです。。


CにAのコンストラクタ初期化子を書けば解決するのですが、
例えばA->B->C->D…などと派生する場合、派生したクラスの初期化子を全て書かなくてはいけなくなり、不便です。

また、もちろんvirtualを取ってA→B→Cとした場合も解決しますが、
どうしても仮想派生がしたい場合もあります。

コンパイラのせい等もあるのでしょうか?自分の理想通りに仮想派生する方法はあるのでしょうか?
だれか分かる方、回答をお願いします。
287デフォルトの名無しさん:2008/06/21(土) 22:42:57
>>284
boost::any
288デフォルトの名無しさん:2008/06/21(土) 22:46:06
ちょっとコストは増えるがこういうのも。

struct Base {
virtual ~Base(){};
virtual void Get() = 0;
}

struct Int : public Base {
int val;
int& Get() { return &val; };
}

struct Double : public Base {
double val;
double& Get() { return &val };
}

main() {
list<Base*> l;
l.push_back(new Int);
l.push_back(new Double);

l[0].Get(); //int& が返る
l[1].Get(); //double& が返る
}
289デフォルトの名無しさん:2008/06/21(土) 22:47:14
>>286
Aにデフォルトコンストラクタを設け、A初期化用の関数を別途用意してそれをBから呼ぶ
290デフォルトの名無しさん:2008/06/21(土) 22:49:07
l[0]->Get() の間違いだった
291デフォルトの名無しさん:2008/06/21(土) 22:54:18
>>288
無理だろ・・・。
292デフォルトの名無しさん:2008/06/21(土) 22:57:34
286ですが、訂正です:
×->は基底クラスによる
○->は仮想基底クラスによる

あと、文だけだとわかりにくいのでソースうpします。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7006.txt
293デフォルトの名無しさん:2008/06/21(土) 23:07:17
286です
>>292は意味無かったですかね;

>>289
なるほど…!
確かにそれなら解決ですね。

でもやっぱ、このクラスが大きくなったときに、
初期化して代入するわけだからコストは高くなるし…
(まぁ今のところその見込みはないですが;

そもそもどうして仮想派生すると素直にCからB,BからA,とコンストラクタが階層をたどってくれないんでしょうか?
仮想派生ってものがあいまいなのでわからないのです。
294デフォルトの名無しさん:2008/06/21(土) 23:10:22
>>292
それはそういうもんだから仕方ないよ
追加で以下のようなクラスDとEを考えてみ
class D: public virtual A {
public:
  D(int a) : A(a) { }
};
class E: public D, public C {
public:
 public E() : D(3), C(2) { }
};
Eを構築したとき、Aは3に初期化されるべきか、2に初期化されるべきか?
295294:2008/06/21(土) 23:11:36
E()の前のpublicが余計だった、無視してくださひ
296デフォルトの名無しさん:2008/06/21(土) 23:15:07
>>291
あ、無理だったw
仮想関数オーバーライドの場合は戻り値変えられないか
297デフォルトの名無しさん:2008/06/21(土) 23:19:46
>>285
できました!
ありがとうございます!
298デフォルトの名無しさん:2008/06/21(土) 23:25:15
>>292
それはそういうもんだから仕方ないよ

まじですか。そういうもんですか。
ある意味求めていた明確な回答の一つです。
ありがとうございました!

疑うようで申し訳ないですけど、まじで、そういうもん?
299デフォルトの名無しさん:2008/06/22(日) 00:16:50
>>298
C++的にはそういうもの。
理にかなっていると思うけど、そうでもないの?
300デフォルトの名無しさん:2008/06/22(日) 00:47:40
>>271
cl /help でコンパイラに指定できるスイッチが出てくるんだけど。
サイトや参考書がどうしたこうしたじゃなくて付属のマニュアルを読めるようになろう。
MSDNとかすげえ役に立つよ?C#の開発とかネットで検索してたのは初歩の頃だけで
後は大抵MSのドキュメントで事足りる、というか、そっちの方がはやいし正確だ。
狭く深い情報はMVPのブログで。
301デフォルトの名無しさん:2008/06/22(日) 00:50:52
>>273
迷路で感動したのはこれ。

> TODは1フロアにつきマップのデータを1バイトしか持っていません。
TOD=ドルアーガの塔

http://druaga.to/qanda_tod.html
302デフォルトの名無しさん:2008/06/22(日) 01:16:52
データというか乱数の種じゃ
303デフォルトの名無しさん:2008/06/22(日) 01:32:12
データとして乱数の種1byteのみというのだから、あってるんじゃないか。
304デフォルトの名無しさん:2008/06/22(日) 01:40:00
今日始めたばかりなんですけど
どこかここ見て初心者は勉強するといいよっていうお勧めのサイトとかありますかね?
305デフォルトの名無しさん:2008/06/22(日) 03:05:05
猫でもわかるプログラミング がいいかもね、それより入門本を買うのを勧める。
306デフォルトの名無しさん:2008/06/22(日) 03:26:10
本気で勉強するなら、最初は内容よりも見やすい本を買うといいかも。

どうせ関連図書を数十冊買う事になるんだから・・・
307デフォルトの名無しさん:2008/06/22(日) 06:54:30
数十冊は買わねーよw
308デフォルトの名無しさん:2008/06/22(日) 06:57:44
>>274-279
ありがとうございます
頭柔らかくしてじっくり読んでみます
309デフォルトの名無しさん:2008/06/22(日) 07:46:11
恥ずかしくて聞けなかったのですが、グローバル変数とスタティック変数って
どう違うのでしょうか?メモリに確保されるのはどちらも同じだし。長所、短所が
よく分かっていません。違いが分かる方ご教示お願いします
310デフォルトの名無しさん:2008/06/22(日) 07:50:07
グローバル変数はどの関数からも関係なくアクセス出来るでしょ
スタティック変数は宣言した関数内で閉じ込められるでしょ
311デフォルトの名無しさん:2008/06/22(日) 10:02:00
>>309
クラス内のスタティック変数の場合は310のとおり。
クラス外の場合(グローバル変数にstaticをつけた場合)は変数のスコープが
そのソースファイル内だけになる。(他のソースファイルから参照不可)

と思う。
312311:2008/06/22(日) 10:03:49
310は関数内の話だったかorz
クラスのメンバにした場合はクラス内で唯一の変数となる。
インスタンス化せずに使用可能。

まあ調べた方が確実だ。
313デフォルトの名無しさん:2008/06/22(日) 12:31:28
>>309
たとえば、乱数を複数個発生させる場合を考えてみてください。
seed() で乱数を初期化し、rand() を望む数だけ呼んで乱数を得ますよね。
rand() を使うためにグローバル変数を準備する必要はありません。
けれどもrand() を呼ぶたびに新しい乱数が生成されるのは、不思議ですよね。
314デフォルトの名無しさん:2008/06/22(日) 13:08:58
rand は内部的にグローバル変数使ってるが
315デフォルトの名無しさん:2008/06/22(日) 15:10:23
>>314
ん、たしかに rand() 関数内 static だと seed() がアクセスできませんでしたか。失礼。
316デフォルトの名無しさん:2008/06/22(日) 15:49:03
seed じゃなくて srand な。
317デフォルトの名無しさん:2008/06/22(日) 16:23:50
typedefは型の別名を定義できますが、
個別の変数に(ポインタでなく)別名を定義できないでしょうか
可読性の都合上、別の名前で同じ変数にアクセスしたいのです
#defineでのマクロ定義は予想外の動作が怖くて使えません
318デフォルトの名無しさん:2008/06/22(日) 16:25:33
C++ならエイリアス使えば良いよ
319デフォルトの名無しさん:2008/06/22(日) 16:27:22
C++なら参照使えばいい

でも同じ変数に別の名前なんか付けたらむしろ可読性落ちそうだけど
別物だと誤解されてバグ出たらどうするつもりだ?
320デフォルトの名無しさん:2008/06/22(日) 16:32:23
いや、エイリアスを使いたくないんですよ

ブロックごとに使い捨てするオブジェクトが必要なんですが、
別々のオブジェクトを使ったり、毎回生成するのがもったいないんで、
共通のオブジェクトを使おうと思ったものの、オブジェクト名がtukaisute1じゃアレなんで
321デフォルトの名無しさん:2008/06/22(日) 16:34:37
エイリアスの機能が欲しいのにエイリアスを使いたくないって何をしたいんだ…
322デフォルトの名無しさん:2008/06/22(日) 16:34:54
それってオブジェクト名がカコワルイからって聞こえるが
アレじゃない名前にすれば解決なのか?
323デフォルトの名無しさん:2008/06/22(日) 16:35:13
>>320
「別名を定義=エイリアスを定義」なんだが。

後ろの説明も矛盾してるな、ブロックごとに必要なのか共通でいいのか。
324デフォルトの名無しさん:2008/06/22(日) 16:39:12
だから、ポインタ(というか4byte)を使いたくないって書いてるじゃない
#typedefのオブジェクトバージョンが欲しいのよ
325デフォルトの名無しさん:2008/06/22(日) 16:41:32
ポインタ…?
326デフォルトの名無しさん:2008/06/22(日) 16:41:56
C++ なら参照になると何度も言ってるし
C だとどうしようもない
327デフォルトの名無しさん:2008/06/22(日) 16:43:02
要するにないんですね
#defineでなんとかするかなぁ……
328デフォルトの名無しさん:2008/06/22(日) 16:48:24
それだけはやめてくれ
329デフォルトの名無しさん:2008/06/22(日) 16:49:55
ポインタでいいのに何を気にしているんだろう。
アセンブリ言語やってない奴はこれだから。
エイリアスが作れたとしても、
エイリアスは内部的にはポインタのようなもので実装される。
330デフォルトの名無しさん:2008/06/22(日) 16:49:56
何がしたいのかまったくわからんが、一時的な4byteくらいケチるなよ
331デフォルトの名無しさん:2008/06/22(日) 16:53:47
と思ったら、このケースだとポインタでは実装されないか。
最適化されて同一視されそう。

ポインタ使った場合もそう最適化されんのかな?
332デフォルトの名無しさん:2008/06/22(日) 16:54:07
>>329
だから、エイリアスは使いたくないといってるのに
ちゃんと質問文読もうね

>>330
4byteとはいえ、というか4byteだからこそ何百万回も確保しては消すのが精神衛生上よろしくない
333デフォルトの名無しさん:2008/06/22(日) 16:54:41
int n = 123;
int &nn = n;

みたいな例を考えると、
最適化しなければnnのためにポインタと参照、逆参照のコードが吐かれるけど
最適化するとnnのためのコードは消えるよ
nnへのアクセスがnへのアクセスと同等に扱われる

不安ならcc -Sとかやってアセンブラのコード確認してみ
334デフォルトの名無しさん:2008/06/22(日) 16:54:55
参照だと最適化で同一視されるだろうに
335デフォルトの名無しさん:2008/06/22(日) 16:55:35
要するに(ローカル)変数の使いまわしがしたいだけだろ。

まあ、最適化コンパイラの出力を見たことも無いくせに
速度を求めたがる時期にはよくあること。
どこぞのスレにあった、とにかくAPIを使った方が
ファイルの読み書きが速いと思っている人と一緒。
336デフォルトの名無しさん:2008/06/22(日) 17:06:03
>>333-335
情報が小出しで悪いんだけど、
このケースでそう最適化してくれるほどコンパイラが頭良いとは思えないんだよねぇ
なにせメソッド内でメンバ変数の別名を定義したいって状況だし
むしろ、それで最適化されるコンパイラは怖くて使えん

根本的に方法変えてみるか
337デフォルトの名無しさん:2008/06/22(日) 17:06:07
確保して消す、って、関数の頭にでもローカルでポインタ変数確保してやればよかろうに
関数抜けるときのスタック調整であわせて一緒に消してくれるよ
速度も変わらん
338デフォルトの名無しさん:2008/06/22(日) 17:07:01
精神衛生上の話でいえばマクロで変数名が変わる方がよろしくないだろ
339デフォルトの名無しさん:2008/06/22(日) 17:09:43
ああ、メソッド内で別のオブジェクトのメンバ変数を、だな
別に気にするほどじゃないことは分かってるんだけどね
今10億個のオブジェクト生成したが、一瞬だったぜ……
340デフォルトの名無しさん:2008/06/22(日) 17:19:17
>>336
アホか。グダグダ「思えない」とかアホなことを言う前に自分で試せよ。
メンバ関数からメンバ変数にアクセスするんなら、もともと
this経由のポインタアクセスだろ。

メンバ変数へのリファレンスを定義した場合、
最適化しなければ、thisに対してさらにポインタアクセスを行う。
つまり、参照段階が一段増える
最適化すれば、直接this経由でのポインタアクセスになる
つまり何もかわらないし、一切オーバーヘッドは発生しないんだよ。
341デフォルトの名無しさん:2008/06/22(日) 17:30:13
つまり、(必要な方の)コピーをローカル変数に用意し
終わったら該当する方に書き戻す。

ロード/ストアなアーキテクチャ的にも、レジスタ割付等の最適化的にも
こうすべきとしか思えないが。
342デフォルトの名無しさん:2008/06/22(日) 17:34:55
「参照使え」だけで十分だって。
#defineとか言ってる時点で初心者丸出しなんだし・・・
343デフォルトの名無しさん:2008/06/22(日) 17:37:27
ポインタ格納する時はpつけろよ!!!わかりにくいだろ!!!!!
344デフォルトの名無しさん:2008/06/22(日) 17:41:32
システムハンガリアンですね、わかります。
345デフォルトの名無しさん:2008/06/22(日) 17:41:41
コンパイラが頭良くない→俺はそんなことまで考えてる偉いプログラマ→このコンパイラ設計したプログラマ達馬鹿
つまり、>>336は「俺様頭いいwwwwwwww」って思い込んでる厨房
346デフォルトの名無しさん:2008/06/22(日) 17:45:13
それ以前の問題として、自分で何でもかんでも試してみて覚えて言ったほうが身につくと思うんだが・・・
脳内プログラマはイラネって思うのは俺だけ?
347デフォルトの名無しさん:2008/06/22(日) 17:46:40
アセンブラが読めないから仕方なく妄想だけで語ってるんだろ
348デフォルトの名無しさん:2008/06/22(日) 17:50:23
学生時代、ポインターにはpつけろ!bool型にはbつけろ!配列ならaをつけろ!3次元ならaaつけろと教えられましたが
就職したら、そんなの使うなって怒られました。

Z80アセンブラを見るだけで興奮したりUNIXやらLINUXの大規模なプログラムのソースコード見たりするだけで勃起しそうになる俺変態
349デフォルトの名無しさん:2008/06/22(日) 18:01:27
350デフォルトの名無しさん:2008/06/22(日) 18:03:00
それ、ただのアンチハンガリアン
どっちが正しいわけじゃないが、その会社のやつらの考えはさすがに古臭い
351デフォルトの名無しさん:2008/06/22(日) 18:04:15
そういうのって、クラスとかenumとかは何付けるの?
352デフォルトの名無しさん:2008/06/22(日) 18:06:04
>>350
システムハンガリアンでググっておくべき
353デフォルトの名無しさん:2008/06/22(日) 18:07:43
>>352
もしかしてシステムハンガリアンだとかアプリケーションハンガリアンの概念の話をするつもり?
そういうレベルじゃないと思うぞ
354デフォルトの名無しさん:2008/06/22(日) 18:09:42
そういうレベルだと思うけどw
今日日システムハンガリアン使うなんてただのアホだけっしょ
355デフォルトの名無しさん:2008/06/22(日) 18:12:16
それを広めたMSですら最近は否定しとるからな
356デフォルトの名無しさん:2008/06/22(日) 18:41:37
例外のインスタンスってどこに置かれてんの?
if(func()){
  throw std::runtime_error("aaa");
}
とかってしたとき、スタック上だと消えちゃうよね?
357デフォルトの名無しさん:2008/06/22(日) 18:58:37
>>356
専用の領域が用意されてたり、動的に確保されたりする。
358デフォルトの名無しさん:2008/06/22(日) 19:12:08
>>357
dクス

専用の領域ってことはスレッドローカル的なものになるよね。
グローバルじゃ無理だし。その辺は処理系依存か。
動的確保の方法だったら、
場合によっては std::bad_alloc が出る可能性もあるってことか・・・。
359デフォルトの名無しさん:2008/06/22(日) 19:23:22
>>358
例外の確保に失敗するような状況なら根本的に打つ手無しじゃない?
360デフォルトの名無しさん:2008/06/22(日) 19:24:00
std::bad_allocが動的確保だったら…
361デフォルトの名無しさん:2008/06/22(日) 19:34:40
参照渡しはポインタと同じでアドレスが渡されるが、
関数内での参照は別名と変わらんよ。
アドレスのコピーとかしてない。
362デフォルトの名無しさん:2008/06/22(日) 19:36:31
>>359
うん、そうだと思う。ちょっと思っただけ。
でもその関数内でauto_ptr<char>とかで大量に確保してた場合だと、
抜ければ空きが出るから・・・。
まぁruntime_errorの分でちょうど溢れるほど
絶妙なことはまずありえないだろうけどねw

>>360
動的だとすると、std::bad_allocだけは先に固定で一つ用意されてるのかもね。
363デフォルトの名無しさん:2008/06/22(日) 20:13:54
例外クラスを作る時にメモリ確保エラーが出たら
std::bad_alloc 例外が代わりに投げられることになる。
364デフォルトの名無しさん:2008/06/22(日) 20:15:34
代わりというか、例外クラスがそもそも作られてないから当然の話やね。

例外クラスが作られた後にその例外を投げるまでの間に
さらに例外が発生すると
std::terminate 関数が呼ばれて abort される。
365デフォルトの名無しさん:2008/06/22(日) 20:36:12
質問です、if文中の代入はどういう解釈をすればいいのでしょうか?
たとえば、
bool Result = false;
if(Result&=Func()){
...
}
bool Func(){
...
}
というソースコードがあり、Funcがtrueを返した場合trueと評価されるのでしょうか?falseと評価されるのでしょうか?
366デフォルトの名無しさん:2008/06/22(日) 20:38:58
Result = Result && Func();
if (Result) {
}
と考えればいい。
367デフォルトの名無しさん:2008/06/22(日) 20:39:01
>>365
コンパイル通るか試してみ
368デフォルトの名無しさん:2008/06/22(日) 20:39:50
>>365
Result &= Func();
if (Result) {
と一緒
369デフォルトの名無しさん:2008/06/22(日) 20:41:30
>>366-368
ありがとうございます、危うくエンバグするところでしたorz
ただの代入ならまだしも、こういった形での代入はするべきではないのでしょうね…。
370デフォルトの名無しさん:2008/06/22(日) 20:53:12
>>366
それだとResultがfalseのときFunc()が呼ばれないよ。
元のは常に呼ばれるけど。
371デフォルトの名無しさん:2008/06/22(日) 20:55:45
>>370
ああそうだ・・・その通り。
372デフォルトの名無しさん:2008/06/22(日) 21:52:25
クラスAとBがあって、
AのメンバにBのポインタがあり、Bのメンバを操作するメソッドがある
BのメンバにAのポインタがあり、Aのメンバを操作するメソッドがある

この場合、
・クラスBのプロトタイプ宣言
・クラスAの定義
・クラスBの定義
・クラスA、Bのメソッドの定義

っていうような順番で書くしかないですよね?
373デフォルトの名無しさん:2008/06/22(日) 22:15:01
・クラスAのプロトタイプ宣言
・クラスBの定義
・クラスAの定義
・クラスA、Bのメソッドの定義

でもよいじゃないか
374デフォルトの名無しさん:2008/06/22(日) 22:16:50
>>372
しかない。

>>373
同じw
375デフォルトの名無しさん:2008/06/22(日) 22:17:29
>>373
いや、それはそうだけどww
ていうか、同じじゃないですか

>>374
ありがとうございます
うーん、見難いソースになっちゃうなぁ
376デフォルトの名無しさん:2008/06/22(日) 22:19:02
>>375
相互依存してるのが問題の原因だろ。そこを解決しないと簡単にはならないよ。
377デフォルトの名無しさん:2008/06/22(日) 22:26:51
>>372
クラスBから呼ばれるメソッドを持つクラスaを宣言する。
クラスaのポインタを持つクラスBを宣言する
クラスaを派生させたクラスAを宣言する。

378デフォルトの名無しさん:2008/06/22(日) 22:55:41
そんなお互いベッタベタに依存してるようなクラスならカプセル化の意味ないから
設計を考え直した方がいい
379デフォルトの名無しさん:2008/06/22(日) 23:07:04
ゲーム作るとキャラクターとゲーム管理クラスが相互参照するのはよくあること
ていうか、ほとんど必須
まぁ俺はゲーム管理クラスをシングルトンにするけど

と、エスパーしてみる
380デフォルトの名無しさん:2008/06/22(日) 23:08:43
>>356
VC++だとスタックだよ。投げた時点のスタックに、
例外処理が終わるまでアクセス可能だから、そういう芸当ができる。
381デフォルトの名無しさん:2008/06/22(日) 23:35:26
>>380
まじすか。
途中の関数内のデストラクタ起動とかどうやってるんだろう・・・。
382デフォルトの名無しさん:2008/06/23(月) 00:23:19
C的な発想では簡単にできないらしい。
この例外のせいでというかおかげというか、
C++は当初Cへ変換してからコンパイルする、ということは
(効率を度外視しない限り)不可能ならしい。
383デフォルトの名無しさん:2008/06/23(月) 00:23:45
うおう。「当初」は抜いてくれい。
384デフォルトの名無しさん:2008/06/23(月) 00:38:32
「な」も抜いた方がいい
385デフォルトの名無しさん:2008/06/23(月) 03:56:56
char text[18] = "りんごバナナすいか";
char* item1 = text[0〜5];
char* item2 = text[6〜11];
char* item3 = text[12〜17];
cout << item1 << '\n';
cout << item2 << '\n';
cout << item3 << '\n';
: りんご
: バナナ
: すいか
上記のように一次元配列を分割して参照したいのですが、良い方法はありませんか?
386デフォルトの名無しさん:2008/06/23(月) 04:11:01
char text[] = "りんご\0バナナ\0すいか";
char *item1 = text;
char *item2 = strchr(item1, '\0') + 1;
char *item3 = strchr(item2, '\0') + 1;

求めているものがこれだとは思えないが
俺はエスパーじゃないのでこれ以上はわからん。
387デフォルトの名無しさん:2008/06/23(月) 04:12:20
>>385
#include <string>
...
std::string text = "りんごバナナすいか";
std::string item1(&text[0], &text[6]);
std::string item2(&text[6], &text[12]);
std::string item3(&text[12], &text[18]);
cout << item1 << '\n';
cout << item2 << '\n';
cout << item3 << '\n';
388デフォルトの名無しさん:2008/06/23(月) 04:34:08
>>385
つStringTokenizer
389デフォルトの名無しさん:2008/06/23(月) 15:10:43
LIFOっていうのの仕組みを読んだら再帰がちょっとだけ分かってきた
390デフォルトの名無しさん:2008/06/23(月) 15:13:00
そんなもの干草のベッドで寝そべってちょっと考えれば分かる事だろ。
391デフォルトの名無しさん:2008/06/23(月) 15:13:39
>>390
ハイジかよ!
392デフォルトの名無しさん:2008/06/23(月) 15:19:33
おんじ:スタックオーバーフローに気をつけるんじゃ

ペーター:ぷっ
393デフォルトの名無しさん:2008/06/23(月) 16:26:07
初心者な質問です。
動的リンクライブラリ(.dll)ってのを
使ったり作ったりした事が無いのですが
どういう状況で用いるべきものなのでしょうか?
例のようなものもあれば教えて下さい。
394デフォルトの名無しさん:2008/06/23(月) 16:29:30
画像の展開みたいな汎用性が高くていろいろなところで使う物とか
395デフォルトの名無しさん:2008/06/23(月) 16:39:52
・ユーザーサイドで差し替えれるようにしたいばあい
・複数アプリで使用したいばあい
・ライセンス条件でDLLでの配布(またはソース公開)が義務付けられてるばあい
396デフォルトの名無しさん:2008/06/23(月) 17:05:14
>>394-395
回答どうもです。
作るとしたら複数のアプリケーションに流用できるような
独自形式のファイルフォーマット扱う場合とかに作ったりするべきなのかな。

>・ユーザーサイドで差し替えれるようにしたいばあい
>・複数アプリで使用したいばあい
ってのが気になるのですが
差し替えるとは古いdllを新しいもので上書きするような感じなのでしょうか?
また、複数アプリでライブラリ使うってだけなら静的リンクライブラリでもいいのではないかと思うのですが
その辺り詳しく教えていただけると嬉しいです。
397デフォルトの名無しさん:2008/06/23(月) 17:07:55
dllにもバグはあるだろうし、改善もするだろうしねぇ
複数アプリで同じ機能いちいち積んでたらもったいないじゃん
398デフォルトの名無しさん:2008/06/23(月) 17:12:06
静的リンクだとアプリごとにライブラリが組み込まれるので
サイズが大きくなるから、DLLにしたい場合もある。

差し替えが有効な例は、独自ファイルのアクセスDLLなどなら、
ファイルフォーマットを変えた場合に、アプリ全体ではなく
DLLのみの更新ですむと。

あとプラグインとして機能追加できるような設計をしたい場合なども、
DLL使うのが良いのじゃないかなと。
399デフォルトの名無しさん:2008/06/23(月) 18:20:02
http://chihara.naist.jp/people/STAFF/imura/computer/misc/virtual_joystick/disp_content
を参考にしてるんだけど、VOPの制御がよく分からない、どなたか教えてください.
400399:2008/06/23(月) 18:23:44
すいません、POVまちがいです。
401デフォルトの名無しさん:2008/06/23(月) 18:59:50
using namespace std;
fstream fs( "C:\\a.txt", ios::in);
string strtoken;
while( !fs.eof() ){
  fs >> strtoken;
  cout << strtoken << endl;
}

これに
AAA BBB CCC
と書かれたファイル(CCCの後ろに\n有り)を読ませると、

AAA
BBB
CCC
CCC

と、最後のトークンが2回出力されてしまいます。
最後CCCの後ろの改行を無くせば再現されないところまでわかったのですが、対処法がわかりません。
どうすれば最後のトークンが2回出力されるのを防げるでしょうか。
402デフォルトの名無しさん:2008/06/23(月) 19:01:47
CCCの後ろが即eofになってれば防げるよ
403デフォルトの名無しさん:2008/06/23(月) 19:05:08
>>402
CCCの後が即eofになってない場合の対処はどのようにすれば良いですか?
404デフォルトの名無しさん:2008/06/23(月) 19:12:35
>>401
while (fs >> strtoken)
    cout << strtoken << endl;

のように書くんだね。
何で>>401のコードでそうなるかというと、fs.eof()が偽でも
fs >> strtoken;は失敗する可能性があるのに、それをチェックせずに
strtokenを出力しているからだ。

CCCまで読んだあと、streamには最後の改行が残っている。ので、
fs.eof()は偽を返す。が、空白文字しか残っていないので、
fs >> strtokenは失敗するんだよ。
405デフォルトの名無しさん:2008/06/23(月) 19:13:14
while( !fs.eof() ){
  strtoken.clear();
  fs >> strtoken;
  if(!strtoken.empty()) cout << strtoken << endl;
}

これでどうだろう?
406デフォルトの名無しさん:2008/06/23(月) 19:14:38
>>399-400
適当にググってみたけど、

ttp://blog.livedoor.jp/b2pencil/archives/440812.html
とかに
  [check] Directional button POV:
  North: Digital40
  East : Digital41
  Weast: Digital42
  South: Digital43
ってあるのと、
  #define NUM_DIGITAL 16
  ...
  typedef struct {
    ...
    char  NumDigital;
    char  Digital[NUM_DIGITAL];
  } JOYSTICK_STATE;
  ...
  js.NumDigital = NUM_DIGITAL;
ってしてるから

NUM_DIGITAL を44以上にして
JOYSTICK_STATE::Digital[43] を見てみるとか、

もしくは NUM_DIGITAL は16のままで、
Digitalの43ビット目を見るとかそんなんじゃねーの?
知らないけど。
407デフォルトの名無しさん:2008/06/23(月) 19:15:45
あ、こう書くのがベストなのかな

while( !fs.eof() ){
  if( fs >> strtoken ) cout << strtoken << endl;
}
408デフォルトの名無しさん:2008/06/24(火) 10:12:53
>>405
なるほどわかりやすいですね。ありがとうございます。

>>404
>>407
ありがとうございます。理由がわかりました。
fs >> stroken が失敗したときに1以外を返すという事も知りませんでした。
そういった情報はどうすれば調べられるのでしょうか。
リファレンスistreamの>>演算子の項目を見ても書いてなかったように思って・・。
409デフォルトの名無しさん:2008/06/24(火) 11:45:50
なぁC++ってなんて呼ぶん?
410デフォルトの名無しさん:2008/06/24(火) 11:49:43
>>408
それは
fs >> strtoken;
if( fs ) ........
と一緒。
operator>> が 1 とかを返すわけじゃない。
operator>> は fs 自身を返す。
その fs の basic_ios::operator void* が働く。
411デフォルトの名無しさん:2008/06/24(火) 11:53:16
>>409
しーぷらすぷらす
しーぷらぷら
しーぷら
しーたすたす
しーぴーぴー
しーいんくりめんと

どれでもお好きなのをどうぞ
412デフォルトの名無しさん:2008/06/24(火) 12:07:42
しぷぷ
413デフォルトの名無しさん:2008/06/24(火) 19:59:56
クラス内クラスで、元クラスのインスタンスをメンバに持つというのは不可能なのでしょうか。

class hoge{
public:
 class fuga{
  public:
   hoge hogehoge;
   std::vector<hoge> vhoge;
 };
};

とやると、hogehogeがincomplete typeと言われます。
ところが、hogehogeを消してvhogeのみにするとコンパイル可能になります。
こういった書き方は不可能なのでしょうか、また、コンパイルを通ったhogeのvectorは使用しても大丈夫なのでしょうか。
414デフォルトの名無しさん:2008/06/24(火) 20:09:17
シープラが一番多いんじゃないか?当然、略読みだが
415デフォルトの名無しさん:2008/06/24(火) 20:11:39
又も、無限大のインスタンスを作ろうとしている。
スパコンを持ってしても、そのクラスはメモリーオーバーで使えない。
416デフォルトの名無しさん:2008/06/24(火) 20:15:06
hogehogeをポインタにしたらいけるんじゃね?
417デフォルトの名無しさん:2008/06/24(火) 20:29:08
class hoge {
class fuga;
};

class hoge::fuga {
hoge hogehoge;
};
418413:2008/06/24(火) 20:32:16
>>415
やっぱりそうなりますか。
元クラスだけインスタンス化して内部クラスをインスタンス化しなかったり、
内部クラスだけインスタンス化したりすれば大丈夫かと思ったのですが…。
このあたりのC++の微妙な振る舞いが中々身に付きません。
経験を積むしかないでしょうか。

>>416
それだとできるみたいです。ありがとうございます。
ただやっぱり危険っぽいので大人しく別クラスにしようかと思います。
元々は、元クラスのvectorを2本返すメンバ関数を作るためなので、別クラスは気持ち悪いのですが…。
419413:2008/06/24(火) 20:38:43
>>417
おおお!凄い!ありがとうございます!
ただちょっとわからないのは、それは最初の(ダメな)書き方と比べて何が違うのでしょうか。
単なる文法上の規則ですか、それとも、振る舞いの違うコードになるのでしょうか。
すみませんが教えて頂けると助かります。
420デフォルトの名無しさん:2008/06/24(火) 20:47:38
文法上の違い、単なる決まりごと
最初のはfugaの定義中にhogeの定義が完成されてないから。サイズが不明

void f() { g(); }
void g();

が許される言語もあれば許されない言語もあるのと同じようなもの
421デフォルトの名無しさん:2008/06/24(火) 21:12:58
>>418
> 元クラスだけインスタンス化して内部クラスをインスタンス化しなかったり、
> 内部クラスだけインスタンス化したりすれば大丈夫かと思ったのですが…。
ここのフィーリングがよくわからないなぁ。
>>413のコードのhogeクラスのサイズが無限大になるのは、物凄くシンプルな結果というか、
他に何も判断材料が無きゃ誰だってそう考えるだろ、っていうモノに俺には思えるんだけど、
どういう風に「微妙な振る舞い」なのかなぁ。
422デフォルトの名無しさん:2008/06/24(火) 21:14:33
まあもっと静的に考えろって話です
423デフォルトの名無しさん:2008/06/24(火) 21:21:38
>>421
無限にはならんだろ。
hogeはfugaを持って無いし。
424421:2008/06/24(火) 21:26:05
ごめん、素で読み間違えマスタ。
425413:2008/06/24(火) 21:28:21
>>420
なるほど、よくわかりました。ありがとうございます。
426デフォルトの名無しさん:2008/06/24(火) 23:38:34
>>411
正しい読み方のみおしえてやれ

しーだぶるぷらす
しーぷらすぷらす

が正しい
427デフォルトの名無しさん:2008/06/25(水) 00:09:37
しーぷるぷらすに見えた
428デフォルトの名無しさん:2008/06/25(水) 00:11:42
OK、こうなったらこの俺がD&Eを紐解くぜ。

-- C++設計と進化(禿著) 第3章 C++の誕生 ページ80 より --

寄せられた案の中から私はC++を選んだ。(中略)
++は"次"とか"そのあと"とか"インクリメント"を意味する。
発音はつねに 'プラスプラス' だ。
第一位のC++と二位のCは、(以下略)
429428:2008/06/25(水) 00:12:47
× 第一位のC++と二位のCは、(以下略)
○ 第一位のC++と二位の++Cは、(以下略)

前置インクリメントは大事だよな。
430デフォルトの名無しさん:2008/06/25(水) 00:21:00
>>409
http://www.comeaucomputing.com/techtalk/#pronounce しーぷらすぷらす
C++ pronounceでぐぐるとGeekらしき人々がネタ発音をいろいろ書いてる。
どこでも同じようなもんだなw
431デフォルトの名無しさん:2008/06/25(水) 00:23:53
C言語の質問です。
ソースを書いてみたのですが、出来ません。
まず、1コの升を作って、それから縦と横を足すようにしました。
縦の数は合うのですが、どうしても横の数が合いません・・・。
考え方のヒントをよろしくお願いします。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7045.txt
432デフォルトの名無しさん:2008/06/25(水) 00:28:14
.txtなのにインデントが意味分からんことについて事情聴取したくなってきた
433431:2008/06/25(水) 00:32:20
済みません。
何回も打ったりしているうちにメチャクチャになりました・・・。
434デフォルトの名無しさん:2008/06/25(水) 00:32:31
・何でputsとprintfを使い分けてるの?
・改行したらそこで横軸終了ですよ
435デフォルトの名無しさん:2008/06/25(水) 00:40:56
>>431
ヒント:

 (縦2、横3)
 +  -----+  -----+  -----+

 l      l       l      l
 l      l       l      l
 l      l       l      l
 +  -----+  -----+  -----+

 l      l       l      l
 l      l       l      l
 l      l       l      l
 +  -----+  -----+  -----+
436431:2008/06/25(水) 00:57:20
ああああああ、ありがとうございます!!!!
できました!!!!
437デフォルトの名無しさん:2008/06/25(水) 09:44:36
>>429
「C++の値はCだけど、++Cの値はC+1だ」なんて言う人が++Cに投票したのかな。
438デフォルトの名無しさん:2008/06/25(水) 18:46:45
c言語の勉強に本腰を入れようとしてる学生です。
それでテキストエディタを探しているのですがフリーでダウンロードできる物で良い物を教えていただけませんか?
439デフォルトの名無しさん:2008/06/25(水) 19:00:07
>>438
エディタとコンパイラを別途用意してシンプルな状態から始めたいのなら別だが、
VSExpressでいいんじゃないかなあ。

sakuraエディタとかでいいんでない?
個人的にはvim
440デフォルトの名無しさん:2008/06/25(水) 19:13:14
配列の要素数を取得する手段で、
_countof などのマクロを使う方法などがありますが、
引数に配列を受け取るメソッド内にて、

void func(int i[]){
  _countof(i);
}

と組むとビルドエラーになります。
配列を受け取るメソッド内では、引数で要素数を受け取らずに、
配列内の要素数を把握することは可能なのでしょうか?
よろしくお願い致します。
441デフォルトの名無しさん:2008/06/25(水) 19:20:27
>>440
不可能です。
442デフォルトの名無しさん:2008/06/25(水) 19:23:58
>>440
取れないことはないけど、止めた方が良い
443デフォルトの名無しさん:2008/06/25(水) 19:28:05
>>441
>>442
レスありがとうございました。
vectorで対応することにします。
444デフォルトの名無しさん:2008/06/25(水) 19:33:05
int v[16];
func(v);
がやりたいだけだったら、テンプレート+参照渡しという手もあるな。
template <size_t Size> func(int (&args)[Size]) { ... }
サイズがコンパイル時に決まってないといけないし、コード膨れそうだけど。
445デフォルトの名無しさん:2008/06/25(水) 19:39:44
別にtemplate<typename T> func(T& args)でいいんだけどね。
446デフォルトの名無しさん:2008/06/25(水) 20:00:42
そういうのは止めた方が良いって・・・
教えるならせめてboost::arrayやRangeの考え方を
447デフォルトの名無しさん:2008/06/25(水) 20:25:21
template<typename RundomAccessLvalueRange> void func(RundomAccessLvalueRange& args)
こうするんですね、わかります。
448デフォルトの名無しさん:2008/06/25(水) 20:44:08
>>439
ありがとうございます。
コンパイラはボーランド社の無償で使えるのを使っています。
449デフォルトの名無しさん:2008/06/25(水) 20:48:10
>>448
それは古すぎて最近のライブラリに対応しきれなかったりコンパイラのバグ・言語仕様未実装が多かったりするから、
おとなしくVCExpressの最新版使っておけ。
450デフォルトの名無しさん:2008/06/25(水) 20:57:48
>>448
ググるなら「VC++Express」で。
最新は2008、もちろん無料。
451デフォルトの名無しさん:2008/06/25(水) 20:59:14
VS重杉大嫌い
452デフォルトの名無しさん:2008/06/25(水) 21:00:35
>>451
適当な環境を用意してgccでも使えば?
453デフォルトの名無しさん:2008/06/25(水) 21:02:12
モバイルノートに NTEmacs と Mingw で遊んでる
454デフォルトの名無しさん:2008/06/25(水) 21:02:15
>>451
別にvcbuildでもnmakeでもcl直叩きでもやればいいじゃん
makeだけGNUmake使ってもいいしな
455デフォルトの名無しさん:2008/06/25(水) 21:07:42
うーむ?
456451:2008/06/25(水) 21:11:21
おまえらもっと漏れにもわかるように説明しやがってください。
457デフォルトの名無しさん:2008/06/25(水) 21:19:19
>>456
コンパイラをコマンドラインで実行すれば重すぎと表現されているVSを起動せずにすむということでは。
VS起動した後テキストエディットが重たいのなら嫌いになってもいいけど、
大して使ってないのに奇妙なところで嫌いになってしまうのはよくないよ。
458デフォルトの名無しさん:2008/06/25(水) 21:23:44
システムを休止状態にするSetSystemPowerState関数とは逆の意味の関数はありますでしょうか。
アプリケーション実行中はマウス等の操作が無くても休止状態にならない機能を実装したいです。
459デフォルトの名無しさん:2008/06/25(水) 21:27:50
>>458
case WM_POWERBROADCAST:
    if (wParam == PBT_APMQUERYSUSPEND) {
        return BROADCAST_QUERY_DENY;
    }
    break;
460デフォルトの名無しさん:2008/06/25(水) 21:29:15
なるほど
461458:2008/06/25(水) 21:33:06
>>459
ありがとうございます。
462デフォルトの名無しさん:2008/06/25(水) 21:35:44
NMAKE派である俺のMakefileを公開してやる。推論でほとんど済む。
# makefile
CSC = csc
CSFLAGS = /nologo /o /d:TRACE
VBC = vbc
VBFLAGS = /nologo /optimize /d:TRACE
VJC = vjc
VJFLAGS = /nologo /o /d:TRACE
.cs.exe:
    $(CSC) $(CSFLAGS) $<
.cs.dll:
    $(CSC) $(CSFLAGS) /t:library $<
.vb.exe:
    $(VBC) $(VBFLAGS) $<
.vb.dll:
    $(VBC) $(VBFLAGS) /t:library $<
.jsl.exe:
    $(VJC) $(VJFLAGS) $<
.jsl.dll:
    $(VJC) $(VJFLAGS) /t:library $<
.java.exe:
    $(VJC) $(VJFLAGS) /x:all $<
.java.dll:
    $(VJC) $(VJFLAGS) /x:all /t:library $<
.SUFFIXES: .cs .vb .jsl .java
CFLAGS = /nologo /O2
CPPFLAGS = /nologo /O2 /EHsc
CXXFLAGS = /nologo /O2 /EHsc
463デフォルトの名無しさん:2008/06/25(水) 21:39:58
>>450
ありがとうございます。
ところでコンパイラって複数入ってても問題ないんですか?
464デフォルトの名無しさん:2008/06/25(水) 21:40:41
VCと関係があるのは下3行だけでは
J#への異常なこだわりはなんだ
465デフォルトの名無しさん:2008/06/25(水) 21:42:51
しかもCはじめようって人にサッパリ向かない。
hello.cを作ったんですがどうすればいいですか?なんていわれるよ
466デフォルトの名無しさん:2008/06/25(水) 21:44:16
>>463
コマンドラインから使いたいなら、環境変数の設定はバッチファイルでするようにしたほうがいい。
INCLUDEとかLIBとかかぶる。
467デフォルトの名無しさん:2008/06/25(水) 22:09:49
IntelコンパイラはVCコンパイラより速いって本当ですか?
だったらどうして前者は普及してないんですか?
468デフォルトの名無しさん:2008/06/25(水) 22:10:35
どうして普及していないと思ったの?
469デフォルトの名無しさん:2008/06/25(水) 22:18:06
>>458
SetThreadExecutionState
470デフォルトの名無しさん:2008/06/25(水) 22:23:00
>>467
速いだけが選択の基準じゃないんだよ。
471デフォルトの名無しさん:2008/06/25(水) 22:47:15
>>469
そうそう。459よりその方が妥当と思う。
459だと手動でも休止にできなくなりそう。
458の質問から判断すると、電源設定による休止のことだろうから。
472デフォルトの名無しさん:2008/06/26(木) 00:26:26
Cのソースをcppにしてコンパイルしようとしてるんですが、エラーが出てしまいました。

if(strncmp(header_buf, "RIFF", 4)){
fprintf(stderr, "Error: %s is not RIFF.", filename);
fclose(fp);
return NULL;
}


error C2664: 'strncmp' : 1 番目の引数を 'unsigned char [20]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です

こういうエラーなんですが・・・・

どうすれば直せますか
473デフォルトの名無しさん:2008/06/26(木) 00:30:42
エラーメッセージに書いてある通りにすればいい。
474デフォルトの名無しさん:2008/06/26(木) 00:31:02
const_cast<char *>(static_cast<char *>(header_buf))

で消えない?
475デフォルトの名無しさん:2008/06/26(木) 00:31:29
if(strncmp(reinterpret_cast<const char*>(header_buf), "RIFF", 4)){
476デフォルトの名無しさん:2008/06/26(木) 00:31:39
const_cast 要らんし、
static_cast じゃダメだろ
477デフォルトの名無しさん:2008/06/26(木) 00:32:39
・header_bufの型をunsigned char[20]ではなくsigned char[20]にする。
・reinterpret_castでキャストする。
478デフォルトの名無しさん:2008/06/26(木) 00:34:19
singed char と char は別の型だと何度言えば
479デフォルトの名無しさん:2008/06/26(木) 00:34:51
>>475
>>477

出来きましたー
480デフォルトの名無しさん:2008/06/26(木) 00:51:03
longとintはどう違うんですか。32bit環境で
481デフォルトの名無しさん:2008/06/26(木) 00:52:54
>>480
型が違う
482デフォルトの名無しさん:2008/06/26(木) 01:01:52
代入、比較したら警告が出る
483デフォルトの名無しさん:2008/06/26(木) 01:04:38
>>472
ブフォ
むしろ俺が作ってるのもいずれそういうコードを書くことになるわwww
484デフォルトの名無しさん:2008/06/26(木) 01:17:03
>>483
kwsk
485デフォルトの名無しさん:2008/06/26(木) 01:25:22
Cは型チェックがヌルいからね。
486デフォルトの名無しさん:2008/06/26(木) 01:26:04
>>484
mp3のタグ解析じゃなくて?
RIFF、headerのあたりでそう思ったんだけど違うかなw
こないだID3v2の仕様とか眺めて「これはひどい」とか思ってたとこ
487デフォルトの名無しさん:2008/06/26(木) 02:04:50
お願いします。
C++で三角関数を計算させたいときに、
a = 0;
b = sin(a.);
とするとエラーになってしまいます。
bを計算させるにはどう記述すればいいのでしょうか。
488デフォルトの名無しさん:2008/06/26(木) 02:05:02
#define This (*this)ってどう?
489デフォルトの名無しさん:2008/06/26(木) 02:08:18
>>487
b = sin(static_cast<double>(a));
490デフォルトの名無しさん:2008/06/26(木) 02:08:22
>>487
まさか -libm とかいうオチ?
491デフォルトの名無しさん:2008/06/26(木) 02:09:25
とりあえずエラーとはなんぞや
ターミネートしたのか?
492デフォルトの名無しさん:2008/06/26(木) 02:10:32
変数名の後ろに小数点つけても意味はないんだ
というか別の意味になる
493デフォルトの名無しさん:2008/06/26(木) 02:15:10
>>488-492
回答ありがとうございます。
コンパイルできました。完全知識不足です

>>490
すいませんそのオチすら理解できてないです
494デフォルトの名無しさん:2008/06/26(木) 02:28:13
じゃあ #include <cmath> が抜けてるんだろう
495デフォルトの名無しさん:2008/06/26(木) 07:22:26
完全に . の問題だろ。
496デフォルトの名無しさん:2008/06/26(木) 08:31:41
#include <mat.h>
497デフォルトの名無しさん:2008/06/26(木) 10:32:18
VisualStudio2005(90日評価版)で、C++を使って、WindowsMobile用のアラームを作ろうとしています。
でもなんかよくわからないエラー↓が( TДT)

プログラム '[56ca06d2] ErinnTimer.exe' はコード -1073741571 (0xc00000fd) で終了しました。

エラーの発生タイミングとしては、下記の2種類でした。
1.実行直後(何も表示されず落ちる)
2.入力時(チェックボックスをクリック or 日時指定コントロールの日時を変更)

Windows Mobile 6 Proのエミュレータと実機(Advanced/W-ZERO3 [es])両方で同じ状況です…。

上記のエラーコード(0xc00000fd)でぐぐってみたら、
「unknown software〜」とか「Stack Overflow」とかも書いてあるエラーメッセージが引っかかるんですけど、
デバッグ時の出力は上記のとおりで、なんだか違う気がします…。
というか、解決方法がわからないです(´;ω;`)

さらによくわからないのは、リビルドするとしばらくはエラーが出ないこと…。
また、ときどき「Second Chance Assersion Faild」っていうエラーになること…。
こちらのエラーになる条件は、今のところわかりません…。

エラー駆除のため、何をしたらいいかアドバイスをいただけたら幸いです。
よろしくお願いいたしますm(_)m
498デフォルトの名無しさん:2008/06/26(木) 10:42:39
どうせでかい配列を作っちまったんだろ
499デフォルトの名無しさん:2008/06/26(木) 10:50:09
WinMain() の1行目にブレークポイントして毎回止まるか?
その後はひたすらF5/F10/F11でステップ実行。
500497:2008/06/26(木) 10:53:43
>>498
たぶん配列作ってないです…。
# C++での配列の作り方知らないので…。

自分でやっているといえば、時間を通常の40倍に計算して表示してることです。
その辺なんか問題ありますかね…。

時刻の算出は下記のようにやってます。

CTime curTime=CTime::GetCurrentTime();
CTime tmpTime=CTime(curTime.GetYear(), curTime.GetMonth(), curTime.GetDay()-1, 0,0,0);

__time64_t t1 = curTime.GetTime();
__time64_t t2 = tmpTime.GetTime();
__time64_t t = t1-t2;
t *=40;

return CTime(t);
501497:2008/06/26(木) 10:55:36
>>499
すみません、WinMain()ってどこにあるんでしょうか…(´;ω;`)
ソリューション内検索してもないのですが…
502デフォルトの名無しさん:2008/06/26(木) 11:51:40
theAppで検索してみるとか
503499:2008/06/26(木) 12:10:47
>CTime tmpTime=CTime(curTime.GetYear(), curTime.GetMonth(), curTime.GetDay()-1, 0,0,0);
昨日の0時なら、今日の0時-24Hじゃない? 話、飛んですまんが。
504497:2008/06/26(木) 12:22:50
>>502
「theAPP」で検索すると2箇所がヒットしますが、WinMain()との関連性がわかりません(´;ω;`)

とりあえず、theAPPでヒットする場所にのみブレークポイントを設定し、F10をちょこちょこ押してみました。
すると、「crt0dat.c」というファイル内の「#include <dbgint.h>」と書かれている行から矢印が動きません。
10回以上おしても進まなかったので、F5を押しました。
# ステップ実行のいみがなーい;;

そうすると通常起動しました。(今回は実行直後には落ちなかったようです)

通常起動まで行った場合は、日時指定コントロールの時間の数字を「▼」で1つ下げただけでエラーで落ちました…。

そこで気づいたのは、「▲」で増やした場合はエラーにならなかったということです。
落ちる前に、少しだけ表示されるエラーメッセージに「m_time=-1」って書いてあった気がします。
日時指定コントロールで、時間として不正な値が入ってしまったということでしょうか???
505デフォルトの名無しさん:2008/06/26(木) 12:24:42
C++とプログラミングの学習 に関する質問です

当方未経験中途採用のプログラマ見習いです。
C++でプログラムを組まなければならなくなったので力を貸して欲しくて書き込みました。

入社してから基本放置プレイされており、その間は基本的にC言語、C#、プログラマの心得、
ITプロ等のサイトで色々な情報収集等、自分で課題を見つけて勉強の繰り返しをして過ごしていました。
どれも、ひとつを深く追求という訳じゃなく、何が来てもいいように色々な情報を広く浅く収集してたつもりです。

今回渡されたのがまず、C++で文字列やバイナリを書き換えたり、特定の情報をデータ構造の中から
抜き出すプログラム等、処理としては簡単な物というか、処理の流れとして何をしたら実現できるか
という部分までは自分で導きだせるのですが、C++でそれを実現する手段を自分の与えられた環境下で
C++らしく実現する方法っていうのがうまく見つけられません。(日本語あってるか・・・?)

C++には何か色々なライブラリがあったり、コンパイラによって違ったり、STLとか・・・?
環境によって違ったりするというのはうすぼんやりとは解るんですけど、
正直情報が多すぎて自分では何と何と何を組み合わせてやればいいのかわからないというか、
うまく言葉にできなくてすいません・・・。頭の中で情報のマッピングが出来てないっていうのかな・・・?

環境はVista、VC2008
先輩に言われたのは「MFCとか使うんじゃなくてWin32(…だったかな?)で書いてね」
といわれた記憶があります。



そこで質問内容からまとめて聞きたい事を。
・今回、そういった指定を受けた上で、何を調べたら良いのでしょうか?という一時的な回避策。
 (何という概念について知るべきとか、どういった単語で検索すればいいか等)
・複雑(に自分からは見える)C++の世界に、根本的な理解を深めながらプログラミングする為のアプローチとしては何から知ればよいでしょうか?

何かキーワードを与えてくださればあとはそれに関して自分で調べられる限りは調べますんで
よかったらアドバイスお願いします。質問が抽象的すぎてすいません。
506497:2008/06/26(木) 12:30:37
>>503
えぇと、すみません、私の日本語読解力が足りないみたいで、何を聞かれているのかわかりません;;
今日の0時から24時間引いても、昨日の0時でも同じ時をあらわしていると思います。

なんでtmpTimeを作ったかというと、単に40倍するときに桁があふれないように年月日を除きたかっただけなんです。
今日でも昨日でもよかったんですけど、1日分くらいずらしておいたほうがいいかなと思っただけなんです。
それだけなんです。ほんとすみません
507デフォルトの名無しさん:2008/06/26(木) 12:30:38
>>505
とりあえず、なにをしたいのか書かないと答えようがない。
508デフォルトの名無しさん:2008/06/26(木) 12:42:11
>>507
すいません、あまり根本的な質問や細かい質問をいちいちするのも嫌がられるかなと思ったので、
何かとっかかりになるようなキーワードや、C++とそれを取り巻く世界の構造を掌握するための
ヒントみたいな物をもらえたらって感じで書いたんですが。

引き続き上記の情報も募集しますが、

なんか、正直そんな悠長な事言ってられる状況じゃないっぽいんで
今必要な物は完結に書きます(笑



・C++でファイルの操作をする
・ファイルの読み込み、書き出し
・フォルダ内から全てのファイルのパスを取得する

・文字列とバイナリの入り交じったデータをどう扱えばよいか
・そういったデータから必要なデータ構造(文字列)を抜き出す方法
(バイナリ部分は一部分だけで、今回は必要の無い物です)
・もしバイナリとして扱うべきとした場合、文字列の検索等
(どうもうまく調べられないです)
・特定位置への文字列の注入



これらに関して何か検索すべき単語やヒントがあったらお願いします。
509デフォルトの名無しさん:2008/06/26(木) 12:43:39
>>508
まずはやってみようぜ。
今どこまでできててどこでつまってんの
510デフォルトの名無しさん:2008/06/26(木) 12:46:50
>>508
ファイル操作はWin32のリファレンスをしっかり読む

文字列やバイナリのデータは、forと配列をつかってとりあえず自分で作ってみる
511デフォルトの名無しさん:2008/06/26(木) 12:48:20
>>508
ファイルの構造が固定長レコードなのかそれ以外なのかによって違う

それ以外の例 画像ファイル内のコメント等
[種別(バイナリ)][長さ(バイナリ)][文字列]...
[文字列長(バイナリ)][文字列][文字列長(バイナリ)][文字列]...
512デフォルトの名無しさん:2008/06/26(木) 12:55:15
>>509
ありがとうございます!

今の所、どうやって作ろうかっていうのを考えた段階で、
コーディング初めてもバイナリと文字列どう扱っていいんだろう?
って所で詰まるなと思い調べてばかりいました。

たしかに>>509さんの言う通り、つまってから聞かなきゃ聞き様が無いですよね。
しかも、実際に詰まらなきゃ解決策の試しようが無いですもんね。
一人でどうしたらいいだろうかと悶々と考えていたので、冷静な判断力に欠けてました・・・
とりま、なりふり構わずに「動くものができりゃいいや」ってつもりで造って見ます。

おそらく”バイナリと文字列”のところでつまづくと思うんで、その時また来る事にします。
ありがとうございました!
513デフォルトの名無しさん:2008/06/26(木) 13:07:55
うーん
514デフォルトの名無しさん:2008/06/26(木) 13:10:45
態度が悪いわけじゃないし、文章が下手なわけでもないけど、
俺も読んでて「うーん」となったw
515デフォルトの名無しさん:2008/06/26(木) 13:11:19
>>510
なるほど、Win32のリファレンスですね。調べて読んで見ます。
すいません、解ってたはずなのにアホな事してましたね。
とりあえずできる範囲でやってみます。



>>511
ファイルの構造は
中に色々な情報を持ったオブジェクトがツリー状につながって入っています。
画像データだけがオブジェクトの中にバイナリで入っています。
抜き出したい情報はオブジェクトの中に文字列で書かれていて、
欲しい情報に画像データは含まれないので無視したいんです。
なので、そのオブジェクトを入れるための構造体やクラス?
を作って、必要なオブジェクトを捕まえるのがいいのかなとか考えてました。

1つのオブジェクトの例はこんな感じで

オブジェクトの名前
[種類][このオブジェクトの種類]
[親][親オブジェクトの名前]
[子][子オブジェクトの名前、・・・、・・・]
[色][扱ってる色の種類]
[サイズ][画像のサイズの座標X、Y、X2、Y2]

全体の構成としてはこんな感じ

[文字列だけのオブジェクト]
[文字列とバイナリの入った箱のあるオブジェクト]
[文字列だけのオブジェクト]
[文字列とバイナリの入った箱のあるオブジェクト]
516デフォルトの名無しさん:2008/06/26(木) 13:14:19
>>513>>514
うーん、たぶんプログラマとしての資質の問題なんでしょうね。
もともとプログラムが好きで好きでやってる人と
仕事として選んだ結果"勉強"として調べようとしてる差が
行動力の差に出ているんですよねきっと。

すんません、ちょっと顔洗って出直してきます。
517デフォルトの名無しさん:2008/06/26(木) 13:31:00
選択肢の多さというか、広さに圧力的なものを感じたのでは。
それでトップダウンの方向で把握しようとしてるのだと思う。

トップダウンはトップダウンで必要だけど、
プログラマ的には、まずはボトムアップだね。
手探りでも、とりあえずやってみて具体的な知識を持つこと。
518デフォルトの名無しさん:2008/06/26(木) 13:35:33
>>517
まったく持ってその通りですね。
問題を先に見つけてしまうのも行動力が伴っての物で
壁を見つけたらまず壁まで行くべきだと学習しました。



レスポンス付けてくださった皆様

自分がここで質問するレベルじゃないって事がわかりました。
誰にも相談出来なくて一人で色々悩んでいるうちに悩みの迷路にはまってたみたいです。
ですが、皆様がご指摘してくれたおかげでやるべき事を明確にする事が出来ました。
誰にも聞けない事や、聞いてもあまり答えてもらえない事が多くて
全て自己解決しなきゃいけないと思って少し苦しくなってました。
でも勇気を出してここで質問したら、思いのほかちゃんと対応してくれる人がいて
問題にぶちあたっても手を貸してくれる人はいないわけじゃないんだと思い正直かなりほっとしました。
なのでとりあえず体面気にせずにがむしゃらにやってみようと思います。
今度来る時はちゃんと質問としてできるレベルにしてから質問しに着たいと思います。

どうもありがとうございました。
519497:2008/06/26(木) 13:37:59
たぶん1個解決しました!

解決したのは
> 2.入力時(チェックボックスをクリック or 日時指定コントロールの日時を変更)

日時指定コントロールの初期値を今日の00:00:00にしたら、「▼」で値を変えてもエラーにならなくなりました!

原因はたぶん明示的な初期化をしてなかったためと思われます。
そのせいで、「1970/01/01 00:00:00」として初期化され、
「▼」を押すことで扱える範囲外の時刻となり、エラーが吐き出されたっぽいです。
ずっと「9:00:00」って表示されてたので、
「0以下なわけでもないし…。」
と思ってたのですが、JSTになってたためにこの時間だっただけで、GMT的には00:00:00でした…(;´Д`)
520497:2008/06/26(木) 14:12:02
とりあえず起動直後にエラーになったらどこかでステップ実行してみたいと思います。
レスいただいた方、ありがとうございました。
お世話になりましたm(_)m
521デフォルトの名無しさん:2008/06/26(木) 14:58:05
なんか一生懸命さが伝わってきていいな
動かなかったものが動いたときの嬉しさというか
懐かしいような羨ましいような
522デフォルトの名無しさん:2008/06/26(木) 18:47:07
えーりんタイマー…
523デフォルトの名無しさん:2008/06/26(木) 20:20:43
>>522突っ込みおせぇw
524デフォルトの名無しさん:2008/06/26(木) 21:03:26
マビノギじゃねえの?
525デフォルトの名無しさん:2008/06/26(木) 22:03:40
可能なことかどうか知りませんが

ある大きな整数型配列,たとえばPH[100][100][100][100]みたいなのを
大量に作りたいとします。
要素数は大きくても、入れる値は高々0-1024までの値か入らないとします。
Int変数のマックスじゃなくて最大値を1024にする代わりに
使用メモリ減らす、っていう操作は可能でしょうか?
また可能ならばどのようなコマンドでできますか?

よろしくお願いします・
526デフォルトの名無しさん:2008/06/26(木) 22:07:50
>>525
必要な機能は自分で作る。そのためのプログラミング言語だ。
527デフォルトの名無しさん:2008/06/26(木) 22:08:18
10Bit配列のクラスを作る
528デフォルトの名無しさん:2008/06/26(木) 22:16:21
>>527
10bitで1024表現できるの?
529デフォルトの名無しさん:2008/06/26(木) 22:28:35
1-1024ならできる。0-1024なら11びt必要
530デフォルトの名無しさん:2008/06/26(木) 23:15:47
>>525
詰まんない苦労したくないなら16bitで妥協して
[100][100][100][100]くらいなら200MB弱だから、
>大量に作りたいとします。
となると32bit環境では10個作るのも難しいね。

仮に1要素10bitできちきちに詰めたとしても120MBだから、
「大量」となると大差ない。やはり32bit環境では難しいよ。

結論:苦労しないで1要素16bitでやって、プラットフォームは
64bit環境にするのが正解。
531デフォルトの名無しさん:2008/06/26(木) 23:34:50
Effective C++って難しいですか?
532デフォルトの名無しさん:2008/06/26(木) 23:45:01
質問です
IHoge *p1 = new CHoge();
IHoge *p2;

CHogeはIHogeを継承したもので、メンバ変数が追加されています。
p1の「内容」をp2にコピーするにはどうしたらよいでしょうか?

p2 = p1; のように、ポインタをコピーするのではなく、独立したクローンを作りたいのです。

今のところvirtual IHoge *clone()=0; をIHogeに用意しておき、継承したクラスにオーバーライドを強要する。
くらいしか思いつかないのですが、なにぶん数が増えてきますと実装ミスがおきそうです。
(clone内でコピーすべきメンバ変数のコピーを書き忘れるとか)
533デフォルトの名無しさん:2008/06/26(木) 23:56:45
>>529
10進の0と1は1bitで表現するから結局11bit必要じゃね?
534デフォルトの名無しさん:2008/06/27(金) 00:02:57
>>531
難しくないです。当たり前の事だけど陥りやすい誤りが
明快に説明されています。それとスレ違いです。

こちらへ
推薦図書/必読書のためのスレッド 40
http://pc11.2ch.net/test/read.cgi/tech/1209441159/
535デフォルトの名無しさん:2008/06/27(金) 00:05:59
>>530
32bitとか関係なくてOSの制限じゃないかしら。
それも仮想メモリという魔法で一括でとろうとしない限りは大丈夫なんじゃないの?
アプリ単位のメモリ制限があるんだっけ?
536デフォルトの名無しさん:2008/06/27(金) 00:16:43
>>532
親クラスのoperator=を呼び出すのが常套手段。
後は差分の変数のみコピー。
537デフォルトの名無しさん:2008/06/27(金) 00:22:43
>>536
それは、cloneメソッドの実装を楽にする方法ということでしょうか?
確かに楽にはなるのですが、メンバ変数をコピーし忘れるのを確実に防ぐのは難しそうですね・・・
潜在的なバグになりそうな要素は導入したくないところなのですが・・・
538デフォルトの名無しさん:2008/06/27(金) 00:34:37
>>537
「デフォルト代入演算子」でぐぐれ
539デフォルトの名無しさん:2008/06/27(金) 00:35:44
そのために親クラスの領域のコピーは親に任せるってことじゃないのか>>536
540デフォルトの名無しさん:2008/06/27(金) 00:38:09
>>537
それからコピーコンストラクタの実装も忘れずに。
代入演算子関数とコピーコンストラクタは継承されない。
541デフォルトの名無しさん:2008/06/27(金) 00:38:52
>>534
ありがとう
542デフォルトの名無しさん:2008/06/27(金) 00:43:05
>>541
あと、C++ Coding Standardって本もあります。
http://www.amazon.co.jp/C-Coding-Standards%E2%80%95101%E3%81%AE%E3%83%AB%E3%83%BC%E3%83
%AB%E3%80%81%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%80%81%E3%83
%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-%E2%80%90depth/dp/4894716860

内容はEffective C++/More Effective C++と良く似ているので
どちらか一方だけ購入する手もあります。
543デフォルトの名無しさん:2008/06/27(金) 01:09:55
>>535
32bitアプリだとアドレス空間が32bitで表せる4GBしかない。
しかもシステムに1-2GB程予約されるので、アプリで使える空間は最大3GB程度。
仮想メモリがいくらあろうと、アドレス空間が空いてなきゃ割り当てられない。
544デフォルトの名無しさん:2008/06/27(金) 01:17:39
>>525
なんでそんなことしようとしてるのか知りたいわ
545デフォルトの名無しさん:2008/06/27(金) 02:29:13
>>543
IntelCPUってずいぶん前から36bitアドレス空間サポートしてない?
サーバOSとかあっさり64Gとかつめるじゃん。
546デフォルトの名無しさん:2008/06/27(金) 02:43:18
>>545
ホントにプログラマ?

そう思うならそのサーバOS積んだ環境で、[100][100][100][100]みたいな
手軽なやり方でぼこぼこ大量に確保してみりゃいいじゃん。
547デフォルトの名無しさん:2008/06/27(金) 02:45:16
物理アドレスは32本以上出てるから物理メモリは4G以上詰める。
いくつかのプロセスが合計で4G以上を使うのは可能。
プロセス単位のアドレス空間が4Gというのはフラットメモリモデルでの制限で、
セグメントモデルを採用すればもっといけるがそんなOSは見たことがない。
あとPSEという仕組みがあって、昔のEMSのような仕掛けで4Gのメモリ空間の中に
4Gを越えるメモリをマップできる。
548デフォルトの名無しさん:2008/06/27(金) 02:49:01
CPUから出てるアドレスバスは32本のままじゃない?8バイト単位でしか読み書きしないから。
549デフォルトの名無しさん:2008/06/27(金) 03:30:46
それなんて8088?
550デフォルトの名無しさん:2008/06/27(金) 03:41:52
難しい。32bitWindowsの場合は1プロセスあたり2Gまでしか使えないが
/3Gスイッチをつけると3Gまで可能なのかな。

この辺がシステムに1-2GB程予約されるという言い回しになってるのかなあ
551デフォルトの名無しさん:2008/06/27(金) 03:42:59
とりあえず足りなければ別スレッドにすればおk?
552デフォルトの名無しさん:2008/06/27(金) 03:48:53
スレッドの場合同じアドレス空間を共有するからダメ。
共有メモリを介して複数プロセスで仕事をやらせれば多少はいけるかな。
unix版のoracleはそういう構造になってる。
windows版のoracleはスレッド構造にしたせいで
同じ32ビットCPUならメモリ的な限界が早く来る。
553デフォルトの名無しさん:2008/06/27(金) 04:29:42
要するに64bitの時代がすぐそこまで来てるって事だな
16bitの時もEMSでひでえ苦労させられたしな・・・・
554デフォルトの名無しさん:2008/06/27(金) 05:31:28
しかし問題は64bit CPUがこれ以上高速化させられないという事だ
高速化で出来る事はほとんど32bit時代にやってしまってる
後は本当に個人でジョセフソン素子でも使うしかない
555デフォルトの名無しさん:2008/06/27(金) 08:29:25
95が出た頃は4GBのメモリ空間が無限大に感じたけど、今だと狭く感じるな。
556デフォルトの名無しさん:2008/06/27(金) 09:03:54
[100][100][100][100]こんなことしないおれにとっては今んところ
64bitいらね
557デフォルトの名無しさん:2008/06/27(金) 09:28:41
つーかそういう配列使うならCPUの速度もスーパーコンピュータ並みに
速くないと使い物にならないと思わないか?

メモリ領域だけ広くなってもなあ
558デフォルトの名無しさん:2008/06/27(金) 09:40:22
なんか知らんが、デカい配列の変わりに赤黒木をデータ構造に使ってしまえば良いという問題でもない?
559デフォルトの名無しさん:2008/06/27(金) 10:03:24
RAMを(4GB以上)積めば32bit環境でも大容量メモリを容易に
使えると思い込んでる書き込みが散見されるけど、C/C++使う
際にポインタのビット数って概念が無いんだろうかね?

ハードが36bitアドレス空間だろうがなんだろうが、ポインタが32bit
なんだから言わずもがなだと思うんだが。sizeof(ポインタ)をやった
ことがないのか?
560デフォルトの名無しさん:2008/06/27(金) 10:17:58
後から出てきてボケかますのってどうなの
561デフォルトの名無しさん:2008/06/27(金) 11:04:48
天然がタイミングをきちんと見計らってたら、それはもう天然じゃないからね。
ある意味、仕様だよ。
562デフォルトの名無しさん:2008/06/27(金) 11:37:27
初歩的な質問ですいませんが、
他のクラスからメンバにアクセスしたいときってどうすれば良いのですか?

例えばCmyDlg.cpp内でm_edit_myを宣言していて、
それをCmainDlg.cppからm_edit_myにアクセスしたいです。

例えばCmyDlg内ですとm_edit_my.GetWindowText(CString);なんかでアクセスできますよね。。。
同じことを他のクラスから知りたいです。

初心者ですいませんがよろしくお願いします。

環境はWindowsXP, VisualC++2005, MFCです。
563デフォルトの名無しさん:2008/06/27(金) 12:03:19
>>562
public:
564デフォルトの名無しさん:2008/06/27(金) 12:24:51
friend
565デフォルトの名無しさん:2008/06/27(金) 13:14:38
ともだちいない
566デフォルトの名無しさん:2008/06/27(金) 13:18:30
そこら辺を歩いている人に、friendと書いた紙を張れば友達にな・・・
567デフォルトの名無しさん:2008/06/27(金) 13:27:28
CmyDlg::getM_edit_my(); CmyDlg::setM_edit_my(); つくれ
568デフォルトの名無しさん:2008/06/27(金) 13:29:11
#define private public

困った時のよく効く呪文
569デフォルトの名無しさん:2008/06/27(金) 13:42:45
そもそもmainDlgがインスタンス持ってないというオチ
570デフォルトの名無しさん:2008/06/27(金) 13:51:46
「.cpp内でm_edit_myを宣言していて、」
571567:2008/06/27(金) 13:55:30
>>569
public: static CWnd m_edit_my;
572デフォルトの名無しさん:2008/06/27(金) 14:26:41
自分は562じゃないんだが、
オブジェクトHoge をprivateにしてGetHoge() , SetHoge()を作るのと
Hogeをpublicにするのとで何か違いあるの?
573デフォルトの名無しさん:2008/06/27(金) 14:42:54
HogeがprivateでGetHoge()を提供してSetHoge()を提供しなければ読み取り専用になる
574デフォルトの名無しさん:2008/06/27(金) 14:59:32
メンバ Hoge がなくなるような変更がクラスに加えられたときでも
メンバ関数経由にしておけば関数の実装次第で対応可能
575デフォルトの名無しさん:2008/06/27(金) 15:02:34
VisualC++ 2008 Express Editionについてですが、ビルドのメニューが見つかりません
どこら辺を触ればビルドのメニューが表示されますか?
576デフォルトの名無しさん:2008/06/27(金) 15:03:25
ツールバーにビルドって書いてない?
577デフォルトの名無しさん:2008/06/27(金) 15:09:13
それが見つからないんです
578デフォルトの名無しさん:2008/06/27(金) 15:24:25
ExpressEditionにはその機能ないよ。
579デフォルトの名無しさん:2008/06/27(金) 15:24:32
ビルドはプロジェクトを開いてないと出てこないだろ
580デフォルトの名無しさん:2008/06/27(金) 15:24:39
教えてください。C++にて
どのクラスでもよく使う関数群をまとめてクラス(hoge)を作成して使用しているんですが
各クラスから使用するときは
hoge->function();という感じで使うことになります。
これを標準で備わっている関数と同様に
hoge->なしの
function();という記述で呼ぶようにすることが出来るでしょうか。
もし可能ならその方法を教えてください。
581デフォルトの名無しさん:2008/06/27(金) 15:26:22
ただの関数ならnamespaceで閉じ込めて使えば幸せになれるよ。
582デフォルトの名無しさん:2008/06/27(金) 15:40:34
Cの非常に初歩的な疑問なんですが、

char *str = "hoge";

とするとポインタ str には文字列 "hoge" の初めの文字のアドレスが入るんですよね。
ということは、この初期化時にそのアドレスから文字列5バイト分確保されるんですか?


char *str = "hoge"
char str[] = "hoge"

これを比べた時に何が違うのかよく分からないのです
583デフォルトの名無しさん:2008/06/27(金) 15:43:10
>>582
char *str1 = "abcd";
char str2[] = "abcd";
printf("%d %d\n", sizeof(str1), sizeof(str2));

こうやれば分かってもらえるだろうか。
上はポインタ、下は配列。
584デフォルトの名無しさん:2008/06/27(金) 15:45:14
ポインタは文字列があるどこかを指すだけ。
配列は要素一つ一つが確保され、strに入る。
585デフォルトの名無しさん:2008/06/27(金) 15:46:49
プログラムのある領域に "hoge" が置かれて、そのアドレスが代入されるのが *str
コピーされる(strcpyと同じ)のが str[]
アドレス比較してみりゃ、全然違うとこになってるのがわかる。
586デフォルトの名無しさん:2008/06/27(金) 15:52:33
>583-585
ありがとうございます。
なんとなくイメージはつかめた気がします。
587デフォルトの名無しさん:2008/06/27(金) 15:57:44
>>581
namespaceというのは見たことはあるのですが、使ったことは無かったので
ぐぐってみたのですが、
namespaceで変数や関数を宣言すると
クラスとは違い、実態をnewせずに使用できるということなのでしょうか。
588デフォルトの名無しさん:2008/06/27(金) 15:59:47
>>587
namespaceの中は、外からその名前で区別されるだけで普通の空間と同じ。
589デフォルトの名無しさん:2008/06/27(金) 16:05:42
もしかしてクラスのメンバー以外で関数作ったこと無いのか?
590デフォルトの名無しさん:2008/06/27(金) 16:07:40
C#とかから入った人だとそんな感じになりそうだな
591デフォルトの名無しさん:2008/06/27(金) 16:08:49
static定義した関数なら、インスタンスを作る必要ない。
>>581 はファイルスコープのstaticに掛けたネタ?ワタシよく知らないけど。
592デフォルトの名無しさん:2008/06/27(金) 16:10:11
無名名前空間について言及してないと分かる程度の知識があるならネタでないとも分かるはずだが。
593デフォルトの名無しさん:2008/06/27(金) 16:10:51
メモリマップファイルでファイル操作をしています。
そしてファイルサイズの拡張はできるのですが、縮小ができません。
テキストファイル"abcdefg"(7byte) から "abc"(3byte)となるように、
ファイルのサイズを縮める方法を教えてください。
環境はVC++2008、Windowsです。
594デフォルトの名無しさん:2008/06/27(金) 16:21:08
>>579
有難う御座います!1
595デフォルトの名無しさん:2008/06/27(金) 16:32:50
>>593
SetEndOfFile
596587:2008/06/27(金) 16:34:21
なんとなくわかってきました。namespaceは、
ただ単に、名前の範囲を示しているキーワードだったんですね。
でもそうすると、
namespace abc
{
class hage{
function()
}
}
abc::hage* hoge=new abc::hage();
abc::hoge->function();
こんな感じになるんでしょうか。
using namespace abc とすると
hoge->function(); でしょうか。
hage->は無くなりそうにありません(涙
う・・・わからなぃ。
597デフォルトの名無しさん:2008/06/27(金) 16:35:21
とりあえず入門書でも買って読め
598デフォルトの名無しさん:2008/06/27(金) 16:35:26
namespace abc
{
function()
}
して
using namespace abc してみ。
599587:2008/06/27(金) 16:42:03
>>598
あ、なるほど。
クラスにしてはダメなんですね。
静的に記述してしまうと。
だいたいわかりました。
とりあえずやってみます。
教えて頂いた皆様、ありがとうございます。
600デフォルトの名無しさん:2008/06/27(金) 16:49:08
>>598
namespaceで囲むメリットってなんなの?
グローバルに放り出したくないってこと?
601デフォルトの名無しさん:2008/06/27(金) 16:51:57
いや、なるべく元の書き込みにあわせただけ。
602591:2008/06/27(金) 16:52:15
こうするとOOPで幸せになるんだがなあ。
namespace abc
{
class hage{
public: static function();
}
}
abc::hage::function();
603デフォルトの名無しさん:2008/06/27(金) 16:55:48
>>601
なるほどです。

>>602
using namespace abc;
hage::function();
こうはできるが、
using namespace abc::hage;
function();
こうはできないんですよね?
604デフォルトの名無しさん:2008/06/27(金) 17:53:29
std::vector<double> vec(10)
というのがあるとします。

既に存在するCの関数、例えば
double sum(int size, double* array)
{
 double total = 0;
 for(int i=0; i<size; i++){
  total += array[i];
 }
}
の第二引数にこのvecを渡したいのですが、
単なる配列のようにvectorを扱うことはできるのでしょうか。
605デフォルトの名無しさん:2008/06/27(金) 17:57:59
>>604
sum(vec.size(), &vec[0]);
606デフォルトの名無しさん:2008/06/27(金) 17:59:08
できる
607604:2008/06/27(金) 18:03:50
>>605-606
ああ、そんな簡単なことでいいのか。
ありがとうございます。
608591:2008/06/27(金) 18:04:40
using abc::global_func;
で、確認しました。 >>603
609604:2008/06/27(金) 18:05:19
vectorの内部の実装で、
データが連続したアドレスの配列上にあるというのは、
仕様で保証されているんですか?
610デフォルトの名無しさん:2008/06/27(金) 18:10:37
vectorやstringはされてる
sum(v.size(), &v.front())
611604:2008/06/27(金) 18:34:43
>>610
ありがとうございます。
612593:2008/06/27(金) 18:44:25
>>595
サンクス。
でも引数にどうわたせばいいのかわからないや。
MapViewOfFileで取得したポインタを渡せばいいのかな?

HANDLE hFile;
HANDLE hMap;
hFile = CreateFile(...);
hMap = CreateFileMapping(hFile,...);
void* p = (void*)MapViewOfFile(...);

int fileendpoint = ...;
p += endpoint;

UnmapViewOfFile( p );
CloseHandle( m_hMap );
SetEndOfFile((HANDLE)p);
613デフォルトの名無しさん:2008/06/27(金) 18:49:37
SetEndOfFileに渡すのはhFileだろ。
SetFilePointerで移動して呼んでみては。
614デフォルトの名無しさん:2008/06/27(金) 18:57:47
>>608
たびたびすみません。

#include <stdio.h>

namespace abc
{
class Hoge
{
public:
static void global_func()
{
printf("func\n");
}
};
};

int main()
{
using abc::Hoge::global_func;
global_func();

return 0;
}

こうやってみたんですが、以下のエラーがでます。
error C2873: 'abc::Hoge::global_func' : シンボルを using 宣言の中で使用することはできません。
615デフォルトの名無しさん:2008/06/27(金) 19:02:23
Hoge は namespace じゃないから
616デフォルトの名無しさん:2008/06/27(金) 19:03:25
Hogeが名前空間じゃないから?
617デフォルトの名無しさん:2008/06/27(金) 19:08:39
つまり、あるクラスのメンバ関数を何の修飾もせずにクラス外から呼び出すことはできないということですか?
618デフォルトの名無しさん:2008/06/27(金) 19:13:16
クラス外からメンバを呼び出したい場合は必ず呼び出しもとのインスタンスが必要になる。
例外はstaticメンバ関数だけじゃなかったか?
619デフォルトの名無しさん:2008/06/27(金) 19:14:12
>>618
なのでstaticつけてます。
620デフォルトの名無しさん:2008/06/27(金) 19:21:04
>>617
無理ですね
別名をつければいけますがw
C++で関数のエイリアスを作る方法は知りませんのでCの作法で書くと次のとおり
#include<iostream>

namespace abc{
class Hoge{
public:
static void global_func(){std::cout << "global_func()" << std::endl;}
};
void (*hoge_func)()=Hoge::global_func; // 別名
};

int main(){
void (*func)()=abc::Hoge::global_func; // 別名
func();
using namespace abc;
hoge_func();

return 0;
}
621デフォルトの名無しさん:2008/06/27(金) 19:30:30
>>620
なるほど。ありがとうございます。
>>580さんが望んでたものに一番近そうなのが、同じnamespace内で
別名をつける方法っぽいですね。
622620:2008/06/27(金) 19:32:43
>>621
多分C++での作法があると思います
調べてください
623621:2008/06/27(金) 19:36:40
>>622
以下のように記述することで関数名も同じまま呼び出すことができました。

#include <stdio.h>

namespace abc
{
class Hoge
{
public:
static void global_func() { printf("func\n"); }
};
static void global_func() { Hoge::global_func(); }
};

int main()
{
using namespace abc;
global_func();

return 0;
}
624608:2008/06/27(金) 20:26:33
>>622 (>>623 ごめん、直します。)
void (*global_func)() = Hoge::global_func;
// void global_func(){ Hoge::global_func(); };
625デフォルトの名無しさん:2008/06/27(金) 20:29:19
std::vector<double[2]> v;
って出来ないんですか?
626デフォルトの名無しさん:2008/06/27(金) 20:36:28
オセロのプログラムを書こうと思ったら、オセロって存外複雑だな・・・。
627デフォルトの名無しさん:2008/06/27(金) 20:46:15
コンピュータの思考ルーチンを組むんでなければ、そんなに難しくはないと思うけど・・・
打てる場所がないときはパスとか、細かいところは面倒いかも
628デフォルトの名無しさん:2008/06/27(金) 20:47:58
オセロのプログラムを3日で作らせるのが、うちの新人研修なんだが
629デフォルトの名無しさん:2008/06/27(金) 20:48:43
>>625
double[2]を構造体で包めばできる
630デフォルトの名無しさん:2008/06/27(金) 20:52:16
VC2003、C++のmanagedでプログラムを組んでいます。
何もない状態からビットマップ画像を作成し、画素値を自分で設定して
pictureboxか何かに描画しようとしているのですが、うまくいきません。
現在はフォームクラス内にメンバ「Bitmap* bm」を置き、フォームのコンストラクタで

this->bm = new Bitmap(512,512);

実際にボタンが押された時に

System::Drawing::Color color;
color.FromArgb(255,255,255);
for(int i=0;i<512;i++)
 for(int j=0;j<512;j++)
  bm->SetPixel(i,j,color);
pictureBox->Image=bm;

と記述して表示しようとしているのですがうまくいきません。
どこか根本的に間違っているのでしょうか。よろしくお願いします。
631575:2008/06/27(金) 20:57:55
VisualC++ 2008 Express Editionってコンパイルと実行ってどうやるんですか?
632デフォルトの名無しさん:2008/06/27(金) 20:58:46
>>630
どこが間違ってるって、スレが違う。C++/CLIスレへどーぞ
633デフォルトの名無しさん:2008/06/27(金) 20:59:38
>>631
ALT+PB
634デフォルトの名無しさん:2008/06/27(金) 21:01:04
>>631
F5
635デフォルトの名無しさん:2008/06/27(金) 21:02:45
>>632
すみません、C++/CLIのくだすれが落ちてるのでここぐらいしか聞くとこがなくて・・・。
636575:2008/06/27(金) 21:04:09
>>633
出来ませんでした。

>>634
hellを表示するように作ったのですが前に作ったhello worldが表示されてしまいます。
637デフォルトの名無しさん:2008/06/27(金) 21:13:08
>>627
単純に表示、入力、ひっくり返すまでは直ぐできるけど
置けるか置けないかとか実装していくとすげー疲れる
638デフォルトの名無しさん:2008/06/27(金) 21:14:11
639575:2008/06/27(金) 21:15:26
>>638
有難う御座います
640608==638:2008/06/27(金) 21:34:10
>>622 (>>623 ごめん、直します。)
void (*const global_func)() = Hoge::global_func;
// void global_func(){ Hoge::global_func(); };
641デフォルトの名無しさん:2008/06/27(金) 23:43:49
int (*pointer)(int, int) = NULL;
をtypedefを使って書くにはどう書けばいいのでしょうか。
642デフォルトの名無しさん:2008/06/27(金) 23:47:58
>>641
typedef int (*pointer_t)(int, int);
pointer_t pointer;
643デフォルトの名無しさん:2008/06/28(土) 00:32:49
見た目はこっちのがわかりやすいから、俺はこれが好き。
typedef int pointer_t(int, int);
pointer_t *pointer;

メンバ関数に使えないのが欠点だけど。
644デフォルトの名無しさん:2008/06/28(土) 00:47:22
>>642>>643
ありがとうございます。
記述が分かりづらくてよく分からなくなるんですけど、
後者の方は、本当に関数のポインタという感じで分かりやすいです。
645超初心者:2008/06/28(土) 03:51:19
言語はc++です
エディットボックスによって入力されてくる10個のint xを左から小さい順
にソートするプログラムを教えてください。
エディットボックスによるint xの入力と処理後の数列を表示する文章は出来ています
xを小さい順に選択して並べていく文章が検索したのですがイマイチわかりませんでした
646デフォルトの名無しさん:2008/06/28(土) 03:59:17
バブルソートすればいいんじゃないか
647デフォルトの名無しさん:2008/06/28(土) 03:59:51
>>645
std::sort
648超初心者:2008/06/28(土) 04:27:28

自力で解決しました
といっても誰もレスしない時間帯でしたね^^;
2レス潰して失礼
649デフォルトの名無しさん:2008/06/28(土) 10:52:18
#include <iostream.h>
void main(){cout << "ああ、" << 20 << "歳になると年金を・・・。" << endl;}
をコンパイルしようとすると
warosu.cpp(1) : fatal error C1083: include ファイルを開けません。'iostream.h': No such file or directory
って出ちゃうんですが何をどうすれば良いかさっぱりです。
650デフォルトの名無しさん:2008/06/28(土) 11:01:57
#include <iostream>
using namespace std;
int main(){...}
651デフォルトの名無しさん:2008/06/28(土) 11:02:21
#include <iostream>
void main(){
   using namespace std;
   cout << "ああ、" << 20 << "歳になると年金を・・・。" << endl;
}
652デフォルトの名無しさん:2008/06/28(土) 11:32:48
有難う御座います。
653デフォルトの名無しさん:2008/06/28(土) 12:00:30
iostreamはヘッダーじゃなくって、オブジェクトっていうかライブラリーだから.hいらねっす
654デフォルトの名無しさん:2008/06/28(土) 12:02:04
もう夏休み?
655デフォルトの名無しさん:2008/06/28(土) 12:05:26
656デフォルトの名無しさん:2008/06/28(土) 12:11:48
ってかココは、初心者歓迎スレ
657デフォルトの名無しさん:2008/06/28(土) 12:48:30
658デフォルトの名無しさん:2008/06/28(土) 13:12:06
iostream.hだったのはもう十何年も前のこと。
659デフォルトの名無しさん:2008/06/28(土) 13:13:05
>>653
ヘッダーです
660デフォルトの名無しさん:2008/06/28(土) 13:13:53
>>659
標準ライブラリーです
661デフォルトの名無しさん:2008/06/28(土) 13:21:54
おまえは何を言っているんだ(画像ry
662デフォルトの名無しさん:2008/06/28(土) 13:33:35
stream.h時代のストラウストラップ本を愛読してます(><)
663デフォルトの名無しさん:2008/06/28(土) 13:36:07
>>660
標準ライブラリのヘッダだろ。
<iostream>とかの中身知ってて言ってるのか?

http://en.wikipedia.org/wiki/C%2B%2B_standard_library
664デフォルトの名無しさん:2008/06/28(土) 13:54:25
中身はなんでもいい。
665デフォルトの名無しさん:2008/06/28(土) 15:36:52
ライブラリに音引きがつくと、見慣れないせいか
なんか違う単語みたいに見えるな。
666デフォルトの名無しさん:2008/06/28(土) 17:32:09
ライブラリーだと図書館とかそっちを思い浮かべるな
667デフォルトの名無しさん:2008/06/28(土) 18:20:58
何故PC関連は伸ばさないのか、昔は違和感いっぱいだったな
memory メモリ
menber メンバ

もう麻痺したけど
668デフォルトの名無しさん:2008/06/28(土) 18:23:58
menberはすごい違和感を感じるな
669デフォルトの名無しさん:2008/06/28(土) 18:25:36
伸ばすと語尾が濁ったりして間違われるから。
Oの上に線とか0には斜線とかと同じノリ
670デフォルトの名無しさん:2008/06/28(土) 18:26:29
た、タイプミスなんだからねっ!
671デフォルトの名無しさん:2008/06/28(土) 18:36:43
MとN間違えるとか・・・Dvorak配列のキーボード使えよ。
QWERT配列より使いやすいぞ。


672デフォルトの名無しさん:2008/06/28(土) 18:42:00
へー
673デフォルトの名無しさん:2008/06/28(土) 19:07:24
だんこん(なぜか変換しない)の世代はダメだな。
674デフォルトの名無しさん:2008/06/28(土) 19:11:48
QWERTY配列じゃね?
675デフォルトの名無しさん:2008/06/28(土) 20:12:54
「違和感を感じる」は凄い違和感を覚えるな。
676デフォルトの名無しさん:2008/06/28(土) 20:30:25
日本語や英語の初心者も歓迎なスレってことでひとつ。
677デフォルトの名無しさん:2008/06/28(土) 20:44:49
ニホンゴ・・・ニポン人とはじめてのCですね、わっかります。
678デフォルトの名無しさん:2008/06/28(土) 21:27:50
vectorのソースって読みづらいね。
679デフォルトの名無しさん:2008/06/28(土) 22:22:19
違和感を感じるは一回調べたことあるが誤用ではなかった筈
680デフォルトの名無しさん:2008/06/28(土) 22:55:47
>>679
ソース
681デフォルトの名無しさん:2008/06/28(土) 23:00:29
一応国語辞典の例文にも載ってるってのはソースにならないかな?
ttp://dictionary.goo.ne.jp/search.php?MT=%B0%E3%CF%C2%B4%B6&kind=jn&mode=0&base=1&row=0
682デフォルトの名無しさん:2008/06/28(土) 23:03:31
ソースとか自分で調べればいいのでは?
”ぐぐれ”
683デフォルトの名無しさん:2008/06/28(土) 23:03:44
>>680
679じゃないけど、疑問に思ったらとりあえずググれ。
正確には違和感を覚えるだが、違和感を感じるでもそれほど間違いでもない、
ということらしい。
684デフォルトの名無しさん:2008/06/28(土) 23:36:58
配列を作ると、それに当てられるメモリ領域が連続して取られるとのことですが、
たとえば a[100] とか作ったときに、メモリ上に100個の連続した空き領域が一つもなかったらどうなるんですか?
685デフォルトの名無しさん:2008/06/28(土) 23:37:38
スタックエラーになる
686デフォルトの名無しさん:2008/06/28(土) 23:46:06
>>684
自動変数として確保したならスタックオーバーフローで、普通は死ぬ。
ヒープならmallocはNULLを返し、newならstd::bad_alloc例外がスローされる。
687デフォルトの名無しさん:2008/06/28(土) 23:49:18
二次元配列で[100][100]とかやると適当に[0][200]とか入れると(ry
688デフォルトの名無しさん:2008/06/29(日) 00:28:23
>>685
>>686
サンクス
よくわからんけどとにかくエラーなんですね
689デフォルトの名無しさん:2008/06/29(日) 00:44:15
よく分からない単語は暇なときググっとけ。
690デフォルトの名無しさん:2008/06/29(日) 05:20:57
あるクラスで
static const int hoge
の値でメンバ変数の配列のサイズを宣言したいのですが
定数式が必要と怒られるのでダメなのでしょうか?
691デフォルトの名無しさん:2008/06/29(日) 05:41:35
static const intでも大丈夫なはずだけど、古いコンパイラだと対応してないのか
とりあえずenum{hoge=100,};あたりでごまかしたら?
692デフォルトの名無しさん:2008/06/29(日) 08:16:57
Visual C++ 2008 で常に警告レベルは最大で開発を行っています。

構造体のデータを VOID * にコピーする際に memcpy を使用しているのですが
VOID * の変数に対して、
初期化されていないローカル変数 'hogehoge' が使用されます
という警告が出てきます。
このときの VOID * の変数の初期化に困っています。
当然ながら NULL を代入するわけにもいかないですし・・・
警告レベルを下げずに綺麗な対処法はありますでしょうか、
よろしくお願い致します。
693デフォルトの名無しさん:2008/06/29(日) 08:33:40
うそーん
memcpyに渡すときに&でアドレスを取るのだから
初期化や代入してなくても、警告を出すコンパイラなんてないと思うんだけどな。
初期化されてないまま関数に渡すと言う意味で警告が出るようなら
char buf[100];
sprintf(buf, "%d", 10);
でも警告が出るはずだし。

ていうか、memcpy関係なくて、本当に初期化してないだけな気配をすごく感じるんですけど。
とにかくその部分のコードを張って欲しいね。
694デフォルトの名無しさん:2008/06/29(日) 08:35:04
まさか、
struct hoge h = {...};
void *m;
memcpy( m, &h, sizeof(h) );
みたいなコードなのか?

m = malloc( sizeof(h) );
とか
m= &hogememory;
とか居るだろうに。
695デフォルトの名無しさん:2008/06/29(日) 08:39:48
>>694
レスありがとうございます。
コード眺めてたら、分岐上で malloc してる箇所を通らないケースがありました。
非常に情けない・・・
わざわざすみませんでした。
696デフォルトの名無しさん:2008/06/29(日) 18:40:09
printfの書式の質問なんですが、
double型を出力する際に%.0fで指定すると少数第1位が四捨五入されるのでしょうか?
697デフォルトの名無しさん:2008/06/29(日) 18:48:34
>>690
宣言に初期化子も含んでないと定数式として使えないよ。
698デフォルトの名無しさん:2008/06/29(日) 18:51:26
四捨五入ではなくて単に小数点以下が表示されなくなるだけ。
699デフォルトの名無しさん:2008/06/29(日) 18:56:46
>>698
しかし
double a=0.8;
printf("a=%.0f",a);

出力
1

となるんですが・・・
700デフォルトの名無しさん:2008/06/29(日) 19:00:12
>>699
%fのデフォルトは小数点以下6桁までなのでその精度に
変換される
要するに四捨五入される
701デフォルトの名無しさん:2008/06/29(日) 19:07:50
>>700
ありがとうございます
702デフォルトの名無しさん:2008/06/29(日) 19:10:01
%.0fならint型の変数にdoubleを代入したのと
同じような結果になるはずだが
703デフォルトの名無しさん:2008/06/29(日) 19:35:20
>>700
嘘つくなよ
704デフォルトの名無しさん:2008/06/29(日) 19:36:06
>>699
必ずしも処理系が標準に準拠しているとは限らない
705690:2008/06/29(日) 19:40:06
>>691
.hファイルで
static const int hoge;
を宣言して、.cppファイルでその値を
const int 適当なクラス名::hoge =512
と512で初期化して

.hファイルないで
char msg[hoge];
はダメみたいですが

.hファイル内でhogeを初期化したり
.cppファイル内でhogeを配列数に私用することは出来るようです

なにか使い方が間違ってるのかな・・・?
706デフォルトの名無しさん:2008/06/29(日) 19:44:08
つー事は最後の桁は四捨五入ではなくて誤差が含まれているから
承知しとけって事か
707デフォルトの名無しさん:2008/06/29(日) 19:45:53
>>705 >697
708デフォルトの名無しさん:2008/06/29(日) 19:54:16
>>707
見落としてました

.hファイルで
static const int hoge =512;

とすることで無事に動くようになりました
ありがとうございました
709デフォルトの名無しさん:2008/06/29(日) 20:35:48
>>708
そうするとそのヘッダを他のファイルから読み込めなくなると思うが、
それでもOKなのかな?
710デフォルトの名無しさん:2008/06/29(日) 20:41:06
>>709
整数型のstaticでconstなメンバは、宣言時に初期化できることは規格にあるけど。
711デフォルトの名無しさん:2008/06/29(日) 20:46:22
シンボルが多重定義になるってことじゃないか?
712デフォルトの名無しさん:2008/06/29(日) 20:52:25
>>709
たぶんクラスメンバの話。
そうでなくても static にしてあるんで問題ない。
713デフォルトの名無しさん:2008/06/29(日) 20:53:14
なるほど。static 付いてると大丈夫なのね。
714デフォルトの名無しさん:2008/06/29(日) 20:56:43
>>705
規格は知らないから確実じゃないけど、
cppファイルで初期化する場合、
ヘッダでは値が分からないから
使えないんじゃないかな。
715デフォルトの名無しさん:2008/06/29(日) 21:00:27
>>714
所詮は変数なので使える。
他ファイルからは値側からなので最適化はできないだろうけど
716714:2008/06/29(日) 22:18:11
>>715
ではなぜ?

理由は691の「古いコンパイラだと対応してないのか」しか出てない。

ちなみにVS2008EEだと以下の内容が出力された。

error C2057: 定数式が必要です。
warning C4200: 非標準の拡張機能が使用されています : 構造体または共用体中にサイズが 0 の配列があります。
UDT にサイズが 0 の配列が含まれているときに、copy-ctor または copy-assignment オペレータを生成することはできません。
error C2720: 'Test::hoge' : 'static ' ストレージ クラスの指定子が識別子に対して誤って指定されています。
717デフォルトの名無しさん:2008/06/29(日) 22:25:18
>>716 >697
718714:2008/06/29(日) 22:28:56
>>717
ありがとう。見逃してた。715は間違いということでよい?それとも違う話?
719714:2008/06/29(日) 22:35:14
691のようにcppファイルで初期化した場合、
cppファイルでは配列数として使えるから、
697の説明も正確じゃない気もするけどなあ。
720デフォルトの名無しさん:2008/06/29(日) 22:45:52
C++の知識を万遍無く使わないと解けないような宿題をください。あまりにも難しいのはナシの方向で・・・
(ようするにその問題解くと一通り機能を習得(長期記憶)できるような問題)
一通り勉強したんですが、どうにも忘れっぽくて。
721デフォルトの名無しさん:2008/06/29(日) 22:48:28
>万遍無く
卒倒するレベルの宿題に・・・。
まぁ言いたいことは分かるけどw
722デフォルトの名無しさん:2008/06/29(日) 22:53:34
問. C++の機能を満遍なく使ってプログラムを書け。
723デフォルトの名無しさん:2008/06/29(日) 22:58:47
クラス、継承、仮想関数、例外処理、STL、あと何だろう
724デフォルトの名無しさん:2008/06/29(日) 23:00:21
>>720
C++はリファレンス見ながら使って覚えるものだ。毎日たくさんコード書くしかない。
725デフォルトの名無しさん:2008/06/29(日) 23:01:45
>>721724
そうか・・・
わかったサンクス俺がんばるよ
726デフォルトの名無しさん:2008/06/29(日) 23:03:15
・非const参照の引数に一時オブジェクト
・const参照に一時オブジェクト
・typenameキーワードが必要になる状況
・vptr初期化タイミング
・char配列の領域に任意のクラスを配置new出来るかどうか

さて・・・
727デフォルトの名無しさん:2008/06/29(日) 23:05:20
>>720
テンプレートは、一応後の方にした方がいいと思うよ。
728デフォルトの名無しさん:2008/06/29(日) 23:14:46
>>727
だね。多重継承とテンプレートは誤用しやすいから慣れてから使ったほうがいいかもね。

729デフォルトの名無しさん:2008/06/30(月) 00:05:16
テンプレートのみで静的な正規表現処理を書けるようになったら一人前
730デフォルトの名無しさん:2008/06/30(月) 00:10:54
一人前じゃねーよ
そういうのはキ○ガイ
731デフォルトの名無しさん:2008/06/30(月) 00:15:43
書ける・書けない、の話をしてるんだから、一人前で正しい。
書けない奴が、この話を「書く・書かない」の話にすり替えて、
「俺は書けないんじゃない、書かないんだ! だって俺はマトモだから!」
とか吠えるのは逃げ口上。
732デフォルトの名無しさん:2008/06/30(月) 00:17:00
話をすり替えてない。
普通の人は書けない。書けるのはキ○ガイじみている。
733デフォルトの名無しさん:2008/06/30(月) 00:25:35
おまえら軽いジョークにそこまで絡みますか
734デフォルトの名無しさん:2008/06/30(月) 00:33:08
templateに何かコンプレックスでもあるのかw
735デフォルトの名無しさん:2008/06/30(月) 01:03:48
テンプレートはSTLとかみてると便利そうなのは解かるが
自分でどう使っていいのか皆目見当がつかないなぁ
736デフォルトの名無しさん:2008/06/30(月) 01:33:53
理解すれば当然のように使うようになるよ
737デフォルトの名無しさん:2008/06/30(月) 02:06:45
既存のテンプレートライブラリを継承して
独自の派生テンプレートクラスのようなものを作っては失敗すると理解が深まるかもしれん。
738デフォルトの名無しさん:2008/06/30(月) 02:29:29
インスタンスfooのint* hogeを操作したいときはどう記述するのでしたっけ?
*(foo.hoge) = 1;
でよかったっけ・・・?度忘れしてしまいました
739デフォルトの名無しさん:2008/06/30(月) 02:44:12
>>738
カッコ不要
740デフォルトの名無しさん:2008/06/30(月) 02:45:34
かっこつけた方が好きだ
741デフォルトの名無しさん:2008/06/30(月) 02:51:55
お好きなように
742デフォルトの名無しさん:2008/06/30(月) 02:59:08
fooがポインタの場合は(*foo).hogeの方が正しのか。普通は -> 使うだろうけど。
743デフォルトの名無しさん:2008/06/30(月) 04:55:08
foo->*hoge とか foo.*hoge は意味違うしなあ
744デフォルトの名無しさん:2008/06/30(月) 05:37:32
ドット演算子とアロー演算子は、優先順位が最高度だからね。
結合の件で迷ったら、とりあえずfooとhogeを合わせて1つの変数名くらいに考えていい。
745デフォルトの名無しさん:2008/06/30(月) 08:56:29
>>743のばあいどうなるんだっけ?・・・
746デフォルトの名無しさん:2008/06/30(月) 09:16:33
.* がオブジェクトからメンバを参照する
->* がオブジェクトへのポインタからメンバを参照する
747デフォルトの名無しさん:2008/06/30(月) 14:53:59
コピーコンストラクタなんだけど

CSample(const CSample& obj)
とあるとき

objはコピー元、コピー先どっちだっけ?
748デフォルトの名無しさん:2008/06/30(月) 14:59:57
コピー元
749デフォルトの名無しさん:2008/06/30(月) 15:49:08
忘れたなら調べてほしい。知らないことならまるで忘れたかのような口調はやめてくれ><
それともどこかの方言なの?>だっけ
750デフォルトの名無しさん:2008/06/30(月) 17:07:27
コンストラクタなんだからコピー先はthisに決ま
751デフォルトの名無しさん:2008/06/30(月) 17:23:33
○[Programming][C++ Tips] メンバ変数へのポインタ
http://www.issei.org/diary/_20030224/d200301c.html
752デフォルトの名無しさん:2008/06/30(月) 17:43:20
リストコンテナ使うとシャッフル機能があるぜ
753デフォルトの名無しさん:2008/06/30(月) 18:46:43
皆さんはキーボードの配列はQWERTY配列なんですか?
754デフォルトの名無しさん:2008/06/30(月) 19:20:39
ふじこlp 配列です。
755デフォルトの名無しさん:2008/06/30(月) 19:56:47
あざっす
756デフォルトの名無しさん:2008/06/30(月) 20:00:01
俺は、Dvorak配列だよー。
757デフォルトの名無しさん:2008/06/30(月) 21:04:18
oeaいませんか
758デフォルトの名無しさん:2008/06/30(月) 21:16:04
動的にクラスの配列を作成し、クラス配列のポインタを返却するメソッドにて、
動的に確保したクラスの配列を delete で解放したいのですが、
そのメソッドの呼び出し側 (配列のポインタを受け取った側) で delete すれば、
正常に解放されるのでしょうか?
メソッド内で確保したデータが解放されてるか不安になってしまいました。。。
よろしくお願い致します。
759デフォルトの名無しさん:2008/06/30(月) 21:32:03
>>758
デストラクタにprintfとか入れて試してみたら?
配列のはdelete [] だけどね。
760デフォルトの名無しさん:2008/06/30(月) 21:32:32
>>758
開放されるが、あまりかっこよいとはいえない。
761デフォルトの名無しさん:2008/06/30(月) 21:33:46
>>756-757
そういうタイプのキーボードってどこで売ってるんですか?
762デフォルトの名無しさん:2008/06/30(月) 21:41:18
share_arrayの出番だけどboostになってしまうか
763デフォルトの名無しさん:2008/06/30(月) 21:44:13
配列の計算の値が〜+e〜となります
正確な値にするためにはどうすればよいでしょうか?
一応問題の箇所は

double a[i][j]
int i,j;
for(i=0;i<52;i++)
{
   for(j=0;j<102;j++)
    {
       if(j==0 && i==0)
       {
           e[i][j] = ( e[i][j] + e[i][j] ) / 2;   ←の部分だと思ってます
           cout << " " << e[i][j];           ()の中を2すると値は1とちゃんとでました
       }

    }
    cout << "改行" << '\n';
 }
764デフォルトの名無しさん:2008/06/30(月) 21:51:56
>>759
>>760
>>762
レスありがとうございます
確かに、呼び出し側に解放させるのはカッコよくないですね
構造を見直したほうがいいかも、ですね
765デフォルトの名無しさん:2008/06/30(月) 21:56:28
>>763
ゴミが残ってるからじゃないの?
0とかで初期化すればどうかな?
766デフォルトの名無しさん:2008/06/30(月) 22:31:38
がんばって全角スペースいれたかw
767デフォルトの名無しさん:2008/06/30(月) 22:36:43
配列の初期化ってこんな感じでしょうか?
初歩的な質問で恐縮です

for(i=0;i<101;i++)
{
   for(j=0;j<201;j++)
     {
       if(i==25)
       {
         if(50<=j && j<=100)
         {
           e[i][j]=100;
         }
         else
         {
           e[i][j]=0;
        }
         cout << " "<< e[i][j];

       }
       else
       {
         e[i][j]=0;
         cout << " " << e[i][j];
       }
     }
}
768デフォルトの名無しさん:2008/06/30(月) 22:42:10
>>763
その引用部分より前に問題があるんじゃないか?略さずに貼るべし
769デフォルトの名無しさん:2008/06/30(月) 23:21:44
getcで読み込んだ文字を文字列に代入するのはどうやったらいいですか?
770デフォルトの名無しさん:2008/07/01(火) 00:11:23
どうしても初期化で100とか入れなきゃダメなのか?
ゴミデータが嫌なだけならmemsetで0で埋めるだけでも・・・
771デフォルトの名無しさん:2008/07/01(火) 00:29:18
>>767
int c[101][201];
みたいな配列なの? 半端だな……
そうだと仮定すると、↓みたいな感じでいいんでないの。

    std::fill(&c[0][0], &c[100][201], 0);
    std::fill(&c[25][50], &c[25][101], 100);
    std::copy(
            &c[0][0], &c[100][201],
            std::ostream_iterator<int>(std::cout, " "));
772767:2008/07/01(火) 01:34:29
>>1のURLにソースうpさせてもらいました
ファイル名は7119.txt です
汚いソースですがよろしくおねがいします
773デフォルトの名無しさん:2008/07/01(火) 06:52:37
VisualC++でboost::uBLASが動かないんですけど何か対策はありますk?
774デフォルトの名無しさん:2008/07/01(火) 06:58:31
Boost総合スレに投稿するつもりが間違えました。
775767:2008/07/01(火) 08:26:11
ファイル名間違えてました・・・すいませんでした
再びよろしくお願いします・・・
7154.txt
776デフォルトの名無しさん:2008/07/01(火) 09:45:55
+e で表示されるのがいやなら、書式指定しなさいよ。
777デフォルトの名無しさん:2008/07/01(火) 10:01:15
vector<double> vec(10);
みたいなのがあって、適当な実数が格納されているとします。その時、
vec[0]+vec[1]+...+vec[9]=accumulate(&vec[0], &vec[10], 0);
というのは分かるのですが、
vec[0]^2+vec[1]^2+...+vec[9]^2
を求めたいときはどうすればよいですか?
778デフォルトの名無しさん:2008/07/01(火) 10:06:27
inner_product?
779デフォルトの名無しさん:2008/07/01(火) 10:15:42
>>777
for(int i=0;i<vec.size();i++) sum+=vec[i];
780デフォルトの名無しさん:2008/07/01(火) 10:16:11
>>779 まちがえた
sum+=vec[i]*vec[i];
781デフォルトの名無しさん:2008/07/01(火) 10:36:28
inner_product(vec.begin(), vec.end(), vec.begin(), 0.0)
782デフォルトの名無しさん:2008/07/01(火) 10:49:19
printf("%s", 0);

(null)
と表示されるのはANSI等の仕様でしょうか?
それとも非標準な親切設計なのでしょうか?
783デフォルトの名無しさん:2008/07/01(火) 11:20:24
実は「%s」自体が標準には無い拡張だったりします。
784デフォルトの名無しさん:2008/07/01(火) 11:22:11
785デフォルトの名無しさん:2008/07/01(火) 11:42:40
forkについて

1プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく

そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?
786デフォルトの名無しさん:2008/07/01(火) 11:43:07
ごめん嘘ついた。
787デフォルトの名無しさん:2008/07/01(火) 11:47:03
>>785
forkは分身を作る。
戻り値が0なら分身。
788デフォルトの名無しさん:2008/07/01(火) 12:01:25
必要な関数や型名、そしてその使い方などは、皆さんどうやって調べているのでしょう?
例えば
・メッセージボックスにはMessageBox::Showを使う
・プログラムの終了にはCloseを使う
・描画をするにはGraphics型を使う
などは、サンプルプログラムを見ればわかるのですが、自分で一から考え出せるとは思えません。
そもそもその関数や型の存在を知らなければ歯が立たないと思うのです。
自分がやりたいことに対する関数や型の見つけ方を教えてほしいです。
789デフォルトの名無しさん:2008/07/01(火) 12:05:19
google
790デフォルトの名無しさん:2008/07/01(火) 12:10:05
まあ1つの言語に慣れれば、他も大体似たようなものだし
サンプルを片っ端から動かしてみて(読むのは後でいい)
その動作を覚えていれば、必要になったときにそのサンプルを思い出すだろう。

あとは関数単位より、機能単位で探し物すればいい。見つからなけりゃ自作するはめになるし
その後そのものの関数が見つかったりもするけど、それもまた勉強で。
791デフォルトの名無しさん:2008/07/01(火) 12:16:57
運任せ、ということでしょうか。
検索して見つかればラッキー、そうでなけば自作か諦める、という選択肢になってしまうのですね。
自分のニーズに合ったものを常に探し出せる公式な機構というものは存在しないのでしょうか。
だとしたらかなり不便ではないですか?
よく使うものは覚えていればいいですけど、漠然とした要求や、特殊な機能などは、
せっかくライブラリがどこかに存在しても結局は無いのと同じことになってしまいませんか。
792デフォルトの名無しさん:2008/07/01(火) 12:18:09
2ch
マイクロソフトのページで検索
793デフォルトの名無しさん:2008/07/01(火) 12:19:32
>>791
正直、プログラマに向いてない、
と思いましたw
794デフォルトの名無しさん:2008/07/01(火) 12:20:59
探しだしてくれるAIを作れ
795デフォルトの名無しさん:2008/07/01(火) 12:30:44
>>791
ライブラリの提供元で調べる。(MSDNとか)
言語によっては言語の公式リファレンスみる。(PHPとか)
796デフォルトの名無しさん:2008/07/01(火) 12:34:35
>>701
本を片っ端から買え。
ネットを片っ端から検索して嫁。
めんどくさくなったら、自分で作れ。(<-ある程度のプログラマーなら、これも多い)
とにかくやればできる、または要求が無理だと理解して違う道を探す。

不便だと思ったら便利にしたいと思うのがプログラマ。
797デフォルトの名無しさん:2008/07/01(火) 12:38:47
×不便だと思ったら便利にしたいと思うのがプログラマ。
○不便だと思ったら便利なツールを作るのがプログラマ。
798デフォルトの名無しさん:2008/07/01(火) 12:55:51
>>782
char へのポインタが必要なところに int を渡しているので、未定義動作になる。
どんな動作をしても非標準じゃないけど、いきなりぶっ飛んだりしない親切設計。
799デフォルトの名無しさん:2008/07/01(火) 13:05:18
>>788
C++/CLIじゃね?
MSDNでがんばれ
800デフォルトの名無しさん:2008/07/01(火) 13:57:50
>>798
普通にNULLポインタだと思わない?
801デフォルトの名無しさん:2008/07/01(火) 13:59:28
>>800
printf()のような可変長引数関数に0渡すときは、型がわからないから
単にint扱いだよ

たとえnull pointerを特別扱いしてくれるprintf()であっても、
sizeof(void*) != sizeof(int)な環境ではどうなるか分かったもんじゃないな
802デフォルトの名無しさん:2008/07/01(火) 14:01:05
なんだ、質問者の意図がわからないアホか・・・
803デフォルトの名無しさん:2008/07/01(火) 14:05:19
>>802
誰に言ってんの?
多分質問者の環境ではsizeof(void*) == sizeof(int)でかつ
printf()がnullpointerを特別扱いしてる(これは親切設計)から、
そのように動作してるんだよ。

可変長引数関数にnull pointerを渡したければ、
(void*)0
のようにキャストしなきゃだめ。
804デフォルトの名無しさん:2008/07/01(火) 14:06:40
>>791
たとえばゲーム作るとするだろ。

その時、シナリオなり戦闘ルーチンなりは自分で作る。
ファイルを開いたりウインドウを閉じたりは、APIやライブラリや
フレームワークに用意されているはず。

自分で一から考え出すのは前者だろ。後者は(居れば)誰かに
聞いたりググったり、マニュアル読めば見つかる。

上の例は極端だけど、自分で一から考えなきゃいけないものが何か
切り分け出来ないのは単に経験不足だから、触ろうとしている環境の
サンプルをもう少し動かして感じをつかむしかない。

その環境で出来ることが全部サンプルでできるとは限らないけど
困らないぐらいには大抵網羅されている。

>そもそもその関数や型の存在を知らなければ歯が立たない
サンプルを一通り見てもそう思う?
805デフォルトの名無しさん:2008/07/01(火) 14:33:21
>>800
とりあえず >803 参照。そのうえで、 "%s" にヌルポインタを渡した場合の動作も同じく
未定義動作。 "(null)" を出して済ませてくれるのは親切設計。場合によっては余計な
お世話かもしれない。(ファイルにリダイレクトしてて、後々まで気づかないとか。)
806デフォルトの名無しさん:2008/07/01(火) 20:36:57
ベクターの各要素を定数倍するにはどうすればよいですか?
807デフォルトの名無しさん:2008/07/01(火) 20:37:37
定数倍する関数作る
808デフォルトの名無しさん:2008/07/01(火) 20:57:22
普通にループさせるんでいいんじゃね
809デフォルトの名無しさん:2008/07/01(火) 20:57:50
std::transform(v.begin(), v.end(), v.begin(), std::bind2nd(std::multiplies<T>(), N));
810デフォルトの名無しさん:2008/07/01(火) 23:45:48
ありがとうス。
今まで教えてもらったことを元に色々と書いてみたのですが、うまく動きません。
vector<double> multi(vector<double> &v1, vector<double> &v2) {
vector<double> tmp(v1);
for (unsigned int i = 0; i < tmp.size(); ++i) {
tmp[i] *= v2[i];
}
return tmp;
}
こういう関数があったとして、返り値のvector<double>は、いつまで存在している
のでしょうか?この返り値をほかの関数の引数としてそのまま渡してしまったら駄目なのでしょうか?
multi(multi(v1,v2), v3);
たとえばこんな書き方↑です。multi()の引数を参照渡しではなく、値渡しに変更すると
正しく動くみたいなのですが、、、
811デフォルトの名無しさん:2008/07/01(火) 23:57:10
>>810
>うまく動きません。
それを具体的に。
v1とv2の要素数は同じ?

>返り値のvector<double>は、いつまで
変数に入れたりする限り、ずっと有るよ。
正確には、コピーされていく。
大き目のint変数くらいに考えても良い。
812デフォルトの名無しさん:2008/07/02(水) 00:20:41
>>811
ありがとうございます。
v1とv2の要素数は同じです。うまく動きません、というのより、コンパイルが通りません。


変数に入れずに、直接関数に渡したら駄目ですか?
渡された側の関数では、参照貰いで引数を貰うようになってます。
813デフォルトの名無しさん:2008/07/02(水) 00:22:40
コンパイルエラーを書くのを忘れてました。
ソース
#include <vector>
using namespace std;
vector<double> multi(vector<double> &v1, vector<double> &v2) {
vector<double> tmp(v1);
for (unsigned int i = 0; i < tmp.size(); ++i) {
tmp[i] *= v2[i];
}
return tmp;
}
void func(vector<double> &v1, vector<double> &v2) {
multi(multi(v1,v2),v1);
}
int main() {
return 0;
}
エラー
$ g++ hoge.cpp
hoge.cpp: In function 'void func(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)':
hoge.cpp:11: error: invalid initialization of non-const reference of type 'std::vector<double, std::allocator<double> >&' from a temporary of type 'std::vector<double, std::allocator<double> >'
hoge.cpp:3: error: in passing argument 1 of 'std::vector<double, std::allocator<double> > multi(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)'
814デフォルトの名無しさん:2008/07/02(水) 00:27:33
windowsプログラミングを触り始めたのですが、CLRを用いる場合何か問題点など有りますでしょうか。

やりたいことはPhotoshopなどの様にレイヤー管理ウィンドウの表示です。
表示のオンオフ用のチェックボックスとレイヤーを複数選択状態を指定の2つで、
互いに独立している(表示オンオフとレイヤーの選択は依存しない)なのですが、
VB・javaの経験が有るため、CLRならばユーザーコントロールで作り〜と実装の目処は立てられるも、
それ以外の方法では敷居が高く出来るならCLRで開発を行いたいと思っております。

また、今後ゲームのミドルウェア開発をしていく上でCLRを使ったプログラミングを行っていっても良いのでしょうか。
MFCなど様々な開発方法があり、どれを勉強していけばよいのか考えあぐねています。
とりあえずプラットフォームはwindowsのみなのでCLRを使っていこうとは思っているのですが、何かおすすめの勉強方法が有りましたら宜しくお願いいたします。
815デフォルトの名無しさん:2008/07/02(水) 00:28:31
>>813
一時オブジェクトは非constな参照引数に渡せない。
変更しない物にはconst付けるクセ付けろよ。
816デフォルトの名無しさん:2008/07/02(水) 00:31:37
>>813
>>726の1行目のやつだね。引数にconst付けてみ。
実は最初そう思ったんだけど、
VC++2005で試したら普通にコンパイル通っちゃったんだよね・・・
817デフォルトの名無しさん:2008/07/02(水) 00:39:40
>>814
パフォーマンスを気にする類ならCLRはGC動くから使わない方が良いけど、
そうでないなら別に問題無いと思う。
個人的にはユーザーインターフェースはWTLが良いかな、と。
ちなみにCLR使うとなるとC++/CLIっていうC++派生の別言語になる。
818デフォルトの名無しさん:2008/07/02(水) 00:46:38
>>815-816
ありがとうです。
ためしてみます。

726は全部確かにツボをついた質問ですね。

・非const参照の引数に一時オブジェクト
・const参照に一時オブジェクト
この2つの質問って同じことじゃないですか?

・typenameキーワードが必要になる状況
そういう状況があったというのはどこかで読んだけど、具体的にどうだったかは忘れた。

・vptr初期化タイミング
この質問は意味自体が分かりません。

・char配列の領域に任意のクラスを配置new出来るかどうか
たしかvectorを使う方がいいとかどこかで聞いたような気がするけど。


たしかにこんな質問にすらすら答えられるようだったら結構すごいと思うけど、、
あと、テンプレートで正規表現の処理なんかも書けないな。俺も2年くらいC++
使ってるけど、まだまだだな〜
819デフォルトの名無しさん:2008/07/02(水) 00:49:19
2年やっててあんな質問してるようじゃ相当マズイと思うんだけど。
820デフォルトの名無しさん:2008/07/02(水) 01:09:22
>>818
>この2つの質問って同じことじゃないですか?
基本的に同じ。分けたのは上はコンパイルエラーで
下は生存期間を延ばすルールがあるからかも。
http://www.sun-inet.or.jp/~yaneurao/intensive/cppmaniax/chap0001.html

>配置new出来るかどうか
出来ないというか未定義になる・・・かな?
boost::aligned_storageとか使わないと動く保証が無くなる。
821デフォルトの名無しさん:2008/07/02(水) 01:22:07
>>817
ありがとう御座います。WTLを早速試してみます。
横でdirectXを動かそうと思っているのでなるべくパフォーマンスは軽い方が良いですし頑張ってみます。
822デフォルトの名無しさん:2008/07/02(水) 01:30:53
インデックス演算子のオーバーロードなんですが
多次元配列のインデックスをオーバーロードすることは出来るのでしょうか?
823デフォルトの名無しさん:2008/07/02(水) 03:49:13
できるけど、実装がちょっと面倒だし、利点もあまりないように思う。
どうしても多次元配列じゃないとだめ?
関数の形にしたほうが簡単でいいのでは?
array[i][j][k]; => 面倒
array(i,j,k); => 簡単
824デフォルトの名無しさん:2008/07/02(水) 08:39:04
vectorにクラスをつっこんだときに、push_back使ってコンストラクタを呼び出すと一時オブジェクトがデストラクタを呼び出してしまい、スマートなプログラムが組めません。
static std::map<int, myclass *> classMap;
class myclass{
  int myid;  BOOL f;  TCHAR Text[256];
public:
  myclass(int id, LPCTSTR str){
    f = FALSE;    myid = id;    _tcscpy(Text, str);
    classMap.insert( std::make_pair(myid, this));
  }
  myclass(const myclass &cpyc){
    ((myclass *) &cpyc)->f = TRUE;
    f = FALSE;    myid = cpyc.myid;    _tcscpy(Text, cpyc.Text);
    classMap.erase(myid);
    classMap.insert( std::make_pair(myid, this));
  }
  ~myclass(){
    if(!f)  CtrlMapping.erase(myid);
  }
};
int main(){
  std::vector<myclass> mc;
  for( int i = 0; i < 10; i++)  mc.push_back(myclass(i, _T("hoge")));
  return 0;
}
てなかんじなのですが、
((myclass *) &cpyc)->f = TRUE;
のあたりとかとくに無理矢理感が否めず、全体的に、他にもっとスマートなやり方等はないのでしょうか。
classMapをクラスのメンバに入れると、リンクエラーが起きます。これは何故でしょうか。
あともう一つ、基本的な話でスミマセンが、コピーコンストラクタの中で、プライベートなメンバにアクセスできるのは何故ですか?(呼べないとものすごく困りますが)
質問多くてスミマセン…^^;
825デフォルトの名無しさん:2008/07/02(水) 09:09:12
>>824
shared_ptrでも使ったら?

> classMapをクラスのメンバに入れると、リンクエラーが起きます。
宣言だけして、実体の定義してないんだろ。

>プライベートなメンバにアクセスできるのは
同じクラスだから
826デフォルトの名無しさん:2008/07/02(水) 09:09:36
>>823
csvファイルの操作を行う、内部に二次元配列を持つクラスを
作りたいのですがインデックス演算子の方が直感的かとおもうので・・・
関数の形でも問題ないのでそういう方向で行きたいと思います

あと、CSVファイルを操作するとき二次元配列をそのまま内包するより
列をリスト構造で繋いで
行をそのリストの配列、もしくはリストのリストという形にした方が操作しやすいですか?
827デフォルトの名無しさん:2008/07/02(水) 09:11:08
stlをあんまり知らない俺が予想でカキコ

1.
((myclass *) &cpyc)->f = TRUE;
 ↓
cpyc.f = TRUE;


2.
classMapはintとmyclassへのポインタのmapだから、
これがmyclassのデストラクタを呼ぶことは無いんでは?

3.
リンクエラーは涌かんね

4.
privateってのは他の「クラス」からのアクセスを制限してる。
ほかの「インスタンスからの」じゃない。
# そういう風になった理由は知らないけど...
828デフォルトの名無しさん:2008/07/02(水) 09:14:39
ああ
for( int i = 0; i < 10; i++)  mc.push_back(myclass(i, _T("hoge")));
なんて書いてるからか。

これでmcにpush_backされているのはmyclassの一時オブジェクトだよ。
for( int i = 0; i < 10; i++)  mc.push_back(*(new myclass(i, _T("hoge"))));
でどうか?
829デフォルトの名無しさん:2008/07/02(水) 09:20:19
>>827
1. constの存在を忘れてるよ。対症療法で答えるならmutableを使うことになると思う。
2. push_backの引数に渡した一時オブジェクトが無駄という話。
3. cppファイルかどっかに変数の実体も作ってやらないとだめなの。関数の実体を書くのと同じ要領で。

>>828
そのnewした一時オブジェクトはどこへ行っちゃうの?
830デフォルトの名無しさん:2008/07/02(水) 11:07:19
>>829
push_backの引数って、vectorの中に入る時には、コピーされるから一時オブジェクト
でも問題ないんじゃなかったっけ?
831デフォルトの名無しさん:2008/07/02(水) 11:09:33
>>830
コピー元へのポインタが失われてメモリリークする。
832デフォルトの名無しさん:2008/07/02(水) 11:20:29
>一時オブジェクトがデストラクタを呼び出してしまい...

>そのnewした一時オブジェクトはどこへ行っちゃうの?
の話がゴッチャになってないか?
833デフォルトの名無しさん:2008/07/02(水) 11:44:21
>>824
つーかそのコードだとobjectのIDとインスタンスのポインタを
classMapとやらで管理してるようだが、
コピーコンストラクタでコピー元のIDをそのままコピってるから
おかしなことになるんだろ

A生成→IDA, &A登録
BをAからコピーコンストラクタで生成→IDA, &A削除、IDA, &B登録(いいの?)
A破棄→IDA, &B破棄(いいの?)

vectorにpush_back()する際に起きるのは、こういうことだ

この時点でBが生きてるがclassMapには何も残ってない
何のつもりのIDだか知らんが、設計一から見直せよ
834デフォルトの名無しさん:2008/07/02(水) 11:51:00
同じIDのオブジェクトが複数存在する状況があるから面倒な事になるんだよな。
myclassはコピー不可にすべきだな。
835824:2008/07/02(水) 12:35:38
>>825,827
実態登録するの忘れてました…
privateのほうは、ほかのオブジェクトからアクセスできないものだと思いっきり勘違いしてました。
同じクラスなら大丈夫なんですね…

shared_ptr使ってポインタの配列として扱うのでも問題はないのですが…

>>829
どうmutableを使ったらよいかよくわからないです…

>>833
そもそもコピーコンストラクタなど使いたくなくて、
vectorでpush_backするときに、一時オブジェクト使わずにコンストラクタを呼び出したいのですが、
一時オブジェクトができてしまうと、コンストラクタでマップに登録されるまではよいのですが、
そのまま(コピーコンストラクタを使わずに)コピーすると、一時オブジェクトが破棄されると同時にデストラクタが呼び出され、マップが破棄されてしまうので、
それを避けるために、コピーされたときにコピーされたことを示すフラグを立て、デストラクタ時にマップを破棄しないようにしているのです。

実際IDにはコントロールのハンドルか何かを使うつもりなので、同じIDのオブジェクトは作らない前提なのですが…
836デフォルトの名無しさん:2008/07/02(水) 12:39:57
普通にshared_ptrかptr_vectorの出番だろ。
837824:2008/07/02(水) 13:04:30
>>836
ptr_vectorとか知らなかった…
これの出番です! これ使ってきます!
838デフォルトの名無しさん:2008/07/02(水) 18:36:21
VC++2008で
class sample {
wchar_t *name;
public:
sample( const wchar_t *src ) {
int len = wcslen( src ) + 1;
name = new wchar_t [ len ];
wcscpy( name, src );
}
~sample( void ) {
if ( name ) delete [] name;
}

};

みたいにやるとデストラクタでヒープ破壊が起きて例外が来るんだが、これはC++仕様?それともCRTか何かのバグ?
メモリ解放出来ないからリークしまくって困ってるんだが、どうにかならんだろうか
839デフォルトの名無しさん:2008/07/02(水) 18:43:55
ほかのnewしたメモリを使っている部分でメモリ破壊を起こしていると言うことはないか?
840デフォルトの名無しさん:2008/07/02(水) 18:45:20
あるいはコピーコンストラクタと代入演算子を書いていないからか。
841デフォルトの名無しさん:2008/07/02(水) 18:45:56
もっとも単純にした状態で出る?
842838:2008/07/02(水) 18:53:46
>>838のクラスをそのまま流用したときは出ないです
main()でインスタンス作って終了ですら発生します
843デフォルトの名無しさん:2008/07/02(水) 19:00:10
出ないのに発生する?
よくわからん、こっちで再現できるだけの材料ある?
844デフォルトの名無しさん:2008/07/02(水) 19:00:54
入門書一通り読み終わったんですが
次はどんな方法で勉強すればいいですか?
845デフォルトの名無しさん:2008/07/02(水) 19:03:31
>>844
とりあえず作りたい物を作ってみる

作りたい物を作っていく上で問題にぶち当たったら
その問題を解決するようにしていく

文法と規則を覚えたら後はこれの繰り返し
846デフォルトの名無しさん:2008/07/02(水) 19:04:21
int main() { sample s(L"こんにちは"); }
こんなんやってもこっちでは再現しねえよ
VC9だよな?

俺が試したのはSP当たってねえExpressだけど
847838:2008/07/02(水) 19:09:24
手元の環境では>>838のコードに色々メンバを追加してくと発生します
再現性のある資料はさっきのコード位しかないですねwchar_t*に限らずint*とかでも例外が来ました
848デフォルトの名無しさん:2008/07/02(水) 19:14:34
>>845
ありがとうございます
オセロ作っちゃいます
849デフォルトの名無しさん:2008/07/02(水) 19:16:35
>>847
そういうのは、コンパイルするだけで再現可能な最小のコードに切り落として、
正確に使ってる環境とコンパイルオプション添えて、
MSに報告してやれよ
850デフォルトの名無しさん:2008/07/02(水) 19:21:09
nameを複数回解放してないか
コピー作られたとき
851デフォルトの名無しさん:2008/07/02(水) 19:24:39
>>847
メンバを追加しないと発生しないんだったら、それも載せないと意味ないだろう
852838:2008/07/02(水) 19:52:42
もう少し研究してみることにする
853デフォルトの名無しさん:2008/07/02(水) 20:05:44
854デフォルトの名無しさん:2008/07/02(水) 20:38:26
pw.insert(map<double, float>::value_type(power, f));

これってどういう事をしてるんですか?

STLさっぱりなんでmapとかわかりません
855デフォルトの名無しさん:2008/07/02(水) 20:55:44
(power, f)というペア(型はstd::pair<double, float>)をpwに挿入している
ようだな
856デフォルトの名無しさん:2008/07/02(水) 22:58:36
>>852
とりあえず、デストラクタ内の if (name) は意図どおりには動かないぞ。
sampleのオブジェクトがスタックなのかヒープなのかは知らんが
どちらにしろ、nameが0(NULL)で「初期化」されることはない。
したがって、「確保されていたらdelete」の判断には使えない。
まあ、NULLをdeleteしてもかまわないわけだがね。

あと、皆も言ってるが、この手の「中身の実体を別途(ヒープに)確保する」ものは
自分でコピーコンストラクタを書かない限り、コピー(代入)はうまく動かない。
仮にsampleの用法が「必ずヒープから確保して、実体コピーはしない」というものだけであっても
宣言だけはしてコピー不可にしておくべき。
857デフォルトの名無しさん:2008/07/03(木) 10:56:51
[\033[1;30m\]
こんな感じのカラーコードってありますよね
これは黒白合わせて8色+ダークしかないんでしょうか。
RGBみたいに自由に指定して色を作ったりは出来ないんでしょうか
858デフォルトの名無しさん:2008/07/03(木) 10:59:14
ANSIのエスケープシーケンスだろ、スレ違いだけどRGB指定は無いよ。
859デフォルトの名無しさん:2008/07/03(木) 11:04:37
>>857
最近のxtermやrxvtは256色表示ぐらいは出来るらしい。
↑の30のかわりに38;5;%d (%d: 0 〜255)
みたいなシークエンスを送るようだ。
860デフォルトの名無しさん:2008/07/03(木) 13:43:50
スレ違いでしたか、申し訳ない
Macの初期装備ターミナルでも256表示出来るかな…?
試してみます、ありがとう
861デフォルトの名無しさん:2008/07/03(木) 19:30:23
ゲームでキャラにマウスカーソルを乗せるとカーソルの形が変わるものがあります。
このようにマウスカーソルをオリジナルのものに変えるにはどうすればいいですか?
VC++2008,Vistaです
862デフォルトの名無しさん:2008/07/03(木) 19:44:32
>>861
LoadCursorやLoadImageでカーソルをロードするかCreateCursorでカーソルを作成してSetCursorする
863デフォルトの名無しさん:2008/07/03(木) 20:35:06
WM_SETCURSOR
864デフォルトの名無しさん:2008/07/03(木) 20:44:38
エスケープシーケンスはokって>>1にあったな
すまんかった
865デフォルトの名無しさん:2008/07/03(木) 21:39:19
>>856

>デストラクタ内の if (name) は意図どおりには動かない
そーか?

sampleには一見すると引数無しのコンストラクタが無いので、
生成する時nameの初期化は強制されると思うんだが。
866デフォルトの名無しさん:2008/07/03(木) 21:43:47
コピーしたときにどうなる?
867デフォルトの名無しさん:2008/07/03(木) 21:58:58
>865
nameはプリミティブだからデフォルトコンストラクタとか
喚ばれないよ?
868デフォルトの名無しさん:2008/07/03(木) 22:27:47
初期化は強制される。
コピーの時も元が初期化されているので未初期化の領域をdeleteすることは無い。
ただし、コピーコンストラクタによって2重deleteが発生し得る。
869デフォルトの名無しさん:2008/07/04(金) 02:39:04
#define nusigned unsigned
#define usnigned unsigned
#define unisgned unsigned
#define unsgined unsigned
#define unsinged unsigned
#define unsigend unsigned
#define unsigndn unsigned
#define edfault default
#define dfeault default
#define deafult default
#define defualt default
#define defalut default
#define defautl default
#define erturn return
#define rteurn return
#define reutrn return
#define retrun return
#define retunr return
870デフォルトの名無しさん:2008/07/04(金) 02:40:03
失礼します

#include <stdio.h>
#include <math.h>
main()
{

double pi,i,n,f;

for(n=0;n<200;n++){
f=pow(16,n);
i=(1/f)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6));
pi+=i;
printf("%lf\n",pi);
}
}

のpi+=iの部分の意味が分からないのですが、これは何をしているんでしょうか?
piにiを足しながら代入ですかね?

ご指導お願いします。
871デフォルトの名無しさん:2008/07/04(金) 02:50:53
pi=pi+i
872デフォルトの名無しさん:2008/07/04(金) 03:06:36
複合代入演算子
873デフォルトの名無しさん:2008/07/04(金) 03:23:15
ありがとうございました!
874デフォルトの名無しさん:2008/07/04(金) 05:01:29
>>865>>868
されねーよ。
実際に調べてみろよ。アセンブラコード出力して。

規格にあると言うなら、なんて書いてあるのか示してくれよ。
俺が追ってない、最新規格ならそうだってんなら納得するから。
875デフォルトの名無しさん:2008/07/04(金) 05:39:38
あ、俺が知ってるのは、
sampleにPODなメンバしかなく、コンストラクタを明示的に書いてない場合に
例えば new sample ならメンバは初期化されないで、
new sample() なら0で初期化されるということと
引数ありのコンストラクタがあるのにデフォルトコンストラクタが無い場合には
上のような引数無しでのオブジェクトは作成不可能ということだけだがね。

で、コンストラクタを書いた時、
初期化コード内に現れてないメンバを勝手に初期化してくれるとは知らなかったね。
配列も初期化してくれるのかい?大きなお世話なんだが。
可変長構造体でも、placement newを使えばコンストラクタを利用できるわけだが
これはどこまでゼロフィルしてくれるのね。
まあ、可変長構造体自体がC99以外では未定義だし
サイズ0の配列は独自拡張らしいから別の話になるか。

確かにPODと非POD両方を持つクラスのデフォルトコンストラクタなら
自動的に他のメンバを初期化するという仕様に決まってるかも、と思わないでもない。
実際には()の有無にかかわらずPODメンバは初期化していないようだが。
仕様は知らん。
876デフォルトの名無しさん:2008/07/04(金) 06:04:55
VC++のdeleteはかなりいい加減なポインタを渡しても落ちない。
newやmallocで確保したアドレスのリストを持っててそれと一致しないと無視という構造で
複数回deleteしようが、nullポインタをdeleteしようが、
文字列リテラルへのアドレスをdeleteしても落ちない。

>デストラクタでヒープ破壊が起きて例外が来るんだが
の状況判断が根本的に間違ってると予想するよ。

どこかでnameのポインタをそのまま外部に渡してるとか
さらしてないところでnameをいじってるとかそんなところだろ。
877デフォルトの名無しさん:2008/07/04(金) 06:22:16
>>876
え?VC8で2重解放したら、即例外投げられたよ?
878デフォルトの名無しさん:2008/07/04(金) 07:07:21
>874-875
>引数ありのコンストラクタがあるのにデフォルトコンストラクタが無い場合には
>上のような引数無しでのオブジェクトは作成不可能ということだけだがね。

838のコードを対象にしてんだから、まさしくそういう意味で、
「初期化が強制される」、って言ってるんじゃないの?
879デフォルトの名無しさん:2008/07/04(金) 07:17:03
>>874
そういうならnameに何も初期化・代入せずに
>>838のsampleのインスタンス作るコード書いてみろよ。
880デフォルトの名無しさん:2008/07/04(金) 07:30:20
あのさ、
デストラクタ内に if (p) delete p; というコードがあるわけ。
で、コンストラクタ内に、 p = new wchar_t[]; というコードがあるわけ。

つまりね、ここから想定されるのは、
「コードを書いた者は」
「newされたメモリが代入される前には」
「pはNULLになっているはずだ」
と考えているということ。

これが間違いだ、との指摘が>>856の前半なの。わかってる?
>>856の「初期化」の直前に「0(NULL)で」と書いてあるでしょ?
「初期化されることはない」じゃなくて、「NULLで初期化されることはない」なの。
これに対して、>>865がどれほど見当違いな事書いてるかわかる?
「NULLで初期化されることはない」に対して「初期化は強制される」と書かれたら
「NULLでの初期化が強制される」読むでしょ。これが>>868の書き込み。
881デフォルトの名無しさん:2008/07/04(金) 07:35:09
あ、「意図通りに動かない」というのも
書いた者が「初期化されてなかったら解放する」という意図を
「そもそも初期化されないことはない」というのは当然だけど

「コンストラクタが完了していない(未初期化)の状態が起こりえるコード(が省略されている)であっても
NULLかどうかで(newによる代入が行われたかの)判定は出来ない」ということだよ。
882868:2008/07/04(金) 07:50:48
>>880
そういう意味なら良いよ。
俺はif(name)には言及して無いし、if(name)が無意味なのは同意する。

コンストラクタ完了時にnameが未初期化のケースは無いと言っただけ。
>>838が困ってるのはヒープ破壊の方の話だからな。
883デフォルトの名無しさん:2008/07/04(金) 07:57:55
問題をまとめると
・コピーコンストラクタが書かれてないので、コピーしたときにポインタが多重になり、
 デストラクタで同じアドレスが複数回解放される可能性がある
・デフォルトコンストラクタが書かれていないので、引数無しでインスタンスを作成した
 場合に、ポインタの値が不定のまま(VCだと0xccccccccでNULLではない)デストラクタで
 解放を試みられる。
884デフォルトの名無しさん:2008/07/04(金) 08:00:12
>引数無しでインスタンスを作成した場合に
引数無しでインスタンスは作成出来ない。
885デフォルトの名無しさん:2008/07/04(金) 08:01:22
聞かれて無いがついでに解決策
・コピーコンストラクタ、デフォルトコンストラクタを書いて、正しくポインタを取り扱いましょう。
・手作業でメモリ確保せずに、std::vector<wchar_t>やstd::wstringをバッファとして使いましょう。
886デフォルトの名無しさん:2008/07/04(金) 08:02:33
>>884
あぁそうか。ならデフォルトコンストラクタの部分は無しで
887デフォルトの名無しさん:2008/07/04(金) 08:05:00
ごめん、しつこいようだけど、もう一言だけ追加させて。

>>856の前半をわざわざ書いたのは、C++以外の言語では
>>880の真ん中の仮定が通用するものが多いわけ。JavaとかDelphiとか。

だから、それを勘違いしていて、たとえこのコードでは問題なくても
他の場所でバグを抱え込んでいる可能性が充分あるから。


で、ヒープが壊れるという現象は、オーバーフローなんかも多いけど
この人の場合は「(ヒープから確保した以外の)未初期化の不定なポインタのdelete」
による可能性も十分あるかと。
もちろん、コピーや代入による「2重delete」の可能性も高いけど。
888デフォルトの名無しさん:2008/07/04(金) 08:11:38
>>887
>この人の場合は「(ヒープから確保した以外の)未初期化の不定なポインタのdelete」
>による可能性も

一応聞くけど「>>838に貼られたコードが」ではなく
>>838の認識で書かれたコードが」って意味だよな?
889デフォルトの名無しさん:2008/07/04(金) 08:13:33
一番問題なのは、自分が悪いとは微塵も
考えて無いことだなw
890デフォルトの名無しさん:2008/07/04(金) 08:22:39
>>888
あたりまえ
891デフォルトの名無しさん:2008/07/04(金) 08:25:04
>>898
そうだなw
予想どうり2重解放してるなら、デバッガで追えばすぐ分かる間違いだし。
892デフォルトの名無しさん:2008/07/04(金) 08:55:32
if ( name ) delete [] name; を「意図どおりには動かない」と
言っているが、これが分かりにくいんだな。

現に、>>856自身の念入りな解説(>>880)で、本当の意図が分かった人が
複数いるわけで、ここは「ちゃんと読まないてめーが悪い」と考えるのじゃ
なくて、相手に誤解させず、はじめから意図どおりに読ませる書き方を
しないと。

現実世界で、自分が正しいはずなのにコミュニケーションが
うまく行かないってはめにおちいるよ。
893デフォルトの名無しさん:2008/07/04(金) 10:44:24
『nameの「初期化」(←強調付き)』と書いているものを
『nameへの代入』と解釈したり(sampleのコンストラクタ内でやってるのは「代入」ですね)
『sample(のインスタンス)の初期化』と解釈する人の事なんか知りません。

現に>>867はちゃんと「nameの初期化」の意味を理解してます。
894デフォルトの名無しさん:2008/07/04(金) 10:54:39
・必ずコンストラクタを通る。
・プログラマが定義していない初期化(全て0フィル等)は行われない。
・newが失敗したときは例外が飛ぶのでsampleオブジェクトの生成も失敗する。

以上のことから
デストラクタ実行時にname==0という状態は考えられず、
if(name) という記述に怪しいニオイを感じる。
というだけのことではないの?
895デフォルトの名無しさん:2008/07/04(金) 11:32:19
>>893
それはお前の思い込み。

struct A{
  const wchar_t* name;
  A(){ name=L""; } // A():name(L""){}
};

上記のように初期化リストを使わない書き方をもって、
「nameは初期化されない」と言うのが一般的とは到底思えない。

何故なら、そう言うと未初期化になると受け取られることが予想出来るため。
厳密な初期化の話をするなら俺なら「」の強調程度で済まさずちゃんと書く。

「wchar_t*型(の自動変数)はNULLに初期化されない」なら分かるけどな。
896デフォルトの名無しさん:2008/07/04(金) 11:47:05
>>895
うまいね、一票だな

>厳密な初期化の話をするなら俺なら「」の強調程度で済まさずちゃんと書く。
そうだよね。これが「ちゃんと読まないてめーが悪い」とは考えない大人な
ものの考え方だよ。
897デフォルトの名無しさん:2008/07/04(金) 11:49:51
あのさ、
sampleオブジェクトの生成が失敗して例外が投げられた時、
sampleのデストラクタが実行されるのか?
898デフォルトの名無しさん:2008/07/04(金) 11:56:23
>>897
されない
899デフォルトの名無しさん:2008/07/04(金) 12:25:30
>>898
ということは、

さらされてるコードではnameに 『有意な値が設定されない』 状況はsampleオブジェクト
の生成失敗であって、その状況で通りもしないif(name)の動作が意図されないとか、
言及に値する?

それともnameに 『有意な値が設定されない』 でdelete [] nameが実行されるケースって
あるのかしら?

sampleのインスタンスがコピーされたりnameのポイント先が他から無理やり開放されたりとか、
想像で障害を増やすことはできるけど、その場合はif(name)の意図如何にかかわらず
吹き飛ぶだろうから、そもそも着眼するまでも無い様に思うが。
900デフォルトの名無しさん:2008/07/04(金) 13:01:22
初期化子で初期化するときにdeleteされても安全なオブジェクトを作る→
コンストラクタから例外を投げる時には地震のデストラクタを呼べば良い。

初期化子で例外が起こった場合は?
901デフォルトの名無しさん:2008/07/04(金) 13:23:36
>>899
>それともnameに『有意な値が設定されない』で
>delete [] nameが実行されるケースってあるのかしら?
件のコードで普通に生成する限りは、ないよ。

>>900
>コンストラクタから例外を投げる時には地震のデストラクタを呼べば良い。
それは止めた方が良い。
そもそもauto_ptrなどを使うべきだけど、
そうでないならtry-catchして必要な後処理をすること。

>初期化子で例外が起こった場合は?
諦める、でおk
function-try-blockでも止められないし。

RAIIに則って作ればどこで例外が出ようと、
例外安全になる。
902デフォルトの名無しさん:2008/07/04(金) 17:42:35
RAIIこそC++の真髄だよな
903デフォルトの名無しさん:2008/07/04(金) 18:22:55
C++に関する本で、演習(解答も)ついてるおすすめの本ってありますか?
904デフォルトの名無しさん:2008/07/04(金) 18:25:54
マルチすな糞
905デフォルトの名無しさん:2008/07/04(金) 18:44:43
あああーーー
誰か答えてやれよ
906デフォルトの名無しさん:2008/07/04(金) 18:46:35
>>905
マルチだから
907デフォルトの名無しさん:2008/07/04(金) 18:49:48
俺が答えられればいいんだけど。そういう本は10年以上前に読んだきりなんだよ。
最適化で「なぜここで聞く?」と書いた責任を感じてしまった。orz
908デフォルトの名無しさん:2008/07/04(金) 18:57:25
909デフォルトの名無しさん:2008/07/04(金) 19:29:35
SetCommState()が失敗するんですが、設定するだけでなんで失敗があるんですか?
各項目には値を代入できているんです。実行時にエラーになるならわかるんですが
910デフォルトの名無しさん:2008/07/04(金) 19:30:20
ジャンケン勝負のプログラムで
1=グー
2=チョキ
3=パー
で入力するとき
上記以外の入力がされたときに不正な入力がされました と表示させる宿題が出たのですが

これであってますか? もっといい方法あったら教えてください。
ttp://www9.uploader.jp/user/inoguma/images/inoguma_uljp00005.txt
911デフォルトの名無しさん:2008/07/04(金) 19:30:49
>>909
意味が分かりません
コンパイルエラーということでしょうか?
912デフォルトの名無しさん:2008/07/04(金) 19:39:42
>>911
関数の戻り値にFALSEがかえるんです。
913デフォルトの名無しさん:2008/07/04(金) 19:44:29
>>912
GetLastError で調べてください
914デフォルトの名無しさん:2008/07/04(金) 20:04:21
ありがとうございます。その関数知りませんでした。
87のパラメータが正しくないと出ました。

http://www.ys-labo.com/pic/pic%20chips/pic%20chips%20contets/2007/070401%20RS232C%20PC_PIC.html#RS232C%204
このサンプルの通りにしたんですが、PCによっては有効でない設定があるんでしょうか
915デフォルトの名無しさん:2008/07/04(金) 20:59:50
>>910
宿題すれ池
916デフォルトの名無しさん:2008/07/04(金) 21:00:27
>>914
そのURLにはSetCommStateがいっぱいあって、問題が特定できません。
エラーが発生するコードを載せましょう。
またMSDNをよく読みましょう。
917デフォルトの名無しさん:2008/07/04(金) 21:17:00
コードの文字が右に来たときに折り返す設定ってどうやるんですか?
918デフォルトの名無しさん:2008/07/04(金) 21:17:16
エディタ次第
919デフォルトの名無しさん:2008/07/04(金) 21:33:51
>>916
自己解決しました。サンプルが間違ってましたfParityにFALSEではなくNOPARITYが入ってました。
原因が絞れて解決できました、ありがとうございました。
920デフォルトの名無しさん:2008/07/04(金) 21:45:23
>>919
WebMasterに伝えてあげたいんだけど、サンプルのどこが間違えているの?
921デフォルトの名無しさん:2008/07/04(金) 22:06:58
サンプルを見て勉強するときは、
コピペじゃなく、考えながら手で写しましょう
922デフォルトの名無しさん:2008/07/04(金) 23:45:18
○×ゲームくらい簡単に作れるだろうと思ってたら自分への課題にしたけどめちゃめちゃむずかったです
AIとか訳分からんです
課題のレベルを下げるべきでしょうか?
923デフォルトの名無しさん:2008/07/04(金) 23:55:22
まずは両プレイヤーが人間操作でゲームが出来るようにすること。

そのあとAIというか、評価関数を作ること。
「そのマスに置くのは何点くらいか?」を返す関数をね。
相手が勝つのを防げるか、自分のマークと繋がってるか、などで
適当に点数をつける。精度は徐々に上げていけばいい。
924デフォルトの名無しさん:2008/07/04(金) 23:57:05
>>923
ありがとうございます
その方針で頑張ってみます
925デフォルトの名無しさん:2008/07/05(土) 00:01:16
323
242
323

だったけ?これが、基本形
926デフォルトの名無しさん:2008/07/05(土) 00:09:07
>>920
dcb.fParity = NOPARITY;で検索できる全てです。
ただFALSEもNOPARITYも0なので不具合は無いのかもしれません
NOPARITYはdcb.Parity = NOPARITY;に入れましたが、この記述事態がこのサイトに見つかりません。
自分はCビルダーではなくVCなのでもっとわかりませんが、他の2サイトのCビルダー用のコードにはParityにNOPARITYが入っていました
dcb.Parity = NOPARITY;自体はデフォルトがあって省略できるのかもしれませんが不明です。
927デフォルトの名無しさん:2008/07/05(土) 00:10:54
で、○×を少し拡張して五目並べをだな。
928デフォルトの名無しさん:2008/07/05(土) 03:18:55
char In[1];
CString workStr;
CString m_editx;

workStr.Format(_T("%s%c"), m_editx, 'In');
m_editx = m_editx + workStr;

これを実行するとDebug Assertion Failed! というエラーがでるのですが、これはなんですか?
929デフォルトの名無しさん:2008/07/05(土) 03:28:20
>>928
どういうアサーションが仕組まれてるのか分からないが、
%cに対して'In'を指定してることに対して怒っている事はまあわかる
930デフォルトの名無しさん:2008/07/05(土) 03:33:01
まずはIn[0]にするべきだな
そもそも'In'なんてコンパイル通らない気がするんだが

m_editxが何も参照していないのはわざとか?どうでもいいけど

まー、MFCの方で聞いた方が適切だとは思うが
931デフォルトの名無しさん:2008/07/05(土) 03:37:16
FormatってCStringオブジェクト渡しても大丈夫なの?
932デフォルトの名無しさん:2008/07/05(土) 03:39:28
>>929
 % c を % s にして実行すると、ハンドルされていない例外が発生しました。というエラーが出ます。
Inはchar In[1] で固定なのですが、エディットボックスにどんどん連結で入れていく方法はないでしょうか
933デフォルトの名無しさん:2008/07/05(土) 03:50:23
>>932
なんでそんなことしちゃったの?
> % c を % s にして実行
934デフォルトの名無しさん:2008/07/05(土) 03:59:36
#include <cstringt.h>

char Inr[1];
CAtlString workStr;
CString m_editx;

workStr.Format(_T("%s%c"), m_editx, Inr);
m_editx = m_editx + workStr;

エラーが悪化しました。
935デフォルトの名無しさん:2008/07/05(土) 04:15:21
すいません、エラーは全然関係ないところでした。
まずそっちのDebug Assertion Failed!を特定します。すいません
936デフォルトの名無しさん:2008/07/05(土) 06:09:45
GCC 4.0.1をOS Xで使っています。

=== hoge.h ===
template<typename T> class hoge {
private:
 T val;
friend hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);
}

=== hoge.cxx ===
template<typename T>
hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2)
{
 hoge<T> h = h1;
 h.val += h2.val
 return h;
}

のようにすると、compile後にoperator+が使用できません。
宣言だけされて、定義がないと思われてしまうようです。
hoge.hのclass hogeの中で

friend hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);
{
 hoge<T> h = h1;
 h.val += h2.val
 return h;
}

とやってしまえば、operator+を使用できるようになります。
定義はhoge.cxxの中で書きたいのですが、どこを修正すれば良いでしょうか。
937デフォルトの名無しさん:2008/07/05(土) 07:09:46
間違ってたらスマンね。詳しいわけじゃないから。
結論から先に書くと、ヘッダに定義も書いておいてやらなきゃダメなんじゃないかなと。
テンプレートってのは特殊化されるまでは実体を持たないので、
いくら.cxxの中に定義を書いたところで
その翻訳単位の中で具体的な型を与えて実体化させてやらないと
出来上がったオブジェクトには含まれようがない。
つまり関数foo<int>を利用する場合
他のオブジェクトのいずれかにfoo<int>の具体的なコードが存在するか
自分の翻訳単位に具体的なコードを作るための定義が存在しないと
翻訳プログラムは「みつかんねーし自作も出来ねーよクソが」と怒るわけだ。
938デフォルトの名無しさん:2008/07/05(土) 07:10:45
>>936
自分がその症例起こしたことがないからわからんけど
http://www.fides.dti.ne.jp/~oka-t/cpplab-template-1.html
939936:2008/07/05(土) 07:47:19
>>937-938
ありがとうございます。>>938の方法でいけました。
ただしfriendがoperatorの場合は、
さらにclass宣言の前にoperatorを宣言しないと駄目なようです。
通常のfriendはclass宣言の後ろに書くと思いますが、
operatorの場合だけ(?)は前方に書かないとなぜかGCCでは通りませんでした。
940936:2008/07/05(土) 07:49:15
template<typename T> class hoge {
private:
 T val;
friend hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);
}
hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);

としていたのを、

templaate class hoge<T>;
hoge<T> operator+(const hoge<T>& h1, const hoge<T>& h2);
template<typename T> class hoge {
private:
 T val;
friend hoge<T> operator+<T>(const hoge<T>& h1, const hoge<T>& h2);
}

としました。(ちと汚いが…)
941936:2008/07/05(土) 07:50:05
>>940
>templaate class hoge<T>;
ではなく、
template<typename T> class hoge;
です。
942デフォルトの名無しさん:2008/07/05(土) 10:03:24
>>931
CStringはそうやっても大丈夫なように工夫されてたと思う
943デフォルトの名無しさん:2008/07/05(土) 10:45:44
#include <iostream>
#include <atlstr.h>

int main()
{
    CStringA s = "this";
    CStringA ss;
    ss.Format("%s %s a pen", s, "is");
    std::cout << static_cast<LPCSTR>(ss) << std::endl;
}

へえ。確かにこんなのが動くみたいだな。
ちらっとヘッダ見たけど、データメンバがポインタ一個だけで、それがちゃんと
文字列部分を指していて、長さ情報みたいなのはポインタが指してる部分より前に
隠してあるようだ。

てことは、static_castでoperator LPCSTR()を呼び出さずに
reinterpret_castでもいいのかな?
944デフォルトの名無しさん:2008/07/05(土) 11:07:01
Bus Errorが起きます。



randl=random()%3;
tp = strtok(word[randl],",");
odata[0] = atoi(tp);
//cout << odata[0] << endl;
while ( tp != NULL ) {
tp = strtok( NULL,"," );
if ( tp != NULL ) {
odata[bcount] = atoi(tp);
//cout << odata[bcount] << endl;
bcount++;
}
}


word[randl]には{ 1,1,1,5,4,15,6,7,5,1 }といったchar型の二次元配列が入っています。
それらを , を境に分解し、odata[]の中に一つづつぶち込んでいます
メモリの書き込みがどうのこうの、と調べたので出てきたので此処が怪しいと思うんですが、
一体このスクリプトでどういう状況のときにバスエラーが出るのかわかりません。
ちなみに実行すると何度かは成功し、たまにバスエラーが出る状況なので、
「変数によって不正な値が作られている」だと思うのですが……



想定されるエラーの理由、
もしくは、「,を境に分けたいならこんな書き方のほうがいいよ」というのがあればご教授ください。
関係ないとは思いますがMacOS Xです
945デフォルトの名無しさん:2008/07/05(土) 11:19:01
>>944
問題が再現する最小のコードを張ってください
長くなる場合には >>1 のアップローダを使ってください
946デフォルトの名無しさん:2008/07/05(土) 11:20:07
Macか、CPUは?
947デフォルトの名無しさん:2008/07/05(土) 12:46:11
世間一般では、クラス、メソッドなどの概要、inputo、output、return値などのコメント説明って
ヘッダー、ソースのどっちに記載するのが普通ですか?
948デフォルトの名無しさん:2008/07/05(土) 12:47:55
>>947
ヘッダに書いておくと、IDEが読み込んでバルーンヘルプに解説が出てくるから便利だな。
949デフォルトの名無しさん:2008/07/05(土) 12:50:43
>>947
そうですよね。 cppの方に記載してるソースこの間見つけて
すごい違和感を感じました。
950デフォルトの名無しさん:2008/07/05(土) 13:55:49
.hに書くのは利用者向けコメント
.cppに書くのは実装者(後のメンテナ)向けコメント
951デフォルトの名無しさん:2008/07/05(土) 14:11:29
テンプレートの定義はヘッダに書くのが普通ですよね(複数のcppから使う場合)。
今までそうしてて問題なかったんですが、初めて、テンプレート関数の特殊化を使ってみたとき

// hoge.h
#ifndef HOGE_H
#define HOGE_H
template<typename T> void hoge(T a) { ... }
template<> void hoge<int>(int a) { ... }
#endif

特殊化した方の関数を使おうとすると、リンク時に「既に***.objで定義されている」と出るようになりました。(inlineと指定したら問題なくなりました
特殊化した関数の中身はcppに書けと言うことですか?
952デフォルトの名無しさん:2008/07/05(土) 14:16:11
そりゃまったく同じ名前、引数の関数が2ヵ所以上にあったらぶつかるだろ
953デフォルトの名無しさん:2008/07/05(土) 17:20:52
typedef enumで定義されている
値はC++で使う場合、クラスにラップした方がいいぉか?
954デフォルトの名無しさん:2008/07/05(土) 17:32:45
クラスでもnamespaceでもお好きに。
955デフォルトの名無しさん:2008/07/05(土) 17:50:57
まー、規約次第だろう
統一はしろ
956デフォルトの名無しさん:2008/07/05(土) 17:54:55
>>954
namespaceでの定義方法がよくわからないぉ?
957デフォルトの名無しさん:2008/07/05(土) 17:59:59
namespace foo {
 enum bar { hoge, piyo, puni };
}

foo::bar x = foo::hoge;
958デフォルトの名無しさん:2008/07/05(土) 18:01:26
クラスラップした後の話だろうw
namespaceは
959デフォルトの名無しさん:2008/07/05(土) 18:15:29
新しいクラスを作って中に関数を作ってそれを元のクラスから呼び出したいのですが、

クラス名::関数名();

静的でないメンバ関数の呼び出しが正しくありません というエラーが出て呼び出せません

960デフォルトの名無しさん:2008/07/05(土) 18:17:03
静的じゃないなら、そのクラスのインスタンスを生成しなきゃ呼べないだろ
961デフォルトの名無しさん:2008/07/05(土) 18:19:15
静的で使うのならstaticつけれ
962デフォルトの名無しさん:2008/07/05(土) 18:26:20
クラス名 std;
std.関数名();

インスタンスの生成ってこうですか?
エラーなくなりましたありがとうございます!
963デフォルトの名無しさん:2008/07/05(土) 18:26:31
VC++2008でプログラムを作り、デバッグボタンを押すと一瞬だけ何か黒い物が表示されてそれ以外は何も動きません
実行結果が見えるようにしたいのですがソースコードのどこに何を書けばいいのでしょうか?
964デフォルトの名無しさん:2008/07/05(土) 18:28:29
>>962 何かいろいろと勘違いしているかもしれんが・・・うまくいったならいいかw
965デフォルトの名無しさん:2008/07/05(土) 18:29:24
静的関数というものを理解してなさそうで怖いな
966デフォルトの名無しさん:2008/07/05(土) 18:30:50
デバッグありで実行せずデバッグなしで実行する
適当に入力待ち状態にしてそこで止める等々
967デフォルトの名無しさん:2008/07/05(土) 18:45:00
>>963
CTRL+F5
968デフォルトの名無しさん:2008/07/05(土) 18:45:52
>>963
mainのreturnにブレークポイント設定するとかCtrl+F5で実行するとか
969デフォルトの名無しさん:2008/07/05(土) 18:47:33
getchar()でも駄目だった


>>966,>>967
で行ったら確かに止まった、ありがたい
でもなんだか釈然としない
970デフォルトの名無しさん:2008/07/05(土) 18:51:13
getchar()で駄目な理由として
上でscanf()等を使って文字列入力をしてる場合等がある
971デフォルトの名無しさん:2008/07/05(土) 18:52:49
_kbhit
972デフォルトの名無しさん:2008/07/05(土) 18:56:14
// C801.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

using namespace System;

int main()
{
Console::Title="一番簡単な数の表示";

int a=123,b=456;

Console::WriteLine("A="+a+" B="+b);
Console::WriteLine("A+B="+(a+b));
Console::WriteLine("A-B="+(a-b));
Console::WriteLine("A*B="+a*b);
Console::WriteLine("A/B="+(double)a/b);
return 0;
}
//入力したコード
973デフォルトの名無しさん:2008/07/05(土) 18:57:52
>>969
こういうことだから理解してくれ

ブレークポインタ使うならF5
ブレークポインタ使わないならCtrl+F5
974デフォルトの名無しさん:2008/07/05(土) 19:07:34
>ブレークポインタ
975デフォルトの名無しさん:2008/07/05(土) 20:06:51
gccかC99で関数のルートアドレス?だか返す
マクロあったけど名前思い出せない

たじけて
976デフォルトの名無しさん:2008/07/05(土) 20:52:06
聞くは一時の恥、知らぬは一生の恥というので聞かせてもらう・・・・

ルートアドレスって何?
977デフォルトの名無しさん:2008/07/05(土) 20:53:27
関数の呼び出し元の関数のアドレスのことじゃね?
978デフォルトの名無しさん:2008/07/05(土) 20:54:55
聞くは一時の恥、聞かれるは一生の不覚
979デフォルトの名無しさん:2008/07/05(土) 20:57:59
なんか違う
980デフォルトの名無しさん:2008/07/05(土) 22:01:56
std::cout等を使うクラスを定義する場合は
宣言上部でusing namespace std;するのが流儀?
981デフォルトの名無しさん:2008/07/05(土) 22:03:37
毎回 std:: を付ける流儀
982デフォルトの名無しさん:2008/07/05(土) 22:03:56
>>980
自分だけでやってるならアリかもしれないが
複数人で何かを作るのならやめておいたほうがいい
983デフォルトの名無しさん:2008/07/05(土) 22:06:19
ヘッダのグローバルスコープでusingしなければなんでもいいよ。
984デフォルトの名無しさん:2008/07/05(土) 22:13:26
関数内でusing

void f(){
  using namespace std;
  ...
}
985デフォルトの名無しさん:2008/07/05(土) 23:40:46
基本クラスCObjectで作った新しいクラスの中で元のダイアログウィンドウを塗りつぶしたいんですが
どうやって指定すればいいんですか?

CWnd* myPICT=GetDlgItem( IDD_RS232C_TEST_DIALOG );
CClientDC myDC( myPICT );

CRect myRECT;
myPICT->GetClientRect( myRECT );

CPen penBlack( PS_SOLID, 1, RGB(0,0,0) );
CPen* oldPEN=myDC.SelectObject( &penBlack );

CBrush myBrush;
CBrush* oldBrush;

myBrush.CreateSolidBrush( RGB(128,128,128) );
oldBrush=myDC.SelectObject( &penBlack );

dc.Rectangle( myRECT );
myDC.SelectObject( oldPEN );
myDC.SelectObject( oldBrush );
986デフォルトの名無しさん:2008/07/06(日) 00:39:20
その質問で困っていることを分かってもらおうとするのは無茶だろw
987デフォルトの名無しさん:2008/07/06(日) 01:37:07
すいません、'GetDlgItem' : 関数に 1 個の引数を指定できません。
というエラーです。

988デフォルトの名無しさん:2008/07/06(日) 01:40:25
誰か次スレお願い。
俺無理だった。
989デフォルトの名無しさん:2008/07/06(日) 01:49:22
>>987
IDD_ってダイアログリソースのIDだろ?
DialogBox()かCreateDialog()でしか使えないよ。

GetDlgItem()は対象のウィンドウ内の
子ウィンドウ(ボタンやテキストボックス)のハンドルを取得するためのもの。

CWndを継承してないのなら、
第一引数にウィンドウハンドルを渡す必要がある ::GetDlgItem(HWND, int)
を呼ぶことになる。

今のソースでは根本的に無理だと思うので、
入門書やネットでダイアログの基本的な使い方を見た方がいい。
990デフォルトの名無しさん:2008/07/06(日) 02:02:38
なるほど、がんばってみます。どうもです。
組込Cと比べてC++は地獄ですね
991デフォルトの名無しさん:2008/07/06(日) 02:15:26
C++というかVC++じゃ
992デフォルトの名無しさん:2008/07/06(日) 02:15:50
いや、VC++というよりMFCだなw
993デフォルトの名無しさん:2008/07/06(日) 02:15:53
言語とOSとシステムコールの違いも勉強しなきゃだね。
994デフォルトの名無しさん:2008/07/06(日) 02:16:26
あ、CWndの話が出てるのは後側だけか
995デフォルトの名無しさん:2008/07/06(日) 02:18:43
次スレ〜
996デフォルトの名無しさん:2008/07/06(日) 02:23:23
俺が立ててこよう
997デフォルトの名無しさん:2008/07/06(日) 02:25:29
【初心者歓迎】C/C++室 Ver.56【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1215278693/

ありがたく使え。
998デフォルトの名無しさん:2008/07/06(日) 02:31:59
>>997
999デフォルトの名無しさん:2008/07/06(日) 02:32:20
>>997
調子に乗るな



























でも乙
1000デフォルトの名無しさん:2008/07/06(日) 02:33:19
1000ならC/C++消滅
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。