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

C言語なら俺に聞け! Part 123

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/02/26(日) 13:58:25
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 122
http://pc8.2ch.net/test/read.cgi/tech/1139570025/
0002デフォルトの名無しさん2006/02/26(日) 14:24:48
2
0003デフォルトの名無しさん2006/02/26(日) 14:25:07
お疲れです
0004デフォルトの名無しさん2006/02/26(日) 14:28:06
舞-乙
0005デフォルトの名無しさん2006/02/26(日) 14:37:26
hello world を7色でひょうじするにわどうしたらよいでしょうか?
コンソールで、コンパイラはgcc。Bcc32でつ。

本を何冊かみても、色分けの表示の解説がなかったのでつい書き込んでしまいました。

すみませんがよろしくお願いいたします。
0006デフォルトの名無しさん2006/02/26(日) 14:44:07
>>5
C言語じゃない
0007デフォルトの名無しさん2006/02/26(日) 15:06:43
自動変数についてなんですが
ある何度も使用する関数内にて
int lpData[1024];
と宣言されているとします。

この場合上記ではなく
static int lpData[1024];
と宣言される場合、メモリ使用状況はともかくとしてCPUへの負荷は軽くなるものなのでしょうか
0008デフォルトの名無しさん2006/02/26(日) 15:18:39
>>7
環境依存につき、一般的には一概に言えない。
前者は恐らくスタックフレーム上に確保されるので毎回スタック操作が入るかもしれない。
しかし、だからと言って後者が速くなるとは限らない。
例えばCygwinで似たようなことをした経験から言えば、その他の変数の確保し方によっても変わった。
0009デフォルトの名無しさん2006/02/26(日) 15:31:34
>>8
うーん、そうですか
出来うる範囲で高速化を図りたかったのですが・・

とりあえず今まで通りの使い方でプログラミングしていく事にします。ありがとうございました
0010デフォルトの名無しさん2006/02/26(日) 15:36:51
>>9
だからぁ、環境書かずに答は得られないって。
つーか、環境依存スレなり各環境ごとのスレにでも行けと。
0011デフォルトの名無しさんNGNG
autoとstaticのどっちが早いかなんて、そんなむきになるような問題なのか?
0012デフォルトの名無しさん2006/02/26(日) 15:42:02
CPUキャッシュに乗ってる可能性が高いからスタックのが早い可能性は高いな。
0013デフォルトの名無しさん2006/02/26(日) 15:42:22
高速化云々言い出すのは
ロクにプログラムも組めない厨房か上級者
>>7はどっちだろうな
0014デフォルトの名無しさん2006/02/26(日) 15:49:09
>>13
俺は厨房のようだ( ゚∀゚)ハハハッハ
0015デフォルトの名無しさん2006/02/26(日) 17:04:25
>>7
高速化したいなら、実測してボトルネックを見つけろ。
0016デフォルトの名無しさん2006/02/26(日) 20:23:46
高速化するため実測しろとのことですが単純なプログラムのため
どこを計測すればよいのでしょうか?

高速化したいプログラムはメモリの初期化(0で初期化)です。
とりあえず、アセンブリ?
0017デフォルトの名無しさん2006/02/26(日) 20:24:35
クマー
0018デフォルトの名無しさん2006/02/26(日) 20:25:27
>>16
C、C++の最適化について語るスレ
http://pc8.2ch.net/test/read.cgi/tech/1084676298/
0019デフォルトの名無しさん2006/02/26(日) 22:33:45
>>16
現在の処理時間がどれくらいで、それを高速化でどのくらいにしようとしているの?
0020デフォルトの名無しさん2006/02/26(日) 23:26:05
>>16
始めに目的ありき
まずどんな条件をクリアできればいいのかをはっきりさせ
測定方法などの手段はその次に考える
0021デフォルトの名無しさん2006/02/26(日) 23:34:14
なるべくちょっとでも速く、と言うのはあるぞ
0022デフォルトの名無しさん2006/02/26(日) 23:35:10
そんなものは無い
0023デフォルトの名無しさん2006/02/26(日) 23:48:04
ソフトウエアで可能な範囲で許して貰えたらラッキーだな
・・・もっとも、入門レベルで言う「高速化」ってのは無駄に気づけってのがそもそもの目的なわけだが
0024デフォルトの名無しさん2006/02/27(月) 00:09:42
C言語でテトリスを作りたいです、どうしたら良いでつか?
0025デフォルトの名無しさん2006/02/27(月) 00:16:57
>>24
http://gtkboard.sourceforge.net/doc/doxygen/tetris_c.html
0026デフォルトの名無しさん2006/02/27(月) 00:19:26
>>25
Oh yeah! 素晴らCでーす!
0027デフォルトの名無しさん2006/02/27(月) 03:33:00
>>16
んなもんな memset() 使え。
ライブラリに任せろ。
0028デフォルトの名無しさん2006/02/27(月) 05:15:53
>27
memsetだとバイト単位だから遅い。そんなものもわからんのか?
対象とする環境がどんなものかわからんがな。
0029デフォルトの名無しさん2006/02/27(月) 05:37:23
memsetは普通は組み込み関数として最適化されるから
バイト単位とは限らない
0030デフォルトの名無しさん2006/02/27(月) 08:28:01
というかむしろbyte単位に書き込む、
未最適化のmemsetをコンパイラ製作者が提供するほうが珍しいと思う。
0031デフォルトの名無しさん2006/02/27(月) 08:54:18
DMA転送になるんだよ
0032デフォルトの名無しさん2006/02/27(月) 22:12:34
>memsetは普通は組み込み関数として最適化されるから
>バイト単位とは限らない

でも0x12345678って書き込むと0x78ばかりが書き込まれます(ビッグエンディアンの場合)
すると書き込みデータが0のときのみ最適化するのでしょうか?

ちなみにうちのPC(セレロン600MHz)じゃあまり違いがわからないので
プログラム実行中のみ割り込み禁止にしてCPUパワーを落として
アルゴリズムの違いによって処理時間が明確に違うようにできますか?

環境はWin2000でCPUはセレロン600MHzでコンパイラはBCCです。
0033デフォルトの名無しさん2006/02/27(月) 22:17:50
俺に聞け
0034デフォルトの名無しさん2006/02/27(月) 22:18:02
>>32
そうではなくてたとえば0x78をmemsetの埋める引数にしたら、
内部では0x78787878を埋める処理が行われると言う感じだろ。

memsetの埋める内容を指定する引数はint型だが、挙動はcharへ変換して使用することになっているはず。
0035デフォルトの名無しさん2006/02/27(月) 22:18:10
( ゚д゚)ポカーン
0036デフォルトの名無しさん2006/02/27(月) 22:25:04
はい?
0037デフォルトの名無しさん2006/02/27(月) 22:34:39
64bitの大きい数を扱うとき、文字列にするには

sprintf(s, "%I64u", Big)
とやってできたのですが、逆に文字列から大きい数にするにはどうすればいいのでしょうか?
atoi(Big)ではできないみたいです。

お願いします。
0038デフォルトの名無しさん2006/02/27(月) 22:40:31
>34
つまり0x12345678を0x78787878にして書き込むのか?
すると配列が奇数バイトに置かれているところは・・・きちんと計算して処理してるのかな?

0039デフォルトの名無しさん2006/02/27(月) 22:45:52
>>37
データ型について具体的なbit数の話は環境依存。
【初心者歓迎】C/C++室 Ver.25【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1140963340/
0040デフォルトの名無しさん2006/02/27(月) 22:52:20
>>37
atoiを自分で実装するってのも手。それぞれの数から
'0'引いて、桁かけて足すような感じでできるんじゃない?
0041デフォルトの名無しさん2006/02/27(月) 22:54:32
_atoi64ってのがあるが
0042デフォルトの名無しさん2006/02/27(月) 23:01:16
引数がintでもunsigned charで表現できる値でなきゃ未定義。
てのはmem系では違ったっけ?
0043デフォルトの名無しさん2006/02/27(月) 23:01:41
<*******.h>なんて使うな。全部自分で満足いくまで鍛え上げろ。
どうしても駄目ならstdio.hはいいよ。
0044デフォルトの名無しさん2006/02/27(月) 23:03:09
外部の関数を呼び出すと時間がかかるんだよ。全部一つのコード内に書け!
0045デフォルトの名無しさん2006/02/27(月) 23:13:35
ビット演算で解決ゾロリ
0046デフォルトの名無しさん2006/02/27(月) 23:13:45
そういや前に、一切スタティックライブラリ使わないで書こうとして、画面に出力できなくて
困ったことがあるなw
LoadLibraryさえ使えれば・・・と思ったら、インポートライブラリが必要だったw
0047372006/02/27(月) 23:45:44
_atoi64でできました。ありがとうございます。
0048デフォルトの名無しさん2006/02/27(月) 23:52:41
つまりmemsetより高速にゼロクリアできるC関数を作るのは難しいということですか?
0049デフォルトの名無しさん2006/02/28(火) 00:21:26
>>48
横だけど、VC++なんかだとCのメモリ関係の関数は、メモリ関係のwin32apiを
使っていたと思う。BCCがそうなら、結局そのAPI次第では?
あと処理系依存の話なので、こっちの方がいいかもね
http://pc8.2ch.net/test/read.cgi/tech/1140963340/
0050デフォルトの名無しさん2006/02/28(火) 00:21:48
>>46
スレ違いだけど、BCC32ではインポートライブラリが無くても、代わりにDEFファイルでインポートできる。
0051デフォルトの名無しさん2006/02/28(火) 00:25:08
>>49
いや、VC++の場合は逆で、WinAPIのメモリ関係の関数が実はマクロでC標準関数を呼んでいる。
特にCopyMemoryはDLLに実体が無く、完全にマクロだけしかないと言う具合。
もちろんVC++のmemset類はバイト単位で書き込むなんてことはしていない。
0052デフォルトの名無しさん2006/02/28(火) 00:38:06
あれ、そうだったんだ。mallocとかはGlobalAllocなんかを呼んでいたから、
てっきりそうなんだと思っていた。勘違いスマソ
0053462006/02/28(火) 00:54:08
>>50
それだ!declspecばかり使っていたから、DEFファイルのことを完全に忘れてたw
今度トライしてみよう。THX!
0054デフォルトの名無しさん2006/02/28(火) 00:58:01
>>16=32?
どうでもいいが、そんな事で高速化云々を言うことが間違い。
高速化を行うなら、

・何故、高速化を行うのか?(目的)
・全体の内、どこがボトルネックとなっているか?(現状)

と言う観点を考える必要がある。
ただ漠然と

 「メモリの初期化(0で初期化)を高速化したい」

などと考えるものではない。
0055デフォルトの名無しさん2006/02/28(火) 00:59:22
高速化なんかしなくてよくね?
0056デフォルトの名無しさん2006/02/28(火) 01:07:16
ここにいる人は仕事でCをやってる人もいると思うけど、
そうなると、どの仕事場にいっても有効に使えそうな
自分で作ったユーティリティ関数ってあります?
もしありましたら、どのようなジャンルか教えてください。
(中身は自分で考えます。)

・・・そういう意味では高速ゼロクリアも便利関数?
0057デフォルトの名無しさん2006/02/28(火) 01:09:44
くだすれ化してるなw
0058デフォルトの名無しさん2006/02/28(火) 01:10:45
時にのんびり、時に激しく。
0059デフォルトの名無しさん2006/02/28(火) 01:12:33
高速ゼロクリアもいいが高速メモリライト&コンペアもおもしろくない?
0060デフォルトの名無しさん2006/02/28(火) 01:13:07
ツマラソ
0061デフォルトの名無しさん2006/02/28(火) 03:44:22
>>56
設定ファイル読み込み関数、csvセル分割関数なんてのは結構使い回している。
高速ゼロクリアなんて、使う必然性を感じたことがないので作ってもいない。
0062デフォルトの名無しさん2006/02/28(火) 04:44:58
>>48
普通はな。

まあ、0クリアとか、何か特定の値で埋めたい場合はCPUに依存した
書き方すれば絶対に速い。インラインアセンブラ機能を使ったりして
書けば速い。速いが移植性はなくなる。
0063デフォルトの名無しさん2006/02/28(火) 20:39:24
memsetをつかうと、その環境に最も適した処理になるように
アセンブラを作ってくれるの?
それとも、アルゴリズムが最高にイカしてるの?
0064デフォルトの名無しさん2006/02/28(火) 22:38:35
>>63
処理系付属のライブラリの出来次第。
有名なものならそれなりに速いはず。
0065デフォルトの名無しさん2006/02/28(火) 22:47:11
memsetの性能が気になるアプリってどんなアプリだ?
0066デフォルトの名無しさん2006/02/28(火) 23:19:30
65 が言わんとすることが痛そう
0067デフォルトの名無しさん2006/03/01(水) 00:14:58
しかし無内容なスレだな
0068デフォルトの名無しさん2006/03/01(水) 00:22:43
そう思うなら燃料投下しろ
0069デフォルトの名無しさん2006/03/01(水) 00:26:10
>>52
HeapAlloc
0070デフォルトの名無しさん2006/03/01(水) 00:29:01
コンパイラ指定でアセンブラを吐き出してみれば性能なんてすぐわかる
0071デフォルトの名無しさん2006/03/01(水) 00:29:06
すみません、質問なんですけど。
#include<stdio.h>
#include<stdlib.h>

char *strcpy(char *,char *);


main(int argc, char *argv[]){
int i,j;
char *buf;

for(i=1;i<argc;i++){
buf = malloc((strlen(argv[i])+1) * sizeof(char));
strcpy(buf,argv[i]);

for(j = strlen(buf) - 1; j>=0;j--){
printf("%c",buf[j]);
}
printf("\n");
free(buf);
}
}
文字列をひっくり返すプログラム組んだんですが、数字を入れてもひっくり
返えるんですよ。
なんででしょうか?すみません、初歩で。
0072デフォルトの名無しさん2006/03/01(水) 00:31:11
コマンドライン引数は全部文字列
123を渡したらやはり"123"という文字列として渡される
0073デフォルトの名無しさん2006/03/01(水) 00:33:45
>>71
数字って数字文字列じゃないの?
0074デフォルトの名無しさん2006/03/01(水) 00:41:48
>>72、73
コマンドラインはすべて、文字列ですか・・・ありがとうございました。
勉強不足でした。
0075デフォルトの名無しさん2006/03/01(水) 02:05:40
memsetにかぎらず、printfなどいわゆる標準関数のソースって
どこで入手できる?
0076デフォルトの名無しさん2006/03/01(水) 02:14:42
Microsoftで
0077デフォルトの名無しさん2006/03/01(水) 02:20:20
なんで入手できると思う?
0078デフォルトの名無しさん2006/03/01(水) 02:21:54
移植性のないポインタ変換といった比較的マイナーなコンパイルエラーの
載っているWebってありませんか?
どなたかご存知の方いらっしゃりましたら教えてください
0079デフォルトの名無しさん2006/03/01(水) 02:49:57
○2つの整数値を取り、その差分を得るという関数diffをC言語で設計し、
その関数のソースコードを書いてください。
引数の変数名はaとbとし、戻り値の変数をxとします。
解答は、算術演算子、代入演算子どちらを用いても構いません。

○与えられた整数の変数が100または200のときだけ真(true)を返し、
それ以外の場合は偽(false)を返す関数 checknum をC言語で設計し、
その関数のソースコードを書いてください。

・・・こんな問題を出されたんですが、どういう意味なんでしょうか??
どなたか教えてください・・・;
0080デフォルトの名無しさん2006/03/01(水) 02:51:00
宿題は宿題スレへ
0081デフォルトの名無しさん2006/03/01(水) 02:51:33
それ以上説明の仕様が無い。
簡潔に分かりやすく書いてあると思うけど。
0082デフォルトの名無しさん2006/03/01(水) 03:15:52
すみません;宿題スレというのがあったのですねorz
そちらに退散します!!
0083デフォルトの名無しさん2006/03/01(水) 06:35:50
VC++ Version5.0使用です。

records.oldというファイルを元に清算して
records.newというファイルに書き込むというのは成功したんですが
そのrecords.newをrecords.oldという名前に変更して保存したいんですが
どんな風にすればよいのでしょうか?

検索してみたらrename()という関数があるみたいなんで
rename("records.new","records.old");
とやってみましたが、全然変わらないです。

こんな時間に質問してもなんですが体育座りして待ってます。
ではお願いします。
0084デフォルトの名無しさん2006/03/01(水) 06:46:47
>>83
標準Cにファイル削除の機能は無かったはず
環境依存スレ池
0085デフォルトの名無しさん2006/03/01(水) 08:23:42
んなことない、removeがある。
0086デフォルトの名無しさん2006/03/01(水) 09:16:12
標準か?
0087852006/03/01(水) 09:22:03
標準ってなに?
0088デフォルトの名無しさん2006/03/01(水) 09:25:32
>>85
JM見たら確かに準拠ANSI Cって有ったな
スマソ、見落としてた
0089832006/03/01(水) 12:06:52
それで結局どのようにすればいいんですか?
というか、皆さんならこんな場合どうしてるんですか?

プラットフォームに関係なく
最新のデータを清算後にリネームする場面はいくらでもあると思うんですが。
実際、自分もこの後UNIXに移さないといけないですし。
0090832006/03/01(水) 12:29:43
ちなみに

ttp://www.ecs.shimane-u.ac.jp/~hamaguchi/class/c-language/c-lan_12.htm
ttp://www9.plala.or.jp/sgwr-t/lib/rename.html
0091デフォルトの名無しさん2006/03/01(水) 12:40:47
>>83
まず、エラー要因の調査くらいしろ。
0092デフォルトの名無しさん2006/03/01(水) 13:03:04
ああ。rename()とremove()は ANSI C だな。
0093デフォルトの名無しさん2006/03/01(水) 14:03:46
>>83
WindowsならWinAPIのMoveFile類も試してみろ。
当然スレ違いだからWinAPIについて聞きたいときにはVC++やWinAPIのスレで聞くこと。
0094デフォルトの名無しさん2006/03/01(水) 15:08:48
>>83
マルチか…。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1999370
0095age2006/03/01(水) 16:35:09
初心者なのですがgprofを用いて、プロファイルを見ていた
のですが、70%以上が"_fini"に費やされていました。
この関数はなんなのでしょうか?(おそらくfprintf関連かと予想しています)

また、この"_fini"はfprintfの使用を控える以外には最適化する方法は
あるのでしょうか?
すいませんが、よろしくお願いします。
0096デフォルトの名無しさん2006/03/01(水) 17:08:52
>>95
>>1

>初心者なのですが
見苦しい言い訳だ。
0097デフォルトの名無しさん2006/03/01(水) 18:25:08
出た出たw
「自称初心者」を言い訳としか捉えられない人w
こういう人って自分にも思い当たる節があるんだろうな…。
テメーの使えねー脳みそのレベルを教える側の為の指針として明示してくれてんだよ。
例えそれが良い解決法だったとしても馬鹿にはあまり難しいこと教えても理解できないだろ?
そいつを防ぐ為の予防策だよ。ムカつくんなら教えなくていい。
0098↑2006/03/01(水) 18:28:27
  真正初心者
0099デフォルトの名無しさん2006/03/01(水) 18:30:08
>>95
プ ロ フ ァ イ ル 見 せ ろ
0100952006/03/01(水) 18:38:52
>>99

環境はAMD Opteronの64bitでlinuxマシンです。
gccのversionは3.2.3です。

time seconds seconds calls ns/call ns/call name
71.51 4827.46 4827.46 8729093182 553.03 553.03 _fini
17.78 6027.56 1200.10 2504400000 479.20 479.20 main
5.66 6409.80 382.24 init_by_array
2.41 6572.50 162.70 next_state
1.57 6678.29 105.79 init_genrand
0.66 6723.16 44.87 genrand_int32
0.25 6740.28 17.12 __libc_csu_fini
0.10 6747.21 6.93 __libc_csu_init
0.06 6751.22 4.01 __do_global_ctors_aux
0101952006/03/01(水) 18:41:58
あ、すいません、見にくかったのでもう一度。
よろしくお願いします。

time seconds name
71.51 4827.46 _fini
17.78 1200.10 main
5.66 382.24 init_by_array
2.41 162.70 next_state
1.57 105.79 init_genrand
0.66 44.87 genrand_int32
0.25 17.12 __libc_csu_fini
0.10 6.93 __libc_csu_init
0.06 4.01 __do_global_ctors_aux
■ このスレッドは過去ログ倉庫に格納されています