【初心者歓迎】C/C++室 Ver.28【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/06/09(金) 10:08:51ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153デフォルトの名無しさん
2006/06/14(水) 16:45:58返答遅くなってすみません!!どうしても外せない用事ができてしまって
外に出てしまいました。今出先のノートパソコンからやってるのですが、
分割コンパイルという言葉に聞き覚えはありません…
帰ってみてぐぐればわかるでしょうか?本当申し訳ありません。
0154デフォルトの名無しさん
2006/06/14(水) 18:20:51なんかとてつもなくわかりにくいような気もするが置いとく
・コンパイル時の動作
とりあえずbcc32 toriaezu.cpp matrix.cppと打ち込んだ場合、
コンパイラはまず最初にtoriaezu.cppとmatrix.cppをコンパイルしてtoriaezu.objとmatrix.objを作成する(この時点でエラーがあればコンパイルエラーと出る)
次に、リンカ(ilink32.exe)を呼び出して、CUIアプリケーション用スタートアップモジュール(C0X32W.OBJ)や標準関数ライブラリ(CW32.LIB)と
先にコンパイルしたtoriaezu.objとmatrix.objをリンクしてtoriaezu.exeを吐き出させる。
・ヘッダファイルとソースファイル(コンパイル単位)
ヘッダファイルは通常、クラスや関数の宣言のみで単独でコンパイルや他のソースファイルにインクルードしても実体は含まれない。(テンプレートは通常ヘッダに実装書くけど置いとく)
当然、宣言だけだと呼び出す関数がそのコンパイル単位に存在しないのでそのクラスの実装(matrix.obj)から関数を呼び出す必要がある。
ついでにBCC5.5.1のライブラリファイルとかの資料
http://support.borland.com/entry!default.jspa?categoryID=90&externalID=4323
混乱するかも知らん(;´Д`)
0155デフォルトの名無しさん
2006/06/14(水) 19:54:30環境変数設定で間違えて$(PATH)の値を消してしまって困っています
$(PATH)○○
となるはずですけど○○の部分がわかりません
変な話で申し訳ありませんが教えてください
どうかお願いします
0156デフォルトの名無しさん
2006/06/14(水) 20:00:55・複数のソースコードからなるソフトをひとつのexeファイルにまとめることができる。
中規模以上のソフトは通常複数のソースファイルで構成されている。
(もしこの機能がなかったら、たとえばLINUXカーネルのソースコードは、、、、、、)
ひとつのソフトを分割してコンパイルすることになるので、コンパイル結果を結合する
必要がある、リンカはこの結合を行い、結合されたソフトの実行開始アドレスなどを
exeファイル内に設定する。
(ちなみに、単一のCソースからなるソフトでも、リンカはスタートアップ時に初期化のために
実行されるCRTなどを、コンパイル結果に結合して実行ファイルを作成している)
・C言語(コンソールプログラム)は、int main()から実行が開始される。
(実際にはCRT(C0X32)の中のスタートアップルーチンからmainを読んでいるのですが、、、)
よって、mainがないとリンカさんが困ってしまう。
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
そしてふりだしへ、、、
0157デフォルトの名無しさん
2006/06/14(水) 21:27:19十中八九WinMainから始まっているのに-Wを指定していなかったというオチ。
0158デフォルトの名無しさん
2006/06/14(水) 21:40:38不幸なことに今回はレアケースなのだよ
つまり10回のうち1、2回というか、それ以上
多分100万人に1人の…
0159デフォルトの名無しさん
2006/06/14(水) 22:03:17bcc32 -etest *.h *.c
0160デフォルトの名無しさん
2006/06/14(水) 23:59:17関数定義、宣言の時
例えば
static void func(void){}と
void func(void){}とするのでは
何が違うんでしょうか
どなたか教えて頂きたいです
0161デフォルトの名無しさん
2006/06/15(木) 00:03:59別のソースファイルから呼び出すことができるかどうかが違う。
0162デフォルトの名無しさん
2006/06/15(木) 00:09:21前者は非公開、後者は他ソースに公開。
例えば同じ名前の関数が他ソースにあるときに問題になる。
最適化の観点からは、
gccなら前者ならインライン展開する可能性を期待できる。
iccなら事実上殆ど差がない。
0163デフォルトの名無しさん
2006/06/15(木) 00:24:07例えばコマンドラインから、bcc32 hoge.h hoge1.c hoge2.c ...でできるはず
>>159
*.h *.c はディレクトリ内の拡張子 .h .c の全てのファイルをコンパイル対象にしてしまう。
これやるぐらいなら、makefile の作り方を覚えた方がいい。
初心者の内は自分がどのファイルをコンパイルしているのか、
意識的に考えながらやった方がいい。
0164デフォルトの名無しさん
2006/06/15(木) 03:31:01#include <stdio.h>
int double_malloc(double *target, int number) {
if ((target = (double *)malloc(sizeof(double) * number)) == NULL ) {
puts("Memory Unallocatable in dounle_malloc()\n") ;
return (-1) ;
}
return (0) ;
}
int main(void) {
int number ;
double *test ;
number = 2 ;
double_malloc(test, number) ;
test[0] = 1.0 ;
test[1] = 2.0 ;
printf("%f\n", test[0]+test[1]) ;
free(*test) ;
return (0) ;
}
OSはVineLinux3.2、コンパイラはOSについてきたgccを使っています。CPUはPentium4 2.66GHz、総メモリは1Gでコンパイル後も650MB程度の空きがありました。
0165デフォルトの名無しさん
2006/06/15(木) 03:36:270166デフォルトの名無しさん
2006/06/15(木) 03:40:360167デフォルトの名無しさん
2006/06/15(木) 07:05:120168デフォルトの名無しさん
2006/06/15(木) 12:43:361. 関数の中で引数(の変数)に代入しても、渡した側の変数の値は変更されない。
2. free には malloc が返してきた値と同じ値を渡す必要がある。
(例) a = malloc(...); としたなら free(a)。 free(*a) や free(a+1) はダメ。
C なら double* double_malloc(int n) として、 test = double_malloc(number) とするか、
int double_malloc(double** ptr, int n) として、 double_malloc(&test, number) とする。
(後者の場合 *ptr = (double*) malloc(...); として値を返す)
加えて C++ なら int double_malloc(double* &ptr, int n) として、 double_malloc(test, number) とも書ける。
(この場合 ptr = (double*) malloc(...); でOK)
0169デフォルトの名無しさん
2006/06/15(木) 12:45:490170デフォルトの名無しさん
2006/06/15(木) 12:54:370171デフォルトの名無しさん
2006/06/15(木) 13:05:00#define MBYTE (1024 * 1024)
char Var[MBYTE];
こうやったらエラーでたからしかたなくmalloc()使ってる…。
0172デフォルトの名無しさん
2006/06/15(木) 13:05:35単一オブジェクトの動的生成なら new 使ったほうがよくて、
動的配列なら vector 使ったほうがいいから。
0173デフォルトの名無しさん
2006/06/15(木) 13:07:510175デフォルトの名無しさん
2006/06/15(木) 13:25:51俺もnewかコンテナ使うけど、コンテナの機能を使わない場合、malloc()でもいいんじゃね?
ビルトインタイプなんだし。
0176デフォルトの名無しさん
2006/06/15(木) 13:30:000177デフォルトの名無しさん
2006/06/15(木) 13:41:410178デフォルトの名無しさん
2006/06/15(木) 13:48:240179デフォルトの名無しさん
2006/06/15(木) 13:53:00微妙なのかよw
0180デフォルトの名無しさん
2006/06/15(木) 14:39:31そもそもmallocなど使わずに、環境依存のメモリ確保のシステムコールなどを使う。
0181デフォルトの名無しさん
2006/06/15(木) 14:53:15C++で積極的にmalloc()を使用する理由はない。
0182デフォルトの名無しさん
2006/06/15(木) 15:06:32問題になるのは、コンストラクタ/デストラクタの呼び出しの有無。
呼び出されなければならない場合、new/deleteを使用するべき。
コンストラクタ/デストラクタがなければ好みの問題。
0183デフォルトの名無しさん
2006/06/15(木) 16:08:580184デフォルトの名無しさん
2006/06/15(木) 16:21:28システムコールの方が c のライブラリの malloc より速い OS って
例えばどんなのがある?
0186デフォルトの名無しさん
2006/06/15(木) 17:17:11mallocがそのシステムコールを呼んでいるだけだったとしても、
インライン展開されない限り、mallocを呼ぶオーバーヘッドがかかる。
0187デフォルトの名無しさん
2006/06/15(木) 17:20:44理論上、1度だけ大きな領域を確保するときにはそうだね。
というような特殊事例でのバカ話は別として、
実際にはどのOSのシステムコールが、そのOSの標準的なCランタイムの
malloc より高速なの?
0188デフォルトの名無しさん
2006/06/15(木) 17:22:53http://www.google.co.jp/search?hl=ja&q=%E9%80%9F%E5%BA%A6+HeapAlloc+malloc&lr=
malloc の方がはるかに高速。Linux だって sbrk より malloc の方が速いだろ。
0189デフォルトの名無しさん
2006/06/15(木) 17:33:10まあ、そういう工夫によって、OS依存のAPIより早いという場合はあるね。
iostreamだって、内部でバッファ処理をしていて、
OSのAPIを呼び出して、ファイルに対して1バイトずつアクセスするより早いことがあるかもしれないし。
0190デフォルトの名無しさん
2006/06/15(木) 18:13:53でも近頃のVisual C++のmallocは単にHeapAllocを呼ぶようになっていたと思う。
0191デフォルトの名無しさん
2006/06/15(木) 20:26:52ヒント:仮想記憶空間
0192デフォルトの名無しさん
2006/06/15(木) 22:33:21実はプロセス起動時にまるっとある程度確保されてる場合もある
0193デフォルトの名無しさん
2006/06/15(木) 23:16:49システムにメモリを要求することはかなりかなり高価な処理であるから,
mallocの呼び出しごとにそれをするのは損である。
、、、
と古典には書かれている。
0194デフォルトの名無しさん
2006/06/15(木) 23:28:44どのレスに対するコメントか知らんが、
「だからどうした」
0195デフォルトの名無しさん
2006/06/16(金) 00:17:27欲しいのですが、お勧めはありますか?
下のを試したんですが、VC++2003以降でいくつか古いインクルードヘッダが
なくなったせい(だと思うんですが)で、コンパイルできません。
ttp://www.vector.co.jp/soft/win95/prog/se059033.html
0196デフォルトの名無しさん
2006/06/16(金) 00:33:47これ使ってみて。
boost sandbox bigint
0197デフォルトの名無しさん
2006/06/16(金) 03:00:28>>162さん
遅レスですいません
レスありがとうございます。
そういう意味だったんですか。
わかりました。ありがとうございました。
0198デフォルトの名無しさん
2006/06/16(金) 03:27:37>MS VC++2005 で使える
かどうかは確認してないけど
gmpなんてのもある
0199デフォルトの名無しさん
2006/06/16(金) 09:32:430200デフォルトの名無しさん
2006/06/16(金) 09:59:50bigintってまだ残っていたんだ。
正式に採用される日は来るのかな。
個人的に、単純な実装でもいいから、
多倍長整数のための、標準ライブラリは必要だと思うのだけれど。
0201デフォルトの名無しさん
2006/06/16(金) 12:05:43単にC++のヘッダーファイルが*.hになってるだけだね。
気合で修正汁
0202デフォルトの名無しさん
2006/06/16(金) 18:22:39キーでソートされていることは保障されているのでしょうか?
次のコードによる出力結果が同じであることは、保障されていますか?
int main()
{
std::map<int, int> test ;
for (int i = 0 ; i != 100 ; ++i)
test[i] = i ;
for (std::map<int, int>::iterator Iter = test.begin() ;
Iter != test.end() ;
++Iter)
{ std::cout << "key : " << Iter->first << ' element : ' << Iter->second << '\n' ; }
std::cout << std::endl ;
}
0203デフォルトの名無しさん
2006/06/16(金) 18:30:13・できる限り載せるソースはコンパイル可能なものにしてくれ。
・「出力結果が同じ」とは? 何と何が同じであることを期待しているの?
0204デフォルトの名無しさん
2006/06/16(金) 18:35:50全角空白を半角空白に置換すればコンパイル可能だと思います。
VC8のDinkumwareでは、
1 1
2 2
3 3
...
のように表示されます。
デフォルトでは比較関数はstd::lessになるのは決まっていたと思いますが、
イテレータでアクセスする場合、
こういう風にソートされた形で順々に要素にアクセスできるのが、
規格として保障されているのか知りたいのですが。
0205デフォルトの名無しさん
2006/06/16(金) 18:40:34ほんとにコンパイルできた?
2バイト空白を置換してもエラーになるんだけどなぁ。
つーか、>204のようには出力されないと思うぞ。
#少し落ち着いて自分のコードをよく見てみるか自分でコピペして味噌。
##あ、すまんが本題の「規格で保証」されているかは知らない。
###でも、その筈だけどね。
####いや、保障はしてくれないのは間違いないなw
0206デフォルトの名無しさん
2006/06/16(金) 19:03:59ttp://www.sgi.com/tech/stl/Map.html
ttp://www.sgi.com/tech/stl/SortedAssociativeContainer.html
0207デフォルトの名無しさん
2006/06/16(金) 19:48:25パッと見、elementを囲っているのがシングルクォーテーションであるって以外は問題ないコードだが
0208デフォルトの名無しさん
2006/06/17(土) 00:16:35> gmpはgccでしか使えない希ガス
ttp://www.cs.nyu.edu/exact/core/gmp/
0209デフォルトの名無しさん
2006/06/17(土) 00:46:57作ったんだけどエラーが出ます。
助けてください。
ttp://uploader.fam.cx/data/u10732.txt
0210202
2006/06/17(土) 00:52:23どうも文字列リテラルをシングルクオートでくくっていたみたいです。
すみません。
>>206
読んでみましたが、どこにもmapをイテレータでアクセスすると
ソートされているかどうかなんて、書かれていないような気がします。
0211209
2006/06/17(土) 00:54:18申し訳ないです。
0212デフォルトの名無しさん
2006/06/17(土) 01:00:45> and they also guarantee that their elements are always sorted in ascending order by key.
0214195
2006/06/17(土) 01:58:47>>196
頑張って探したけど、見つかりませんでした><
>>201
気合入れて修正して、コンパイルはなんとか通らせることが出来ました。
サンプルプログラムも正常に動作しているみたいです。でも、警告いっぱいでちょっと不安です。
gmpの情報もありがとうございます。ドキュメント読みながら考慮してみます。
0215デフォルトの名無しさん
2006/06/17(土) 02:58:57どう探したんだ?
http://www.google.co.jp/search?q=boost+sandbox+bigint
0216デフォルトの名無しさん
2006/06/17(土) 13:59:47GetValue()という関数があったとして、仮引数に与えたTypeとIndexによって、
戻り値がfloatやlongとして返ってくる方法は無いでしょうか?
キャストや別関数を作成しないでまとめたいのです。
戻り値
float(or long) GetValue(long iType, long iIndex);
0217デフォルトの名無しさん
2006/06/17(土) 14:04:59思いつく方法を書いてみた。
戻り値型のクラスを作成する(別関数と同程度の手間がかかる)
unionを使う(非推奨)
void *ポインタを使って環境依存のコード(非推奨&キャスト必須ゆえNG)
boost::anyを使う(キャスト必須ゆえNG)
例外を使う(禁止)
何がいいんだろう。
0218デフォルトの名無しさん
2006/06/17(土) 14:09:10戻り値の型がfloatではいけない訳を聞こうか。
0219デフォルトの名無しさん
2006/06/17(土) 14:18:42仮にGetValueがfloatやlongを臨機応変に返せたとして、受け取る側はどうするつもりだよ
long l = GetValue(); // floatを返すかもしれない
float f = GetValue(); // longを返すかもしれない
0220デフォルトの名無しさん
2006/06/17(土) 14:19:21取ってきたいデータがfloatはlongと混在しているので、全てfloatで返ってきてしまうのが、
なんかスッキリしなくてですね。
0221デフォルトの名無しさん
2006/06/17(土) 14:23:400222デフォルトの名無しさん
2006/06/17(土) 14:24:56エスパーしてみると、iTypeってのがlongかfloatかを決めているのかな?
だとしたらtemplate使えばいいんじゃまいか。
0223デフォルトの名無しさん
2006/06/17(土) 14:28:01はい。Typeによって決めています。
最初テンプレート関数を使おうかと思ったのですが、私が馬鹿過ぎてほぼ使い方を忘れかけてまして...。
戻り値の型だけを変更することもできるんでしたっけ。
0224デフォルトの名無しさん
2006/06/17(土) 14:31:200225デフォルトの名無しさん
2006/06/17(土) 14:33:270226デフォルトの名無しさん
2006/06/17(土) 14:34:000227デフォルトの名無しさん
2006/06/17(土) 14:38:30出来る、が、iTypeを見て型を判別する責務をGetValueではなく、GetValueを使う側に移さないといけない。
template <class T>
T GetValue(long iIndex);
てなのを作っておいて
long l;
float f;
if (iType == /*long型*/)
l = GetValue<long>(index);
else
f = GetValue<float>(index);
のような感じの使い方なら可能だが…
0228デフォルトの名無しさん
2006/06/17(土) 14:40:07てっきり、戻す型がもっと多くて、コンパイル時にやるのが面倒だから聞いているんだと思っていた。
//ヘッダ
template < typename T >
T getValue(int idx) ;
//実装
template < typename T >
T getValue(int idx)
{
return 0 ;
}
//longとfloatしか使わないので、明示的なインスタンス化をしておく。
template long getValue(int idx) ;
template float getValue(int idx)
でもこれ、わざわざ使うときに、getValue<long>とかgetValue<float>とかしないといけないな。
面倒かも。
0229デフォルトの名無しさん
2006/06/17(土) 14:44:43オーバーロードだとこんな感じ?
戻り値にはできなくなるけど
void GetValue(long & dest, int idx) ;
void GetValue(float & dest, int idx) ;
//使い方
long x ;
GetValue(x, 0) ;
float f ;
GetValue(f, 1) ;
0230デフォルトの名無しさん
2006/06/17(土) 14:50:10> キャストや別関数を作成しないでまとめたいのです。
というのがあるし、データを特定のインデックスから取ってくるってだけでオーバーロードを使ってしまうと、
それぞれの関数の内容がほとんど同じになってしまって無駄。
この場合はtemplateが妥当だろ。
longとfloatの場合でよほど処理に差があるなら話は別だが
0231デフォルトの名無しさん
2006/06/17(土) 15:14:050232デフォルトの名無しさん
2006/06/17(土) 15:19:260233デフォルトの名無しさん
2006/06/17(土) 15:33:04いつの時代の人ですか?
とっくにできるようになりましたよ。
0234デフォルトの名無しさん
2006/06/17(土) 15:34:240235デフォルトの名無しさん
2006/06/17(土) 16:39:20一般的に、floatの方がlongより精度がないので問題が出そう。
0236デフォルトの名無しさん
2006/06/17(土) 16:42:19オーバーライドはできないなぁ。
オーバーロードならできるけど。
>>233 いつの時代の人ですか?
0237デフォルトの名無しさん
2006/06/17(土) 17:06:550238デフォルトの名無しさん
2006/06/17(土) 20:54:51D&E読めば少しは納得する気になれるかもしれない。
0239デフォルトの名無しさん
2006/06/17(土) 22:58:08初心者なのでお手柔らかにお願いします
ttp://up.spawn.jp/file/up25025.txt
0240デフォルトの名無しさん
2006/06/18(日) 01:39:43何かと思ったら計算するだけかと思いきや何で全部intなんだよ
toukasokudoの中の変数はdoubleかfloatを使うか、割り算の前に1.0を掛けておけ
0241デフォルトの名無しさん
2006/06/18(日) 01:45:08各 case 節を関数に分けるといいよ。
何度も使われてる数値入力も関数にするのがいいよ。
0242デフォルトの名無しさん
2006/06/18(日) 02:58:25#include <stdio.h>
int main()
{
int a = 10;
int b = 7;
double c = (double) (a+b)/2.0;
printf("%f",c);
return 0;
}
「10」と「7」の平均を求め、小数点以下まで正しく表示させる問題で
上のが答えで下のが自分でやったものでどっちとも同じ答えが出力されるのですが
これはこれでいいのでしょうか?
#include <stdio.h>
int main()
{
short a = 10;
short b = 7;
float c = (a+b)/2.0;
printf("%f",c);
return 0;
}
0243デフォルトの名無しさん
2006/06/18(日) 03:07:12その場合は問題は無い、ように見えるが、厳密に言うとキャスト演算子を用いる方が適切。
結果は問題なくても、処理の流れとしては (double) のある方が適切。
0244デフォルトの名無しさん
2006/06/18(日) 03:12:230245デフォルトの名無しさん
2006/06/18(日) 03:14:53それじゃ、(double) をつけずに c = a/b をやってみ。
次に c = (double)(a/b) と c = (double)a/(double)b を比較してみ。
どういう結果になるか?
各々の変数に対して (double) をつけなきゃ意味がないのが分かるよ。
a+b と変数同士が足し算だったから分からなかっただろうけど
変数同士の割り算ならどう?
0246デフォルトの名無しさん
2006/06/18(日) 03:15:240247デフォルトの名無しさん
2006/06/18(日) 03:17:210248デフォルトの名無しさん
2006/06/18(日) 03:24:450249デフォルトの名無しさん
2006/06/18(日) 03:25:31変数の定義はすべてdoubleにしちゃうぞぉ〜
0250デフォルトの名無しさん
2006/06/18(日) 03:29:43C言語:float型の精度
ttp://homepage1.nifty.com/aok2/004/c04.html
0251デフォルトの名無しさん
2006/06/18(日) 03:36:39近似値だの常用対数だの、円周率だの、そういった数値計算を扱わず
整数ばかりを扱う人にとっては気にせんでもやっていけるもんだねw
0252デフォルトの名無しさん
2006/06/18(日) 03:42:54■ このスレッドは過去ログ倉庫に格納されています