08/03/18 01:04:09
>>225
text はどこを指しているのか。
228:デフォルトの名無しさん
08/03/18 01:04:26
>>223
VC++なら、x86だから元々リトルエンディアンですが。
つーか、下位バイトから順番に出力すればいいのでは?
229:デフォルトの名無しさん
08/03/18 01:07:32
>>226
やってみます・・・
230:208
08/03/18 01:08:08
>>227
ありがとうございました。
TCHAR関係すべて勘違いしていました。
231:202
08/03/18 01:30:50
>>203,204
レスthx
いろいろなoperatorを定義する時に便利そうですね。
でも、operator==だけを見ると、あまり便利に感じないです。
// Hoge.cpp
#include "A.h"
#include "B.h"
bool operator==(const A& lhs, const B& rhs) {...}
というのを考えていたので、Aに修正を加えないといけないのがちょっと・・(Bはそのままというのも気になる)。
普通に定義することにします。
232:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/18 02:12:58
開発環境はVS6、コードはANSIです。
_msize()ってmalloc()やrealloc()などで
指定したメモリサイズを返すと思ってましたが、
つなげるランタイムライブラリによって変わるのですか?
現状でコンパイルオプション「コード生成」の「使用するランタイムライブラリ」を
「シングルスレッド(デバッグ)」にすると指定したサイズ、
「シングルスレッド」にすると指定したサイズから直近の16の倍数値が返ってきます。
これってC言語をする人にとって知ってて当たり前のことなんですか?
それともオプションで調整できることなんですか?
234:205
08/03/18 02:17:24
>>207,220
やっぱりそういう感じになるんですかね。
>>222
そう思ったんですけど頻繁に mylib は更新されて少し前に書いたものが
コンパイル通らなくなったりして結局使ってる側を修正しないといけなかったりで…
どうするといい感じに管理できるのかなぁと。
235:208
08/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:デフォルトの名無しさん
08/03/18 02:19:42
>>232
とりあえず要素5つくらいの配列を考えて、そのプログラムを動かすと配列の要素がどう変わっていくかを
紙の上で1ステップずつ書き出してみな。
・勉強したアルゴリズムの通りに並んでいかないなら、プログラムのロジックが間違っている。
・ググって調べたアルゴリズムがまだ理解できていないなら、まずはそれを理解するとこ。
アルゴリズムの説明が欲しいなら、どこか適切なスレへ。
・自分で書いたプログラムがどういう動作になるのかを追えないなら、勉強不足。
C言語の仕様的に分からないことがあるなら、また質問してみれば?
237:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/18 02:27:32
>>233
_msize()ってANSIじゃないでしょ。
239:デフォルトの名無しさん
08/03/18 02:30:14
>>238
う・・・だったみたいですね。
Win32APIやMFCでなくコンソールアプリケーションで作成に訂正です。
240:233
08/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:デフォルトの名無しさん
08/03/18 02:34:05
>>235-237
ありがとうございます。
qsortも使い方が分からないのでとにかくif文とfor文でやることにしていました。
>>237さんのバブルソートの例を見ながら組み上げたいと思います。
242:デフォルトの名無しさん
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
エディタで見てるときはどうしても気付かなかったのに。
お目汚しすいませんでした・・・