[表示 : 全て 最新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

232 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:07:56 ]
209です。ググったりしたのですが難しいです。
よろしければ手直ししていただけませんか。Visual C++ 6.0です。

int hairetu(int jun[N]){
int max,j,k,retu[N],jun2[N];

for(j=0;j<N;j++){
jun2[j]=jun[j];
}

for(k=0;k<N;k++){
for(j=0;j<N;j++){
if(max<jun[j])
max=jun[j];
jun[j]=jun2[k];
}
retu[k]=max;
max=retu[k];
}

for(j=0;j<N;j++){
jun[j]=retu[j];
}
return(jun[N]);
}

233 名前:デフォルトの名無しさん [2008/03/18(火) 02:12:58 ]
開発環境はVS6、コードはANSIです。

_msize()ってmalloc()やrealloc()などで
指定したメモリサイズを返すと思ってましたが、
つなげるランタイムライブラリによって変わるのですか?

現状でコンパイルオプション「コード生成」の「使用するランタイムライブラリ」を
「シングルスレッド(デバッグ)」にすると指定したサイズ、
「シングルスレッド」にすると指定したサイズから直近の16の倍数値が返ってきます。
これってC言語をする人にとって知ってて当たり前のことなんですか?
それともオプションで調整できることなんですか?


234 名前:205 [2008/03/18(火) 02:17:24 ]
>>207,220
やっぱりそういう感じになるんですかね。

>>222
そう思ったんですけど頻繁に mylib は更新されて少し前に書いたものが
コンパイル通らなくなったりして結局使ってる側を修正しないといけなかったりで…

どうするといい感じに管理できるのかなぁと。

235 名前:208 mailto:sage [2008/03/18(火) 02:17:32 ]
>>232
バブルソートでググってみ。
選択ソート、挿入ソートでもOK。
それでダメなら、並び変えるときに自分がどういう手順を追っているか考えてみ。

10 8 3 5 7 1 6 2 4 9

1 2 3 4 5 6 7 8 9 10

1つずつ動かして、その手順を元にコード起こす。

236 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:19:42 ]
>>232
とりあえず要素5つくらいの配列を考えて、そのプログラムを動かすと配列の要素がどう変わっていくかを
紙の上で1ステップずつ書き出してみな。
・勉強したアルゴリズムの通りに並んでいかないなら、プログラムのロジックが間違っている。
・ググって調べたアルゴリズムがまだ理解できていないなら、まずはそれを理解するとこ。
 アルゴリズムの説明が欲しいなら、どこか適切なスレへ。
・自分で書いたプログラムがどういう動作になるのかを追えないなら、勉強不足。
 C言語の仕様的に分からないことがあるなら、また質問してみれば?

237 名前:デフォルトの名無しさん [2008/03/18(火) 02:24:24 ]
>>232
qsort()じゃだめなんですか?
勉強の為にソートロジック作るなら
クイックソートやマージソートやバブルソートなどで検索すればコードがでてくると思いますよ。

参考までに一番単純なバブルソートの例を

void bubble_sort(int a[], int n)
{
int i, j, t;

for (i=0; i<n-1; i++) {
for (j=n-1; j>i; j--) {
if (a[j-1] > a[j]) {
t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
}


238 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:27:32 ]
>>233
_msize()ってANSIじゃないでしょ。

239 名前:デフォルトの名無しさん [2008/03/18(火) 02:30:14 ]
>>238
う・・・だったみたいですね。
Win32APIやMFCでなくコンソールアプリケーションで作成に訂正です。


240 名前:233 [2008/03/18(火) 02:33:14 ]
long lGetSize = 0;
char *pcDat = NULL;

pcDat = realloc(NULL, 1);
lGetSize = _msize(pcDat);
printf("1 = %ld\n", lGetSize);
→ シングルスレッド(デバッグ)での結果=1
→ シングルスレッドでの結果=16

pcDat = realloc(NULL, 13);
lGetSize = _msize(pcDat);
free(pcDat);
printf("13 = %ld\n", lGetSize);
→ シングルスレッド(デバッグ)での結果=13
→ シングルスレッドでの結果=16

pcDat = realloc(NULL, 17);
lGetSize = _msize(pcDat);
free(pcDat);
printf("17 = %ld\n", lGetSize);
→ シングルスレッド(デバッグ)での結果=17
→ シングルスレッドでの結果=32

って具合です。




241 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:34:05 ]
>>235-237
ありがとうございます。
qsortも使い方が分からないのでとにかくif文とfor文でやることにしていました。
>>237さんのバブルソートの例を見ながら組み上げたいと思います。

242 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:40:20 ]
>>240
_msizeの動作は詳しく無いから想像だけど…。
リリース版では効率化のために1とか13とか中途半端なバイト数で確保せずに、16バイト単位で領域の割り当てをするけど
デバッグ版ではデバッグしやすいように指定したバイト丁度を割り当てているのでは?
(実際には管理領域やメモリ破壊検知などのためにもっと余分に割り当てているだろうけど。)


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