C言語なら俺に聞け! Part 123
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/02/26(日) 13:58:25質問する前には最低限検索を。
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:480003デフォルトの名無しさん
2006/02/26(日) 14:25:070004デフォルトの名無しさん
2006/02/26(日) 14:28:060005デフォルトの名無しさん
2006/02/26(日) 14:37:26コンソールで、コンパイラはgcc。Bcc32でつ。
本を何冊かみても、色分けの表示の解説がなかったのでつい書き込んでしまいました。
すみませんがよろしくお願いいたします。
0006デフォルトの名無しさん
2006/02/26(日) 14:44:07C言語じゃない
0007デフォルトの名無しさん
2006/02/26(日) 15:06:43ある何度も使用する関数内にて
int lpData[1024];
と宣言されているとします。
この場合上記ではなく
static int lpData[1024];
と宣言される場合、メモリ使用状況はともかくとしてCPUへの負荷は軽くなるものなのでしょうか
0008デフォルトの名無しさん
2006/02/26(日) 15:18:39環境依存につき、一般的には一概に言えない。
前者は恐らくスタックフレーム上に確保されるので毎回スタック操作が入るかもしれない。
しかし、だからと言って後者が速くなるとは限らない。
例えばCygwinで似たようなことをした経験から言えば、その他の変数の確保し方によっても変わった。
0009デフォルトの名無しさん
2006/02/26(日) 15:31:34うーん、そうですか
出来うる範囲で高速化を図りたかったのですが・・
とりあえず今まで通りの使い方でプログラミングしていく事にします。ありがとうございました
0010デフォルトの名無しさん
2006/02/26(日) 15:36:51だからぁ、環境書かずに答は得られないって。
つーか、環境依存スレなり各環境ごとのスレにでも行けと。
0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
2006/02/26(日) 15:42:020013デフォルトの名無しさん
2006/02/26(日) 15:42:22ロクにプログラムも組めない厨房か上級者
>>7はどっちだろうな
0014デフォルトの名無しさん
2006/02/26(日) 15:49:09俺は厨房のようだ( ゚∀゚)ハハハッハ
0015デフォルトの名無しさん
2006/02/26(日) 17:04:25高速化したいなら、実測してボトルネックを見つけろ。
0016デフォルトの名無しさん
2006/02/26(日) 20:23:46どこを計測すればよいのでしょうか?
高速化したいプログラムはメモリの初期化(0で初期化)です。
とりあえず、アセンブリ?
0017デフォルトの名無しさん
2006/02/26(日) 20:24:350018デフォルトの名無しさん
2006/02/26(日) 20:25:27C、C++の最適化について語るスレ
http://pc8.2ch.net/test/read.cgi/tech/1084676298/
0019デフォルトの名無しさん
2006/02/26(日) 22:33:45現在の処理時間がどれくらいで、それを高速化でどのくらいにしようとしているの?
0020デフォルトの名無しさん
2006/02/26(日) 23:26:05始めに目的ありき
まずどんな条件をクリアできればいいのかをはっきりさせ
測定方法などの手段はその次に考える
0021デフォルトの名無しさん
2006/02/26(日) 23:34:140022デフォルトの名無しさん
2006/02/26(日) 23:35:100023デフォルトの名無しさん
2006/02/26(日) 23:48:04・・・もっとも、入門レベルで言う「高速化」ってのは無駄に気づけってのがそもそもの目的なわけだが
0024デフォルトの名無しさん
2006/02/27(月) 00:09:420025デフォルトの名無しさん
2006/02/27(月) 00:16:57http://gtkboard.sourceforge.net/doc/doxygen/tetris_c.html
0026デフォルトの名無しさん
2006/02/27(月) 00:19:26Oh yeah! 素晴らCでーす!
0027デフォルトの名無しさん
2006/02/27(月) 03:33:00んなもんな memset() 使え。
ライブラリに任せろ。
0028デフォルトの名無しさん
2006/02/27(月) 05:15:53memsetだとバイト単位だから遅い。そんなものもわからんのか?
対象とする環境がどんなものかわからんがな。
0029デフォルトの名無しさん
2006/02/27(月) 05:37:23バイト単位とは限らない
0030デフォルトの名無しさん
2006/02/27(月) 08:28:01未最適化のmemsetをコンパイラ製作者が提供するほうが珍しいと思う。
0031デフォルトの名無しさん
2006/02/27(月) 08:54:180032デフォルトの名無しさん
2006/02/27(月) 22:12:34>バイト単位とは限らない
でも0x12345678って書き込むと0x78ばかりが書き込まれます(ビッグエンディアンの場合)
すると書き込みデータが0のときのみ最適化するのでしょうか?
ちなみにうちのPC(セレロン600MHz)じゃあまり違いがわからないので
プログラム実行中のみ割り込み禁止にしてCPUパワーを落として
アルゴリズムの違いによって処理時間が明確に違うようにできますか?
環境はWin2000でCPUはセレロン600MHzでコンパイラはBCCです。
0033デフォルトの名無しさん
2006/02/27(月) 22:17:500034デフォルトの名無しさん
2006/02/27(月) 22:18:02そうではなくてたとえば0x78をmemsetの埋める引数にしたら、
内部では0x78787878を埋める処理が行われると言う感じだろ。
memsetの埋める内容を指定する引数はint型だが、挙動はcharへ変換して使用することになっているはず。
0035デフォルトの名無しさん
2006/02/27(月) 22:18:100036デフォルトの名無しさん
2006/02/27(月) 22:25:040037デフォルトの名無しさん
2006/02/27(月) 22:34:39sprintf(s, "%I64u", Big)
とやってできたのですが、逆に文字列から大きい数にするにはどうすればいいのでしょうか?
atoi(Big)ではできないみたいです。
お願いします。
0038デフォルトの名無しさん
2006/02/27(月) 22:40:31つまり0x12345678を0x78787878にして書き込むのか?
すると配列が奇数バイトに置かれているところは・・・きちんと計算して処理してるのかな?
0039デフォルトの名無しさん
2006/02/27(月) 22:45:52データ型について具体的なbit数の話は環境依存。
【初心者歓迎】C/C++室 Ver.25【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1140963340/
0040デフォルトの名無しさん
2006/02/27(月) 22:52:20atoiを自分で実装するってのも手。それぞれの数から
'0'引いて、桁かけて足すような感じでできるんじゃない?
0041デフォルトの名無しさん
2006/02/27(月) 22:54:320042デフォルトの名無しさん
2006/02/27(月) 23:01:16てのはmem系では違ったっけ?
0043デフォルトの名無しさん
2006/02/27(月) 23:01:41どうしても駄目ならstdio.hはいいよ。
0044デフォルトの名無しさん
2006/02/27(月) 23:03:090045デフォルトの名無しさん
2006/02/27(月) 23:13:350046デフォルトの名無しさん
2006/02/27(月) 23:13:45困ったことがあるなw
LoadLibraryさえ使えれば・・・と思ったら、インポートライブラリが必要だったw
004737
2006/02/27(月) 23:45:440048デフォルトの名無しさん
2006/02/27(月) 23:52:410049デフォルトの名無しさん
2006/02/28(火) 00:21:26横だけど、VC++なんかだとCのメモリ関係の関数は、メモリ関係のwin32apiを
使っていたと思う。BCCがそうなら、結局そのAPI次第では?
あと処理系依存の話なので、こっちの方がいいかもね
http://pc8.2ch.net/test/read.cgi/tech/1140963340/
0050デフォルトの名無しさん
2006/02/28(火) 00:21:48スレ違いだけど、BCC32ではインポートライブラリが無くても、代わりにDEFファイルでインポートできる。
0051デフォルトの名無しさん
2006/02/28(火) 00:25:08いや、VC++の場合は逆で、WinAPIのメモリ関係の関数が実はマクロでC標準関数を呼んでいる。
特にCopyMemoryはDLLに実体が無く、完全にマクロだけしかないと言う具合。
もちろんVC++のmemset類はバイト単位で書き込むなんてことはしていない。
0052デフォルトの名無しさん
2006/02/28(火) 00:38:06てっきりそうなんだと思っていた。勘違いスマソ
0054デフォルトの名無しさん
2006/02/28(火) 00:58:01どうでもいいが、そんな事で高速化云々を言うことが間違い。
高速化を行うなら、
・何故、高速化を行うのか?(目的)
・全体の内、どこがボトルネックとなっているか?(現状)
と言う観点を考える必要がある。
ただ漠然と
「メモリの初期化(0で初期化)を高速化したい」
などと考えるものではない。
0055デフォルトの名無しさん
2006/02/28(火) 00:59:220056デフォルトの名無しさん
2006/02/28(火) 01:07:16そうなると、どの仕事場にいっても有効に使えそうな
自分で作ったユーティリティ関数ってあります?
もしありましたら、どのようなジャンルか教えてください。
(中身は自分で考えます。)
・・・そういう意味では高速ゼロクリアも便利関数?
0057デフォルトの名無しさん
2006/02/28(火) 01:09:440058デフォルトの名無しさん
2006/02/28(火) 01:10:450059デフォルトの名無しさん
2006/02/28(火) 01:12:330060デフォルトの名無しさん
2006/02/28(火) 01:13:070061デフォルトの名無しさん
2006/02/28(火) 03:44:22設定ファイル読み込み関数、csvセル分割関数なんてのは結構使い回している。
高速ゼロクリアなんて、使う必然性を感じたことがないので作ってもいない。
0062デフォルトの名無しさん
2006/02/28(火) 04:44:58普通はな。
まあ、0クリアとか、何か特定の値で埋めたい場合はCPUに依存した
書き方すれば絶対に速い。インラインアセンブラ機能を使ったりして
書けば速い。速いが移植性はなくなる。
0063デフォルトの名無しさん
2006/02/28(火) 20:39:24アセンブラを作ってくれるの?
それとも、アルゴリズムが最高にイカしてるの?
0064デフォルトの名無しさん
2006/02/28(火) 22:38:35処理系付属のライブラリの出来次第。
有名なものならそれなりに速いはず。
0065デフォルトの名無しさん
2006/02/28(火) 22:47:110066デフォルトの名無しさん
2006/02/28(火) 23:19:300067デフォルトの名無しさん
2006/03/01(水) 00:14:580068デフォルトの名無しさん
2006/03/01(水) 00:22:430069デフォルトの名無しさん
2006/03/01(水) 00:26:10HeapAlloc
0070デフォルトの名無しさん
2006/03/01(水) 00:29:010071デフォルトの名無しさん
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:11123を渡したらやはり"123"という文字列として渡される
0073デフォルトの名無しさん
2006/03/01(水) 00:33:45数字って数字文字列じゃないの?
0074デフォルトの名無しさん
2006/03/01(水) 00:41:48コマンドラインはすべて、文字列ですか・・・ありがとうございました。
勉強不足でした。
0075デフォルトの名無しさん
2006/03/01(水) 02:05:40どこで入手できる?
0076デフォルトの名無しさん
2006/03/01(水) 02:14:420077デフォルトの名無しさん
2006/03/01(水) 02:20:200078デフォルトの名無しさん
2006/03/01(水) 02:21:54載っているWebってありませんか?
どなたかご存知の方いらっしゃりましたら教えてください
0079デフォルトの名無しさん
2006/03/01(水) 02:49:57その関数のソースコードを書いてください。
引数の変数名はaとbとし、戻り値の変数をxとします。
解答は、算術演算子、代入演算子どちらを用いても構いません。
○与えられた整数の変数が100または200のときだけ真(true)を返し、
それ以外の場合は偽(false)を返す関数 checknum をC言語で設計し、
その関数のソースコードを書いてください。
・・・こんな問題を出されたんですが、どういう意味なんでしょうか??
どなたか教えてください・・・;
0080デフォルトの名無しさん
2006/03/01(水) 02:51:000081デフォルトの名無しさん
2006/03/01(水) 02:51:33簡潔に分かりやすく書いてあると思うけど。
0082デフォルトの名無しさん
2006/03/01(水) 03:15:52そちらに退散します!!
0083デフォルトの名無しさん
2006/03/01(水) 06:35:50records.oldというファイルを元に清算して
records.newというファイルに書き込むというのは成功したんですが
そのrecords.newをrecords.oldという名前に変更して保存したいんですが
どんな風にすればよいのでしょうか?
検索してみたらrename()という関数があるみたいなんで
rename("records.new","records.old");
とやってみましたが、全然変わらないです。
こんな時間に質問してもなんですが体育座りして待ってます。
ではお願いします。
0084デフォルトの名無しさん
2006/03/01(水) 06:46:47標準Cにファイル削除の機能は無かったはず
環境依存スレ池
0085デフォルトの名無しさん
2006/03/01(水) 08:23:420086デフォルトの名無しさん
2006/03/01(水) 09:16:12008785
2006/03/01(水) 09:22:030088デフォルトの名無しさん
2006/03/01(水) 09:25:32JM見たら確かに準拠ANSI Cって有ったな
スマソ、見落としてた
008983
2006/03/01(水) 12:06:52というか、皆さんならこんな場合どうしてるんですか?
プラットフォームに関係なく
最新のデータを清算後にリネームする場面はいくらでもあると思うんですが。
実際、自分もこの後UNIXに移さないといけないですし。
009083
2006/03/01(水) 12:29:43ttp://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まず、エラー要因の調査くらいしろ。
0092デフォルトの名無しさん
2006/03/01(水) 13:03:040093デフォルトの名無しさん
2006/03/01(水) 14:03:46WindowsならWinAPIのMoveFile類も試してみろ。
当然スレ違いだからWinAPIについて聞きたいときにはVC++やWinAPIのスレで聞くこと。
0094デフォルトの名無しさん
2006/03/01(水) 15:08:48マルチか…。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1999370
0095age
2006/03/01(水) 16:35:09のですが、70%以上が"_fini"に費やされていました。
この関数はなんなのでしょうか?(おそらくfprintf関連かと予想しています)
また、この"_fini"はfprintfの使用を控える以外には最適化する方法は
あるのでしょうか?
すいませんが、よろしくお願いします。
0096デフォルトの名無しさん
2006/03/01(水) 17:08:52>>1
>初心者なのですが
見苦しい言い訳だ。
0097デフォルトの名無しさん
2006/03/01(水) 18:25:08「自称初心者」を言い訳としか捉えられない人w
こういう人って自分にも思い当たる節があるんだろうな…。
テメーの使えねー脳みそのレベルを教える側の為の指針として明示してくれてんだよ。
例えそれが良い解決法だったとしても馬鹿にはあまり難しいこと教えても理解できないだろ?
そいつを防ぐ為の予防策だよ。ムカつくんなら教えなくていい。
0098↑
2006/03/01(水) 18:28:270099デフォルトの名無しさん
2006/03/01(水) 18:30:08プ ロ フ ァ イ ル 見 せ ろ
010095
2006/03/01(水) 18:38:52環境は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
010195
2006/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
■ このスレッドは過去ログ倉庫に格納されています