【初心者歓迎】C/C++室 Ver.50【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/28(木) 00:00:47ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153デフォルトの名無しさん
2008/03/16(日) 15:15:57>どうすればよいですか?
コンパイルエラーのメッセージを書く。
そのメッセージについて>>152が何を考えて、何が分からないのかを書く。
エラーメッセージの内容を調べて無いなら、調べてから出直し。
0155デフォルトの名無しさん
2008/03/16(日) 16:02:38むかつくからやめろ
0156デフォルトの名無しさん
2008/03/16(日) 16:11:290157デフォルトの名無しさん
2008/03/16(日) 16:20:400158デフォルトの名無しさん
2008/03/16(日) 16:54:210159デフォルトの名無しさん
2008/03/16(日) 18:08:37コンストラクタで指定した長さ以上の要素を食わせるとどうなるのでしょうか?
0160デフォルトの名無しさん
2008/03/16(日) 18:09:22「食わせる」って何?
0161デフォルトの名無しさん
2008/03/16(日) 18:10:32要素数20のlistに21個目の要素を追加しようとするとどうなるのかなぁと
0162デフォルトの名無しさん
2008/03/16(日) 18:11:030163デフォルトの名無しさん
2008/03/16(日) 18:13:13そりゃ、追加されるんだろ。
0164デフォルトの名無しさん
2008/03/16(日) 18:15:17STLのコンテナは、追加はいくらでもやってよい。
コンストラクタで要素数を指定するのは、
あらかじめメモリを確保しておくことで、後から再確保するのを防ぐ、単なる最適化に過ぎない。
0165164
2008/03/16(日) 18:17:49コンストラクタで指定した要素数は、ちゃんと要素が追加されるよな。
0166デフォルトの名無しさん
2008/03/16(日) 18:21:25「追加」 の定義をきちんと聞いておいた方がいいぜ。
0167デフォルトの名無しさん
2008/03/16(日) 18:26:50それは既存要素に対する代入だろ。sizeには反映されない。
下手したらコンテナの整合性を壊す。
て、>>166は言いたいんだと思う。
0168デフォルトの名無しさん
2008/03/16(日) 19:11:13やりたいことをもっと明確に説明しないと回答のしようが無い。
たとえば12345という値を持つint型変数があったとして、どのような状態のchar配列が欲しいんだ?
0169デフォルトの名無しさん
2008/03/16(日) 19:32:59int型をchar型の要素数4(とは限らんが)の配列として扱うの?
それなら共用体になるが
0170デフォルトの名無しさん
2008/03/16(日) 19:45:07共用体しらべてみます
0171デフォルトの名無しさん
2008/03/16(日) 20:19:59エンディアンには気をつけてな
どうせsprintfとかいうオチだとは思うが
0172デフォルトの名無しさん
2008/03/16(日) 23:21:29・・・VISUAL C++というソフトを使っていたら突然こうなりました
OSはVISTAで、これ以降いくらプロジェクトを作成しようとも、どうやら自動生成されるファイルが欠落しているようです
アンインストール、再インストールも試しましたが無駄でした、当然管理者権限もです。 どうすればいいでしょうか?
0173デフォルトの名無しさん
2008/03/16(日) 23:32:100174デフォルトの名無しさん
2008/03/16(日) 23:36:03なかったです、正常動作している友人のプロジェクトフォルダを丸ごとZIPで送ってもらったら
DEBUGフォルダがありましたが、自分のほうでは生成されなくなってました
0175デフォルトの名無しさん
2008/03/16(日) 23:38:59今までは正常に実行できてたんだよな?
0176デフォルトの名無しさん
2008/03/16(日) 23:48:51リビルドして、出力ウインドウにエラーメッセージがないか確認するべし。
プロジェクトのプロパティーページのリンクの項の出力ファイルのパスを確認しよう。その友人のプロジェクトが絶対パスになってないか?
0177デフォルトの名無しさん
2008/03/16(日) 23:51:080178デフォルトの名無しさん
2008/03/16(日) 23:57:080179デフォルトの名無しさん
2008/03/16(日) 23:57:50// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
これに
int main(void) { return 0;}
これを書き足してリビルドしたら
1>------ すべてのリビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>プロジェクト 'test'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
1>コンパイルしています...
1>stdafx.cpp
1>test.cpp
1>コードを生成中...
1>マニフェストをリソースにコンパイルしています...
1>リンクしています...
1>LINK : 前回のインクリメンタル リンクで C:\Users\owner\Desktop\Documents\Visual Studio 2005\Projects\test\Debug\test.exe が見つからなかったか、ビルドされませんでした。フル リンクを行います。
1>LINK : warning LNK4067: エントリ ポイントがあいまいです。'mainCRTStartup' が選択されます。
1>マニフェストを埋め込んでいます...
1>ビルドログは "file://c:\Users\owner\Desktop\Documents\Visual Studio 2005\Projects\test\test\Debug\BuildLog.htm" に保存されました。
1>test - エラー 0、警告 1
========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========
で、ぱっとみは何とかなったみたいです 再度printfをためしてみます 一旦ありです
0180デフォルトの名無しさん
2008/03/17(月) 00:01:220181デフォルトの名無しさん
2008/03/17(月) 00:04:130182デフォルトの名無しさん
2008/03/17(月) 04:09:010183デフォルトの名無しさん
2008/03/17(月) 04:26:180184デフォルトの名無しさん
2008/03/17(月) 07:29:050185デフォルトの名無しさん
2008/03/17(月) 09:09:35自分でイテレータってつくれるんですか?
あと、演算子のオーバーロードでできるんでしょうか?
0186デフォルトの名無しさん
2008/03/17(月) 09:11:190187デフォルトの名無しさん
2008/03/17(月) 10:44:58もうちょっとだけ具体的に言ってみてよ。
0188デフォルトの名無しさん
2008/03/17(月) 10:54:370189デフォルトの名無しさん
2008/03/17(月) 11:09:180190デフォルトの名無しさん
2008/03/17(月) 11:13:530191デフォルトの名無しさん
2008/03/17(月) 11:16:270192デフォルトの名無しさん
2008/03/17(月) 11:33:44できあがり。
これ以上具体的な回答は、質問が具体的でない限りあり得ない。
0193デフォルトの名無しさん
2008/03/17(月) 13:03:460194デフォルトの名無しさん
2008/03/17(月) 13:19:100195デフォルトの名無しさん
2008/03/17(月) 13:27:010196デフォルトの名無しさん
2008/03/17(月) 13:41:300197デフォルトの名無しさん
2008/03/17(月) 14:24:110198デフォルトの名無しさん
2008/03/17(月) 14:39:590199デフォルトの名無しさん
2008/03/17(月) 15:12:570200デフォルトの名無しさん
2008/03/17(月) 15:35:270201デフォルトの名無しさん
2008/03/17(月) 20:56:530202デフォルトの名無しさん
2008/03/17(月) 21:45:45こういうやつ↓
bool operator==(const A& lhs, const B& rhs)
{...}
bool operator==(const B& lhs, const A& rhs) // これを自動化したい
{ return rhs == lhs; }
0203デフォルトの名無しさん
2008/03/17(月) 21:52:230204デフォルトの名無しさん
2008/03/17(月) 21:52:26Boost.Operatorsにまとめられている。
その例だと、Aがequality_comparable<A, B>を継承して、
operator==(const A& lhs, const B& rhs)を定義すれば、
operator==(const B& lhs, const A& rhs)とoperator !=が作られる。
0205デフォルトの名無しさん
2008/03/17(月) 22:56:40どのように管理しているんでしょうか?
* mylib/*.{h,c} と一つのディレクトリにヘッダとソース。
* mylib/include/*.h,mylib/src/*.c で mylib/lib/libmylib.a とか。
普通のライブラリ風に。
で使うときにはどうしてます?
* mylib ごとコピーして?
* mylib/include/ とかにパスを通してる。で -lmylib
どうすると楽なのか悩んでます。
0206デフォルトの名無しさん
2008/03/17(月) 22:59:48護送船団とか何とか叩いておいてアメリカがこの様なわけだが
0207デフォルトの名無しさん
2008/03/17(月) 22:59:54コンパイラオプション (多分 -I) + makefile
0208デフォルトの名無しさん
2008/03/17(月) 23:44:55クラスAにはchar変数textがあり、クラスBからsprintf(p->text, "test");を実行します。
この時エラーが起きてプログラムが強制終了するのですが、何かおかしな手順を踏んでいるのでしょうか?
0209デフォルトの名無しさん
2008/03/17(月) 23:47:16自分の力量では出来ませんでした。
やり方を教えてください。
0210デフォルトの名無しさん
2008/03/17(月) 23:50:39クラス定義を貼れ
0211デフォルトの名無しさん
2008/03/17(月) 23:56:47ソートでググれ。
0212デフォルトの名無しさん
2008/03/18(火) 00:08:51クラス定義はしてあります。
0213デフォルトの名無しさん
2008/03/18(火) 00:11:050214デフォルトの名無しさん
2008/03/18(火) 00:12:11・pがAのインスタンスを指していない。
・pが指しているAのインスタンスはすでに死んでいる。
・A::textが5byteに満たない。
・sprintfの前までに何かメモリを壊している。
・その他
この中のどれなのか判定してやるから、ソースを貼れと言ってるの
0215デフォルトの名無しさん
2008/03/18(火) 00:15:58コードが非常に長いので今編集しています。
0216デフォルトの名無しさん
2008/03/18(火) 00:29:58{
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(); }
}
0217デフォルトの名無しさん
2008/03/18(火) 00:30:21{
Task task;
task.Add(new Font(), "font");
task.Add(new Edit(), "edit");
while(true)
task.Do();
}
色々大量に省きましたが大体こんな感じです。
0218208
2008/03/18(火) 00:33:470219デフォルトの名無しさん
2008/03/18(火) 00:37:070220デフォルトの名無しさん
2008/03/18(火) 00:41:22これ俺も気になる。なかなか話題にもならないし、ぐぐっても出てこないし、
みんなどうしてるって疑問は昔からあった
俺は mylib/include、mylib/source、mylb/lib にして、
include、lib にパスを通す派
0221208
2008/03/18(火) 00:45:27Add内に実行する部分があるのでそこで実行されてます。
上のだと省いてます。
インスタンスの登録順序のせいでポインタが格納できていないのが問題でした。
0222デフォルトの名無しさん
2008/03/18(火) 00:51:13コピーしたら元を変更したときにコピーした数だけ更新してまわらないといけないだろ。
ディレクトリ分けてパス指定するのが当然だから、話題にもならないんじゃない?
0223デフォルトの名無しさん
2008/03/18(火) 00:55:36FileInfo^ fi = gcnew FileInfo(filename);
__int64 size = fi->Length;
のように取得したファイルサイズを32bitに変換し、さらにリトルエンディアンに変換した後、
バイナリでファイルに書き出したいのですが、何か良い方法はありますか?
0224デフォルトの名無しさん
2008/03/18(火) 01:00:11c++/cliは別スレで。
0225208
2008/03/18(火) 01:01:47LPTSTR text;
_stprintf(text, "text");
これでエラーが起こるのですが、正しくはどうすればいいのでしょうか?
0226デフォルトの名無しさん
2008/03/18(火) 01:02:01とりあえず速度とか、プログラムらしさというのを全く気にしなくて良いなら(勉強の一貫なら)
一度、数字の書いたカードを手作業で並べ替えてみるといいかもしれない。
そのときの手順を1つ1つメモしていくんだ。
0227デフォルトの名無しさん
2008/03/18(火) 01:04:09text はどこを指しているのか。
0228デフォルトの名無しさん
2008/03/18(火) 01:04:26VC++なら、x86だから元々リトルエンディアンですが。
つーか、下位バイトから順番に出力すればいいのでは?
0229デフォルトの名無しさん
2008/03/18(火) 01:07:32やってみます・・・
0231202
2008/03/18(火) 01:30:50レスthx
いろいろなoperatorを定義する時に便利そうですね。
でも、operator==だけを見ると、あまり便利に感じないです。
// Hoge.cpp
#include "A.h"
#include "B.h"
bool operator==(const A& lhs, const B& rhs) {...}
というのを考えていたので、Aに修正を加えないといけないのがちょっと・・(Bはそのままというのも気になる)。
普通に定義することにします。
0232デフォルトの名無しさん
2008/03/18(火) 02:07:56よろしければ手直ししていただけませんか。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]);
}
0233デフォルトの名無しさん
2008/03/18(火) 02:12:58_msize()ってmalloc()やrealloc()などで
指定したメモリサイズを返すと思ってましたが、
つなげるランタイムライブラリによって変わるのですか?
現状でコンパイルオプション「コード生成」の「使用するランタイムライブラリ」を
「シングルスレッド(デバッグ)」にすると指定したサイズ、
「シングルスレッド」にすると指定したサイズから直近の16の倍数値が返ってきます。
これってC言語をする人にとって知ってて当たり前のことなんですか?
それともオプションで調整できることなんですか?
0234205
2008/03/18(火) 02:17:24やっぱりそういう感じになるんですかね。
>>222
そう思ったんですけど頻繁に mylib は更新されて少し前に書いたものが
コンパイル通らなくなったりして結局使ってる側を修正しないといけなかったりで…
どうするといい感じに管理できるのかなぁと。
0235208
2008/03/18(火) 02:17:32バブルソートでググってみ。
選択ソート、挿入ソートでもOK。
それでダメなら、並び変えるときに自分がどういう手順を追っているか考えてみ。
10 8 3 5 7 1 6 2 4 9
↓
1 2 3 4 5 6 7 8 9 10
1つずつ動かして、その手順を元にコード起こす。
0236デフォルトの名無しさん
2008/03/18(火) 02:19:42とりあえず要素5つくらいの配列を考えて、そのプログラムを動かすと配列の要素がどう変わっていくかを
紙の上で1ステップずつ書き出してみな。
・勉強したアルゴリズムの通りに並んでいかないなら、プログラムのロジックが間違っている。
・ググって調べたアルゴリズムがまだ理解できていないなら、まずはそれを理解するとこ。
アルゴリズムの説明が欲しいなら、どこか適切なスレへ。
・自分で書いたプログラムがどういう動作になるのかを追えないなら、勉強不足。
C言語の仕様的に分からないことがあるなら、また質問してみれば?
0237デフォルトの名無しさん
2008/03/18(火) 02:24:24qsort()じゃだめなんですか?
勉強の為にソートロジック作るなら
クイックソートやマージソートやバブルソートなどで検索すればコードがでてくると思いますよ。
参考までに一番単純なバブルソートの例を
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;
}
}
}
}
0238デフォルトの名無しさん
2008/03/18(火) 02:27:32_msize()ってANSIじゃないでしょ。
0239デフォルトの名無しさん
2008/03/18(火) 02:30:14う・・・だったみたいですね。
Win32APIやMFCでなくコンソールアプリケーションで作成に訂正です。
0240233
2008/03/18(火) 02:33:14char *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
って具合です。
0241デフォルトの名無しさん
2008/03/18(火) 02:34:05ありがとうございます。
qsortも使い方が分からないのでとにかくif文とfor文でやることにしていました。
>>237さんのバブルソートの例を見ながら組み上げたいと思います。
0242デフォルトの名無しさん
2008/03/18(火) 02:40:20_msizeの動作は詳しく無いから想像だけど…。
リリース版では効率化のために1とか13とか中途半端なバイト数で確保せずに、16バイト単位で領域の割り当てをするけど
デバッグ版ではデバッグしやすいように指定したバイト丁度を割り当てているのでは?
(実際には管理領域やメモリ破壊検知などのためにもっと余分に割り当てているだろうけど。)
0243233
2008/03/18(火) 02:52:02確かにこの現象が判明したのはリリースでのコンパイルですが、
デバッグで「使用するランタイムライブラリ」を「シングルスレッド」に変えるだけでも同じ現象になるのです。
これはもうランタイムライブラリの仕様としか言いようがないのでしょうか?
同じコードなのに違う動作をするというのはどうも納得いかないのです。
(オプション変更によってコンパイルorリンクエラーになるならまだわかりますが・・・)
これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
0244デフォルトの名無しさん
2008/03/18(火) 03:07:25MSDNによれば
>ヒープに割り当てられたメモリ ブロックのサイズを返します。
と書いてある。
あくまで「割り当てられたサイズ」であり、これは「要求したサイズ」とは必ずしも一致しない。
>同じコードなのに違う動作をするというのはどうも納得いかないのです。
ランタイムライブラリに依存する処理なのだから、リンクするランタイムライブラリが異なれば
結果が異なることは特に不自然ではないと思う。
>これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
すでに出ていることだけど _msizeはANSIの標準ではなく MS固有のAPIでしかないのだから、
C言語をする人にとって周知の事というわけではない。
0245233
2008/03/18(火) 03:20:59言ってることはわかるのですが、
それならデバッグ用のランタイムの動作はデバッグなしのランタイムとあわせるべきじゃないかと思いますね。
例えば、デバッグでステップ実行で確認したのにデバッグ外すと動作変わるなら、デバッグの意味ないですよね。
とりあえず周知でないこととオプションで対応できるようなことでないのはわかりました。
0246デフォルトの名無しさん
2008/03/18(火) 03:35:54つ http://msdn2.microsoft.com/ja-jp/library/974tc9t1(VS.80).aspx
0247デフォルトの名無しさん
2008/03/18(火) 06:05:02ファイル名を入力させて
検索文字列を入力して
「該当ファイルの検索文字列を含む行を全て表示するプログラム」です
しかしながら実行すると下のコードの
getlineがすっとばされてしまい
こちらから検索文字列の入力を行うことができません
なぜですか?
0248デフォルトの名無しさん
2008/03/18(火) 06:05:33#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;
}
0249247
2008/03/18(火) 06:12:540250sage
2008/03/18(火) 06:49:59istream &getline( char *バッファ, streamsize 文字数 );
istream &getline( char *バッファ, streamsize 文字数, char 境界文字 );
ですよね
cin.getline(s,MAXSIZE)
にしたらだめでしょうか
0251デフォルトの名無しさん
2008/03/18(火) 06:55:30getline(cin,s) の前に
cin.ignore(); で一文字削ってみては
0252デフォルトの名無しさん
2008/03/18(火) 07:31:29標準では、指定された大きさ「以上」のメモリを確保するとなっていて、
ぴったりちょうどの大きさを割り当てなければならないという決まりはない。
■ このスレッドは過去ログ倉庫に格納されています