- 1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/
- 792 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 17:39:13 ]
- >>790
WinMain や main は、それを呼び出すルーチンがあって リンク時にそれをリンクしてるだけなんだぜ。 そのルーチンがどうなってるかは気にならないのか
- 793 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 17:49:47 ]
- >>791
>C言語で書かれた物が、全てmain()を持っているわけではありません。 そうなんですか・・。Cの全てのソフトがmainとかWinMainで始まると思っていました。 >main()はアプリケーションの入り口としての規格上の共通部であり、どう実装されるかは環境依存です。 つまり色んなOSのアプリケーションの入り口として〜mainなのですか。 >>792 >WinMain や main は、それを呼び出すルーチンがあって >リンク時にそれをリンクしてるだけなんだぜ。 >そのルーチンがどうなってるかは気にならないのか 気になりますね。でも、そーゆーの気になりだすと 最終的には電気信号とかのレベルまで行かなくならなきゃならなそうです。。。 とりあえず今はC勉強します。お二方とも解答ありがとうございます。
- 794 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 17:56:36 ]
- アセンブラの勉強をしてみるといいかもね。
- 795 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:06:10 ]
- あ専ブラですか、分かりました。
- 796 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:12:19 ]
- 俺の発言みたいにとられるようなレスしないでください。
どうでもいいけど。
- 797 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:13:05 ]
- crt0.asm とかね
- 798 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:17:29 ]
- >>796
お前の発言みたいにとらないでください。 どうでもいいならレスするな死ね。
- 799 名前:794=791 mailto:sage [2007/08/09(木) 18:29:29 ]
- >>796
自己主張したいならコテでもつけとけ。
- 800 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:32:30 ]
- >>798
だって>>793のレスに対して>>794はレスされたのに 無関係のお前が>>795みたいなレスされたら誤解するだろ。 >>799 こんな馬鹿げた自演してどうすんだよ。しょーもない。 やっぱどの板でもID表示欲しいわ。とりあえず今日はROMる。
- 801 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:34:36 ]
- どうでもいいんだろ。
誤解されとけや
- 802 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:45:21 ]
- >>793
本題から少し脱線してしまうが・・・ Windowsのアプリケーションの入り口は、厳密には、WinMainではないよ。 Windowsがアプリの実行ファイル(EXE)をロードして実行する際の入り口は、 「エントリポイント」と呼ばれているが、それは特定の名前のC言語の関数ではない。 C言語に限定されていないし、ましてや、C言語の関数名でもない。 マイクロソフトのCコンパイラ・リンカを使っているのであれば、 リンカのマニュアルで/ENTRYオプションの説明を読むべし。
- 803 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:46:53 ]
- アセンブラの勉強しても仕方ないだろう。
マシン後とアセンブリー言語が理解できるようになってから、アセンブラを勉強したほうがイイ。
- 804 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 18:54:11 ]
- マシン「語」
アセンブリ「言語」 なんて使う必要がなければ、理解しなくていいよ。 基本的なコンピュータのアーキテクチャを知っていれば、それで十分。
- 805 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 22:58:02 ]
- いや、仕事で使うから覚えますた ってだけじゃぁなぁ
金にはならないかもしれないけどとことんやれば良いと思うよ
- 806 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 23:11:36 ]
- そういう人好き
- 807 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 00:27:24 ]
- >>790
初期のUNIXは確かに古いC言語や一部アセンブラで書かれていた。 だが、Windowsや旧MacOSやμiTRONやVxWorksや...(略)はC言語で書かれているのだろうか?
- 808 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 00:41:43 ]
- 今でも一部アセンブラは当然として、
MacOSはObjectiveCかPascal、 他もCやC++、 字句解析などでは適宜別の言語、 などなど適材適所でしょ。
- 809 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 08:02:59 ]
- >>805
仕事かどうか、金になるかどうか以前に、 人生に許された時間は限られているんだよ。 >>807 WindowsはNT系はC言語で書かれたと聞いてる。 NT4.0の頃に聞いた話なので今は違うかもしれない。
- 810 名前:デフォルトの名無しさん [2007/08/10(金) 16:34:55 ]
- 低俗な質問でほんとすいません。
クラス型のポインタを持つ配列を作りたくて苦心していますが上手く行きません。 (global.h) extern class hoge *p[10]; (global.cpp) hoge *p[0] = new hoge; と書いていまして、.cppのほうでエラーが出ます。 文法的に間違っていると思うのですが、どこが間違っているのでしょうか? 宜しくお願いします。
- 811 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 17:19:31 ]
- いろいろ違う気がするが・・・w
エラーメッセージ出して1つずつ解決しては。 class定義は見える位置にあると仮定して、 extern hoge *p[10]; p[0] = new hoge; とやるかな。
- 812 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 18:24:56 ]
- >>810
問題の中身よく見てないけど、とりあえず上の方に出てるやつ数個でも良いからエラーの内容書け
- 813 名前:810 [2007/08/10(金) 18:43:28 ]
- >>811
ありがとうございます。 なお、クラスを定義してる"Hoge.h" もGlobal.hにてインクルードしてます。 今、エラーコード全部ぐぐって内容見てる途中です。 >>812 error C2040: 'PC' : 'int []' は 'cHoge *[4]' と間接操作のレベルが異なります。 error C2440: '初期化中' : 'cHoge *' から 'int []' に変換できません。 error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。 error C2501: 'PC' : 識別名を宣言するのに、型が指定されていません。 (※クラス名だけはcHogeに書き換えています) というエラーが出るんですが、ぐぐってみても今ひとつ要領を得ないのです。 「ああ、こういう間違った書き方してるから暗黙的にint型にされてるんだな」とは分かるんですが、では正しい書き方はどうなのかというのが分かりません。 普通にint型とかchar型のポインタ配列作る気持ちでやってたら、ちょっと勝手が違うようですね。手強いです。
- 814 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:03:38 ]
- >>813
>hoge *p[0] = new hoge; は hoge *p[0]; p[0] = new hoge; hoge *p[0]; だと >error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。 が出る。 だから hoge *p[10]; p[0] = new hoge; この辺はintやらcharでも変わらんと思うけど。 >>811のexternは書き間違いとちゃうかな。 勘違いだったらすんません。
- 815 名前:810 [2007/08/10(金) 19:15:13 ]
- >>814
ありがとうございます。 いままさに、同じような感じで書いていました。 結果は×でした。エラー内容全く同じ…… (Global.h) #include "HogeHoge.h"(クラス内容の書かれたヘッダ) extern class cHoge *PC[4]; (Global.cpp) cHoge *PC[4]; PC[0] = new cHoge; という状態で、全く同じエラーでます。 どうやら、PC[0]が*PC[4]の一部と見なされてない感じです。 エディタ上でPC[0]の上にマウスカーソル乗せたら、 cHoge *PC[4]ってポップアップが出てるんで、余計にわけわかんない。 なんで暗黙的int扱いされるんでしょう?
- 816 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:20:28 ]
- ごめん。
全然違うわ。 extern cHoge PC[4]; cHoge PC[4]; こうじゃねぇ?
- 817 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:23:15 ]
- なんだよ、よそで配列定義してあってのexternじゃないのかよ。
ファイル1つでうまくいった上で、分けたらおかしくなってるのか もともとやりかたがわかんないのかどっちだよ。
- 818 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:28:08 ]
- とりあえず、これでどうなる
(Global.h) #include "HogeHoge.h"(クラス内容の書かれたヘッダ) extern cHoge *PC[4]; (Global.cpp) cHoge *PC[4]; PC[0] = new cHoge; 念のため言っておくけど、こっちではコンパイルできてるから うまくいかないなら環境書いてね
- 819 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 22:31:55 ]
- なんか知らんが、トップレベルに
PC[0] = new cHoge; を書いてるんじゃなかろうな。
- 820 名前:810 [2007/08/11(土) 09:46:02 ]
- おはようございます。
3時過ぎまで頑張っていました。 >>817 そうです。分けたらおかしくなりました。 >>818 Global.h に extern class cHoge *p[4]; と書き、どこでも良いので関数内で cHoge *p[4]; p[0] = new cHoge; は上手く行きました。 所で、extern class cHoge ではなく、extern cHoge なのですか? そう書くとずらずらエラーがでるのですが…… ちなみに、他にもextern class hogehoge *tmp; という書き方でグローバルな インスタンスを3つほど作っていて、そちらは問題なく動いているのですが、 これはexternに対する私の理解が根本的に間違っているのでしょうか? >>819 えっと、その通りです。global.cppは、関数を含まないソースファイルです。 Global.hでextern宣言したものに実体を与えてグローバルクラスとして使うための ものです。 上記の通り、トップから外して関数ないで宣言したら普通に使えました。 やはり、根本的に何か間違っていますか?
- 821 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 10:27:14 ]
- >>820
何というか・・・ まず1つ目 グローバルなオブジェクトには、どこかに実体が必要だが、 その実体というのは、cHoge*なのであってcHogeではない。 グローバルスコープでnewするのは行儀が悪いのでやるべきではない。 2つ目 クラスの定義が既に済んでいるのであれば、class は書く必要がない。 もしclassを書かないと具合が悪いのであれば、クラスの定義が済んでいない。 3つ目 グローバルなオブジェクトは気軽に作るべきではない。
- 822 名前:810 [2007/08/11(土) 10:53:07 ]
- >>821
実はいま、グローバルを極力廃止して書き直してます。 そちらでは問題なく動いています。 「よく使うのはもう纏めてグローバルにしたら?」って言われてやってみたのですが、 確かに初動は早いけどひとたびエラー起こったらわけ分からなくなりました。 >その実体というのは、cHoge*なのであってcHogeではない。 !!! class書かないとエラーでるので、仰るとおり、定義されてないようです。 そうか、そういうことだったのか…… グローバルスコープでのnewもやめます。 ありがとうございました。
- 823 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:17:31 ]
- 最近C++を始めて、静的配列のdelete[]クラッシュにはまったんですが、疑問があったので質問
以下のコードでクラッシュしないのはなぜ? #include <string> int main(){ int is=0; //これが無いとクラッシュ std::string array[2] = {"hoge", "fuga"}; delete[] array; return 0; } コンパイラはMS製です
- 824 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:18:44 ]
- そもそもdeleteなんているのか?newがみえないんだが・・・
- 825 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:26:43 ]
- new[] してないものを delete[] してはいけません。
new[] と delete[] は1対1
- 826 名前:823 mailto:sage [2007/08/11(土) 22:27:30 ]
- いらないことは分かってますけど、ただ疑問に思ったので…
上記のエラーを探ってた時に、変数の有り無しでプログラムのクラッシュするしないが変わるものかなと…
- 827 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:29:22 ]
- スタック破壊。
- 828 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:31:41 ]
- >>826
たまたま使ってるコンパイラではクラッシュしなかっただけの話だろ。 他のコンパイラだと鼻から悪魔が出てきても文句は言えない。
- 829 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:36:29 ]
- >>826
その手の行為で、どんなことが起きるかは、基本的に予測できない。 間違ったことをした、ずーーーーーっと後で落ちる、っていうことも多い。 知らないうちに関係ない変数が書き換わってる、とかいう現象になることもある。
- 830 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 23:38:38 ]
- サンクス、何となく理解した
- 831 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 23:40:09 ]
- >>810=>>822
1〜2KByte以下のRAMの少ないマイコンならそういうテもあるが、 そうでもなければグローバルにまとめるのはやめとけ。 PCのプログラミングならグローバル変数を使わなくてはならない状況はまず考えつかない。 仮にあったとしても、保守erが苦労するだけなので使わないようにしている。 ちなみに、 hoge_type *p[10]; みたいな用例は時折あると思うが、演算子の評価順と同じで、この p は、 hoge_type *p; が10個ある配列になる。だから、通常は ヘッダファイル extern hoge_type *p[10]; か、 extern hoge_type *p[]; になる。 時々間違えるのは、ちょっとうまい使い方を覚えたC/C++言語erが hoge_type *p[10]; という定義に対して extern hoge_type **p; または extern hoge_type p[][10]; などとしてしまうことであり、これは正常に働かない。
- 832 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 23:54:09 ]
- >>823
ちょっと論点をずらすが、 std::string array[2] = {"hoge", "fuga"}; これは、std::stringの定義を理解した上での記法であり、 std::stringは引数が空のコンストラクタを持っているので、 std::string array[2]; array[0] = "hoge"; array[1] = "fuga"; とした方が安全。
- 833 名前:デフォルトの名無しさん [2007/08/12(日) 00:14:06 ]
- VC++2005 Express Editionでは、atoi()やstrtok()といった古い関数は使えないのでしょうか?
VC6で作ったソースを読み込んでコンパイルしたら、コンパイルは通るのですがリンカエラーがでます。 必要なヘッダのincludeはしています。 ”LNK2019: 未解決の外部シンボル __imp__strtok が関数 _main で参照されました。” というリンカエラーやLNK2001がでます。 #include <stdio.h> #include <string.h> int main(void) { char str[] = "ABCD ef.1234.G"; char *tp; tp = strtok( str, " ." ); puts( tp ); while ( tp != NULL ) { tp = strtok( NULL," ." ); if ( tp != NULL ) puts( tp ); } return 0; } 例えばこれだと、putsにもstrtokにも同じ上記リンカエラーがでます。 お手上げです。よろしくおねがいします。
- 834 名前:デフォルトの名無しさん [2007/08/12(日) 00:30:30 ]
- 板違いかもしれません。ですが質問します。
同じ質問をVBスレでしたのですが、 私の聞いた事がレベルが低いのか、書き方が悪いのか、 回答が得られなかったので書きます。 C#.NETとVB.NETの違いって何ですか? 調べてみると、(触り程度) C#.NETにメモリーを切る(確保)概念が無くなったと。 だったら、方言とコンパイルの速度だけの違いになりますか?
- 835 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 00:33:36 ]
- >>834
言語が違うってだけじゃ不満?
- 836 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 00:35:57 ]
- C#.NET と VB.NET の違い・・・ 言語が違います。以上。
メモリーを切るって意味不明
- 837 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 00:38:45 ]
- ふと、疑問に思った。
.NET自体触ったことないんだけど、VB.NETってインタプリタじゃないの?
- 838 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 00:45:30 ]
- ない
JITでネイティブコードにコンパイルされる
- 839 名前:デフォルトの名無しさん [2007/08/12(日) 00:47:01 ]
- ちょっと、この話は興味ある。
言語が違うだけって、書き方が違うだけなの? C#の方が、いろいろ出来るイメージがあるけど。
- 840 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 00:47:50 ]
- やっぱそうなのか・・・
C#とVBでネイティブコードレベルで違いって大きくでたりするもの? って、違いがあったら.NETの意味がなくなるからそんなことない?
- 841 名前:デフォルトの名無しさん [2007/08/12(日) 00:53:04 ]
- 人から聞いた話。
C#の方が早いって聞いた。(アプリの動き) あと、マイクロソフトがVBよりC#に重きを置いてるとも。
- 842 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 00:53:27 ]
- >>840
ない。前にMSがC#でもVB.NETでも同じコードをコンパイルしたら、 同じIL(中間言語)になると宣伝していた覚えもある。 (ただしデフォルトではオプションが異なるので、そのままでは全く同じILにならないという註付きで) >>834 記憶域を確保するという概念がなくなったというより、 それを解放する操作を明示する必要がなくなったというのがより正確。 そして、それは.NETの特徴なので、これはC#でもVB.NETでも同じ。
- 843 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 00:54:30 ]
- つまりは慣れてる言語で書くのがいいってことでFA?
- 844 名前:デフォルトの名無しさん [2007/08/12(日) 00:56:43 ]
- >>842
ありがとうございます。 う〜ん、あまり、VBとC#の差異が見えませんね。 調べてみたら、C#の方が開発期間が長くなるとありました。
- 845 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 01:07:57 ]
- VB.NET だと unsafe コードが書けない、っていうのはある
- 846 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 01:30:13 ]
- どうでも良いが、なんでこのスレで質問したんだろう・・・。
C#もVB.NETも、C/C++とはほとんど関係ないと思うんだが。
- 847 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 03:53:27 ]
- 「スレ立てるまでもない質問はここで」と見間違えたとかかな?
- 848 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:14:32 ]
- >>823
「クラッシュ」と一言で片付けるあたりがダメぽ。 せっかくランタイムライブラリやOSが情報をくれているのにね。 ちなみにdelete[]の実装を見てみ。
- 849 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:23:19 ]
- >>833
「エラーが出ます」と言って思考停止するなよ。 エラーメッセージは読むこと。 意味がわからなければ、リンカのマニュアルのエラーの解説を読むこと。
- 850 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:30:35 ]
- >>844
VB.NETとC#は当初、機能に違いがなく、字面だけの違いで、機械的に相互にコンバート可能だった。 ぶっちゃけ、VB.NETにはVB風の字面という存在価値しかなかった。 ところが、VB専門の連中が、 VB.NETへの移行のために勉強すべきことが多すぎて嫌だと拒否したので、 しかたなく、VB.NETはVBに近くなるように、C#と機能に違いを持たせることになった。 そういう経緯なので、C#に何の抵抗も無い人は、C#とVB.NETで開発期間は違わない。 VB.NETを使ったほうが便利な部分があれば、そこだけピンポイントでVB.NETで書けばいい。
- 851 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 08:26:46 ]
- 鼻から悪魔なんて久しぶりに
- 852 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 08:37:28 ]
- >>844
ぶっちゃけ、セミコロンがあるかないかの違い。 VBしか書けないダメ派遣はどうやってもセミコロンが書けないらしいよ。
- 853 名前:デフォルトの名無しさん [2007/08/12(日) 10:19:37 ]
- 自前の構造体で、
その構造体の中で入力の>>演算子をオーバライドしようとしても上手くいきません。。。 struct { int x; istream& operator>>(istream& s) { s >> x; } } こうじゃないんですか?
- 854 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 10:39:05 ]
- >>853
それは演算子の左辺が構造体で右辺が istream の >> を定義していることになる
- 855 名前:デフォルトの名無しさん [2007/08/12(日) 11:01:31 ]
- >>854
左辺はistreamじゃないんですかね。。。 勉強不足みたいなんで出なおしてきます。 ありがとうございました。
- 856 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 11:18:12 ]
- int main(void)
{ String s1; String s2; String s3("CCC"); String s4("DDD"); s1.set("AAA"); s2.set("BBB"); s2.add(s3); s4.add("EEE"); printf("s1:[%s](%d)\n", s1.get(), s1.getLength()); printf("s2:[%s](%d)\n", s2.get(), s2.getLength()); printf("s3:[%s](%d)\n", s3.get(), s3.getLength()); printf("s4:[%s](%d)\n", s4.get(), s4.getLength()); cout << "s1:[" << s1.get() << "](" << s1.getLength() << ")" << endl; cout << "s2:[" << s2.get() << "](" << s2.getLength() << ")" << endl; cout << "s3:[" << s3.get() << "](" << s3.getLength() << ")" << endl; cout << "s4:[" << s4.get() << "](" << s4.getLength() << ")" << endl; return 0; } 結果: s1:[AAA](3) s2:[BBBCCC](6) s3:[CCC](3) s4:[DDDEEE](6) s1:[AAA](3) s2:[BBBCCC](6) s3:[](3) s4:[DDDEEE](6) s3の値がcoutで出したときおかしいのだが、bcc55ってこんなに馬鹿なのか? それともおれが馬鹿?
- 857 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 11:26:57 ]
- >>851
鼻から悪魔が出るは、何の例えになるのでしょうか?
- 858 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 11:37:57 ]
- i = i++; のような未定義のコードは何が起きるか分からないという話
未定義のコードを実行をした結果、たとえ鼻から悪魔が出てきたとしても、その処理系は規格に反してはいない まぁ現実問題、そんなことで悪魔を呼び出せるんならすでに世の中は悪魔だらけだ
- 859 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 11:47:24 ]
- >>856
bccのStringクラスの仕様が判らんからなんとも言えんが、どうも挙動が不自然だね。
- 860 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 11:52:56 ]
- >>858
ワクワクしますね、何処かに冒険家いませんかね? ありがとうございました
- 861 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 11:55:03 ]
- >>859
Stringクラスは自前なんですが。。 どうやら、cout時点でs3の中のchar*pが""になってるみたいです。 coutの後でprintfしても出ませんでした。 C++初心者状態なのでclassの作り方に失敗してるのかもしれませんね。 coutにバグがあるとも考えにくいですから。。。
- 862 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 12:44:25 ]
- >>861
んじゃ、領域破壊をしているに一票。 add()の辺りが怪しいと見た。
- 863 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:09:48 ]
- バイナリハックに一票です
- 864 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:30:42 ]
- BCCは3.0から4.5まで愛用したクチだが、いまどきBCCはないだろう。
マイクロソフトのVC++なら、メモリ破壊を(ある程度)検出する機能が付いているよ。
- 865 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:33:38 ]
- 自分も昔はBCC愛用してましたが、VC++Expressが出たからもう使ってない
- 866 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:14:05 ]
- 僕は自分でC++コンパイラ作って使ってますけど
- 867 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:18:34 ]
- iccやmsvc、gccには一生かかっても勝てません
- 868 名前:デフォルトの名無しさん [2007/08/13(月) 03:19:19 ]
- これからC++を勉強しようとしている者ですが
なにか良い勉強ツールはないでしょうか? できれば「Study C」のようなプログラムをコンパイルせずに実行できるようなものがいいんですが...
- 869 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:22:32 ]
- 開発環境ってこと?
- 870 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:23:51 ]
- VC++でも使ってろ
- 871 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:25:15 ]
- VC++Expressがいいんじゃないの?無料だし
- 872 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:25:45 ]
- 昔Macintosh使って悪魔を呼び出すって映画があったよな。
>>868 コンパイルをせずにというのが何を意味しているのかよく分からないんだけど、 正直、自分でコードを書かずに言語が身につくとはとても思えない。 コマンドラインからのコンパイルが面倒だというなら Visual C++ 2005 Express Edition を落として使えばいいんじゃないかと。
- 873 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:26:42 ]
- インタプリタってことだろ
- 874 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:27:33 ]
- あるいはアセンブリャか
- 875 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:30:43 ]
- あのう
PIC使って自動あえぎ声再生機能付きダッチワイフを作りたいんですけど 何から始めたらよかですか?
- 876 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:32:40 ]
- この人何いうとっと?
- 877 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:33:02 ]
- 完全防水型圧力センサー
- 878 名前:868 [2007/08/13(月) 03:36:43 ]
- 的確な言葉がいえずすいません
プログラム文を書いてワンボタンでそのプログラムの実行結果が確認できるようなツールがほしいのです. 以前C言語の勉強をしていたときに使っていた「Study C」がそういうものだったんでC++でも似たものがないかと思い質問してみました.
- 879 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:36:46 ]
- せがらしか
- 880 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:39:53 ]
- CINT
- 881 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 03:57:32 ]
- >>876>>879
九州人じゃなかごたんね 無理して九州弁ばしゃべらんでよかよ
- 882 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:02:09 ]
- ばってん
- 883 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:10:27 ]
- ばってん何ね?
- 884 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:12:11 ]
- 九州男児を舐めん方がよかね
- 885 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:14:04 ]
- 残念
格助詞の「を」は「ば」になるんだ
- 886 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:15:38 ]
- ばりちろ
- 887 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:16:37 ]
- そがどないしたと
- 888 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:18:34 ]
- 創作方言やろうぜ
- 889 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:18:51 ]
- どない→どげん/どがん
- 890 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:20:33 ]
- 「どぎゃん」とは言わんと?
- 891 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:20:41 ]
- (#^ω^)ピキピキ
- 892 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:24:02 ]
- >>890
言う
- 893 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:01:36 ]
- せからしか!
- 894 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:26:22 ]
- そうかしら!
- 895 名前:デフォルトの名無しさん [2007/08/13(月) 05:40:05 ]
- なんでこんな流れに?
- 896 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:41:10 ]
- 暇な学生が多い
暇な社会人も(もしかしたら普段より)多い(かもしれない)
- 897 名前:デフォルトの名無しさん [2007/08/13(月) 05:48:12 ]
- 夏ですな蝉も鳴き始めた時間です
- 898 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:48:39 ]
- お前が上げるからじゃ!
- 899 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:51:36 ]
- さいでした
- 900 名前:デフォルトの名無しさん [2007/08/13(月) 06:17:36 ]
- 自演厨通報しますた
- 901 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 06:28:31 ]
- 通報しないで|(●)ム(●)|
- 902 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 06:29:08 ]
- いやんばか
- 903 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 08:52:03 ]
- >>878
> プログラム文を書いてワンボタンでそのプログラムの実行結果が確認できるようなツールがほしいのです. それは目的ではなく手段だよね。 まず、 試行錯誤的にプログラムを書き換えて、「たまたま」目的の動作をするのを見つけ出す というのは、やめたほうがいい。かえって遠まわりになる。 次に、 勉強段階の人ほど優秀なコンパイラ&デバッガを使ったほうがいい。 とくにデバッガの優劣は、勉強の効率に非常に大きく効いてくる。 というわけで、VC++を勧める。Express Editionで事足りるかはわからないが。
- 904 名前:903 mailto:sage [2007/08/13(月) 08:57:55 ]
- それからもう一つ。
Webで無料で見られるサイト「だけ」で勉強しようとしているのなら、それは良くない。 良質なサイトはたくさんあるが、それでも、良質な本のほうがずっと優れている。 つまらないところで躓くのは、 ・それに必要な知識が抜け落ちている ・間違った知識を取り込んでしまっている ・下手な解説に惑わされている といったことが原因になりやすい。 本を買うのにはお金がかかるが、 人生の限られた時間を浪費するのに比べたら、 本を買うお金なんて安いものです。
- 905 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:02:30 ]
- ちゃんと勉強できる人にはデバッガは強力なツールになるが、
そういう人はデバッガがなくても自分で工夫して何とかできる。 また、デバッガに頼って結果第一主義になると規格に則った知識が身につかない。 従って、余り勧めない方がいいと私は思う。
- 906 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:28:13 ]
- できる・できない、ではなくて、効率の話なんだけどなぁ。
そりゃぁデバッガなくたってデバッグは可能さ。 でも無駄に労力使うでしょう?
- 907 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:30:22 ]
- 少なくとも、この手のスレで、
自分が書いたプログラムがうまく動きません、何が悪いのかサッパリわかりません。教えてください。 なんていうような質問する人は、デバッガでステップ実行すらしてないのよ。
- 908 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:53:08 ]
- STL等のテンプレートを使うと、ステップ実行は非常に効率が下がるのだが。
- 909 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:12:15 ]
- だから、デバッガをきちんと役立てることができる人には、わざわざ勧める必要がないんだけどな。
勧められないと使えない人は、きちんと役立てることができないだろうからやはり、勧める必要がないんだ。
- 910 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:14:06 ]
- デバッガがなくても自分で工夫して何とかできる人ほど、デバッガを使うんだなこれが。
- 911 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:27:42 ]
- >>909
そんなことを言っていたら、 自力で習得できない人はプログラミングに向いてないから辞めたほうがいい ということになってしまうぞ。 スレを見ていると、 デバッガでステップ実行しろ! と言われて、素直にステップ実行して問題解決している人も、少しはいる。 どんなに能力や素質、やる気があっても、知るチャンスがなければどうにもならない。 残念ながらステップ実行しろと言われても無視しているような馬鹿のほうが多いけどな。
- 912 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:30:03 ]
- >>911
>自力で習得できない人はプログラミングに向いてないから辞めたほうがいい 私の主張したいところはまさしくそこです。
- 913 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:36:56 ]
- >>912
向いてる向いてないに関わらずやらにゃならん状況はあるわけで。
- 914 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:41:05 ]
- そんな香具師にデバッガ渡したら、「偶偶動いたからOK」的なプログラムを量産される羽目になりかねんが。
- 915 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 14:11:38 ]
- それはデバッガ使わないやつこそそうなるだろう。
デバッガに消極的な人は、便利なツールの無い環境でやってんの?
- 916 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 15:15:39 ]
- ステップ実行しない = 意図したとおりのパスを通っているか確認しない
ということなわけで、偶然動いているだけなのを見過ごしてしまいやすい。
- 917 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 15:18:17 ]
- うわぁ、イコールで結んじゃったよ。
- 918 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 19:42:47 ]
- >>916
趣味でのプログラムの話?仕事でのプログラムの話? 趣味のプログラムならPTなんかしないし(ていうかテスト自体しないけど) 仕事のPTでデバッガ使ってやるような個人に頼ったテストはほとんどしない。 まぁPTで通しにくいパスも確かにあるんで、 デバッガ使ってパス確認を全否定するつもりはないけども、 常にソレに頼るようなのはアホだと思うけどね。
- 919 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 20:14:39 ]
- >>918
自分は仕事でも趣味でも、程度の差はあるけれども、書いたコードは1度はステップ実行するよ。 PTではなくCDで。会社によってはCDとPTを一緒にしてCPTと呼んでいるかもしれないが。 趣味だとテストなんてしないに等しいから、なおさら、ステップ実行は大切だよ。
- 920 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 20:18:41 ]
- はいはい
- 921 名前:878 mailto:sage [2007/08/13(月) 21:12:44 ]
- >>903
C++に関してはド素人なんで「初めてのC++」を買って勉強しているんですが,一々100行にも満たないプログラムをコンパイルしてEXEを作って実行とかは煩雑でして... ちなみにいま使っている開発環境はVC++です。なかなかなれないんで別に使いやすそうなのがあればいいなと思い質問しました。設定次第でステップ実行やワンボタンで実行結果の確認ができるのであれば、このままこれでいこうかとも思ってます。
- 922 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:28:48 ]
- CTRL+F5で実行、質問にyes
でビルド後即実行 これでも面倒ですか?
- 923 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:32:53 ]
- >>921
お前には向いてない あきらめた方がいい
- 924 名前:878 mailto:sage [2007/08/13(月) 21:35:30 ]
- >>922
そんなんあったんやそれならいけそうです >>923 うるさい頑張るわ!
- 925 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:41:04 ]
- あほすぎうざい
- 926 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:49:45 ]
- >>924
ちなみにVC++ expressね 起動してからショートカットキーの入力と文字の入力でプログラムプロジェクト作成して コード入力→ctrl + F5で実行、動作がおかしければF9でブレークポイント設定して F5でデバッグ実行 と適当にショートカットキー入力してるだけでどんどん作業がすすむ これで面倒とか言ってたら他のはとてもじゃないけど使いこなせないよ
- 927 名前:878 mailto:sage [2007/08/13(月) 21:59:37 ]
- >>926
うるさいカスタマイズして使うわ!
- 928 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 22:08:19 ]
- >>926
VC++っていろいろ設定いじれるんですね。C++の勉強するまえにそっちの勉強したほうがよさそうです。 今度マニュアル本でも買っていろいろためしてみようと思います。 あと927は私じゃないんで放置しといてください。助言ありがとうございました。
- 929 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 22:10:45 ]
- あほすぎ
VC++先に勉強してあほのお前に分かるわけないやろw
- 930 名前:デフォルトの名無しさん [2007/08/13(月) 22:20:48 ]
- 韓国が8/15終戦記念日に2chを潰そうとしています
ソース cafe.naver.com/makjang212.cafe 日本語訳 vista.jeez.jp/img/vi8700172598.jpg
- 931 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 06:10:05 ]
- で、どうしろと?
- 932 名前:デフォルトの名無しさん [2007/08/14(火) 21:06:30 ]
- 質問です。
ソースファイルをまたいでCArrayを使用したいのですが、 どのようにやればいいのかわかりません。 具体的には、片方のソース内でAddして、もう片方のソース内で 使いたいです。
- 933 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:08:38 ]
- 説明が面倒なので
extern CArray hoge;
- 934 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:26:36 ]
- >>932
自分がやりたいことくらい、相手にわかるように説明しような。
- 935 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:32:42 ]
- >>932
お前にはムリだ。あきらめろ。
- 936 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:45:30 ]
- >>856
だけど、みなさんのアドバイスにしたがってただ今VC++Exなんたらをインストール中 にしても時間がかかるね。。。
- 937 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:59:54 ]
- いちいちそんなこと書くなアホすぎでわろた
- 938 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:05:20 ]
- うるせーばーか
- 939 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:18:58 ]
- 殺すぞてめー
- 940 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:22:15 ]
- VC++は初心者にはお勧めできないシロモノですよ。
言語のイロハを学習する前に、ツールの使い方や設定などの前段階で ワケワカメとなる可能性が非常に高いです。 特に2005のExpressだと、デフォルトではWin32の選択肢が出て来ないという 極悪ぶりですし(すなわち自動的にC/C++ではなく .NET方面へ誘導される) 仮にそこの設定をクリアしたとしても、テンプレートの中身を見てまたまた 目を回す事態にもなるでしょう。 デフォルトでUNICODEの設定フラグが立ってるのも鬼門ですね。 一般的なC/C++の参考書の書式が通用せずに警告が出まくって、これまた 混乱の極み間違いなしです。 sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l また、この辺の初歩的な関数の取り扱いは、もはやギャグの領域とも思えます。
- 941 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:23:41 ]
- まっアホには使えないってこったな
- 942 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:28:08 ]
- emacsとか使ってmakefileとかjamfile書く方が楽なのか?
俺はそうは思わないけど
- 943 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:41:28 ]
- 怖いなぁ
- 944 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:20:03 ]
- なにこれVC++って新しいんだな
warning C4996: 'strcpy' が古い形式として宣言されました。
- 945 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:29:47 ]
- 944古すぎ
- 946 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:36:14 ]
- >>940
その「一般的な」参考書というのは、「レガシーな」参考書の間違いだろう。 入門者に時代遅れのC標準ライブラリを使わせること自体が間違いだよ。
- 947 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:46:31 ]
- そしてM$と心中するわけですね。
- 948 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 00:05:45 ]
- ちげーよ。
C++のためのステップとしてのCなんて必要ない ってことさ。 C++ならstrcpyもsprintfも必要ない。
- 949 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 00:46:56 ]
- >>610
遅レスだが template<typename U> friend class foo<U>; ではなく、 friend foo ; これで、同じテンプレートから作られたものはfriendになる。
- 950 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 01:50:10 ]
- >>940
まずはWindows上でC/C++を勉強するのに薦めたい環境を出せ。 インストーラがパスとかも通してくれるし、 勉強程度ならほとんどの場合、F7押すだけでビルド、 F5押すだけでビルドから実行までしてくれる何が難しいのか。 (2005 EEのビルドはF6だっけ?うちはVS2005SEなんで違った気もする) C/C++の勉強するのになんでWin32APIが出てくるのかも非常に謎。 Cの標準ライブラリの関数は、警告は出るが「通用する」。 まぁCの導入には俺はVC薦めても良いと思うけど、 一歩進むとC99とか完全に置き去りなのがなぁ・・・
- 951 名前:12MHz [2007/08/15(水) 09:09:37 ]
- Ettercapというツールがありますが、コンソールで動作しているときにメニューを十字キーで
自由に選択できるようになっているのはどのようにして実現しているのですか?
- 952 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 10:10:50 ]
- >>951
Ettercapがどんなツールか知らないけど、 Linuxでコンソールなら、カーソルキーの入力を取って ncursesか何かで描画してるんじゃない?
- 953 名前:12MHz [2007/08/15(水) 10:32:33 ]
- kaiya.cs.shinshu-u.ac.jp/pub/c/curses/
こういうことでしょうか?
- 954 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 15:51:01 ]
- ユーザへのインタラクティブなエラーメッセージ
ログ等へのエラーの記録 この2つは、 ネストの深い位置(エラーを検出したその場所) ネストの浅い位置(何かの大きなひとまとまりの処理の結果を受け取る場所) どちらでやるのが良いのでしょうか。
- 955 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 20:44:38 ]
- 好きなほうにしろよ
- 956 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:05:58 ]
- >>955 ・・・好きです
- 957 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:48:14 ]
- そういう意味じゃない
- 958 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:51:54 ]
- じゃあ、どういう意味ですかー!!
私はこんなにも貴方を愛しているっていうのに!!!
- 959 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:56:12 ]
- 面白くないよ
- 960 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:14:27 ]
- つまんない奴
- 961 名前:デフォルトの名無しさん [2007/08/18(土) 22:19:42 ]
- >>856 だけど
VC++Exなんたら入れてみたけど、設定多すぎてやる気なくしたんでBCCでやってます。 えっと 異常値が出る問題だけど、ようやく解決しました。 自作のStringクラスの中にポインタをもっていてそこにnewしたメモリを紐づけている わけですが、引数としてこのStringクラスを渡すとこのクラスのコピーが作られて もちろんメモリと紐づいたポインタもコピーされて関数の終了とともにdeleteでメモリが 開放されていた。という次第です。 コピーコンストラクタなるものを作ってちゃんとメモリもコピーしてやったら直りました。 おまえら役に立たなさ杉だなwww
- 962 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 22:23:51 ]
- 理解できない頭のくせに(笑)
- 963 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 22:50:01 ]
- 自作ライブラリの不具合をソース無しで問われてもエスパー以外には回答不可かと
- 964 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:28:05 ]
- >>961
>862で指摘済みじゃん。しかもどんぴしゃ。
- 965 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:54:19 ]
- >>964
それは失礼しました。ご指摘ありがとうございます。
- 966 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:54:53 ]
-
- 967 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 04:22:05 ]
- プログラマー共ってもうすこし同類に優しいと思ってたらそうでもないんだな
殺伐としとる
- 968 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 04:24:26 ]
- 優しいよ。どんな戦場に居るんだ?
- 969 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 08:21:18 ]
- >>968
お手手繋いで仲良く微温湯に使っていたいのでしょうよ。 # 微温湯っつーか、泥沼?
- 970 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:39:48 ]
- >>961
おまえが馬鹿すぎる。 メンバ変数にポインタを持ち、デストラクタでdeleteしているのに、 浅いコピーをするデフォルト生成のコピーコンストラクタを許す(使う)だなんて。
- 971 名前:デフォルトの名無しさん [2007/08/19(日) 16:03:05 ]
- 開発環境
Windows XP SP2 VC++6.0 質問内容 Windowsでmallocを行った際の動作は 1.OSがヒープ領域をある程度大きく取る。 2.確保したヒープ領域内からmallocで指定したサイズで領域確保する。 といった2段階の処理が行われている。 という理解でたぶん合っていると思うのですが、現在組んでいるプログラムで、 for( ii = 0 ; ii < hogehoge ; ii++ ) { ・・・ /* 領域確保 */ hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) ); ・・・ } といった感じに文字列をメモリに格納する処理があるのですが、一部の処理で以下の現象が発生していて対応方法が見つからずに困っています。 デバックコンパイル(正常動作) -> 「1」で確保したヒープ領域を使い切った後に、新しいヒープ領域を確保しに行く 最適化コンパイル(異常動作) -> 「1」で確保したヒープ領域を使い切る前に、新しいヒープ領域を確保しに行く(見た感じでは99%使われていない) デバックコンパイルしたモジュールでは正常動作するのですが、最適化コンパイルを行った場合に上記問題が発生して途中で領域確保に失敗してプログラムが止まってしまっています。 メモリの状況をチェックするのには「VM Validator」というソフトウェアを使用しています。 問題点は最適化コンパイルしたモジュールの一部の処理でヒープ領域を無駄に確保しにいくという点です。 mallocは他の場所でもあちこちで使っているのですが、ここの部分でのみ上記現象が発生していて現在苦しんでいるところです どなたかアドバイスをよろしくおねがいします。
- 972 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:14:08 ]
- エスパー
hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) ); の部分で後からstrcpyで文字列をコピーするんだろうと思うと hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) + 1 ); じゃないと、終端文字分の'\0'領域がかくほされない
- 973 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:17:12 ]
- >>971
とりあえず、 hogenhoge->hoge[ii] = (char*)malloc( (strlen(line)+1) * sizeof(char) ); に変えてみ。
- 974 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:18:41 ]
- 関係ないけど、sizeof(char)はいらんだろ。
sizeof(TCHAR)とかだったら、必然性あるけど。
- 975 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:19:47 ]
- それにしても、C++とは思えない酷いコードだな。
- 976 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:21:00 ]
- >>974
いる。 あとでcharをTCHARに変えることもある。 そのときに+1なんてのはマジックナンバーになってしまう。
- 977 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:24:22 ]
- >>976
だったら最初からTCHARにしとけばいいじゃん。 なんのためのジェネリックテキストだよ。
- 978 名前:971 [2007/08/19(日) 17:49:31 ]
- うぉっ直りました^^;
デバック版でたまたま動いてたのはヒープ領域確保する際に初期化とかしてるのが最適化版だとしてくれないとかがあって、異なる結果になってたのかな・・・ >>975 ひどいコードですみませんorz 実のところ、掲示板に書いたコードはmallocをfor文で繰り返している部分ってのを表現したくて、その場で書いたコードだったのですが、元のコードでも指摘されたのと同じミスをしていました・・・ しかも今見なおすとforループのhogehogeと領域確保する構造体の名前がかぶっている・・・と思ったら片方はhogeとhogeの間にnが入っている・・・う〜ん質問するに当たってこんなコードのせてちゃダメですね >>974 sizeof(char)はcharが1バイトではない処理系がもしかしたらあるかもしれないので、そういう意味でこうしてます。 TCHARってのは使ったことないのですが、charとは違った文字列の持ち方をするってことかな? 勉強してみますね^^ 皆さんアドバイスありがとうございました。
- 979 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 17:53:35 ]
- >>978
charはかならず1バイト。
- 980 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:43:16 ]
- >>978
うつろな記憶なんで、嘘だったら誰かフォロー頼む。 デバッグビルドだとデバッグのための領域が一緒に確保される。 なので、バッファオーバーフローしても、デバッグのため領域を食いつぶして 正常に動いてるように見えることが多い。 リリースビルドだと、余分な領域を確保しないので、 オーバーフローするとわけの分からない動きをする可能性が高い。 とかそんな話だったと思う。
- 981 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:48:18 ]
- >>977
TCHARとして書いていないものをTCHARとして書くのは無責任だ。 だいたい意味が分かるように書くべきであって、 型のサイズが既知で変りそうもないからハードコーディングするのはおかしい。 sizeof(DWORD)なんてのも直に4と書けと言うのか?
- 982 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:58:11 ]
- >>978
TCHARというのはWindowsのWin32APIのマクロで、 Win32APIのUnicode版とMCBS版を透過的に使うためのもの。 実体は、 #ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif こういうことになってる。 ちなみにVC++のランタイムライブラリでは、 #ifdef _UNICODE typedef wchar_t _TCHAR; #else typedef char _TCHAR; #endif ということになっている。 この2つは厳密には別物であり使い分けるべきなのだけれども、 Win32APIと関係のないところで_TCHARではなくTCHARを使う人が少なくない。
- 983 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:02:24 ]
- >>980
デバッグビルドの場合、バッファオーバーフローを検出するための仕掛けがある。 MSDNライブラリ等で _CrtCheckMemory などの一連の項目を見るといい。 簡単に言うと、余分にメモリを確保して、そこに特別な値を書き込んでおき、 その値が変っているかどうかをチェックして、バッファオーバーフローを検出する。 VC++6.0のIDE上でデバッグモードで動かしていれば、 プロセスが終了する間際に、トレースの所に何かメッセージが出ていたと思うよ。
- 984 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:05:48 ]
- >>981
もちろんほかの箇所もTCAHR使うって前提だよ。 >>976 の「あとでsizeof(TCHAR)にすることもある」って話も、そこだけ変えるんじゃないだろ? ハードコーディングしろって話じゃなくて、sizeof(char)は1だと決まってるんだから、そもそも、いらないって話だよ。 あとでsizeof(TCHAR)に書き直すくらいなら、最初からそう書いておけばいい。
- 985 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:17:14 ]
- >>984
ただ単に 1 と書いたら、意味がわかりにくい。 もう一度聞くが、 sizeof(DWORD)も4と書くのか?
- 986 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:18:26 ]
- 誰が1や4と書くなんて書いとんねん
つまらない事で言い合いスンナ!
- 987 名前:971 [2007/08/19(日) 19:19:18 ]
- >>980
おお〜なんか納得できる^^ sizeof(char)に関しては、>>981さんの考え方に近いかな〜 昔32bit -> 64bitの移植に携わったことがあって、その時にちと苦しめられたので明示的に書くようにしてます^^ 具体的にはポインタの領域確保するのに、(たぶん組んだ人は動きゃいいやという考え方で適当に組んでいたダメ人間)sizeof(int)使って領域確保してて、 32bitだとポインタもintも両方同じ4バイトだからちゃんと動作するんだけど、 64bitではポインタだけ8バイトに変わるから、そこの部分でエラーが出て、 しかもコピーして使いまわしたらしく同じようなコードがあちこちに点在してて・・・ 今となってはいい思い出だけど、あれは大変だったなぁ〜(-_-;) 今回のケースとは大分違うんだけど、明示的に書いておいた方が将来的にどんなふうに仕様が変化するか分からないし安全だなぁ〜って教訓からこうしてます^^
- 988 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:25:16 ]
- TCHARも知らん分際で何ホザいとんねん
- 989 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:27:16 ]
- >>985
だから「いらない」って言ってるじゃん。 malloc(strlen(s) * 1) こんな書き方しろなんて言ってないよ。
- 990 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:30:02 ]
- >>987
intとcharは、事情が違うよ。
- 991 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:39:00 ]
- もうスレが終わりそうだからマトメ
(a) malloc(tcslen(s) * sizeof(TCHAR)) なら普通の書き方。 (b) malloc(strlen(s) * sizeof(char)) のsizeof(char)は意味がない。 あとでcharをTCHARに変えるかもって想定してるなら、この使い方はマジックナンバーを 埋め込んでるより多少はマシだけど、まあ大差ないレベル。 最初から (a)の書き方をするべき。
- 992 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:42:26 ]
- >>989
malloc(strlen(s)+1) こんな書き方をしたら、気持ち悪いだろ。 mallocが受け取るのは「文字数」ではなく「バイト数」だ。 strlenが返すのは「バイト数」ではなく「文字数」だ。それは+1しても、「文字数」のままだ。 「バイト数」を受け取るところに、「文字数」を渡すのは、気持ち悪すぎる。 sizeof(char)に「文字数」を掛けることで、適切に「文字数」を「バイト数」に変換できる。 だから、たとえsizeof(char)が1だとわかりきっていても、それを省略すべきではない。
- 993 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:43:53 ]
- >>991
99%の確率でバグっているコードを「普通の書き方」なんて言うな。
- 994 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:48:17 ]
- >sizeof(char)に「文字数」を掛けることで、適切に「文字数」を「バイト数」に変換できる。
いいえ。
- 995 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:48:32 ]
- ツマンネェ奴ら
- 996 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:49:00 ]
- >>977 は >>974 でしょ?
元もとstrlenだけで十分だと言ってるんだと思うが... もし、つけるんだったらsizeof(*line) じゃだめか?
- 997 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:52:37 ]
- >>993
元のコードにあわせただけ。 この話の本筋とは関係ないし。 マイナーな本でsizeof(char)を使えって薦めてるのを見たことあるけど、 まあ、こういうスタイルは、圧倒的に少数派。 こんなクセのある書き方を推奨するやつは、コードを読んで無さ杉。
- 998 名前:971 [2007/08/19(日) 19:54:19 ]
- なんかスレが荒れてしまって申し訳ないです。
皆さん善意で書き込んでくださっているわけなので、感謝してます。 ただ個々人で使用し続けてきたコーディングのスタイルがあって、それでいい争いになってしまっていて、すれが険悪になってしまって申し訳ありません。 今回の件ではバグが取れたという以外にも、文字列絡みの処理に対して再勉強する機会になったのでよかったです。
- 999 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:55:25 ]
- ↓1000
- 1000 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:02:37 ]
- 呼んだ?
- 1001 名前:1001 [Over 1000 Thread]
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
|

|