【初心者歓迎】C/C++室 Ver.55【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/06/15(日) 03:03:42ただしその場合、質問者は必ず環境を書きましょう。
※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
0002デフォルトの名無しさん
2008/06/15(日) 03:04:160003デフォルトの名無しさん
2008/06/15(日) 03:08:010004デフォルトの名無しさん
2008/06/15(日) 03:23:260005デフォルトの名無しさん
2008/06/15(日) 03:25:080006デフォルトの名無しさん
2008/06/15(日) 08:42:21俺はどっちでもおk派。VCに貼り付けてCtrl + spaceで一発解決w
0007デフォルトの名無しさん
2008/06/15(日) 11:24:40 は思いつかなかったな〜
ちょっとてst
>>6
まぁでもコピペすらしない人多いと思うよw
00087
2008/06/15(日) 11:30:45f();  
f();
f(); 	
0009デフォルトの名無しさん
2008/06/15(日) 11:40:370010デフォルトの名無しさん
2008/06/15(日) 11:54:36   f();  
f();  
	f(); 	
■>>8を素のIE/禁断の壷+IEで表示及びコピペした場合
の部分が潰れずに空白になる。コピペしても通常の半角空白。
他は潰れて消える。
■>>8をjaneで表示及びコピペした場合
 の部分が潰れずに空白になる。コピペしても通常の半角空白。
の部分はjane上では潰れずに空白になるけど、
コピペすると空白にならず、  になる。
&am;#9;は潰れて消える。
通常/専用ブラウザで読みやすくするのは全角スペースしかなさげ。
コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜
0011デフォルトの名無しさん
2008/06/15(日) 12:01:42そういうスレを見てきた立場からすると「どうでもいいじゃん」って思ってしまう。
0012デフォルトの名無しさん
2008/06/15(日) 12:19:05見てきたけど、Haskellスレでは全角スペース推奨、
Python宿題スレはロダ推奨で、全角スペースが使われてて、
Python初心者スレでは全角スペース(主に質問者)と が使われてるね。
0013デフォルトの名無しさん
2008/06/15(日) 12:43:48乙
> 通常/専用ブラウザで読みやすくするのは全角スペースしかなさげ。
も表示だけなら潰れない、と読めたのだが気のせい?
> コピペしてすぐコンパイル出来るのも含めると、アップローダーしか無いね〜
これはそのようだね
0015デフォルトの名無しさん
2008/06/15(日) 14:46:16メール欄に pre と書くと pre タグが使われるようにする奴。
0016デフォルトの名無しさん
2008/06/15(日) 14:53:460017デフォルトの名無しさん
2008/06/15(日) 15:40:57b=a;
と
a=b=c;
って同じことですか?
0018デフォルトの名無しさん
2008/06/15(日) 15:45:130019デフォルトの名無しさん
2008/06/15(日) 15:48:08b=a=c;だな
0020デフォルトの名無しさん
2008/06/15(日) 15:54:450021デフォルトの名無しさん
2008/06/15(日) 16:10:05b=a=c;⇔b=(a=c);
でも
a=cが、aにcを代入した後のものを返すか、それ以前のaを返すかは未定。
0022デフォルトの名無しさん
2008/06/15(日) 16:13:30どう違うのか教えて欲しいです
0023デフォルトの名無しさん
2008/06/15(日) 16:15:14基本的には同じと思っていいよ
ただ、それに囚われていちゃダメ
C++ならoperatorでやりたい放題だし
0024デフォルトの名無しさん
2008/06/15(日) 16:15:3820じゃないけど、
「ユーザー定義型のoperator=()の戻り値が、必ずしも*thisになってるとは限らない」
というのを考慮してるのでは。
0025デフォルトの名無しさん
2008/06/15(日) 16:16:570026デフォルトの名無しさん
2008/06/15(日) 16:34:24a=c; b=a; はaに対してwriteとreadが1回ずつ発生するが、
b=a=c; はaからreadする保証が無い。
ってことか?
0027デフォルトの名無しさん
2008/06/15(日) 17:42:390028デフォルトの名無しさん
2008/06/15(日) 17:46:39できるよ。
以上。
↓次の方どうぞ
0029デフォルトの名無しさん
2008/06/15(日) 17:47:38何を言っとるんだお前は
0030デフォルトの名無しさん
2008/06/15(日) 17:51:54代入した値、つまりはcと同じ
を返すに決まってるだろ個の貸す
0031デフォルトの名無しさん
2008/06/15(日) 18:08:16CかC++ベースでGUIプログラムを作るにはどうすればいいのでしょうか?
幅広く使用されている方法が望ましいです。
0032デフォルトの名無しさん
2008/06/15(日) 18:10:03directXのラッパーライブラリあたりでも使えばいいんじゃない?
dxlibとかyanesdkとか
あとSDLとかでも
0033デフォルトの名無しさん
2008/06/15(日) 18:30:44論理上保障されないという事態が起きるのは、
bがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。
スレッドが絡むとさらにカオスになるから触れないでおこう。
それ以外では気にすることではない。
0034デフォルトの名無しさん
2008/06/15(日) 18:31:51aがスタティックな変数でかつ割り込みが発生してaを書き換えた場合だけ。
ミスった
0035デフォルトの名無しさん
2008/06/15(日) 18:43:22組み込み系の話だけど。
0036デフォルトの名無しさん
2008/06/15(日) 18:46:45実現できない場合があるな
0037デフォルトの名無しさん
2008/06/15(日) 18:47:03VC++2008の場合はvolatile bでbからロードしなおしていた
0038デフォルトの名無しさん
2008/06/15(日) 18:58:25どもども、調べてみます。DirectXが王道ですかね
0039デフォルトの名無しさん
2008/06/15(日) 19:06:230040デフォルトの名無しさん
2008/06/15(日) 19:12:25今はまだ皆さんの回答の意味が理解できなさそうなのでとりあえず
a=b=cじゃなくてb=a=cだったら
同じことではないけどだいたい同じ
とだけ覚えておきます
ありがとうございました
0041デフォルトの名無しさん
2008/06/15(日) 19:19:210042デフォルトの名無しさん
2008/06/15(日) 19:23:01まー、俺は=演算子を1行に複数に書くこと自体やらないが
0043デフォルトの名無しさん
2008/06/15(日) 19:42:15環境はWindowsXP,言語はCです.
system関数(またはそれに近い関数)を使って別のプログラムを時間制限付きで起動させたいです
例えば,a.exeというプログラムを実行させて,30秒たっても処理が完了していなかったらa.exeを強制終了させたいです.
なにか良い方法はありますか
0044デフォルトの名無しさん
2008/06/15(日) 19:50:17CreateProcess / TerminateProcess
0045デフォルトの名無しさん
2008/06/15(日) 20:56:40内容にもよるけど、行儀のいい方法では無いな。
0046デフォルトの名無しさん
2008/06/15(日) 21:40:580047デフォルトの名無しさん
2008/06/15(日) 21:43:400049デフォルトの名無しさん
2008/06/15(日) 22:25:59強制終了って前提条件が既に行儀悪いからな。
0050デフォルトの名無しさん
2008/06/15(日) 23:16:20俺はそう思ったけど。
0051デフォルトの名無しさん
2008/06/15(日) 23:18:47少しはマシかな。
0052デフォルトの名無しさん
2008/06/16(月) 02:23:19このポインタについてなんですが
p->nextには何のアドレスも入ってないのに
何で次の人のアドレスを指し示すことができるんでしょうか?
あるいはどこかでp->nextに何かの値が入ってるんでしょうか?
0053デフォルトの名無しさん
2008/06/16(月) 02:23:19このマクロの(type*)0->memberはどういう意味なのでしょうか?
0番地のtype型のメンバ変数memberでよいのでしょうか?
0054デフォルトの名無しさん
2008/06/16(月) 02:28:41そのとおりなんだけど、実際にはそんなものは存在しなくて、直後にアドレスを size_t に
無理やり変更することで offsetof() が返すべき値を取り出している、というところまで
合わせて意味を持つ。コンパイラの実装を知っている立場でなければ、真似しちゃいけない。
0055デフォルトの名無しさん
2008/06/16(月) 02:35:18よく読んでないけど last->next=p で入れてるんじゃね
0056デフォルトの名無しさん
2008/06/16(月) 03:40:04last->next=p;
last=p;
と分ければわかりやすいでしょうか。
0057デフォルトの名無しさん
2008/06/16(月) 11:50:32ありがとうございます
もう少しで分かりそうなんでもうちょっと頑張ります
0058デフォルトの名無しさん
2008/06/16(月) 16:11:09ヘッダで宣言したメンバ関数を.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宣言すると消えます。これはどういう問題なのでしょうか。
005958
2008/06/16(月) 16:12:37public
のあとに:が抜けてました。
実際のコードではそういったミスはありません。
0060デフォルトの名無しさん
2008/06/16(月) 16:17:19現象を再現できる最低限の断片を作って張ってくれ。
尤も、その過程で原因が判ることもしばしばだが。
例えば、getA()がエラーにならないのは使ってないからじゃないかと思うが>58だけでは判断できん。
006158
2008/06/16(月) 16:33:55すみませんが今すぐは作れないので、後でまた張りに来たいと思います。
0062デフォルトの名無しさん
2008/06/16(月) 17:23:38が発生した場合、それをC側から補足できますでしょうか?
例外が発生したことを上の関数に返したいのですが
難しいでしょうか?
よろしくお願いいたします。
0063デフォルトの名無しさん
2008/06/16(月) 17:42:36Windowsの話なら、WinAPIスレで過去に話題になってたかと。
0064デフォルトの名無しさん
2008/06/16(月) 17:48:36ありがとうございます。APIスレにいってきます。
006558
2008/06/16(月) 19:27:04色々やってたら解決しました。
どうも元々ひとつだったヘッダファイルを細分化したときに、makefileの方で変なことをやってしまったのが原因ぽいです。
どうもありがとうございました。
0066デフォルトの名無しさん
2008/06/16(月) 20:05:22なにかの略なんですか?
0067デフォルトの名無しさん
2008/06/16(月) 20:07:000068デフォルトの名無しさん
2008/06/16(月) 20:10:530069デフォルトの名無しさん
2008/06/16(月) 20:13:030070デフォルトの名無しさん
2008/06/16(月) 20:15:12ユーザーが自由に使えるものがiからしかなかったのがそもそもの由来。
0071デフォルトの名無しさん
2008/06/16(月) 20:17:04n
Σa_i
i=1
とか数学で使う際の i って
FORTRAN 以降で広まったものなのか?
0072デフォルトの名無しさん
2008/06/16(月) 20:22:38I,J,K,L,M,Nあたりが宣言なしで整数、
それ以外が宣言なしで実数だった。
0073デフォルトの名無しさん
2008/06/16(月) 20:24:290074デフォルトの名無しさん
2008/06/16(月) 20:56:52まさか。
もっと昔から使われてるよ。
0075デフォルトの名無しさん
2008/06/16(月) 20:57:14そもそも整数がその範囲に割り当てられた理由もあるんじゃね?
0076デフォルトの名無しさん
2008/06/16(月) 20:57:48ですよねー。
0077デフォルトの名無しさん
2008/06/16(月) 20:58:55イテレーションによく使われていた i から始まり、
整数値としてよく使われていた n までを整数にした、
と考えるのが自然な気がするよ。
0078デフォルトの名無しさん
2008/06/16(月) 22:10:580079デフォルトの名無しさん
2008/06/16(月) 22:16:350080デフォルトの名無しさん
2008/06/16(月) 22:17:570081デフォルトの名無しさん
2008/06/16(月) 22:24:200082デフォルトの名無しさん
2008/06/17(火) 01:00:56- /usr/local/lib/libFOO.a
- bar.cxx
の2つがあり、bar.oとlibFOO.aを合体させて、
libbar.soというのを作りたいと思っています。
(libFOO.aも共有ライブラリの中に組み込んでしまいたい)
この場合、
$ g++ bar.cxx -o bar.o
したあとに、どのようにすれば良いのでしょうか。
0083デフォルトの名無しさん
2008/06/17(火) 01:23:06008482
2008/06/17(火) 01:23:16色々なライブラリを必要に応じて読み込むソフトがありまして、
そいつに自作のライブラリを読み込ませるためには、
必ず共有ライブラリじゃないと駄目なんです。
なので、libFOO.aを読み込ませる場合には、
一回自分で共有ライブラリを作らないといけない、と。
0085デフォルトの名無しさん
2008/06/17(火) 01:32:25分かりました、マニュアルを読んでくさい
0086デフォルトの名無しさん
2008/06/17(火) 04:26:59http://www.google.com/search?q=共有ライブラリ gcc
0087デフォルトの名無しさん
2008/06/17(火) 08:39:42HしてもIがなかったらJuniorが生まれてこないとは考えんのかね。
0088デフォルトの名無しさん
2008/06/17(火) 12:57:29望まれないJuniorっていう不幸もあるからなぁ
0089デフォルトの名無しさん
2008/06/17(火) 13:19:320090デフォルトの名無しさん
2008/06/17(火) 13:21:140091デフォルトの名無しさん
2008/06/17(火) 19:06:29あるクラスのメンバ関数を実装するとき、内部の処理をベタ書きすると
長くなるので、関数化したいことは良くあると思います。
このとき、その関数化したい処理そのものは、もとのメンバ関数の処理に比べて
低級な処理なので、同じクラスのメンバ関数として定義するのには違和感があります。
かといって、専用のクラスを作るほどではないと感じる場合があります。
こういう場合、どういった形で関数を定義するべきでしょうか。
例えば、積分をするためのループ処理1ステップ分を関数化して切り出したい場合などです。
0092デフォルトの名無しさん
2008/06/17(火) 19:07:380093デフォルトの名無しさん
2008/06/17(火) 19:09:350094デフォルトの名無しさん
2008/06/17(火) 19:14:420095デフォルトの名無しさん
2008/06/17(火) 19:31:17C言語の本を買ったのですがサンプルソースのあるページにアクセスできません?
アク禁になっているのか知りたいので他の人アクセスできるか試してもらえませんか;;
0096デフォルトの名無しさん
2008/06/17(火) 19:42:58自分専用ライブラリを放り込んでおく場所を決めておくと良いよ。
0097デフォルトの名無しさん
2008/06/17(火) 19:43:160098デフォルトの名無しさん
2008/06/17(火) 19:47:50こんなときこそあれだ
http://web.archive.org/web/20060423121809/www.cmagazine.jp/src/index.html
0099デフォルトの名無しさん
2008/06/17(火) 20:01:15そのサイトもアクセスできません・・・。
スレ違いですが質問させてください。
代わりにソースプログラムを配布しているサイトご存じないですか?
0100デフォルトの名無しさん
2008/06/17(火) 20:03:59文字コードは EUC な。
0101デフォルトの名無しさん
2008/06/17(火) 20:10:42ダウンロードできました!!
ありがとうございます><
0102デフォルトの名無しさん
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;
}
0103デフォルトの名無しさん
2008/06/17(火) 21:00:42public:
NoCopy(int){}
private:
NoCopy(const NoCopy &);
};
class Hoge{
public:
operator NoCopy(){
return NoCopy(i);
}
};
int main(){
Hoge h();
h.operator NoCopy(); //エラー!
return 0;
}
0104デフォルトの名無しさん
2008/06/17(火) 21:05:33引数無しでHoge型を返す関数のプロトタイプ宣言
0105デフォルトの名無しさん
2008/06/17(火) 21:25:32何をしたいのか理解に苦しむけど、リファレンス返すのはどう?
#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();
}
0106デフォルトの名無しさん
2008/06/17(火) 23:37:20キャスト演算子が必ずコンストラクタを2回呼ぶのが気に食わなかっただけです
使い捨て一時オブジェクトのためにポインタ持たせたくないし、
直接関数呼び出しするくらいなら普通のメンバ関数にしようと思います
ありがとうございました
0107デフォルトの名無しさん
2008/06/17(火) 23:39:17これをFILE構造体に変える方法ってありますか?
VC2008exp使ってます。
0108デフォルトの名無しさん
2008/06/17(火) 23:42:44最適化してるか?
0109デフォルトの名無しさん
2008/06/17(火) 23:51:36「FILE メモリストリーム」でググってみれば?
0110デフォルトの名無しさん
2008/06/17(火) 23:55:39してますけど、どちらかというと精神的な問題なので
でも規格読むとstatic_castでキャスト演算子呼ぼうとすると
一時オブジェクト作るのに絶対コピーコンストラクタ使うらしいので諦めました
0111デフォルトの名無しさん
2008/06/17(火) 23:58:030112デフォルトの名無しさん
2008/06/17(火) 23:59:45戻り値最適化の話なんだけど。
0113デフォルトの名無しさん
2008/06/18(水) 00:05:36戻り値最適化効いた結果が2回だと思ったんですけど
0114デフォルトの名無しさん
2008/06/18(水) 00:10:520115デフォルトの名無しさん
2008/06/18(水) 00:21:39struct 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&)
って表示された
0116デフォルトの名無しさん
2008/06/18(水) 00:24:16Release ビルドでもそうなる?
0117デフォルトの名無しさん
2008/06/18(水) 00:26:42Visual Studio 2005、C++言語でファイルストリームを用いたファイル入出力について質問させてください。
ifstream fin("test.txt");
のように相対パスで指定した場合は正常にファイルが開かれるのですが、
ifstream fin2("C:\\Documents and Settings\\ORESAMA\\デスクトップ\\test.txt");
と絶対パスで指定するとファイルが開けません。
(ちなみに、C言語風にfopen()を用いた場合は絶対パス指定でもファイルオープン出来ました。)
これはどのような原因が考えられ、またどのように対処すれば良いかご教授頂けないでしょうか。
何卒よろしくお願いします。
0118デフォルトの名無しさん
2008/06/18(水) 00:27:40規格上はこっちが正しいんじゃないのかしら
0119デフォルトの名無しさん
2008/06/18(水) 00:28:070120デフォルトの名無しさん
2008/06/18(水) 00:29:25最適化レベルあげてみてもだめ?
規格上は、コピーコンストラクタを省略できる所は省略していいって仕様が別の所に書いてある。
すげー分かりにくいけど。
0121デフォルトの名無しさん
2008/06/18(水) 00:30:34setlocale(LC_ALL, ""); と書いてみて。
0122デフォルトの名無しさん
2008/06/18(水) 00:31:090123デフォルトの名無しさん
2008/06/18(水) 00:40:17最適化設定色々いじくってみたがどうやっても2回呼ぶようだ
0124デフォルトの名無しさん
2008/06/18(水) 00:43:13VC++ の限界なのかね。
0125117
2008/06/18(水) 00:46:30即レスありがとうございます。
仰る通り試してみたところファイルは問題なくオープンできるようになりました。
しかし、setlocale()より後ろで
cout << "abcde\\あいうえお";
のように日本語の文字列を出力させようとすると、abcde\までが出力されて、プログラムが終了してしまいます。
何度も申し訳ありませんが、どうかご教示お願い申し上げます。
0126デフォルトの名無しさん
2008/06/18(水) 00:50:27VC++8.0以降はfstreamはワイド文字版のファイル名を受け付けるよ
0127デフォルトの名無しさん
2008/06/18(水) 00:51:510128デフォルトの名無しさん
2008/06/18(水) 00:54:25グローバルロケールを弄る必要も無いのが利点
難点は移植性がないことなので、気になるんならboostの力を借りるんだね
0129デフォルトの名無しさん
2008/06/18(水) 00:57:180130デフォルトの名無しさん
2008/06/18(水) 00:59:08Win98もサポートするとかなら別だけど
0131デフォルトの名無しさん
2008/06/18(水) 01:03:15VC++8.0以降だとcodecvt<>もわりとまともに動くと思うので
string->wstring変換が簡単に書けるが
codecvt<>で使ってるmbstate_tって、一応標準のクセに
標準的な初期化手段すら定められていないという恐ろしい状態だったように思う
「VC++では」
mbstate_t mbs = { 0 };
で初期化できるはずだけど
0132117
2008/06/18(水) 01:09:50せっかくレス頂いたのに文字フォーマットなどの知識が足りないようで今イチ理解できてません。
皆さんのレスを見る限り今の私にはとても難しそうなので、おとなしくfopen()を使いたいと思います。
こんな初心者の質問につきあって頂き、ありがとうございました。
0133デフォルトの名無しさん
2008/06/18(水) 01:21:05バイト列からストリームで入出力する方法はわかるんですけどね。
知りたいのはFILE構造体を入力として受け付けるライブラリに
別のアーカイブライブラリからの出力であるバイト列をぶち込む方法なんです。
やっぱり前者のほうを書き換えるしかないのかな……。
0134デフォルトの名無しさん
2008/06/18(水) 02:05:23パイプでも使えばいいんじゃないの?
pipeで作って、FILE*が必要なほうにはfdopenして。
0135デフォルトの名無しさん
2008/06/18(水) 02:10:41そのとき、いったいどんなエラーメッセージが出てくるの?
0136デフォルトの名無しさん
2008/06/18(水) 02:15:58C++ならstd::locale::global(std::locale(""));使ってあげてください。
中でsetlocaleも呼ぶので心配しなくて平気。
0137デフォルトの名無しさん
2008/06/18(水) 02:42:14バグかと思ってたんだけど、仕様らしい。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146870
めんどくさいけど標準ライブラリにマルチバイト文字を処理させようと思ったら
プログラム起動時に std::locale::global(std::locale("")) しとくのが正解みたい。
0138デフォルトの名無しさん
2008/06/18(水) 03:48:48全体の設定はデフォルトのまま"C"にしておく。
std::locale::global(std::locale("C"))
iostream系を使う場合は個々にロケールを設定する。
std::wcout.imbue(std::locale(""))
std::wcin.imbue(std::locale(""))
VC++2008では確認した限り直ってる
0139デフォルトの名無しさん
2008/06/18(水) 10:13:21ctype以外のカテゴリをグローバルロケールに設定なんてしたくないよ
sstreamの数値フォーマッティングとかにまで影響があるし
やるならctypeだけに絞る
どっちみちWin32ならファイル名はUTF-16なんだから
ファイル名はUTF-16で扱っとかないと、「とりあえず日本語のファイルが開ける」
ようになるだけじゃん
014091
2008/06/18(水) 12:57:25色々方法はあることがわかりました。
オブジェクト指向的にどれが正しいか…と考えるとよくわからなくなってしまいます。
privateメンバの中に書いてしまう方式で行こうかと思っています。
0141デフォルトの名無しさん
2008/06/18(水) 13:39:48なるほど。
ありがとう、やってみる。
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が代替してくれてると思っていいのかな?
0142デフォルトの名無しさん
2008/06/18(水) 16:55:20> するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
そういうこと。
_open_osfhandleの説明には、_closeが中でCloseHandleする、
_fdopenではfcloseが中で_closeすると書いてある。
あと、_open_osfhandleと_fdopenでモードの指定が食い違っているのと、
_open_osfhandleでのハンドルの型は、longではなく
intptr_t(またはINT_PTR)になっているということが気になった。
0143デフォルトの名無しさん
2008/06/18(水) 17:13:35class 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も消えるのではと思うのですが、そうなっていないようです。
私の考えのどこが間違っているでしょうか。よろしくお願いします。
0144デフォルトの名無しさん
2008/06/18(水) 17:24:12setilの中では、iからilへ値がコピーされている。
0145デフォルトの名無しさん
2008/06/18(水) 17:24:59中身をクリアするわけじゃない。
直後に i を参照すれば、その間に何の処理も行われないからメモリ上は前の値が残っている。
それを参照しているだけ。
いつどのタイミングで、このiの値が書き換えられるかは、誰にも予想できない。
0146デフォルトの名無しさん
2008/06/18(水) 17:26:08144のいうとおりだった。
145は早とちり。
0147143
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が消えるまで生き残るということですよね?
うーん、ややこしい気がする…。
0148143
2008/06/18(水) 17:35:560149デフォルトの名無しさん
2008/06/18(水) 17:58:20> void setil(int &i){*il=i;}
初期化してないポインタ il が指す場所に値を入れてるのでダメ。
0150デフォルトの名無しさん
2008/06/18(水) 18:58:58どうやらポインタのほうも理解していないようなので、
まずポインタとメモリの動的確保をきっちり勉強したほうがいいね。
0151デフォルトの名無しさん
2008/06/18(水) 20:19:580152デフォルトの名無しさん
2008/06/18(水) 20:20:520153デフォルトの名無しさん
2008/06/18(水) 20:45:480154デフォルトの名無しさん
2008/06/18(水) 22:06:290155デフォルトの名無しさん
2008/06/18(水) 22:07:42memcpy の規格には領域が重なってるときは未定義ってことしか書いてないけど・・・。
0156デフォルトの名無しさん
2008/06/18(水) 22:10:46結構文句きてたんだろうな。
0157デフォルトの名無しさん
2008/06/18(水) 22:22:310158デフォルトの名無しさん
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に値を代入できる関数です。
何卒よろしくおねがいします。
0159デフォルトの名無しさん
2008/06/19(木) 01:20:120160デフォルトの名無しさん
2008/06/19(木) 01:23:230161デフォルトの名無しさん
2008/06/19(木) 01:29:13ttp://mecab.sourceforge.net/libmecab.html の最後のほうのコンパイル方法の
>% cl -DDLL_IMPORT -I. example.c libmecab.lib
がわからなくて導入さえ出来ません
ど素人丸出しな質問で申し訳ありませんがどういう意味なのか教えてください
0162デフォルトの名無しさん
2008/06/19(木) 01:30:10#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;
}
0163デフォルトの名無しさん
2008/06/19(木) 01:33:00マイクロソフトのコンパイラが必要だよ
VC Expressでもいれるといい
0164158
2008/06/19(木) 01:47:26素早い回答ありがとうございます。
しかし、実行してみたら動作に疑問がありましたので、
さらにもう一点よろしいでしょうか?
結果が
000
001
002
003
...
と期待通りなのですが、
最後が
149
で終わってしまい、
hoge_max[0]まではカウンタが回ってくれません。
単純にhoge_max[0]を1多く設定すればよいのでしょうが、
この点うまくいかないでしょうか?
>>
0165デフォルトの名無しさん
2008/06/19(木) 01:56:10delete this;
ってアリなんでしょうか。
もちろん、delete thisはその関数の末尾に置かれており、
それ以後、開放したインスタンスにアクセスすることはありません
0166デフォルトの名無しさん
2008/06/19(木) 01:56:49コンストラクタ、デストラクタ、コピーコンストラクタ、代入演算子のほかに
これは必ず定義しておいた方が良いものってありますか?
0167デフォルトの名無しさん
2008/06/19(木) 01:58:38自動変数としてインスタンスを生成することはないものとします
0168デフォルトの名無しさん
2008/06/19(木) 01:59:080169デフォルトの名無しさん
2008/06/19(木) 02:05:22普通はやらないけど別にdelete this自体はしてもいいと思うよ
0170デフォルトの名無しさん
2008/06/19(木) 02:11:42レスありがとうございます
ゲーム作ってて、キャラクターにAIクラスへのポインタを持たせて、
AIクラスを切り替えることで、行動を制御しようと思っています。
AIクラスを切り替える場合に、新しいAIクラスを作った後、今までのAIクラスを消す必要があったので、
delete thisするのが適当かな、と思ったのです
0171デフォルトの名無しさん
2008/06/19(木) 02:13:500172デフォルトの名無しさん
2008/06/19(木) 02:15:340173デフォルトの名無しさん
2008/06/19(木) 02:19:01キャラクターは毎フレームAIクラスのメンバ関数を呼び出し続けるだけ
こんな感じで this->AI.update(this)
0174デフォルトの名無しさん
2008/06/19(木) 02:21:50this->AI->update(this)
ですね
0175デフォルトの名無しさん
2008/06/19(木) 02:29:23「クラスによる」「プログラムによる」という当たり前のことがまず前提としてあって、
その上で定番的なものを挙げるなら、operator==()、operator<()、operator!()、あたりかなぁ。
0176デフォルトの名無しさん
2008/06/19(木) 02:32:50実行してみたけどコードは読んでない?
答え書くのは簡単だけど、ちょっとは考えてみようや。
最後までループが回らないというのであれば、ループの判定箇所になにかある、と考えてみる
>>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]まで回らないんだから
0177デフォルトの名無しさん
2008/06/19(木) 02:55:40なぜそこまでAIにやらせたがるのかわからないけど、
新しいAIの最初の仕事を、古いAIの削除にするとかどうかな
0178デフォルトの名無しさん
2008/06/19(木) 09:08:45それ、 AI が中で delete this したらキャラクタが持ってるポインタ AI を更新しないと
いけないはずなんだけど、どうなってるんだ?
0179158
2008/06/19(木) 09:19:20あ。。こう書かれたらわかりました。
ありがとうございます。
0180デフォルトの名無しさん
2008/06/19(木) 09:26:120181デフォルトの名無しさん
2008/06/19(木) 10:12:26各AIは、キャラクタへのポインタを持っていて、
今のAIが次のAIを作成、キャラクタのAIを次のAIに変更して、AIは自殺
ってことだよね?何も問題ないかと。
0182デフォルトの名無しさん
2008/06/19(木) 10:17:08enumとかはnamespaceに閉じ込められるんでしたっけ?
0183デフォルトの名無しさん
2008/06/19(木) 10:17:17auto変数として呼び出したとき危険じゃない?
0184デフォルトの名無しさん
2008/06/19(木) 10:20:450185デフォルトの名無しさん
2008/06/19(木) 10:21:130186デフォルトの名無しさん
2008/06/19(木) 10:26:20見落としてた
あとはnew[]でインスタンスを生成したときも危ない罠
0187デフォルトの名無しさん
2008/06/19(木) 11:11:03基数変換の簡単なやつといわれたんだかさっぱり・・・
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];
0188デフォルトの名無しさん
2008/06/19(木) 11:12:13printf("変換元の基数を入力して下さい\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;
}
}
}
0189デフォルトの名無しさん
2008/06/19(木) 11:12:310190デフォルトの名無しさん
2008/06/19(木) 11:12:55a /= 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;
0191デフォルトの名無しさん
2008/06/19(木) 11:13:33printf("%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;
}
}
0192デフォルトの名無しさん
2008/06/19(木) 11:16:26new [] が危ないなら new(std::nothrow) とか new(std::nothrow) [] とかも危ないな。
コンストラクタ(コピー〜も含めて全部)を private にすればいいんだけどね。
0193デフォルトの名無しさん
2008/06/19(木) 12:38:52遅ればせながら多謝。
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ってなんか制限あるんだろうか?
0194デフォルトの名無しさん
2008/06/19(木) 12:42:200195デフォルトの名無しさん
2008/06/19(木) 13:34:57Σ(゚д゚|||)
もうおとなしくテンポラリファイル用意するかな・・・・・・。
0196デフォルトの名無しさん
2008/06/19(木) 22:51:12例えば
std::list<point> points 点列リスト
std::list<point>::iterator itr = points.begin() とりあえず最初に合わせる
Vec::Vec(point1,point2) 2点から成るベクトルを作成する、Vecクラスのコンストラクタ
このとき
Vec v1(*itr, *++itr)
とかすると、最初の*itrまでインクリメントされてしまいます。
ダミーのiteratorを用意するくらいしか思いつかないのですが、他に方法はあるでしょうか。
0197デフォルトの名無しさん
2008/06/19(木) 22:56:20itr++;
Vec v1(*itr0, *itr);
ダミーって。
0198デフォルトの名無しさん
2008/06/19(木) 22:57:20検索してみても出てくるのは簡単な使い方ばかりで、まとまったものが見つかりません。
リファレンスのようなものが見たいです。
お願いします。
0199デフォルトの名無しさん
2008/06/19(木) 22:59:34規格書、思う存分知り尽くすがいい
0200デフォルトの名無しさん
2008/06/19(木) 23:02:03検索してもヒットするのはさらっとソースコードが書かれているだけのページばかりで、
いろはがまったく解りませんでした。
0201デフォルトの名無しさん
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型の配列に参照渡しが可能な理由というのはなんなのでしょうか?
配列にはアドレスを参照渡しできると考えていいんでしょうか?
返信宜しくお願いします。
0202デフォルトの名無しさん
2008/06/19(木) 23:03:52やはりそれが常識的な方法ですか。
普通のリスト構造の*nextポインタを使って *(itr.next)みたいにできる方法があるかなーというイメージでした。
その方法でやりたいと思います。どうもありがとうございました。
0203デフォルトの名無しさん
2008/06/19(木) 23:10:12配列を保持している変数の実体は、配列の先頭要素のアドレス。
つまり、int型の配列はアドレスを意味しているため、型が合っているので渡せる。
その場合であれば、
double avg(int t[]){} ≒ double avg(int *t){} になる。
0205デフォルトの名無しさん
2008/06/19(木) 23:21:31関数の引数で配列を宣言すると、それはポインタの宣言になる。
規格書の 6.7.5.3 の 6 にこう書かれている。
> A declaration of a parameter as ``array of type'' shall be adjusted to ``pointer to type''
0206201
2008/06/19(木) 23:30:13どうも!
なるほど、だから double avg(int t[]){} ≒ double avg(int *t){}
ポインタを利用したものに変換できるんですね。
0207デフォルトの名無しさん
2008/06/19(木) 23:35:030208デフォルトの名無しさん
2008/06/19(木) 23:54:12常識的つーか、引数の評価順が不定だからそうしないとやばい。
boost使えるんならboost::next()が使える。
0209デフォルトの名無しさん
2008/06/20(金) 04:11:05別にそんな、「いろは」という程の知識は要らないよ。
だから詳細なサイトとか参考書が見つからない(見つかりにくい)のだと思う。
その「さらっと書かれたソースコード」だけでも、DLL作成に必要なことの多くを
既に説明してしまっているかもしれない。
0210デフォルトの名無しさん
2008/06/20(金) 08:27:55注意だけど配列=ポインタではないからね。
他の人の回答は「関数の引数の場合」という前提だからね。
0211デフォルトの名無しさん
2008/06/20(金) 10:13:33VC++とするが、
$ 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
よめ
0212デフォルトの名無しさん
2008/06/20(金) 10:20:35引数にパラメータ番号をとり、それに応じた返り値を渡すようにするか
パラメータを集めた構造体を返すか
引数に配列やlist、vectorの参照をとって、そこに値を格納させるか
どういう方法が一般的ですか?
0213デフォルトの名無しさん
2008/06/20(金) 10:23:510214デフォルトの名無しさん
2008/06/20(金) 10:35:34アクセサーを渡すとはどういう事でしょうか?
内部ロジックのpublicメンバとして値を引き渡す関数を公開しようと考えていたのですが
それとは別の方法なのでしょうか?
機能追加でパラメーターが変化してしまう可能性があるので
パラメータひとつずつにアクセサ関数を用意するのは避けたいのですが・・・
0215デフォルトの名無しさん
2008/06/20(金) 10:45:05内部ロジックには値を得るためのクラスのインスタンスを渡す関数だけ追加して、
GUIとの調整はそのクラスでやるようにすればいい。
つーか
> 引数にパラメータ番号をとり、それに応じた返り値を渡すようにするか
これこそ「機能追加でパラメータが変化」するたびにif文で切り分けたり
関数テーブルで飛ぶような読みにくいソースを弄ることになると思うんだが。
0216デフォルトの名無しさん
2008/06/20(金) 10:55:20MVCでぐぐれ
0217デフォルトの名無しさん
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; // エラーになる
0218デフォルトの名無しさん
2008/06/20(金) 11:08:39有り難う御座います
パラメータの読み出しを行う中継クラスを用意するのですか
ロジッククラスにパラメータクラスのインスタンスを保有させておいて、GUIにはその参照を渡すようにする
インターフェイスの整合はパラメータクラスとGUIクラスの間で対応する
質問続きで申し訳ありませんが
機能追加があり得るということを考えると、パラメータクラスの基底クラスのポインタを渡すことになりそうですが
この場合はGUI側でキャストして対応、でよいのでしょうか?
参考書や解説サイトではキャストは良くないと言うことですが・・・
0219デフォルトの名無しさん
2008/06/20(金) 11:19:460220デフォルトの名無しさん
2008/06/20(金) 11:27:21ありがとうございます
そういう仕様で行きたいと思います
0221217
2008/06/20(金) 11:28:28ありがとうございます。
同じクラス同士なら別オブジェクトのprivateメンバをいじれてしまうのですね。
なんか気持ち悪いです。
0222デフォルトの名無しさん
2008/06/20(金) 11:34:04機能が増えたら基底クラスを拡張するだろ。常考
0223デフォルトの名無しさん
2008/06/20(金) 12:36:37他のクラスから触れないようにする指定であって、自分の管理下のメンバは触れないと困ると思うけど
自分が管理するんだから同じクラスの他のオブジェクトを受け付けるインターフェースを持たない設計にすればいいだけのことではなくて?
0224デフォルトの名無しさん
2008/06/20(金) 14:26:00WinApiのBitBltってクリッピングしてくれるんですか?
テストコード書いたんですけど、自分でクリッピングしなくても動いてしまったのでちょっと不安です。
0225デフォルトの名無しさん
2008/06/20(金) 14:30:57>>218のやりたいことは恐らく
機能追加はDecorator パターン
値の取得はChain of Responsibility パターン
で解決する予感
0226デフォルトの名無しさん
2008/06/20(金) 20:52:39API は API スレに行くと幸せ
Win32API質問箱 Build67
http://pc11.2ch.net/test/read.cgi/tech/1212931246/
0227デフォルトの名無しさん
2008/06/20(金) 21:00:040228デフォルトの名無しさん
2008/06/21(土) 03:46:42過去のプログラムへの対応はともかく、これから1から作るものに関しては対応しておいた方が良いのでしょうか?
0229デフォルトの名無しさん
2008/06/21(土) 05:26:39Unicodeにかまけて肝心のShiftJIS以外でバグ出してたら世話ないという考え方もある
0230デフォルトの名無しさん
2008/06/21(土) 07:18:29Shift JISに対応してないと困るんだが。
0231デフォルトの名無しさん
2008/06/21(土) 07:24:320232デフォルトの名無しさん
2008/06/21(土) 09:22:19ありがとうございます
試してみます
0233デフォルトの名無しさん
2008/06/21(土) 09:24:40でもstdio.hもヘッダファイルである以上、C言語で書かれてると思ったのですが、
いざ開いて見てみるとよくわからん文字列や関数(?)みたいなののオンパレードだったのですが、
こういう「原動力ファイルを作るための言語及び法則」みたいなのってあるんでしょうか?
それともやっぱあれも純粋なC言語なのでしょうか?
それとも「stdio.hが原動力」という発想が間違ってるのでしょうか?
なんかよくわからん質問ですみません
0234デフォルトの名無しさん
2008/06/21(土) 09:57:35なにもかも間違ってる
0235デフォルトの名無しさん
2008/06/21(土) 10:20:46stdio.h → std io h → standard IO header → 標準入出力用のヘッダ
>それともやっぱあれも純粋なC言語なのでしょうか?
純粋なC言語。
マクロが読めてないだけでは。「C言語 プリプロセッサ」でググッてみ。
0236デフォルトの名無しさん
2008/06/21(土) 10:23:32stdio.hファイル内のプロトタイプ宣言は呪文だ。
#incude<stdio.h>は呪文を発動させるおまじないだ。
0238デフォルトの名無しさん
2008/06/21(土) 10:59:49const intで文字コードの値で使う部分にA〜Zとa〜zに1〜26。
0〜9に27〜36を入れて入力された変位分分ずらして今度はconst charで何番目かを読み
同時に36を越えた場合は、ソノ値から36を引いた値で出すようにしているのですが値が重複してしまう事があるんですが何故なんでしょうか?
0239デフォルトの名無しさん
2008/06/21(土) 11:07:41プログラム言語でおk
0240デフォルトの名無しさん
2008/06/21(土) 11:17:05なんとなくナローイング変換が絡んでそうだが、よくわからんのでソースうp
0241デフォルトの名無しさん
2008/06/21(土) 11:25:50こんな感じに書いて修正したんで、多分動くはずですが・・・
0242デフォルトの名無しさん
2008/06/21(土) 11:38:060243デフォルトの名無しさん
2008/06/21(土) 11:45:510244デフォルトの名無しさん
2008/06/21(土) 11:57:44ざーっと見た感じ暗号化も復号化もそれでできるんじゃね?
0245デフォルトの名無しさん
2008/06/21(土) 11:58:430246デフォルトの名無しさん
2008/06/21(土) 12:22:18C++勉強してて何作ろうか→子供の頃暗号とかつくったなぁ→暗号でぐぐる→ああ、シーザー暗号っていうのやってみようか。ですので
0247デフォルトの名無しさん
2008/06/21(土) 12:42:11勉強の目的は別にして、宿題とかでなく、勉強の派生で興味や趣味からプログラミングをしようとしているんだから、
その過程で発生した問題に対しては手軽に回答を得ようとせずに、いろいろと自分で情報を漁って解決するのが楽しいんじゃないのか?
0248デフォルトの名無しさん
2008/06/21(土) 12:43:29出来てるように見えるんだが。
重複ってもしかしてaChangeCtoIで0になる部分のことか?
ch = aChangeCtoI[quiz[i]]+heni;
↓
ch = aChangeCtoI[quiz[i]]==0 ? 0 : aChangeCtoI[quiz[i]]+heni;
0249デフォルトの名無しさん
2008/06/21(土) 15:11:47ファイル名が日本語の時、エクスプローラで見るとファイル名が文字化けしています。
読み込みも書き込みもちゃんとできるんですが、なぜ文字化けするのでしょう?
環境はWinXPで、VC2008EEを使っています。
0250デフォルトの名無しさん
2008/06/21(土) 15:17:580251デフォルトの名無しさん
2008/06/21(土) 15:18:010252249
2008/06/21(土) 16:43:42>>250
半角のみのファイル名は問題ないのですが、全角が含まれる時に文字化けするのが気になりました。
>>251
ロケールを設定したら文字化けしなくなりました。
0253デフォルトの名無しさん
2008/06/21(土) 18:36:49cinの仕様で文字を入れると延々とループしてしまうのでcharで入力してチェックしようとしたのですが
二桁のchar型の数値を直そうとすると二桁に対応すると一桁がだめに一桁に対応すると二桁がためになってしまうのですが
直すのに何かいい手はないでしょうか?
0254デフォルトの名無しさん
2008/06/21(土) 18:39:24三行目意味がわかんない
0255デフォルトの名無しさん
2008/06/21(土) 18:42:07>>239
0256デフォルトの名無しさん
2008/06/21(土) 18:50:04char in[]=" "; に大して20という文字列を入れて
これを、INTの20として使うにはどうしたらいいんでしょうか
0257デフォルトの名無しさん
2008/06/21(土) 18:51:38atoi(in)
0258デフォルトの名無しさん
2008/06/21(土) 18:54:550259デフォルトの名無しさん
2008/06/21(土) 18:59:42なんでそんな短いの?
0260デフォルトの名無しさん
2008/06/21(土) 19:00:400261デフォルトの名無しさん
2008/06/21(土) 19:00:490262デフォルトの名無しさん
2008/06/21(土) 19:01:19出来ました、ありがとうございます。
>>259
半角スペースを入れてしまったので""の間が狭いんだと思います。
0263デフォルトの名無しさん
2008/06/21(土) 19:02:20専ブラのポップアップで見たらギリギリ足りてる
0264デフォルトの名無しさん
2008/06/21(土) 19:02:36" "のこと?
2chだと半角スペースの連続が一つになるから、それだと思う。
0265デフォルトの名無しさん
2008/06/21(土) 19:02:59確かに。これは気づかなかったわ。
0266デフォルトの名無しさん
2008/06/21(土) 19:05:530267デフォルトの名無しさん
2008/06/21(土) 19:08:43って、<PRE>で表示されるんだっけ?w
0268デフォルトの名無しさん
2008/06/21(土) 19:11:07>>6-16で出てるインデントの話と同じだな。
ほんと支障出るから困るよな・・・。
pre付けて欲しいよ。
0269デフォルトの名無しさん
2008/06/21(土) 19:11:35専ブラには変換オプションがあるはず
0270200
2008/06/21(土) 19:17:57記述されている要素のそれぞれが何を意味していているのか?
がサパーリだったので「いろは」から噛み砕いての解説を必要としていたのですが、
どうにも見つかりませんでした。
>>211
msdnだけで(自分は)ソースコードはかけないので、
「いろは」の書かれたサイト(や参考書)が欲しかったのです。
どうでもいいけど、VC++前提で$catはねぇだろ……
0271デフォルトの名無しさん
2008/06/21(土) 19:22:55>>211
に書かれている程度の記述は理解できたのですが、
DLLに限らず、オブジェクトのリンク関連は解ってない部分が多いです。
文法の解説はいくらでもサイトや参考書が見つかりますけれど、
各環境のコンパイラ、リンカへの指定法についてはなかなか見当たらないのが
ムガーーーッです。
0272デフォルトの名無しさん
2008/06/21(土) 19:25:16その要素(コンパイルオプションとか、キーワード)でググれば良いんじゃね?
0273デフォルトの名無しさん
2008/06/21(土) 20:53:09初心者の俺から見ると物凄い偉業に見えるんですけど
プログラマってこれくらい楽勝で作れちゃうものだったりしますか?
0274デフォルトの名無しさん
2008/06/21(土) 21:02:03プログラム的には難しいところは全然無いよ。
ただ、頭が柔らかくないとダメ。
大きい企業の職業プログラマの人達は苦手な人が多いんじゃないかな?
(偏見だけどね)
0275デフォルトの名無しさん
2008/06/21(土) 21:03:27つみ重ねだな。一度ものにした技は比較的に楽に使えるようになる。そういうのをどれだけ知ってるかが強さだ。迷路作成も解くのも重要な基本アルゴリズムだ。
じっくり読むんだ。
0276デフォルトの名無しさん
2008/06/21(土) 21:30:21大きく分けて2つ、
「手でやるならどうするか」(ロジック)を考える能力と、
それをソフトウェアにやらせる技術があって、
両方出来る人も居れば、前者はあまり得意でない人も居る。
迷路なんかは前者の能力が主に必要だろうね。
確かに職業プログラマの人は苦手なの多いかもしれないけど、
彼等はgoogle先生に聞いたり、SE陣を揃えたり、
研究所との共同開発したりとチートが使えるからねw
0277デフォルトの名無しさん
2008/06/21(土) 21:31:430278デフォルトの名無しさん
2008/06/21(土) 21:32:08もっといいアルゴリズムがいくつかあります。クグれば見つかりますよ。
0279デフォルトの名無しさん
2008/06/21(土) 21:33:280280デフォルトの名無しさん
2008/06/21(土) 22:01:02DXライブラリを使用していてファイルの読み込みをしようとすると
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;
}
0281デフォルトの名無しさん
2008/06/21(土) 22:03:340282デフォルトの名無しさん
2008/06/21(土) 22:03:40ifstreamはstd名前空間につつまれてるんで
std::つけるかusingつかえ
0283デフォルトの名無しさん
2008/06/21(土) 22:13:36ありがとうございます
0284デフォルトの名無しさん
2008/06/21(土) 22:30:40int型のリスト、double型のリスト、というものではなく、
1つ目の要素がintで、2つ目がdoubleで、といったものです。
ひとまず次の要素を指すポインタを用意しよう、と思ったところで、
その型をどうすればいいか分からなくなってしまいました。
0285デフォルトの名無しさん
2008/06/21(土) 22:34:49struct node *next;
int type; // 0=int, 1=double, ...
union {
int i;
double d;
} data;
};
こんな感じ?
0286デフォルトの名無しさん
2008/06/21(土) 22:39:43自分の参考書には書いていなくて、細かすぎてググるにも探しきれませんでした。
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とした場合も解決しますが、
どうしても仮想派生がしたい場合もあります。
コンパイラのせい等もあるのでしょうか?自分の理想通りに仮想派生する方法はあるのでしょうか?
だれか分かる方、回答をお願いします。
0287デフォルトの名無しさん
2008/06/21(土) 22:42:57boost::any
0288デフォルトの名無しさん
2008/06/21(土) 22:46:06struct 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& が返る
}
0289デフォルトの名無しさん
2008/06/21(土) 22:47:14Aにデフォルトコンストラクタを設け、A初期化用の関数を別途用意してそれをBから呼ぶ
0290デフォルトの名無しさん
2008/06/21(土) 22:49:070291デフォルトの名無しさん
2008/06/21(土) 22:54:18無理だろ・・・。
0292デフォルトの名無しさん
2008/06/21(土) 22:57:34×->は基底クラスによる
○->は仮想基底クラスによる
あと、文だけだとわかりにくいのでソースうpします。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7006.txt
0293デフォルトの名無しさん
2008/06/21(土) 23:07:17>>292は意味無かったですかね;
>>289
なるほど…!
確かにそれなら解決ですね。
でもやっぱ、このクラスが大きくなったときに、
初期化して代入するわけだからコストは高くなるし…
(まぁ今のところその見込みはないですが;
そもそもどうして仮想派生すると素直にCからB,BからA,とコンストラクタが階層をたどってくれないんでしょうか?
仮想派生ってものがあいまいなのでわからないのです。
0294デフォルトの名無しさん
2008/06/21(土) 23:10:22それはそういうもんだから仕方ないよ
追加で以下のようなクラス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に初期化されるべきか?
0295294
2008/06/21(土) 23:11:360296デフォルトの名無しさん
2008/06/21(土) 23:15:07あ、無理だったw
仮想関数オーバーライドの場合は戻り値変えられないか
0297デフォルトの名無しさん
2008/06/21(土) 23:19:46できました!
ありがとうございます!
0298デフォルトの名無しさん
2008/06/21(土) 23:25:15それはそういうもんだから仕方ないよ
まじですか。そういうもんですか。
ある意味求めていた明確な回答の一つです。
ありがとうございました!
疑うようで申し訳ないですけど、まじで、そういうもん?
0299デフォルトの名無しさん
2008/06/22(日) 00:16:50C++的にはそういうもの。
理にかなっていると思うけど、そうでもないの?
0300デフォルトの名無しさん
2008/06/22(日) 00:47:40cl /help でコンパイラに指定できるスイッチが出てくるんだけど。
サイトや参考書がどうしたこうしたじゃなくて付属のマニュアルを読めるようになろう。
MSDNとかすげえ役に立つよ?C#の開発とかネットで検索してたのは初歩の頃だけで
後は大抵MSのドキュメントで事足りる、というか、そっちの方がはやいし正確だ。
狭く深い情報はMVPのブログで。
0301デフォルトの名無しさん
2008/06/22(日) 00:50:52迷路で感動したのはこれ。
> TODは1フロアにつきマップのデータを1バイトしか持っていません。
TOD=ドルアーガの塔
http://druaga.to/qanda_tod.html
0302デフォルトの名無しさん
2008/06/22(日) 01:16:520303デフォルトの名無しさん
2008/06/22(日) 01:32:120304デフォルトの名無しさん
2008/06/22(日) 01:40:00どこかここ見て初心者は勉強するといいよっていうお勧めのサイトとかありますかね?
0305デフォルトの名無しさん
2008/06/22(日) 03:05:050306デフォルトの名無しさん
2008/06/22(日) 03:26:10どうせ関連図書を数十冊買う事になるんだから・・・
0307デフォルトの名無しさん
2008/06/22(日) 06:54:300308デフォルトの名無しさん
2008/06/22(日) 06:57:44ありがとうございます
頭柔らかくしてじっくり読んでみます
0309デフォルトの名無しさん
2008/06/22(日) 07:46:11どう違うのでしょうか?メモリに確保されるのはどちらも同じだし。長所、短所が
よく分かっていません。違いが分かる方ご教示お願いします
0310デフォルトの名無しさん
2008/06/22(日) 07:50:07スタティック変数は宣言した関数内で閉じ込められるでしょ
0311デフォルトの名無しさん
2008/06/22(日) 10:02:00クラス内のスタティック変数の場合は310のとおり。
クラス外の場合(グローバル変数にstaticをつけた場合)は変数のスコープが
そのソースファイル内だけになる。(他のソースファイルから参照不可)
と思う。
0312311
2008/06/22(日) 10:03:49クラスのメンバにした場合はクラス内で唯一の変数となる。
インスタンス化せずに使用可能。
まあ調べた方が確実だ。
0313デフォルトの名無しさん
2008/06/22(日) 12:31:28たとえば、乱数を複数個発生させる場合を考えてみてください。
seed() で乱数を初期化し、rand() を望む数だけ呼んで乱数を得ますよね。
rand() を使うためにグローバル変数を準備する必要はありません。
けれどもrand() を呼ぶたびに新しい乱数が生成されるのは、不思議ですよね。
0314デフォルトの名無しさん
2008/06/22(日) 13:08:580315デフォルトの名無しさん
2008/06/22(日) 15:10:23ん、たしかに rand() 関数内 static だと seed() がアクセスできませんでしたか。失礼。
0316デフォルトの名無しさん
2008/06/22(日) 15:49:030317デフォルトの名無しさん
2008/06/22(日) 16:23:50個別の変数に(ポインタでなく)別名を定義できないでしょうか
可読性の都合上、別の名前で同じ変数にアクセスしたいのです
#defineでのマクロ定義は予想外の動作が怖くて使えません
0318デフォルトの名無しさん
2008/06/22(日) 16:25:330319デフォルトの名無しさん
2008/06/22(日) 16:27:22でも同じ変数に別の名前なんか付けたらむしろ可読性落ちそうだけど
別物だと誤解されてバグ出たらどうするつもりだ?
0320デフォルトの名無しさん
2008/06/22(日) 16:32:23ブロックごとに使い捨てするオブジェクトが必要なんですが、
別々のオブジェクトを使ったり、毎回生成するのがもったいないんで、
共通のオブジェクトを使おうと思ったものの、オブジェクト名がtukaisute1じゃアレなんで
0321デフォルトの名無しさん
2008/06/22(日) 16:34:370322デフォルトの名無しさん
2008/06/22(日) 16:34:54アレじゃない名前にすれば解決なのか?
0323デフォルトの名無しさん
2008/06/22(日) 16:35:13「別名を定義=エイリアスを定義」なんだが。
後ろの説明も矛盾してるな、ブロックごとに必要なのか共通でいいのか。
0324デフォルトの名無しさん
2008/06/22(日) 16:39:12#typedefのオブジェクトバージョンが欲しいのよ
0325デフォルトの名無しさん
2008/06/22(日) 16:41:320326デフォルトの名無しさん
2008/06/22(日) 16:41:56C だとどうしようもない
0327デフォルトの名無しさん
2008/06/22(日) 16:43:02#defineでなんとかするかなぁ……
0328デフォルトの名無しさん
2008/06/22(日) 16:48:240329デフォルトの名無しさん
2008/06/22(日) 16:49:55アセンブリ言語やってない奴はこれだから。
エイリアスが作れたとしても、
エイリアスは内部的にはポインタのようなもので実装される。
0330デフォルトの名無しさん
2008/06/22(日) 16:49:560331デフォルトの名無しさん
2008/06/22(日) 16:53:47最適化されて同一視されそう。
ポインタ使った場合もそう最適化されんのかな?
0332デフォルトの名無しさん
2008/06/22(日) 16:54:07だから、エイリアスは使いたくないといってるのに
ちゃんと質問文読もうね
>>330
4byteとはいえ、というか4byteだからこそ何百万回も確保しては消すのが精神衛生上よろしくない
0333デフォルトの名無しさん
2008/06/22(日) 16:54:41int &nn = n;
みたいな例を考えると、
最適化しなければnnのためにポインタと参照、逆参照のコードが吐かれるけど
最適化するとnnのためのコードは消えるよ
nnへのアクセスがnへのアクセスと同等に扱われる
不安ならcc -Sとかやってアセンブラのコード確認してみ
0334デフォルトの名無しさん
2008/06/22(日) 16:54:550335デフォルトの名無しさん
2008/06/22(日) 16:55:35まあ、最適化コンパイラの出力を見たことも無いくせに
速度を求めたがる時期にはよくあること。
どこぞのスレにあった、とにかくAPIを使った方が
ファイルの読み書きが速いと思っている人と一緒。
0336デフォルトの名無しさん
2008/06/22(日) 17:06:03情報が小出しで悪いんだけど、
このケースでそう最適化してくれるほどコンパイラが頭良いとは思えないんだよねぇ
なにせメソッド内でメンバ変数の別名を定義したいって状況だし
むしろ、それで最適化されるコンパイラは怖くて使えん
根本的に方法変えてみるか
0337デフォルトの名無しさん
2008/06/22(日) 17:06:07関数抜けるときのスタック調整であわせて一緒に消してくれるよ
速度も変わらん
0338デフォルトの名無しさん
2008/06/22(日) 17:07:010339デフォルトの名無しさん
2008/06/22(日) 17:09:43別に気にするほどじゃないことは分かってるんだけどね
今10億個のオブジェクト生成したが、一瞬だったぜ……
0340デフォルトの名無しさん
2008/06/22(日) 17:19:17アホか。グダグダ「思えない」とかアホなことを言う前に自分で試せよ。
メンバ関数からメンバ変数にアクセスするんなら、もともと
this経由のポインタアクセスだろ。
メンバ変数へのリファレンスを定義した場合、
最適化しなければ、thisに対してさらにポインタアクセスを行う。
つまり、参照段階が一段増える
最適化すれば、直接this経由でのポインタアクセスになる
つまり何もかわらないし、一切オーバーヘッドは発生しないんだよ。
0341デフォルトの名無しさん
2008/06/22(日) 17:30:13終わったら該当する方に書き戻す。
ロード/ストアなアーキテクチャ的にも、レジスタ割付等の最適化的にも
こうすべきとしか思えないが。
0342デフォルトの名無しさん
2008/06/22(日) 17:34:55#defineとか言ってる時点で初心者丸出しなんだし・・・
0343デフォルトの名無しさん
2008/06/22(日) 17:37:270344デフォルトの名無しさん
2008/06/22(日) 17:41:320345デフォルトの名無しさん
2008/06/22(日) 17:41:41つまり、>>336は「俺様頭いいwwwwwwww」って思い込んでる厨房
0346デフォルトの名無しさん
2008/06/22(日) 17:45:13脳内プログラマはイラネって思うのは俺だけ?
0347デフォルトの名無しさん
2008/06/22(日) 17:46:400348デフォルトの名無しさん
2008/06/22(日) 17:50:23就職したら、そんなの使うなって怒られました。
Z80アセンブラを見るだけで興奮したりUNIXやらLINUXの大規模なプログラムのソースコード見たりするだけで勃起しそうになる俺変態
0349デフォルトの名無しさん
2008/06/22(日) 18:01:27http://typeangler.net/upfile/blog_attach_fda6223d430e50766b7e1a43b328b250.jpg
0350デフォルトの名無しさん
2008/06/22(日) 18:03:00どっちが正しいわけじゃないが、その会社のやつらの考えはさすがに古臭い
0351デフォルトの名無しさん
2008/06/22(日) 18:04:150352デフォルトの名無しさん
2008/06/22(日) 18:06:04システムハンガリアンでググっておくべき
0353デフォルトの名無しさん
2008/06/22(日) 18:07:43もしかしてシステムハンガリアンだとかアプリケーションハンガリアンの概念の話をするつもり?
そういうレベルじゃないと思うぞ
0354デフォルトの名無しさん
2008/06/22(日) 18:09:42今日日システムハンガリアン使うなんてただのアホだけっしょ
0355デフォルトの名無しさん
2008/06/22(日) 18:12:160356デフォルトの名無しさん
2008/06/22(日) 18:41:37if(func()){
throw std::runtime_error("aaa");
}
とかってしたとき、スタック上だと消えちゃうよね?
0357デフォルトの名無しさん
2008/06/22(日) 18:58:37専用の領域が用意されてたり、動的に確保されたりする。
0358デフォルトの名無しさん
2008/06/22(日) 19:12:08�dクス
専用の領域ってことはスレッドローカル的なものになるよね。
グローバルじゃ無理だし。その辺は処理系依存か。
動的確保の方法だったら、
場合によっては std::bad_alloc が出る可能性もあるってことか・・・。
0359デフォルトの名無しさん
2008/06/22(日) 19:23:22例外の確保に失敗するような状況なら根本的に打つ手無しじゃない?
0360デフォルトの名無しさん
2008/06/22(日) 19:24:000361デフォルトの名無しさん
2008/06/22(日) 19:34:40関数内での参照は別名と変わらんよ。
アドレスのコピーとかしてない。
0362デフォルトの名無しさん
2008/06/22(日) 19:36:31うん、そうだと思う。ちょっと思っただけ。
でもその関数内でauto_ptr<char>とかで大量に確保してた場合だと、
抜ければ空きが出るから・・・。
まぁruntime_errorの分でちょうど溢れるほど
絶妙なことはまずありえないだろうけどねw
>>360
動的だとすると、std::bad_allocだけは先に固定で一つ用意されてるのかもね。
0363デフォルトの名無しさん
2008/06/22(日) 20:13:54std::bad_alloc 例外が代わりに投げられることになる。
0364デフォルトの名無しさん
2008/06/22(日) 20:15:34例外クラスが作られた後にその例外を投げるまでの間に
さらに例外が発生すると
std::terminate 関数が呼ばれて abort される。
0365デフォルトの名無しさん
2008/06/22(日) 20:36:12たとえば、
bool Result = false;
if(Result&=Func()){
...
}
bool Func(){
...
}
というソースコードがあり、Funcがtrueを返した場合trueと評価されるのでしょうか?falseと評価されるのでしょうか?
0366デフォルトの名無しさん
2008/06/22(日) 20:38:58if (Result) {
}
と考えればいい。
0367デフォルトの名無しさん
2008/06/22(日) 20:39:01コンパイル通るか試してみ
0368デフォルトの名無しさん
2008/06/22(日) 20:39:50Result &= Func();
if (Result) {
と一緒
0369デフォルトの名無しさん
2008/06/22(日) 20:41:30ありがとうございます、危うくエンバグするところでしたorz
ただの代入ならまだしも、こういった形での代入はするべきではないのでしょうね…。
0370デフォルトの名無しさん
2008/06/22(日) 20:53:12それだとResultがfalseのときFunc()が呼ばれないよ。
元のは常に呼ばれるけど。
0371デフォルトの名無しさん
2008/06/22(日) 20:55:45ああそうだ・・・その通り。
0372デフォルトの名無しさん
2008/06/22(日) 21:52:25AのメンバにBのポインタがあり、Bのメンバを操作するメソッドがある
BのメンバにAのポインタがあり、Aのメンバを操作するメソッドがある
この場合、
・クラスBのプロトタイプ宣言
・クラスAの定義
・クラスBの定義
・クラスA、Bのメソッドの定義
っていうような順番で書くしかないですよね?
0373デフォルトの名無しさん
2008/06/22(日) 22:15:01・クラスBの定義
・クラスAの定義
・クラスA、Bのメソッドの定義
でもよいじゃないか
0374デフォルトの名無しさん
2008/06/22(日) 22:16:50しかない。
>>373
同じw
0375デフォルトの名無しさん
2008/06/22(日) 22:17:29いや、それはそうだけどww
ていうか、同じじゃないですか
>>374
ありがとうございます
うーん、見難いソースになっちゃうなぁ
0376デフォルトの名無しさん
2008/06/22(日) 22:19:02相互依存してるのが問題の原因だろ。そこを解決しないと簡単にはならないよ。
0377デフォルトの名無しさん
2008/06/22(日) 22:26:51クラスBから呼ばれるメソッドを持つクラスaを宣言する。
クラスaのポインタを持つクラスBを宣言する
クラスaを派生させたクラスAを宣言する。
0378デフォルトの名無しさん
2008/06/22(日) 22:55:41設計を考え直した方がいい
0379デフォルトの名無しさん
2008/06/22(日) 23:07:04ていうか、ほとんど必須
まぁ俺はゲーム管理クラスをシングルトンにするけど
と、エスパーしてみる
0380デフォルトの名無しさん
2008/06/22(日) 23:08:43VC++だとスタックだよ。投げた時点のスタックに、
例外処理が終わるまでアクセス可能だから、そういう芸当ができる。
0381デフォルトの名無しさん
2008/06/22(日) 23:35:26まじすか。
途中の関数内のデストラクタ起動とかどうやってるんだろう・・・。
0382デフォルトの名無しさん
2008/06/23(月) 00:23:19この例外のせいでというかおかげというか、
C++は当初Cへ変換してからコンパイルする、ということは
(効率を度外視しない限り)不可能ならしい。
0383デフォルトの名無しさん
2008/06/23(月) 00:23:450384デフォルトの名無しさん
2008/06/23(月) 00:38:320385デフォルトの名無しさん
2008/06/23(月) 03:56:56char* item1 = text[0〜5];
char* item2 = text[6〜11];
char* item3 = text[12〜17];
cout << item1 << '\n';
cout << item2 << '\n';
cout << item3 << '\n';
: りんご
: バナナ
: すいか
上記のように一次元配列を分割して参照したいのですが、良い方法はありませんか?
0386デフォルトの名無しさん
2008/06/23(月) 04:11:01char *item1 = text;
char *item2 = strchr(item1, '\0') + 1;
char *item3 = strchr(item2, '\0') + 1;
求めているものがこれだとは思えないが
俺はエスパーじゃないのでこれ以上はわからん。
0387デフォルトの名無しさん
2008/06/23(月) 04:12:20#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';
0388デフォルトの名無しさん
2008/06/23(月) 04:34:08つStringTokenizer
0389デフォルトの名無しさん
2008/06/23(月) 15:10:430390デフォルトの名無しさん
2008/06/23(月) 15:13:000391デフォルトの名無しさん
2008/06/23(月) 15:13:39ハイジかよ!
0392デフォルトの名無しさん
2008/06/23(月) 15:19:33ペーター:ぷっ
0393デフォルトの名無しさん
2008/06/23(月) 16:26:07動的リンクライブラリ(.dll)ってのを
使ったり作ったりした事が無いのですが
どういう状況で用いるべきものなのでしょうか?
例のようなものもあれば教えて下さい。
0394デフォルトの名無しさん
2008/06/23(月) 16:29:300395デフォルトの名無しさん
2008/06/23(月) 16:39:52・複数アプリで使用したいばあい
・ライセンス条件でDLLでの配布(またはソース公開)が義務付けられてるばあい
0396デフォルトの名無しさん
2008/06/23(月) 17:05:14回答どうもです。
作るとしたら複数のアプリケーションに流用できるような
独自形式のファイルフォーマット扱う場合とかに作ったりするべきなのかな。
>・ユーザーサイドで差し替えれるようにしたいばあい
>・複数アプリで使用したいばあい
ってのが気になるのですが
差し替えるとは古いdllを新しいもので上書きするような感じなのでしょうか?
また、複数アプリでライブラリ使うってだけなら静的リンクライブラリでもいいのではないかと思うのですが
その辺り詳しく教えていただけると嬉しいです。
0397デフォルトの名無しさん
2008/06/23(月) 17:07:55複数アプリで同じ機能いちいち積んでたらもったいないじゃん
0398デフォルトの名無しさん
2008/06/23(月) 17:12:06サイズが大きくなるから、DLLにしたい場合もある。
差し替えが有効な例は、独自ファイルのアクセスDLLなどなら、
ファイルフォーマットを変えた場合に、アプリ全体ではなく
DLLのみの更新ですむと。
あとプラグインとして機能追加できるような設計をしたい場合なども、
DLL使うのが良いのじゃないかなと。
0399デフォルトの名無しさん
2008/06/23(月) 18:20:02を参考にしてるんだけど、VOPの制御がよく分からない、どなたか教えてください.
0400399
2008/06/23(月) 18:23:440401デフォルトの名無しさん
2008/06/23(月) 18:59:50fstream 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回出力されるのを防げるでしょうか。
0402デフォルトの名無しさん
2008/06/23(月) 19:01:470403デフォルトの名無しさん
2008/06/23(月) 19:05:08CCCの後が即eofになってない場合の対処はどのようにすれば良いですか?
0404デフォルトの名無しさん
2008/06/23(月) 19:12:35while (fs >> strtoken)
cout << strtoken << endl;
のように書くんだね。
何で>>401のコードでそうなるかというと、fs.eof()が偽でも
fs >> strtoken;は失敗する可能性があるのに、それをチェックせずに
strtokenを出力しているからだ。
CCCまで読んだあと、streamには最後の改行が残っている。ので、
fs.eof()は偽を返す。が、空白文字しか残っていないので、
fs >> strtokenは失敗するんだよ。
0405デフォルトの名無しさん
2008/06/23(月) 19:13:14strtoken.clear();
fs >> strtoken;
if(!strtoken.empty()) cout << strtoken << endl;
}
これでどうだろう?
0406デフォルトの名無しさん
2008/06/23(月) 19:14:38適当にググってみたけど、
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ビット目を見るとかそんなんじゃねーの?
知らないけど。
0407デフォルトの名無しさん
2008/06/23(月) 19:15:45while( !fs.eof() ){
if( fs >> strtoken ) cout << strtoken << endl;
}
0408デフォルトの名無しさん
2008/06/24(火) 10:12:53なるほどわかりやすいですね。ありがとうございます。
>>404
>>407
ありがとうございます。理由がわかりました。
fs >> stroken が失敗したときに1以外を返すという事も知りませんでした。
そういった情報はどうすれば調べられるのでしょうか。
リファレンスistreamの>>演算子の項目を見ても書いてなかったように思って・・。
0409デフォルトの名無しさん
2008/06/24(火) 11:45:500410デフォルトの名無しさん
2008/06/24(火) 11:49:43それは
fs >> strtoken;
if( fs ) ........
と一緒。
operator>> が 1 とかを返すわけじゃない。
operator>> は fs 自身を返す。
その fs の basic_ios::operator void* が働く。
0411デフォルトの名無しさん
2008/06/24(火) 11:53:16しーぷらすぷらす
しーぷらぷら
しーぷら
しーたすたす
しーぴーぴー
しーいんくりめんと
どれでもお好きなのをどうぞ
0412デフォルトの名無しさん
2008/06/24(火) 12:07:420413デフォルトの名無しさん
2008/06/24(火) 19:59:56class hoge{
public:
class fuga{
public:
hoge hogehoge;
std::vector<hoge> vhoge;
};
};
とやると、hogehogeがincomplete typeと言われます。
ところが、hogehogeを消してvhogeのみにするとコンパイル可能になります。
こういった書き方は不可能なのでしょうか、また、コンパイルを通ったhogeのvectorは使用しても大丈夫なのでしょうか。
0414デフォルトの名無しさん
2008/06/24(火) 20:09:170415デフォルトの名無しさん
2008/06/24(火) 20:11:39スパコンを持ってしても、そのクラスはメモリーオーバーで使えない。
0416デフォルトの名無しさん
2008/06/24(火) 20:15:060417デフォルトの名無しさん
2008/06/24(火) 20:29:08class fuga;
};
class hoge::fuga {
hoge hogehoge;
};
0418413
2008/06/24(火) 20:32:16やっぱりそうなりますか。
元クラスだけインスタンス化して内部クラスをインスタンス化しなかったり、
内部クラスだけインスタンス化したりすれば大丈夫かと思ったのですが…。
このあたりのC++の微妙な振る舞いが中々身に付きません。
経験を積むしかないでしょうか。
>>416
それだとできるみたいです。ありがとうございます。
ただやっぱり危険っぽいので大人しく別クラスにしようかと思います。
元々は、元クラスのvectorを2本返すメンバ関数を作るためなので、別クラスは気持ち悪いのですが…。
0419413
2008/06/24(火) 20:38:43おおお!凄い!ありがとうございます!
ただちょっとわからないのは、それは最初の(ダメな)書き方と比べて何が違うのでしょうか。
単なる文法上の規則ですか、それとも、振る舞いの違うコードになるのでしょうか。
すみませんが教えて頂けると助かります。
0420デフォルトの名無しさん
2008/06/24(火) 20:47:38最初のはfugaの定義中にhogeの定義が完成されてないから。サイズが不明
void f() { g(); }
void g();
が許される言語もあれば許されない言語もあるのと同じようなもの
0421デフォルトの名無しさん
2008/06/24(火) 21:12:58> 元クラスだけインスタンス化して内部クラスをインスタンス化しなかったり、
> 内部クラスだけインスタンス化したりすれば大丈夫かと思ったのですが…。
ここのフィーリングがよくわからないなぁ。
>>413のコードのhogeクラスのサイズが無限大になるのは、物凄くシンプルな結果というか、
他に何も判断材料が無きゃ誰だってそう考えるだろ、っていうモノに俺には思えるんだけど、
どういう風に「微妙な振る舞い」なのかなぁ。
0422デフォルトの名無しさん
2008/06/24(火) 21:14:330423デフォルトの名無しさん
2008/06/24(火) 21:21:38無限にはならんだろ。
hogeはfugaを持って無いし。
0424421
2008/06/24(火) 21:26:050425413
2008/06/24(火) 21:28:21なるほど、よくわかりました。ありがとうございます。
0426デフォルトの名無しさん
2008/06/24(火) 23:38:34正しい読み方のみおしえてやれ
しーだぶるぷらす
しーぷらすぷらす
が正しい
0427デフォルトの名無しさん
2008/06/25(水) 00:09:370428デフォルトの名無しさん
2008/06/25(水) 00:11:42-- C++設計と進化(禿著) 第3章 C++の誕生 ページ80 より --
寄せられた案の中から私はC++を選んだ。(中略)
++は"次"とか"そのあと"とか"インクリメント"を意味する。
発音はつねに 'プラスプラス' だ。
第一位のC++と二位のCは、(以下略)
0429428
2008/06/25(水) 00:12:47○ 第一位のC++と二位の++Cは、(以下略)
前置インクリメントは大事だよな。
0430デフォルトの名無しさん
2008/06/25(水) 00:21:00http://www.comeaucomputing.com/techtalk/#pronounce しーぷらすぷらす
C++ pronounceでぐぐるとGeekらしき人々がネタ発音をいろいろ書いてる。
どこでも同じようなもんだなw
0431デフォルトの名無しさん
2008/06/25(水) 00:23:53ソースを書いてみたのですが、出来ません。
まず、1コの升を作って、それから縦と横を足すようにしました。
縦の数は合うのですが、どうしても横の数が合いません・・・。
考え方のヒントをよろしくお願いします。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7045.txt
0432デフォルトの名無しさん
2008/06/25(水) 00:28:140433431
2008/06/25(水) 00:32:20何回も打ったりしているうちにメチャクチャになりました・・・。
0434デフォルトの名無しさん
2008/06/25(水) 00:32:31・改行したらそこで横軸終了ですよ
0435デフォルトの名無しさん
2008/06/25(水) 00:40:56ヒント:
(縦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
+ -----+ -----+ -----+
0436431
2008/06/25(水) 00:57:20できました!!!!
0437デフォルトの名無しさん
2008/06/25(水) 09:44:36「C++の値はCだけど、++Cの値はC+1だ」なんて言う人が++Cに投票したのかな。
0438デフォルトの名無しさん
2008/06/25(水) 18:46:45それでテキストエディタを探しているのですがフリーでダウンロードできる物で良い物を教えていただけませんか?
0439デフォルトの名無しさん
2008/06/25(水) 19:00:07エディタとコンパイラを別途用意してシンプルな状態から始めたいのなら別だが、
VSExpressでいいんじゃないかなあ。
sakuraエディタとかでいいんでない?
個人的にはvim
0440デフォルトの名無しさん
2008/06/25(水) 19:13:14_countof などのマクロを使う方法などがありますが、
引数に配列を受け取るメソッド内にて、
void func(int i[]){
_countof(i);
}
と組むとビルドエラーになります。
配列を受け取るメソッド内では、引数で要素数を受け取らずに、
配列内の要素数を把握することは可能なのでしょうか?
よろしくお願い致します。
0441デフォルトの名無しさん
2008/06/25(水) 19:20:27不可能です。
0442デフォルトの名無しさん
2008/06/25(水) 19:23:58取れないことはないけど、止めた方が良い
0443デフォルトの名無しさん
2008/06/25(水) 19:28:05>>442
レスありがとうございました。
vectorで対応することにします。
0444デフォルトの名無しさん
2008/06/25(水) 19:33:05func(v);
がやりたいだけだったら、テンプレート+参照渡しという手もあるな。
template <size_t Size> func(int (&args)[Size]) { ... }
サイズがコンパイル時に決まってないといけないし、コード膨れそうだけど。
0445デフォルトの名無しさん
2008/06/25(水) 19:39:440446デフォルトの名無しさん
2008/06/25(水) 20:00:42教えるならせめてboost::arrayやRangeの考え方を
0447デフォルトの名無しさん
2008/06/25(水) 20:25:21こうするんですね、わかります。
0448デフォルトの名無しさん
2008/06/25(水) 20:44:08ありがとうございます。
コンパイラはボーランド社の無償で使えるのを使っています。
0449デフォルトの名無しさん
2008/06/25(水) 20:48:10それは古すぎて最近のライブラリに対応しきれなかったりコンパイラのバグ・言語仕様未実装が多かったりするから、
おとなしくVCExpressの最新版使っておけ。
0450デフォルトの名無しさん
2008/06/25(水) 20:57:48ググるなら「VC++Express」で。
最新は2008、もちろん無料。
0451デフォルトの名無しさん
2008/06/25(水) 20:59:140452デフォルトの名無しさん
2008/06/25(水) 21:00:35適当な環境を用意してgccでも使えば?
0453デフォルトの名無しさん
2008/06/25(水) 21:02:120454デフォルトの名無しさん
2008/06/25(水) 21:02:15別にvcbuildでもnmakeでもcl直叩きでもやればいいじゃん
makeだけGNUmake使ってもいいしな
0455デフォルトの名無しさん
2008/06/25(水) 21:07:420456451
2008/06/25(水) 21:11:210457デフォルトの名無しさん
2008/06/25(水) 21:19:19コンパイラをコマンドラインで実行すれば重すぎと表現されているVSを起動せずにすむということでは。
VS起動した後テキストエディットが重たいのなら嫌いになってもいいけど、
大して使ってないのに奇妙なところで嫌いになってしまうのはよくないよ。
0458デフォルトの名無しさん
2008/06/25(水) 21:23:44アプリケーション実行中はマウス等の操作が無くても休止状態にならない機能を実装したいです。
0459デフォルトの名無しさん
2008/06/25(水) 21:27:50case WM_POWERBROADCAST:
if (wParam == PBT_APMQUERYSUSPEND) {
return BROADCAST_QUERY_DENY;
}
break;
0460デフォルトの名無しさん
2008/06/25(水) 21:29:150462デフォルトの名無しさん
2008/06/25(水) 21:35:44# 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
0463デフォルトの名無しさん
2008/06/25(水) 21:39:58ありがとうございます。
ところでコンパイラって複数入ってても問題ないんですか?
0464デフォルトの名無しさん
2008/06/25(水) 21:40:41J#への異常なこだわりはなんだ
0465デフォルトの名無しさん
2008/06/25(水) 21:42:51hello.cを作ったんですがどうすればいいですか?なんていわれるよ
0466デフォルトの名無しさん
2008/06/25(水) 21:44:16コマンドラインから使いたいなら、環境変数の設定はバッチファイルでするようにしたほうがいい。
INCLUDEとかLIBとかかぶる。
0467デフォルトの名無しさん
2008/06/25(水) 22:09:49だったらどうして前者は普及してないんですか?
0468デフォルトの名無しさん
2008/06/25(水) 22:10:350469デフォルトの名無しさん
2008/06/25(水) 22:18:06SetThreadExecutionState
0470デフォルトの名無しさん
2008/06/25(水) 22:23:00速いだけが選択の基準じゃないんだよ。
0471デフォルトの名無しさん
2008/06/25(水) 22:47:15そうそう。459よりその方が妥当と思う。
459だと手動でも休止にできなくなりそう。
458の質問から判断すると、電源設定による休止のことだろうから。
0472デフォルトの名無しさん
2008/06/26(木) 00:26:26if(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 スタイル キャストまたは関数スタイルのキャストが必要です
こういうエラーなんですが・・・・
どうすれば直せますか
0473デフォルトの名無しさん
2008/06/26(木) 00:30:420474デフォルトの名無しさん
2008/06/26(木) 00:31:02で消えない?
0475デフォルトの名無しさん
2008/06/26(木) 00:31:290476デフォルトの名無しさん
2008/06/26(木) 00:31:39static_cast じゃダメだろ
0477デフォルトの名無しさん
2008/06/26(木) 00:32:39・reinterpret_castでキャストする。
0478デフォルトの名無しさん
2008/06/26(木) 00:34:190479デフォルトの名無しさん
2008/06/26(木) 00:34:51>>477
出来きましたー
0480デフォルトの名無しさん
2008/06/26(木) 00:51:030481デフォルトの名無しさん
2008/06/26(木) 00:52:54型が違う
0482デフォルトの名無しさん
2008/06/26(木) 01:01:520483デフォルトの名無しさん
2008/06/26(木) 01:04:38ブフォ
むしろ俺が作ってるのもいずれそういうコードを書くことになるわwww
0484デフォルトの名無しさん
2008/06/26(木) 01:17:03kwsk
0485デフォルトの名無しさん
2008/06/26(木) 01:25:220486デフォルトの名無しさん
2008/06/26(木) 01:26:04mp3のタグ解析じゃなくて?
RIFF、headerのあたりでそう思ったんだけど違うかなw
こないだID3v2の仕様とか眺めて「これはひどい」とか思ってたとこ
0487デフォルトの名無しさん
2008/06/26(木) 02:04:50C++で三角関数を計算させたいときに、
a = 0;
b = sin(a.);
とするとエラーになってしまいます。
bを計算させるにはどう記述すればいいのでしょうか。
0488デフォルトの名無しさん
2008/06/26(木) 02:05:020489デフォルトの名無しさん
2008/06/26(木) 02:08:18b = sin(static_cast<double>(a));
0490デフォルトの名無しさん
2008/06/26(木) 02:08:22まさか -libm とかいうオチ?
0491デフォルトの名無しさん
2008/06/26(木) 02:09:25ターミネートしたのか?
0492デフォルトの名無しさん
2008/06/26(木) 02:10:32というか別の意味になる
0493デフォルトの名無しさん
2008/06/26(木) 02:15:10回答ありがとうございます。
コンパイルできました。完全知識不足です
>>490
すいませんそのオチすら理解できてないです
0494デフォルトの名無しさん
2008/06/26(木) 02:28:130495デフォルトの名無しさん
2008/06/26(木) 07:22:260496デフォルトの名無しさん
2008/06/26(木) 08:31:410497デフォルトの名無しさん
2008/06/26(木) 10:32:18でもなんかよくわからないエラー↓が( 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
0498デフォルトの名無しさん
2008/06/26(木) 10:42:390499デフォルトの名無しさん
2008/06/26(木) 10:50:09その後はひたすらF5/F10/F11でステップ実行。
0500497
2008/06/26(木) 10:53:43たぶん配列作ってないです…。
# 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);
0501497
2008/06/26(木) 10:55:36すみません、WinMain()ってどこにあるんでしょうか…(´;ω;`)
ソリューション内検索してもないのですが…
0502デフォルトの名無しさん
2008/06/26(木) 11:51:400503499
2008/06/26(木) 12:10:47昨日の0時なら、今日の0時-24Hじゃない? 話、飛んですまんが。
0504497
2008/06/26(木) 12:22:50「theAPP」で検索すると2箇所がヒットしますが、WinMain()との関連性がわかりません(´;ω;`)
とりあえず、theAPPでヒットする場所にのみブレークポイントを設定し、F10をちょこちょこ押してみました。
すると、「crt0dat.c」というファイル内の「#include <dbgint.h>」と書かれている行から矢印が動きません。
10回以上おしても進まなかったので、F5を押しました。
# ステップ実行のいみがなーい;;
そうすると通常起動しました。(今回は実行直後には落ちなかったようです)
通常起動まで行った場合は、日時指定コントロールの時間の数字を「▼」で1つ下げただけでエラーで落ちました…。
そこで気づいたのは、「▲」で増やした場合はエラーにならなかったということです。
落ちる前に、少しだけ表示されるエラーメッセージに「m_time=-1」って書いてあった気がします。
日時指定コントロールで、時間として不正な値が入ってしまったということでしょうか???
0505デフォルトの名無しさん
2008/06/26(木) 12:24:42当方未経験中途採用のプログラマ見習いです。
C++でプログラムを組まなければならなくなったので力を貸して欲しくて書き込みました。
入社してから基本放置プレイされており、その間は基本的にC言語、C#、プログラマの心得、
ITプロ等のサイトで色々な情報収集等、自分で課題を見つけて勉強の繰り返しをして過ごしていました。
どれも、ひとつを深く追求という訳じゃなく、何が来てもいいように色々な情報を広く浅く収集してたつもりです。
今回渡されたのがまず、C++で文字列やバイナリを書き換えたり、特定の情報をデータ構造の中から
抜き出すプログラム等、処理としては簡単な物というか、処理の流れとして何をしたら実現できるか
という部分までは自分で導きだせるのですが、C++でそれを実現する手段を自分の与えられた環境下で
C++らしく実現する方法っていうのがうまく見つけられません。(日本語あってるか・・・?)
C++には何か色々なライブラリがあったり、コンパイラによって違ったり、STLとか・・・?
環境によって違ったりするというのはうすぼんやりとは解るんですけど、
正直情報が多すぎて自分では何と何と何を組み合わせてやればいいのかわからないというか、
うまく言葉にできなくてすいません・・・。頭の中で情報のマッピングが出来てないっていうのかな・・・?
環境はVista、VC2008
先輩に言われたのは「MFCとか使うんじゃなくてWin32(…だったかな?)で書いてね」
といわれた記憶があります。
そこで質問内容からまとめて聞きたい事を。
・今回、そういった指定を受けた上で、何を調べたら良いのでしょうか?という一時的な回避策。
(何という概念について知るべきとか、どういった単語で検索すればいいか等)
・複雑(に自分からは見える)C++の世界に、根本的な理解を深めながらプログラミングする為のアプローチとしては何から知ればよいでしょうか?
何かキーワードを与えてくださればあとはそれに関して自分で調べられる限りは調べますんで
よかったらアドバイスお願いします。質問が抽象的すぎてすいません。
0506497
2008/06/26(木) 12:30:37えぇと、すみません、私の日本語読解力が足りないみたいで、何を聞かれているのかわかりません;;
今日の0時から24時間引いても、昨日の0時でも同じ時をあらわしていると思います。
なんでtmpTimeを作ったかというと、単に40倍するときに桁があふれないように年月日を除きたかっただけなんです。
今日でも昨日でもよかったんですけど、1日分くらいずらしておいたほうがいいかなと思っただけなんです。
それだけなんです。ほんとすみません
0507デフォルトの名無しさん
2008/06/26(木) 12:30:38とりあえず、なにをしたいのか書かないと答えようがない。
0508デフォルトの名無しさん
2008/06/26(木) 12:42:11すいません、あまり根本的な質問や細かい質問をいちいちするのも嫌がられるかなと思ったので、
何かとっかかりになるようなキーワードや、C++とそれを取り巻く世界の構造を掌握するための
ヒントみたいな物をもらえたらって感じで書いたんですが。
引き続き上記の情報も募集しますが、
なんか、正直そんな悠長な事言ってられる状況じゃないっぽいんで
今必要な物は完結に書きます(笑
・C++でファイルの操作をする
・ファイルの読み込み、書き出し
・フォルダ内から全てのファイルのパスを取得する
・文字列とバイナリの入り交じったデータをどう扱えばよいか
・そういったデータから必要なデータ構造(文字列)を抜き出す方法
(バイナリ部分は一部分だけで、今回は必要の無い物です)
・もしバイナリとして扱うべきとした場合、文字列の検索等
(どうもうまく調べられないです)
・特定位置への文字列の注入
これらに関して何か検索すべき単語やヒントがあったらお願いします。
0509デフォルトの名無しさん
2008/06/26(木) 12:43:39まずはやってみようぜ。
今どこまでできててどこでつまってんの
0510デフォルトの名無しさん
2008/06/26(木) 12:46:50ファイル操作はWin32のリファレンスをしっかり読む
文字列やバイナリのデータは、forと配列をつかってとりあえず自分で作ってみる
0511デフォルトの名無しさん
2008/06/26(木) 12:48:20ファイルの構造が固定長レコードなのかそれ以外なのかによって違う
それ以外の例 画像ファイル内のコメント等
[種別(バイナリ)][長さ(バイナリ)][文字列]...
[文字列長(バイナリ)][文字列][文字列長(バイナリ)][文字列]...
0512デフォルトの名無しさん
2008/06/26(木) 12:55:15ありがとうございます!
今の所、どうやって作ろうかっていうのを考えた段階で、
コーディング初めてもバイナリと文字列どう扱っていいんだろう?
って所で詰まるなと思い調べてばかりいました。
たしかに>>509さんの言う通り、つまってから聞かなきゃ聞き様が無いですよね。
しかも、実際に詰まらなきゃ解決策の試しようが無いですもんね。
一人でどうしたらいいだろうかと悶々と考えていたので、冷静な判断力に欠けてました・・・
とりま、なりふり構わずに「動くものができりゃいいや」ってつもりで造って見ます。
おそらく”バイナリと文字列”のところでつまづくと思うんで、その時また来る事にします。
ありがとうございました!
0513デフォルトの名無しさん
2008/06/26(木) 13:07:550514デフォルトの名無しさん
2008/06/26(木) 13:10:45俺も読んでて「うーん」となったw
0515デフォルトの名無しさん
2008/06/26(木) 13:11:19なるほど、Win32のリファレンスですね。調べて読んで見ます。
すいません、解ってたはずなのにアホな事してましたね。
とりあえずできる範囲でやってみます。
>>511
ファイルの構造は
中に色々な情報を持ったオブジェクトがツリー状につながって入っています。
画像データだけがオブジェクトの中にバイナリで入っています。
抜き出したい情報はオブジェクトの中に文字列で書かれていて、
欲しい情報に画像データは含まれないので無視したいんです。
なので、そのオブジェクトを入れるための構造体やクラス?
を作って、必要なオブジェクトを捕まえるのがいいのかなとか考えてました。
1つのオブジェクトの例はこんな感じで
オブジェクトの名前
[種類][このオブジェクトの種類]
[親][親オブジェクトの名前]
[子][子オブジェクトの名前、・・・、・・・]
[色][扱ってる色の種類]
[サイズ][画像のサイズの座標X、Y、X2、Y2]
全体の構成としてはこんな感じ
[文字列だけのオブジェクト]
[文字列とバイナリの入った箱のあるオブジェクト]
[文字列だけのオブジェクト]
[文字列とバイナリの入った箱のあるオブジェクト]
0516デフォルトの名無しさん
2008/06/26(木) 13:14:19うーん、たぶんプログラマとしての資質の問題なんでしょうね。
もともとプログラムが好きで好きでやってる人と
仕事として選んだ結果"勉強"として調べようとしてる差が
行動力の差に出ているんですよねきっと。
すんません、ちょっと顔洗って出直してきます。
0517デフォルトの名無しさん
2008/06/26(木) 13:31:00それでトップダウンの方向で把握しようとしてるのだと思う。
トップダウンはトップダウンで必要だけど、
プログラマ的には、まずはボトムアップだね。
手探りでも、とりあえずやってみて具体的な知識を持つこと。
0518デフォルトの名無しさん
2008/06/26(木) 13:35:33まったく持ってその通りですね。
問題を先に見つけてしまうのも行動力が伴っての物で
壁を見つけたらまず壁まで行くべきだと学習しました。
レスポンス付けてくださった皆様
自分がここで質問するレベルじゃないって事がわかりました。
誰にも相談出来なくて一人で色々悩んでいるうちに悩みの迷路にはまってたみたいです。
ですが、皆様がご指摘してくれたおかげでやるべき事を明確にする事が出来ました。
誰にも聞けない事や、聞いてもあまり答えてもらえない事が多くて
全て自己解決しなきゃいけないと思って少し苦しくなってました。
でも勇気を出してここで質問したら、思いのほかちゃんと対応してくれる人がいて
問題にぶちあたっても手を貸してくれる人はいないわけじゃないんだと思い正直かなりほっとしました。
なのでとりあえず体面気にせずにがむしゃらにやってみようと思います。
今度来る時はちゃんと質問としてできるレベルにしてから質問しに着たいと思います。
どうもありがとうございました。
0519497
2008/06/26(木) 13:37:59解決したのは
> 2.入力時(チェックボックスをクリック or 日時指定コントロールの日時を変更)
日時指定コントロールの初期値を今日の00:00:00にしたら、「▼」で値を変えてもエラーにならなくなりました!
原因はたぶん明示的な初期化をしてなかったためと思われます。
そのせいで、「1970/01/01 00:00:00」として初期化され、
「▼」を押すことで扱える範囲外の時刻となり、エラーが吐き出されたっぽいです。
ずっと「9:00:00」って表示されてたので、
「0以下なわけでもないし…。」
と思ってたのですが、JSTになってたためにこの時間だっただけで、GMT的には00:00:00でした…(;´Д`)
0520497
2008/06/26(木) 14:12:02レスいただいた方、ありがとうございました。
お世話になりましたm(_)m
0521デフォルトの名無しさん
2008/06/26(木) 14:58:05動かなかったものが動いたときの嬉しさというか
懐かしいような羨ましいような
0522デフォルトの名無しさん
2008/06/26(木) 18:47:070523デフォルトの名無しさん
2008/06/26(木) 20:20:430524デフォルトの名無しさん
2008/06/26(木) 21:03:260525デフォルトの名無しさん
2008/06/26(木) 22:03:40ある大きな整数型配列,たとえばPH[100][100][100][100]みたいなのを
大量に作りたいとします。
要素数は大きくても、入れる値は高々0-1024までの値か入らないとします。
Int変数のマックスじゃなくて最大値を1024にする代わりに
使用メモリ減らす、っていう操作は可能でしょうか?
また可能ならばどのようなコマンドでできますか?
よろしくお願いします・
0526デフォルトの名無しさん
2008/06/26(木) 22:07:50必要な機能は自分で作る。そのためのプログラミング言語だ。
0527デフォルトの名無しさん
2008/06/26(木) 22:08:180528デフォルトの名無しさん
2008/06/26(木) 22:16:2110bitで1024表現できるの?
0529デフォルトの名無しさん
2008/06/26(木) 22:28:350530デフォルトの名無しさん
2008/06/26(木) 23:15:47詰まんない苦労したくないなら16bitで妥協して
[100][100][100][100]くらいなら200MB弱だから、
>大量に作りたいとします。
となると32bit環境では10個作るのも難しいね。
仮に1要素10bitできちきちに詰めたとしても120MBだから、
「大量」となると大差ない。やはり32bit環境では難しいよ。
結論:苦労しないで1要素16bitでやって、プラットフォームは
64bit環境にするのが正解。
0531デフォルトの名無しさん
2008/06/26(木) 23:34:500532デフォルトの名無しさん
2008/06/26(木) 23:45:01IHoge *p1 = new CHoge();
IHoge *p2;
CHogeはIHogeを継承したもので、メンバ変数が追加されています。
p1の「内容」をp2にコピーするにはどうしたらよいでしょうか?
p2 = p1; のように、ポインタをコピーするのではなく、独立したクローンを作りたいのです。
今のところvirtual IHoge *clone()=0; をIHogeに用意しておき、継承したクラスにオーバーライドを強要する。
くらいしか思いつかないのですが、なにぶん数が増えてきますと実装ミスがおきそうです。
(clone内でコピーすべきメンバ変数のコピーを書き忘れるとか)
0533デフォルトの名無しさん
2008/06/26(木) 23:56:4510進の0と1は1bitで表現するから結局11bit必要じゃね?
0534デフォルトの名無しさん
2008/06/27(金) 00:02:57難しくないです。当たり前の事だけど陥りやすい誤りが
明快に説明されています。それとスレ違いです。
こちらへ
推薦図書/必読書のためのスレッド 40
http://pc11.2ch.net/test/read.cgi/tech/1209441159/
0535デフォルトの名無しさん
2008/06/27(金) 00:05:5932bitとか関係なくてOSの制限じゃないかしら。
それも仮想メモリという魔法で一括でとろうとしない限りは大丈夫なんじゃないの?
アプリ単位のメモリ制限があるんだっけ?
0536デフォルトの名無しさん
2008/06/27(金) 00:16:43親クラスのoperator=を呼び出すのが常套手段。
後は差分の変数のみコピー。
0537デフォルトの名無しさん
2008/06/27(金) 00:22:43それは、cloneメソッドの実装を楽にする方法ということでしょうか?
確かに楽にはなるのですが、メンバ変数をコピーし忘れるのを確実に防ぐのは難しそうですね・・・
潜在的なバグになりそうな要素は導入したくないところなのですが・・・
0538デフォルトの名無しさん
2008/06/27(金) 00:34:37「デフォルト代入演算子」でぐぐれ
0539デフォルトの名無しさん
2008/06/27(金) 00:35:440540デフォルトの名無しさん
2008/06/27(金) 00:38:09それからコピーコンストラクタの実装も忘れずに。
代入演算子関数とコピーコンストラクタは継承されない。
0541デフォルトの名無しさん
2008/06/27(金) 00:38:52ありがとう
0542デフォルトの名無しさん
2008/06/27(金) 00:43:05あと、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++と良く似ているので
どちらか一方だけ購入する手もあります。
0543デフォルトの名無しさん
2008/06/27(金) 01:09:5532bitアプリだとアドレス空間が32bitで表せる4GBしかない。
しかもシステムに1-2GB程予約されるので、アプリで使える空間は最大3GB程度。
仮想メモリがいくらあろうと、アドレス空間が空いてなきゃ割り当てられない。
0544デフォルトの名無しさん
2008/06/27(金) 01:17:39なんでそんなことしようとしてるのか知りたいわ
0545デフォルトの名無しさん
2008/06/27(金) 02:29:13IntelCPUってずいぶん前から36bitアドレス空間サポートしてない?
サーバOSとかあっさり64Gとかつめるじゃん。
0546デフォルトの名無しさん
2008/06/27(金) 02:43:18ホントにプログラマ?
そう思うならそのサーバOS積んだ環境で、[100][100][100][100]みたいな
手軽なやり方でぼこぼこ大量に確保してみりゃいいじゃん。
0547デフォルトの名無しさん
2008/06/27(金) 02:45:16いくつかのプロセスが合計で4G以上を使うのは可能。
プロセス単位のアドレス空間が4Gというのはフラットメモリモデルでの制限で、
セグメントモデルを採用すればもっといけるがそんなOSは見たことがない。
あとPSEという仕組みがあって、昔のEMSのような仕掛けで4Gのメモリ空間の中に
4Gを越えるメモリをマップできる。
0548デフォルトの名無しさん
2008/06/27(金) 02:49:010549デフォルトの名無しさん
2008/06/27(金) 03:30:460550デフォルトの名無しさん
2008/06/27(金) 03:41:52/3Gスイッチをつけると3Gまで可能なのかな。
この辺がシステムに1-2GB程予約されるという言い回しになってるのかなあ
0551デフォルトの名無しさん
2008/06/27(金) 03:42:590552デフォルトの名無しさん
2008/06/27(金) 03:48:53共有メモリを介して複数プロセスで仕事をやらせれば多少はいけるかな。
unix版のoracleはそういう構造になってる。
windows版のoracleはスレッド構造にしたせいで
同じ32ビットCPUならメモリ的な限界が早く来る。
0553デフォルトの名無しさん
2008/06/27(金) 04:29:4216bitの時もEMSでひでえ苦労させられたしな・・・・
0554デフォルトの名無しさん
2008/06/27(金) 05:31:28高速化で出来る事はほとんど32bit時代にやってしまってる
後は本当に個人でジョセフソン素子でも使うしかない
0555デフォルトの名無しさん
2008/06/27(金) 08:29:250556デフォルトの名無しさん
2008/06/27(金) 09:03:5464bitいらね
0557デフォルトの名無しさん
2008/06/27(金) 09:28:41速くないと使い物にならないと思わないか?
メモリ領域だけ広くなってもなあ
0558デフォルトの名無しさん
2008/06/27(金) 09:40:220559デフォルトの名無しさん
2008/06/27(金) 10:03:24使えると思い込んでる書き込みが散見されるけど、C/C++使う
際にポインタのビット数って概念が無いんだろうかね?
ハードが36bitアドレス空間だろうがなんだろうが、ポインタが32bit
なんだから言わずもがなだと思うんだが。sizeof(ポインタ)をやった
ことがないのか?
0560デフォルトの名無しさん
2008/06/27(金) 10:17:580561デフォルトの名無しさん
2008/06/27(金) 11:04:48ある意味、仕様だよ。
0562デフォルトの名無しさん
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です。
0563デフォルトの名無しさん
2008/06/27(金) 12:03:19public:
0564デフォルトの名無しさん
2008/06/27(金) 12:24:510565デフォルトの名無しさん
2008/06/27(金) 13:14:380566デフォルトの名無しさん
2008/06/27(金) 13:18:300567デフォルトの名無しさん
2008/06/27(金) 13:27:280568デフォルトの名無しさん
2008/06/27(金) 13:29:11困った時のよく効く呪文
0569デフォルトの名無しさん
2008/06/27(金) 13:42:450570デフォルトの名無しさん
2008/06/27(金) 13:51:460572デフォルトの名無しさん
2008/06/27(金) 14:26:41オブジェクトHoge をprivateにしてGetHoge() , SetHoge()を作るのと
Hogeをpublicにするのとで何か違いあるの?
0573デフォルトの名無しさん
2008/06/27(金) 14:42:540574デフォルトの名無しさん
2008/06/27(金) 14:59:32メンバ関数経由にしておけば関数の実装次第で対応可能
0575デフォルトの名無しさん
2008/06/27(金) 15:02:34どこら辺を触ればビルドのメニューが表示されますか?
0576デフォルトの名無しさん
2008/06/27(金) 15:03:250577デフォルトの名無しさん
2008/06/27(金) 15:09:130578デフォルトの名無しさん
2008/06/27(金) 15:24:250579デフォルトの名無しさん
2008/06/27(金) 15:24:320580デフォルトの名無しさん
2008/06/27(金) 15:24:39どのクラスでもよく使う関数群をまとめてクラス(hoge)を作成して使用しているんですが
各クラスから使用するときは
hoge->function();という感じで使うことになります。
これを標準で備わっている関数と同様に
hoge->なしの
function();という記述で呼ぶようにすることが出来るでしょうか。
もし可能ならその方法を教えてください。
0581デフォルトの名無しさん
2008/06/27(金) 15:26:220582デフォルトの名無しさん
2008/06/27(金) 15:40:34char *str = "hoge";
とするとポインタ str には文字列 "hoge" の初めの文字のアドレスが入るんですよね。
ということは、この初期化時にそのアドレスから文字列5バイト分確保されるんですか?
char *str = "hoge"
char str[] = "hoge"
これを比べた時に何が違うのかよく分からないのです
0583デフォルトの名無しさん
2008/06/27(金) 15:43:10char *str1 = "abcd";
char str2[] = "abcd";
printf("%d %d\n", sizeof(str1), sizeof(str2));
こうやれば分かってもらえるだろうか。
上はポインタ、下は配列。
0584デフォルトの名無しさん
2008/06/27(金) 15:45:14配列は要素一つ一つが確保され、strに入る。
0585デフォルトの名無しさん
2008/06/27(金) 15:46:49コピーされる(strcpyと同じ)のが str[]
アドレス比較してみりゃ、全然違うとこになってるのがわかる。
0586デフォルトの名無しさん
2008/06/27(金) 15:52:33ありがとうございます。
なんとなくイメージはつかめた気がします。
0587デフォルトの名無しさん
2008/06/27(金) 15:57:44namespaceというのは見たことはあるのですが、使ったことは無かったので
ぐぐってみたのですが、
namespaceで変数や関数を宣言すると
クラスとは違い、実態をnewせずに使用できるということなのでしょうか。
0588デフォルトの名無しさん
2008/06/27(金) 15:59:47namespaceの中は、外からその名前で区別されるだけで普通の空間と同じ。
0589デフォルトの名無しさん
2008/06/27(金) 16:05:420590デフォルトの名無しさん
2008/06/27(金) 16:07:400591デフォルトの名無しさん
2008/06/27(金) 16:08:49>>581 はファイルスコープのstaticに掛けたネタ?ワタシよく知らないけど。
0592デフォルトの名無しさん
2008/06/27(金) 16:10:110593デフォルトの名無しさん
2008/06/27(金) 16:10:51そしてファイルサイズの拡張はできるのですが、縮小ができません。
テキストファイル"abcdefg"(7byte) から "abc"(3byte)となるように、
ファイルのサイズを縮める方法を教えてください。
環境はVC++2008、Windowsです。
0594デフォルトの名無しさん
2008/06/27(金) 16:21:08有難う御座います!1
0595デフォルトの名無しさん
2008/06/27(金) 16:32:50SetEndOfFile
0596587
2008/06/27(金) 16:34:21ただ単に、名前の範囲を示しているキーワードだったんですね。
でもそうすると、
namespace abc
{
class hage{
function()
}
}
abc::hage* hoge=new abc::hage();
abc::hoge->function();
こんな感じになるんでしょうか。
using namespace abc とすると
hoge->function(); でしょうか。
hage->は無くなりそうにありません(涙
う・・・わからなぃ。
0597デフォルトの名無しさん
2008/06/27(金) 16:35:210598デフォルトの名無しさん
2008/06/27(金) 16:35:26{
function()
}
して
using namespace abc してみ。
0599587
2008/06/27(金) 16:42:03あ、なるほど。
クラスにしてはダメなんですね。
静的に記述してしまうと。
だいたいわかりました。
とりあえずやってみます。
教えて頂いた皆様、ありがとうございます。
0600デフォルトの名無しさん
2008/06/27(金) 16:49:08namespaceで囲むメリットってなんなの?
グローバルに放り出したくないってこと?
0601デフォルトの名無しさん
2008/06/27(金) 16:51:570602591
2008/06/27(金) 16:52:15namespace abc
{
class hage{
public: static function();
}
}
abc::hage::function();
0603デフォルトの名無しさん
2008/06/27(金) 16:55:48なるほどです。
>>602
using namespace abc;
hage::function();
こうはできるが、
using namespace abc::hage;
function();
こうはできないんですよね?
0604デフォルトの名無しさん
2008/06/27(金) 17:53:29というのがあるとします。
既に存在するCの関数、例えば
double sum(int size, double* array)
{
double total = 0;
for(int i=0; i<size; i++){
total += array[i];
}
}
の第二引数にこのvecを渡したいのですが、
単なる配列のようにvectorを扱うことはできるのでしょうか。
0605デフォルトの名無しさん
2008/06/27(金) 17:57:59sum(vec.size(), &vec[0]);
0606デフォルトの名無しさん
2008/06/27(金) 17:59:080607604
2008/06/27(金) 18:03:50ああ、そんな簡単なことでいいのか。
ありがとうございます。
0609604
2008/06/27(金) 18:05:19データが連続したアドレスの配列上にあるというのは、
仕様で保証されているんですか?
0610デフォルトの名無しさん
2008/06/27(金) 18:10:37sum(v.size(), &v.front())
0612593
2008/06/27(金) 18:44:25サンクス。
でも引数にどうわたせばいいのかわからないや。
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);
0613デフォルトの名無しさん
2008/06/27(金) 18:49:37SetFilePointerで移動して呼んでみては。
0614デフォルトの名無しさん
2008/06/27(金) 18:57:47たびたびすみません。
#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 宣言の中で使用することはできません。
0615デフォルトの名無しさん
2008/06/27(金) 19:02:230616デフォルトの名無しさん
2008/06/27(金) 19:03:250617デフォルトの名無しさん
2008/06/27(金) 19:08:390618デフォルトの名無しさん
2008/06/27(金) 19:13:16例外はstaticメンバ関数だけじゃなかったか?
0619デフォルトの名無しさん
2008/06/27(金) 19:14:12なのでstaticつけてます。
0620デフォルトの名無しさん
2008/06/27(金) 19:21:04無理ですね
別名をつければいけますが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;
}
0621デフォルトの名無しさん
2008/06/27(金) 19:30:30なるほど。ありがとうございます。
>>580さんが望んでたものに一番近そうなのが、同じnamespace内で
別名をつける方法っぽいですね。
0623621
2008/06/27(金) 19:36:40以下のように記述することで関数名も同じまま呼び出すことができました。
#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;
}
0624608
2008/06/27(金) 20:26:33void (*global_func)() = Hoge::global_func;
// void global_func(){ Hoge::global_func(); };
0625デフォルトの名無しさん
2008/06/27(金) 20:29:19って出来ないんですか?
0626デフォルトの名無しさん
2008/06/27(金) 20:36:280627デフォルトの名無しさん
2008/06/27(金) 20:46:15打てる場所がないときはパスとか、細かいところは面倒いかも
0628デフォルトの名無しさん
2008/06/27(金) 20:47:580629デフォルトの名無しさん
2008/06/27(金) 20:48:43double[2]を構造体で包めばできる
0630デフォルトの名無しさん
2008/06/27(金) 20:52:16何もない状態からビットマップ画像を作成し、画素値を自分で設定して
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;
と記述して表示しようとしているのですがうまくいきません。
どこか根本的に間違っているのでしょうか。よろしくお願いします。
0631575
2008/06/27(金) 20:57:550632デフォルトの名無しさん
2008/06/27(金) 20:58:46どこが間違ってるって、スレが違う。C++/CLIスレへどーぞ
0633デフォルトの名無しさん
2008/06/27(金) 20:59:38ALT+PB
0634デフォルトの名無しさん
2008/06/27(金) 21:01:04F5
0635デフォルトの名無しさん
2008/06/27(金) 21:02:45すみません、C++/CLIのくだすれが落ちてるのでここぐらいしか聞くとこがなくて・・・。
0637デフォルトの名無しさん
2008/06/27(金) 21:13:08単純に表示、入力、ひっくり返すまでは直ぐできるけど
置けるか置けないかとか実装していくとすげー疲れる
0638デフォルトの名無しさん
2008/06/27(金) 21:14:11http://pc11.2ch.net/test/read.cgi/tech/1213334321/l1
0640608==638
2008/06/27(金) 21:34:10void (*const global_func)() = Hoge::global_func;
// void global_func(){ Hoge::global_func(); };
0641デフォルトの名無しさん
2008/06/27(金) 23:43:49をtypedefを使って書くにはどう書けばいいのでしょうか。
0642デフォルトの名無しさん
2008/06/27(金) 23:47:58typedef int (*pointer_t)(int, int);
pointer_t pointer;
0643デフォルトの名無しさん
2008/06/28(土) 00:32:49typedef int pointer_t(int, int);
pointer_t *pointer;
メンバ関数に使えないのが欠点だけど。
0644デフォルトの名無しさん
2008/06/28(土) 00:47:22ありがとうございます。
記述が分かりづらくてよく分からなくなるんですけど、
後者の方は、本当に関数のポインタという感じで分かりやすいです。
0645超初心者
2008/06/28(土) 03:51:19エディットボックスによって入力されてくる10個のint xを左から小さい順
にソートするプログラムを教えてください。
エディットボックスによるint xの入力と処理後の数列を表示する文章は出来ています
xを小さい順に選択して並べていく文章が検索したのですがイマイチわかりませんでした
0646デフォルトの名無しさん
2008/06/28(土) 03:59:170647デフォルトの名無しさん
2008/06/28(土) 03:59:51std::sort
0648超初心者
2008/06/28(土) 04:27:28自力で解決しました
といっても誰もレスしない時間帯でしたね^^;
2レス潰して失礼
0649デフォルトの名無しさん
2008/06/28(土) 10:52:18void main(){cout << "ああ、" << 20 << "歳になると年金を・・・。" << endl;}
をコンパイルしようとすると
warosu.cpp(1) : fatal error C1083: include ファイルを開けません。'iostream.h': No such file or directory
って出ちゃうんですが何をどうすれば良いかさっぱりです。
0650デフォルトの名無しさん
2008/06/28(土) 11:01:57using namespace std;
int main(){...}
0651デフォルトの名無しさん
2008/06/28(土) 11:02:21void main(){
using namespace std;
cout << "ああ、" << 20 << "歳になると年金を・・・。" << endl;
}
0652デフォルトの名無しさん
2008/06/28(土) 11:32:480653デフォルトの名無しさん
2008/06/28(土) 12:00:300654デフォルトの名無しさん
2008/06/28(土) 12:02:040655デフォルトの名無しさん
2008/06/28(土) 12:05:260656デフォルトの名無しさん
2008/06/28(土) 12:11:480657デフォルトの名無しさん
2008/06/28(土) 12:48:30これ見ながらやってたんです><
0658デフォルトの名無しさん
2008/06/28(土) 13:12:060659デフォルトの名無しさん
2008/06/28(土) 13:13:05ヘッダーです
0660デフォルトの名無しさん
2008/06/28(土) 13:13:53標準ライブラリーです
0661デフォルトの名無しさん
2008/06/28(土) 13:21:540662デフォルトの名無しさん
2008/06/28(土) 13:33:350663デフォルトの名無しさん
2008/06/28(土) 13:36:07標準ライブラリのヘッダだろ。
<iostream>とかの中身知ってて言ってるのか?
http://en.wikipedia.org/wiki/C%2B%2B_standard_library
0664デフォルトの名無しさん
2008/06/28(土) 13:54:250665デフォルトの名無しさん
2008/06/28(土) 15:36:52なんか違う単語みたいに見えるな。
0666デフォルトの名無しさん
2008/06/28(土) 17:32:090667デフォルトの名無しさん
2008/06/28(土) 18:20:58memory メモリ
menber メンバ
もう麻痺したけど
0668デフォルトの名無しさん
2008/06/28(土) 18:23:580669デフォルトの名無しさん
2008/06/28(土) 18:25:36Oの上に線とか0には斜線とかと同じノリ
0670デフォルトの名無しさん
2008/06/28(土) 18:26:290671デフォルトの名無しさん
2008/06/28(土) 18:36:43QWERT配列より使いやすいぞ。
0672デフォルトの名無しさん
2008/06/28(土) 18:42:000673デフォルトの名無しさん
2008/06/28(土) 19:07:240674デフォルトの名無しさん
2008/06/28(土) 19:11:480675デフォルトの名無しさん
2008/06/28(土) 20:12:540676デフォルトの名無しさん
2008/06/28(土) 20:30:250677デフォルトの名無しさん
2008/06/28(土) 20:44:490678デフォルトの名無しさん
2008/06/28(土) 21:27:500679デフォルトの名無しさん
2008/06/28(土) 22:22:190680デフォルトの名無しさん
2008/06/28(土) 22:55:47ソース
0681デフォルトの名無しさん
2008/06/28(土) 23:00:29ttp://dictionary.goo.ne.jp/search.php?MT=%B0%E3%CF%C2%B4%B6&kind=jn&mode=0&base=1&row=0
0682デフォルトの名無しさん
2008/06/28(土) 23:03:31”ぐぐれ”
0683デフォルトの名無しさん
2008/06/28(土) 23:03:44679じゃないけど、疑問に思ったらとりあえずググれ。
正確には違和感を覚えるだが、違和感を感じるでもそれほど間違いでもない、
ということらしい。
0684デフォルトの名無しさん
2008/06/28(土) 23:36:58たとえば a[100] とか作ったときに、メモリ上に100個の連続した空き領域が一つもなかったらどうなるんですか?
0685デフォルトの名無しさん
2008/06/28(土) 23:37:380686デフォルトの名無しさん
2008/06/28(土) 23:46:06自動変数として確保したならスタックオーバーフローで、普通は死ぬ。
ヒープならmallocはNULLを返し、newならstd::bad_alloc例外がスローされる。
0687デフォルトの名無しさん
2008/06/28(土) 23:49:180689デフォルトの名無しさん
2008/06/29(日) 00:44:150690デフォルトの名無しさん
2008/06/29(日) 05:20:57static const int hoge
の値でメンバ変数の配列のサイズを宣言したいのですが
定数式が必要と怒られるのでダメなのでしょうか?
0691デフォルトの名無しさん
2008/06/29(日) 05:41:35とりあえずenum{hoge=100,};あたりでごまかしたら?
0692デフォルトの名無しさん
2008/06/29(日) 08:16:57構造体のデータを VOID * にコピーする際に memcpy を使用しているのですが
VOID * の変数に対して、
初期化されていないローカル変数 'hogehoge' が使用されます
という警告が出てきます。
このときの VOID * の変数の初期化に困っています。
当然ながら NULL を代入するわけにもいかないですし・・・
警告レベルを下げずに綺麗な対処法はありますでしょうか、
よろしくお願い致します。
0693デフォルトの名無しさん
2008/06/29(日) 08:33:40memcpyに渡すときに&でアドレスを取るのだから
初期化や代入してなくても、警告を出すコンパイラなんてないと思うんだけどな。
初期化されてないまま関数に渡すと言う意味で警告が出るようなら
char buf[100];
sprintf(buf, "%d", 10);
でも警告が出るはずだし。
ていうか、memcpy関係なくて、本当に初期化してないだけな気配をすごく感じるんですけど。
とにかくその部分のコードを張って欲しいね。
0694デフォルトの名無しさん
2008/06/29(日) 08:35:04struct hoge h = {...};
void *m;
memcpy( m, &h, sizeof(h) );
みたいなコードなのか?
m = malloc( sizeof(h) );
とか
m= &hogememory;
とか居るだろうに。
0695デフォルトの名無しさん
2008/06/29(日) 08:39:48レスありがとうございます。
コード眺めてたら、分岐上で malloc してる箇所を通らないケースがありました。
非常に情けない・・・
わざわざすみませんでした。
0696デフォルトの名無しさん
2008/06/29(日) 18:40:09double型を出力する際に%.0fで指定すると少数第1位が四捨五入されるのでしょうか?
0697デフォルトの名無しさん
2008/06/29(日) 18:48:34宣言に初期化子も含んでないと定数式として使えないよ。
0698デフォルトの名無しさん
2008/06/29(日) 18:51:260699デフォルトの名無しさん
2008/06/29(日) 18:56:46しかし
double a=0.8;
printf("a=%.0f",a);
出力
1
となるんですが・・・
0700デフォルトの名無しさん
2008/06/29(日) 19:00:12%fのデフォルトは小数点以下6桁までなのでその精度に
変換される
要するに四捨五入される
0701デフォルトの名無しさん
2008/06/29(日) 19:07:50ありがとうございます
0702デフォルトの名無しさん
2008/06/29(日) 19:10:01同じような結果になるはずだが
0703デフォルトの名無しさん
2008/06/29(日) 19:35:20嘘つくなよ
0704デフォルトの名無しさん
2008/06/29(日) 19:36:06必ずしも処理系が標準に準拠しているとは限らない
0705690
2008/06/29(日) 19:40:06.hファイルで
static const int hoge;
を宣言して、.cppファイルでその値を
const int 適当なクラス名::hoge =512
と512で初期化して
.hファイルないで
char msg[hoge];
はダメみたいですが
.hファイル内でhogeを初期化したり
.cppファイル内でhogeを配列数に私用することは出来るようです
なにか使い方が間違ってるのかな・・・?
0706デフォルトの名無しさん
2008/06/29(日) 19:44:08承知しとけって事か
0707デフォルトの名無しさん
2008/06/29(日) 19:45:530708デフォルトの名無しさん
2008/06/29(日) 19:54:16見落としてました
.hファイルで
static const int hoge =512;
とすることで無事に動くようになりました
ありがとうございました
0709デフォルトの名無しさん
2008/06/29(日) 20:35:48そうするとそのヘッダを他のファイルから読み込めなくなると思うが、
それでもOKなのかな?
0710デフォルトの名無しさん
2008/06/29(日) 20:41:06整数型のstaticでconstなメンバは、宣言時に初期化できることは規格にあるけど。
0711デフォルトの名無しさん
2008/06/29(日) 20:46:220712デフォルトの名無しさん
2008/06/29(日) 20:52:25たぶんクラスメンバの話。
そうでなくても static にしてあるんで問題ない。
0713デフォルトの名無しさん
2008/06/29(日) 20:53:140714デフォルトの名無しさん
2008/06/29(日) 20:56:43規格は知らないから確実じゃないけど、
cppファイルで初期化する場合、
ヘッダでは値が分からないから
使えないんじゃないかな。
0715デフォルトの名無しさん
2008/06/29(日) 21:00:27所詮は変数なので使える。
他ファイルからは値側からなので最適化はできないだろうけど
0716714
2008/06/29(日) 22:18:11ではなぜ?
理由は691の「古いコンパイラだと対応してないのか」しか出てない。
ちなみにVS2008EEだと以下の内容が出力された。
error C2057: 定数式が必要です。
warning C4200: 非標準の拡張機能が使用されています : 構造体または共用体中にサイズが 0 の配列があります。
UDT にサイズが 0 の配列が含まれているときに、copy-ctor または copy-assignment オペレータを生成することはできません。
error C2720: 'Test::hoge' : 'static ' ストレージ クラスの指定子が識別子に対して誤って指定されています。
0717デフォルトの名無しさん
2008/06/29(日) 22:25:180719714
2008/06/29(日) 22:35:14cppファイルでは配列数として使えるから、
697の説明も正確じゃない気もするけどなあ。
0720デフォルトの名無しさん
2008/06/29(日) 22:45:52(ようするにその問題解くと一通り機能を習得(長期記憶)できるような問題)
一通り勉強したんですが、どうにも忘れっぽくて。
0721デフォルトの名無しさん
2008/06/29(日) 22:48:28卒倒するレベルの宿題に・・・。
まぁ言いたいことは分かるけどw
0722デフォルトの名無しさん
2008/06/29(日) 22:53:340723デフォルトの名無しさん
2008/06/29(日) 22:58:470724デフォルトの名無しさん
2008/06/29(日) 23:00:21C++はリファレンス見ながら使って覚えるものだ。毎日たくさんコード書くしかない。
0725デフォルトの名無しさん
2008/06/29(日) 23:01:45そうか・・・
わかったサンクス俺がんばるよ
0726デフォルトの名無しさん
2008/06/29(日) 23:03:15・const参照に一時オブジェクト
・typenameキーワードが必要になる状況
・vptr初期化タイミング
・char配列の領域に任意のクラスを配置new出来るかどうか
さて・・・
0727デフォルトの名無しさん
2008/06/29(日) 23:05:20テンプレートは、一応後の方にした方がいいと思うよ。
0728デフォルトの名無しさん
2008/06/29(日) 23:14:46だね。多重継承とテンプレートは誤用しやすいから慣れてから使ったほうがいいかもね。
0729デフォルトの名無しさん
2008/06/30(月) 00:05:160730デフォルトの名無しさん
2008/06/30(月) 00:10:54そういうのはキ○ガイ
0731デフォルトの名無しさん
2008/06/30(月) 00:15:43書けない奴が、この話を「書く・書かない」の話にすり替えて、
「俺は書けないんじゃない、書かないんだ! だって俺はマトモだから!」
とか吠えるのは逃げ口上。
0732デフォルトの名無しさん
2008/06/30(月) 00:17:00普通の人は書けない。書けるのはキ○ガイじみている。
0733デフォルトの名無しさん
2008/06/30(月) 00:25:350734デフォルトの名無しさん
2008/06/30(月) 00:33:080735デフォルトの名無しさん
2008/06/30(月) 01:03:48自分でどう使っていいのか皆目見当がつかないなぁ
0736デフォルトの名無しさん
2008/06/30(月) 01:33:530737デフォルトの名無しさん
2008/06/30(月) 02:06:45独自の派生テンプレートクラスのようなものを作っては失敗すると理解が深まるかもしれん。
0738デフォルトの名無しさん
2008/06/30(月) 02:29:29*(foo.hoge) = 1;
でよかったっけ・・・?度忘れしてしまいました
0739デフォルトの名無しさん
2008/06/30(月) 02:44:12カッコ不要
0740デフォルトの名無しさん
2008/06/30(月) 02:45:340741デフォルトの名無しさん
2008/06/30(月) 02:51:550742デフォルトの名無しさん
2008/06/30(月) 02:59:080743デフォルトの名無しさん
2008/06/30(月) 04:55:080744デフォルトの名無しさん
2008/06/30(月) 05:37:32結合の件で迷ったら、とりあえずfooとhogeを合わせて1つの変数名くらいに考えていい。
0745デフォルトの名無しさん
2008/06/30(月) 08:56:290746デフォルトの名無しさん
2008/06/30(月) 09:16:33->* がオブジェクトへのポインタからメンバを参照する
0747デフォルトの名無しさん
2008/06/30(月) 14:53:59CSample(const CSample& obj)
とあるとき
objはコピー元、コピー先どっちだっけ?
0748デフォルトの名無しさん
2008/06/30(月) 14:59:570749デフォルトの名無しさん
2008/06/30(月) 15:49:08それともどこかの方言なの?>だっけ
0750デフォルトの名無しさん
2008/06/30(月) 17:07:270751デフォルトの名無しさん
2008/06/30(月) 17:23:33http://www.issei.org/diary/_20030224/d200301c.html
0752デフォルトの名無しさん
2008/06/30(月) 17:43:200753デフォルトの名無しさん
2008/06/30(月) 18:46:430754デフォルトの名無しさん
2008/06/30(月) 19:20:390755デフォルトの名無しさん
2008/06/30(月) 19:56:470756デフォルトの名無しさん
2008/06/30(月) 20:00:010757デフォルトの名無しさん
2008/06/30(月) 21:04:180758デフォルトの名無しさん
2008/06/30(月) 21:16:04動的に確保したクラスの配列を delete で解放したいのですが、
そのメソッドの呼び出し側 (配列のポインタを受け取った側) で delete すれば、
正常に解放されるのでしょうか?
メソッド内で確保したデータが解放されてるか不安になってしまいました。。。
よろしくお願い致します。
0759デフォルトの名無しさん
2008/06/30(月) 21:32:03デストラクタにprintfとか入れて試してみたら?
配列のはdelete [] だけどね。
0760デフォルトの名無しさん
2008/06/30(月) 21:32:32開放されるが、あまりかっこよいとはいえない。
0761デフォルトの名無しさん
2008/06/30(月) 21:33:46そういうタイプのキーボードってどこで売ってるんですか?
0762デフォルトの名無しさん
2008/06/30(月) 21:41:180763デフォルトの名無しさん
2008/06/30(月) 21:44:13正確な値にするためにはどうすればよいでしょうか?
一応問題の箇所は
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';
}
0764デフォルトの名無しさん
2008/06/30(月) 21:51:56>>760
>>762
レスありがとうございます
確かに、呼び出し側に解放させるのはカッコよくないですね
構造を見直したほうがいいかも、ですね
0765デフォルトの名無しさん
2008/06/30(月) 21:56:28ゴミが残ってるからじゃないの?
0とかで初期化すればどうかな?
0766デフォルトの名無しさん
2008/06/30(月) 22:31:380767デフォルトの名無しさん
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];
}
}
}
0768デフォルトの名無しさん
2008/06/30(月) 22:42:10その引用部分より前に問題があるんじゃないか?略さずに貼るべし
0769デフォルトの名無しさん
2008/06/30(月) 23:21:440770デフォルトの名無しさん
2008/07/01(火) 00:11:23ゴミデータが嫌なだけならmemsetで0で埋めるだけでも・・・
0771デフォルトの名無しさん
2008/07/01(火) 00:29:18int 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, " "));
0773デフォルトの名無しさん
2008/07/01(火) 06:52:370774デフォルトの名無しさん
2008/07/01(火) 06:58:310775767
2008/07/01(火) 08:26:11再びよろしくお願いします・・・
7154.txt
0776デフォルトの名無しさん
2008/07/01(火) 09:45:550777デフォルトの名無しさん
2008/07/01(火) 10:01:15みたいなのがあって、適当な実数が格納されているとします。その時、
vec[0]+vec[1]+...+vec[9]=accumulate(&vec[0], &vec[10], 0);
というのは分かるのですが、
vec[0]^2+vec[1]^2+...+vec[9]^2
を求めたいときはどうすればよいですか?
0778デフォルトの名無しさん
2008/07/01(火) 10:06:270779デフォルトの名無しさん
2008/07/01(火) 10:15:42for(int i=0;i<vec.size();i++) sum+=vec[i];
0780デフォルトの名無しさん
2008/07/01(火) 10:16:11sum+=vec[i]*vec[i];
0781デフォルトの名無しさん
2008/07/01(火) 10:36:280782デフォルトの名無しさん
2008/07/01(火) 10:49:19で
(null)
と表示されるのはANSI等の仕様でしょうか?
それとも非標準な親切設計なのでしょうか?
0783デフォルトの名無しさん
2008/07/01(火) 11:20:240784デフォルトの名無しさん
2008/07/01(火) 11:22:110785デフォルトの名無しさん
2008/07/01(火) 11:42:401プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく
そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?
0786デフォルトの名無しさん
2008/07/01(火) 11:43:070787デフォルトの名無しさん
2008/07/01(火) 11:47:03forkは分身を作る。
戻り値が0なら分身。
0788デフォルトの名無しさん
2008/07/01(火) 12:01:25例えば
・メッセージボックスにはMessageBox::Showを使う
・プログラムの終了にはCloseを使う
・描画をするにはGraphics型を使う
などは、サンプルプログラムを見ればわかるのですが、自分で一から考え出せるとは思えません。
そもそもその関数や型の存在を知らなければ歯が立たないと思うのです。
自分がやりたいことに対する関数や型の見つけ方を教えてほしいです。
0789デフォルトの名無しさん
2008/07/01(火) 12:05:190790デフォルトの名無しさん
2008/07/01(火) 12:10:05サンプルを片っ端から動かしてみて(読むのは後でいい)
その動作を覚えていれば、必要になったときにそのサンプルを思い出すだろう。
あとは関数単位より、機能単位で探し物すればいい。見つからなけりゃ自作するはめになるし
その後そのものの関数が見つかったりもするけど、それもまた勉強で。
0791デフォルトの名無しさん
2008/07/01(火) 12:16:57検索して見つかればラッキー、そうでなけば自作か諦める、という選択肢になってしまうのですね。
自分のニーズに合ったものを常に探し出せる公式な機構というものは存在しないのでしょうか。
だとしたらかなり不便ではないですか?
よく使うものは覚えていればいいですけど、漠然とした要求や、特殊な機能などは、
せっかくライブラリがどこかに存在しても結局は無いのと同じことになってしまいませんか。
0792デフォルトの名無しさん
2008/07/01(火) 12:18:09マイクロソフトのページで検索
0793デフォルトの名無しさん
2008/07/01(火) 12:19:32正直、プログラマに向いてない、
と思いましたw
0794デフォルトの名無しさん
2008/07/01(火) 12:20:590795デフォルトの名無しさん
2008/07/01(火) 12:30:44ライブラリの提供元で調べる。(MSDNとか)
言語によっては言語の公式リファレンスみる。(PHPとか)
0796デフォルトの名無しさん
2008/07/01(火) 12:34:35本を片っ端から買え。
ネットを片っ端から検索して嫁。
めんどくさくなったら、自分で作れ。(<-ある程度のプログラマーなら、これも多い)
とにかくやればできる、または要求が無理だと理解して違う道を探す。
不便だと思ったら便利にしたいと思うのがプログラマ。
0797デフォルトの名無しさん
2008/07/01(火) 12:38:47○不便だと思ったら便利なツールを作るのがプログラマ。
0798デフォルトの名無しさん
2008/07/01(火) 12:55:51char へのポインタが必要なところに int を渡しているので、未定義動作になる。
どんな動作をしても非標準じゃないけど、いきなりぶっ飛んだりしない親切設計。
0799デフォルトの名無しさん
2008/07/01(火) 13:05:18C++/CLIじゃね?
MSDNでがんばれ
0800デフォルトの名無しさん
2008/07/01(火) 13:57:50普通にNULLポインタだと思わない?
0801デフォルトの名無しさん
2008/07/01(火) 13:59:28printf()のような可変長引数関数に0渡すときは、型がわからないから
単にint扱いだよ
たとえnull pointerを特別扱いしてくれるprintf()であっても、
sizeof(void*) != sizeof(int)な環境ではどうなるか分かったもんじゃないな
0802デフォルトの名無しさん
2008/07/01(火) 14:01:050803デフォルトの名無しさん
2008/07/01(火) 14:05:19誰に言ってんの?
多分質問者の環境ではsizeof(void*) == sizeof(int)でかつ
printf()がnullpointerを特別扱いしてる(これは親切設計)から、
そのように動作してるんだよ。
可変長引数関数にnull pointerを渡したければ、
(void*)0
のようにキャストしなきゃだめ。
0804デフォルトの名無しさん
2008/07/01(火) 14:06:40たとえばゲーム作るとするだろ。
その時、シナリオなり戦闘ルーチンなりは自分で作る。
ファイルを開いたりウインドウを閉じたりは、APIやライブラリや
フレームワークに用意されているはず。
自分で一から考え出すのは前者だろ。後者は(居れば)誰かに
聞いたりググったり、マニュアル読めば見つかる。
上の例は極端だけど、自分で一から考えなきゃいけないものが何か
切り分け出来ないのは単に経験不足だから、触ろうとしている環境の
サンプルをもう少し動かして感じをつかむしかない。
その環境で出来ることが全部サンプルでできるとは限らないけど
困らないぐらいには大抵網羅されている。
>そもそもその関数や型の存在を知らなければ歯が立たない
サンプルを一通り見てもそう思う?
0805デフォルトの名無しさん
2008/07/01(火) 14:33:21とりあえず >803 参照。そのうえで、 "%s" にヌルポインタを渡した場合の動作も同じく
未定義動作。 "(null)" を出して済ませてくれるのは親切設計。場合によっては余計な
お世話かもしれない。(ファイルにリダイレクトしてて、後々まで気づかないとか。)
0806デフォルトの名無しさん
2008/07/01(火) 20:36:570807デフォルトの名無しさん
2008/07/01(火) 20:37:370808デフォルトの名無しさん
2008/07/01(火) 20:57:220809デフォルトの名無しさん
2008/07/01(火) 20:57:500810デフォルトの名無しさん
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()の引数を参照渡しではなく、値渡しに変更すると
正しく動くみたいなのですが、、、
0811デフォルトの名無しさん
2008/07/01(火) 23:57:10>うまく動きません。
それを具体的に。
v1とv2の要素数は同じ?
>返り値のvector<double>は、いつまで
変数に入れたりする限り、ずっと有るよ。
正確には、コピーされていく。
大き目のint変数くらいに考えても良い。
0812デフォルトの名無しさん
2008/07/02(水) 00:20:41ありがとうございます。
v1とv2の要素数は同じです。うまく動きません、というのより、コンパイルが通りません。
変数に入れずに、直接関数に渡したら駄目ですか?
渡された側の関数では、参照貰いで引数を貰うようになってます。
0813デフォルトの名無しさん
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> >&)'
0814デフォルトの名無しさん
2008/07/02(水) 00:27:33やりたいことはPhotoshopなどの様にレイヤー管理ウィンドウの表示です。
表示のオンオフ用のチェックボックスとレイヤーを複数選択状態を指定の2つで、
互いに独立している(表示オンオフとレイヤーの選択は依存しない)なのですが、
VB・javaの経験が有るため、CLRならばユーザーコントロールで作り〜と実装の目処は立てられるも、
それ以外の方法では敷居が高く出来るならCLRで開発を行いたいと思っております。
また、今後ゲームのミドルウェア開発をしていく上でCLRを使ったプログラミングを行っていっても良いのでしょうか。
MFCなど様々な開発方法があり、どれを勉強していけばよいのか考えあぐねています。
とりあえずプラットフォームはwindowsのみなのでCLRを使っていこうとは思っているのですが、何かおすすめの勉強方法が有りましたら宜しくお願いいたします。
0815デフォルトの名無しさん
2008/07/02(水) 00:28:31一時オブジェクトは非constな参照引数に渡せない。
変更しない物にはconst付けるクセ付けろよ。
0816デフォルトの名無しさん
2008/07/02(水) 00:31:37>>726の1行目のやつだね。引数にconst付けてみ。
実は最初そう思ったんだけど、
VC++2005で試したら普通にコンパイル通っちゃったんだよね・・・
0817デフォルトの名無しさん
2008/07/02(水) 00:39:40パフォーマンスを気にする類ならCLRはGC動くから使わない方が良いけど、
そうでないなら別に問題無いと思う。
個人的にはユーザーインターフェースはWTLが良いかな、と。
ちなみにCLR使うとなるとC++/CLIっていうC++派生の別言語になる。
0818デフォルトの名無しさん
2008/07/02(水) 00:46:38ありがとうです。
ためしてみます。
726は全部確かにツボをついた質問ですね。
・非const参照の引数に一時オブジェクト
・const参照に一時オブジェクト
この2つの質問って同じことじゃないですか?
・typenameキーワードが必要になる状況
そういう状況があったというのはどこかで読んだけど、具体的にどうだったかは忘れた。
・vptr初期化タイミング
この質問は意味自体が分かりません。
・char配列の領域に任意のクラスを配置new出来るかどうか
たしかvectorを使う方がいいとかどこかで聞いたような気がするけど。
たしかにこんな質問にすらすら答えられるようだったら結構すごいと思うけど、、
あと、テンプレートで正規表現の処理なんかも書けないな。俺も2年くらいC++
使ってるけど、まだまだだな〜
0819デフォルトの名無しさん
2008/07/02(水) 00:49:190820デフォルトの名無しさん
2008/07/02(水) 01:09:22>この2つの質問って同じことじゃないですか?
基本的に同じ。分けたのは上はコンパイルエラーで
下は生存期間を延ばすルールがあるからかも。
http://www.sun-inet.or.jp/~yaneurao/intensive/cppmaniax/chap0001.html
>配置new出来るかどうか
出来ないというか未定義になる・・・かな?
boost::aligned_storageとか使わないと動く保証が無くなる。
0821デフォルトの名無しさん
2008/07/02(水) 01:22:07ありがとう御座います。WTLを早速試してみます。
横でdirectXを動かそうと思っているのでなるべくパフォーマンスは軽い方が良いですし頑張ってみます。
0822デフォルトの名無しさん
2008/07/02(水) 01:30:53多次元配列のインデックスをオーバーロードすることは出来るのでしょうか?
0823デフォルトの名無しさん
2008/07/02(水) 03:49:13どうしても多次元配列じゃないとだめ?
関数の形にしたほうが簡単でいいのでは?
array[i][j][k]; => 面倒
array(i,j,k); => 簡単
0824デフォルトの名無しさん
2008/07/02(水) 08:39:04static 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をクラスのメンバに入れると、リンクエラーが起きます。これは何故でしょうか。
あともう一つ、基本的な話でスミマセンが、コピーコンストラクタの中で、プライベートなメンバにアクセスできるのは何故ですか?(呼べないとものすごく困りますが)
質問多くてスミマセン…^^;
0825デフォルトの名無しさん
2008/07/02(水) 09:09:12shared_ptrでも使ったら?
> classMapをクラスのメンバに入れると、リンクエラーが起きます。
宣言だけして、実体の定義してないんだろ。
>プライベートなメンバにアクセスできるのは
同じクラスだから
0826デフォルトの名無しさん
2008/07/02(水) 09:09:36csvファイルの操作を行う、内部に二次元配列を持つクラスを
作りたいのですがインデックス演算子の方が直感的かとおもうので・・・
関数の形でも問題ないのでそういう方向で行きたいと思います
あと、CSVファイルを操作するとき二次元配列をそのまま内包するより
列をリスト構造で繋いで
行をそのリストの配列、もしくはリストのリストという形にした方が操作しやすいですか?
0827デフォルトの名無しさん
2008/07/02(水) 09:11:081.
((myclass *) &cpyc)->f = TRUE;
↓
cpyc.f = TRUE;
2.
classMapはintとmyclassへのポインタのmapだから、
これがmyclassのデストラクタを呼ぶことは無いんでは?
3.
リンクエラーは涌かんね
4.
privateってのは他の「クラス」からのアクセスを制限してる。
ほかの「インスタンスからの」じゃない。
# そういう風になった理由は知らないけど...
0828デフォルトの名無しさん
2008/07/02(水) 09:14:39for( 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"))));
でどうか?
0829デフォルトの名無しさん
2008/07/02(水) 09:20:191. constの存在を忘れてるよ。対症療法で答えるならmutableを使うことになると思う。
2. push_backの引数に渡した一時オブジェクトが無駄という話。
3. cppファイルかどっかに変数の実体も作ってやらないとだめなの。関数の実体を書くのと同じ要領で。
>>828
そのnewした一時オブジェクトはどこへ行っちゃうの?
0830デフォルトの名無しさん
2008/07/02(水) 11:07:19push_backの引数って、vectorの中に入る時には、コピーされるから一時オブジェクト
でも問題ないんじゃなかったっけ?
0831デフォルトの名無しさん
2008/07/02(水) 11:09:33コピー元へのポインタが失われてメモリリークする。
0832デフォルトの名無しさん
2008/07/02(水) 11:20:29と
>そのnewした一時オブジェクトはどこへ行っちゃうの?
の話がゴッチャになってないか?
0833デフォルトの名無しさん
2008/07/02(水) 11:44:21つーかそのコードだとobjectのIDとインスタンスのポインタを
classMapとやらで管理してるようだが、
コピーコンストラクタでコピー元のIDをそのままコピってるから
おかしなことになるんだろ
A生成→IDA, &A登録
BをAからコピーコンストラクタで生成→IDA, &A削除、IDA, &B登録(いいの?)
A破棄→IDA, &B破棄(いいの?)
vectorにpush_back()する際に起きるのは、こういうことだ
この時点でBが生きてるがclassMapには何も残ってない
何のつもりのIDだか知らんが、設計一から見直せよ
0834デフォルトの名無しさん
2008/07/02(水) 11:51:00myclassはコピー不可にすべきだな。
0835824
2008/07/02(水) 12:35:38実態登録するの忘れてました…
privateのほうは、ほかのオブジェクトからアクセスできないものだと思いっきり勘違いしてました。
同じクラスなら大丈夫なんですね…
shared_ptr使ってポインタの配列として扱うのでも問題はないのですが…
>>829
どうmutableを使ったらよいかよくわからないです…
>>833
そもそもコピーコンストラクタなど使いたくなくて、
vectorでpush_backするときに、一時オブジェクト使わずにコンストラクタを呼び出したいのですが、
一時オブジェクトができてしまうと、コンストラクタでマップに登録されるまではよいのですが、
そのまま(コピーコンストラクタを使わずに)コピーすると、一時オブジェクトが破棄されると同時にデストラクタが呼び出され、マップが破棄されてしまうので、
それを避けるために、コピーされたときにコピーされたことを示すフラグを立て、デストラクタ時にマップを破棄しないようにしているのです。
実際IDにはコントロールのハンドルか何かを使うつもりなので、同じIDのオブジェクトは作らない前提なのですが…
0836デフォルトの名無しさん
2008/07/02(水) 12:39:570838デフォルトの名無しさん
2008/07/02(水) 18:36:21class 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か何かのバグ?
メモリ解放出来ないからリークしまくって困ってるんだが、どうにかならんだろうか
0839デフォルトの名無しさん
2008/07/02(水) 18:43:550840デフォルトの名無しさん
2008/07/02(水) 18:45:200841デフォルトの名無しさん
2008/07/02(水) 18:45:560843デフォルトの名無しさん
2008/07/02(水) 19:00:10よくわからん、こっちで再現できるだけの材料ある?
0844デフォルトの名無しさん
2008/07/02(水) 19:00:54次はどんな方法で勉強すればいいですか?
0845デフォルトの名無しさん
2008/07/02(水) 19:03:31とりあえず作りたい物を作ってみる
作りたい物を作っていく上で問題にぶち当たったら
その問題を解決するようにしていく
文法と規則を覚えたら後はこれの繰り返し
0846デフォルトの名無しさん
2008/07/02(水) 19:04:21こんなんやってもこっちでは再現しねえよ
VC9だよな?
俺が試したのはSP当たってねえExpressだけど
0847838
2008/07/02(水) 19:09:24再現性のある資料はさっきのコード位しかないですねwchar_t*に限らずint*とかでも例外が来ました
0848デフォルトの名無しさん
2008/07/02(水) 19:14:34ありがとうございます
オセロ作っちゃいます
0849デフォルトの名無しさん
2008/07/02(水) 19:16:35そういうのは、コンパイルするだけで再現可能な最小のコードに切り落として、
正確に使ってる環境とコンパイルオプション添えて、
MSに報告してやれよ
0850デフォルトの名無しさん
2008/07/02(水) 19:21:09コピー作られたとき
0851デフォルトの名無しさん
2008/07/02(水) 19:24:39メンバを追加しないと発生しないんだったら、それも載せないと意味ないだろう
0852838
2008/07/02(水) 19:52:420853デフォルトの名無しさん
2008/07/02(水) 20:05:44http://pc11.2ch.net/test/read.cgi/tech/1087979678/
http://pc11.2ch.net/test/read.cgi/tech/1180430969/
0854デフォルトの名無しさん
2008/07/02(水) 20:38:26これってどういう事をしてるんですか?
STLさっぱりなんでmapとかわかりません
0855デフォルトの名無しさん
2008/07/02(水) 20:55:44ようだな
0856デフォルトの名無しさん
2008/07/02(水) 22:58:36とりあえず、デストラクタ内の if (name) は意図どおりには動かないぞ。
sampleのオブジェクトがスタックなのかヒープなのかは知らんが
どちらにしろ、nameが0(NULL)で「初期化」されることはない。
したがって、「確保されていたらdelete」の判断には使えない。
まあ、NULLをdeleteしてもかまわないわけだがね。
あと、皆も言ってるが、この手の「中身の実体を別途(ヒープに)確保する」ものは
自分でコピーコンストラクタを書かない限り、コピー(代入)はうまく動かない。
仮にsampleの用法が「必ずヒープから確保して、実体コピーはしない」というものだけであっても
宣言だけはしてコピー不可にしておくべき。
0857デフォルトの名無しさん
2008/07/03(木) 10:56:51こんな感じのカラーコードってありますよね
これは黒白合わせて8色+ダークしかないんでしょうか。
RGBみたいに自由に指定して色を作ったりは出来ないんでしょうか
0858デフォルトの名無しさん
2008/07/03(木) 10:59:140859デフォルトの名無しさん
2008/07/03(木) 11:04:37最近のxtermやrxvtは256色表示ぐらいは出来るらしい。
↑の30のかわりに38;5;%d (%d: 0 〜255)
みたいなシークエンスを送るようだ。
0860デフォルトの名無しさん
2008/07/03(木) 13:43:50Macの初期装備ターミナルでも256表示出来るかな…?
試してみます、ありがとう
0861デフォルトの名無しさん
2008/07/03(木) 19:30:23このようにマウスカーソルをオリジナルのものに変えるにはどうすればいいですか?
VC++2008,Vistaです
0862デフォルトの名無しさん
2008/07/03(木) 19:44:32LoadCursorやLoadImageでカーソルをロードするかCreateCursorでカーソルを作成してSetCursorする
0863デフォルトの名無しさん
2008/07/03(木) 20:35:060864デフォルトの名無しさん
2008/07/03(木) 20:44:38すまんかった
0865デフォルトの名無しさん
2008/07/03(木) 21:39:19>デストラクタ内の if (name) は意図どおりには動かない
そーか?
sampleには一見すると引数無しのコンストラクタが無いので、
生成する時nameの初期化は強制されると思うんだが。
0866デフォルトの名無しさん
2008/07/03(木) 21:43:470867デフォルトの名無しさん
2008/07/03(木) 21:58:58nameはプリミティブだからデフォルトコンストラクタとか
喚ばれないよ?
0868デフォルトの名無しさん
2008/07/03(木) 22:27:47コピーの時も元が初期化されているので未初期化の領域をdeleteすることは無い。
ただし、コピーコンストラクタによって2重deleteが発生し得る。
0869デフォルトの名無しさん
2008/07/04(金) 02:39:04#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
0870デフォルトの名無しさん
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を足しながら代入ですかね?
ご指導お願いします。
0871デフォルトの名無しさん
2008/07/04(金) 02:50:530872デフォルトの名無しさん
2008/07/04(金) 03:06:360873デフォルトの名無しさん
2008/07/04(金) 03:23:150874デフォルトの名無しさん
2008/07/04(金) 05:01:29されねーよ。
実際に調べてみろよ。アセンブラコード出力して。
規格にあると言うなら、なんて書いてあるのか示してくれよ。
俺が追ってない、最新規格ならそうだってんなら納得するから。
0875デフォルトの名無しさん
2008/07/04(金) 05:39:38sampleにPODなメンバしかなく、コンストラクタを明示的に書いてない場合に
例えば new sample ならメンバは初期化されないで、
new sample() なら0で初期化されるということと
引数ありのコンストラクタがあるのにデフォルトコンストラクタが無い場合には
上のような引数無しでのオブジェクトは作成不可能ということだけだがね。
で、コンストラクタを書いた時、
初期化コード内に現れてないメンバを勝手に初期化してくれるとは知らなかったね。
配列も初期化してくれるのかい?大きなお世話なんだが。
可変長構造体でも、placement newを使えばコンストラクタを利用できるわけだが
これはどこまでゼロフィルしてくれるのね。
まあ、可変長構造体自体がC99以外では未定義だし
サイズ0の配列は独自拡張らしいから別の話になるか。
確かにPODと非POD両方を持つクラスのデフォルトコンストラクタなら
自動的に他のメンバを初期化するという仕様に決まってるかも、と思わないでもない。
実際には()の有無にかかわらずPODメンバは初期化していないようだが。
仕様は知らん。
0876デフォルトの名無しさん
2008/07/04(金) 06:04:55newやmallocで確保したアドレスのリストを持っててそれと一致しないと無視という構造で
複数回deleteしようが、nullポインタをdeleteしようが、
文字列リテラルへのアドレスをdeleteしても落ちない。
>デストラクタでヒープ破壊が起きて例外が来るんだが
の状況判断が根本的に間違ってると予想するよ。
どこかでnameのポインタをそのまま外部に渡してるとか
さらしてないところでnameをいじってるとかそんなところだろ。
0877デフォルトの名無しさん
2008/07/04(金) 06:22:16え?VC8で2重解放したら、即例外投げられたよ?
0878デフォルトの名無しさん
2008/07/04(金) 07:07:21>引数ありのコンストラクタがあるのにデフォルトコンストラクタが無い場合には
>上のような引数無しでのオブジェクトは作成不可能ということだけだがね。
838のコードを対象にしてんだから、まさしくそういう意味で、
「初期化が強制される」、って言ってるんじゃないの?
0879デフォルトの名無しさん
2008/07/04(金) 07:17:03そういうならnameに何も初期化・代入せずに
>>838のsampleのインスタンス作るコード書いてみろよ。
0880デフォルトの名無しさん
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の書き込み。
0881デフォルトの名無しさん
2008/07/04(金) 07:35:09書いた者が「初期化されてなかったら解放する」という意図を
「そもそも初期化されないことはない」というのは当然だけど
「コンストラクタが完了していない(未初期化)の状態が起こりえるコード(が省略されている)であっても
NULLかどうかで(newによる代入が行われたかの)判定は出来ない」ということだよ。
0882868
2008/07/04(金) 07:50:48そういう意味なら良いよ。
俺はif(name)には言及して無いし、if(name)が無意味なのは同意する。
コンストラクタ完了時にnameが未初期化のケースは無いと言っただけ。
>>838が困ってるのはヒープ破壊の方の話だからな。
0883デフォルトの名無しさん
2008/07/04(金) 07:57:55・コピーコンストラクタが書かれてないので、コピーしたときにポインタが多重になり、
デストラクタで同じアドレスが複数回解放される可能性がある
・デフォルトコンストラクタが書かれていないので、引数無しでインスタンスを作成した
場合に、ポインタの値が不定のまま(VCだと0xccccccccでNULLではない)デストラクタで
解放を試みられる。
0884デフォルトの名無しさん
2008/07/04(金) 08:00:12引数無しでインスタンスは作成出来ない。
0885デフォルトの名無しさん
2008/07/04(金) 08:01:22・コピーコンストラクタ、デフォルトコンストラクタを書いて、正しくポインタを取り扱いましょう。
・手作業でメモリ確保せずに、std::vector<wchar_t>やstd::wstringをバッファとして使いましょう。
0886デフォルトの名無しさん
2008/07/04(金) 08:02:33あぁそうか。ならデフォルトコンストラクタの部分は無しで
0887デフォルトの名無しさん
2008/07/04(金) 08:05:00>>856の前半をわざわざ書いたのは、C++以外の言語では
>>880の真ん中の仮定が通用するものが多いわけ。JavaとかDelphiとか。
だから、それを勘違いしていて、たとえこのコードでは問題なくても
他の場所でバグを抱え込んでいる可能性が充分あるから。
で、ヒープが壊れるという現象は、オーバーフローなんかも多いけど
この人の場合は「(ヒープから確保した以外の)未初期化の不定なポインタのdelete」
による可能性も十分あるかと。
もちろん、コピーや代入による「2重delete」の可能性も高いけど。
0888デフォルトの名無しさん
2008/07/04(金) 08:11:38>この人の場合は「(ヒープから確保した以外の)未初期化の不定なポインタのdelete」
>による可能性も
一応聞くけど「>>838に貼られたコードが」ではなく
「>>838の認識で書かれたコードが」って意味だよな?
0889デフォルトの名無しさん
2008/07/04(金) 08:13:33考えて無いことだなw
0890デフォルトの名無しさん
2008/07/04(金) 08:22:39あたりまえ
0891デフォルトの名無しさん
2008/07/04(金) 08:25:04そうだなw
予想どうり2重解放してるなら、デバッガで追えばすぐ分かる間違いだし。
0892デフォルトの名無しさん
2008/07/04(金) 08:55:32言っているが、これが分かりにくいんだな。
現に、>>856自身の念入りな解説(>>880)で、本当の意図が分かった人が
複数いるわけで、ここは「ちゃんと読まないてめーが悪い」と考えるのじゃ
なくて、相手に誤解させず、はじめから意図どおりに読ませる書き方を
しないと。
現実世界で、自分が正しいはずなのにコミュニケーションが
うまく行かないってはめにおちいるよ。
0893デフォルトの名無しさん
2008/07/04(金) 10:44:24『nameへの代入』と解釈したり(sampleのコンストラクタ内でやってるのは「代入」ですね)
『sample(のインスタンス)の初期化』と解釈する人の事なんか知りません。
現に>>867はちゃんと「nameの初期化」の意味を理解してます。
0894デフォルトの名無しさん
2008/07/04(金) 10:54:39・プログラマが定義していない初期化(全て0フィル等)は行われない。
・newが失敗したときは例外が飛ぶのでsampleオブジェクトの生成も失敗する。
以上のことから
デストラクタ実行時にname==0という状態は考えられず、
if(name) という記述に怪しいニオイを感じる。
というだけのことではないの?
0895デフォルトの名無しさん
2008/07/04(金) 11:32:19それはお前の思い込み。
struct A{
const wchar_t* name;
A(){ name=L""; } // A():name(L""){}
};
上記のように初期化リストを使わない書き方をもって、
「nameは初期化されない」と言うのが一般的とは到底思えない。
何故なら、そう言うと未初期化になると受け取られることが予想出来るため。
厳密な初期化の話をするなら俺なら「」の強調程度で済まさずちゃんと書く。
「wchar_t*型(の自動変数)はNULLに初期化されない」なら分かるけどな。
0896デフォルトの名無しさん
2008/07/04(金) 11:47:05うまいね、一票だな
>厳密な初期化の話をするなら俺なら「」の強調程度で済まさずちゃんと書く。
そうだよね。これが「ちゃんと読まないてめーが悪い」とは考えない大人な
ものの考え方だよ。
0897デフォルトの名無しさん
2008/07/04(金) 11:49:51sampleオブジェクトの生成が失敗して例外が投げられた時、
sampleのデストラクタが実行されるのか?
0898デフォルトの名無しさん
2008/07/04(金) 11:56:23されない
0899デフォルトの名無しさん
2008/07/04(金) 12:25:30ということは、
さらされてるコードではnameに 『有意な値が設定されない』 状況はsampleオブジェクト
の生成失敗であって、その状況で通りもしないif(name)の動作が意図されないとか、
言及に値する?
それともnameに 『有意な値が設定されない』 でdelete [] nameが実行されるケースって
あるのかしら?
sampleのインスタンスがコピーされたりnameのポイント先が他から無理やり開放されたりとか、
想像で障害を増やすことはできるけど、その場合はif(name)の意図如何にかかわらず
吹き飛ぶだろうから、そもそも着眼するまでも無い様に思うが。
0900デフォルトの名無しさん
2008/07/04(金) 13:01:22コンストラクタから例外を投げる時には地震のデストラクタを呼べば良い。
初期化子で例外が起こった場合は?
0901デフォルトの名無しさん
2008/07/04(金) 13:23:36>それともnameに『有意な値が設定されない』で
>delete [] nameが実行されるケースってあるのかしら?
件のコードで普通に生成する限りは、ないよ。
>>900
>コンストラクタから例外を投げる時には地震のデストラクタを呼べば良い。
それは止めた方が良い。
そもそもauto_ptrなどを使うべきだけど、
そうでないならtry-catchして必要な後処理をすること。
>初期化子で例外が起こった場合は?
諦める、でおk
function-try-blockでも止められないし。
RAIIに則って作ればどこで例外が出ようと、
例外安全になる。
0902デフォルトの名無しさん
2008/07/04(金) 17:42:350903デフォルトの名無しさん
2008/07/04(金) 18:22:550904デフォルトの名無しさん
2008/07/04(金) 18:25:540905デフォルトの名無しさん
2008/07/04(金) 18:44:43誰か答えてやれよ
0906デフォルトの名無しさん
2008/07/04(金) 18:46:35マルチだから
0907デフォルトの名無しさん
2008/07/04(金) 18:49:48最適化で「なぜここで聞く?」と書いた責任を感じてしまった。orz
0908デフォルトの名無しさん
2008/07/04(金) 18:57:25http://pc11.2ch.net/test/read.cgi/tech/1209441159/
0909デフォルトの名無しさん
2008/07/04(金) 19:29:35各項目には値を代入できているんです。実行時にエラーになるならわかるんですが
0910デフォルトの名無しさん
2008/07/04(金) 19:30:201=グー
2=チョキ
3=パー
で入力するとき
上記以外の入力がされたときに不正な入力がされました と表示させる宿題が出たのですが
これであってますか? もっといい方法あったら教えてください。
ttp://www9.uploader.jp/user/inoguma/images/inoguma_uljp00005.txt
0911デフォルトの名無しさん
2008/07/04(金) 19:30:49意味が分かりません
コンパイルエラーということでしょうか?
0912デフォルトの名無しさん
2008/07/04(金) 19:39:42関数の戻り値にFALSEがかえるんです。
0913デフォルトの名無しさん
2008/07/04(金) 19:44:29GetLastError で調べてください
0914デフォルトの名無しさん
2008/07/04(金) 20:04:2187のパラメータが正しくないと出ました。
http://www.ys-labo.com/pic/pic%20chips/pic%20chips%20contets/2007/070401%20RS232C%20PC_PIC.html#RS232C%204
このサンプルの通りにしたんですが、PCによっては有効でない設定があるんでしょうか
0915デフォルトの名無しさん
2008/07/04(金) 20:59:50宿題すれ池
0916デフォルトの名無しさん
2008/07/04(金) 21:00:27そのURLにはSetCommStateがいっぱいあって、問題が特定できません。
エラーが発生するコードを載せましょう。
またMSDNをよく読みましょう。
0917デフォルトの名無しさん
2008/07/04(金) 21:17:000918デフォルトの名無しさん
2008/07/04(金) 21:17:160919デフォルトの名無しさん
2008/07/04(金) 21:33:51自己解決しました。サンプルが間違ってましたfParityにFALSEではなくNOPARITYが入ってました。
原因が絞れて解決できました、ありがとうございました。
0920デフォルトの名無しさん
2008/07/04(金) 21:45:23WebMasterに伝えてあげたいんだけど、サンプルのどこが間違えているの?
0921デフォルトの名無しさん
2008/07/04(金) 22:06:58コピペじゃなく、考えながら手で写しましょう
0922デフォルトの名無しさん
2008/07/04(金) 23:45:18AIとか訳分からんです
課題のレベルを下げるべきでしょうか?
0923デフォルトの名無しさん
2008/07/04(金) 23:55:22そのあとAIというか、評価関数を作ること。
「そのマスに置くのは何点くらいか?」を返す関数をね。
相手が勝つのを防げるか、自分のマークと繋がってるか、などで
適当に点数をつける。精度は徐々に上げていけばいい。
0924デフォルトの名無しさん
2008/07/04(金) 23:57:05ありがとうございます
その方針で頑張ってみます
0925デフォルトの名無しさん
2008/07/05(土) 00:01:16242
323
だったけ?これが、基本形
0926デフォルトの名無しさん
2008/07/05(土) 00:09:07dcb.fParity = NOPARITY;で検索できる全てです。
ただFALSEもNOPARITYも0なので不具合は無いのかもしれません
NOPARITYはdcb.Parity = NOPARITY;に入れましたが、この記述事態がこのサイトに見つかりません。
自分はCビルダーではなくVCなのでもっとわかりませんが、他の2サイトのCビルダー用のコードにはParityにNOPARITYが入っていました
dcb.Parity = NOPARITY;自体はデフォルトがあって省略できるのかもしれませんが不明です。
0927デフォルトの名無しさん
2008/07/05(土) 00:10:540928デフォルトの名無しさん
2008/07/05(土) 03:18:55CString workStr;
CString m_editx;
workStr.Format(_T("%s%c"), m_editx, 'In');
m_editx = m_editx + workStr;
これを実行するとDebug Assertion Failed! というエラーがでるのですが、これはなんですか?
0929デフォルトの名無しさん
2008/07/05(土) 03:28:20どういうアサーションが仕組まれてるのか分からないが、
%cに対して'In'を指定してることに対して怒っている事はまあわかる
0930デフォルトの名無しさん
2008/07/05(土) 03:33:01そもそも'In'なんてコンパイル通らない気がするんだが
m_editxが何も参照していないのはわざとか?どうでもいいけど
まー、MFCの方で聞いた方が適切だとは思うが
0931デフォルトの名無しさん
2008/07/05(土) 03:37:160932デフォルトの名無しさん
2008/07/05(土) 03:39:28% c を % s にして実行すると、ハンドルされていない例外が発生しました。というエラーが出ます。
Inはchar In[1] で固定なのですが、エディットボックスにどんどん連結で入れていく方法はないでしょうか
0933デフォルトの名無しさん
2008/07/05(土) 03:50:23なんでそんなことしちゃったの?
> % c を % s にして実行
0934デフォルトの名無しさん
2008/07/05(土) 03:59:36char Inr[1];
CAtlString workStr;
CString m_editx;
workStr.Format(_T("%s%c"), m_editx, Inr);
m_editx = m_editx + workStr;
エラーが悪化しました。
0935デフォルトの名無しさん
2008/07/05(土) 04:15:21まずそっちのDebug Assertion Failed!を特定します。すいません
0936デフォルトの名無しさん
2008/07/05(土) 06:09:45=== 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の中で書きたいのですが、どこを修正すれば良いでしょうか。
0937デフォルトの名無しさん
2008/07/05(土) 07:09:46結論から先に書くと、ヘッダに定義も書いておいてやらなきゃダメなんじゃないかなと。
テンプレートってのは特殊化されるまでは実体を持たないので、
いくら.cxxの中に定義を書いたところで
その翻訳単位の中で具体的な型を与えて実体化させてやらないと
出来上がったオブジェクトには含まれようがない。
つまり関数foo<int>を利用する場合
他のオブジェクトのいずれかにfoo<int>の具体的なコードが存在するか
自分の翻訳単位に具体的なコードを作るための定義が存在しないと
翻訳プログラムは「みつかんねーし自作も出来ねーよクソが」と怒るわけだ。
0938デフォルトの名無しさん
2008/07/05(土) 07:10:45自分がその症例起こしたことがないからわからんけど
http://www.fides.dti.ne.jp/~oka-t/cpplab-template-1.html
0939936
2008/07/05(土) 07:47:19ありがとうございます。>>938の方法でいけました。
ただしfriendがoperatorの場合は、
さらにclass宣言の前にoperatorを宣言しないと駄目なようです。
通常のfriendはclass宣言の後ろに書くと思いますが、
operatorの場合だけ(?)は前方に書かないとなぜかGCCでは通りませんでした。
0940936
2008/07/05(土) 07:49:15private:
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);
}
としました。(ちと汚いが…)
0941936
2008/07/05(土) 07:50:05>templaate class hoge<T>;
ではなく、
template<typename T> class hoge;
です。
0942デフォルトの名無しさん
2008/07/05(土) 10:03:24CStringはそうやっても大丈夫なように工夫されてたと思う
0943デフォルトの名無しさん
2008/07/05(土) 10:45:44#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でもいいのかな?
0944デフォルトの名無しさん
2008/07/05(土) 11:07:01randl=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です
0945デフォルトの名無しさん
2008/07/05(土) 11:19:01問題が再現する最小のコードを張ってください
長くなる場合には >>1 のアップローダを使ってください
0946デフォルトの名無しさん
2008/07/05(土) 11:20:070947デフォルトの名無しさん
2008/07/05(土) 12:46:11ヘッダー、ソースのどっちに記載するのが普通ですか?
0948デフォルトの名無しさん
2008/07/05(土) 12:47:55ヘッダに書いておくと、IDEが読み込んでバルーンヘルプに解説が出てくるから便利だな。
0949デフォルトの名無しさん
2008/07/05(土) 12:50:43そうですよね。 cppの方に記載してるソースこの間見つけて
すごい違和感を感じました。
0950デフォルトの名無しさん
2008/07/05(土) 13:55:49.cppに書くのは実装者(後のメンテナ)向けコメント
0951デフォルトの名無しさん
2008/07/05(土) 14:11:29今までそうしてて問題なかったんですが、初めて、テンプレート関数の特殊化を使ってみたとき
// 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に書けと言うことですか?
0952デフォルトの名無しさん
2008/07/05(土) 14:16:110953デフォルトの名無しさん
2008/07/05(土) 17:20:52値はC++で使う場合、クラスにラップした方がいいぉか?
0954デフォルトの名無しさん
2008/07/05(土) 17:32:450955デフォルトの名無しさん
2008/07/05(土) 17:50:57統一はしろ
0956デフォルトの名無しさん
2008/07/05(土) 17:54:55namespaceでの定義方法がよくわからないぉ?
0957デフォルトの名無しさん
2008/07/05(土) 17:59:59enum bar { hoge, piyo, puni };
}
foo::bar x = foo::hoge;
0958デフォルトの名無しさん
2008/07/05(土) 18:01:26namespaceは
0959デフォルトの名無しさん
2008/07/05(土) 18:15:29クラス名::関数名();
静的でないメンバ関数の呼び出しが正しくありません というエラーが出て呼び出せません
0960デフォルトの名無しさん
2008/07/05(土) 18:17:030961デフォルトの名無しさん
2008/07/05(土) 18:19:150962デフォルトの名無しさん
2008/07/05(土) 18:26:20std.関数名();
インスタンスの生成ってこうですか?
エラーなくなりましたありがとうございます!
0963デフォルトの名無しさん
2008/07/05(土) 18:26:31実行結果が見えるようにしたいのですがソースコードのどこに何を書けばいいのでしょうか?
0964デフォルトの名無しさん
2008/07/05(土) 18:28:290965デフォルトの名無しさん
2008/07/05(土) 18:29:240966デフォルトの名無しさん
2008/07/05(土) 18:30:50適当に入力待ち状態にしてそこで止める等々
0967デフォルトの名無しさん
2008/07/05(土) 18:45:00CTRL+F5
0968デフォルトの名無しさん
2008/07/05(土) 18:45:52mainのreturnにブレークポイント設定するとかCtrl+F5で実行するとか
0969デフォルトの名無しさん
2008/07/05(土) 18:47:33>>966,>>967
で行ったら確かに止まった、ありがたい
でもなんだか釈然としない
0970デフォルトの名無しさん
2008/07/05(土) 18:51:13上でscanf()等を使って文字列入力をしてる場合等がある
0971デフォルトの名無しさん
2008/07/05(土) 18:52:490972デフォルトの名無しさん
2008/07/05(土) 18:56:14#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;
}
//入力したコード
0973デフォルトの名無しさん
2008/07/05(土) 18:57:52こういうことだから理解してくれ
ブレークポインタ使うならF5
ブレークポインタ使わないならCtrl+F5
0974デフォルトの名無しさん
2008/07/05(土) 19:07:340975デフォルトの名無しさん
2008/07/05(土) 20:06:51マクロあったけど名前思い出せない
たじけて
0976デフォルトの名無しさん
2008/07/05(土) 20:52:06ルートアドレスって何?
0977デフォルトの名無しさん
2008/07/05(土) 20:53:270978デフォルトの名無しさん
2008/07/05(土) 20:54:550979デフォルトの名無しさん
2008/07/05(土) 20:57:590980デフォルトの名無しさん
2008/07/05(土) 22:01:56宣言上部でusing namespace std;するのが流儀?
0981デフォルトの名無しさん
2008/07/05(土) 22:03:370982デフォルトの名無しさん
2008/07/05(土) 22:03:56自分だけでやってるならアリかもしれないが
複数人で何かを作るのならやめておいたほうがいい
0983デフォルトの名無しさん
2008/07/05(土) 22:06:190984デフォルトの名無しさん
2008/07/05(土) 22:13:26void f(){
using namespace std;
...
}
0985デフォルトの名無しさん
2008/07/05(土) 23:40:46どうやって指定すればいいんですか?
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 );
0986デフォルトの名無しさん
2008/07/06(日) 00:39:200987デフォルトの名無しさん
2008/07/06(日) 01:37:07というエラーです。
0988デフォルトの名無しさん
2008/07/06(日) 01:40:25俺無理だった。
0989デフォルトの名無しさん
2008/07/06(日) 01:49:22IDD_ってダイアログリソースのIDだろ?
DialogBox()かCreateDialog()でしか使えないよ。
GetDlgItem()は対象のウィンドウ内の
子ウィンドウ(ボタンやテキストボックス)のハンドルを取得するためのもの。
CWndを継承してないのなら、
第一引数にウィンドウハンドルを渡す必要がある ::GetDlgItem(HWND, int)
を呼ぶことになる。
今のソースでは根本的に無理だと思うので、
入門書やネットでダイアログの基本的な使い方を見た方がいい。
0990デフォルトの名無しさん
2008/07/06(日) 02:02:38組込Cと比べてC++は地獄ですね
0991デフォルトの名無しさん
2008/07/06(日) 02:15:260992デフォルトの名無しさん
2008/07/06(日) 02:15:500993デフォルトの名無しさん
2008/07/06(日) 02:15:530994デフォルトの名無しさん
2008/07/06(日) 02:16:260995デフォルトの名無しさん
2008/07/06(日) 02:18:430996デフォルトの名無しさん
2008/07/06(日) 02:23:230997デフォルトの名無しさん
2008/07/06(日) 02:25:29http://pc11.2ch.net/test/read.cgi/tech/1215278693/
ありがたく使え。
0998デフォルトの名無しさん
2008/07/06(日) 02:31:59乙
0999デフォルトの名無しさん
2008/07/06(日) 02:32:20調子に乗るな
でも乙
1000デフォルトの名無しさん
2008/07/06(日) 02:33:1910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。