【初心者歓迎】C/C++室 Ver.56【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/07/06(日) 02:24:53ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1213466622/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2008/07/06(日) 02:30:47半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0003デフォルトの名無しさん
2008/07/06(日) 02:31:130004デフォルトの名無しさん
2008/07/06(日) 02:32:270005デフォルトの名無しさん
2008/07/06(日) 05:29:240006デフォルトの名無しさん
2008/07/06(日) 11:01:54これって派生先でオーバーライドするなら
とりあえず派生元にvirtual書いてしまってておk?
書いてて弊害起きるのかな?
0007デフォルトの名無しさん
2008/07/06(日) 11:05:490008デフォルトの名無しさん
2008/07/06(日) 11:09:000009デフォルトの名無しさん
2008/07/06(日) 11:15:06でも、仮想関数とオーバーライドの説明を
別個で説明してるケースが多いのなんでだろ
0010デフォルトの名無しさん
2008/07/06(日) 11:15:40struct A{
void f(){ std::cout << "A::f" << std::endl; }
};
struct B : A {
char* p;
B(){
p=new char[100];
std::cout << "new p" << std::endl;
}
~B(){
delete[] p;
std::cout << "delete p" << std::endl;
}
void f(){ std::cout << "B::f" << std::endl; }
};
void test(){
A* a = new B();
a->f();
delete a;
}
--出力--
new p
A::f
※ pはdelete[]されない
0011デフォルトの名無しさん
2008/07/06(日) 11:19:04それは置いといて継承先にvertualをつけるかつけないか議論になってたことがあるな
001210
2008/07/06(日) 11:20:42struct B : A {
virtual ~B(){...
virtual void f(){...
...
};
出力結果は同じ。
0013デフォルトの名無しさん
2008/07/06(日) 11:21:30インスタンスはBでも、Aとして振舞うのか
デストラクタが呼ばれないのは、よくわからんが
0014デフォルトの名無しさん
2008/07/06(日) 11:23:28C#やJavaなどでオーバーライドだと明示するようになってきてるから、
明示した方が良い、という流れなんだろうね。言語設計者達の中では。
0015デフォルトの名無しさん
2008/07/06(日) 11:26:30(A*)new Bとして使う場合は、
Aのデストラクタと仮想化したい関数にvirtualを付けておく必要がある。
デストラクタもオーバーライドしないとまずいってこと。
0016デフォルトの名無しさん
2008/07/06(日) 11:58:23C との互換性が崩れるのでできなかった。
個人的には、struct と class をもっと別のものとして
定義すべきだったと思う。
0017デフォルトの名無しさん
2008/07/06(日) 12:01:430018デフォルトの名無しさん
2008/07/06(日) 12:26:13やりましょうってのがC++のスタンス。
virtual書かなかったときのコンパイル後のイメージが浮かばん奴は
仕事でC++使うべきじゃない。っていうか意味分からないのにvirtual
書くなよ…
あ、遅くなるっていうのに対して、今時のCPUなら問題ないとかいう
レスはいらないから。
0019デフォルトの名無しさん
2008/07/06(日) 12:28:24やりましょうってのがC++のスタンス。
言いたいことは分かるが、「『安全、便利』は効率を犠牲にする場合はやらない」と書くべきでは。
0020デフォルトの名無しさん
2008/07/06(日) 12:29:40頭おかしくないか?
同様のことしようとしたら C でも、似たようなもんだろ。
0021デフォルトの名無しさん
2008/07/06(日) 12:32:01必要なら付けろよ
0022デフォルトの名無しさん
2008/07/06(日) 12:36:52>犠牲にする場合はやらない
そこまで強くないっしょ。軽微な効率ダウンと引き換えに
RTTIや例外は導入されたからね(そんなニュアンスのことが
ARMかD&Eにあった気がする)
>>20
>頭おかしくないか?
そこまで言われる筋合い無い。サイズ増えて遅くなる理由が
わかってるなら問題ないことだし。
0023デフォルトの名無しさん
2008/07/06(日) 16:02:250024デフォルトの名無しさん
2008/07/06(日) 16:06:22複数の変数がセットになっただけだよ
0025デフォルトの名無しさん
2008/07/06(日) 16:18:12箱をしまう箱っていうのはわかるんだけど、その中で関数書いたり
引数なしでおkのくせに、構造体で宣言されてる中の変数は使えるとかがいみぷーなんです。
0026デフォルトの名無しさん
2008/07/06(日) 16:19:49ん〜・・・どうやれば理解できるのか
0027デフォルトの名無しさん
2008/07/06(日) 16:22:140028デフォルトの名無しさん
2008/07/06(日) 16:23:490029デフォルトの名無しさん
2008/07/06(日) 16:24:05Cより新しいならC++のがよくね?ってC++の勉強してたら構造体単体なら分かりますが
構造体内で関数とかがいみぷーで。
0030デフォルトの名無しさん
2008/07/06(日) 16:24:510031デフォルトの名無しさん
2008/07/06(日) 16:29:42なのか
C++から入ったから細かいことはよく知らんのだ 情報thx
>>29
基本的に構造体とクラスってあんまり変わらないよ
実装的な違いでは、デフォルトのアクセス指定子がpublicなのかprivateなのかぐらいしか無いらしい
意味的な違いでは、構造体はデータ中心でクラスは関数中心として使うといい
0032デフォルトの名無しさん
2008/07/06(日) 16:30:14たとえば、エレベータというクラスがあるとして、メンバ変数に階数があるとしたら、
アップというメンバ関数でメンバ変数が変動するとか
0033デフォルトの名無しさん
2008/07/06(日) 16:33:09完全に隠ぺいしたい場合はクラスにするって感じかな
Getter/Setterを定義するのが無駄なくらい小規模なら、まず構造体
0034デフォルトの名無しさん
2008/07/06(日) 16:46:45struct A {
int n;
A() { n = 0; }
void func(){ n += 10; }
};
void test(){
A a;
a.func();
}
これはつまり
struct A {
int n;
}
void A_ctor(A* this) { this->n = 0; };
void A_func(A* this) { this->n += 10; };
void test(){
A a;
A_ctor(&a);
A_func(&a);
}
ということ。
0035デフォルトの名無しさん
2008/07/06(日) 17:21:37そうする過程で関数中心の時は必要だったものがデータ中心になると
関数中心とは別な考え方しなくてはいけないわけで、データ中心の考え方というのがわからない
0036デフォルトの名無しさん
2008/07/06(日) 17:30:59何言ってるか分からない・・・w
仮想関数など使わない限り、別な考え方とか要らないと思うけど。
構造化プログラミングとオブジェクト指向プログラミングの話?
0037デフォルトの名無しさん
2008/07/06(日) 17:47:26VC++だとコードの候補が出てきて楽なんですが
込み入ったところだとごちゃっとした感じになってしまって
もちろんなるべく見やすく書くように気を付けているんですが
どうしたモノかと迷ってて。
0038デフォルトの名無しさん
2008/07/06(日) 17:53:30別に全ての関数を構造体に入れないといけないってわけじゃないよ
0039デフォルトの名無しさん
2008/07/06(日) 18:20:27メンバ変数とかには基本m_ とか付けてる
けど何が一番良いのかは知らない
0040デフォルトの名無しさん
2008/07/06(日) 18:22:50コマンドプロンプト上に特定フォルダ配下の全テキストファイルを表示
↓
ファイルを選択
↓
ファイルを処理
という流れを作りたいのですが、
ファイル表示、ファイル選択は可能でしょうか? 可能なら、どうすれば実装できますか?
0041デフォルトの名無しさん
2008/07/06(日) 18:24:41あ、言語はC++です。失礼しました。
0042デフォルトの名無しさん
2008/07/06(日) 18:25:26「関数が入ってる、ってどういうことだろう?」みたいな疑問に振り回されちゃうことが
あるかもしれないね。
0043デフォルトの名無しさん
2008/07/06(日) 18:26:08一般的に批判的な声が多いコードでもあるが、コンパイラ依存度や可読性を考えたら、ありだと思ってる
0044デフォルトの名無しさん
2008/07/06(日) 18:26:57BCCはファイル表示もファイル選択も不可能だった希ガス。
VC++6.0ならできますよ。
0045デフォルトの名無しさん
2008/07/06(日) 18:29:39方法1 コンソール系のAPIをいじって対話型に選べるようにする。
方法2 ファイルに番号をつけて一覧する。番号を入力させて選択に代える。これならスクロール型のI/Fで可能。
方法1はDOS時代にエスケープシーケンス使ってやってたなぁ〜
0046デフォルトの名無しさん
2008/07/06(日) 18:32:23m_ だとメンバ変数だけに絞れて良いかなって個人的に思っては居るんだが
そういう話って良い悪いじゃなくて、一貫したコーディングスタイルであるか?
が問題な事が多い気がするし正解なんてないよね
0047デフォルトの名無しさん
2008/07/06(日) 18:32:590048デフォルトの名無しさん
2008/07/06(日) 18:38:25m_ ですがシステムハンガリアンが型のプリフィクスを多く使うのに対して
クラス内、外を区別できるので個人的にはアプリケーションハンガリアン寄りかなと
思っているのですが、これはちょっと自分に誤解があるのでしょうか。
0049デフォルトの名無しさん
2008/07/06(日) 18:41:04この辺は好みが別れるから一貫性が保ててればいいと思うよ。
個人的には
全部に this-> は冗長っぽい
m_val や val_ は悪くはないが、publicなフィールドにはちょっと
_val やってたらちょっとこい(笑
0050デフォルトの名無しさん
2008/07/06(日) 18:45:23ありがとうございました。方法1を調べてみます。
ヴィジュアル系の環境、さっぱりわからんので、方法1が向いてそうです。
0051デフォルトの名無しさん
2008/07/06(日) 18:46:110052デフォルトの名無しさん
2008/07/06(日) 18:46:30Win32の場合だけど
0053デフォルトの名無しさん
2008/07/06(日) 18:46:43C#だと_valやってます、さーせんw
0054デフォルトの名無しさん
2008/07/06(日) 18:47:55プレフィックスがCursorってことか?
カーソル位置と言っても、絶対座標と相対座標と色々あるし、しっかり設計してから決めた方がいいぞ
0055デフォルトの名無しさん
2008/07/06(日) 18:51:39相対座標でしょうか(意識したことがないので)
名前の付け方でいつも四苦八苦なのも思い出しました…
0056デフォルトの名無しさん
2008/07/06(日) 20:45:02返すような設計にするべきなんでしょうか?
それとも全部例外処理で実装するべきなんでしょうか
0057デフォルトの名無しさん
2008/07/06(日) 21:00:24コンストラクタで実行時エラーが起きたらどうしてるんだろうか。
0058デフォルトの名無しさん
2008/07/06(日) 21:13:400059デフォルトの名無しさん
2008/07/06(日) 21:15:59・newをオーバーロードしてるか
・コンストラクタで実行時エラー起きるようなことしない
・そもそもメモリ不足とかは無いものとして組む
0060デフォルトの名無しさん
2008/07/06(日) 22:26:13すべてのクラスの基底になってるクラスに、
「newされたかどうか」って示すフィールドがあるとか。
....めっさ素人ぃな発想で住まん。
0061デフォルトの名無しさん
2008/07/06(日) 22:53:520062デフォルトの名無しさん
2008/07/06(日) 23:00:31コレ読めばいいのかな?日本語訳ちょっとへんなとこあるけど
0063デフォルトの名無しさん
2008/07/06(日) 23:38:370064デフォルトの名無しさん
2008/07/07(月) 11:05:37HANDLE HogeFile = ::CreateFile();
このダブルコロンの意味を教えてください。
0065デフォルトの名無しさん
2008/07/07(月) 11:09:21この場合どの名前空間にも属してない = グローバル空間に属してると考えると良いと思う
0066デフォルトの名無しさん
2008/07/07(月) 11:17:48ありがとうございます!残りは自分で調べます!
0067デフォルトの名無しさん
2008/07/07(月) 11:36:33全部に this-> つけないと一貫性がない気がするんですが。。。
ところでthis->で区別できるからといって
メンバ変数とローカル変数を同じネーミング規則にするのは危険だと思う。
他人が保守したときにバグになりそうなので。
(this->をつけるのを強制できないしね)
0068デフォルトの名無しさん
2008/07/07(月) 11:37:10先ほど全角スペースによるコンパイルエラーというものを知りました。
調べてる時に思ったんですが
全角 × 半角 ○ インデント・・・?
インデントは使っても安全なのでしょうか?
それとも安全とわかりきっている半角スペースを使うべきなのでしょうか?
0069デフォルトの名無しさん
2008/07/07(月) 11:39:49それ自体が全角スペースだとか半角スペースだとかは無い
別にTabでインデントしても良い
0070デフォルトの名無しさん
2008/07/07(月) 11:49:53空白文字 : 半角スペース、TAB、改行
非空白文字 : 全角スペース 他
半角スペースかTABを使って下さい。
0071デフォルトの名無しさん
2008/07/07(月) 12:34:01なるほど、文字としての種類というか、扱いが違うんですね。
ありがとうございました。
0072デフォルトの名無しさん
2008/07/07(月) 14:11:06>>2にある、全角スペースの話は、
こういう掲示板で他人に「みせる」ときに使ってね。という話
(果てしなく意味のないコードだけど気にしない(゚ε゚))
//半角スペース
if(true){
int hoge; //インデントしてます
}
//全角スペース
if(true){
int hoge; //インデントしてます
}
とまぁ、前者はスペース入れても掲示板の仕様で消されてしまい見にくくなる
全角半角の違いはアスキーコード(ASCII CODE)を調べるべし
その手の話はC言語の定番の練習問題でもある
0073デフォルトの名無しさん
2008/07/07(月) 15:01:51Cの定番というより、PCの基本じゃないか。
0074デフォルトの名無しさん
2008/07/07(月) 17:13:50詳しい解説ありがとうございます。
>>73
そうですね、ちょっと調べればわかる事でした、失礼しました
0075デフォルトの名無しさん
2008/07/07(月) 17:23:15これはまあPCの基本になるのかもしれないね。
HTMLにおける連続したスペースの扱いに関する知識。
> 全角半角の違いはアスキーコード(ASCII CODE)を調べるべし
けど、定番の練習問題がかかっているのはこっちでしょ
0076デフォルトの名無しさん
2008/07/07(月) 18:23:34おねがいします。
// MFCダイアログ
void CRS232C_TESTDlg::OnBnClickedstart(){
CClientDC* pDC( this );
AfxBeginThread( drawData::DrawThreadFunction, (LPVOID*)&pDC, THREAD_PRIORITY_HIGHEST );
}
// 自作クラス
class drawData : public CObject{
static UINT __cdecl DrawThreadFunction( LPVOID pParam ){
CClientDC* pDC( pParam ); //成功させたい場所
}}
0077デフォルトの名無しさん
2008/07/07(月) 18:26:52あるならGetDCすればいいし、無ければCreateDCするしかないかな。
CreateDCするにはどのデバイスのDCかの指定は要るけどね。
0078デフォルトの名無しさん
2008/07/07(月) 18:28:450079デフォルトの名無しさん
2008/07/07(月) 18:50:05基本クラスCObjectで作ったのに既定のコンストラクタがないと言われてしまいます
CWndはキャストできないと言われてしまいます
// MFCダイアログ
void CRS232C_TESTDlg::OnBnClickedstart(){
AfxBeginThread( drawData::DrawThreadFunction, this, THREAD_PRIORITY_HIGHEST );
}
// 自作クラス
class drawData : public CObject{
static UINT __cdecl DrawThreadFunction( LPVOID* pParam ){
//CClientDC* pDC( (CWnd*)pParam );
CClientDC* pDC;
pDC = pParam->GetDC();
}}
0080デフォルトの名無しさん
2008/07/07(月) 18:55:35が、なにも起動しませんw
0081デフォルトの名無しさん
2008/07/07(月) 19:38:03のような関数内で、dataのサイズを知りたいのですが、どうしたら良いのでしょうか。
sizeof(data)を行うと、明らかに正しくない値が返ってくるみたいなのですが、、、
0082デフォルトの名無しさん
2008/07/07(月) 19:53:39なんだか手違いで動いてないように見えただけみたいですorz
0083デフォルトの名無しさん
2008/07/07(月) 20:11:26スレッドアフィニティがあった気がするけど
0084デフォルトの名無しさん
2008/07/07(月) 21:49:36の値は必ず1であると保証されているのでしょうか。
中には0以外の値と書かれてますが。そういう場合もあるのでしょうか。
0085デフォルトの名無しさん
2008/07/07(月) 21:50:42これは、中には「0以外の値」と説明しているところもあるという意味です。
0086デフォルトの名無しさん
2008/07/07(月) 22:04:55特に保証はされてない
0087デフォルトの名無しさん
2008/07/07(月) 22:10:34結果の型はintとする。式!Eは(0==E)と等価とする。
保障されてる
0088デフォルトの名無しさん
2008/07/07(月) 22:35:360089デフォルトの名無しさん
2008/07/07(月) 22:37:190090デフォルトの名無しさん
2008/07/07(月) 22:41:530091デフォルトの名無しさん
2008/07/07(月) 23:04:140092デフォルトの名無しさん
2008/07/08(火) 00:10:34ってどうやって解除すればいいんですか?
PC再起動するまで直らないんですけど
0093デフォルトの名無しさん
2008/07/08(火) 00:16:280094デフォルトの名無しさん
2008/07/08(火) 00:30:43http://www.excite.co.jp/world/english/
0095デフォルトの名無しさん
2008/07/08(火) 01:48:580096デフォルトの名無しさん
2008/07/08(火) 04:45:12カスタムコントロールは配置するだけだとメモリリークする
0097デフォルトの名無しさん
2008/07/08(火) 12:04:40-1を返すべき?
それともNULL?
あとassertとperrorってどう違うの?
0098デフォルトの名無しさん
2008/07/08(火) 12:18:45まずTESTって実行ファイルを作成したんだ
ただハローワールドが表示されるだけのプログラムなんだけど
gnome-terminalでもう一個ウインドウ立ち上げて引数に
実行ファイル名指定してるんだが新しいウインドウに
ハローワールドが表示されない。
どんな感じで実装したらいいのかな?
もしスレチならごめん
0099デフォルトの名無しさん
2008/07/08(火) 12:19:25> -1を返すべき?
> それともNULL?
ケースバイケース
> あとassertとperrorってどう違うの?
マニュアル読めばわかる。
読んで分からないのなら、どう分からないのか書け。
0100デフォルトの名無しさん
2008/07/08(火) 12:22:33boost::optional
0101デフォルトの名無しさん
2008/07/08(火) 12:30:14>ケースバイケース
とか分かってんだよ
慣例とか具体例とか使って教えてちょ
perroとassertは調べるわ
0102デフォルトの名無しさん
2008/07/08(火) 12:33:40自分で決められないならママに聞け。
0103デフォルトの名無しさん
2008/07/08(火) 12:39:59それは今回の君の状況を具体的に書くのが先だよ。
0104デフォルトの名無しさん
2008/07/08(火) 12:42:22他所の環境だと動かないらしく、調べてみると
VC++2005 が入っていない環境では
VC++2005のランタイムが必要だとかいう記述などに行き着きました。
これはどんな状態にもかかわらず、そういうものなんでしょうか?
それとも、こちらのコンパイル時の設定などによってどうなかなったりするんでしょうか?
あるいは単純にVS2008買ってコンパイルすればOKとか・・・
よろしくお願いします。
0105デフォルトの名無しさん
2008/07/08(火) 12:45:40エラーメッセージが出るのならコピペしろ。
考えられるのはデバッグビルド版を配布してるとか。
0106デフォルトの名無しさん
2008/07/08(火) 12:49:27ランタイムライブラリを「マルチスレッド DLL」ではなく「マルチスレッド」にする
0107デフォルトの名無しさん
2008/07/08(火) 12:56:38http://bbs.wankuma.com/index.cgi?mode=al2&namber=13200&KLOG=28
0108デフォルトの名無しさん
2008/07/08(火) 13:16:57基本的なことを忘れてました。すいません。
エラー:
このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。
詳細については、アプリケーションのイベント ログを参照してください。
そのログ:
Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50608.0" が見つかりませんでした。
詳細な診断を行うには sxstrace.exe を実行してください。
とかいうものです。
その後ですが、>>106さんに教えてもらったように
「マルチスレッド デバッグ (/MTd)」にしたら動いたようです。
(ただの「マルチスレッド」はリリースビルドしないとビルドできないのは、それで正しいんですよね?)
でもこれの意味ってなんなんでしょうか?
できるだけ噛み砕いて教えてもらえると助かります。
0109108
2008/07/08(火) 13:32:25>>107
に書いてありました。
なんとなく分かったような分からんような。
ちょっとお勉強してきます。ありがとうございました。
0110デフォルトの名無しさん
2008/07/08(火) 13:32:39スタティックリンクでぐぐれ
0111デフォルトの名無しさん
2008/07/08(火) 17:38:12値が常に0から360度になるようにしたいのです
500度を代入したら140度が格納されるように
しかし、いちいちsetterを経由したくありません
C#だとプロパティでかのうですが、C++で同じようなことはできないでしょうか
0112デフォルトの名無しさん
2008/07/08(火) 17:43:11値を格納するときに、チェックしろよ。 x を入力したとき
x - 360 * {x/360}
{y}はyより小さい方のほうの整数に変換する
0113デフォルトの名無しさん
2008/07/08(火) 17:45:570114デフォルトの名無しさん
2008/07/08(火) 18:01:32それか角度クラス作って演算子オーバーロードでなんとかするとか。
0115デフォルトの名無しさん
2008/07/08(火) 18:05:01const double T = 12;
const int A = (int)T;
int B[A];
とすると、エラー:定数式が必要 と言われてしまいます。
Tはdoubleの必要があるので、これを変換する方法を教えてください。
0116デフォルトの名無しさん
2008/07/08(火) 18:08:410117デフォルトの名無しさん
2008/07/08(火) 18:10:53const int A = (int)T;
int B[12];
0118デフォルトの名無しさん
2008/07/08(火) 18:17:05const double T = N ;
int B[N] ;
0119115
2008/07/08(火) 18:20:03変数をひとつにしたいのですが・・・
>>116 さんのも、値の変更忘れが怖いので出来たら一元化したいです。
const double 型を const int 型に変換することは出来ないんですか?
0120デフォルトの名無しさん
2008/07/08(火) 18:23:580121115
2008/07/08(火) 18:29:080122デフォルトの名無しさん
2008/07/08(火) 18:45:37const int には整数の定数式を入れましょう。
ほぼ総てのプログラマーは部下から>>115のプログラムを見せられたら。転職を進めるでしょう。
0123デフォルトの名無しさん
2008/07/08(火) 18:47:320124デフォルトの名無しさん
2008/07/08(火) 19:10:26知らないやつがしゃしゃり出てんじゃねーよ
0125デフォルトの名無しさん
2008/07/08(火) 19:16:330126デフォルトの名無しさん
2008/07/08(火) 19:23:51変換なんて考えないで、>>118でいいんじゃね?
0127デフォルトの名無しさん
2008/07/08(火) 19:40:14最初の文でうまく実行できない理由が分からないので、再度質問させてください。
A はなぜ整数の定数式ではないのですか?
整数でないのか、定数式でないのか・・・。いろいろ試しましたが分かりませんでした。
0128デフォルトの名無しさん
2008/07/08(火) 19:41:040129デフォルトの名無しさん
2008/07/08(火) 19:43:180130デフォルトの名無しさん
2008/07/08(火) 19:43:570131デフォルトの名無しさん
2008/07/08(火) 19:47:450132デフォルトの名無しさん
2008/07/08(火) 19:48:52まずどう解決したのかを書くと良いよ。
0133デフォルトの名無しさん
2008/07/08(火) 19:51:30まったく見つからないわけだが。Cはどうしたの?死ぬの?
0134デフォルトの名無しさん
2008/07/08(火) 19:54:090135デフォルトの名無しさん
2008/07/08(火) 20:13:57いつ定数になるんですか?
>>129
変数を定数にする修飾子だと認識してます。
const double T=12;
const int A = (int)T;
// int B[A];
で実行したらエラーはでない = Aは定数の整数と定義(?)されいる
のに、なぜAを配列の添え字に使えないのかが分かりません・・・。
>>131
プログラムを見直したらTがdoubleである必要が無かったのでintにして解決しました。
0137デフォルトの名無しさん
2008/07/08(火) 20:37:06具体例を書けば教えてくれるなら
何かしらのルールがあるわけでしょ?
その指針を教えてください,と。
あと具体例はないんです
常々関数作ってるときに思ってる疑問なんです
0138デフォルトの名無しさん
2008/07/08(火) 20:53:200139デフォルトの名無しさん
2008/07/08(火) 20:53:49CやC++で無効ポインタはNULLとか0だけ。
これ以外の値は「有効なポインタ」と区別がつかない。
だからポインタを返す関数は、失敗時に-1を返すことはあり得ない。
エラーコードを返す種類の関数で、
失敗したときに-1を返すべきか0(NULL)を返すべきかだと、-1のほうがいいことが多い。
なぜなら関数の成功を0で表す場合が多いから(=成功の状態は一つしか無いことが多い)
エラーはエラーの種類によって0以外のいろんな値を使うことが多い。
でも、関数によっては成功時に非0を返した方がいいかもしれない。
条件式では「真」として評価されるから。
この辺はほんとうにケースバイケース。
0140デフォルトの名無しさん
2008/07/08(火) 20:59:18int a;
int b;
}DATA;
という構造体を定義しmain関数で DATA hogeと宣言します
これを関数に渡して処理したいんですがどうかけばいいですか
int func(DATA hoge){
}
だとエラーになります・・・
0141デフォルトの名無しさん
2008/07/08(火) 20:59:28Cなら成功時に0を返す
C++ならboolを返せば悩まなくてすむぞ
0142デフォルトの名無しさん
2008/07/08(火) 21:03:05それでエラーが出ませんが
どのような書き方でどのようなエラーが出てるんでしょうか?
0143デフォルトの名無しさん
2008/07/08(火) 21:03:37一見問題なさそうだよ
0144デフォルトの名無しさん
2008/07/08(火) 21:05:18'func : 関数に 1 個の引数を指定できません。
とでます。
構造体の宣言の時にDATA *hoge;
ってなってました。
これは他人が書いた部分でSound hoge;ってできません
0145デフォルトの名無しさん
2008/07/08(火) 21:06:42とかってなんなの?
define文とかで出てくるんだけど。
先にhogehogeとclassNameのdefineを解釈して
その後に単語として連結するって意味?
VC++なんだけど
0146デフォルトの名無しさん
2008/07/08(火) 21:08:31何歳?
0147デフォルトの名無しさん
2008/07/08(火) 21:10:2218歳です
0148デフォルトの名無しさん
2008/07/08(火) 21:10:47typedef struct{
int a;
int b;
} DATA;
int func(DATA *hoge);
int main()
{
DATA *hoge;
func(hoge);
return 0;
}
int func(DATA *hoge)
{
return 0;
}
これで通るよ
0149144
2008/07/08(火) 21:11:14に訂正します
0150144
2008/07/08(火) 21:13:01プロトタイプ宣言のところを書き換えるの忘れてたせいでした。。。
すいません
0151デフォルトの名無しさん
2008/07/08(火) 21:13:380152デフォルトの名無しさん
2008/07/08(火) 21:14:540154デフォルトの名無しさん
2008/07/08(火) 22:06:40∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´∀`)/<先生!!なぜか僕には理解できない外国語が流れます!
_ / / / \ 故障ではないですか?
\⊂ノ ̄ ̄ ̄ ̄\ \_______________
||\ \
||\|| ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄||
.|| ||
0155デフォルトの名無しさん
2008/07/09(水) 00:27:17##は単に連結する
0156デフォルトの名無しさん
2008/07/09(水) 00:33:52空白無しでくっつけると覚えておけばいいと思う。文字の置き換えするだけだし。
#define a(x) x ## f
#define b(x) a(x)(#x)
b(print);
printf("print");
0157デフォルトの名無しさん
2008/07/09(水) 00:34:09文字列ではなく
0158デフォルトの名無しさん
2008/07/09(水) 01:20:360159デフォルトの名無しさん
2008/07/09(水) 01:41:520160デフォルトの名無しさん
2008/07/09(水) 01:42:25virtualと付けてもオーバーライドしなければそのまま使えるのであれば
関数にはとりあえずvirtualと付けておけば良くないですか?
0161デフォルトの名無しさん
2008/07/09(水) 01:42:580162デフォルトの名無しさん
2008/07/09(水) 01:48:27誤解を招くことあるし、パフォーマンスも落ちる
0163デフォルトの名無しさん
2008/07/09(水) 01:59:37パフォーマンスの低下以外に何か大きなデメリットはあるのですか?
0164デフォルトの名無しさん
2008/07/09(水) 02:01:57#include <new.h>
class test{
int *array;
public:
test(int x);
~test(){delete [] array;};
};
test::test(int x = 1){
try{
array = new int[x];
}catch(bad_alloc&){
std::cout << "bad_alloc" << std::endl;
abort();
}
};
int main(){
test *a;
while(1) a = new test;
return 0;
}
// 実行結果
//
// Abnormal program termination
//
0165デフォルトの名無しさん
2008/07/09(水) 02:03:37#include <new.h>
int main(){
int *array;
while(1){
try{
array = new int[10000];
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
}
return 0;
}
// 実行結果
// bad_alloc!!!
//
// Abnormal program termination
//
こっちだとうまくいくんだが・・・
0166デフォルトの名無しさん
2008/07/09(水) 02:03:56そのプログラムを、ちゃんとしたプログラマーに見せたら。
「君、もう帰っていいよ」 と言われて。
君がダメプログラマーであるレッテルを貼られる。
0167デフォルトの名無しさん
2008/07/09(水) 02:06:55> 関数にはとりあえずvirtualと付け
「とりあえず」が非常にまずい
0168デフォルトの名無しさん
2008/07/09(水) 02:07:00追加で、何も言われなかったら陰で笑われるを追加。
0169デフォルトの名無しさん
2008/07/09(水) 02:08:32ちゃんと教えてあげてよ。
俺C++わからんから答えられないけど、そのレスはかわいそうだわ
0170デフォルトの名無しさん
2008/07/09(水) 02:17:360171デフォルトの名無しさん
2008/07/09(水) 02:23:22知りたければ、ネットでも本でも読めばいい。ここは教育を行う場ではない。
調べて分からなければ、そのわからないところを聞くべきと思われ。
ついでに自演乙。
0172デフォルトの名無しさん
2008/07/09(水) 02:24:21そのような言語があるということは、
仮想関数がデフォルトであることに致命的なデメリットは無いということですね?
ならば何が「ダメ」で「まずい」んでしょうか?その方が便利だと思うのですが。
0173デフォルトの名無しさん
2008/07/09(水) 02:25:28答えられないからってその逃げはないわ
0174デフォルトの名無しさん
2008/07/09(水) 02:37:39全部virtualにする危険性はなんとなく想像できる
つまり公衆の面前で全裸はマズイということだ
0175デフォルトの名無しさん
2008/07/09(水) 02:41:48俺はPHPのOOPしかまともにやった事がないと事前に言い訳させといてね
C++ってvirtual付けてないと親クラスのメソッドとして実行されちゃうと思うんだけど、
それだと、継承先の子クラスの方で「あれ?オーバライドしたのに親クラスの動作に
なるぞ?」ってなるんじゃない?
たとえば、親クラスで以下のメソッドがあるとする
・Hoge::testMethod() { cout << "親クラスですよ"; }
で、これを子クラスのほうでオーバライドする
・Foo::testMethod() { cout << "子クラスですよ"; }
これで、子クラスのインスタンス作ってtestMethodを実行したら実行結果が、親クラスですよ
っていう結果になってしまうのだよ!
※ Foo* fooInstance = new Foo();でインスタンスを作った場合
ただし、Fooインスタンスを作る場合に、上の例みたいに参照先を設定するんじゃなくて、
Foo fooInstane
見たいな作り方すれば意図した動作をするみたい(子クラスですよが表示される)
ただ、インスタンスの作り方なんて人が変われば異なってくる可能性があるから、オーバライドするなら
virtual付けといた方がいいと思う。
多分間違ってないと思うけど参考程度に・・・
0176デフォルトの名無しさん
2008/07/09(水) 02:48:12大きいデメリットかどうかは状況によるけど、
あまり良くはない。
・デフォルトで非仮想なC++では、virtualが付いていると
オーバーライドして欲しいというセマンティクスが強くなる。
そのため、逆に本当にオーバーライドすべきものが分かり辛くなる。
・通常、継承よりコンポジションの方が良い。
オーバーライドは、元のクラスの実装を知っている必要があることが比較的多く、
より依存性が大きくなる。
・仮想化のためにvptrというのが付加され、
インスタンスのサイズも増える。
・本当に多様が必要な場合はともかく、単に機能を追加する場合は、
バイナリのサイズとのトレードオフはあるものの、
テンプレートでの拡張の方が良いことが多い。
こちらの方がコンパイラの最適化がよりよく働く。
>>167
何が非常にまずいんだ?
>>166, >>168
キメェレスだな
0177175
2008/07/09(水) 02:48:18よく考えるとJavaとかPHPの親クラスには原則virtualがついてるような物かもしれんね。
ちなみに>>163の名前が被らない様に気をつけて〜という部分なんだけど、この部分に
関しては仕事では宜しくないと思う。気をつけててもやっちゃう事が可能性としてある訳
だから理想としてはそもそも出来ないようにしておくべきだね。
個人とかある程度見通しの良い規模なら全然問題ないと思うけど。
0178デフォルトの名無しさん
2008/07/09(水) 02:56:13いやいや、それは子クラスのほうが呼ばれるだろう。
0179デフォルトの名無しさん
2008/07/09(水) 02:58:51つまり、「何でもかんでも付けるのが悪い」ではなく、「必要なものにだけ付けた方が良い」ということですね。
やっと納得しました。ありがとうございます。
0180デフォルトの名無しさん
2008/07/09(水) 03:03:08後(継承先のクラス)で内容が変えられちゃうかも知れないけど
どんなことをするのか仮組み(仮想関数)しておくね。
でも、弄る時はちゃんと読んで(コンストラクタして)から弄ってね。
みんな、ボクの手順に従うなら覚えるまで時間掛かるけど、
覚えちゃえば直ぐ作業にかかれるからね。
もし、君が仮組みを使って好きな様に弄りたいならちゃんと自分で考えてね。
やることが増えちゃうけど、自分好みにできるよ。
こんなかんじ?
0181デフォルトの名無しさん
2008/07/09(水) 03:03:57本当だ!
ということは、親クラスのインスタンスを生成してtestMethodを実行しても、virtualが付いてて子クラスで
オーバライドされてると、親クラスのインスタンスでメソッド実行してもオーバライドされてる子クラス側の
メソッドが動いちゃうんだ!
ということは、virtualの動作で気をつけるのは子クラスじゃなくて親クラスの方か?
0182デフォルトの名無しさん
2008/07/09(水) 03:21:55phpのfinalがC++の標準で
phpのabstractがC++の純粋仮想関数
ってことかしら
0183デフォルトの名無しさん
2008/07/09(水) 03:26:00親クラスのインスタンスなら親クラスのメソッドが動くだろ。
親クラスっぽいけど実は子クラスの時に仮想関数の仕組みが動くんだよ。
#include <iostream>
using namespace std;
class Parent {
public:
virtual void Foo() { cout << "Parent::Foo()" << endl; }
};
class Child : public Parent {
public:
virtual void Foo() { cout << "Child::Foo()" << endl; }
};
int main() {
Parent p; p.Foo();
Child c; c.Foo();
Parent * pp = &c; pp->Foo();
return 0;
}
--output--
Parent::Foo()
Child::Foo()
Child::Foo()
0184デフォルトの名無しさん
2008/07/09(水) 03:27:42お前は何を言っているんだ。
0185デフォルトの名無しさん
2008/07/09(水) 08:30:29かっこいい
0186デフォルトの名無しさん
2008/07/09(水) 08:36:310187デフォルトの名無しさん
2008/07/09(水) 09:21:09using namespace std;
class base1 {
base1();
~base1(){cout<<"base1"<<endl;
}
class obj1:public base1 {
obj1();
~obj(){cout<<"obj1"<<endl;
}
class base2 {
base2();
virtual ~base2(){cout<<"base2"<<endl;
}
class obj2:public base2 {
obj2();
~obj2(){cout<<"obj2"<<endl;
}
int main()
{
cout <<"非仮想"<<endl;
base1 *p1 = new obj1;
delete p1;
cout <<"仮想"<<endl;
base2 *p2 = new obj2;
delete p2;
return 0;
}
0188デフォルトの名無しさん
2008/07/09(水) 09:29:35↓仮想継承
#include <iostream>
using namespace std;
class base {
protected:
int val;
public:
int getval(){ return val;};
};
class obj1 : virtual public base{};
class obj2 : virtual public base{};
class obj3 : public obj2, obj3 {
public:
obj3(){ val=100; };
};
int main()
{
obj3 my;
cout << my.getval() << endl;
return 0;
}
0189デフォルトの名無しさん
2008/07/09(水) 09:38:53使いどころも良く分かって無い人間が、近年の言語ではC++にしか
ない多重継承でのさらに仮想継承まで知る必要ねーよ。
0190デフォルトの名無しさん
2008/07/09(水) 09:41:28仮想関数のオーバーライドが出来るようになる。
このため、基本クラスの派生クラスでは、
実装内容だけが異なる、全く同じ形式の仮想関数を持つことが出来る。
これにより、基本クラスとその派生クラスでは、共通インターフェースを持つことが出来る。
>>187-188
標準C++言語辞典柏原正三(著) より抜粋簡略
という事らしい
0191デフォルトの名無しさん
2008/07/09(水) 09:53:43その関数に小クラスを渡した
関数 a は
virtual 付きメソッドなら 小クラス側を実行し
virtual 無しメソッドなら 親クラス側を実行する
0192デフォルトの名無しさん
2008/07/09(水) 10:12:55C++ってなんかすげえね。勉強しよかなw
0193デフォルトの名無しさん
2008/07/09(水) 10:21:271. Windowsで動かす際に、スクリプトをどのように変更すれば良いですか?
それとも基本的な仕様から違いますか?
2. Windowsのコンパイラは持っていないのですが、手に入れるのは容易ですか?
3. Windowsで動かす際、exe(実行)ファイルにして誰でも扱えるようにすることは可能ですか?
よろしくお願いします
0194デフォルトの名無しさん
2008/07/09(水) 10:26:13クロスコンパイラーでもあれば別
2.容易
3.同じwindows環境であれば。
0195デフォルトの名無しさん
2008/07/09(水) 10:28:12仕様違うんですね……書き方が似てる程度でしたか
ちょっとWindowsのほうも勉強してみます
0196デフォルトの名無しさん
2008/07/09(水) 10:31:25C言語完璧にしてからのほうがいい。完璧ってのはどのくらいか?
というと
・コンパイル結果のアセンブラがどんなプロセッサでもなんとなく読めるようになること。
・C言語で色々やっていて「こういうところは言語が自動化してくれたら楽だなあ」とか思えるようになること。
C++は「こういうところは言語が自動化してくれたら…」をやってくれた言語なので、
つまずくことが減る。いきなりC++やっても上に何人もいるvirtualの使いどころが
分からない人間になるのが落ち。
挙動を言葉で知っていても、使いどころが分からないので、とりあえず
全部つけとけ、ということになる。
余談だが、Javaをいきなりやるのは有りだと思う。Javaは全部virtualだから。それが
どういうことか分かるだろ? いきなりやった人間が区別できないのは目に見えてる
から、機能的に無いと困るvirtualで統一したんだよ。
0197デフォルトの名無しさん
2008/07/09(水) 10:32:00スクリプトがソースコードをさしているのなら、OS固有のAPI使ってない限り、
その環境でコンパイルすれば動く
0198デフォルトの名無しさん
2008/07/09(水) 10:34:07C Perl PHP JavaScript C#あたりをやったことあって、C++の挙動がおもしろそうだなあと思っただけなんだけど
アセンブラ読めないと手をつけないと駄目ですか
0199デフォルトの名無しさん
2008/07/09(水) 10:35:35言語で決められているわけではなく、実装により変えられるところがおもしろそうだなあと思ったとこです。
0200デフォルトの名無しさん
2008/07/09(水) 10:37:37恐らくソースコードの事です。スクリプトだと意味が違ってしまうんですね…。
ありがとうございます、C言語にC++が少しだけ入ってる程度なんでちょっとWindowsでそのままコンパイルしてみます
0201デフォルトの名無しさん
2008/07/09(水) 10:54:44>C++の挙動がおもしろそうだなあ
これがもし、Cやってて「こうだったらいいのになあ」と思ったことに
結びついてるならC++やる資格あると思うよ。
アセンブラに関しては、概要を知っておけば、C++の挙動が
どうしてこうなるのか、というのが直接覗けるので、virtualを
全部つけとけばいい、みたいなことを考えなくて済むようになる。
0202デフォルトの名無しさん
2008/07/09(水) 10:57:41C#を知っててなぜそういう感想になるw
C#は親側でvirtual, 子側でoverrideを指定するとポリモーフィックになる
そうでなければメソッド呼び出しは静的に解決される
子側の指定も必要なのがC++よりキツいが、基本的に同じだろ
0203デフォルトの名無しさん
2008/07/09(水) 10:59:42>おもしろそうだなあ
面白いかどうかよりも、プログラムする上で必要かどうかじゃないか。
プログラムが趣味で言語オタクとしてそれを楽しむというなら、
本末転倒は承知の上でそれもアリだがな。
0204デフォルトの名無しさん
2008/07/09(水) 11:00:50ごめんwC#もっと勉強してから出直すwww
0205デフォルトの名無しさん
2008/07/09(水) 11:03:16便乗質問なんだけど、親のvirtual指定を子側でキャンセル(あえてoverrideしない)できるということ?
0206デフォルトの名無しさん
2008/07/09(水) 11:04:58俺はそうは思わない
BASICやCOBOLだけやってて、オブジェクト指向や関数型の言語に触れたことの無い人は
普通は言語に思考を規定されることになる
知的好奇心や向上心を失ったプログラマは、あっという間に老害化するだけだ
が、C++は勧めないな、俺は
0207デフォルトの名無しさん
2008/07/09(水) 11:06:49そういうことになるね
キャンセルというよりは
C#だと
親のvirtualは「オーバーライドしていいよ」
子のoverrideは「オーバーライドします」
ってことだな
C++的発想だと、virtualであると言った時点でvtbl作らないといかんわけだし
無駄に見えるけどな
0208デフォルトの名無しさん
2008/07/09(水) 11:12:33選択肢が増えるのがいいことなのか、親がvirtualしろといってるのに
しないってのはどうかと思うが。
まあC++の場合は親のポインタから呼び出すときでも、強制的に
静的に呼び出せるから、同じといっちゃあ同じだがね。vtblは
確かに無駄になる。
0209デフォルトの名無しさん
2008/07/09(水) 11:22:01何言ってんのお前。
低位の動作は隠蔽して、より使いやすくするために高級プログラミング言語が生まれたんだろ。
アセンブラやCを学んで悪いことは無いが、学ばなきゃいけない、なんてバカげてる。
そんなものはつまずいた時に初めて、関係あるところだけ目を通せばいいんだよ。
いや、それすら普通は必要ないだろうな。「C++の勉強」をしていれば、C++は使えるようになる。
virtualの件だって、最初は全部に付けてたっていいじゃないか。
それで何か問題が起きて初めて、これは変だと気付けばいいだけの話だろ。
最初から全て理解した上でなきゃ何もしてはならない、なんてのは最低の勉強方法だ。
0210デフォルトの名無しさん
2008/07/09(水) 11:32:310211デフォルトの名無しさん
2008/07/09(水) 11:33:28他人への迷惑とかは考えないのか?
0212デフォルトの名無しさん
2008/07/09(水) 11:34:20> いきなりC++やっても上に何人もいるvirtualの使いどころが
> 分からない人間になるのが落ち。
「C++をやる」っていうのは、C++を勉強し使えるようになることも含むのであって、
「virtualの使いどころが分からない」人間は、単に「ちゃんとC++をやってない人間」だよ。
「先にCをやっていないから」そうなるのではなく、「C++をちゃんと勉強していないから」そうなるだけ。
0213デフォルトの名無しさん
2008/07/09(水) 11:34:39>それで何か問題が起きて初めて、これは変だと気付けばいいだけの話だろ。
そういう姿勢だったら問題は無かっただろう。
0214デフォルトの名無しさん
2008/07/09(水) 11:37:29いったいどこで仕入れてきたフォークロアなのかようわからんよね。
0215デフォルトの名無しさん
2008/07/09(水) 11:38:25まずそんな初心者に勝手に組ませて、いざ失敗されると「迷惑だ」と怒り出す方が頭おかしい
0216デフォルトの名無しさん
2008/07/09(水) 11:40:09おま…、一人だけで組んでるのか? 社会に出ろよ
0217デフォルトの名無しさん
2008/07/09(水) 11:41:280218デフォルトの名無しさん
2008/07/09(水) 11:41:54そうすることが悪いとは言わない(後から学べばいいと思う方)けど、そうした方がよさそうに思う理由が知りたい
0219デフォルトの名無しさん
2008/07/09(水) 11:43:17「新人にそういう乱暴な教え方をする奴っているよなぁ」みたいな問題であって、
他言語の経験とかそういう話とは違ってくるのでは。
0220デフォルトの名無しさん
2008/07/09(水) 11:43:58気が向いたらオーバーライドできるし、しなくても普通に使える。柔軟性アップじゃね?
0221デフォルトの名無しさん
2008/07/09(水) 11:45:22そのとき効率の犠牲が気にならないならC++じゃなくてもいい
0222デフォルトの名無しさん
2008/07/09(水) 11:48:41子クラスの同一名メソッドは、無条件にオーバーライドされる。
しなくても普通に使える訳ではない。
必ず違うメソッド名にする必要がある。正直迷惑。
0223デフォルトの名無しさん
2008/07/09(水) 11:49:290224デフォルトの名無しさん
2008/07/09(水) 11:49:53>「先にCをやっていないから」そうなるのではなく、「C++をちゃんと勉強していないから」そうなるだけ。
いややはりCを先にやっとけ。C/C++の関係なら時間もそんなに無駄にはならん。
他の言語やるまえにCやれってのとは事情が違う。
0225デフォルトの名無しさん
2008/07/09(水) 11:53:56趣味の場合は効率はあまり気にしないな
>>222
ん?virtualを付けないと、子クラスで定義しても親クラスの関数が使われちゃうんだろ?
つまり子クラスの定義が無駄になると。そんな状況に何の意味があるのさ。
0226デフォルトの名無しさん
2008/07/09(水) 11:56:290227デフォルトの名無しさん
2008/07/09(水) 11:58:50C++のプログラムしたことあるのか?
0228デフォルトの名無しさん
2008/07/09(水) 12:05:21おちつこ
0229デフォルトの名無しさん
2008/07/09(水) 12:05:25殆ど無駄にならんっていうか、無駄はそもそも無いのでは。
ごく少数の例外事項を除いて、C++の中にCはすっぽり入ってるわけだし。
この話はつまり、
「C++の(Cに対する)拡張部分を脇にのけて、残った部分からやるという分類行為に
"物凄く意識的になる"必要があるのだろうか?」
って話で、俺はそこまで必要とは思わない、って意見。
Cの存在を無視して、C++という一個の言語だけ見つめても、それを「基礎から」学んでいこうと思えば
序盤はまぁ大体がCにもある機能の話になる。自然に。
virtual以前に、クラスの作り方自体、どの本を見ても、Cの機能を一通りやったあと触れることになるし。
その「自然にそうなる程度の区分け」で十分ではないかと。
0230デフォルトの名無しさん
2008/07/09(水) 12:18:38ほらー、virtualつけたときのコンパイル後のイメージが分からないから
そういうことになるんだよ。
>>229
>「自然にそうなる程度の区分け」
それプラスやはりコンパイル後のイメージに興味持って欲しいね、俺は。
ポインタとメモリの関係が分からない人間にポインタ扱わせるのは危なっかしくて
しょうがないだろ。C++は全般的にそういう傾向があるとおもう。
0231デフォルトの名無しさん
2008/07/09(水) 12:36:21任意の1〜9の数の全ての組み合わせを表示する、
例えば1〜3の組み合わせだと123、132、213、231、312、321と表示するプログラムの考え方を教えてください。
0232デフォルトの名無しさん
2008/07/09(水) 12:43:52プログラムが書ける上でその質問してるのか?
0233デフォルトの名無しさん
2008/07/09(水) 12:47:25for(i = 111111111; i <= 99999999; i++) {
if (i にゼロが含まれている) {
/* 何もしない */
} else if (i に同じ数字が2つ含まれている) {
/* 何もしない */
} else {
/* i を表示 */
}
}
0234デフォルトの名無しさん
2008/07/09(水) 12:52:24それ順列だろ。 >>231の文には矛盾が有る。
3行目は組合せと言いながら順列を出している。
0235デフォルトの名無しさん
2008/07/09(水) 13:05:40お前ら批判する前にちゃんと理由を言えよ。
0236デフォルトの名無しさん
2008/07/09(水) 13:34:290237デフォルトの名無しさん
2008/07/09(水) 13:54:48デストラクタにすらvirtualが付いて無い → 継承禁止
が基本だと思ってたけど違うの?
0238デフォルトの名無しさん
2008/07/09(水) 14:01:47>virtualが付いて無い → オーバーライド禁止
単に派生クラス側で基底クラスのメソッドと同じ引数を持つメソッドを
定義することをオーバーライドといい、virtualがついているかどうか
は関係が無い。
>デストラクタにすらvirtualが付いて無い → 継承禁止
別に禁止されてるわけじゃない。そうした方がよけりゃ
そうするだけ。
0239デフォルトの名無しさん
2008/07/09(水) 14:06:38> virtualを付けないと(中略)子クラスの定義が無駄になる
この辺がおかしいのでは
0240デフォルトの名無しさん
2008/07/09(水) 14:07:49お答えありがとうございます。
俺の文章がわかりにくくてすいません。実装したいプログラムとちょっと違うけど、考え方は一緒だったのでわかりました。
0241デフォルトの名無しさん
2008/07/09(水) 14:10:450242デフォルトの名無しさん
2008/07/09(水) 14:13:550243デフォルトの名無しさん
2008/07/09(水) 14:15:500244デフォルトの名無しさん
2008/07/09(水) 14:23:33動作を上書きしなきゃオーバーライドにならない気がするんだが、
virtualつけなくてもできるのか?
0245デフォルトの名無しさん
2008/07/09(水) 14:26:58小クラスのインスタンスを小クラスのまま呼び出す場合 はちゃんとオーバーライドされてるじゃん
class Child cInstance;
cInstance.hogehoge();
0246デフォルトの名無しさん
2008/07/09(水) 14:46:33多態はしなくても継承・オーバーライドをすることはある。
0247デフォルトの名無しさん
2008/07/09(水) 14:57:05>単に派生クラス側で基底クラスのメソッドと
>同じ引数を持つメソッドを
>定義することをオーバーライドといい
それは「隠蔽」と言う。
以下で A::f2()からのf1()は、常にA::f1()が呼ばれる。
struct A{
int f1(){return 10;}
int f2(){return f1()*2;}
};
struct B : A{
int f1(){return 100;}
};
void test(){
B b;
std::cout << b.f1() << ":" << b.f2() << std::endl;
}
--結果-----
100:20
>>デストラクタにすらvirtualが
>別に禁止されてるわけじゃない。
使い方によって、リソースリークの危険が大きくなるため
通常は継承不可と捉えるべき。
0248デフォルトの名無しさん
2008/07/09(水) 15:15:17struct A{ int f1(){return 10;} };
struct B : A { int f1(){return 100;} };
void test(){
A a;
B b;
std::cout << a.f1() << ":" << b.f1() << std::endl;
}
--結果-----
10:100
こっちは オーバーライドって言わない?
0249デフォルトの名無しさん
2008/07/09(水) 15:16:19以下のコードを実行すると、
ifstream fs;
fs.open( "hogehoge", ios::in | ios::binary );
fs.is_open()がfalse、fs.rdstate()の結果が0x2(failbit)となります。
ifstreamがコケる原因は全く思いつかないのですが、他に何かありますでしょうか?
環境はWindowsXPSP3、VisualStudio2008Stdです。
いくつか検証してみたところ、下記の現象も見つけました。
・"hogehoge"は確実に存在する(boostのexists()でtrueが戻る)
・"hogehoge"は排他制御はかかっていない(手動でリネームも出来る)
・試しにfopen( "hogehoge", "r" )した結果、NULL以外の値が戻る(→成功している?)
どうかよろしくお願いします。
0250デフォルトの名無しさん
2008/07/09(水) 15:19:01知っていて当たり前な前提で話したいならこっち
C++上級者が集まるスレ
http://pc11.2ch.net/test/read.cgi/tech/1095113801/
0251デフォルトの名無しさん
2008/07/09(水) 15:21:23こっちというか、それを説明したつもりだったんだけど、
それを隠蔽と呼ぶ。
0252デフォルトの名無しさん
2008/07/09(水) 15:25:39関数名、仮引数の型と構成、戻り値の型が完全に一致しているもの
オーバーロード
仮引数の型と構成の異なる同じ名前の関数を多重定義すること
0253251
2008/07/09(水) 15:35:11隠蔽時にはnewキーワードを指定する。
javaではインスタンスメソッドが全て仮想なので、
隠蔽となるのはstaticメソッドのみ。
0254デフォルトの名無しさん
2008/07/09(水) 15:44:44ファイル名が全角とかなんとか
0255デフォルトの名無しさん
2008/07/09(水) 15:45:57>オーバーライド
>関数名、仮引数の型と構成、戻り値の型が完全に一致しているもの
これによって基底の宣言が隠蔽されるのは当然だが、この条件に加え、
さらに基底の宣言にvirtualがないとオーバーライドとは言わないのか?
0256デフォルトの名無しさん
2008/07/09(水) 15:46:550257デフォルトの名無しさん
2008/07/09(水) 15:52:53言わないのではないかと勝手に補足する。yes
仮想関数のオーバーライド
基本クラスでvirtual指定した関数を派生先クラスで上書きし
関数名、仮引数の型と構成、戻り値の型が完全に一致させたもの
0258デフォルトの名無しさん
2008/07/09(水) 15:57:03一致してるだけじゃ駄目だろ。一致してないと上書きできないけど。
0259デフォルトの名無しさん
2008/07/09(水) 16:01:210260デフォルトの名無しさん
2008/07/09(水) 16:18:23親で定義されているメソッドを呼び出すことは出来なくなるってこと?
本読むなり調べるなり手段はいくらでもあるけどせっかくなのでこちらで聞いてみますです。
0261デフォルトの名無しさん
2008/07/09(水) 16:24:12補足�dクス
あと、>>252に戻り値の型が完全に一致とあるけど、
C++は共変性に対応してるので、
戻り値の型は同一でなくとも良い。
struct ValBase{};
struct ValDev : ValBase{};
struct A{
virtual ~A(){}
virtual ValBase* f1(){return (ValBase*)1;}
};
struct B : A{
ValDev* f1(){return (ValDev*)2;}
};
void test(){
A* a = new B();
std::cout << a->f1() << std::endl;
delete a;
}
--結果------
00000002
0262デフォルトの名無しさん
2008/07/09(水) 16:34:12一応、強引に呼ぶことは出来るけど。
std::cout << a->A::f1() << std::endl;
0263デフォルトの名無しさん
2008/07/09(水) 16:48:12正直俺にはよく分からないけど
それはValDevがラップされてValBaseと同じ型扱いをされてるんじゃ?
0264デフォルトの名無しさん
2008/07/09(水) 17:02:49ありがとうございました
0265デフォルトの名無しさん
2008/07/09(水) 17:10:50つまりはそういうこと。
オーバーライドの際に、
戻り値に、元より具体的な型を指定しても矛盾しない、
このオーバーライドを認めることを共変性といい、
引数に、元より抽象的な型を指定しても矛盾しない、
このオーバーライドを認めることを反変性という。
C++は反変性に対応してないけど。
0266デフォルトの名無しさん
2008/07/09(水) 18:08:22エラーメッセージが出てきたんですが、エラー元のファイルを見つけられません・・・
環境はVista、VS2008です
エラーが起きたファイルのパス (まず、これがどこを指しているのかわかりません)
File : f: \dd\vctools\vc7libs\ship\atlmfc\src\mfc\winocc.cpp
VS内の検索でwinocc.cppを検索したのですが
すべて検索 "winocc.cpp", サブ フォルダ, 検索結果 1, "Visual C++ インクルード ディレクトリ"
一致した行: 0 一致したファイル: 0
と、返ってきました・・・
どなたか予測が付けられる方がいたら、アドバイスお願いします・・・。
自分でもよく理解できていないんで、何か必要な情報があったら、教えて下さい。
ちなみにデバッグ実行で辿った所、memset.asm内で落ちてるみたいなのですが、さっぱり意味がわかりません・・・
0267デフォルトの名無しさん
2008/07/09(水) 18:19:40エラーはライブラリで起きてる。
ソースインストールして中見るでもいいが、通常は
止まったとこからスタックダンプ(呼び出し履歴だっけ?)で自分のコードの該当箇所探して
渡してる引数の値とかチェックしてみ。
0268デフォルトの名無しさん
2008/07/09(水) 18:30:04了解です、詳しく値をチェックしてみます
ありがとうございました。
0269デフォルトの名無しさん
2008/07/09(水) 18:46:06#include <iostream>
#include <new.h>
class test{
int *array;
public:
test(int x);
~test(){delete [] array;};
};
test::test(int x = 1){
try{
array = new int[x];
}catch(bad_alloc&){
std::cout << "bad_alloc" << std::endl;
abort();
}
};
int main(){
test *a;
while(1) a = new test;
return 0;
}
↓実行結果
Abnormal program termination
0270デフォルトの名無しさん
2008/07/09(水) 18:59:480271デフォルトの名無しさん
2008/07/09(水) 19:04:04#include <iostream>
#include <new.h>
int main(){
int *array;
while(1){
try{
array = new int[10000];
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
}
return 0;
}
実行結果
bad_alloc!!!
Abnormal program termination
0272デフォルトの名無しさん
2008/07/09(水) 19:12:27の部分で、int *array; の為のメモリを確保する部分で先にbad_allocが投げられてるんだと思う。
0273デフォルトの名無しさん
2008/07/09(水) 19:29:44try{
test *a;
while(1) a = new test;
}
catch(bad_alloc&){
std::cout << "!!!!" << std::endl;
}
に変えてみたけど、Abnormal program termination と表示されるだけで!!!!は出力されませんでした・・・
0274デフォルトの名無しさん
2008/07/09(水) 19:36:28#include <iostream>
#include <new.h>
int main(){
int *array;
while(1){
try{
array = new int[7]; // <-確保する量を減らしたらcatchできなくなった、8以上だとcatchできる
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
}
return 0;
}
実行結果
Abnormal program termination
0275デフォルトの名無しさん
2008/07/09(水) 19:40:400276デフォルトの名無しさん
2008/07/09(水) 19:44:12このサイトの
音声処理
# Waveファイルを入出力してみる
# 音声を逆に再生してみる
# 音声をフーリエ変換してみる
# 完全版 [wave.h] [wave.c] [calculation.h] [calculation.c]
のプログラムつかってwavファイル読み込みしてみました。
16ビットモノラルと16ビットステレオの読み込み時間の差が結構あるんですが、改良できないですか?
16ビットステレオの読み込みが結構かかります。モノラルの倍ぐらいならわかるんですが、4倍ぐらいかかる気がします。
0277デフォルトの名無しさん
2008/07/09(水) 19:46:24catch(...) も追加してみたらどうなるだろう
0278デフォルトの名無しさん
2008/07/09(水) 19:56:40#include <iostream>
#include <new.h>
int main(){
try{
int *array;
while(1){
array = new int[4];
}
}
catch(bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl;
abort();
}
catch(...)
{
std::cout << "not bad_alloc!!!" << std::endl;
}
return 0;
}
実行結果
Abnormal program termination
0279デフォルトの名無しさん
2008/07/09(水) 20:07:12多分俺の予測だけど、聞きたい?
0280デフォルトの名無しさん
2008/07/09(水) 20:10:28ぱっと見た感じ、ステレオの場合にファイルからの読み込み回数が
増えるようになってたので、そこが遅さの原因かも?
wave.cの Sound *Read_Wave(char *filename) のファイル読み込み部分を、
ファイル全体を一度メモリに読み込んでから処理するように変えれば、
いくらか速くなる・・・かも。
0281デフォルトの名無しさん
2008/07/09(水) 20:11:45聞かずに言ってやれよw
0282デフォルトの名無しさん
2008/07/09(水) 20:12:29蝶聞きたい
0283デフォルトの名無しさん
2008/07/09(水) 20:13:520284デフォルトの名無しさん
2008/07/09(水) 20:25:41なるほど。しかしそんなスキルがありません\\
0285デフォルトの名無しさん
2008/07/09(水) 20:28:12魅上!何をしている!?助けろ!!書けー!
0286デフォルトの名無しさん
2008/07/09(水) 20:30:250287デフォルトの名無しさん
2008/07/09(水) 20:31:14じゃぁ何か?最初から、「もっと速いのを俺の為に書け」と、
そういうつもりで書き込んでたのか?
0288デフォルトの名無しさん
2008/07/09(水) 20:40:43身の程も弁えず赤の他人に丸投げする厚顔無恥のスキルとか。
0289デフォルトの名無しさん
2008/07/09(水) 20:41:59// MinGW g++(GCC)3.4.5 にて
// bad_alloc!!! が出力されたよ
#include <iostream>
#include <new>
int main(){
try{
int *array;
while(1){
array = new int[4];
}
}
catch(std::bad_alloc&)
{
std::cout << "bad_alloc!!!" << std::endl; // 可能性としてはここでメモリ確保失敗?
abort();
}
catch(...)
{
std::cout << "not bad_alloc!!!" << std::endl;
}
return 0;
}
0290デフォルトの名無しさん
2008/07/09(水) 20:46:45どうてい
0291デフォルトの名無しさん
2008/07/09(水) 20:48:280292デフォルトの名無しさん
2008/07/09(水) 20:51:12BCCが悪いのかな?
MinGWっていうの使ってみますわ
0293デフォルトの名無しさん
2008/07/09(水) 20:51:18わるいわるい、席外してた。
メモリ確保できなくて例外が飛んだとき、std::coutが動作できるほどメモリがあまってないんじゃないのか?
メモリ確保の一回の単位を大きくすると、最後の失敗で返却される余裕が大きいから、std::coutが動く余裕ができる、と。
ま、良そうだから分からんけど。
catchが起きてるかどうかは表示じゃなくてブレークポイント貼るとかしてみたら?
とおもったら>>289が書いてるじゃん
0294デフォルトの名無しさん
2008/07/09(水) 20:53:31はい、スレ住人のSAN値にダメージを与えられます。
0295デフォルトの名無しさん
2008/07/09(水) 20:57:40そういうことかーーーーーわかりやすい説明�d�d
0296デフォルトの名無しさん
2008/07/09(水) 21:04:18どこの環境の所為というよりも、メモリ確保失敗ではありがちなシチュエーション。
こういうのを、スッと予想できるようになったら初心者脱出だよ。
決してプログラミング言語の全貌理解するとか、機能や仕組みの名称を
間違えずにいえるとかは関係ないんだな。
0297デフォルトの名無しさん
2008/07/09(水) 21:05:20そういう問題でもない気もするけど。
ちなみにBCC5.9.4ではunknown software exceptionの
ダイアログボックスが表示される。
0298デフォルトの名無しさん
2008/07/09(水) 21:05:56魔法の聖水渡しておきますね
0299デフォルトの名無しさん
2008/07/09(水) 21:10:17ポインタが絡むと良く分からなくなります
0300デフォルトの名無しさん
2008/07/09(水) 21:11:46ポインタを勉強してみるとか
STL vector を参照渡ししてみるとか
0301デフォルトの名無しさん
2008/07/09(水) 21:16:09良く分かりません。
変数や構造体のポインタというのは、それがメモリ上で占める
大きさがきっちり決まっているものだと思うのですが、それとは
性質が違うものなんでしょうか? 名前は同じでも。
上の例でいうと、比較用の関数を書きますが、その引数とか渡す
タイミングが(qsortの引数にあると)良くわからないのですが。
この辺り詳しく解説していある入門書とかありますか?
0302デフォルトの名無しさん
2008/07/09(水) 21:20:42関数ポインタは入門じゃないと思うが
これを勧めておく
http://kmaebashi.com/book/index.html
良書を保護する資金と場所が欲しい
0303デフォルトの名無しさん
2008/07/09(水) 21:20:50#include <iostream>
#include <new>
int main(){
int *array;
char *dummy = new char[0xff];
try{
while(1){
array = new int[1];
}
}
catch(std::bad_alloc&){
delete [] dummy;
std::cout << "bad_alloc" << std::endl;
abort();
}
return 0;
}
0304デフォルトの名無しさん
2008/07/09(水) 21:28:26それ自力で思いついたのなら、君素質あるかも
0305デフォルトの名無しさん
2008/07/09(水) 21:43:410306デフォルトの名無しさん
2008/07/09(水) 22:08:34コロンブスだね
0307デフォルトの名無しさん
2008/07/09(水) 23:03:39環境としては、VS2005、MFCでダイアログベースで、
コントロールの状態について、読み出し・保存を、ファイルで管理したいです。
とりあえず1行ずつ読み出しがしたかったので、
CStdioFileでやってみたら、文字化け…。(ブレークポイント設定して、ウォッチの状態で)
CFileだと、一行ずつっていうのがどうしたらいいのかわからないです。
ほかにもfstreamとかfopenとかいろいろあるみたいなんですけど、どれがなんなのか、どんな設定が必要なのかさっぱりです。
MSDNもざっとはみたんですけど、unicodeがどうとか、そういう記述が見当たらなくて。
やり方or参考になるものを教えていただけませんでしょうか。
0308デフォルトの名無しさん
2008/07/09(水) 23:15:13UNICODEなら_UNICODEって#defineする必要あり
っていうか、MFCなのか
0309デフォルトの名無しさん
2008/07/09(水) 23:17:46文字化け以前に、バイナリのレベルでは読み出せてるの?
0310デフォルトの名無しさん
2008/07/09(水) 23:23:51ど、どれでしょうか・・・(;´Д`)ウウッ…
>>309
馬鹿なこと聞きますが、
バイナリのレベルで読み出せてるかっていうのはどうやって確かめたらいいのでしょう??
0311デフォルトの名無しさん
2008/07/09(水) 23:38:25WM6の実行環境がどうなのか俺は知らんけど、あんたそこまで分からん初心者なのか?
0312デフォルトの名無しさん
2008/07/09(水) 23:40:18ていうか、MFCスレで聞いた方が良さ気
0313デフォルトの名無しさん
2008/07/09(水) 23:46:17ごめんなさい、そこまでわからん初心者です…。
一応中身はあきらかなファイルを作って見てはいるんですが、1バイトずつ?とかっていうのがわかりません…。
おいてあるファイルの中身は
key=test
の1行だけです。
>>312
一応今はCStdioFileとかの関数を使ってますが、それ以外でも実現可能ならなんでもよかったので、こちらで聞いてみました。
だめでしょうか(´・ω・`)
0314デフォルトの名無しさん
2008/07/09(水) 23:49:07CString m_FileName = path;
CStdioFile inFile;
if( !inFile.Open( m_FileName, CFile::modeRead ) ){
inFile.Open( m_FileName, CFile::modeCreate );
inFile.WriteString(_T("key=test"));
MessageBox(_T("設定ファイルのオープンに失敗しました。"));
inFile.Close();
return;
}
CString line;
while(inFile.ReadString(line) != NULL){
MessageBox(line);
}
0315デフォルトの名無しさん
2008/07/09(水) 23:51:25ファイルを見ないことにはなんとも
■MFC相談室 mfc19d.dll■
http://pc11.2ch.net/test/read.cgi/tech/1207301867/
0316デフォルトの名無しさん
2008/07/09(水) 23:54:160317デフォルトの名無しさん
2008/07/09(水) 23:54:34LPTSTR lpsz,
UINT nMax
);
virtual BOOL ReadString(
CString& rString
);
戻り値
最初の改行文字を読み込んだとき、読み込みを停止します。このとき、読み込んだ文字数が nMax-1 より少ないときは、バッファに改行文字を格納します。いずれの場合でも、null 文字 ('\0') が付加されます。
とりあえず、そのwhile文はやめろw
0318307
2008/07/10(木) 00:00:25こちらで一段落着いたら行かせていただきます!
>>316
一応そうです^^;
>>317
あ、NULLじゃなくてFALSEで判定?
↓にそれっぽいサンプルがあったので、そのまま使ってました(--;
http://www.ias.tokushima-u.ac.jp/linguistik/program/Tagger.html
0319デフォルトの名無しさん
2008/07/10(木) 01:06:59暗黙的変換を禁止し、明示的変換だけ許可する方法はありませんか?
C#だとexplicitとimplicitで可能ですけど
0320307
2008/07/10(木) 01:19:53よくわからないアクセスエラーが出てきたので、最初から作り直したら、うまくいきました。
なんか、おさわがせしてしまいまして、すみません。。。
変えたところはwhileの条件なので、そこが原因だったのかもしれないです。
どうもありがとうございましたm(_ _)m
結局動いたコードは↓です。
CString m_FileName = path;
CStdioFile inFile;
if( !inFile.Open( m_FileName, CFile::modeRead ) ){
inFile.Open( m_FileName, CFile::modeCreate | CFile::modeWrite );
inFile.WriteString(_T("key=test"));
MessageBox(_T("設定ファイルのオープンに失敗しました。"));
inFile.Close();
return;
}
CString line;
while( inFile.ReadString(line) != FALSE ){
MessageBox(line);
}
0321デフォルトの名無しさん
2008/07/10(木) 01:22:12それがないんだな。
C++0xでは型変換演算子にもexplicitつけられるようになる予定。
0323デフォルトの名無しさん
2008/07/10(木) 10:38:06明示的にやるなら変換関数つくって呼ぶだけじゃね?
0324デフォルトの名無しさん
2008/07/10(木) 12:19:24暗黙的変換を禁止したいんだろ
0325デフォルトの名無しさん
2008/07/10(木) 13:13:40{
public:
CHoge(){
_asm{
mov ecx , m_value
xorps xmm0 , xmm0
movaps [ ecx ] , xmm0
}
}
virtual ~CHoge();
virtual void func();
private:
__declspec( align(16) ) float m_value[4];
};
のようなクラスがあったとして、そのインスタンスを
ある関数内で自動変数として確保したとき、
m_valueのアドレスが16byte境界でないために movaps のところで
停止してしまうのですが、m_value のアドレスが16byte境界になる
ようにする方法はありますでしょうか?
できれば movups に変更しないで済む方法でお願いします。
環境:VisualStudio6 + sp5 + ProcessorPack WindowsXP
0326デフォルトの名無しさん
2008/07/10(木) 13:23:37char dat[200]
CHoge * chp;
if((&dat[0] &0x00001) == 1) chp = (CHoge *) &dat[1];
else chp = (CHoge *) &dat[0];
0327デフォルトの名無しさん
2008/07/10(木) 13:27:260328デフォルトの名無しさん
2008/07/10(木) 13:29:55解答ありがとうございます。
クラス宣言側で対処できないものかと考えていたのですが、
もう少し考えてみたいと思います。
0329デフォルトの名無しさん
2008/07/10(木) 13:31:470330デフォルトの名無しさん
2008/07/10(木) 13:33:120331デフォルトの名無しさん
2008/07/10(木) 13:33:16char dat[sizeof(CHoge) + 15];
CHoge *chp = (CHoge*)(((uintptr_t)dat + 15) & ~15);
0332デフォルトの名無しさん
2008/07/10(木) 13:33:34CHoge() の中で
_asm{
mov ecx , <ヒープ先頭>
xorps xmm0 , xmm0
movaps [ ecx ] , xmm0
}
とやらずに済まないかな? と
0333デフォルトの名無しさん
2008/07/10(木) 13:34:00ってことですか?
0334デフォルトの名無しさん
2008/07/10(木) 13:34:54失礼16Bitと間違えました、>>331が正しい
0335デフォルトの名無しさん
2008/07/10(木) 13:37:210336デフォルトの名無しさん
2008/07/10(木) 13:40:28ちょっと待て、
mov ecx , m_value ←これ、ecxに&m_valueが入るのか?
0337デフォルトの名無しさん
2008/07/10(木) 13:41:050338デフォルトの名無しさん
2008/07/10(木) 13:42:51m_value が配列だから &m_value[0] に相当する値が ecx に入るんじゃね?
0339デフォルトの名無しさん
2008/07/10(木) 13:43:58class CH
{
char dat[200]; // 数は適当
dat * chp;
CH()
{
CH *chp = (CH*)(((uintptr_t)dat + 15) & ~15);
}
}
これでクラス内だけ
0340デフォルトの名無しさん
2008/07/10(木) 13:44:46すみません。簡略化のためにミスしたようです。
そこは m_value のアドレスが入ると思ってください。
0341デフォルトの名無しさん
2008/07/10(木) 13:48:00に訂正
0342デフォルトの名無しさん
2008/07/10(木) 13:50:35インラインアセンブラはそこまで気にしてくれない。俺んとこでは先頭要素が入る。
本人分かってるからいいけど。
0343デフォルトの名無しさん
2008/07/10(木) 13:52:03なるほど。其の方法ならクラス内で吸収できそうですね。
いただいたご意見は参考にさせていただきます。
ありがとうございました。
0344デフォルトの名無しさん
2008/07/10(木) 13:52:190345デフォルトの名無しさん
2008/07/10(木) 13:53:21thx そうっだったのか
0346デフォルトの名無しさん
2008/07/10(木) 13:54:28沢山アクセスするなら分からんが、どうせ一回読んだらxmmの上で転がしまくる
んでしょ?
0347デフォルトの名無しさん
2008/07/10(木) 14:28:29ファイルを開くコモンダイアログの処理ですが、関数化したいんですが、うまくできません。
ウィンドウプロシージャの中に書かないといけないんですか?
0348デフォルトの名無しさん
2008/07/10(木) 14:32:14他の関数の中に書いてもいいです
0349デフォルトの名無しさん
2008/07/10(木) 14:35:20(今は、マウスがクリックされたときコモンダイアログを出すという処理をしたいとします)
マウスがクリックされたら コモンダイアログを開く関数を呼び出す という内容を書く
って考え方であってますか?
0350デフォルトの名無しさん
2008/07/10(木) 14:38:06まぁ、試せばすぐにわかるさ。
0351デフォルトの名無しさん
2008/07/10(木) 14:40:18引数がよくわからなくて
APIのメイン関数は
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
って書く。
なにか自作の関数は
int WINAPI Hoge(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
じゃだめなんですか?
0352デフォルトの名無しさん
2008/07/10(木) 14:46:38int Hoge() でもいい
0353デフォルトの名無しさん
2008/07/10(木) 14:47:49int WINAPI test(HWND hWnd){
static OPENFILENAME ofn;
static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域
static TCHAR filename[MAX_PATH]; //
ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく
ofn.lStructSize = sizeof(ofn); // 構造体のサイズ
ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル
ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類
ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス
ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス
ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ
ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ
ofn.Flags = OFN_FILEMUSTEXIST; // フラグ指定
ofn.lpstrTitle = _T("ファイルを開く"); // コモンダイアログのキャプション
ofn.lpstrDefExt = _T("wav"); // デフォルトのファイルの種類
// ファイルを開くコモンダイアログを作成
if( !GetOpenFileName( &ofn ) )
{
MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
SendMessage( hWnd, WM_CLOSE, 0, 0 );
return 0;
}
// 選択されたファイル名を表示
MessageBox( hWnd, filename_full, _T("OK"), MB_OK );
return 0;
}
としてプロシージャ内でtest(hWnd)で呼び出せばOKすか?一応うまく動作しました。
0354デフォルトの名無しさん
2008/07/10(木) 14:53:520355デフォルトの名無しさん
2008/07/10(木) 14:56:28そうですね。サイトのプログラムがそういう仕様です。
hWndって奴の役割がイマイチ理解できないです
引数で渡さないといけないものですか?
test関数で引数として与えたのは関数内に
MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
があったからなんですが
0356デフォルトの名無しさん
2008/07/10(木) 15:00:500357デフォルトの名無しさん
2008/07/10(木) 15:01:05ファイル選択のダイアログはモーダルで動作しないと困るでしょ?
モーダルにするには、動作中無効にする親ウィンドウが必要なのさ。
0358デフォルトの名無しさん
2008/07/10(木) 15:03:18コモンダイアログで単体で動作することって無さそうだしな。
0359デフォルトの名無しさん
2008/07/10(木) 15:06:49やばい・・・理解できない
0360デフォルトの名無しさん
2008/07/10(木) 15:21:37>hWnd
fopenで使うFILE* fpと同じだと思っておけばいい。
0361デフォルトの名無しさん
2008/07/10(木) 19:04:48#include <iostream>
int main()
{
char text[] = "つれずれ";
std::cout << text[1] << '\n';
}
こんな感じのプログラムがあるのですが、文字化けしてしまいます。
どう対処すればいいでしょうか。この例では「れ」を表示させたい。
0362デフォルトの名無しさん
2008/07/10(木) 19:19:48A a();
とした時に出来るaって何物ですか?
引数付きコンストラクタの場合には初期化出来るのに、
上記の場合が駄目なのは仕様上の問題でしょうか?
0363デフォルトの名無しさん
2008/07/10(木) 19:25:05関数のプロトタイプと被るのか・・・orz
0364デフォルトの名無しさん
2008/07/10(木) 19:26:30aは、クラスAを返り値とする引数を取らない関数の宣言。
0365デフォルトの名無しさん
2008/07/10(木) 20:22:27text[2]じゃねーの?
0366デフォルトの名無しさん
2008/07/10(木) 20:27:57std::cout << text[2] << text[3] << '\n';
0367デフォルトの名無しさん
2008/07/10(木) 20:44:30×つれずれ
○つれづれ
くつずれじゃないんだからさぁ……
0368361
2008/07/10(木) 20:45:20解決しました。ありがとう
0369デフォルトの名無しさん
2008/07/10(木) 23:14:450370デフォルトの名無しさん
2008/07/10(木) 23:33:10元のrand()で発生するのは(自分の処理系では) 0-7FFFとなるので、0-9の出現確率が1/10にはならない
はずです。
また%は計算コストが掛かると思うのですが、計算コストが少なくかつ精度良く任意の範囲の乱数を計算す
る定石ってあるのでしょうか?
0371デフォルトの名無しさん
2008/07/10(木) 23:35:51なぜそう思った?
0372デフォルトの名無しさん
2008/07/10(木) 23:38:360373デフォルトの名無しさん
2008/07/10(木) 23:40:32% のコストなんて気にしないっていう手があるw
あと、出現確率が気になる場合は
rand()>=(RAND_MAX+1-(RAND_MAX+1)%10)
の時にもう一度サイコロを振る
0374デフォルトの名無しさん
2008/07/10(木) 23:45:25それ右辺が常に0でない?
0375デフォルトの名無しさん
2008/07/10(木) 23:48:05抜けてたw
RAND_MAX によってはラップアラウンドの問題があるね
int 32bit
RAND_MAX 32767
で考えてた
0376デフォルトの名無しさん
2008/07/10(木) 23:51:33と思うんだが、いかがなものだろう? 難しい計算のすれば納得するものなのか?
0377デフォルトの名無しさん
2008/07/10(木) 23:55:18一般にrand()で使われてる線形合同法は低位ビットの質が特に糞らしいから
そういう意味では単に剰余取るのはやはりオススメはできんな
ま、ぐぐればいくらでも情報は入ると思うぜ
0378デフォルトの名無しさん
2008/07/10(木) 23:59:00了解した。解消の方法はいくつかあるが、%よりは遅そうだな。
解答は他の人にまかす。
0379デフォルトの名無しさん
2008/07/11(金) 00:00:44元の乱数が1-10とか1-100とか10の倍数でないと、モジュロの0-9出現回数は1/10
にはならんのじゃないか?
あれ、違うか・・・?
0380373
2008/07/11(金) 00:03:14偏りに関与する部分を使用しないことにする方針
#include<stdio.h>
#include<stdlib.h>
#define KIND_NUM 10
int main(void){
int i, x, count[KIND_NUM]={0};
for(i=0;i<100000;i++){
while((x=rand())>=(RAND_MAX+1-(RAND_MAX+1)%KIND_NUM)) // 0-32767 のうち 32760-32767 を使用しない
;
count[x%KIND_NUM]++;
}
for(i=0;i<KIND_NUM;i++) printf("%d\n", count[i]);
return 0;
}
0381デフォルトの名無しさん
2008/07/11(金) 00:04:56ある一定の時間だけ抜き取れば偏りが生じるのがあたりまえなんじゃないの
むしろ均等にばらけてる方が自然からみて偏りが生じてると思うんだが。
というおきまりの考察は置いて於いてsrand()忘れてないだろうな
0382デフォルトの名無しさん
2008/07/11(金) 00:06:01それは乱数の性能以下の誤差しかで無いと思われ。
危惧があるなら>>377の危惧が正しい。
だから、求めるのは、>>377の危惧を解消する方法。
0383373
2008/07/11(金) 00:07:23心配ならメルセンヌツイスターでググればよいかと
0384デフォルトの名無しさん
2008/07/11(金) 00:08:28別に難しく考えなくてもいいよ
0385デフォルトの名無しさん
2008/07/11(金) 00:09:48そういう話じゃないんだなあ
0386デフォルトの名無しさん
2008/07/11(金) 00:12:51それがキングである確率は1/4じゃないよねって話。
>>380のやつはジョーカーだったらもう一回引けばいいよねって方法
0387デフォルトの名無しさん
2008/07/11(金) 00:13:300388デフォルトの名無しさん
2008/07/11(金) 00:18:45しかし381はいっぱしなこと言っているつもりかもしれんが、気の毒な人すぎるな。
0389デフォルトの名無しさん
2008/07/11(金) 00:22:540390デフォルトの名無しさん
2008/07/11(金) 00:24:320391デフォルトの名無しさん
2008/07/11(金) 00:24:43できる(10%) できない(85%) 主観のみではできている(5%)
0392デフォルトの名無しさん
2008/07/11(金) 00:28:480393デフォルトの名無しさん
2008/07/11(金) 00:32:220394デフォルトの名無しさん
2008/07/11(金) 00:35:56#include<stdio.h>
#include<stdlib.h>
int main(void){
int i;
for(i=0;i<100;i++) printf("%d", rand()&1);
return 0;
}
rand() の返り値に線形合同法の最下位ビットを使用している場合には
0 のみ
1 のみ
0 と 1 が交互に出現
の3つのうちのいずれかになる問題があります
0395デフォルトの名無しさん
2008/07/11(金) 00:44:22no = (rand()>>16)%10;
どんな計算をしても、0-10程度では多分有る程度は偏ると思われ。
それ以上気にすると、%の性能どころではなくなるかな。
0396デフォルトの名無しさん
2008/07/11(金) 01:09:290397デフォルトの名無しさん
2008/07/11(金) 01:12:090398デフォルトの名無しさん
2008/07/11(金) 02:33:03CPUの中にラジウムの入った微細なガラス管があり、そこから放出される放射線
ノイズを元に乱数を発生させている。
0399デフォルトの名無しさん
2008/07/11(金) 04:39:07原因が引数にあるファイルネームがフルパスにあるようです。
(相対パスを入力すると問題なかった)
OPENFILENAME ofn → GetOpenFileName(&ofn)
というにファイルダイアログでファイルパス(フルパス)を取得している
のですが、ファイルダイアログから相対パスを得ることはできないでしょうか?
0400デフォルトの名無しさん
2008/07/11(金) 06:05:35BYTE bt[5];
for(int t = 0; t < 5; t++)
{
sprintf(ss[t], "%1u", bt[t]);
}
fout << ss[0] << ss[1] << ss[2] << ss[3] << ss[4] << '\n';
'sprintf' : 1 番目の引数を 'char' から 'char *' に変換できません。
というエラーが出るんですが、どうすればいいですか?
0401デフォルトの名無しさん
2008/07/11(金) 06:13:300402デフォルトの名無しさん
2008/07/11(金) 06:30:186回サイコロを振ったときに重複した数字がでないか?つったらそうじゃないだろ。
サイコロは、振ったときに6分の1なだけで次に振る時もまた6分の1でしかないんだから。
0403デフォルトの名無しさん
2008/07/11(金) 07:10:14std::stringstream使えよ
0404デフォルトの名無しさん
2008/07/11(金) 08:11:58>>2-3
0405デフォルトの名無しさん
2008/07/11(金) 08:32:20for(int t = 0; t < 5; t++)
{
ss[t] = bt[t]; //sprintf(ss[t], "%1u", bt[t]);
}
マジレスすると、ポインタとその中身に関してしっかり勉強した方がいい。
現状では君の知識は、Cを扱うには滅茶苦茶だよ。
0406デフォルトの名無しさん
2008/07/11(金) 09:13:22じゃね?
0407デフォルトの名無しさん
2008/07/11(金) 09:46:200408デフォルトの名無しさん
2008/07/11(金) 11:20:400409デフォルトの名無しさん
2008/07/11(金) 12:47:190410デフォルトの名無しさん
2008/07/11(金) 12:51:56そのとおり。でも何で突然そんなことを?
確率の話してるから言ってみただけかな
0411デフォルトの名無しさん
2008/07/11(金) 14:28:49コンピューターにおける乱数の使われ方をよく理解したら。単純にそう言い切れなくなるよ。
0412デフォルトの名無しさん
2008/07/11(金) 15:08:180413デフォルトの名無しさん
2008/07/11(金) 15:29:130414デフォルトの名無しさん
2008/07/11(金) 15:31:390415デフォルトの名無しさん
2008/07/11(金) 15:41:35> そもそも、確率が6分の1であったとしても
> 6回サイコロを振ったときに重複した数字がでないか?つったらそうじゃないだろ。
>
> サイコロは、振ったときに6分の1なだけで次に振る時もまた6分の1でしかないんだから。
なんでそんなあたりまえのことわざわざ披露して得意になっているの?
上の書き込みでそれに反することでも書いてあったのかな?
だったら指摘してほしいものだけど。
0416デフォルトの名無しさん
2008/07/11(金) 15:55:27高校数学の確率論の話と計算機における擬似乱数列特有の問題を
ごっちゃにしてるってか
単に話についてけない人が口を挟みたがってるだけなので
スルー汁
0417デフォルトの名無しさん
2008/07/11(金) 16:21:12普通のCPUは中にラジウムの入った微細なガラス管があり、そこから放出される放射線ノイズを元に乱数を発生させている。
だから疑似乱数の話は必要ない。
0418デフォルトの名無しさん
2008/07/11(金) 16:24:03これでいいですか?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7341.txt
0419デフォルトの名無しさん
2008/07/11(金) 16:28:000420デフォルトの名無しさん
2008/07/11(金) 16:28:10VC2008で新規プロジェクト>「Windowsアプリケーション」で「空のプロジェクト」をOFF
とすると、ウインドウが出るだけのソースができあがりますよね。
これを単にDebugコンパイルし、デバッグモード走るらせます。
するとウインドウ右上の×を押して閉じた時、
>test.exe の 0x77d0f48f で初回の例外が発生しました: 0xC0000005: 場所 0x2604b974 を読み込み中にアクセス違反が発生しました。
というログが出力されました。
不思議に思い、デバッガの例外時ブレークを全てONにし試したところ、
DefWindowProc(hWnd, message, wParam, lParam);
のところで例外を投げていました。
不審に思い、今まで長年作ってきたプロジェクトから適当に抽出してDebugビルド>実行>閉じるをやってみたのですが、全てのプロジェクトで同様に例外を投げていました。
VC6.0で作った(そちらでは例外なんてでてない)プロジェクトを2008で開き、(自動変換を行った後)ビルド〜とやってみましたが、やはり例外を投げています。
この動作は仕様なのでしょうか?
それとも私の環境がぶっこわれてしまっているのでしょうか。
0421デフォルトの名無しさん
2008/07/11(金) 16:44:19お騒がせしました。
IME Watcherをいう、XPのIMEをタスクバーに隠すフリーツールが悪さをしていたようです。
なんでまったく関係ないのに悪さをしたのかは不明ですが
・VS2008は言語バーをタスクバーにしまってあると動作がおかしくなる
・IME WatcherはIMEをタスクトレイにしまってくれるツール
というあたりに何かありそうです。
0422デフォルトの名無しさん
2008/07/11(金) 17:43:08スレチだけど、それじゃあ他の全部のプログラムが終了時に例外投げるんじゃないの?
デバッグ実行限定かもしれんが。
0423デフォルトの名無しさん
2008/07/11(金) 17:51:030424デフォルトの名無しさん
2008/07/11(金) 17:51:15ええ、デバッグ実行限定ですが、あらゆるプロジェクトが例外投げました
素直にMS2003入れ(て、IMEをタスクトレイにしまい)ました;
0425デフォルトの名無しさん
2008/07/11(金) 18:59:01以下の通りのコードをビルドしようとしたところエラー
error C2011: 'STRUCT_IMAGE' : 'struct' 型の再定義
error C2011: 'STRUCT_PIXEL' : 'struct' 型の再定義
が出ました。
どこを直せばいいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef unsigned char BYTE;
typedef struct STRUCT_IMAGE{
int width,height;
int depth;
void* pixels;
}ImageData;
#define PIXELMAX 255
typedef struct STRUCT_PIXEL{
int r,g,b;
}Pixel;
ImageData* createImage(int width,int height,int depth);
void disposeImage(ImageData *img);
int readBMPfile(char *fname,ImageData **img);
int writeBMPfile(char *fname,ImageData *img);
int getPixel(ImageData *img,int x,int y,Pixel *pix);
int setPixel(ImageData *img,int x,int y,Pixel *pix);
0426デフォルトの名無しさん
2008/07/11(金) 19:08:250427デフォルトの名無しさん
2008/07/11(金) 19:10:220428デフォルトの名無しさん
2008/07/11(金) 19:13:54余りに下らない質問ですいません・・・
エディットボックスに変数の追加をして利用したいのですが
Valueは使い方が分かるのですが
Controlの意味がよく分かりません。
Googleから調べてみたのですが、コレといってピンとくる情報も見つけられず
(あまりに理解が無くて、見ても気づいていないのかもしれないです)
Controlのニュアンスもつかめていないので、他にどういうキーワードで検索していいかもわからず
ここに書き込ませてもらいました。
どなたか、よろしければヒントお願いします。
0429デフォルトの名無しさん
2008/07/11(金) 19:38:46>VC++
VC++2008 Express Edition?
>エディットボックス
System.Windows.Forms.TextBox?
CEdit?
0430デフォルトの名無しさん
2008/07/11(金) 19:45:17VisualStudio TeamSystem2008 DevelopmentEdition で
MFCアプリケーションのエディットボックス、変数の種類のところはCEditになってます
答え噛み合ってるでしょうか・・・?
0431デフォルトの名無しさん
2008/07/11(金) 19:59:590432デフォルトの名無しさん
2008/07/11(金) 20:01:20未経験中途で入った新入社員です、なのでこれは会社のです^^;
0433デフォルトの名無しさん
2008/07/11(金) 20:37:14みんな呆れて返答しないみたいだけど、まずMFCの本とかに
一通り目を通したら?
0434デフォルトの名無しさん
2008/07/11(金) 20:48:46今はWin32APIを使ったC++プログラミングの勉強をしていたんですが
資料として渡されたソースで、Win32で書かれたクラスの利用側がMFCで書かれていて
それなりに利用側の構造も理解しないと先に進めないので調べていたんです。
なのでMFCの本を購入してっていうのはちょっと・・・
エディットボックス、Control、Value、コントロール変数 等の組み合わせでググったんですが、
参考になるサイトを見つけられなかったため、書きこませて貰いました。
具体的にはCFileDialogでファイルのフルパスを抜き出すって物なんで
Valueを使ってもControlを使っても実装する事はできたんですが
Controlを使った実装方法の意味がいまいち理解できなかったので質問しました。
みなさん呆れていらっしゃったんですね・・・理由は、質問するために渡した情報が少なかったからでしょうか?
それともそんな【初心者歓迎】スレでも質問しちゃいけない程程度の低い質問だったからでしょうか?
よろしければその点だけでも教えていただけると助かります。
どうもありがとうございました。
時間の折り合いがついたら言われたとおりMFCの書籍で勉強したいと思います。
0435デフォルトの名無しさん
2008/07/11(金) 20:50:47F = ふぉんとうに
C = 挑戦しちゃうの?
0436デフォルトの名無しさん
2008/07/11(金) 20:58:44すいません、解決しました。
ありがとうございました。
>>435
うま・・・くないですね
がんばります
0437デフォルトの名無しさん
2008/07/11(金) 21:01:45そりゃ、ここは初心者歓迎とあるけどな。
0438デフォルトの名無しさん
2008/07/11(金) 21:24:40ちいさな事でつまずいて、そういう時ほど混乱して膨大に時間を無駄にしてしまうので、
知恵を貸してもらえたらと思ったんです。
他人の貴重な時間を奪ってる訳ですから、おっしゃる事はもっともです。
これだけの時間が経過してわかった事は「MFCの本に書いてある」って事だけだったので、
そういった意味でも勉強になりました。
アドバイスありがとうございました。
0439デフォルトの名無しさん
2008/07/11(金) 21:33:26レスが付かなければひがんでで催促して
優しく忠告されたら逆ギレしてってどんだけ甘ちゃんだよ
みんなお前の親じゃねーんだよ
vipにも書き込んでマルチしやがってクズ野郎
0440デフォルトの名無しさん
2008/07/11(金) 21:34:500441デフォルトの名無しさん
2008/07/11(金) 21:43:260442デフォルトの名無しさん
2008/07/11(金) 21:46:320443デフォルトの名無しさん
2008/07/11(金) 21:49:05ホントはみんな、答えを知らないか、質問の意味が分からないかのどっちかw
0444デフォルトの名無しさん
2008/07/11(金) 21:51:22塩化ビニールの化学式格好いいよ!
塩化ビニールの原子モデルサイコーにエロいぜ!
0445デフォルトの名無しさん
2008/07/11(金) 21:55:10じぶろ萌えたん
0446デフォルトの名無しさん
2008/07/11(金) 21:58:40amazonでアルゴリズムの本を探していたら、
いつの間にかアルマジロランをプレイしていた。
金曜日の夜だったはずなのに、月曜日になっていたとかそんなちゃちな(ry
0447デフォルトの名無しさん
2008/07/11(金) 22:50:17会話が噛み合わないのでこれ以上話すのは時間の無駄ですね。
ありがとうございました。
>>443
多分、後者ですね・・・もっと全体像を把握して的確に質問する技術を磨きます。
ありがとうございました。
0448デフォルトの名無しさん
2008/07/11(金) 23:00:390449デフォルトの名無しさん
2008/07/11(金) 23:04:12会社の人間に先ず聞くべきだったかもしれないね。
0450デフォルトの名無しさん
2008/07/11(金) 23:07:08programmer.grow();
0451デフォルトの名無しさん
2008/07/11(金) 23:07:590452デフォルトの名無しさん
2008/07/11(金) 23:09:46そうですね・・・それは全く持って思います。
極力社内で解決できるように新人同士のネットワークを作る努力などはしているんですが、
上司や先輩に質問ができる環境を作る努力もしていこうと思います。
ありがとうございました。
0453デフォルトの名無しさん
2008/07/11(金) 23:22:36少なくともPOSIXでは、execv()の引数って
int execv(const char *path, char *const argv[]);
になってるんですが(参考: http://www.linux.or.jp/JM/html/LDP_man-pages/man3/exec.3.html )
この2番目の引数が
const char *const argv[]
でなくて
char *const argv[]
なのを説明できる方はいますか?
execv()はargv[]のアドレスを変える可能性があるということなんでしょうか?
0454デフォルトの名無しさん
2008/07/11(金) 23:39:44ソースUPしろってこと?OK
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7343.txt
このクラスのOpenFileDialog()がCreateFileMapping()の直後の
if文でfalse返ってファイルを読み込めないんすよ。
環境はVC++2008 Windows
0455429
2008/07/11(金) 23:47:270456デフォルトの名無しさん
2008/07/11(金) 23:47:280457デフォルトの名無しさん
2008/07/11(金) 23:49:43違いは、Controlはvalueより複雑なことができるというところ
たとえば状況に応じてEditControlを有効化/無効化するとかしたいなら
Controlでなければ対応できない
テキストを取り出すだけならどちらも同じことができるので使いやすいほうでよい
0459429
2008/07/12(土) 00:01:080460デフォルトの名無しさん
2008/07/12(土) 00:15:21なるほど、より複雑な実装ができるんですね。
今回はとりあえずパスを取りだしたら用済みなんで、時間ができたら調べてみます。
自分みたいな素人にもわかりやすい抽象的な説明、ほんとうに助かります。ありがとうございました。
>>458
さっき、FileDialogのクラスからたどっていろいろなクラスの中身を調べてました。
見ても見ても意味がわからなくて、どこに大事な事が乗ってるのかわからなかったんですけど、やっと発見できました!
なかなかMSDNも自分みたいなへっぽこには欲しい情報を探すのがむずかしくて笑
でも、ちょっと今回見つけられたんで、次回からもっと楽に情報を探せると思います。
ありがとうございました。
>>459
あ、こういう機能をDDX(Dialog Data Exchange)って言うんですね!
ほんと、単語を知らないっていうのは調べ物をするのが容易じゃないです。
ありがとうございました、詳しく調べてみます!
0462デフォルトの名無しさん
2008/07/12(土) 00:49:59何か弊害ありますか?
インターフェースを介してでないと呼べないようにしたいのですが。
弊害がない場合このやり方は一般的なのでしょうか?
0463399
2008/07/12(土) 00:55:14ファイルの置き場が悪いのかなと思ったら、
Cドライブ直下に置いてもエラーコードは「指定したパスが見つかりません」だとか。
もうよくわからん
0464デフォルトの名無しさん
2008/07/12(土) 01:01:090465デフォルトの名無しさん
2008/07/12(土) 01:09:21状況がみえないのだが、そもそも CreateFileMapping のパラメタに
パス名というのは存在しないのでは?
オブジェクト名というのはあるけど、これはパス名とは違うし
もともと \ は受け付けない仕様のはず
0466デフォルトの名無しさん
2008/07/12(土) 01:14:020467399
2008/07/12(土) 01:53:22それっぽい
オブジェクト名はパスが適切だと思ったんだけど
\がすっかり盲点だったし、NULLにしたら期待道理に動作もした。
さんきゅー
0468デフォルトの名無しさん
2008/07/12(土) 05:25:34終了させようとするとハンドルされていない例外、読み込み中にアクセス違反が発生エラーが出るんですが、こういう使い方は無理なんですか?
0469デフォルトの名無しさん
2008/07/12(土) 06:00:29可能、別の原因で出てるエラーだろう。
再現性のあるコードをアップできるならしたほうが早いと思うよ。
0470デフォルトの名無しさん
2008/07/12(土) 06:09:050471デフォルトの名無しさん
2008/07/12(土) 11:58:23俺の近所では一般的ではないみたい。結局のところインタフェースとなる
基底クラスのポインタか参照を用意する手間を厭わなければ何でもできる
ので、期待できるのは、うっかりミスを防止する程度じゃないかな。
あるいは、具象クラスで基底クラスと概念の異なるインタフェースを提供
して、そのクライアントには基底クラスのインタフェースを触らせない
という用途も考えられるけど、これは多重継承使えっていうサインかも。
0472デフォルトの名無しさん
2008/07/12(土) 12:24:50インターフェイスしか触らせたくないのなら、具象クラスのコンストラクタをプライベートにして、newできなくして、
ファクトリメソッドみたいので、作るようにすればいいんじゃね?
0473デフォルトの名無しさん
2008/07/12(土) 14:18:49>>472
ありがとうございます。
インターフェースしか触らせたくなかったらたしかにnewできなくするべきですね。
デザパタのオブザーバパターンのコールバック関数は
継承したクラスでprivateで持たせるのは一般的にどうなのでしょうか?
そのクラスは直接newして使うクラスなのでなるべく関係のない関数は
隠したいです。
0474デフォルトの名無しさん
2008/07/12(土) 16:36:08一般的かどうかは知らんが、俺なら callback を private にするな。
インタフェースは最小が気持ちいいしね。混乱・勘違いされるのが嫌なら
「なぜそうするのか」というコメントかメモを残せばいいでしょ。
0475デフォルトの名無しさん
2008/07/12(土) 17:00:26呼び出し側から、呼び出した結果引数の内容が気づかないうちに変更されている
危険がなくて安心、とかいう説明をきいた記憶があるのですが、C++は呼び出し
側から値渡しか参照渡しかわからない書き方ができるので、これは退化じゃない
かと思うのですが、違うんでしょうか?
0476デフォルトの名無しさん
2008/07/12(土) 17:10:270477デフォルトの名無しさん
2008/07/12(土) 17:14:46ポインタの値渡しと参照渡しがごっちゃになってる
constをつけておけば値を変更しないことを明示できるからそれを使うべし
というか気づかないうちに変更されてるって関数の説明くらい読めばいいのに
逆に説明の書いてないような怪しい関数は使わない方がいい
0478デフォルトの名無しさん
2008/07/12(土) 17:16:010479デフォルトの名無しさん
2008/07/12(土) 17:19:32> というか気づかないうちに変更されてるって関数の説明くらい読めばいいのに
> 逆に説明の書いてないような怪しい関数は使わない方がいい
それはプログラムするときの心構えや良い習慣の問題であって、言語として問題を
起こしにくいつくりになっていれば、それに越したことはないのでは?
0480デフォルトの名無しさん
2008/07/12(土) 17:32:38嫌ならDでも使えばいいよ。1.X系は仕様確定してるし
0481デフォルトの名無しさん
2008/07/12(土) 17:39:28Dとか出してハク付くているつもりか知らんがプログラマとしては大成しないタイプだな。
C++の参照渡しがあの形になっているのは理由がある。
が、入門書とかでswap(a,b)みたいなので、Cに比べて便利になりました、みたいな説明
をしているのがあって、それは確かにバカじゃないかと思う。
呼び出し元をみただけで、変数が変更されるかどうかわかった方が便利だしミスが少な
くなるのはあたりまえ。
0482デフォルトの名無しさん
2008/07/12(土) 17:44:090483デフォルトの名無しさん
2008/07/12(土) 17:46:200484デフォルトの名無しさん
2008/07/12(土) 17:46:47じゃあ言語の文句をここで言っても意味が無いんじゃって思うんだ
0485デフォルトの名無しさん
2008/07/12(土) 17:51:59C++になっても結構使うぞ
0486デフォルトの名無しさん
2008/07/12(土) 17:52:10まず便所の落書きLVの場所で篩ってみるのも
迷惑度が下がってよいと思うよ。
0487デフォルトの名無しさん
2008/07/12(土) 17:53:480488デフォルトの名無しさん
2008/07/12(土) 17:53:53引数の値が変わらないことは、
大して重要なことではありません。
char* p = f1();
f2(p);
free(p);
int handle = open();
close(handle);
Cではどのような関数であれ、
pやhandleの値自体が変わらないことは保証されます。
しかし、ポインタの先やその値に関して重大な影響を与えることはあり、
それは関数の仕様を知る以外に方法はありません。
そして、引数の型が参照かどうかを知るのも同様であるため、
退化というような新たな問題が発生したとは言えないのです。
0489デフォルトの名無しさん
2008/07/12(土) 17:58:180490デフォルトの名無しさん
2008/07/12(土) 18:01:00> ポインタは便利だろ
> C++になっても結構使うぞ
バカだなあ。
ポインタ否定しているわけでもないし、C++の参照渡しを否定しているわけでもないぞ。
swap(a,b)みたいなので参照渡しを使うぐらいなら、C流に&a, &bで渡した方が分かり易
に決まってんじゃん。
C++で必要なはデストラクタとかでどうしても必要だからでしょ。
C#でこの問題がどう解決されているかとかも含め、いっぺん調べてみりゃいいのに。
0491デフォルトの名無しさん
2008/07/12(土) 18:01:32↓
VBでポインタ使えない・配列の勝手が悪い と投げる
0492デフォルトの名無しさん
2008/07/12(土) 18:13:51> C++で必要なはデストラクタとかでどうしても必要だからでしょ。
なんで、自信満々にバカ晒せるんだろう...
自分こそいっぺん調べてみりゃいいのに...
0493デフォルトの名無しさん
2008/07/12(土) 18:15:43呼び出し元だけじゃマクロか関数か区別のつかない
C言語(とC++言語)は駄目駄目ってことですね
0494デフォルトの名無しさん
2008/07/12(土) 18:30:49外国人から見ればこの記述法のやりやすいってだけの話で。
思考停止云々って馬鹿じゃねーの?できる範囲でできうる限りの事をするのがプログラマだろ。
C++で実装できなきゃアセンブラで書くしアセンブラで出来なきゃ0と1ででもプログラム書いてやるよ。
言語仕様の文句をつけてることで大成するんならご勝手にやってれば?
出来ない事があるからこそ、複数の言語扱えるようになればいいだけの話で
CにしろC++にしろ前提条件が「プログラマは、すごい人だからミスなんてしないよね!」っていう仕様になってるから
クソッタレな馬鹿は文句つけるしかできなくなる
0495デフォルトの名無しさん
2008/07/12(土) 18:32:170496デフォルトの名無しさん
2008/07/12(土) 18:38:350497デフォルトの名無しさん
2008/07/12(土) 18:42:030498デフォルトの名無しさん
2008/07/12(土) 19:01:000499デフォルトの名無しさん
2008/07/12(土) 19:05:010500デフォルトの名無しさん
2008/07/12(土) 19:42:060501デフォルトの名無しさん
2008/07/12(土) 19:48:590502デフォルトの名無しさん
2008/07/12(土) 19:49:29なるほど
>>501
わかってましたけど、サーセンw
0503デフォルトの名無しさん
2008/07/12(土) 20:44:10「能」を含む文字列を正しく区切れないのですがなぜでしょうか?
char buf[1025]= "ほげほげ能ほげほげ";
char *sp, *nexttoken;
sp = strtok_s(buf, "\\", &nexttoken);
printf("%s\n", sp);
このようなコードを実行した場合、「ほげほげ・」と出力されます。
OSはWinXP Pro SP3、コンパイラはVisual Studio 2005 Proです。
Visual Studio関係の更新はWindows Updateからすべて適用してあります。
0504デフォルトの名無しさん
2008/07/12(土) 20:50:21「ダメ文字」でぐぐれ
0505503
2008/07/12(土) 20:58:39ありがとうございます。
0506デフォルトの名無しさん
2008/07/12(土) 21:03:28内部はwchar_tを使うように。
0507デフォルトの名無しさん
2008/07/12(土) 21:24:22/* main.c */
#include <stdio.h>
#inlcude "main.h"
#include "sub.h"
static char szName[10];
void main()
{
strcpy( szName , "TEST" );
showName();
};
const char* getName( )
{
return (const char*)szName;
}
/* main.h */
const char* getName();
/* sub.c */
#include <stdio.h>
#include "sub.h"
void showName()
{
printf( "%s\n" , getName() );
}
/* sub.h */
void showName();
0508デフォルトの名無しさん
2008/07/12(土) 21:32:40「どう考えてもstatic変数を使うべき所だろう」というとき以外は
static変数を使うのを止めましょう。
0509デフォルトの名無しさん
2008/07/12(土) 21:37:57>>453には誰も答えられないの?
みんなVCですか。そうですか。
ここはそんなレベルですか。
0510デフォルトの名無しさん
2008/07/12(土) 21:41:29変えても関数の外にはなんら影響しないだろ
0511デフォルトの名無しさん
2008/07/12(土) 21:41:58単に読まれてないだけだろ。そう怒るな。
0512デフォルトの名無しさん
2008/07/12(土) 21:44:26こんな感じで。 ※各ヘッダにはインクルードガードを。
/* app.h */
struct App {
char szName[10];
};
/* main.h */
#inlcude "app.h"
const char* getName(App* app);
/* sub.h */
#inlcude "app.h"
void showName(App* app);
/* main.c */
#include <stdio.h>
#inlcude "main.h"
#include "sub.h"
void main() {
App app;
strcpy( app.szName , "TEST" );
showName(&app);
};
const char* getName(App* app){
return (const char*)app->szName;
}
/* sub.c */
#include <stdio.h>
#inlcude "main.h"
#include "sub.h"
void showName(App* app){
printf( "%s\n" , getName(app) );
}
0513デフォルトの名無しさん
2008/07/12(土) 21:54:23>char *const argv[]
こういう引数ってキモイよな。char**の方が読みやすいし。
constつけるなら
const char* const * argv
だな。
const付いてないなら書き換わるかも、と考えた方が良いと思うぜ。
select()のtimeout書き換えみたいな糞実装もあることだし。
0514デフォルトの名無しさん
2008/07/12(土) 21:55:50んー、たしかに const char const *argv[] でないのは不思議ですね。
0515デフォルトの名無しさん
2008/07/12(土) 22:02:26WinAPIのCreateProcessも引数のコマンドライン文字列がconstでなく、
しかもマジで書き換えてくる
0516デフォルトの名無しさん
2008/07/12(土) 22:02:47煽ってごめんな。ありがとう。
>>511
「関数の外になんら影響しないように」すれば何の問題もないのは確かなんだけど、
なぜそうなってるのか?が疑問なんです。
>>513
の言うとおり書き換わると思ったほうが良いんだろうけど
なぜ書き換わるようにしているのか?
が気になってるといったほうが質問が適切ですね。
select()のtimeout書き換えは確かに糞実装だけどやりたいことはわかるし、
それと似たような理由がexecv()にもあるんですかね?
0517デフォルトの名無しさん
2008/07/12(土) 22:04:54プログラムはその人のアルゴリズムで書かれてるから何をしているかは理解できても
どうしてそうなっているかは、その人でなければ理解できん
0518デフォルトの名無しさん
2008/07/12(土) 22:13:06アルゴリズムをなぜそうしたかは、確かに書いた人しかわからないけど、
こういうシステムコールのAPIの引数が実装者にしかわからないってありえないと思うんですよね。
何か理由があるんではないか?と思ってしまうのです。
まあその理由が、
・単純にこうしたほうが処理が速いとか実装が楽
レベルなのかもしれませんけど。
0519デフォルトの名無しさん
2008/07/12(土) 22:14:17const付け忘れとか、スペルミスとかも普通に残っていくし。
0520デフォルトの名無しさん
2008/07/12(土) 22:17:180521デフォルトの名無しさん
2008/07/12(土) 22:26:46If I had to do it over again? Hmm... I guess I'd spell 'creat' with an 'e'. (On the design of Unix)
wwww
0522デフォルトの名無しさん
2008/07/12(土) 23:44:12Cだと実引数でfoo( &x )という書き方で参照渡しできるのに、C++だと
なぜわざわざ仮引数側でfoo (int& x)なんて書き方をして、呼ぶ側は
foo( x )とするんだろう、呼ぶ側でも区別つけた方がいいんじゃない、
というのはなかなかいい質問だと思うんだが。
「C++はそういうものだから仕方ない」は思考停止とまでは呼ばないけ
ど、ちょっと笑って、どこか悲しくなったのは確かだなあ。処世術と
してはそれが正しいんだろうね。いちいち悩むな、どうせ自分じゃ世界
は変えられない、与えられたものにいちいち疑問を持つな、みたいな
諦念みたいなものが感じられて(w
#一つ煽ると、誰もちゃんと説明できないのに笑った。
#初心者歓迎、じゃなくて、初心者しかいないのね(w
0523デフォルトの名無しさん
2008/07/12(土) 23:45:500524デフォルトの名無しさん
2008/07/12(土) 23:47:08> 何するか知らない関数呼ぶとか普通ねぇしな
あなたみたいな優秀なプログラマばっかりだったらきっとカプセル化とかprivateメンバと
とかめんどくさいこと考えずにすんだんだろうね。
いや、皮肉じゃなくて。
0525デフォルトの名無しさん
2008/07/12(土) 23:49:43> 分かりやすいかどうかじゃなくって、C++とか外国人が作ったわけで
> 外国人から見ればこの記述法のやりやすいってだけの話で。
これ最高だな。爆笑した。
「外国人が作ったから」
俺も次回から全部これで説明することにするよ。
0526デフォルトの名無しさん
2008/07/12(土) 23:50:16コンパイルエラーでました><
0527デフォルトの名無しさん
2008/07/12(土) 23:55:53>>494はその説明でいいけど、君はどうも使いどころが理解できてなさそうだから
たぶん恥をかくだろうね。
0528デフォルトの名無しさん
2008/07/12(土) 23:57:57> Cだと実引数でfoo( &x )という書き方で参照渡しできるのに、C++だと
> なぜわざわざ仮引数側でfoo (int& x)なんて書き方をして、
こんな馬鹿なことを書いちゃう程度の理解力だから、「なかなかいい質問だと思」っちゃったんでしょうね。
0529デフォルトの名無しさん
2008/07/13(日) 00:03:19C++/CLI自体は、歴史の闇に葬っていいけどw
0530デフォルトの名無しさん
2008/07/13(日) 00:06:24494はちょっとどうかと思ったけど。
あれって説明なの?
0531デフォルトの名無しさん
2008/07/13(日) 00:07:45俺もいい質問だと思うけど何がダメなの?
0532デフォルトの名無しさん
2008/07/13(日) 00:08:57525は説明だと思ったみたいだね。
0533デフォルトの名無しさん
2008/07/13(日) 00:09:26どうして、コロンとドットなのかとか考えたか?
コロンとドットは日本語て言う所の、句読点に相当するのよ。
「あなたにとって最適化されたプログラム言語」ではなく広義では外国人が。
狭義では「C++を作った人にとって最適化されたプログラミング言語」なんだよ。
0534デフォルトの名無しさん
2008/07/13(日) 00:10:050535デフォルトの名無しさん
2008/07/13(日) 00:13:51そんなに許されない質問なのかな>C++の参照
というか何故かわからないので誰か分かりやすく説明して下さい
初心者でスミマセン
0536デフォルトの名無しさん
2008/07/13(日) 00:14:44とにかくただ対立したいだけの困ったちゃんは、誰が書いてるか気になるのかな。
0537デフォルトの名無しさん
2008/07/13(日) 00:15:290538デフォルトの名無しさん
2008/07/13(日) 00:18:11間違いとかじゃくて、C++とか作った人間が自分に適したように作っただけの
話。本当のプログラマは呼び出し側の変数が変わるなんて注意は当然している。
そんなのも理解できないような奴はVBでもやってろ。
そういう仕様だからそれにあわせるのは当然。
0539デフォルトの名無しさん
2008/07/13(日) 00:22:220540デフォルトの名無しさん
2008/07/13(日) 00:25:190541デフォルトの名無しさん
2008/07/13(日) 00:53:09これはきっとプログラマを信用してないってことなんだろうね。C++は真のプログラマ
向け言語だからいちいちそういう余計なタイプはさせないという点で優れている。
constの複数の意味とかちょっと考えればすぐわかるようなことを区別するのにいち
いちプログラマに負担掛けないのがC++のいいところなのにわけのわからないことを
書くからきつい反応されるんだろ。
わかんねえ奴はC#でもJavaでも使ってりゃいいんだよ。
0542デフォルトの名無しさん
2008/07/13(日) 00:59:551つは、コンピューターを効率よく動かそうとする言語(その分プログラマーに負担を)
2つに、プログラマーのミスを少なくしよう、プログラマーに優しくしよう(その分コンピューターに負担を)
1の代表に、アセンブラ、C、Cから継承されたC++
2にJava、C#、純粋関数型言語等
この二つは、根本的に設計思想が違うのです。
0543デフォルトの名無しさん
2008/07/13(日) 01:06:11何で聞いたらダメなの?調べろ?どこでどうやって調べればいいかわからないから、
専門的なことを良く知っているあなたに聞いてるんでしょ?
検索しろっていうけど、自分で調べるより知ってる人から教えてもらった方が早いし、
ちゃんとわかるまで繰り返し聞けるじゃん。いざとなったら代わりにやってもらうことも
可能だし。
こっちは何も知らない素人なんだから、わからないのはしょうがないでしょ?
ちょっと知ってるからって、素人を馬鹿にしたような言い方は正直ムカツク。
レベルが低いとか、話が通じないとか、単語が分からなくていちいち説明しなきゃ
ならないのかよめんどくさいとか、そんなこというけど自分だって最初は何も
知らなかったわけでしょ?態度悪いし感じ悪いね。
確かにこっちは何もわかってないかもしれないけど、一応要望だけは伝えておかなきゃ
あとで後悔するのも嫌だし。勝手に何でもかんでもやった挙句、高いお金かけてたら、
いくらなんでも引くって。ある程度の出費は覚悟してるけど、こっちにも限度ってものが
あるんだから。
信用してないわけじゃないけど、信用してるから頼んでるんだし。お願いする立場だけど
そっちもちゃんと考えてほしい。
そっちがコンピューターに詳しくて、実力もあるってのはちゃんと分ってるから、
別に疑ってないから、ちゃんと性能がよくてお金のかからないパソコンを組んで。
これが素人の言い分です。
0544デフォルトの名無しさん
2008/07/13(日) 01:14:140545デフォルトの名無しさん
2008/07/13(日) 01:16:33素人の分際で知らないモノを教えてくれる人にムカツクだの感じ悪いだの大層なご身分だな
0546デフォルトの名無しさん
2008/07/13(日) 01:17:00カプセル化もprivateメンバもする、それだけでなく
メンバ関数の説明も書くし、読む
お前はクラス名や関数名、引数名だけで
勝手に仕様を想像して使いそうだけどな
0547デフォルトの名無しさん
2008/07/13(日) 01:17:22っ教えてgoo
0548デフォルトの名無しさん
2008/07/13(日) 01:20:43そんな泣き言を言っている時点で2chに向かないから、もっと大人になってから来ましょう。
0549デフォルトの名無しさん
2008/07/13(日) 01:21:440550デフォルトの名無しさん
2008/07/13(日) 01:23:22住人の判断力を奪うとは何という破壊力。
0551デフォルトの名無しさん
2008/07/13(日) 01:25:120552デフォルトの名無しさん
2008/07/13(日) 01:33:56テンプレwww
0553デフォルトの名無しさん
2008/07/13(日) 01:42:19こういう大勢と対話ができる場所で不満を発することには少なからず意味があるだろう。
不満がもっともなものであるならば、それはその言語の弱点であり、弱点を把握することは周りの人間にも有益なこと。
もし不満が筋違いなものであっても、では何故そのような仕様になっているのかという本当の理由を、
詳しい人間に教えてもらえる。その情報もきっと周りの人間にとって有益なものであるはず。
「黙って使ってりゃいい」って、そっちの方が何も生み出さないだろうと。
0554デフォルトの名無しさん
2008/07/13(日) 01:51:460555デフォルトの名無しさん
2008/07/13(日) 01:54:32「黙って使ってりゃいい。気に入らなきゃ自分で作れ」って方が何かを生み出しそうでしょ?
0556デフォルトの名無しさん
2008/07/13(日) 01:58:57何が言いたいんだお前は。
0557デフォルトの名無しさん
2008/07/13(日) 01:59:36なぜこの文が入ってるか分からないが、素人が仕事として依頼する場合に
「ちゃんと性能がよくて」を聞きだすのに非常に時間がかかる。そしてその分を請求
項目に含むのは当然では?
要求仕様が明確であればその分浮くのか?という疑問もわくだろうが、その場合、
玄人から見た観点での改善案も出てくるだろうと思うんだ。
メモリは1Gがいい!→512*2の方が速いっすよ。けど拡張性はさがるっす。どうするっすか?
みたいな。
0558デフォルトの名無しさん
2008/07/13(日) 02:06:19納得と理解を混同している輩にそんな事言われても
0559デフォルトの名無しさん
2008/07/13(日) 02:09:180560デフォルトの名無しさん
2008/07/13(日) 02:09:400561デフォルトの名無しさん
2008/07/13(日) 02:11:190562デフォルトの名無しさん
2008/07/13(日) 02:53:32まぁ大抵型変換演算子使わなくても別な方法があると思うが。
0563デフォルトの名無しさん
2008/07/13(日) 03:23:430564デフォルトの名無しさん
2008/07/13(日) 03:34:500565デフォルトの名無しさん
2008/07/13(日) 08:51:27dynamic_castのことか?
具象クラス固有の機能とか使いたい場合など
ダウンキャストで使う
まぁその時点であまり設計的によろしくないのかも
クラスを別な型に???
>>562は何言ってんの?www
0566デフォルトの名無しさん
2008/07/13(日) 08:52:14だったら、次々期C++に入れてもらえるように標準化委員会に送ってくればいいだけの話だろ?
0567デフォルトの名無しさん
2008/07/13(日) 09:05:120568デフォルトの名無しさん
2008/07/13(日) 09:54:07BOOL flag2;
void CRS232C_TESTDlg::OnBnClickedstart(){
if(flag == 0){
flag = 1;
flag2 = 0;
AfxBeginThread(drawData::DrawThreadFunction, this, THREAD_PRIORITY_LOWEST);
}else{
flag = 0;
flag2 = 1;
}
}
extern BOOL flag;
extern BOOL flag2;
UINT drawData::DrawThreadFunction(LPVOID pParam){
flag2 = 0;
while(flag2 == 0){
//処理
}
}
これがどうしてもスレッドとまりません、どこがおかしいのかブレークポイントを両方につけてゆっくり確認しながら進めると止まるんですが
ブレークポイントを入れないとなぜかflag2が1にならないんです。どういうことでしょうか?
0569デフォルトの名無しさん
2008/07/13(日) 10:04:22>>563
結構有名な話だが、C++の参照渡しはオーバーロードされた
演算子をすっきりした記述で書くために導入された。
もし参照が無ければ、
operator = なら
a = b; と書くところ(aが変更される)を、 &a = b; とかって書かない
といけなくなるだろ。式としての記述のスマートさを維持するには、
単に「a」と書いてaを変更することが可能なルールが必要だった
んだよ。
通常の関数では参照と値渡しの区別が出来ないので
関数内で値を変更するためには参照は使用すべきではない。
演算子なら式のどの部分が変更されるかというのは、ほとんど
の人が「算数的」なルールを共有しているから問題はおきにくい。
それなら参照は演算子オーバーロードだけに限定すればいいん
じゃないかという声もありそうだが、C++は一貫性、一般化を極力
重んじるから、これだけ特別、というふうにはならなかったようだ。
D&Eに参照渡しの導入経緯はちょこっと記述があったよ。
0570デフォルトの名無しさん
2008/07/13(日) 10:10:24プログラム以前の問題だが、
>CRS232C
誰が書いたか分かるような情報をそのまま書いてしまうことが
気にならないのかい?
0571デフォルトの名無しさん
2008/07/13(日) 10:15:51原因はわからんけどフラグの変数にvolataileをつけてみるか、それでもだめだったら、
素直に同期オブジェクトを使うとか。
0572デフォルトの名無しさん
2008/07/13(日) 10:25:53もう1週間ぐらいこれやってるんでそろそろ恥ずかしくなってきましたw
volataile、同期オブジェクト調べてみます。ありがとうございます。
0573デフォルトの名無しさん
2008/07/13(日) 10:33:170574デフォルトの名無しさん
2008/07/13(日) 10:35:14IA-64とか他のOSへの移植とか言い出すともっとややこしくなる。
0575困り熊
2008/07/13(日) 10:47:154月から大学でC言語を始めたのですが、課題に四苦八苦しています。
どなたか助言していただけると助かります。
課題 文字列検索の関数の作成
形式 char StrStr(char *s1 char *s2)
機能 文字列s1の中で文字列s2と同じ並びの最初の出現に位置づけする。
返却値 文字列が発見できなかった→NULL、発見できた→位置づけられた文字列のポインタ
ロジックもいまいち浮かんでこないので手が付けられません。。。
0576デフォルトの名無しさん
2008/07/13(日) 10:52:27文字処理のロジックというのは案外地道なもので1文字づつ丹念に調べてゆくのが基本。
0577デフォルトの名無しさん
2008/07/13(日) 10:57:41ただし先生がスレをチェックしてることがあるから丸写しは要注意な。
0578困り熊 ◆JW6hbMJs/s
2008/07/13(日) 11:00:20一応、文章に落としてからソースを考える作業を行っているんですが、どうもうまくいきません。
この質問に相応しいスレがあったのでそちらに移動します。
スレ汚してしまい申し訳ありません。
0579デフォルトの名無しさん
2008/07/13(日) 11:10:470580デフォルトの名無しさん
2008/07/13(日) 11:11:35そういうのはスレ的に全然OK。
0581デフォルトの名無しさん
2008/07/13(日) 11:14:26二重のfor文とif文組み合わせりゃいけると思うんだが・・・。
0582デフォルトの名無しさん
2008/07/13(日) 11:18:29外国人から見ればこの記述法のやりやすいってだけの話で。
思考停止云々って馬鹿じゃねーの?できる範囲でできうる限りの事をするのがプログラマだろ。
C++で実装できなきゃアセンブラで書くしアセンブラで出来なきゃ0と1ででもプログラム書いてやるよ。
言語仕様の文句をつけてることで大成するんならご勝手にやってれば?
出来ない事があるからこそ、複数の言語扱えるようになればいいだけの話で
CにしろC++にしろ前提条件が「プログラマは、すごい人だからミスなんてしないよね!」っていう仕様になってるから
クソッタレな馬鹿は文句つけるしかできなくなる
0583デフォルトの名無しさん
2008/07/13(日) 11:20:02{
if (*s1 == '\0')
return NULL;
if (strncmp(s1, s2, strlen(s2) == 0)
return s1;
return StrStr(s1 + 1, s2);
}
0584デフォルトの名無しさん
2008/07/13(日) 11:20:290585デフォルトの名無しさん
2008/07/13(日) 11:21:20strncmpの閉じ括弧が抜けてた。
0586デフォルトの名無しさん
2008/07/13(日) 11:23:300587デフォルトの名無しさん
2008/07/13(日) 11:43:33無い。C++では、finallyより優れたRAIIを使う。
つまりはデストラクタ。
0588デフォルトの名無しさん
2008/07/13(日) 11:49:46#include<stdio.h>
#include<string>
using namespace std;
int main(){
string a;
a="test";
printf("%s",a);
return 0;
}
こうすると(null)と表示されてしまいstringの中身が表示できません。
cout使えと言われそうですがライブラリの仕様上使えないのです
0589デフォルトの名無しさん
2008/07/13(日) 11:52:47a.c_str()
0590デフォルトの名無しさん
2008/07/13(日) 11:55:32できました。ありがとうございました
0591デフォルトの名無しさん
2008/07/13(日) 11:58:19ありがとうございました
0592デフォルトの名無しさん
2008/07/13(日) 11:59:48ありがとうございました
0593デフォルトの名無しさん
2008/07/13(日) 12:00:57いえいえ、こちらこそ
0594デフォルトの名無しさん
2008/07/13(日) 12:03:13おととい来やがれ
0595デフォルトの名無しさん
2008/07/13(日) 12:05:23普段大口叩いてる奴らが実はいかに無能だったかがよくわかるな。
0596デフォルトの名無しさん
2008/07/13(日) 12:06:57ありがとうございました。お帰りはあちらです。
0597デフォルトの名無しさん
2008/07/13(日) 12:28:51参照が出来た理由を聞いてたの?
>これは退化じゃないかと思うのですが、違うんでしょうか?
という質問だから、退化じゃないよと答えたけど。
C++は何故参照なんて機能を用意したの?って聞いてれば
おそらくは、俺含め何人か答えてたんじゃない?
0598597
2008/07/13(日) 12:30:340599デフォルトの名無しさん
2008/07/13(日) 12:35:10退化だと思ってるからそういう質問が出る、じゃあ退化でないと言うなら理由を聞かねば納得いかない。
その程度の流れもわからないのか。
0600デフォルトの名無しさん
2008/07/13(日) 12:38:57> >これは退化じゃないかと思うのですが、違うんでしょうか?
> という質問だから、退化じゃないよと答えたけど。
それって、やりとりに対してその範疇でしか受け答えしない、
典型的な仕事できない人間じゃないかw
わざとやってるんだろうけどなー
0601デフォルトの名無しさん
2008/07/13(日) 12:42:58仕事の話と初心者の質問を一緒にされてもね・・・w
あなたが手取り足取り教えてあげてはどうですか?
ちなみに部下の教育では、答え自体は教えずヒントを与えるだけに留めてますが。
0602デフォルトの名無しさん
2008/07/13(日) 12:46:09聞くしか能の無い初心者なのに態度でかいんじゃね?
0603デフォルトの名無しさん
2008/07/13(日) 12:50:55ていうかC++の設計と進化とかその辺読めよ
0604デフォルトの名無しさん
2008/07/13(日) 12:52:190605デフォルトの名無しさん
2008/07/13(日) 12:52:500606デフォルトの名無しさん
2008/07/13(日) 12:54:20低脳涙目だなw
0607デフォルトの名無しさん
2008/07/13(日) 13:05:58あなたは自分自身の邪悪さに心が痛む時がありませんか?
0608デフォルトの名無しさん
2008/07/13(日) 13:08:33お前らいい加減レスすんな
0609デフォルトの名無しさん
2008/07/13(日) 13:10:38http://pc11.2ch.net/test/read.cgi/prog/1214321141/
0610デフォルトの名無しさん
2008/07/13(日) 13:11:410611デフォルトの名無しさん
2008/07/13(日) 13:13:190612デフォルトの名無しさん
2008/07/13(日) 13:18:39ワラタ
リアルでもこんな言葉つかってんのかな
0613デフォルトの名無しさん
2008/07/13(日) 13:42:5810分近くググってやっとルー大柴の名前思い出せた
あっちはウケ狙いでやってるんだろうけど
0614デフォルトの名無しさん
2008/07/13(日) 14:03:40operator T()のことだろう。
わかってなかったの多分お前だけだし、>>562はそのものズバリの回答だぞ。
0615デフォルトの名無しさん
2008/07/13(日) 14:56:52入力したキーやボタンを取得して、対応した処理にディスパッチする基本的コーディング方法を分かり易く解説した
おすすめのホームページを教えてください。
0616デフォルトの名無しさん
2008/07/13(日) 15:05:070617デフォルトの名無しさん
2008/07/13(日) 15:06:150618デフォルトの名無しさん
2008/07/13(日) 15:12:08意味不明っす
0619デフォルトの名無しさん
2008/07/13(日) 15:59:540620デフォルトの名無しさん
2008/07/13(日) 16:03:48そこの何所がわからないのよ?
0621デフォルトの名無しさん
2008/07/13(日) 16:09:590622615
2008/07/13(日) 16:13:41C言語ではあまり使わないのかな? ちなみに自分はJavaメインでWeb系システム構築時によく使うよ。
で、ゲームパッドを使用したプログラムを開発するにあたり、参考になるHPはないの?
0623デフォルトの名無しさん
2008/07/13(日) 16:17:47>>615
このスレは環境依存可だけど、Win32スレの方がいいかもよ。
0624デフォルトの名無しさん
2008/07/13(日) 16:18:39C/C++では、あまりディスパッチと言う表現は使わないね。
どちらかと言えば、スレッド、マルチスレッド、cellでのプロセスパイプ、等かな。
0625デフォルトの名無しさん
2008/07/13(日) 16:19:370626623
2008/07/13(日) 16:20:39それはともあれゲームスレで聞いた方がよさそう。
0627デフォルトの名無しさん
2008/07/13(日) 16:20:580628デフォルトの名無しさん
2008/07/13(日) 16:23:19確信犯はだめよw
Modern C++ Designだよね。あれは使いどころが難しそうだな。
0629デフォルトの名無しさん
2008/07/13(日) 16:24:54ちかごろの事情はあんまりわかんねえんだけど、
Windowsの話なら最近はDirectInputが破棄されてXInputを使うのが推奨されてる。
0630デフォルトの名無しさん
2008/07/13(日) 16:56:02> スレッド、マルチスレッド、cellでのプロセスパイプ、
どう見てもディスパッチとは関係ないと思うが。
0631デフォルトの名無しさん
2008/07/13(日) 17:00:29解決しました
ありがとうございました
0632デフォルトの名無しさん
2008/07/13(日) 17:00:59タクスマネージャで確認した範囲で、メモリを15580KBを消費しました
なぜ16倍も消費しているのでしょうか?
boost::poolで確保した場合は、計算どおり1MBくらい消費しました
0633デフォルトの名無しさん
2008/07/13(日) 17:05:39> 4byteのクラスをnew演算子で250000個確保したところ、
このコード貼れる? そんなに長くないよね。
0634デフォルトの名無しさん
2008/07/13(日) 17:06:16> 参照が出来た理由を聞いてたの?
> C++は何故参照なんて機能を用意したの?って聞いてれば
> おそらくは、俺含め何人か答えてたんじゃない?
お前、自分の間違いを認めるのがよっぽど嫌いみたいだな。
どんだけ屁理屈だよ。
0635デフォルトの名無しさん
2008/07/13(日) 17:06:540636デフォルトの名無しさん
2008/07/13(日) 17:07:300637デフォルトの名無しさん
2008/07/13(日) 17:09:08> >>600
> 仕事の話と初心者の質問を一緒にされてもね・・・w
> あなたが手取り足取り教えてあげてはどうですか?
なにお前はこのスレで頭悪いのを披露するのが仕事だったの(w
てっきり初心者とかの質問に答えるスレだと思ってたよ。俺は。
0638デフォルトの名無しさん
2008/07/13(日) 17:09:20自分でnewの中身(つーかmallocだな)書くこと考えてみな。
何でか想像つくだろ。
boost::pool は要するに new CHoge[250000] なんじゃねーの?
0639デフォルトの名無しさん
2008/07/13(日) 17:10:4864バイト荒いんで確保する仕様なんじゃね?
0640デフォルトの名無しさん
2008/07/13(日) 17:11:57ありがとうございました
0641デフォルトの名無しさん
2008/07/13(日) 17:13:09>外国人から見ればこの記述法のやりやすいってだけの話で
少なくとも、こんなこと言っている奴が人にものを教えちゃだめだろ。
外国人が考えたから仕方ないのです、って何時の時代の人だよ?
0642デフォルトの名無しさん
2008/07/13(日) 17:13:170643デフォルトの名無しさん
2008/07/13(日) 17:14:03参照渡しなら変なことしない限りヌルポにならないから便利。
0644デフォルトの名無しさん
2008/07/13(日) 17:14:06class CA{
public:
long x;
CA(){x=0;}
CA(long a){x=a;;}
};
int const NUMS=500;
main(){
CA *x[NUMS][NUMS];
getchar(); //ここで消費メモリ2340k
cout << sizeof(CA); //"4"と表示される
for(long i=0;i<NUMS;++i){
for(long j=0;j<NUMS;++j){
x[i][j]=new CA(i);
}
}
getchar(); //ここで消費メモリ18160K
for(long i=0;i<NUMS;++i){
for(long j=0;j<NUMS;++j){
delete x[i][j];
}
}
getchar(); //ここで消費メモリ2580k
}
0645デフォルトの名無しさん
2008/07/13(日) 17:14:550646デフォルトの名無しさん
2008/07/13(日) 17:17:47ちなみに空き領域だけに管理情報を書く実装も
あるので管理領域というのは間違い
アロケート後の領域はアロケータの管理外になる
0647デフォルトの名無しさん
2008/07/13(日) 17:20:030648デフォルトの名無しさん
2008/07/13(日) 17:21:450649デフォルトの名無しさん
2008/07/13(日) 17:23:090650デフォルトの名無しさん
2008/07/13(日) 17:23:29おまえはfree(p)するときにpの領域の指すサイズがわかるのかよ。エスパーか。
ていうか、「偉そうな書き方」「age」という、知ったかの典型な野郎だな。
0651デフォルトの名無しさん
2008/07/13(日) 17:24:10また、やむを得ず例外発生する関数を使ってしまった場合、
具体的にどのような対策を採れば良いのでしょうか?
0652デフォルトの名無しさん
2008/07/13(日) 17:24:15じゃあアロケート後の状況を管理するための情報を保持する
メモリーのことは何というのか?
0653デフォルトの名無しさん
2008/07/13(日) 17:25:41*(p-1)とか*(p-2)あたりに管理情報置いてるallocatorもある
0654デフォルトの名無しさん
2008/07/13(日) 17:26:07とりあえず、その「例」を挙げてくれよ。
あ、特定サイズに限定してのpoolでの利用時、ってのはナシな。
それじゃサイズ情報が固定になっちゃうから。
0655デフォルトの名無しさん
2008/07/13(日) 17:26:48自分もそう思って参照を使ってるけど、
最近ではポインタの方がいいかなと思い始めてる。
利用時に見た目で区別できた方が保守性が上がりそうだから。
ポインタとヌルポの扱いが悩ましくなるけど、皆どうしてる?
自分は、ヌルポは指定不可とドキュメントに書いてアサートしてる。
(privateメンバ関数はもちろん、publicメンバ関数でも)
NULLの場合にはFALSEを返したり例外を投げる方がよいという意見もあるだろうけど、
ドキュメントとアサートで十分な気がしている。
0656デフォルトの名無しさん
2008/07/13(日) 17:27:15&x[0][0] と &x[0][1] の差を出してみ。
それでなんとなくわかるべ
0657デフォルトの名無しさん
2008/07/13(日) 17:27:48だから『*(p-1)とか*(p-2)あたりに管理情報』は管理領域じゃないのか?
0658デフォルトの名無しさん
2008/07/13(日) 17:28:00バカかお前は。
それは「管理領域として消費しているメモリ」そのものだろ。
0659デフォルトの名無しさん
2008/07/13(日) 17:29:33例外を投げない宣言をするといい
~Hoge() throw() { fuga(); }
それでも投げられてしまったら
void unexpected() が呼ばれるが
std::set_unexpected(unexpected_hander);
とかで自前のものに変更可能
0660デフォルトの名無しさん
2008/07/13(日) 17:29:43デバック版とリリース版で変わる?
0661デフォルトの名無しさん
2008/07/13(日) 17:29:52ワロタw
管理領域って何だと思ってたんだよw
0662デフォルトの名無しさん
2008/07/13(日) 17:33:05デストラクタでtry〜catchして食べちゃえばいい。
理由は↓
http://cppemb.blog17.fc2.com/blog-entry-31.html
0663デフォルトの名無しさん
2008/07/13(日) 17:33:43真実に気づき始めてるみたいだから後押しするが、参照で渡したい
ものはパラメータへの積み込みにコストがかかり(つまりでかい)
中で書き換えが発生しない場合に限った方が良い。
NULLポインタ禁止はドキュメントで十分だが、その辺は
好きにしていいと思う。
0664デフォルトの名無しさん
2008/07/13(日) 17:34:58ちなみにコンストラクタから例外を投げていいかどうかは賛否両論あるね。
賛成派が多い感じがするけど。
0665デフォルトの名無しさん
2008/07/13(日) 17:35:07> 利用時に見た目で区別できた方が保守性が上がりそうだから。
こんなこと書いている段階で駄目だろ。
0667デフォルトの名無しさん
2008/07/13(日) 17:39:56何言ってるんだ。
その(見て分かる)ために書き換え可能性のある場合はポインタで渡すんだよ。
0669デフォルトの名無しさん
2008/07/13(日) 17:42:00>参照の方がコストがかかるって本当?
値渡しに比べて、だね。
コストはポイントと同じ。
0670デフォルトの名無しさん
2008/07/13(日) 17:43:38というわけですね、わかります。
0671デフォルトの名無しさん
2008/07/13(日) 17:43:49なってるんだよ。クソッタレな馬鹿は見た目で区別したできた方が保守性が上がりそうとか言い出す。
だから呼び出しコストに鈍感なクズプログラムを量産して迷惑掛ける。
0672デフォルトの名無しさん
2008/07/13(日) 17:47:090673655
2008/07/13(日) 17:47:59そうそう。思うに、
「NULLチェックしなくて済むから参照にする」
→「その関数作った自分は書き換えられること知ってるから問題ない」
→「他の奴はドキュメントよく読め」
ってなりそう。それは自己中だよね。
>>669
だよね。
0674デフォルトの名無しさん
2008/07/13(日) 17:49:070675デフォルトの名無しさん
2008/07/13(日) 17:53:462行目と3行目のつながりが分からない。
今はポインタ渡しと参照渡しの話をしていて、コストは同じ。
0676デフォルトの名無しさん
2008/07/13(日) 17:54:420677デフォルトの名無しさん
2008/07/13(日) 17:54:42だからさー「NULLチェックしなくて済むから参照にする」
ってのをやめようとしてるのに何罵倒してるんだ?
NULLが渡された時どういう挙動にするかはコードの
用途次第だろ?
パフォーマンス優先でNULLチェックもしたくない場合は
動作未定義とドキュメントに書いておいて、使う人間に
NULL呼び出ししないことを保証してもらうのがベストだし。
0678デフォルトの名無しさん
2008/07/13(日) 18:00:40見て分からないメンバ関数は書き換え禁止?
a.countUp();は
countUp(&a);にすべき?
0679デフォルトの名無しさん
2008/07/13(日) 18:02:580680デフォルトの名無しさん
2008/07/13(日) 18:03:59関数呼び出しをするのは調べない方が悪い、みたいな態度で相手を
馬鹿にしている書き込みがあったけど、そういう奴こそ、基礎に戻
ってモジュール結合度とか、カプセル化の意味とか考え直して欲し
いものだと思った。
0681デフォルトの名無しさん
2008/07/13(日) 18:04:21書き換える可能性だけで言うなら、ポインタだろうと参照だろうと
仮引数にconstをつけて書き換えないことを明示する
(=constが無ければ関数内で書き換える可能性がある)のが普通だと思うんだけど。
0682673
2008/07/13(日) 18:04:32書き方が悪かったかな。
4行目以降は全く同意です。
0683デフォルトの名無しさん
2008/07/13(日) 18:09:12>仮引数にconstをつけて書き換えないことを明示する
いやいやいや、ここでの明示の価値は、宣言部分じゃなくて
使用してるところで明確にすることにあるんですよ。
宣言部分で万事OKなら、>>678>>679とはならないよよよ
0684デフォルトの名無しさん
2008/07/13(日) 18:09:28そういう設計にすべきなのに、事あるごとにドキュメントに頼ろうとする奴はアセンブリにでも埋まってろ。
0685デフォルトの名無しさん
2008/07/13(日) 18:09:29説明も読まずに関数やクラスを使っちゃうような人に基礎の話をされてもねw
0686デフォルトの名無しさん
2008/07/13(日) 18:10:440687673
2008/07/13(日) 18:13:43それはこの話とは別と思ってます。
>>681
それは同意ですが、
書き換え不可の場合はconst参照が一般的なので、
書き換え可能な場合はポインタにすると書き換え不可と区別がつけられるという話をしています。
0688デフォルトの名無しさん
2008/07/13(日) 18:16:26関係があると思うからそういう例を出してるのに、単に「別」と言われても。
別だと思うならどこが違うのか理由を言えと。
0689デフォルトの名無しさん
2008/07/13(日) 18:17:23防衛的なプログラムを書くもの。
0690673
2008/07/13(日) 18:18:40>>書き換え可能な場合はポインタにすると書き換え不可と区別がつけられるという話をしています。
→「呼び出し方を見るだけで」ということです。
0691デフォルトの名無しさん
2008/07/13(日) 18:20:58>「それとこれとは別」って何の意味も無い言葉だな。
な、何も汲み取れないのか…?
0692デフォルトの名無しさん
2008/07/13(日) 18:21:29それで、「呼び出し方を見るだけで」区別が付けられない>>678のような例は?
別の話なの?
0693673
2008/07/13(日) 18:23:33「書き換わることが見た目で分かるかどうか」という観点では関係ありますが、
今している「引数を参照VSポインタ」の議論とはメリット/デメリットが変わってくるので別の話と思います。
0694デフォルトの名無しさん
2008/07/13(日) 18:23:56自分が勝手に前提としているものが、人にも通用するとは思わない方がいいよ。
自分とは違う視点もあることを知った方がいいよ。
0695デフォルトの名無しさん
2008/07/13(日) 18:25:26それはあまりにもひどいローカルルールじゃないか。
他人が見たときに「一貫性の無い野郎だな」でスルーされるかもよ?
利用側で書き換え禁止を明示したいだけなら
int x = 0;
somefunc(static_cast<int const &>(x));
と書くとか、コメント書くほうが健全だと思うんだけど。
0696デフォルトの名無しさん
2008/07/13(日) 18:26:44× 自分以外は
○ 自分も含めて
# 一週間以上前の自分は他人だと定義する方法もあるが。
0697デフォルトの名無しさん
2008/07/13(日) 18:27:10普段よほど自分の言うことが他人に理解されない生活送ってるんだねかわいそうにw
>>693
そのように知恵のある人間なら解釈すべきだと思う。
ちゃんとニュアンス伝わってる人間も居るので心配しなくていい。
ここは明らかに汲み取れない方が鈍感。
0698デフォルトの名無しさん
2008/07/13(日) 18:27:430699デフォルトの名無しさん
2008/07/13(日) 18:27:46共同開発をするなら、視覚的に分かりやすく、ソースを見ただけでわかってもらえるように
関数にもconstつけるんだろ
0700デフォルトの名無しさん
2008/07/13(日) 18:30:12>それはあまりにもひどいローカルルールじゃないか。
んなこたーない
>他人が見たときに「一貫性の無い野郎だな」でスルーされるかもよ?
書き換えるときのみポインタで渡すことで一貫させようという話だろ
0701デフォルトの名無しさん
2008/07/13(日) 18:30:43「ニュアンス」なんて自分勝手で曖昧なものを、いつでも汲み取ってもらえるなどと思うなってことだ。
そもそものところ、一度に一つの議論しかできないのかと。
0702デフォルトの名無しさん
2008/07/13(日) 18:30:580703デフォルトの名無しさん
2008/07/13(日) 18:32:30>>696
未来の自分は他人
0704デフォルトの名無しさん
2008/07/13(日) 18:32:35>別に自分ひとりで開発するならconstなんていらない
そんなばかな
>ソースを見ただけでわかってもらえるように関数にもconstつけるんだろ
それは当たり前
0705デフォルトの名無しさん
2008/07/13(日) 18:36:37ちがうね
自分が汲み取ってもらうことを期待してるんじゃなくて、誰かの言うことを
汲み取れるようになれって言ってんの。
>そもそものところ、一度に一つの議論しかできないのかと。
メンバ関数呼び出しの話か? 君こそ他人が複数の話題に
ついてこれることを期待しちゃってるんじゃないの?
0706デフォルトの名無しさん
2008/07/13(日) 18:38:32文章だけできちんと伝えられるようにしろ
0707デフォルトの名無しさん
2008/07/13(日) 18:39:37func1(const T &arg)
func2(T *arg)
と書いといたら、呼び出し側は必然的に
func1(arg)
func2(&arg)
としなきゃいけなくなるから、「そのルールを知ってれば」ソース上で書き換え禁止かどうか判断できるという話ではないの?
そう解釈しているんだが。
私もそうしてる。
Cから入ったせいか、見た目が値渡しなのに中身が変わるのは気持ち悪いんだよね。
ルールを知らない人向けに(まぁ、自分以外は知らないだろうけど)関数ヘッダにも別途書き換えする場合はその旨記述しておくが。
0708デフォルトの名無しさん
2008/07/13(日) 18:39:47嫌われる理由は、暗黙の型変換に起因するトラブルやわかりにくさのため。
std::string が operator char* ではなく、c_str() を用意しているのもその
せい。暗黙の型変換による影響範囲を特定できて、可読性の向上にも寄与
するなら使ってもいいと思う。そういうケースを思い付かないなら使わない。
0709デフォルトの名無しさん
2008/07/13(日) 18:39:57以下の最後のケースだけを重視して、あとはどうでも良いと?
それは一貫性が無いんじゃない?
//(1)
char buf[100];
f1(buf); // bufに変化があるか、見た目で分からない
//(2)
A insA;
int n = insA.countUp(); // insAに変化があるか、見た目で分からない
//(3)
int b = 0;
f2(b); // bに変化があるか、見た目で分からない
//(4)
int c = 0;
f3(&c); // cに変化があるかもしれない、見た目で分かる
0710デフォルトの名無しさん
2008/07/13(日) 18:40:23○勝手に振った話題についてきてくれると期待
で、ついてきてくれなかったら切れるわけだ。無視されたーってw
0711デフォルトの名無しさん
2008/07/13(日) 18:42:24だったら>>678の質問もおかしくないんじゃないの?
この書き方だと、値が変わるか変わらないかは関数の中身を見ないとわからない。
いちいち見に行くのが嫌だから、呼び出しの時点でわかるようにしようって話なんだろ。
逆にこの書き方はOKだとするなら、何故参照渡しがいけないの?
ポインタを渡していないけれど値が書き換わる、という点で同じじゃないか。
0712デフォルトの名無しさん
2008/07/13(日) 18:43:41「const参照とは違う渡し方をしてるから、これは書き換えられる可能性があるってことね」ってことなの?
読み手がその勝手規約を知っているか勘の良い人だっていうことを前提としてるように見えるんだけど、
もっとズバッと分かりやすいやり方は無いの?
0713673
2008/07/13(日) 18:44:56>>「そのルールを知ってれば」ソース上で書き換え禁止かどうか判断できるという話ではないの?
そうです。
↓Googleもそのルールを使ってます。それ以外でも聞くのでそんなにローカルなルールではないと思います。
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Reference_Arguments
0714デフォルトの名無しさん
2008/07/13(日) 18:46:32Googleのルールって馬鹿よけの奴だよね。
日本語の書いとく
http://www.henshi.net/k/hiki.cgi?GoogleCppStyleGuide
0715デフォルトの名無しさん
2008/07/13(日) 18:46:53全部分からないより//(4)に関して分かってる方がより建設的じゃね?
それから//(3)に関して変化しないことを見た目でわかるようにしよう
というルールだし。
//(1)//(2)はお前の嫌いな別の話。これらがあるとしても//(3)//(4)に
関して十分有効なルール。
0716デフォルトの名無しさん
2008/07/13(日) 18:49:24(1)も別の話ですか、
十分有効なルールとか本気で言ってるの?w
0717デフォルトの名無しさん
2008/07/13(日) 18:52:16>逆にこの書き方はOKだとするなら、何故参照渡しがいけないの?
他に、値渡しと区別がつかないから、というのもある。
区別がつかないなら、値渡しと見た目が同じ参照渡しでは、
呼び出し側の変更が無いものというルールにすることは、
そんなに反感招くほど悪いものではないだろ。
0718デフォルトの名無しさん
2008/07/13(日) 18:52:55残念ながら別の話だし、有効だろうね。
なんか知ってるか知らないかという話の気がしてきた。
0719デフォルトの名無しさん
2008/07/13(日) 18:53:23「参照渡しをすべきではない」と思う理由を明確にしろ。後付けのわがままは許さない。
0720デフォルトの名無しさん
2008/07/13(日) 18:57:07だな。
>>717
は妥当だとは思わないか?
0721デフォルトの名無しさん
2008/07/13(日) 18:58:33防衛的なプログラムを書くもの。
0722デフォルトの名無しさん
2008/07/13(日) 19:01:22( >>714の日本語版では全部訳されてない。)
0723デフォルトの名無しさん
2008/07/13(日) 19:02:27こんなの個人的な嗜好の問題なのに、反対する人間をも納得させようとして、
変に話を大きくしてるから突っ込まれるんだよ。
0724デフォルトの名無しさん
2008/07/13(日) 19:02:43char const * fuga;
の違いを教えてください
0725デフォルトの名無しさん
2008/07/13(日) 19:03:27普通に値渡しで、指す先が変更されることもあるんだけど、
ポインタ値自体が分からなければOKってことなのかな?
0726デフォルトの名無しさん
2008/07/13(日) 19:03:50C++の規格に沿って話せよ
0727デフォルトの名無しさん
2008/07/13(日) 19:04:43同じ。
0728デフォルトの名無しさん
2008/07/13(日) 19:05:49どっち派なんだ? 仮に値変更可能な参照渡し容認派なら、
>防衛的なプログラムを書くもの。
それは「値を変更する参照渡しをすべきではない」という主張と
別に相容れないものではないじゃないか。
むしろconstじゃない参照パラメータを書かないのだからより
安全だろう…あ、つまり反対派なんだw
0729デフォルトの名無しさん
2008/07/13(日) 19:06:410730デフォルトの名無しさん
2008/07/13(日) 19:06:560731デフォルトの名無しさん
2008/07/13(日) 19:09:49未来の自分は他人ってスレの中で定義されてるんだから
可読性を考慮しないで、1日でくみ上げちまえば「自分」だけになるんじゃね
0732デフォルトの名無しさん
2008/07/13(日) 19:10:05>妥当だと思わない人間がいるから議論になってるんじゃねーの。
では>>717のどこがおかしいのか言ってくれたまえ。
個人的な嗜好は不可ね。それ言ったら何でもありになっちゃうから。
その「嗜好」になった理由があるだろ?
0733デフォルトの名無しさん
2008/07/13(日) 19:10:23char * const fuga;
の違いを教えてください
0734デフォルトの名無しさん
2008/07/13(日) 19:13:40hoge = NULL; //コンパイル可能
*hoge = '\0'; //コンパイル不可
fuga = NULL'; //コンパイル不可
*fuga = '\0'; //コンパイル可能
0735デフォルトの名無しさん
2008/07/13(日) 19:16:48さほど奇妙な話ではないかと。
ポインタ値自体は値渡しだから変更はない。
ポインタの先は「ポインタ渡し」だから変更される。
0736デフォルトの名無しさん
2008/07/13(日) 19:23:28値渡しでは通常値は変わらない。
C++で参照渡しをすると、値渡しのように見えるが値が変わってしまうから分かりにくい。
だから参照渡しの場合は値を変えないようにしよう(値を変える場合はポインタ渡しにしよう)っていうルール。
Googleの説明もそんな感じ。
どうも反対派でグッとくる意見がないね。
0737デフォルトの名無しさん
2008/07/13(日) 19:30:34結局は「見える」ってところが重要なんだよな?
char* str = malloc(100);
strcpy(str, "aaa");
は&strになってないけど、どうなの?
というような質問には別の話とか言って答えないだろ?
struct iterator{
int* p;
};
みたいなのも値渡しで、結果的にpの先が書き換わったりすることもあるし。
std::のアルゴリズムとか。
それらについてはどうなの?
0738デフォルトの名無しさん
2008/07/13(日) 19:32:29ポインタ渡しだから変化があるかどうかは分からない。
それはこのルールの対象外。
このルールは「参照渡しの場合はconstであること」。
ポインタの場合は、「変わる可能性がある」ことに気づきやすい。
参照の場合は値渡しと同じに見えるから気づきにくい。
これで分かりますか?
0739デフォルトの名無しさん
2008/07/13(日) 19:35:31分かります?
0740デフォルトの名無しさん
2008/07/13(日) 19:38:080741デフォルトの名無しさん
2008/07/13(日) 19:39:55ドライバーがアクセル全開にするかもしれないから
制限速度の法規には意味がありませんか?
0742デフォルトの名無しさん
2008/07/13(日) 19:42:18「その」の意味分かります?
誰も「ルールは意味無い」なんて言っていませんが。
0743デフォルトの名無しさん
2008/07/13(日) 19:42:48馬鹿丸出しw
0744デフォルトの名無しさん
2008/07/13(日) 19:43:57ここですごい第三の意見が出てきたなw
0745デフォルトの名無しさん
2008/07/13(日) 19:52:43「わかります?」じゃなくて、わかって欲しい内容そのものを書いたほうがいいよ。
本当は何も頭の中にありはしないのに、知見を隠し持ってるフリしてるようにしか見えないから。
0746デフォルトの名無しさん
2008/07/13(日) 19:52:59こんな感じで呼び出し側でconstで渡すというのはどうだろう。
template<class T>
const T& const_ref(T& v) {
return v;
}
//hoge(fuga& r);
hoge(const_ref(arg)); //エラー
0747デフォルトの名無しさん
2008/07/13(日) 19:54:38意味はあります。
他のケースよりも問題になりやすいからできたルールです。
全て対応する必要はないし、対応できないケースはあるでしょう。
0748デフォルトの名無しさん
2008/07/13(日) 19:56:26では、>>739を踏まえて>>737に答えて下さい。
>>738は答えになっていないので。
0749デフォルトの名無しさん
2008/07/13(日) 20:00:04毎回付けるにはその名前は長い気がするので、単項のoperator+でどうだろう
hoge(+arg);
0750デフォルトの名無しさん
2008/07/13(日) 20:00:52> Cから入ったせいか、見た目が値渡しなのに中身が変わるのは気持ち悪いんだよね。
お前はC++に向いていない。
C++の流儀に従えないのなら一生Cやってろ。
0751デフォルトの名無しさん
2008/07/13(日) 20:00:54それで、対応出来るケースは非常に小さい範囲というのがこちらの主張で、
そのルールによってstd::swapなどを否定するほどのメリットが有るとは、
思えません。
0752デフォルトの名無しさん
2008/07/13(日) 20:01:58それはもう考えたんだけど、
値渡しを含む全ての引数にやらないとポインタ渡し派規約と同じ保証が出来ないよ。
0753デフォルトの名無しさん
2008/07/13(日) 20:02:05了解
0754デフォルトの名無しさん
2008/07/13(日) 20:02:37これだと、std::sortも否定されますね。
まぁ、std::vector<T>::iteratorなどがポインタだった時期もありましたが。
0755デフォルトの名無しさん
2008/07/13(日) 20:05:43呼び出し側から、呼び出した結果引数の内容が気づかないうちに変更されている
危険がなくて安心、とかいう説明をきいた記憶があるのですが、C++は呼び出し
側から値渡しか参照渡しかわからない書き方ができるので、これは退化じゃない
かと思うのですが、違うんでしょうか?
0756デフォルトの名無しさん
2008/07/13(日) 20:07:01C++とはそういうものと考えて使えば良いだけの話。
いい加減荒らすな。
0757デフォルトの名無しさん
2008/07/13(日) 20:07:560758747
2008/07/13(日) 20:08:21了解です。私も元々このルールを使っていなかったので、押し付けるつもりはありません。
(そう読めたらごめんなさい)。
誤解があるかもと思って説明しましたが、そうではなかったようで、
あとは各人の経験や嗜好に基づく部分と思いますのでここらで失礼します。
0759デフォルトの名無しさん
2008/07/13(日) 20:08:200760デフォルトの名無しさん
2008/07/13(日) 20:08:38char* str = malloc(100);
strcpy(str); //全然明示的でない件について
0761デフォルトの名無しさん
2008/07/13(日) 20:09:400762デフォルトの名無しさん
2008/07/13(日) 20:13:22大抵WriteParameter(param);とか名前で分かるし、
IDEの機能で引数の型が表示されたりするしなぁ。
あんまり気にしたことが無かったというのが正直なところ。
ただ、ポインタ渡し派の規約には
たとえ紙に印刷されていても規約を知っていれば読めるとか
引数ごとに細かく明示できるという利点を感じた。
0763デフォルトの名無しさん
2008/07/13(日) 20:13:46二度と来るなよ。
0764デフォルトの名無しさん
2008/07/13(日) 20:15:50結局、向こう側に「何をされるのか」は、向こう側のことがわからないと
どうにもならないからなぁ。
0765デフォルトの名無しさん
2008/07/13(日) 20:15:57その関数はポインタを受け取るから変更の可能性アリ。
なんか&の表記があることと混同してる奴がいないか?
0766デフォルトの名無しさん
2008/07/13(日) 20:16:51> char* str = malloc(100);
> strcpy(str); //全然明示的でない件について
このレベルで回答してたのか。
馬鹿すぎる・・・
0767デフォルトの名無しさん
2008/07/13(日) 20:18:40同意。関数名と変数名こそ大事だよな。
>>765 >>766
>>690などの「呼び出し方を見るだけで」の話かと思ったので。
0768デフォルトの名無しさん
2008/07/13(日) 20:19:22つまり、ポインタを渡す場合には、変更の可能性があるかもしれないことを
受け入れるわけだよね、それって。
0769デフォルトの名無しさん
2008/07/13(日) 20:20:12変数の型が大事な君らにはシステムハンガリアンをお勧めする
0770デフォルトの名無しさん
2008/07/13(日) 20:24:11>>755では「関数呼び出しのとき」値渡しが原則で参照の時は「明示的に」やるので
とあるけど、strcpy(str)のどの辺が明示的か説明して貰えるかな?
0771デフォルトの名無しさん
2008/07/13(日) 20:25:170772デフォルトの名無しさん
2008/07/13(日) 20:25:360773デフォルトの名無しさん
2008/07/13(日) 20:26:10そのレベルがどのレベルなのかはっきりしないけど、
元の話題がそもそもそういう話だからね。
「どっちみち、呼び出し先で引数に何をされるか予想できない関数呼び出しに満ちているんだよ」
ってことだな。
0774デフォルトの名無しさん
2008/07/13(日) 20:27:190775デフォルトの名無しさん
2008/07/13(日) 20:27:45全部付ければ良い。
変えて良いときだけref付けたりポインタ渡しを強制するのも、
変えちゃダメな時にconst_ref付けるのも、本質的には同じ対処。
どちらを優先するかな違いだけ。
0776デフォルトの名無しさん
2008/07/13(日) 20:30:010777デフォルトの名無しさん
2008/07/13(日) 20:31:14なんかC++の機能制限に繋がるのか?
0778デフォルトの名無しさん
2008/07/13(日) 20:32:17>「どっちみち、呼び出し先で引数に何をされるか予想できない関数呼び出しに満ちているんだよ」
だから参照渡しは書き換えないようにしようって発想なんだろ。
何が気に入らないんだ?
0779デフォルトの名無しさん
2008/07/13(日) 20:33:030780デフォルトの名無しさん
2008/07/13(日) 20:34:13どういう状況でどのスタンスの人間に訊いてるのか、よくわからないが・・・。
とりあえずSTLのswap関数はそうなってるよな。
ていうか、swapなんだから、ああ、値が入れ替わるんだな、ってのは容易に想像できるし。
(むしろ、swap関数なのに引数が変化してなかったら、そっちのほうが驚きでは)
0781デフォルトの名無しさん
2008/07/13(日) 20:34:380782デフォルトの名無しさん
2008/07/13(日) 20:36:32いかにも覚えたての人間が嬉しくてやる例だよね。有用でないと
までは言わないが。
演算子オーバーロードのために導入された参照が、たまたま
Cの時にマクロで作られていたswapとかに流用されただけだし。
0783デフォルトの名無しさん
2008/07/13(日) 20:36:40> ていうか、swapなんだから、ああ、値が入れ替わるんだな、ってのは容易に想像できるし。
俺なんか名前から容易に想像できる関数たちに散々裏切られてきたぜ。
同僚が作ったのとかMSが作ったのとか。
だから俺も裏切ってやることにした。
0784デフォルトの名無しさん
2008/07/13(日) 20:37:17なにがどう「だから」なのかわからんのだけど。
ポインタはいいの? 書き換えられない保証付きの手段が無くても。
0785デフォルトの名無しさん
2008/07/13(日) 20:38:35くだらん宗教論争やってんなーと思って静観してたけど
>>783
> だから俺も裏切ってやることにした。
お前の最後の一行になんか和んでしまったw
0786デフォルトの名無しさん
2008/07/13(日) 20:39:54void copy1( vector<int> &dst, const vector<int> &src );
void copy2( vector<int> *dst, const vector<int> &src );
vector<int> foo;
vector<int> bar;
copy1( foo, bar );
copy2( &foo, bar );
こういう場合ってどっちの方がいいのかな?たまに悩むんだけど
strcpyみたいなのにあわせればcopy1だけど、
copy2の方がわかりやすいのかなとも思うし。
0787デフォルトの名無しさん
2008/07/13(日) 20:40:14書き換えたいからポインタで渡すんだろ、って話では。
0788デフォルトの名無しさん
2008/07/13(日) 20:40:55C++0xの右辺値参照とか入ってきたら発狂しそうだよな
0789デフォルトの名無しさん
2008/07/13(日) 20:41:44strcpyにあわせるとcopy2だろ。
0790デフォルトの名無しさん
2008/07/13(日) 20:42:52「参照を書き換えるな派」は黙って受け入れるということでいいのかな。
char* p = new char[sz];
// pの指すchar配列の範囲に色々詰め込む
hoge(p); // 文字列書き換えられたくないなぁ・・・でもいいや!
// ポインタ渡しならボクはその可能性にも耐えられる!何故かポインタだけは!
0791デフォルトの名無しさん
2008/07/13(日) 20:46:53参照書き換え不可派じゃないが、
const char* p = new char[sz];
か
hoge((const char*)p);
でOK
0792デフォルトの名無しさん
2008/07/13(日) 20:48:140793デフォルトの名無しさん
2008/07/13(日) 20:48:530794デフォルトの名無しさん
2008/07/13(日) 20:50:43>>746 >>749でも出てる方法だね。
確かに1文字でconst化出来れば結構嬉しいかな。
0795デフォルトの名無しさん
2008/07/13(日) 20:52:220796デフォルトの名無しさん
2008/07/13(日) 20:54:040797デフォルトの名無しさん
2008/07/13(日) 20:55:120798デフォルトの名無しさん
2008/07/13(日) 20:56:33そう。746,749と同じ考え。
書き換えて欲しくないとき、そう明示する手段があるのだから使えば良い。
書き換え無い保証が欲しいが、引数型の確認もしたくないとか言うのなら、
constで渡すくらいの手間は我慢するしかないと思うのよ。
0799デフォルトの名無しさん
2008/07/13(日) 20:59:44vector<int> bar;
copy1(foo, static_cast<const vector<int>&>(bar));
ちなみにjava
List<Integer> foo;
copy1(foo, Collections.unmodifiableList(bar));
どちらも、実は使ったことがある。
0800デフォルトの名無しさん
2008/07/13(日) 21:03:45ttp://cppemb.blog17.fc2.com/blog-entry-30.html
……マジ?(排他に関するvolatile記述)
0801デフォルトの名無しさん
2008/07/13(日) 21:09:02C++は駄目言語なんだよ。
ずうたいばかり大きくなった恐竜みたいなもの。
早く滅びてC#やJavaに道を譲った方がいい。
0802デフォルトの名無しさん
2008/07/13(日) 21:11:540803デフォルトの名無しさん
2008/07/13(日) 21:12:13C#やJavaでの宗教戦争に参加したことが無いようで。
いや、参加しない方がいいんだけどね・・・w
0804デフォルトの名無しさん
2008/07/13(日) 21:12:510805デフォルトの名無しさん
2008/07/13(日) 21:13:26言語の良し悪しとは関係ないんだから別に良いんじゃない?
Javaは臭い金の臭いしかしないから好きになれん。
C♯はMonoプロジェクトの頑張りでもっともっと普及すると思う。
0806デフォルトの名無しさん
2008/07/13(日) 21:14:180807デフォルトの名無しさん
2008/07/13(日) 21:14:33TAB派かスペース派か
俺は断然スペース派
0808デフォルトの名無しさん
2008/07/13(日) 21:15:510809デフォルトの名無しさん
2008/07/13(日) 21:16:510810デフォルトの名無しさん
2008/07/13(日) 21:17:26ワールドワイドで考えると、名前の読みにくさと、持ってる宗教の怪しさでは
Rubyの人が一番だろうけどね。
0811デフォルトの名無しさん
2008/07/13(日) 21:17:300812デフォルトの名無しさん
2008/07/13(日) 21:18:12rubyの人の宗教ってなに?
0813デフォルトの名無しさん
2008/07/13(日) 21:18:120814デフォルトの名無しさん
2008/07/13(日) 21:18:43Wikipediaにしては珍しく記事名で議論が出てないな。
火つけたらきっとよく燃えるぞw
0815デフォルトの名無しさん
2008/07/13(日) 21:20:50皆結構好き勝手に読んでる、C++スレでは「びよよん」って呼ばれてた
0816デフォルトの名無しさん
2008/07/13(日) 21:22:50それはガチ宗教w
>>812
http://pc11.2ch.net/test/read.cgi/prog/1148712641/
0817デフォルトの名無しさん
2008/07/13(日) 21:25:46>俺は断然スペース派
このスレじゃなかったら、銃を向け合うところだったな
なんてなw 俺はT(ry
0818デフォルトの名無しさん
2008/07/13(日) 21:29:09自分のコードさえ汚されなきゃキレない・・・と、思う
あー、やっぱ見にくいのを読まされるのはヤダな
0819デフォルトの名無しさん
2008/07/13(日) 21:35:164TABと8TABで切り替えると、どこかが綺麗になってどこかが崩れるw
0820デフォルトの名無しさん
2008/07/13(日) 21:44:39ユーザー定義のルールで整形しなおして表示しちゃえばいいと思う。
どうせC系は改行やスペースにほぼ意味無いんだし
0821デフォルトの名無しさん
2008/07/13(日) 21:47:12それだと
0822デフォルトの名無しさん
2008/07/13(日) 21:51:31インデントの話は、するにしても雑談の範囲で頼むよ。
分かってるとは思うけど、一応ね。
0823デフォルトの名無しさん
2008/07/13(日) 23:00:16凄い地味だけどこれは素晴らしい発見だと思う。
0824デフォルトの名無しさん
2008/07/13(日) 23:01:45俺
0825デフォルトの名無しさん
2008/07/13(日) 23:56:22俺も。
つーか普通にやってりゃかなりの確率で発見するような気がせんでもない。
0826デフォルトの名無しさん
2008/07/14(月) 00:00:020827デフォルトの名無しさん
2008/07/14(月) 00:04:090828デフォルトの名無しさん
2008/07/14(月) 00:05:58確かに何かしらの工夫はするだろうね。
まだソースを見やすくする工夫が存在していない状態と仮定して、
俺ならどうするだろう。
多分コメントで
// A処理開始
print ('A');
//A_B処理開始
print ('A_B');
//A_B処理終了
// A処理終了
ぐらいしか思いつかんだろうな。
あとはエディタで色分けぐらい?
0829デフォルトの名無しさん
2008/07/14(月) 00:07:240830デフォルトの名無しさん
2008/07/14(月) 00:17:08何時代から来たんだ?
0831デフォルトの名無しさん
2008/07/14(月) 00:42:28FORTH
PYTHON
0832デフォルトの名無しさん
2008/07/14(月) 00:49:480833デフォルトの名無しさん
2008/07/14(月) 00:52:50俺はよく分からんが・・・
FORTRANは昔読んでたC言語の本に併記されてたから、ある程度読める
0834デフォルトの名無しさん
2008/07/14(月) 01:01:05COBOLはある程度自由だったが。
BASICは入力するたびに勝手に整形されてたしな
0835デフォルトの名無しさん
2008/07/14(月) 01:04:38何かMSの言いなりみたいで癪だ
0836デフォルトの名無しさん
2008/07/14(月) 01:06:48オプションで辞めさせられるだろうが
0837デフォルトの名無しさん
2008/07/14(月) 01:07:120838デフォルトの名無しさん
2008/07/14(月) 01:08:450839デフォルトの名無しさん
2008/07/14(月) 01:09:330840デフォルトの名無しさん
2008/07/14(月) 01:11:190841デフォルトの名無しさん
2008/07/14(月) 01:19:13indentコマンド使わなくてもよくなる時代が来るかね
0842758
2008/07/14(月) 01:27:37>>693の(1)(2)と736の前半がなぜ別問題なのか説明できるようになったので
戻ってきてしまいました。頑張って考えてきました。聞いてください。
なぜ別問題か?それはこの問題の本質が、
「変化があるか見た目で分からない」ではなく、
「参照渡しと値渡しで呼び出し方が同じであるため、
参照渡しと気づかず、知らぬ間に書き換わっている可能性がある」ということです。
参照をconst限定にするのは、この問題を回避するためです。
(気づかなくても、constだから書き換わらない)
ポインタ渡し(1)やメンバ関数(2)については、呼び出し方を見て、
ポインタ渡し/メンバ関数呼び出しであることがわかるため、
この問題がない、あるいは少ないです。
>>693 の例で言うと、(1)(2)(4)については「変化があるか見た目で分からないが、変化がある可能性を認知できる」が、
(3)については「値渡しと思い込んで、変化があると思いもしない可能性がある」ということになると思います。
この違いがあるため、別問題と考えます。
(全部参照渡しを疑うべきっていうのはなしとして話してます)
0843758
2008/07/14(月) 01:28:35上で述べたように、「変化があるか見た目で分からないが、変化がある可能性を認知できる」というのは望ましい状態であり、
その状態は受け入れるスタンスなわけです。
以下はちょっと余談気味ですが、
真の問題を回避するには、「参照禁止」というルールでもいいのですが、
C++ではコピーコンストラクタや代入演算子などでconst参照が使われますし、
値渡しの変わりにconst参照渡しが使われるのは一般的なので、
「参照はconstにする」というルールになっています。
また、なんらかの形で呼び出し側で値渡しと参照渡しが区別できればこのルールは当然不要と思います。
次にswapの存在などにより、参照をconstで統一できないという指摘ですが、
これはもちろん別問題ではなく、「統一感がない」というデメリットになります。
そのため意味がない、という意見も分かります。
実際の現場では、使用するライブラリや既存コードがこのルールに則っているかや、
メンバのスキルやバックグラウンド、嗜好などにより、メリットとデメリットを比較して
導入を決定することになると思います。
最後に、議論を通じて自分の考えがより深まりました。ありがとうございました。
では今度こそ本当にさらばだ。でゅわ!!
0844デフォルトの名無しさん
2008/07/14(月) 01:33:34そっちでやって下さい。
0845デフォルトの名無しさん
2008/07/14(月) 01:37:41要するに君が望むのは、
「C言語における値渡しの書き方ならば絶対に値が書き換わらない状況」なんだろ。
それについては何も文句は無いし、実際に便利だと思う。
でも、それ以外の書き方についてもごちゃごちゃ言い始めたから面倒なことになったんだ。
下手に一般化しようとして話を広げたからいけないんだ。反省しなさい。
0846デフォルトの名無しさん
2008/07/14(月) 01:40:45そもそも気に食わなかったりする?
0847デフォルトの名無しさん
2008/07/14(月) 01:41:530848デフォルトの名無しさん
2008/07/14(月) 01:43:400849デフォルトの名無しさん
2008/07/14(月) 01:50:31(意味の違いは分かってますよ)
0850デフォルトの名無しさん
2008/07/14(月) 01:51:070851デフォルトの名無しさん
2008/07/14(月) 01:51:390852デフォルトの名無しさん
2008/07/14(月) 01:52:300853デフォルトの名無しさん
2008/07/14(月) 01:54:25C++は何でも盛り込み過ぎて破綻してる
0854デフォルトの名無しさん
2008/07/14(月) 01:55:45Javaとかで参照とかが出てきたんじゃないの?
で、それをC++でも使えて何か不満なのかな?
0855デフォルトの名無しさん
2008/07/14(月) 01:56:57順番がおかしい
それにC++の参照とJavaの参照は別物
0856デフォルトの名無しさん
2008/07/14(月) 01:58:190857デフォルトの名無しさん
2008/07/14(月) 02:17:05Cでいうところの下記のような動作を期待して、
fprintf(stderr, "%d%d\n", 1, 2);
C++で下記のようにコーディングしてみました。
std::cerr << 1 << 2 << "\n";
しかしこれでは複数のスレッドから書き込みを行った場合、
タイミングによって1と2が分断されて出力されてしまいます。
これを下記の条件内で解決する方法はあるのでしょうか?
・C++標準の範疇で(環境依存のスレッド同期APIなどを使わずに)
・iostreamの範疇で(std::fprintfなどを使わずに)
・例外で失敗せずに(std::stringstream::str()を使わずに)
それともこういう場合は素直にstd::fprintfなどを使うのが正しい選択なのでしょうか?
0858デフォルトの名無しさん
2008/07/14(月) 03:02:53連結してから書き出しても何らかの理由で割り込まれたりするんじゃねえの。
ある程度、環境依存になるのはしかたないよ。
0859デフォルトの名無しさん
2008/07/14(月) 03:15:120860857
2008/07/14(月) 03:24:13確かにマルチスレッドな時点でC++標準ではないですね・・・。
もう一度考え直してみます。
0861デフォルトの名無しさん
2008/07/14(月) 03:28:530862デフォルトの名無しさん
2008/07/14(月) 03:42:46書き込みが終わるまで待つ必要ある。 ロックする。
0863デフォルトの名無しさん
2008/07/14(月) 03:51:28とか考え始めると泥沼にはまってデッドロックの理論も勉強するはめになる。
0864デフォルトの名無しさん
2008/07/14(月) 04:22:350865デフォルトの名無しさん
2008/07/14(月) 04:50:140866デフォルトの名無しさん
2008/07/14(月) 05:37:55環境依存無しは不可能だけど、多少マシな方法
http://www.google.com/search?q=boost%3A%3Amutex
ちなみにロックを使わない限り、fprintfでも保証は無いから。
0867デフォルトの名無しさん
2008/07/14(月) 05:54:48のほうがよくないか?
画面表示するデータを、キューへいれていき処理する方法。
これだと、ロック待ちが無い。
0868デフォルトの名無しさん
2008/07/14(月) 06:10:10その手のIO待ちを避ける手法は
プログラムの複雑さとトレードオフになるので。
0869デフォルトの名無しさん
2008/07/14(月) 08:25:500870デフォルトの名無しさん
2008/07/14(月) 08:27:370871デフォルトの名無しさん
2008/07/14(月) 08:56:28WaveIn でどう?
0872デフォルトの名無しさん
2008/07/14(月) 09:36:37同等に慣れていて、0から作るなら。
C#>>>>>MFC
0873デフォルトの名無しさん
2008/07/14(月) 09:37:30MFC>>C#
0874デフォルトの名無しさん
2008/07/14(月) 09:54:15また勉強するのは気力的に辛すぎるw
0875デフォルトの名無しさん
2008/07/14(月) 10:20:000876デフォルトの名無しさん
2008/07/14(月) 10:28:000877デフォルトの名無しさん
2008/07/14(月) 10:29:310878デフォルトの名無しさん
2008/07/14(月) 10:41:490879デフォルトの名無しさん
2008/07/14(月) 10:47:20今後のC/C++のGUIって何で書けばいいんだ?
0880デフォルトの名無しさん
2008/07/14(月) 10:53:44コマーシャル見て、「あ、これ買わなきゃ!」とかいうタイプですね、わかります。
0881デフォルトの名無しさん
2008/07/14(月) 12:05:170882デフォルトの名無しさん
2008/07/14(月) 12:29:55全然日本語の情報ページがないんですが
0883デフォルトの名無しさん
2008/07/14(月) 12:37:290884デフォルトの名無しさん
2008/07/14(月) 12:41:37日本語でWaveIn詳しく解説してるページないですか?
0885デフォルトの名無しさん
2008/07/14(月) 12:45:21ttp://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/audiocapture.html
0886デフォルトの名無しさん
2008/07/14(月) 13:05:120887デフォルトの名無しさん
2008/07/14(月) 13:10:260888デフォルトの名無しさん
2008/07/14(月) 15:04:10デフォ型を全部const型にしておいて、>746,749の変形で
単項+で非constな参照を返すようにすればいい。
0889デフォルトの名無しさん
2008/07/14(月) 15:15:00CからC++の関数を呼ぶこと自体はextern "C"を使えばできるっぽいですが、データの受け渡しをどうやるのか…。
例えばファイルを吐き出させてC++の方で改めてそれを読む、というのは考えられますが、できれば変数のまま
やりとりをしたいと思っています。常識的な方法があるのだろうとは思いますが、勉強不足でわからないので、
よろしければ教えてもらえないでしょうか。
0890デフォルトの名無しさん
2008/07/14(月) 15:18:25普通にどちらからもアクセスできる構造体なり配列を使えばいいと思うよ。
勿論、単純な整数型などの変数でも構わないし。
0891デフォルトの名無しさん
2008/07/14(月) 15:26:11別のプログラムだから、ファイル経由したくないならプロセス間通信だね。
プログラムは同時に立ち上がってるんでしょ?
同時に動いていないならファイルに書き出すなりプロセス以外の状態での
データ保持を考えないといけなくなる。
0892デフォルトの名無しさん
2008/07/14(月) 15:32:460893889
2008/07/14(月) 15:57:33>>890
Cの方のプログラムは既存のブラックボックスで、挙動が不明な上に、C++側とは別プロセスになっています。
>>891
キーワードとしてはプロセス間通信が目的に合っていそうです。
状況としては
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31174&forum=7
が近い気がします。
一応プロセスは同時に動かす予定です。(C側でデータ作成が終わった段階でC++のプログラムを呼び出す)
しかしこの辺りの話題は用語からしてよくわからないです…。
普通の言語解説書には載っていない気がします。
入門用に丁度いい本をご存じないでしょうか。
0894889
2008/07/14(月) 15:59:12ググると、windowsAPIを用いた方法が山のようにでてきますが、今の環境はLinuxです。
できれば最初はOS依存性のない原理的な方法が知りたいと思っています。
0895889
2008/07/14(月) 16:02:45TheUnixSuperText下巻の第9部がそれっぽい話題でした。
読んでみますが、他によりよい本があったら教えて頂けると幸いですorz
0896デフォルトの名無しさん
2008/07/14(月) 16:19:01>Cの方のプログラムは既存のブラックボックス
この時点でどうにもならないのでは? C++の方から無理やり
プロセス内メモリを覗くことは不可能じゃないけど、目的とする
データがどこにあるかとか知らないとダメだし。
0897デフォルトの名無しさん
2008/07/14(月) 16:24:27たとえばDLLならそれ専用のアクセス方法があるように
0898デフォルトの名無しさん
2008/07/14(月) 16:38:53それがわかるんならこんな質問してくるかね?
0899デフォルトの名無しさん
2008/07/14(月) 16:40:190900デフォルトの名無しさん
2008/07/14(月) 16:42:39書き込まなきゃいいのに
0901デフォルトの名無しさん
2008/07/14(月) 16:47:380902デフォルトの名無しさん
2008/07/14(月) 16:47:42そのファイルからデータを読み出す関数
(下記のReadData())があります。
long a0, lbytes, len;
void *buf ;
lbytes=4 * 1024;
buf = (void *)malloc(lbytes);
len = ReadData(a0, buf);
ファイルに格納されている値はfloat型だと
分かっているのですが、voidポインタで
しかもバイト数でメモリを確保して読み出す
使用になっているため、bufで示される領域の
データを、どうすれば1024個のfloat型の数値
に戻せばよいのか分かりません。
mallocでいろいろググッたのですが、確保される
領域に読み出されるのが、ひとかたまりの文字列
だったり、mallocの段階できちんとキャストされ
ていたりで、上記のような用例がありません。
上記のように、float型の複数個の数値をバイト数
で指定したメモリ範囲にひとかたまりで読み込んだ
ときに、これを元のfloat型の複数個の数値に直す
(例えばfloat val[1023]; に代入するとか)は
どうすればよろしいのでしょうか?
なんか手がかりを頂けるとうれしいです。
なにとぞよろしこ。
0903デフォルトの名無しさん
2008/07/14(月) 16:54:42float *float_buf;
float_buf=(float*)buf;
0904902
2008/07/14(月) 17:04:02ありがとう!
0905889
2008/07/14(月) 17:05:20おそらくまともなインターフェースは用意されていません。
C側でデータを吐かせたというのも、コードを解析してそれっぽい変数を推測し、
吐き出させるためのコードを無理やり追加してやったという感じです。
ただ、当然ながら、変数の型(structの構造)は明らかになっているので、同様の型を
C++側にも用意してやれば何とかプロセス間でデータを受け渡しできるのではないかと思っています。
しかしここまでわからないことだらけの状況ではファイルを経由するのが現実的かもしれません…。
0906デフォルトの名無しさん
2008/07/14(月) 17:05:36float * buf = malloc(sizeof(* buf) * 1024);
len = ReadData(a0, (void *) buf);
0907デフォルトの名無しさん
2008/07/14(月) 17:08:12既存のロジックではファイルを出力しているの?
それだったらそこはそのまま使えばいいじゃん。
解析できないソースならシンプルがベストだよ。
実験してみてパフォーマンスに問題があるなら
その先を検討すればいいのだし。
0908デフォルトの名無しさん
2008/07/14(月) 17:10:00ブラックボックスって言ってたけど、
もしかしてソースは有るの?
それともマシンコードを直にいじった?
0909デフォルトの名無しさん
2008/07/14(月) 17:11:21後者のノウハウがあったらこんなぐだぐだな質問しないよ。
0910デフォルトの名無しさん
2008/07/14(月) 17:13:12サイン・コサインについて質問なのですが、例えば、
double angle = 0.0, answer = 0.0;
answer = cos( angle );
という計算。angleに50を代入するとanswerの値は0.964966。
しかし、Windowsの電卓でcos( 50 )を計算すると0.642787…となり、値が全く違います。
これはどうやったら正確な計算ができるようになるでしょうか?
0911デフォルトの名無しさん
2008/07/14(月) 17:17:23電卓のRadを選択してから計算してみ。
0912デフォルトの名無しさん
2008/07/14(月) 17:17:42Windowsの電卓での 三角関数の引数の単位は 度 で受ける(デフォルト:ラジオボタン Deg がそれ)
C言語の 三角関数の引数の単位は ラジアン で受ける
つまり単位をあわせろ ということだ
0913デフォルトの名無しさん
2008/07/14(月) 17:18:02関数の仕様をMSDN辺りできちんと読みましょう。
一般的に、角度の単位には度(°)ではなくradianが使われます。
0914デフォルトの名無しさん
2008/07/14(月) 17:23:03なるほどラジアンでしたか…
もっとよく仕様を読んでみます。即レスありがとうございました。
0915デフォルトの名無しさん
2008/07/14(月) 17:27:10「数字aを表示。」という文章が有り、
string にファイル入力し、
int a=256で宣言して、画面出力で
「数字256を表示。」と表示させる方法はありませんか?
ゲーム製作中に主人公の名前等を変数に格納して
別ファイルにキャラの会話等を分割したいのです。
ソース内に台詞を全て直書きするほうが楽でしょうか?
0916デフォルトの名無しさん
2008/07/14(月) 17:34:11テキストファイル内の $hero を主人公の名前 $heroine をヒロインの名前
のように置き換えるのがいいと思う
接頭辞+変数名+接尾辞 とか
0917デフォルトの名無しさん
2008/07/14(月) 17:36:45それはファイル入力時に1文字ずつ読んで、接頭辞から接尾辞までを変数名
とする、みたいな入力をするということでしょうか?
0918デフォルトの名無しさん
2008/07/14(月) 17:38:10テキストファイルで一行読み込んで、特定の文字が出たら
例えば
名前[0]を表示
[0] → [] + 数字 で 数字番目キャラの名前を表す って言うように決めておいて
[0]の部分を名前で置き換えればいいと思う
0919デフォルトの名無しさん
2008/07/14(月) 17:38:520920デフォルトの名無しさん
2008/07/14(月) 17:43:00|"数字%dを表示。" 0
|"名前%sを表示。" 1
とかはどうよ?
"で挟まれた区画は printf フォーマットそのもの
後ろの 0 や 1 を見つけて どの変数にするかを決める
0921デフォルトの名無しさん
2008/07/14(月) 17:58:24const char * hero = "太郎";
sprintf(cmd, "/bin/sed -e 's/\$hero/%s/g' scriptFile", hero);
FILE * fp = popen(cmd, "r");
fgets(buf, sizeof(buf), fp);
pclose(fp);
printf("%s", buf);
0922デフォルトの名無しさん
2008/07/14(月) 18:06:140923デフォルトの名無しさん
2008/07/14(月) 18:13:01冗談だろw
「ゲーム」だと言ってるのに外部プロセスなんぞを
spawnして一体何フレーム待たせる気だ
やるならLuaあたりを埋め込むのがゲームのやりかたでしょう
0924デフォルトの名無しさん
2008/07/14(月) 18:19:09ttp://labs.preferred.jp/azarac/tutorial.php
こういうのが役に立つかもしれない
本来はWebで使うことを目的にした代物だが
0925デフォルトの名無しさん
2008/07/14(月) 18:22:27>921をゲーム中でやると考える方がどうかしている。
んなもん、起動時に一回やればいいことだろうよ。
0926デフォルトの名無しさん
2008/07/14(月) 18:27:10え?質問者の趣旨的には、
実行時の変数の状態に応じてメッセージの内容を生成したいわけだろ?
何言ってんだかさっぱりわからんが、酔ってんじゃねえの?
0927デフォルトの名無しさん
2008/07/14(月) 18:30:43実行時なんて誰も書いていない。
0928デフォルトの名無しさん
2008/07/14(月) 18:32:38名前が確定してないのか、どっちかな。
ゲーム中と書いてあるので、たぶん前者だと思うが。
0929デフォルトの名無しさん
2008/07/14(月) 18:33:46「ゲーム製作中」か
0930デフォルトの名無しさん
2008/07/14(月) 18:37:10要は、
int main(){
string scr;
string name="主人公";
ifstream ifs("script.txt");
ifs>>scr;
}
テキストファイルscript.txtを用意
内容:
nameは死んでしまった・・・
これをprintfで表示した時に
出力:
主人公は死んでしまった・・・
を行いたいんです。nameはユーザーに入力してもらうつもりで、テキストファイルそのもの
を書き換えてしまうのはセーブを行う上で都合が悪いです。
>>928
前者です。
0931デフォルトの名無しさん
2008/07/14(月) 18:46:37#include <iostream>
#include <map>
#include <string>
void puts_var(std::map<std::string,std::string> var_map, std::string var_name){
std::string puts_string=var_name;
if(var_map.find(var_name)!=var_map.end()) puts_string=var_map[var_name];
std::cout << puts_string;
}
void puts_string(std::map<std::string,std::string> var_map, std::string target){
unsigned chk_start, var_start, var_end;
std::string var_name;
for(chk_start=0;(var_start=target.find("$", chk_start))<target.size();){
if((var_end=target.find("$", var_start+1))>=target.size()) break;
std::cout << target.substr(chk_start, var_start-chk_start);
if(var_end==var_start+1){chk_start=var_end+1;std::cout << "$";continue;} // $$ で $ 一文字出力
var_name=target.substr(var_start+1, var_end-var_start-1);
puts_var(var_map, var_name);
chk_start=var_end+1;
}
std::cout << target.substr(chk_start);
}
int main(void){
std::map<std::string, std::string> var_map;
std::string oneline;
var_map["hero"]="太郎";
var_map["heroine"]="花子";
while(getline(std::cin, oneline)){
puts_string(var_map, oneline);
std::cout << std::endl;
}
}
0932デフォルトの名無しさん
2008/07/14(月) 18:49:35終端が曖昧だとろくなことがない。
0933デフォルトの名無しさん
2008/07/14(月) 21:37:19参照は嫌い?
というのは置いといて、istream作って変換しつつ読むほうがそれっぽいと思った。
0935デフォルトの名無しさん
2008/07/14(月) 22:39:35何文字目に"name"があるか探して、(n文字目)
前の部分(1〜n-1)を出力
変数nameの内容を出力
後ろの部分(n+4〜src.size())を出力
これだと最初の1つしか置換されないから、
後ろの部分からまた"name"を探して、
と見つからなくなるまで続ける
と、このレベルの質問なんじゃないかと思った。
0936デフォルトの名無しさん
2008/07/14(月) 23:38:32なんとかなりませんか?
0937デフォルトの名無しさん
2008/07/14(月) 23:44:02ならないので関数化してください
0938デフォルトの名無しさん
2008/07/14(月) 23:55:58template<T t>
int getsize(T t){
return sizeof(t);
}
どんな関数なら良いのでしょうか?
0939デフォルトの名無しさん
2008/07/14(月) 23:56:390940デフォルトの名無しさん
2008/07/15(火) 00:06:12配列相手にうまくいかないというのなら、引数をconst T&にすれば動くと思う。
単にTだと、Tは要素へのポインタ型になるという規則があったはず。
ちなみに、配列を相手にしているなら、boost::sizeというものが既にある。
コンテナに使えばsize()を返すなどといった方向性での汎用化が進んでいる。
0941デフォルトの名無しさん
2008/07/15(火) 00:14:52boost::pool<> p(sizeof(T))
てなものを書きたくて
0942デフォルトの名無しさん
2008/07/15(火) 00:34:200943デフォルトの名無しさん
2008/07/15(火) 00:59:33ハゲ言語実装者が悪い。
0944デフォルトの名無しさん
2008/07/15(火) 01:04:47ちがうやつだったかな?
0945デフォルトの名無しさん
2008/07/15(火) 01:04:490946デフォルトの名無しさん
2008/07/15(火) 03:29:490947デフォルトの名無しさん
2008/07/15(火) 03:36:260948デフォルトの名無しさん
2008/07/15(火) 03:47:15オーバーロードしてない単項+演算子が何かを起こしうる場合があれば教えて下さい
0949デフォルトの名無しさん
2008/07/15(火) 05:09:310950デフォルトの名無しさん
2008/07/15(火) 11:11:24typeofというものが、コンパイル環境によってあったりなかったりするのですが、
なんでVS2008にすら存在しないのでしょう?
「なんでって言われても、実装してないから実装してないんだよ」とかそんな返答を得そうな質問ですが
あまりに不思議なもので
typeof(data)::iterator it = data.begin();
ってかければどれだけ楽かと思うのですが…
0951デフォルトの名無しさん
2008/07/15(火) 11:33:53文字と数字が混在しているファイルから、それぞれを区別して読み取りたいときどうすればよいのでしょうか。
具体的には
L 15
123 456
134 467
145 478
156 489
L 31
23 256
44 267
45 278
56 300
といった感じのデータがたくさんあり、"L"に続く数字がオブジェクトのID番号、
それ以下の行がオブジェクトの要素(具体的にはx,y座標)です。
ここから順次データを読んでいって、オブジェクトを生成しつつデータをセットする
ということをしたいと思っています。
基本的で申し訳ないですが、教えていただけないでしょうかorz
0952デフォルトの名無しさん
2008/07/15(火) 11:36:00C++の規格にはtypeofなんてものは存在しない
一部のコンパイラが独断と偏見で勝手に言語を拡張してるだけ
0953デフォルトの名無しさん
2008/07/15(火) 11:38:24常に文字(列)として読み取り、それが数字であったならその文字(列)は数値に変換する
0954デフォルトの名無しさん
2008/07/15(火) 11:39:52int a;
char b;
fscanf(fp, "%c %d", &b, &a);
0955デフォルトの名無しさん
2008/07/15(火) 12:30:100956デフォルトの名無しさん
2008/07/15(火) 12:32:22あえてそっちを選択したんじゃないの
0957デフォルトの名無しさん
2008/07/15(火) 12:36:52C++0xのdecltypeあたりがきな臭いな。実験的にやってるコンパイラはあるのだろうな。
0958デフォルトの名無しさん
2008/07/15(火) 13:39:09なるほど、VCは規格に厳密と。便利なので浸透してほしかったところですね
>>957
C++0x、いったいいつになったら来るんでしょうね('A`)そしていつ頃浸透するのやら
>>955
C/C++の理念として、何もしなければ一番早いモードになるってのがありますよ
だから共通の祖先をもって(つまり仮想関数を持つ祖先を持つという意味ですよね)しまうと、クラス関数呼び出しが仮想関数テーブル参照になってしまって遅くなるので避けたのでは?
0959デフォルトの名無しさん
2008/07/15(火) 14:43:50decltypeっていう字面からは型を作りそうに見えるけどね
0961デフォルトの名無しさん
2008/07/15(火) 15:12:300962デフォルトの名無しさん
2008/07/15(火) 16:33:01int n1;
decltype(n1) n2;
ってことができるらしいよ
n2は当然intになる
便利だなぁこれ
0963デフォルトの名無しさん
2008/07/15(火) 16:38:520964デフォルトの名無しさん
2008/07/15(火) 16:50:120965デフォルトの名無しさん
2008/07/15(火) 17:01:54BCBは・・・無理じゃねw
0966デフォルトの名無しさん
2008/07/15(火) 17:58:33期待してVS2008でテストしたのに、未対応じゃねーか。・゚・(ノД`)・゚・。
予約語にはなっているようだが・・・(文字色が青にかわった)
0967デフォルトの名無しさん
2008/07/15(火) 17:59:460968デフォルトの名無しさん
2008/07/15(火) 18:00:530969デフォルトの名無しさん
2008/07/15(火) 18:04:350970デフォルトの名無しさん
2008/07/15(火) 19:11:49autoはもともと大昔のCの名残のようなキーワード。
ずるずるとC99/C++03でも残っているから当然青くなるわけだ。
0971デフォルトの名無しさん
2008/07/15(火) 19:17:070972デフォルトの名無しさん
2008/07/15(火) 19:20:200973デフォルトの名無しさん
2008/07/15(火) 20:05:57> ByVal とか ByRef とか VB.NET らしくて良いですね
ずれすぎ。
0974デフォルトの名無しさん
2008/07/16(水) 01:00:23この間は友人がfarを変数名に使おうとしてはまっていた
0975デフォルトの名無しさん
2008/07/16(水) 08:21:070976デフォルトの名無しさん
2008/07/16(水) 09:59:020977デフォルトの名無しさん
2008/07/16(水) 12:28:59_far
で大丈v
0978デフォルトの名無しさん
2008/07/16(水) 12:51:11突っ込まれるの期待してるみたいなので、あえて突っ込まない。
0979デフォルトの名無しさん
2008/07/16(水) 13:32:27MLB延長戦でそれどころじゃないので、あえて突っ込まない。
0980デフォルトの名無しさん
2008/07/16(水) 14:06:240981デフォルトの名無しさん
2008/07/16(水) 15:17:400982デフォルトの名無しさん
2008/07/16(水) 15:32:38p = c;
printf("%d %d", (int)sizeof p, (int)sizeof c);
こうやった場合 c のサイズが4バイトにならないのは何故ですか?
c がc[]の配列の初めのアドレスを指すのなら
と書いていたら何故だか分かりました、本当にありがとうございました
0983デフォルトの名無しさん
2008/07/16(水) 15:42:10ならいちいち書かんでいいわいw
0984デフォルトの名無しさん
2008/07/16(水) 18:17:040985デフォルトの名無しさん
2008/07/16(水) 18:59:34両方使うと理解が深まる、と
0986デフォルトの名無しさん
2008/07/16(水) 19:39:26printf("%d", (int)sizeof c);
さらに混乱すると
0987デフォルトの名無しさん
2008/07/16(水) 20:18:030988デフォルトの名無しさん
2008/07/16(水) 21:11:14ベアプログラミングですね、分かります
0989デフォルトの名無しさん
2008/07/16(水) 21:18:04__ |::|::::|:::l::ハ|_ ヾ ::::::| ヽィ::::j/=、|::::::|::::7: /:::i::::| ____
\ :'´⌒ヽ |::ハ:::V:::| イ⌒゙`\:i リ \|ノ 弋_フノ /:::/: /
|i " )_,,, _ l:ゝ::.\::i〃⌒゙ヽ 〃⌒゙ヾ //::) | 'ハ::::: | コ
た や |i ヽ | ト/人7} 〃〃 〃〃´ ∠イr 'ちノ::::: | ン
え っ |i / ・ i イ:リ::::| '、 |:::::rイ:::::::: | パ
ち た |i t / i:::::ハ r‐--ー、 /ハi!:::::::::::::::: | 通 イ
ゃ ね |i 〃 ● ハ::::::: \ .イ_ _,,ツ イ/'/:::::::::::::. < っ ル
ん |i r一 ヽ ) /i::ハi::::i:::::>,, ___ _,, ´ /,,ハ/|/:::ii:::::::: | た が
! |i | i ∀" "  ̄ ̄ ト、 //ヽ  ̄" ̄ | よ
|i | i ノi ノ:r j :ア` …‐: |
|i ニ| |二二◎ __,..'| / / :::: |
|i i i ヽ __,,:'´ t/ / :: |
li } ,_:'´ { ,,___ / ,,/i \____
0990デフォルトの名無しさん
2008/07/16(水) 21:22:550991デフォルトの名無しさん
2008/07/16(水) 21:48:03グラフのシミュレーションをしているのですが、
この図のグラフにて「青から赤」にするためのプログラムが作れず困っています
詳細はあとで記載します
0992デフォルトの名無しさん
2008/07/16(水) 21:49:40いえいえ、遠慮していただいて結構ですよ。
0993デフォルトの名無しさん
2008/07/16(水) 21:55:370994デフォルトの名無しさん
2008/07/16(水) 21:57:22ああ、だからフィギュアが置いてあるのか!
0995デフォルトの名無しさん
2008/07/16(水) 21:57:290996デフォルトの名無しさん
2008/07/16(水) 22:06:220997デフォルトの名無しさん
2008/07/16(水) 22:12:380998デフォルトの名無しさん
2008/07/16(水) 22:14:45sizeofは要素にしかならないからつける派
0999デフォルトの名無しさん
2008/07/16(水) 22:16:591000デフォルトの名無しさん
2008/07/16(水) 22:17:3510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。