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

202 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:45:45 ]
operator==とかの引数の対称性って手動で保守するしかないんですか?
こういうやつ↓
bool operator==(const A& lhs, const B& rhs)
{...}
bool operator==(const B& lhs, const A& rhs) // これを自動化したい
{ return rhs == lhs; }

203 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:52:23 ]
boost

204 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:52:26 ]
>>202
Boost.Operatorsにまとめられている。
その例だと、Aがequality_comparable<A, B>を継承して、
operator==(const A& lhs, const B& rhs)を定義すれば、
operator==(const B& lhs, const A& rhs)とoperator !=が作られる。

205 名前:デフォルトの名無しさん [2008/03/17(月) 22:56:40 ]
大体の人はよく使う関数などをまとめた個人用ライブラリを作ってると思うのですが
どのように管理しているんでしょうか?

* mylib/*.{h,c} と一つのディレクトリにヘッダとソース。
* mylib/include/*.h,mylib/src/*.c で mylib/lib/libmylib.a とか。
普通のライブラリ風に。

で使うときにはどうしてます?

* mylib ごとコピーして?
* mylib/include/ とかにパスを通してる。で -lmylib

どうすると楽なのか悩んでます。


206 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:59:48 ]
不良債権が流行った頃
護送船団とか何とか叩いておいてアメリカがこの様なわけだが


207 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:59:54 ]
>>205
コンパイラオプション (多分 -I) + makefile

208 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:44:55 ]
クラスAがあり、クラスBがクラスAのインスタンスのポインタpを持っている形のプログラムがあります。
クラスAにはchar変数textがあり、クラスBからsprintf(p->text, "test");を実行します。
この時エラーが起きてプログラムが強制終了するのですが、何かおかしな手順を踏んでいるのでしょうか?

209 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:47:16 ]
if文とfor文だけで一次元配列を大きい順にソートしたいんですけど
自分の力量では出来ませんでした。
やり方を教えてください。

210 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:50:39 ]
>>208
クラス定義を貼れ



211 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:56:47 ]
>>209
ソートでググれ。

212 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:08:51 ]
>>210
クラス定義はしてあります。

213 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:11:05 ]
ぬう。言葉が通じない

214 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:12:11 ]
>>208
・pがAのインスタンスを指していない。
・pが指しているAのインスタンスはすでに死んでいる。
・A::textが5byteに満たない。
・sprintfの前までに何かメモリを壊している。
・その他
この中のどれなのか判定してやるから、ソースを貼れと言ってるの

215 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:15:58 ]
意味をはき違えました。
コードが非常に長いので今編集しています。

216 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:29:58 ]
class Task
{
public:
void Add(Task *obj, LPCSTR name);//インスタンスを登録する関数です。
Task* Find(char *name);//インスタンスのポインタを返す関数です。
void Do();//登録されたインスタンスのExec();を実行
protected:
virtual void Exec();
}

class Font : public Task
{
public:
char text[10];
protected:
void Exec(){ cout << text << endl; }
}

class Edit : public Task
{
public:
Init(){ font=(Font*)Find("font"); }
void setFont(){ sprintf(font->text, "text"); }
private:
Font *font;
protected:
void Exec(){ setFont(); }
}

217 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:30:21 ]
main()
{
Task task;
task.Add(new Font(), "font");
task.Add(new Edit(), "edit");
while(true)
task.Do();
}

色々大量に省きましたが大体こんな感じです。

218 名前:208 mailto:sage [2008/03/18(火) 00:33:47 ]
すいません、自己解決しました。

219 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:37:07 ]
EditのInit()はどこで呼ばれてんの

220 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:41:22 ]
>>205
これ俺も気になる。なかなか話題にもならないし、ぐぐっても出てこないし、
みんなどうしてるって疑問は昔からあった

俺は mylib/include、mylib/source、mylb/lib にして、
include、lib にパスを通す派



221 名前:208 mailto:sage [2008/03/18(火) 00:45:27 ]
>>219
Add内に実行する部分があるのでそこで実行されてます。
上のだと省いてます。

インスタンスの登録順序のせいでポインタが格納できていないのが問題でした。

222 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:51:13 ]
>>220
コピーしたら元を変更したときにコピーした数だけ更新してまわらないといけないだろ。
ディレクトリ分けてパス指定するのが当然だから、話題にもならないんじゃない?

223 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:55:36 ]
Visual C++で

FileInfo^ fi = gcnew FileInfo(filename);
__int64 size = fi->Length;

のように取得したファイルサイズを32bitに変換し、さらにリトルエンディアンに変換した後、
バイナリでファイルに書き出したいのですが、何か良い方法はありますか?


224 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:00:11 ]
>>223
c++/cliは別スレで。

225 名前:208 mailto:sage [2008/03/18(火) 01:01:47 ]
文字列代入でつまりました。
LPTSTR text;
_stprintf(text, "text");
これでエラーが起こるのですが、正しくはどうすればいいのでしょうか?

226 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:02:01 ]
>209
とりあえず速度とか、プログラムらしさというのを全く気にしなくて良いなら(勉強の一貫なら)

一度、数字の書いたカードを手作業で並べ替えてみるといいかもしれない。
そのときの手順を1つ1つメモしていくんだ。

227 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:04:09 ]
>>225
text はどこを指しているのか。

228 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:04:26 ]
>>223
VC++なら、x86だから元々リトルエンディアンですが。
つーか、下位バイトから順番に出力すればいいのでは?

229 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:07:32 ]
>>226
やってみます・・・

230 名前:208 mailto:sage [2008/03/18(火) 01:08:08 ]
>>227
ありがとうございました。
TCHAR関係すべて勘違いしていました。



231 名前:202 mailto:sage [2008/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 名前:デフォルトの名無しさん 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