トップページ⇒tech
1001コメント336KB

【初心者歓迎】C/C++室 Ver.28【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/06/09(金) 10:08:51
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※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
>>172
俺もnewかコンテナ使うけど、コンテナの機能を使わない場合、malloc()でもいいんじゃね?
ビルトインタイプなんだし。
0176デフォルトの名無しさん2006/06/15(木) 13:30:00
まあnew/deleteとmalloc/freeをごっちゃにするようなトンチキなことさえしなきゃいいんじゃね
0177デフォルトの名無しさん2006/06/15(木) 13:41:41
mallocすればreallocも使える!
0178デフォルトの名無しさん2006/06/15(木) 13:48:24
vectorよりmallocの方が、微妙に速い・・
0179デフォルトの名無しさん2006/06/15(木) 13:53:00
>>178
微妙なのかよw
0180デフォルトの名無しさん2006/06/15(木) 14:39:31
そんなにクリティカルに速度を気にする奴は、
そもそもmallocなど使わずに、環境依存のメモリ確保のシステムコールなどを使う。
0181デフォルトの名無しさん2006/06/15(木) 14:53:15
結論、Cとの互換性が必要な場合と既存のソースの流用の場合を除いて、
C++で積極的にmalloc()を使用する理由はない。
0182デフォルトの名無しさん2006/06/15(木) 15:06:32
>>172
問題になるのは、コンストラクタ/デストラクタの呼び出しの有無。

呼び出されなければならない場合、new/deleteを使用するべき。
コンストラクタ/デストラクタがなければ好みの問題。
0183デフォルトの名無しさん2006/06/15(木) 16:08:58
結局>>173が馬鹿だったっていうオチ?
0184デフォルトの名無しさん2006/06/15(木) 16:21:28
>>180
システムコールの方が c のライブラリの malloc より速い OS って
例えばどんなのがある?
01851642006/06/15(木) 17:05:49
>>167
>>168

無事解決しました。ありがとうございます。
0186デフォルトの名無しさん2006/06/15(木) 17:17:11
>>184
mallocがそのシステムコールを呼んでいるだけだったとしても、
インライン展開されない限り、mallocを呼ぶオーバーヘッドがかかる。
0187デフォルトの名無しさん2006/06/15(木) 17:20:44
>>186
理論上、1度だけ大きな領域を確保するときにはそうだね。

というような特殊事例でのバカ話は別として、
実際にはどのOSのシステムコールが、そのOSの標準的なCランタイムの
malloc より高速なの?
0188デフォルトの名無しさん2006/06/15(木) 17:22:53
ちなみに Windows はこうだ↓
http://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
>>188
まあ、そういう工夫によって、OS依存のAPIより早いという場合はあるね。
iostreamだって、内部でバッファ処理をしていて、
OSのAPIを呼び出して、ファイルに対して1バイトずつアクセスするより早いことがあるかもしれないし。
0190デフォルトの名無しさん2006/06/15(木) 18:13:53
>>188
でも近頃の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
>>193
どのレスに対するコメントか知らんが、

「だからどうした」
0195デフォルトの名無しさん2006/06/16(金) 00:17:27
多倍長整数のライブラリで MS VC++2005 で使える C++ でかかれたライブラリが
欲しいのですが、お勧めはありますか?

下のを試したんですが、VC++2003以降でいくつか古いインクルードヘッダが
なくなったせい(だと思うんですが)で、コンパイルできません。
ttp://www.vector.co.jp/soft/win95/prog/se059033.html
0196デフォルトの名無しさん2006/06/16(金) 00:33:47
>>195
これ使ってみて。
boost sandbox bigint
0197デフォルトの名無しさん 2006/06/16(金) 03:00:28
>>161さん
>>162さん
遅レスですいません
レスありがとうございます。
そういう意味だったんですか。
わかりました。ありがとうございました。
0198デフォルトの名無しさん2006/06/16(金) 03:27:37
>>195
>MS VC++2005 で使える
かどうかは確認してないけど
gmpなんてのもある
0199デフォルトの名無しさん2006/06/16(金) 09:32:43
gmpはgccでしか使えない希ガス
0200デフォルトの名無しさん2006/06/16(金) 09:59:50
>>196
bigintってまだ残っていたんだ。
正式に採用される日は来るのかな。

個人的に、単純な実装でもいいから、
多倍長整数のための、標準ライブラリは必要だと思うのだけれど。
0201デフォルトの名無しさん2006/06/16(金) 12:05:43
>>195
単にC++のヘッダーファイルが*.hになってるだけだね。
気合で修正汁
0202デフォルトの名無しさん2006/06/16(金) 18:22:39
STLのmapをイテレータでアクセスする場合、
キーでソートされていることは保障されているのでしょうか?
次のコードによる出力結果が同じであることは、保障されていますか?

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
>>202
・できる限り載せるソースはコンパイル可能なものにしてくれ。
・「出力結果が同じ」とは? 何と何が同じであることを期待しているの?
0204デフォルトの名無しさん2006/06/16(金) 18:35:50
>>203
全角空白を半角空白に置換すればコンパイル可能だと思います。
VC8のDinkumwareでは、

1 1
2 2
3 3
...

のように表示されます。
デフォルトでは比較関数はstd::lessになるのは決まっていたと思いますが、
イテレータでアクセスする場合、
こういう風にソートされた形で順々に要素にアクセスできるのが、
規格として保障されているのか知りたいのですが。
0205デフォルトの名無しさん2006/06/16(金) 18:40:34
>>202
ほんとにコンパイルできた?
2バイト空白を置換してもエラーになるんだけどなぁ。
つーか、>204のようには出力されないと思うぞ。
#少し落ち着いて自分のコードをよく見てみるか自分でコピペして味噌。
##あ、すまんが本題の「規格で保証」されているかは知らない。
###でも、その筈だけどね。
####いや、保障はしてくれないのは間違いないなw
0206デフォルトの名無しさん2006/06/16(金) 19:03:59
>>202
ttp://www.sgi.com/tech/stl/Map.html
ttp://www.sgi.com/tech/stl/SortedAssociativeContainer.html
0207デフォルトの名無しさん2006/06/16(金) 19:48:25
>>205
パッと見、elementを囲っているのがシングルクォーテーションであるって以外は問題ないコードだが
0208デフォルトの名無しさん2006/06/17(土) 00:16:35
>>199
> gmpはgccでしか使えない希ガス

ttp://www.cs.nyu.edu/exact/core/gmp/
0209デフォルトの名無しさん2006/06/17(土) 00:46:57
エラトステネスの篩を使って素数を求めるプログラムを
作ったんだけどエラーが出ます。
助けてください。
ttp://uploader.fam.cx/data/u10732.txt
02102022006/06/17(土) 00:52:23
>>205
どうも文字列リテラルをシングルクオートでくくっていたみたいです。
すみません。

>>206
読んでみましたが、どこにもmapをイテレータでアクセスすると
ソートされているかどうかなんて、書かれていないような気がします。
02112092006/06/17(土) 00:54:18
今見たらいろいろ間違ってた。
申し訳ないです。
0212デフォルトの名無しさん2006/06/17(土) 01:00:45
>>210
> and they also guarantee that their elements are always sorted in ascending order by key.
02132022006/06/17(土) 01:06:07
>>212
Sorted Associative Containerの説明のほうにあったのですか。
どうもありがとうございます。
02141952006/06/17(土) 01:58:47
レスどうも。

>>196
頑張って探したけど、見つかりませんでした><

>>201
気合入れて修正して、コンパイルはなんとか通らせることが出来ました。
サンプルプログラムも正常に動作しているみたいです。でも、警告いっぱいでちょっと不安です。

gmpの情報もありがとうございます。ドキュメント読みながら考慮してみます。
0215デフォルトの名無しさん2006/06/17(土) 02:58:57
>>214
どう探したんだ?
http://www.google.co.jp/search?q=boost+sandbox+bigint
0216デフォルトの名無しさん2006/06/17(土) 13:59:47
どなたか教えてくださいませ。

GetValue()という関数があったとして、仮引数に与えたTypeとIndexによって、
戻り値がfloatやlongとして返ってくる方法は無いでしょうか?
キャストや別関数を作成しないでまとめたいのです。

戻り値
float(or long) GetValue(long iType, long iIndex);
0217デフォルトの名無しさん2006/06/17(土) 14:04:59
>>216
思いつく方法を書いてみた。

戻り値型のクラスを作成する(別関数と同程度の手間がかかる)
unionを使う(非推奨)
void *ポインタを使って環境依存のコード(非推奨&キャスト必須ゆえNG)
boost::anyを使う(キャスト必須ゆえNG)
例外を使う(禁止)

何がいいんだろう。
0218デフォルトの名無しさん2006/06/17(土) 14:09:10
>>216
戻り値の型がfloatではいけない訳を聞こうか。
0219デフォルトの名無しさん2006/06/17(土) 14:18:42
>>216
仮にGetValueがfloatやlongを臨機応変に返せたとして、受け取る側はどうするつもりだよ

long l = GetValue(); // floatを返すかもしれない
float f = GetValue(); // longを返すかもしれない
0220デフォルトの名無しさん2006/06/17(土) 14:19:21
floatじゃ駄目な理由は特にないんですが、
取ってきたいデータがfloatはlongと混在しているので、全てfloatで返ってきてしまうのが、
なんかスッキリしなくてですね。
0221デフォルトの名無しさん2006/06/17(土) 14:23:40
確かに...破綻してました。すいません。
0222デフォルトの名無しさん2006/06/17(土) 14:24:56
>>221
エスパーしてみると、iTypeってのがlongかfloatかを決めているのかな?
だとしたらtemplate使えばいいんじゃまいか。
0223デフォルトの名無しさん2006/06/17(土) 14:28:01
>>222
はい。Typeによって決めています。
最初テンプレート関数を使おうかと思ったのですが、私が馬鹿過ぎてほぼ使い方を忘れかけてまして...。
戻り値の型だけを変更することもできるんでしたっけ。
0224デフォルトの名無しさん2006/06/17(土) 14:31:20
そういう話なら、オーバーロードで十分。
0225デフォルトの名無しさん2006/06/17(土) 14:33:27
オーバーロードじゃ駄目だろ
0226デフォルトの名無しさん2006/06/17(土) 14:34:00
え゛
0227デフォルトの名無しさん2006/06/17(土) 14:38:30
>>223
出来る、が、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
>>225
オーバーロードだとこんな感じ?
戻り値にはできなくなるけど

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
>>229
> キャストや別関数を作成しないでまとめたいのです。

というのがあるし、データを特定のインデックスから取ってくるってだけでオーバーロードを使ってしまうと、
それぞれの関数の内容がほとんど同じになってしまって無駄。
この場合はtemplateが妥当だろ。
longとfloatの場合でよほど処理に差があるなら話は別だが
0231デフォルトの名無しさん2006/06/17(土) 15:14:05
floatでいつも返して、受け取り側でキャストすりゃいいじゃn
0232デフォルトの名無しさん2006/06/17(土) 15:19:26
テンプレート関数ってオーバーライドできんだっけ?
0233デフォルトの名無しさん2006/06/17(土) 15:33:04
>>232
いつの時代の人ですか?
とっくにできるようになりましたよ。
0234デフォルトの名無しさん2006/06/17(土) 15:34:24
煽りいくない
0235デフォルトの名無しさん2006/06/17(土) 16:39:20
>>231
一般的に、floatの方がlongより精度がないので問題が出そう。
0236デフォルトの名無しさん2006/06/17(土) 16:42:19
>>232
オーバーライドはできないなぁ。
オーバーロードならできるけど。
>>233 いつの時代の人ですか?
0237デフォルトの名無しさん2006/06/17(土) 17:06:55
structにprivate指定できるのがむかつく
0238デフォルトの名無しさん2006/06/17(土) 20:54:51
>>237
D&E読めば少しは納得する気になれるかもしれない。
0239デフォルトの名無しさん2006/06/17(土) 22:58:08
等加速度直線運動についてのプログラムを書いたんですが、もうちょっとすっきりさせたいので赤ペン先生お願いします。
初心者なのでお手柔らかにお願いします
ttp://up.spawn.jp/file/up25025.txt
0240デフォルトの名無しさん2006/06/18(日) 01:39:43
>>239
何かと思ったら計算するだけかと思いきや何で全部intなんだよ
toukasokudoの中の変数はdoubleかfloatを使うか、割り算の前に1.0を掛けておけ
0241デフォルトの名無しさん2006/06/18(日) 01:45:08
>>239
各 case 節を関数に分けるといいよ。
何度も使われてる数値入力も関数にするのがいいよ。
0242デフォルトの名無しさん2006/06/18(日) 02:58:25
Visual C++ 2005 Express Edition 使ってCの勉強最近始めたっばかりなんだが

#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
>>242
その場合は問題は無い、ように見えるが、厳密に言うとキャスト演算子を用いる方が適切。
結果は問題なくても、処理の流れとしては (double) のある方が適切。
0244デフォルトの名無しさん2006/06/18(日) 03:12:23
趣味の問題だと思うがなあ。
0245デフォルトの名無しさん2006/06/18(日) 03:14:53
>>242
それじゃ、(double) をつけずに c = a/b をやってみ。
次に c = (double)(a/b) と c = (double)a/(double)b を比較してみ。
どういう結果になるか?
各々の変数に対して (double) をつけなきゃ意味がないのが分かるよ。
a+b と変数同士が足し算だったから分からなかっただろうけど
変数同士の割り算ならどう?
0246デフォルトの名無しさん2006/06/18(日) 03:15:24
>>244 そりゃ違うだろw 一個人の趣味で言語の仕様が勝手に決まったら怖いよぉ〜
0247デフォルトの名無しさん2006/06/18(日) 03:17:21
普通はintとdoubleを使う、と斜め上のレスをしてみる
0248デフォルトの名無しさん2006/06/18(日) 03:24:45
よーしパパ、long long intにlong long double使っちゃうぞ
0249デフォルトの名無しさん2006/06/18(日) 03:25:31
よーしぼくちん、キャスト演算子なんて面度だから
変数の定義はすべてdoubleにしちゃうぞぉ〜
0250デフォルトの名無しさん2006/06/18(日) 03:29:43
普段は特に気にせずdoubleを使ってるが、結構奥深いのね。

C言語:float型の精度
ttp://homepage1.nifty.com/aok2/004/c04.html
0251デフォルトの名無しさん2006/06/18(日) 03:36:39
うむ、たかが0〜1の間の細かい数値でも、数学で出てくる
近似値だの常用対数だの、円周率だの、そういった数値計算を扱わず
整数ばかりを扱う人にとっては気にせんでもやっていけるもんだねw
0252デフォルトの名無しさん2006/06/18(日) 03:42:54
小数を扱う人たちの中にも、桁オチなんかされちゃ困る人もいるんですが
0253デフォルトの名無しさん2006/06/18(日) 03:44:35
>>251
はいはい、えらいえらい。自慢はよそでやってね。ちらしの裏とか。
0254デフォルトの名無しさん2006/06/18(日) 03:45:21
誰も誰が必要とするか?については言ってないよ?
整数ばっかり扱っている奴にはほとんど気にしなくてもやっていけるくらい
その問題にぶち当たらないってことを指摘したまでだが?
どうもこういう板には自分の考えに沿わない奴を排除したがる奴がいて困るw
適切か不適切かはコンピュータがはじきだしてくれるから、安心しろw
0255デフォルトの名無しさん2006/06/18(日) 03:45:54
そこでfloatですよ!
0256デフォルトの名無しさん2006/06/18(日) 03:46:51
>>252=>>253
なんなのお前ら?自分が答えられなかった、知らなかったことを知っている奴を妬んでいるように聞こえるが?
違いに気づかないくらい、整数、あるいは除算に定数を使っている奴が多いってことだろ?
やれやれ・・・お前らじゃ変数の型にすら理解していないようだ、失せろ、専門学校程度のクズ共
0257デフォルトの名無しさん2006/06/18(日) 03:49:11
>>252
>桁オチなんかされちゃ困る
誰が桁オチを良しとした?意味を理解できない低学歴ってほんっと困るねw
0258デフォルトの名無しさん2006/06/18(日) 03:49:52
>>245は桁オチする例をモロに出したんだが・・・やっぱアホには分からんよねw
失せろ、正論も言えないバカ
02592422006/06/18(日) 03:49:57
皆さんありがとうございます
ちょっと荒れる質問だったようで申し訳ないです
0260デフォルトの名無しさん2006/06/18(日) 03:51:58
>>259
気にせんでいいよ。キミが悪い訳ではないw
0261デフォルトの名無しさん2006/06/18(日) 03:52:28
>>244=>>252=>>253
何こいつ?自分が趣味程度にしか思わなかった程度の知識しか持ってなくて
説明を聞いて理解したとたん、小数を理解して扱う人が少ないって意見に対して
自分は小数命!みたいなレスしてんの?(プ
0262デフォルトの名無しさん2006/06/18(日) 03:53:20
>>259
そうそう、君が悪いんじゃない、桁オチを許さないって思っている頭の固い奴が
勝手に小数点以下を切り捨てても良いもんだと言った奴がいると勘違いしただけだからw
0263デフォルトの名無しさん2006/06/18(日) 04:53:01
途中のレスは鬱陶しくて読んでないが、>242に関しては2進化で桁落ちが発生することはないから全く同じだな。
勿論、右辺は2.0で割っている以上等価だし。
0264デフォルトの名無しさん2006/06/18(日) 05:06:21
除算で使われている値が定数だから見た目では分からないんだよね。
小数を扱わない型で宣言された変数を除算で扱った場合は、モロに分かる。
厳密に言えば、 a / (double)b で a に (double) をつけなくてもいけるが
とりあえず計算式を代入する変数の型に合わせておいてもおk。
0265デフォルトの名無しさん2006/06/18(日) 05:07:46
っつか、(double)a/bでもいけたおw
0266デフォルトの名無しさん2006/06/18(日) 05:30:49
C++どころかプログラム自体全然知らなくて、
少し依頼っぽくなるのですが、
窓立て2ってソフトがあるのですが、
ttp://www.ksky.ne.jp/~seahorse/mtate2/
どうしても立体化ボタンのダサさが気になり、替えたいのですが、
立体化ボタンがC++で直接書かれているのでどうにもなりません。
窓立てフォルダ内に置いた指定画像ファイルを
表示させるようなプログラムには出来ないんですか?
もし、そのような改造を施せるのであれば、教えてください。
0267デフォルトの名無しさん2006/06/18(日) 08:27:53
>>266LoadImageすればできるだろ
0268デフォルトの名無しさん2006/06/18(日) 08:57:45
>>266
作者に頼めば?
って、既に掲示板で同じこと言ってるのか。
ソースはあるけどBCCだしなぁ。
0269デフォルトの名無しさん2006/06/18(日) 09:38:25
UIがダサいので変えられないかとこれ以上なく直接的に書いててわらた
もうちょっとオブラートに包め
0270デフォルトの名無しさん2006/06/18(日) 12:01:59
自作自演ひどすぎですなぁ。
必死な奴の特徴丸分かりで笑える。
他のスレでもよく見る奴。
0271デフォルトの名無しさん2006/06/18(日) 12:03:37
宿題程度の問題で数値演算やって、鼻高々な馬鹿
0272デフォルトの名無しさん2006/06/18(日) 13:06:53
りそーすはっかー
0273デフォルトの名無しさん2006/06/18(日) 15:12:15
>>270
245=246=247=248=249=256=261=262とかw
0274デフォルトの名無しさん2006/06/18(日) 15:15:59
Cの質問です。データが(数字)(半角スペースいくつか)(文字)(改行)
例:
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の場合のみとりあえず表示させてみようっていうソースを書いたつもりなんですが、出力で上手く出ないようです…。
どこがまずいのでしょうか・・・
■ このスレッドは過去ログ倉庫に格納されています