【初心者歓迎】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
0175デフォルトの名無しさん
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:540253デフォルトの名無しさん
2006/06/18(日) 03:44:35はいはい、えらいえらい。自慢はよそでやってね。ちらしの裏とか。
0254デフォルトの名無しさん
2006/06/18(日) 03:45:21整数ばっかり扱っている奴にはほとんど気にしなくてもやっていけるくらい
その問題にぶち当たらないってことを指摘したまでだが?
どうもこういう板には自分の考えに沿わない奴を排除したがる奴がいて困るw
適切か不適切かはコンピュータがはじきだしてくれるから、安心しろw
0255デフォルトの名無しさん
2006/06/18(日) 03:45:540256デフォルトの名無しさん
2006/06/18(日) 03:46:51なんなのお前ら?自分が答えられなかった、知らなかったことを知っている奴を妬んでいるように聞こえるが?
違いに気づかないくらい、整数、あるいは除算に定数を使っている奴が多いってことだろ?
やれやれ・・・お前らじゃ変数の型にすら理解していないようだ、失せろ、専門学校程度のクズ共
0257デフォルトの名無しさん
2006/06/18(日) 03:49:11>桁オチなんかされちゃ困る
誰が桁オチを良しとした?意味を理解できない低学歴ってほんっと困るねw
0258デフォルトの名無しさん
2006/06/18(日) 03:49:52失せろ、正論も言えないバカ
0259242
2006/06/18(日) 03:49:57ちょっと荒れる質問だったようで申し訳ないです
0260デフォルトの名無しさん
2006/06/18(日) 03:51:58気にせんでいいよ。キミが悪い訳ではないw
0261デフォルトの名無しさん
2006/06/18(日) 03:52:28何こいつ?自分が趣味程度にしか思わなかった程度の知識しか持ってなくて
説明を聞いて理解したとたん、小数を理解して扱う人が少ないって意見に対して
自分は小数命!みたいなレスしてんの?(プ
0262デフォルトの名無しさん
2006/06/18(日) 03:53:20そうそう、君が悪いんじゃない、桁オチを許さないって思っている頭の固い奴が
勝手に小数点以下を切り捨てても良いもんだと言った奴がいると勘違いしただけだからw
0263デフォルトの名無しさん
2006/06/18(日) 04:53:01勿論、右辺は2.0で割っている以上等価だし。
0264デフォルトの名無しさん
2006/06/18(日) 05:06:21小数を扱わない型で宣言された変数を除算で扱った場合は、モロに分かる。
厳密に言えば、 a / (double)b で a に (double) をつけなくてもいけるが
とりあえず計算式を代入する変数の型に合わせておいてもおk。
0265デフォルトの名無しさん
2006/06/18(日) 05:07:460266デフォルトの名無しさん
2006/06/18(日) 05:30:49少し依頼っぽくなるのですが、
窓立て2ってソフトがあるのですが、
ttp://www.ksky.ne.jp/~seahorse/mtate2/
どうしても立体化ボタンのダサさが気になり、替えたいのですが、
立体化ボタンがC++で直接書かれているのでどうにもなりません。
窓立てフォルダ内に置いた指定画像ファイルを
表示させるようなプログラムには出来ないんですか?
もし、そのような改造を施せるのであれば、教えてください。
0267デフォルトの名無しさん
2006/06/18(日) 08:27:530268デフォルトの名無しさん
2006/06/18(日) 08:57:45作者に頼めば?
って、既に掲示板で同じこと言ってるのか。
ソースはあるけどBCCだしなぁ。
0269デフォルトの名無しさん
2006/06/18(日) 09:38:25もうちょっとオブラートに包め
0270デフォルトの名無しさん
2006/06/18(日) 12:01:59必死な奴の特徴丸分かりで笑える。
他のスレでもよく見る奴。
0271デフォルトの名無しさん
2006/06/18(日) 12:03:370272デフォルトの名無しさん
2006/06/18(日) 13:06:530273デフォルトの名無しさん
2006/06/18(日) 15:12:15245=246=247=248=249=256=261=262とかw
0274デフォルトの名無しさん
2006/06/18(日) 15:15:59例:
164 hoge
24 hogehoge
300 hog
…
というテキストから数字と文字を取り出したいんですが、
int num;
char str[1000][128];
int count = 1;
fp = fopen("test.txt" , "r");
while( (temp = fscanf(fp , "%d %s" , &num , &str[count-1])) != EOF){
printf("line:%d\n" , count);
count++;
if(temp == 2){
printf("%d %s\n" , num , str[count-1]);
}
else{
fgetc(fp);
}
}
として、変なのが入ったら切り捨てて、戻り値が2の場合のみとりあえず表示させてみようっていうソースを書いたつもりなんですが、出力で上手く出ないようです…。
どこがまずいのでしょうか・・・
■ このスレッドは過去ログ倉庫に格納されています