[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 10/05 08:05 / Filesize : 60 KB / Number-of Response : 263
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:00:47 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

243 名前:233 [2008/03/18(火) 02:52:02 ]
>>242
確かにこの現象が判明したのはリリースでのコンパイルですが、
デバッグで「使用するランタイムライブラリ」を「シングルスレッド」に変えるだけでも同じ現象になるのです。

これはもうランタイムライブラリの仕様としか言いようがないのでしょうか?
同じコードなのに違う動作をするというのはどうも納得いかないのです。
(オプション変更によってコンパイルorリンクエラーになるならまだわかりますが・・・)
これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw


244 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 03:07:25 ]
>>243
MSDNによれば
>ヒープに割り当てられたメモリ ブロックのサイズを返します。
と書いてある。
あくまで「割り当てられたサイズ」であり、これは「要求したサイズ」とは必ずしも一致しない。

>同じコードなのに違う動作をするというのはどうも納得いかないのです。
ランタイムライブラリに依存する処理なのだから、リンクするランタイムライブラリが異なれば
結果が異なることは特に不自然ではないと思う。

>これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
すでに出ていることだけど _msizeはANSIの標準ではなく MS固有のAPIでしかないのだから、
C言語をする人にとって周知の事というわけではない。



245 名前:233 [2008/03/18(火) 03:20:59 ]
>>244
言ってることはわかるのですが、
それならデバッグ用のランタイムの動作はデバッグなしのランタイムとあわせるべきじゃないかと思いますね。
例えば、デバッグでステップ実行で確認したのにデバッグ外すと動作変わるなら、デバッグの意味ないですよね。
とりあえず周知でないこととオプションで対応できるようなことでないのはわかりました。


246 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 03:35:54 ]
>>245

つ msdn2.microsoft.com/ja-jp/library/974tc9t1(VS.80).aspx

247 名前:デフォルトの名無しさん [2008/03/18(火) 06:05:02 ]
下のプログラムは
ファイル名を入力させて
検索文字列を入力して
「該当ファイルの検索文字列を含む行を全て表示するプログラム」です

しかしながら実行すると下のコードの
getlineがすっとばされてしまい
こちらから検索文字列の入力を行うことができません
なぜですか?

248 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/03/18(火) 06:12:54 ]
環境はcygwinを使っています

250 名前:sage [2008/03/18(火) 06:49:59 ]
getlineの定義は
istream &getline( char *バッファ, streamsize 文字数 );
istream &getline( char *バッファ, streamsize 文字数, char 境界文字 );
ですよね
cin.getline(s,MAXSIZE)
にしたらだめでしょうか

251 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 06:55:30 ]
ファイル名で入力した際に入ってきた改行文字が残っているんではないですか
getline(cin,s) の前に
cin.ignore(); で一文字削ってみては



252 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 07:31:29 ]
>>244の補足になるけど、malloc/calloc/reallocも
標準では、指定された大きさ「以上」のメモリを確保するとなっていて、
ぴったりちょうどの大きさを割り当てなければならないという決まりはない。

253 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 07:48:32 ]
>>245
そもそも_msize()==(要求サイズ)という条件に依存しようとすることが間違い。
>>244にあるとおり、この条件が常に成立するなどとは、MSは言っていないはず。
処理系依存ってやつ。

254 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 09:20:07 ]
>>245
> 例えば、デバッグでステップ実行で確認したのにデバッグ外す
> と動作変わるなら、デバッグの意味ないですよね。

デバッグビルドでデバッグし易いようにコードが変わるのは、よくある
こと。デバッグビルドとリリースビルドで動作に違いがないなら、デバッ
グビルドの意味ないじゃん。


255 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 11:58:02 ]
デバッグビルドだとちゃんと動くけどリリースビルドにすると落ちるとか言うのはよくあるよな。
たいていは初期化不足だけど。

256 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 14:35:41 ]
>デバッグの意味ないですよね
あるよ。
デバッグビルドとリリースビルドの違いで困るプログラムは、
まずいプログラムだから、それを自覚することが出来る。

257 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:33:21 ]
C言語とか意味わかんね
柴田望洋ってどうなの?

258 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:50:42 ]
柴田望洋についての話に進める前にC言語を意味分かるようにする事の方が先決というか
それを先にやらないと柴田望洋について話しても何も分からないと思うというか
C言語すら分からないようじゃ柴田望洋についての話も分からんだろうというか
それ以前に柴田望洋の話はマ板でやれ。

259 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:57:53 ]
4,8,11行目を見て、何か気付かないか?

261 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:59:04 ]
namespaceや名前空間でググれ



262 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 18:03:35 ]
うわ、自分で書き込んだレスみたらすぐ分かったw
エディタで見てるときはどうしても気付かなかったのに。
お目汚しすいませんでした・・・







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<60KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef