08/03/18 02:40:20
>>240
_msizeの動作は詳しく無いから想像だけど…。
リリース版では効率化のために1とか13とか中途半端なバイト数で確保せずに、16バイト単位で領域の割り当てをするけど
デバッグ版ではデバッグしやすいように指定したバイト丁度を割り当てているのでは?
(実際には管理領域やメモリ破壊検知などのためにもっと余分に割り当てているだろうけど。)
243:233
08/03/18 02:52:02
>>242
確かにこの現象が判明したのはリリースでのコンパイルですが、
デバッグで「使用するランタイムライブラリ」を「シングルスレッド」に変えるだけでも同じ現象になるのです。
これはもうランタイムライブラリの仕様としか言いようがないのでしょうか?
同じコードなのに違う動作をするというのはどうも納得いかないのです。
(オプション変更によってコンパイルorリンクエラーになるならまだわかりますが・・・)
これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
244:デフォルトの名無しさん
08/03/18 03:07:25
>>243
MSDNによれば
>ヒープに割り当てられたメモリ ブロックのサイズを返します。
と書いてある。
あくまで「割り当てられたサイズ」であり、これは「要求したサイズ」とは必ずしも一致しない。
>同じコードなのに違う動作をするというのはどうも納得いかないのです。
ランタイムライブラリに依存する処理なのだから、リンクするランタイムライブラリが異なれば
結果が異なることは特に不自然ではないと思う。
>これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
すでに出ていることだけど _msizeはANSIの標準ではなく MS固有のAPIでしかないのだから、
C言語をする人にとって周知の事というわけではない。
245:233
08/03/18 03:20:59
>>244
言ってることはわかるのですが、
それならデバッグ用のランタイムの動作はデバッグなしのランタイムとあわせるべきじゃないかと思いますね。
例えば、デバッグでステップ実行で確認したのにデバッグ外すと動作変わるなら、デバッグの意味ないですよね。
とりあえず周知でないこととオプションで対応できるようなことでないのはわかりました。
246:デフォルトの名無しさん
08/03/18 03:35:54
>>245
つ URLリンク(msdn2.microsoft.com)(VS.80).aspx
247:デフォルトの名無しさん
08/03/18 06:05:02
下のプログラムは
ファイル名を入力させて
検索文字列を入力して
「該当ファイルの検索文字列を含む行を全て表示するプログラム」です
しかしながら実行すると下のコードの
getlineがすっとばされてしまい
こちらから検索文字列の入力を行うことができません
なぜですか?
248:デフォルトの名無しさん
08/03/18 06:05:33
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
int main()
{
string s;
vector<string> v;
cout << "Input filename" << "\n";
cin >> s;
ifstream in(s.c_str());
while(getline(in,s))
v.push_back(s);
cout << "検索文字列";
//↓の入力がすっとばされてしまう
getline(cin,s);
for(vector<string>::size_type i = 0;i < v.size();i++){
if(v[i].find(s) != string::npos)
cout << i << ":" << v[i] << "\n";
}
return 0;
}
249:247
08/03/18 06:12:54
環境はcygwinを使っています
250:sage
08/03/18 06:49:59
getlineの定義は
istream &getline( char *バッファ, streamsize 文字数 );
istream &getline( char *バッファ, streamsize 文字数, char 境界文字 );
ですよね
cin.getline(s,MAXSIZE)
にしたらだめでしょうか
251:デフォルトの名無しさん
08/03/18 06:55:30
ファイル名で入力した際に入ってきた改行文字が残っているんではないですか
getline(cin,s) の前に
cin.ignore(); で一文字削ってみては
252:デフォルトの名無しさん
08/03/18 07:31:29
>>244の補足になるけど、malloc/calloc/reallocも
標準では、指定された大きさ「以上」のメモリを確保するとなっていて、
ぴったりちょうどの大きさを割り当てなければならないという決まりはない。
253:デフォルトの名無しさん
08/03/18 07:48:32
>>245
そもそも_msize()==(要求サイズ)という条件に依存しようとすることが間違い。
>>244にあるとおり、この条件が常に成立するなどとは、MSは言っていないはず。
処理系依存ってやつ。
254:デフォルトの名無しさん
08/03/18 09:20:07
>>245
> 例えば、デバッグでステップ実行で確認したのにデバッグ外す
> と動作変わるなら、デバッグの意味ないですよね。
デバッグビルドでデバッグし易いようにコードが変わるのは、よくある
こと。デバッグビルドとリリースビルドで動作に違いがないなら、デバッ
グビルドの意味ないじゃん。
255:デフォルトの名無しさん
08/03/18 11:58:02
デバッグビルドだとちゃんと動くけどリリースビルドにすると落ちるとか言うのはよくあるよな。
たいていは初期化不足だけど。
256:デフォルトの名無しさん
08/03/18 14:35:41
>デバッグの意味ないですよね
あるよ。
デバッグビルドとリリースビルドの違いで困るプログラムは、
まずいプログラムだから、それを自覚することが出来る。
257:デフォルトの名無しさん
08/03/18 17:33:21
C言語とか意味わかんね
柴田望洋ってどうなの?
258:デフォルトの名無しさん
08/03/18 17:50:42
柴田望洋についての話に進める前にC言語を意味分かるようにする事の方が先決というか
それを先にやらないと柴田望洋について話しても何も分からないと思うというか
C言語すら分からないようじゃ柴田望洋についての話も分からんだろうというか
それ以前に柴田望洋の話はマ板でやれ。
259:デフォルトの名無しさん
08/03/18 17:54:45
1:#include <iostream>
2:#include <string>
3:
4://using namespace std;
4:
6:class Foo {
7:private:
8: std::string s;
9:
10:public:
11: string getValue ( void ) { return s; };
12: void setValue ( const string s_in ) { s = s_in; };
13:};
14:
15:int main ( void ) {
16: Foo f;
17: f.setValue("abcd");
18: std::cout << f.getValue() << std::endl;
19: return (0);
20:}
これをコンパイルすると、次のメッセージが出てコンパイルエラーになってしまいます。
"foo2.cpp", 行 11: エラー: 型の名前が予期される位置に "string" があります.
4行目のusingステートメントを有効にするとコンパイルできます。
何が間違ってるのでしょうか?
Cは経験あるのですが、C++はド素人で良く分かりません(T_T
260:デフォルトの名無しさん
08/03/18 17:57:53
4,8,11行目を見て、何か気付かないか?
261:デフォルトの名無しさん
08/03/18 17:59:04
namespaceや名前空間でググれ
262:デフォルトの名無しさん
08/03/18 18:03:35
うわ、自分で書き込んだレスみたらすぐ分かったw
エディタで見てるときはどうしても気付かなかったのに。
お目汚しすいませんでした・・・