1 :
デフォルトの名無しさん :
2006/02/26(日) 13:58:25
2
お疲れです
舞-乙
5 :
デフォルトの名無しさん :2006/02/26(日) 14:37:26
hello world を7色でひょうじするにわどうしたらよいでしょうか? コンソールで、コンパイラはgcc。Bcc32でつ。 本を何冊かみても、色分けの表示の解説がなかったのでつい書き込んでしまいました。 すみませんがよろしくお願いいたします。
7 :
デフォルトの名無しさん :2006/02/26(日) 15:06:43
自動変数についてなんですが ある何度も使用する関数内にて int lpData[1024]; と宣言されているとします。 この場合上記ではなく static int lpData[1024]; と宣言される場合、メモリ使用状況はともかくとしてCPUへの負荷は軽くなるものなのでしょうか
>>7 環境依存につき、一般的には一概に言えない。
前者は恐らくスタックフレーム上に確保されるので毎回スタック操作が入るかもしれない。
しかし、だからと言って後者が速くなるとは限らない。
例えばCygwinで似たようなことをした経験から言えば、その他の変数の確保し方によっても変わった。
>>8 うーん、そうですか
出来うる範囲で高速化を図りたかったのですが・・
とりあえず今まで通りの使い方でプログラミングしていく事にします。ありがとうございました
>>9 だからぁ、環境書かずに答は得られないって。
つーか、環境依存スレなり各環境ごとのスレにでも行けと。
autoとstaticのどっちが早いかなんて、そんなむきになるような問題なのか?
CPUキャッシュに乗ってる可能性が高いからスタックのが早い可能性は高いな。
高速化云々言い出すのは
ロクにプログラムも組めない厨房か上級者
>>7 はどっちだろうな
>>7 高速化したいなら、実測してボトルネックを見つけろ。
高速化するため実測しろとのことですが単純なプログラムのため どこを計測すればよいのでしょうか? 高速化したいプログラムはメモリの初期化(0で初期化)です。 とりあえず、アセンブリ?
クマー
19 :
デフォルトの名無しさん :2006/02/26(日) 22:33:45
>>16 現在の処理時間がどれくらいで、それを高速化でどのくらいにしようとしているの?
20 :
デフォルトの名無しさん :2006/02/26(日) 23:26:05
>>16 始めに目的ありき
まずどんな条件をクリアできればいいのかをはっきりさせ
測定方法などの手段はその次に考える
なるべくちょっとでも速く、と言うのはあるぞ
22 :
デフォルトの名無しさん :2006/02/26(日) 23:35:10
そんなものは無い
23 :
デフォルトの名無しさん :2006/02/26(日) 23:48:04
ソフトウエアで可能な範囲で許して貰えたらラッキーだな ・・・もっとも、入門レベルで言う「高速化」ってのは無駄に気づけってのがそもそもの目的なわけだが
24 :
デフォルトの名無しさん :2006/02/27(月) 00:09:42
C言語でテトリスを作りたいです、どうしたら良いでつか?
25 :
デフォルトの名無しさん :2006/02/27(月) 00:16:57
26 :
デフォルトの名無しさん :2006/02/27(月) 00:19:26
27 :
デフォルトの名無しさん :2006/02/27(月) 03:33:00
>>16 んなもんな memset() 使え。
ライブラリに任せろ。
>27 memsetだとバイト単位だから遅い。そんなものもわからんのか? 対象とする環境がどんなものかわからんがな。
memsetは普通は組み込み関数として最適化されるから バイト単位とは限らない
というかむしろbyte単位に書き込む、 未最適化のmemsetをコンパイラ製作者が提供するほうが珍しいと思う。
DMA転送になるんだよ
>memsetは普通は組み込み関数として最適化されるから >バイト単位とは限らない でも0x12345678って書き込むと0x78ばかりが書き込まれます(ビッグエンディアンの場合) すると書き込みデータが0のときのみ最適化するのでしょうか? ちなみにうちのPC(セレロン600MHz)じゃあまり違いがわからないので プログラム実行中のみ割り込み禁止にしてCPUパワーを落として アルゴリズムの違いによって処理時間が明確に違うようにできますか? 環境はWin2000でCPUはセレロン600MHzでコンパイラはBCCです。
33 :
デフォルトの名無しさん :2006/02/27(月) 22:17:50
俺に聞け
>>32 そうではなくてたとえば0x78をmemsetの埋める引数にしたら、
内部では0x78787878を埋める処理が行われると言う感じだろ。
memsetの埋める内容を指定する引数はint型だが、挙動はcharへ変換して使用することになっているはず。
( ゚д゚)ポカーン
はい?
37 :
デフォルトの名無しさん :2006/02/27(月) 22:34:39
64bitの大きい数を扱うとき、文字列にするには sprintf(s, "%I64u", Big) とやってできたのですが、逆に文字列から大きい数にするにはどうすればいいのでしょうか? atoi(Big)ではできないみたいです。 お願いします。
>34 つまり0x12345678を0x78787878にして書き込むのか? すると配列が奇数バイトに置かれているところは・・・きちんと計算して処理してるのかな?
>>37 atoiを自分で実装するってのも手。それぞれの数から
'0'引いて、桁かけて足すような感じでできるんじゃない?
_atoi64ってのがあるが
引数がintでもunsigned charで表現できる値でなきゃ未定義。 てのはmem系では違ったっけ?
43 :
デフォルトの名無しさん :2006/02/27(月) 23:01:41
<*******.h>なんて使うな。全部自分で満足いくまで鍛え上げろ。 どうしても駄目ならstdio.hはいいよ。
44 :
デフォルトの名無しさん :2006/02/27(月) 23:03:09
外部の関数を呼び出すと時間がかかるんだよ。全部一つのコード内に書け!
ビット演算で解決ゾロリ
そういや前に、一切スタティックライブラリ使わないで書こうとして、画面に出力できなくて 困ったことがあるなw LoadLibraryさえ使えれば・・・と思ったら、インポートライブラリが必要だったw
47 :
37 :2006/02/27(月) 23:45:44
_atoi64でできました。ありがとうございます。
つまりmemsetより高速にゼロクリアできるC関数を作るのは難しいということですか?
>>46 スレ違いだけど、BCC32ではインポートライブラリが無くても、代わりにDEFファイルでインポートできる。
>>49 いや、VC++の場合は逆で、WinAPIのメモリ関係の関数が実はマクロでC標準関数を呼んでいる。
特にCopyMemoryはDLLに実体が無く、完全にマクロだけしかないと言う具合。
もちろんVC++のmemset類はバイト単位で書き込むなんてことはしていない。
あれ、そうだったんだ。mallocとかはGlobalAllocなんかを呼んでいたから、 てっきりそうなんだと思っていた。勘違いスマソ
53 :
46 :2006/02/28(火) 00:54:08
>>50 それだ!declspecばかり使っていたから、DEFファイルのことを完全に忘れてたw
今度トライしてみよう。THX!
>>16 =32?
どうでもいいが、そんな事で高速化云々を言うことが間違い。
高速化を行うなら、
・何故、高速化を行うのか?(目的)
・全体の内、どこがボトルネックとなっているか?(現状)
と言う観点を考える必要がある。
ただ漠然と
「メモリの初期化(0で初期化)を高速化したい」
などと考えるものではない。
高速化なんかしなくてよくね?
ここにいる人は仕事でCをやってる人もいると思うけど、 そうなると、どの仕事場にいっても有効に使えそうな 自分で作ったユーティリティ関数ってあります? もしありましたら、どのようなジャンルか教えてください。 (中身は自分で考えます。) ・・・そういう意味では高速ゼロクリアも便利関数?
くだすれ化してるなw
時にのんびり、時に激しく。
高速ゼロクリアもいいが高速メモリライト&コンペアもおもしろくない?
ツマラソ
>>56 設定ファイル読み込み関数、csvセル分割関数なんてのは結構使い回している。
高速ゼロクリアなんて、使う必然性を感じたことがないので作ってもいない。
62 :
デフォルトの名無しさん :2006/02/28(火) 04:44:58
>>48 普通はな。
まあ、0クリアとか、何か特定の値で埋めたい場合はCPUに依存した
書き方すれば絶対に速い。インラインアセンブラ機能を使ったりして
書けば速い。速いが移植性はなくなる。
memsetをつかうと、その環境に最も適した処理になるように アセンブラを作ってくれるの? それとも、アルゴリズムが最高にイカしてるの?
>>63 処理系付属のライブラリの出来次第。
有名なものならそれなりに速いはず。
65 :
デフォルトの名無しさん :2006/02/28(火) 22:47:11
memsetの性能が気になるアプリってどんなアプリだ?
66 :
デフォルトの名無しさん :2006/02/28(火) 23:19:30
65 が言わんとすることが痛そう
しかし無内容なスレだな
68 :
デフォルトの名無しさん :2006/03/01(水) 00:22:43
そう思うなら燃料投下しろ
69 :
デフォルトの名無しさん :2006/03/01(水) 00:26:10
コンパイラ指定でアセンブラを吐き出してみれば性能なんてすぐわかる
すみません、質問なんですけど。 #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); } } 文字列をひっくり返すプログラム組んだんですが、数字を入れてもひっくり 返えるんですよ。 なんででしょうか?すみません、初歩で。
コマンドライン引数は全部文字列 123を渡したらやはり"123"という文字列として渡される
73 :
デフォルトの名無しさん :2006/03/01(水) 00:33:45
>>72 、73
コマンドラインはすべて、文字列ですか・・・ありがとうございました。
勉強不足でした。
memsetにかぎらず、printfなどいわゆる標準関数のソースって どこで入手できる?
Microsoftで
なんで入手できると思う?
78 :
デフォルトの名無しさん :2006/03/01(水) 02:21:54
移植性のないポインタ変換といった比較的マイナーなコンパイルエラーの 載っているWebってありませんか? どなたかご存知の方いらっしゃりましたら教えてください
79 :
デフォルトの名無しさん :2006/03/01(水) 02:49:57
○2つの整数値を取り、その差分を得るという関数diffをC言語で設計し、 その関数のソースコードを書いてください。 引数の変数名はaとbとし、戻り値の変数をxとします。 解答は、算術演算子、代入演算子どちらを用いても構いません。 ○与えられた整数の変数が100または200のときだけ真(true)を返し、 それ以外の場合は偽(false)を返す関数 checknum をC言語で設計し、 その関数のソースコードを書いてください。 ・・・こんな問題を出されたんですが、どういう意味なんでしょうか?? どなたか教えてください・・・;
宿題は宿題スレへ
それ以上説明の仕様が無い。 簡潔に分かりやすく書いてあると思うけど。
82 :
デフォルトの名無しさん :2006/03/01(水) 03:15:52
すみません;宿題スレというのがあったのですねorz そちらに退散します!!
83 :
デフォルトの名無しさん :2006/03/01(水) 06:35:50
VC++ Version5.0使用です。 records.oldというファイルを元に清算して records.newというファイルに書き込むというのは成功したんですが そのrecords.newをrecords.oldという名前に変更して保存したいんですが どんな風にすればよいのでしょうか? 検索してみたらrename()という関数があるみたいなんで rename("records.new","records.old"); とやってみましたが、全然変わらないです。 こんな時間に質問してもなんですが体育座りして待ってます。 ではお願いします。
>>83 標準Cにファイル削除の機能は無かったはず
環境依存スレ池
んなことない、removeがある。
86 :
デフォルトの名無しさん :2006/03/01(水) 09:16:12
標準か?
87 :
85 :2006/03/01(水) 09:22:03
標準ってなに?
>>85 JM見たら確かに準拠ANSI Cって有ったな
スマソ、見落としてた
89 :
83 :2006/03/01(水) 12:06:52
それで結局どのようにすればいいんですか? というか、皆さんならこんな場合どうしてるんですか? プラットフォームに関係なく 最新のデータを清算後にリネームする場面はいくらでもあると思うんですが。 実際、自分もこの後UNIXに移さないといけないですし。
90 :
83 :2006/03/01(水) 12:29:43
ああ。rename()とremove()は ANSI C だな。
>>83 WindowsならWinAPIのMoveFile類も試してみろ。
当然スレ違いだからWinAPIについて聞きたいときにはVC++やWinAPIのスレで聞くこと。
95 :
age :2006/03/01(水) 16:35:09
初心者なのですがgprofを用いて、プロファイルを見ていた のですが、70%以上が"_fini"に費やされていました。 この関数はなんなのでしょうか?(おそらくfprintf関連かと予想しています) また、この"_fini"はfprintfの使用を控える以外には最適化する方法は あるのでしょうか? すいませんが、よろしくお願いします。
出た出たw 「自称初心者」を言い訳としか捉えられない人w こういう人って自分にも思い当たる節があるんだろうな…。 テメーの使えねー脳みそのレベルを教える側の為の指針として明示してくれてんだよ。 例えそれが良い解決法だったとしても馬鹿にはあまり難しいこと教えても理解できないだろ? そいつを防ぐ為の予防策だよ。ムカつくんなら教えなくていい。
98 :
↑ :2006/03/01(水) 18:28:27
真正初心者
100 :
95 :2006/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
101 :
95 :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
>>100 MT法ですか・・・
_finiってmainのあとに実行される関数じゃなかったけ?
104 :
95 :2006/03/01(水) 18:55:56
>>102 すいませんでした。以下残りの部分です。
index % time self children called name
<spontaneous>
[1] 91.7 162.70 6027.56 next_state [1]
6027.56 0.00 227908589/227908589 _fini <cycle 1> [3]
-----------------------------------------------
[2] 89.3 6027.56 0.00 227908589+11005584593 <cycle 1 as a whole> [2]
1200.10 0.00 2504400000 main <cycle 1> [4]
-----------------------------------------------
29059238427 _fini <cycle 1> [3]
8501184593 main <cycle 1> [4]
6027.56 0.00 227908589/227908589 next_state [1]
[3] 71.5 4827.46 0.00 8729093182+29059238427 _fini <cycle 1> [3]
2504400000 main <cycle 1> [4]
29059238427 _fini <cycle 1> [3]
-----------------------------------------------
2504400000 _fini <cycle 1> [3]
[4] 17.8 1200.10 0.00 2504400000 main <cycle 1> [4]
8501184593 _fini <cycle 1> [3]
-----------------------------------------------
105 :
95 :2006/03/01(水) 19:03:36
>>103 はい、MT法です。とってきたのをそのまま用いているだけですが…。
>_finiってmainのあとに実行される関数じゃなかったけ?
うーん、そうなんですかね。
とりあえず、今回用いているプログラムには_finiという関数名
は見当たらないです。
106 :
デフォルトの名無しさん :2006/03/01(水) 19:04:33
C言語歴がたったの20年しかない初心者なのでわかりません。
ってことは、C++だからスレ違いかな?
ここでいうデストラクタは、C++のインスタンスが破棄される時に呼ばれるアレぢゃなくて、 何らかの後始末をするルーチンのことを総称してそう呼んでるのでは?
112 :
95 :2006/03/01(水) 19:28:37
>108,109 どうもありがとうございます。 読んだ感じでは、ライブラリと関係があるように思われるのですが、 ライブラリというのは用いていないと思います。 (#includeはmath.hとstdio.hだけです) ただ、.cのファイル10個ぐらいを直接gccでコンパイルしているのですが そういった作業に問題があるのでしょうか? すいません、正直あまりよく分かっていませんが、よろしくお願いします。
113 :
デフォルトの名無しさん :2006/03/01(水) 20:26:40
外部変数が宣言できる場所はどこですか?
114 :
デフォルトの名無しさん :2006/03/01(水) 20:30:17
116 :
デフォルトの名無しさん :2006/03/01(水) 21:01:39
>>115 ただし、参照しているところよりも上で定義されていなければならない。
117 :
デフォルトの名無しさん :2006/03/01(水) 21:11:54
宣言は関数内でもできる。定義は無理だけど #include <stdio.h> int x = 1; int main(void) { int x = 3; { extern int x; printf("%d\n", x); } printf("%d\n", x); return 0; }
CPadのLSI C−86 を使っている方で、 コマンドラインオプションのやり方がわからないので教えていただきたいです、 お願いします。ヘルプ見たのですが、どうもわからなくて・・・
>>119 [実行]->[コンパイル時パラメータ]で開く設定ダイアログの実行のタブで
入力する。
121 :
デフォルトの名無しさん :2006/03/02(木) 03:48:28
>>119 Borland C++ にすることをお勧めする
122 :
デフォルトの名無しさん :2006/03/02(木) 08:08:41
Borland C++もLSI C−86も巨大配列確保できないね?
123 :
デフォルトの名無しさん :2006/03/02(木) 08:10:40
ヴィッ・・・Visual C++ にすることをお勧めする
124 :
デフォルトの名無しさん :2006/03/02(木) 08:12:26
いっ、いや、この際Javaにしろ
>>122 Borland C++ならVirtualAlloc使えるだろ。
126 :
デフォルトの名無しさん :2006/03/02(木) 09:24:17
>>125 そんな「高レベル」な話じゃないだろ
おおかた単にスタック調整の方法を知らないだけ
127 :
デフォルトの名無しさん :2006/03/02(木) 11:14:30
printfで%を表示させたいのですが、どうすればでるのでしょうか?
%%
%%
130 :
デフォルトの名無しさん :2006/03/02(木) 11:34:36
%%
"%s", "%"
>>99 ス レ 違 い の 相 手 を す る な
134 :
127 :2006/03/02(木) 12:04:06
あざーっす!
>>127 printf( "%c", '%' );
printf("%");
printf("o/o");
printf("%\x25");
printf("÷");
#define printf hoge_printf int printf( const char *format, ...) { putchar('%'); } void main() { printf(NULL); }
printf("O/\n"); printf("/O\n");
変なコンテスト開催しないでください><
‰
それはパーミル
>>120 lcc file名 のように書いていただければありがたいのですが。
>>145 オプションはlccとファイル名の間に空白で区切って指定する。
つうか個別のコンパイラの話はスレ違い。
何故BCCで void strcpy(char *to,char *from){ while(*to++ = *from++); } と書くとWarningが出るんでしょうか。
>>147 ==を誤って=と書き間違えてないか、と警告しているわけだ
ここは初心者スレなのか?
このスレは超初心者から初心者まで、幅広く利用できるスレです
そうだよ?
154 :
デフォルトの名無しさん :2006/03/02(木) 19:15:27
サキュバスクエストなら俺に聞け
>>150 あれは制御式ってゆうんだよ
これだから学のないやつは
↓ → ゆう ← ↑
>>157 その名前を知らないからって何か困る事でも?
正規表現を使って文字列の置換をしようと思い regexecを使ってみたのですが 一行内で複数回マッチさせることができません どのようにしたらいいでしょうか?orz
とりあえずスーパーサイヤ人にでもなればいい。
>>160 pmatch[] とか使えばいんじゃないか?
>>162 ああ。そうか。ANSI C とかとは関係ないな。
regexはPOSIXだ。
ゴミみたいな雑談はOKでPOSIXはNGというのもわけのわからんスレだな
Cの標準ライブラリで遅延処理を行う関数はありませんか? forやwhileで遅延ループすると高負荷になってしまって。
sleepってPOSIXだから標準ライブラリじゃないんじゃね? 標準で同等のは無かった希ガス
sleepとかSleepとかの非標準関数に皮被せといて 処理系が変わったらそこだけ変えればいいようにしておく てのがいいと思う。 # ifdef __unix__ void delay(int time) { sleep(time); } # elif windows void delay(int time) { Sleep(time); // だっけ? } # else void delay(int time) { forやwhileで遅延ループ } # endif てな感じでプリプロセッサに切り替えさせればいい。
sleepつくりゃええやん
( ゚д゚)ポカーン
( ゚Д゚)カポーン
(゚д゚)
チャンクってみんな知ってる?
知ってる
>>170 >void delay(int time) { Sleep(time); // だっけ? }
エラー。
178 :
デフォルトの名無しさん :2006/03/04(土) 07:12:24
ANSI標準ライブラリで文字列置換をする関数はどれですか? 例えばこんな仕様のもの・・・ replace(char *dest, char *src, char *target, char *alternative) あるいは replace(char *str, char target, char alternative) など・・・何か、見つからない・・・ C++にはあるのでしょうか?
>>178 Cの標準ライブラリにはない。
C++の標準ライブラリにもそのような置換をする関数はない。
(指定した箇所を指定した文字列で置換する関数はあるが、検索して置き換えるというものはない)
1から作るのが面倒なら置換を持った正規表現のライブラリを探せばいいと思う。
>>178 strstr()/strchr()とsprintf()を組み合わせれば数行でできるよ。
>175 >176 チャンクって何ですか?
>>181 >>1 のテンプレより
>質問する前には最低限検索を。
検索しても理解できなかったんだな。
そんな低能は芯だほうがいいね。
183 :
デフォルトの名無しさん :2006/03/04(土) 11:40:50
検索しても分かりませんでした。 チャンクって何ですか?
チャンコなら知ってる
教える馬鹿が一番たちが悪い
チャンクの意味はわかったけど利用方法というか利用価値というか みなさんは普通、チャンクをどのように使用しますか? ログ?
スレ違い
189 :
デフォルトの名無しさん :2006/03/04(土) 12:00:53
わからんなら使わなけりゃいいじゃない
わからないなら必要無いという事だ。
>>187 マルチメディア系のデータの塊をチャンクと呼ぶことが多いというだけで
その質問に意味はない。質問の意図を明確にして一般スレで聞きなおせ。
>187 他人が作った昔のソースを眺めていたらLOGという名のディレクトリにチャンクに関する ソースがあった。 だから、ログの機能でつかうんじゃないの?
じゃぁそれでいいだろ。 はい、次の人。
>>178 後者はC++にある。けど(文字列ではなく)文字の置換になってるのがただのtypoならやっぱりない。
196 :
デフォルトの名無しさん :2006/03/04(土) 16:16:37
if.exeというファイルをつくってコマンドプロンプトから if と入力して実行しようとしたら 「コマンドの構文が誤っています。」 と出たんですが、なぜでしょうか? 因みにif.exeと拡張子まで入力したら実行できました。
これって何でだめなんでしたっけ? 理由が良く分かりません。 #include <stdio.h> char* aaa; void func(void){ char bbb[] = "Hello."; aaa = bbb; return; } int main(void){ func(); printf("%s\n", aaa); return 0; }
199 :
196 :2006/03/04(土) 16:30:35
201 :
デフォルトの名無しさん :2006/03/04(土) 16:32:49
#include <stdio.h> #include <float.h> int main() { double pai=3.14159265358979; int mon=2; float flt=1.2f; printf("%5.2hf\n",flt); printf("%-5.2f\n",flt); printf("%05.2f\n",flt); printf("%+08.2f\n",flt); printf("%-08.2f\n",flt); printf("%d\n",mon=3); printf("%e\n",pai); printf("%08.2f\n",pai); printf("%05d\n",mon); printf("円周率は%fです\n",pai); printf("円周率は%lfです\n",pai); printf("もう少し詳しい値は%10.8lfです\n",pai); printf("もう少し詳しい値は%15.13lfです\n",pai); printf("もう少し詳しい値は%20.18fです\n",pai); printf("円周率は%010.2f\n",pai); printf("円周率は%-10.2f\n",pai); printf("円周率は%10.2f\n",pai); return 0; } BCCでコンパイルしたら「警告 W8004 format04.c 7: 'mon' に代入した値は使われていない(関数 main )」 と出たんですが、いけない事なんでしょうか?
とーしろならどっちでもいい プロならいけない事
>>202 そうですか。
もう一つ質問ですが、
printf("%e\n",pai);の所を3.141593e+00ではなく3.141593e+000
printf("もう少し詳しい値は%20.18fです\n",pai);の所を
もう少し詳しい値は3.141592653589790007ですではなく
もう少し詳しい値は3.141592653589790000
にするにはどうしたらいいですか?
>>203 何がいけないのかを聞いてるんだろ。
つーか何故最初に2を代入した?
>>204 doubleの精度が高い環境でコンパイルして動かす。
もしくはprintf("もう少し詳しい値は%20.17f0です\n",pai);
>>205 「なにがいけないか?」ではなく「いけない事なのか否か?」を聞いてるんでしょ。
paiはねーだろpaiは
いや、多数決でいかんのは「flt」だと思う。furotoとかtan(単精度)とかがよからまし。
209 :
201 :2006/03/04(土) 16:55:38
_ ∩ ( ゚∀゚)彡 おっpai!おっpai! ⊂彡
212 :
デフォルトの名無しさん :2006/03/04(土) 17:01:00
πはギリシャ語で 英語ではpiと書く。
213 :
201 :2006/03/04(土) 17:01:03
214 :
デフォルトの名無しさん :2006/03/04(土) 17:06:17
>>213 _ ∩
( ゚∀゚)彡 おっpai!おっpai!
⊂彡
スペースアルクで調べたところ、paiは100です。
>>208 tanはだめだろtanは
つかfloatに何かくっつケロ
218 :
デフォルトの名無しさん :2006/03/04(土) 18:23:47
tan壷
/ / / / / / i' lソ /|仆リi,i ゙i, ヽ i |ヽ i! i i lヘ, i ii l .| \ \ \、 ヽ / / /'"/ / /i | / ,,イ ,| |l|| i, | ゙i, | | ゙i, li i i, | |i. |川 / | \、ヽ .\、 // ./// /i' ./ | .l//.l| | || | リ |, 从 ゙| | ヽ |l トヘ |i,ヾ川|//i \\ \, i' i // /l| /| |/イ| .ハ | || | ii ハ |lリi |/ ゙i, |!i|ヽi. | | ll|川/ノ ヽ\\ リ, | l / i / { /ソ/| .| |.| ゙| |l || | /| i | リハ |-=‐''i, ||l i i' .| ソ~= ゙i |ヽヽ i, リ, .| l/ | / .| ,メ‐'| | | | l,| ゙i,ハ .|/ | / | |メ‐| |-='"~}リ|、、| / /l//,ハ i, .|ヽ\i, | i, ||l | i!,,メ~l | i | l, |==|i、 / |/ |// -ノ{::::::::::リ:o:〉} / / /ノ / / /|| ゙i, \i, |リ i,‐|~ |:ハ | i |.|i,メ==ヾト / リ ゙/- ヽ;;;;;;|;;メ / / / (ソ / i / || ヾ ヽi ヾ ヽ,| リ i i| | |ハ ヘ、::::oヽ / ノ / // / __/ i"/ |! ヽ ヽl |、.ハヘヽヽ‐‐' ノイ/ /レ / | i' iN | ゝ、 ゙、\ /// / / / /l / l | ヾ ヽ ヽ / / // //l/ ヽ \ 、-─ニフ / /ノ////_ ゙ヽ、 \:::ノ ,,,/-‐'''"~ ̄ ̄ ̄-‐'" ̄"'''ヽ、 ゙'ヽ 、 ゙'' r'"~ / ゙i, ,,,--‐''''"~~"'‐,-‐''| | / ゙i, /‐‐、 i |,| ,,,‐'" i ,,,-/,,-'''"ヽ ,,,,-‐''-─'/ | ,,-''/ | ,,-‐'"/-'/┌‐''''/ /ノ ,,-| ,,-'ヽ/ |
/ /-‐入 ./ /''",-'''ヽメ / | /ノ ノ_,二l///" ,-''"-''"ヽ\ ,,-'" | //,, /-─l // ,,‐'"''" ゙i ヽ_,,-‐___ | / | ,,-''~ /-‐''/ /‐"~ヽ,,メ=ニ二 ̄ 、 Y ,, | ,,-'~ メ‐''"~| ,,l,,-‐'''"~--──-、,,_゙"''ヽ-、,,_゙''‐-、| / | ./ {,,-,r-''" ,-‐''~'''''─-,-、,,_゙ヽ、゙'''ヽ-、゙''ヽ、∨ } ., ' ,,,/ ‐''''~~ ̄≧-、,,, / /ヽ-、-゙''ヽ-、゙"''メ, i / /''" ,,-‐'"~ ,,,-‐''---、,/_ ゙/ヽ-、 ̄"'ヽi | . i / ,,,,/~ ....::::::.:.. \、/ ゙/ヽ、 ヽ. | .{ ,,-'''i'" エ二,,,,,,,,,,,,,,;;;;、,,;).:.:.:: ゙ヾ、 / ゙メ、ヽ. | "i, ,,-イ‐/ヽ ___,,,,,-‐':.:.:.:.:.: \、 ノ /ヽ, ノ ∨~ |''"/''ヽ ,-'゙i ヾ / l ゙i, ‐'" |// ゙メ、 ,/// ゙、 ∧ソ./} }
>219-220 おもわず、ちんこがたちました
かちんこちんのちんこ
224 :
デフォルトの名無しさん :2006/03/04(土) 19:30:27
些細な質問でスミマセン・・・。 下のA.txtをインプットすると、B.txtがアウトプットされるC++プログラムを作りたいです。 while{ }を使うことも条件ですが、なかなかうまくイキマセン・・・。 while{ }で文字カウントする方法を中心に教えてください。 A.txt の内容------------------- ll chA chI ll chU chE ll chO jyo ll shi shu ll she sho l nyi nyu nyo ------------------------------- ↓↓ ↓↓ B.txt の内容------------------- 母音の数、行数、文字数。 Number of a's: 1 Number of e's: 2 Number of i's: 3 Number of o's: 4 Number of u's: 3 Number of lines: 5 Number of characters: 68 -----------------------------------
マルチポスト市ね おまえみたいな奴は社会に出てもお荷物になるだけだから
C言語習得した事によって、何ができる?
227 :
デフォルトの名無しさん :2006/03/04(土) 20:38:01
>ランタイム ライブラリ リファレンス >NULL > >NULL は、多くのポインタ演算およびポインタ関数で使用される NULL ポインタの値です。 MSDN殺す
タブ区切りのデータ(数値のみ)で列数が任意数あるファイルを読み込むとき、 sscanfでやるのは限界があるような気がします。 そこで考えたのが、sprintfの反復試行による分割なのですが、効率を考えると気が進みません。 定石ともいえる方法はどんな方法でしょうか?
↑ごめんなさい。 タブ区切りで配列に入れることが目的です。
データの先頭のポインタ覚えといてstrstrでスキャンしながら切り出していく
訂正:一文字ずつコピーしながら区切りのタブを検索していく。
>>226 ウィルスの作成、スパムツールの作成、ワームの作成、
>>231 ありがとうございます。
マジっすか、もうちょっと調べてみます。
>>232 ありがとうございます。
勉強するのやめます。
236 :
デフォルトの名無しさん :2006/03/04(土) 21:24:44
sscanfをやめてfscanfで一つづつ読む。 ただしこれだと行末に来たのかどうかが分からない。
調べる間に書き終わるだろ・・・
1行読み込む(やり方は適宜調べよ)。末尾位置を退避。 \tを\0に変換。 先頭をatoi。strlen+1だけ後ろにずれる。…というのを末尾まで繰り返す。
>\tを\0に変換。 イミナサス
>>235 結構好きだw
アセンブリも使えるようになりたい俺
エディタは何使ってる?
vi
vim
xyzzy
emacsよりvi派です。
XXYBA
ゴミみたいな雑談はOKでPOSIXはNGというのもわけのわからんスレだな
249 :
デフォルトの名無しさん :2006/03/04(土) 23:50:53
>>228 strtok() で分割したトークンに対して sscanf() で変換するというのを
繰り返せばいいのではないだろうか。
250 :
デフォルトの名無しさん :2006/03/04(土) 23:56:19
>>226 OS作成。組み込み用マイコンなどのROM作成。普通のアプリ。
など、たいていのことは出来てしまうが、大規模なソフトを作る
場合は注意が必要。というか、何でもCで出来るからといって
何でもCを使うのはやめとけ。
strncpy(d, s, n); *((char*)d+n)=0; を1命令でやってくれる関数ないですか?
>>251 一命令でこなす関数と言うかCPUはシラね
つ【strlcpy】
>>251 sprintf(d, "%.*s", n, s);
トーシローが適当に書いてみるテスト *(strncpy(d, s, n) + n) = 0;
strncpy(d, s, n)[n] = '\0';
>>252 サンクス。BSD系のものですね。
しかし何でWikipediaに載ってるんだw
autoconfを活用すればどの環境でも使える
257が理解せずに書いてるように思えて仕方がない
/*
260 :
デフォルトの名無しさん :2006/03/05(日) 01:44:59
スレ違いだったらすいません。 C言語でプログラムを作り、H8マイコンに入力して、オシロスコープに 文字(アルファベットなど)を表示させるという実験をしているのですが、 どう考えたらいいか分かりません。sin波形や円は出せたのですが、文字に ついてはサッパリです。どなたか分かる方、考え方を教えて下さい。
スレ違い。 プログラム関係ない
オシロスコープに文字を表示させることじたい無謀な気がするんだが・・・
>>263 今ググって見たがそんな機能がついてるものがあったなんて・・・
>>264 機能なんて必要ないって。
オシロの基本の機能だけでできる。
266 :
260 :2006/03/05(日) 02:01:30
ちょっと質問が悪かったです。 文字というのは、H8マイコンの出力をオシロで観測して、波形の 組み合わせで作るという事です。 また、この質問について、どなたかスレ誘導お願いします。
せめて制御系スレに行ってください。
269 :
260 :2006/03/05(日) 02:14:48
ドットでなら線は書けました。
270 :
デフォルトの名無しさん :2006/03/05(日) 02:15:38
すごい久しぶりにCのプログラム書くんでちょっとかなりうろ覚えなところがあるんで教えて欲しいのですが struct LIST{ int val; struct list *next; } ; main() { struct LIST root, *p; p = &root; p->val = ...; for(;;){ if((p->next = (struct LIST *)malloc(sizeof(struct LIST))) ==NULL){ printf("malloc error\n"); exit(1); } p = p->next; p->val = ...; p->next = NULL; } } この自分と同じ型へのポインタを持つやつの扱い方がなんかあやふやなんですが なんか書いててすごく違和感があるんですがこの書き方は変で普通こう書くって部分はありますか? (実際に書いてるのはこのデータ構造ではないのでこの場合特有というのではなく、一般的な話で)
>>270 >struct LIST{
>int val;
>struct list *next;
>} ;
普通も何も、struct LIST * next;じゃないの?
>main()
これは int main()だろうな。
272 :
デフォルトの名無しさん :2006/03/05(日) 02:21:00
すみませんが、プログラムを簡単に説明していただけないでしょうか?
273 :
デフォルトの名無しさん :2006/03/05(日) 02:23:41
普通はそのrootからして全部malloc()しないか? まあ、しなくてもいいんだが、最後のfree()でrootだけ特別扱いになる。
274 :
デフォルトの名無しさん :2006/03/05(日) 02:38:29
普通は struct LIST *root = NULL; だよな。
275 :
270 :2006/03/05(日) 02:43:44
276 :
デフォルトの名無しさん :2006/03/05(日) 02:49:08
中規模な数値計算プログラムを書いています。 実際はケースバイケースだとは思いますが、 VisualC++8[高速化オプション]+Pentium4 PCの場合 a+b と a*b の実行速度は大体何倍くらい 違うんでしょうか?
自分で測定汁
278 :
デフォルトの名無しさん :2006/03/05(日) 05:02:07
プログラムのプの字も分からないくらいのど初心者が、 それこそ基礎の基礎から分かるようなC言語の参考書などありますか?
無い
プの字もってコンパイラもIDEも隣家も何それ状態だろ 初期の俺がそうだったからわかる
281 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/05(日) 05:57:09
12倍ぐらいじゃない
そんなにいかねーよ、2倍だろ
>>249 それかっこいいですね!使わせていただきます!
*/
288 :
デフォルトの名無しさん :2006/03/05(日) 11:18:35
289 :
デフォルトの名無しさん :2006/03/05(日) 12:13:22
「!=」を入力するの大変なんだけど。 右小指でシフト押して「!」、左小指でシフト押して「=」。あほか
左親指で左シフト押したまま左薬指で!、右中指で=
Delphiなら<>ってかけるぞ。乗り換えろ。
でふぁいんしる
どうやるの
#define not_eq !=
これで<>
296 :
デフォルトの名無しさん :2006/03/05(日) 16:20:22
Cファイルのファイル名に規制とかある? 全角使っちゃだめとか、文字数制限とか
それOS依存 Winならパス込みで256文字以下でスペース・全角込みでもOK
OSとかコンパイラに依存。 MS-DOS/Windows16ビット版は最大8文字だった。
299 :
296 :2006/03/05(日) 16:42:25
おまいら、コンパイラ何使ってる?
High C
Machine C あ、コンパイラじゃねえ
304 :
:2006/03/05(日) 17:50:45
C言語におけるプログラムのスッタク領域に積まれるアドレスで ローカル変数、関数の引数、リターンアドレス、ebpレジスタの保存値が 挙げられますが、このebpレジスタの値とは、main関数やユーザー定義関数等 での始まりのアドレスの値の事を指していると言う解釈でよろしいでしょうか? どなたかebpレジスタの値について、大まかな説明をして頂けませんか?お願いします。
すいません名前消し忘れました。あとスタックでした。申し訳ないです
(・∀・)スッタク!!
ebpレジスタで検索かけた上で聞いてるのか?
308 :
304 :2006/03/05(日) 17:59:25
すいません自己解決してしまいました。スルーして下さい。
>>304 アセンブラ系のスレの方がいいかもね。
うろ覚えで間違っているかもしれないけど、ebpは積まれている
現在のアドレスだったような気がする
310 :
304 :2006/03/05(日) 18:00:40
>>307 なんとなく理解できました。すいませんでした・・・。以後気をつけます。
311 :
304 :2006/03/05(日) 18:02:22
>>309 わざわざありがとうございます。すいませんでした。本当に申し訳ないです
312 :
309 :2006/03/05(日) 18:07:36
やべーespと勘違いしていた(汗) でも自己解決したならいいか。スレ汚しスマソ
アーキテクチャ依存の話をするな
脊髄反射乙
315 :
デフォルトの名無しさん :2006/03/05(日) 20:17:22
エスパーの話はするくせに
無理やり開いてアプリと関連付けろ
>何が原因でしょうか? >Visual C++ 2005 Express Editionを導入して >削除した から
元に戻すにはどうしたら?
どうしてみんな後藤さんを嫌うの?
>>319 Microsoft .NET Framework 2.0
Microsoft .NET Framework 2.0 日本語 Language Pack
この二つ消してみ
ITブームに乗って人財産稼ぎたく C言語という物を始めてみたいのですが OSの入れ方が分かりません。 何が原因でしょうか?
>>323 なんでC言語始めるのにOSの入れ方聞くの?
326 :
324 :2006/03/05(日) 21:14:58
>>325 寂しい人生おくってんだね。女房の尻にしかれてこんなところでしかストレス発散できない。
がんばれ。応援するよ。
328 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/05(日) 21:29:20 BE:255945555-
フォルダオプションで関連付け弄れよ。スレ違いっていうか板違い。
あらゆる物の入り口でつまずいて中には入れなさそうな316に幸あれかし
やっと元に戻りました(´・ω・`)
ちっ戻りやがったか
慌てるな、まだ振り出しに戻っただけだ
俺はVC++のCファイルのアイコン好きだけどな まぁ関連付けは標準エディタにしてるけど
関連付けしたアプリ以外が持つアイコンでも良いんだけどね
別に関係ないしね
memcpy(buf+len,buf,len) でlenはbufの長さなんだが上の場合bufの最後の要素を保持する メモリの次からbufの内容がもう一個続くという解釈でよい?
は?
いいんじゃない? lenが本当にbufの長さなら、バッファオーバーラン確実なわけだが
buf+lenって何よ
あ・・・lenって整数かスマソ
ポインタ演算ですがなにか?
>>338 bufの大きさはlenの2倍以上あり、
memcpyする前にbufのうち有効なデータを保持しているのはlen分だけだということでは?
まだbufが(unsigned?) char*だと決まったわけじゃねえし、何とも言えないなあ。
なぜ質問してる奴そっちのけでエスパーごっこしてるのか分からん。
エスパーごっこって何?
>なぜ 暇だから
もっとポップでクールでセクシーでワイルドな質問を持ってきてくれよ。
printf(const char * __format, ...); こうゆう宣言はどうゆう意味なの?
350 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/06(月) 00:46:16
可変長引数。 第1引数は形式の通り。第2引数以降は、主に第一引数で与えられたパラメータで指定される。 printfの場合、%dとか%sとかの書式を判断して、第2引数以降をスタックから取り出している。 第1引数の書式を間違える第2引数以降の解釈がおかしくなる危険を伴う、諸刃の剣。 素人にはお勧めできない。
Thanks ☆☆** v( ̄ー ̄)v**☆☆ Thanks
まぁスタックとは限らないがな
スタックトレースを自作しようと思うのだが、 何をすればいいんだ? エロいお前ら教えてくれ。
環境依存なのでスレ違い
標準関数の自作方法みたいの載ってるサイトないですか?
>>355 ・newlibのソースを読む
・Cマガの実用ライブラリ開発講座の連載を見る
357 :
デフォルトの名無しさん :2006/03/06(月) 05:50:32
>可変長引数。 引数個々の長さを変更できたりはしないんだが・・・ もしかして可変個数引数のことか? # 可変長と不定長を混同する奴がときどきいるが、それ以前だな・・・
別に可変長引数で意味は通る気がする。 むしろ可変個数引数っていう言い方のが聞きなれない。
359 :
デフォルトの名無しさん :2006/03/06(月) 06:26:59
すまん。ちょっと助けてください。 char型の変数から一文字ずつ取り出して行きたいのだが、どのような方法があるのでしょうか? ファイルじゃないのでfgetじゃできなくて困っています。
360 :
デフォルトの名無しさん :2006/03/06(月) 06:31:05
>別に可変長引数で意味は通る気がする。 ^^^^^^^^^^^ 俺用語の典型だなw
char型の変数には一文字しか入ってませんが
個でも長でも俺用語だよ 可変引数(variable argument)ですから 可変.{0,2}引数程度なら俺は理解してやるよ
>>359 char型の変数には最初から1文字しか入ってないから
迷うまでもない
charの配列って事なら char data[256], *p = data; for(i=0; i<10; i++) printf("%c\n", *p++); とかこんな感じ
>>364 forでやるならいちいちポインタ使わなくても
for(i=0;i<10;i++) printf("%c\n",data[i]);
で良くないか
ポインタを使うにしても、せめてこうしようと思う。 for (; *p != '\0'; ++p)
>>363 複数バイト文字は無視していいのか? いいならいいんだが。
368 :
デフォルトの名無しさん :2006/03/06(月) 15:31:08
どうすればC言語の中級者っていえますか?
369 :
デフォルトの名無しさん :2006/03/06(月) 15:35:30
普通に喋れる人なら「しーげんごのちゅうきゅうしゃ」くらい言えます。 勇気を出して言ってみましょう。
文法と標準ライブラリを諳んじて 一つのプロジェクトで5万行以上、総数20万行のコードを書いたら。
371 :
デフォルトの名無しさん :2006/03/06(月) 15:38:08
(>∀・)<C言語の中級者です!! ・・・じゃなくて入門書をクリアしたあとは、どんなプログラムをやっていけば いいのですか?
372 :
デフォルトの名無しさん :2006/03/06(月) 15:39:37
>>370 そんな高レベルで中級者ですか・・・。実務経験ないので無理ですね。
では標準ライブラリの使いこなしを覚えていくのが吉という事ですね?
373 :
デフォルトの名無しさん :2006/03/06(月) 15:42:49
無視しないでオシエレ。
やりたい物、やらなければいけない物が無いのに、なんでプログラムなんてやるの?
Cファイルのファイル名にチルダ~を使っても大丈夫ですか?
sizeof ↑なんて読むの?
さあもりさがってまいりました
>>375 それはOS次第だがたいていは大丈夫。
ただエディタのテンポラリファイルとかに使われるから
間違って消されても知らないぞ。
379 :
デフォルトの名無しさん :2006/03/06(月) 15:56:28
しっかり無視か。サイズオブに決まってんだろ。他にどう読むのか知りたいね。
他人に聞かなくても、次に何をやればいいのか 自分で調べられるようになったら、中級者。
381 :
デフォルトの名無しさん :2006/03/06(月) 15:59:37
>>380 うまい言葉ですね。わかりました。結局は自分で頑張るのが普通という事でしたか。
ありがとうございました。
382 :
376 :2006/03/06(月) 16:20:44
#include <stdio.h> int main(void) { char str[64]; fgets("str",64,stdin); puts("str"); return 0; } 質問なんですが、これを実行すると出力文字が文字化けして表示されます。 原因はなんですか?
>>378 間違えました。
Cファイルを保存しておくフォルダの名前です。
"str"は文字列 strは変数 ""取っ払え
>>388 あっ!!実行できた!!!ダブルクォーテーションでしたか・・・。
初歩ミスすいません。ありがとうございました。
>>389 Perlでも効率悪いからこんな書き方すべきじゃない
>>386 なるほど。そういう見方があるか。
たいした洞察力だな、おまいはw
UNIXやLinuxのシェルユーザーかも知れ
puts( &1["\0aiueo"] ); どうやっても文字が表示されてしまいます どうすればいいんでしょうか?
puts( &0["\0aiueo"] );
こんなソース書いてるやついたら殺したくなるな
ここまで何をしようとしているかわからないコードは初めて。
アドレスを表示したいのかとESPを使ってみる
401 :
デフォルトの名無しさん :2006/03/06(月) 21:03:36
よーーーし、おまいら、まずは質問の前に童貞を捨てろ、つまる話が 「初めてのC」を理解してから出直せってことだ、わかったか?
>>393 ,401
どう見ても釣りです
本当にありがとうございました
403 :
デフォルトの名無しさん :2006/03/06(月) 21:16:26
>>402 釣りの意味わかってないだろ?単なるボケで釣りかよw
>>393 puts( &1["\0aiueo"] );
↓
/* puts( &1["\0aiueo"] ); */
#define puts(x) puts( &1["\0aiueo"] );
'a'を表示したいのかも?
408 :
デフォルトの名無しさん :2006/03/06(月) 21:48:13
>>407 んじゃこうか?
putchar("aiueo"[0]);
ていうか[]の中に定数使うなら putchar('a'); でいいな。
410 :
デフォルトの名無しさん :2006/03/06(月) 21:57:54
狭いグループでのみウケるネタを全世界に放映して得意がってるアフォハケーン
もともとプログラミングネタでウケる人間なんて微々たるもんなんだから目くそ鼻くそ
何やってるのか分からないから教えて欲しい。
413 :
デフォルトの名無しさん :2006/03/06(月) 22:05:31
世界中の「微々たる人々」にどのくらいウケるか平均レベルを知らないだけだろ
414 :
デフォルトの名無しさん :2006/03/06(月) 22:07:47
415 :
厨房 :2006/03/06(月) 22:17:21
C言語ってなに?
416 :
デフォルトの名無しさん :2006/03/06(月) 22:24:36
>>415 メジャーなプログラミング言語の1つ。
最近はどちらかというとC++/Java/C#への足がかりに勉強する奴が多い気がする。
C言語、それは男のロマン
C言語かっこいい!!
420 :
デフォルトの名無しさん :2006/03/06(月) 23:15:14
C言語の入門書を読んで、感想文を書かなきゃいけないんですけど ・・・・・・・・・・・・・・何を書きゃいいんだ?
>>420 printf("C言語はつまらない。\n");
>>420 MsgBox("時代はVBだと思った。")
423 :
デフォルトの名無しさん :2006/03/06(月) 23:20:00
レスありがとう! でもそれだと感想文1行で終了だよ。。。はぁ。。。
424 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/06(月) 23:24:05 BE:184280663-
426 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/06(月) 23:34:55 BE:491414786-
VC++でもGCCでも__fastcall指定してても強制__cdeclですが。
427 :
デフォルトの名無しさん :2006/03/06(月) 23:56:01
C89で規格化されてるstdarg.hのマクロはスタック操作を前提としてる。
標準規格に従ってる処理系ならスイッチに関わらず引数の個数が可変な関数はスタック渡しになる。
>>352 は無知だろう。レジスタ渡しだけで済むのは引数の個数が決まってる場合だけだ。
>>427 お前の脳内規格はどうでもいいんだけど。
JISにあるC言語の規格書を見ようと思ったんだが 。。。ただ今、ファイルを開いております。 しばらくお待ちください。 と出たまま見れない この症状は俺だけかな? 去年は見れたんだけど・・・
430 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 00:13:16 BE:153567353-
気紛れでGCCのソース取ってきてるんでいろんなアーキ向けのstdarg.h見てるけど どうみてもスタック実装です。本当にありがとうございました。
431 :
デフォルトの名無しさん :2006/03/07(火) 00:18:13
規格では実装はスタックに限定していないが実質ほぼスタック実装、でFA
>>242 Google先生が多数決を取った結果は↓こうなった。
可変引数 の検索結果 約 60,400 件中 1 - 10 件目 (0.23 秒)
可変長引数 の検索結果 約 27,100 件中 1 - 10 件目 (0.13 秒)
可変個引数 の検索結果 約 19,400 件中 1 - 10 件目 (0.28 秒)
可変個数引数 の検索結果 約 606 件中 1 - 10 件目 (0.17 秒)
可変引数リスト の検索結果 約 113 件中 1 - 10 件目 (0.85 秒)
# ちなみに、漏れは「可変個引数」派
スタックマシン以外ではCを実装しちゃいけませんか、そうですか。
"可変引数"だと911件という罠
435 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 01:09:09 BE:122854043-
アキュムレータマシン・レジスタマシン・スタックマシンなんて区別って、いまどき意味あんのかなぁ。 PowerPCなんかにもスタック専用レジスタはないけどソフト的にスタック作って管理してんじゃん。 push/pop専用命令があるかどうかなんて問題じゃないと思うんだ。
436 :
429 :2006/03/07(火) 01:30:03
437 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 01:39:55 BE:429988267-
438 :
デフォルトの名無しさん :2006/03/07(火) 02:26:46
>>427 自動変数をスタックに作らなくても実現は出来る。
引渡す時にとにかく引数が列んでいればいい。
スタック構造のデータを使うとしても、それがCPUの
持つスタックレジスタを利用したものでなくても良い。
実際のところ、リターンアドレスまで入っている場所を
バッファオーバーフローをチェックしない言語の変数
領域として使うというのは危ない設計のように思える。
せめてリターンアドレスと関係ない所に作った方がいい
んじゃないだろうか。
439 :
デフォルトの名無しさん :2006/03/07(火) 02:47:07
>>432 アフォが多いのはわかったよ
だが、どうあがいても誤りは誤りであって
言葉遣いがおかしいのを指摘されて
まだ正式名を調べずに必死で突っぱるだけな
DQN ぶりはとりわけム板では痛いだけ
>>436 でも紹介されてるJISによるC言語の規格書では
「可変個数の実引数」と呼ばれてるよ
K&Rほど一般的ではないかもしれないが、JISの規格書だしこっちが正統だと思うんだが
可変個数 の検索結果のうち 日本語のページ 約 60,600 件中 1 - 50 件目 (0.57 秒)
>>439 K&Rが正式とは限らない
m9(^Д^)プギャーーーッ
442 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:10:38 BE:214994737-
>>438 パラグラフ1の意味するところが
ハードウェアの提供するプログラムスタックでも、コンパイラあるいはランタイムの生成した
ソフトウェアスタックでもないそれ以外のものを独自実装するっちう意味なら、ちと賛同しかねる。
ハードやOS依存の手続きが必要になるので標準Cから大きく外れるやん。
> 実際のところ、リターンアドレスまで入っている場所を
> バッファオーバーフローをチェックしない言語の変数
> 領域として使うというのは危ない設計のように思える。
あと、これもちょっと違う希ガス
変数どこに置くか云々の問題じゃないと思う。
たとえばレジスタにヒープ領域のアドレスを入れ、ヒープに引数リストを置く、とかやったとしても、
結局はスタック上にリターンアドレスが置かれるわけで、バッファオーバーランによる
リターンアドレス書き換えの問題は解決のしようが無い希ガス。
【こんな風にデータが並んでますよの図】
バッファ→
■■■■■■■■■■□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□■■■■■■■■■■
←スタック
VC++はコンパイルオプションでバッファオーバーランを検出するCookieを設定できたと思う。
最近はハードやOSレベルでも保護機能(DEPとかNXとかXDとかいうやつ)実装してるし。
443 :
デフォルトの名無しさん :2006/03/07(火) 03:11:45
>>440 「の」が入るようになったのね
邦訳が変わったのは気付いていなかった、これは失礼
案の定、実引数ではなく仮引数の場合もあるのは変わってないようだが
444 :
デフォルトの名無しさん :2006/03/07(火) 03:21:12
ちなみに "可変個数" の検索結果 約 285 件中 1 - 10 件目 (0.07 秒)
445 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:21:30 BE:460701959-
>>441 K&Rって共立出版のアレのこといってるんだよね。
アレただの訳本じゃね?
ちなみに
"可変長引数" の検索結果 約 11,100 件中 1 - 10 件目 (0.22 秒)
"可変引数" の検索結果 約 911 件中 1 - 10 件目 (0.11 秒)
"可変個数" の検索結果 約 285 件中 1 - 10 件目 (0.29 秒)
大学の教授には「可変長引数」って習った気がしたけどなおいらは。
もっともLISPとか研究で使ってる先生だけど。
何の実装だったかは忘れたが、可変個数の引き数をレジスタに積めるだけ積むのがあったな。 通常使うような、printf("%d:%s\n", foo, bar);程度なら全てレジスタで済むわけだ。 元々>352は>350をさしてスタックとは限らないと言っているわけで、 >350を改めて読むと第二引き数はスタックからのみ取り出すように読める。 68kのある実装では、コードスタックとデータスタックを分けていたし、 コードスタックが保護領域内ならバッファオーバーランで破壊しようがない罠。
447 :
デフォルトの名無しさん :2006/03/07(火) 03:24:52
大学教員には教育者としての良識を疑わざるをえない人が残念ながらよくいるね だからかな? 他言語の話を唐突に持ち出して強弁する人材が育つのは
448 :
デフォルトの名無しさん :2006/03/07(火) 03:28:12
>>442 こうすれば?
□□□□□□□□□□□□□□□□
□□□□□□■■■■■■■■■■←スタック
●●●●●●●●●●●●●●●●←コード(リードオンリー)
●●●●●●●●●●●●●●●●(書き込みアクセス不可)
●●●●●●●●●●〇〇〇〇〇〇
バッファ→
■■■■■■■■■■□□□□□□
□□□□□□□□□□□□□□□□
まあ、指導者の影響はすごく受けやすいけど・・・
450 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:31:42 BE:276421739-
つか、ポインタ操作をマクロでラップしてるだけに見えるんだけど、レジスタ操作って ASM叩かずにできるわけ?できても独自拡張丸出しじゃね? スタックオンリーのほうが実装エレガントじゃね? うい "可変長引数" "C言語" の検索結果 約 775 件中 1 - 50 件目 (0.38 秒) "可変引数" "C言語" の検索結果 約 520 件中 1 - 50 件目 (0.37 秒) "可変個数の引数" "C言語" の検索結果 約 96 件中 1 - 50 件目 (1.96 秒)
451 :
デフォルトの名無しさん :2006/03/07(火) 03:34:35
452 :
デフォルトの名無しさん :2006/03/07(火) 03:39:11
>>442 OS依存の手続きはC言語とは関係のない話だ。
間にラッパーのライブラリ入れればいい。
それが嫌ならOSごと全部再コンパイル。
453 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:39:53 BE:358323375-
454 :
デフォルトの名無しさん :2006/03/07(火) 03:42:50
すげえ、工業規格が宗教かい
JIS規格ってあれだろ? "ナル文字"とかいう言葉使ってるやつだろ?
456 :
デフォルトの名無しさん :2006/03/07(火) 03:45:25
もともと不毛な行き違いを防ぐためにあるものに 俺は従わないって主張されちゃ勝手にしろとしか言いようがない
言語弁護士と呼ばれたいんだけどどうすればいいですか?
458 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:48:31 BE:122854526-
日本をニホンともニッポンとも読めるくらいの大らかさがあってもいいじゃないですか。
459 :
デフォルトの名無しさん :2006/03/07(火) 03:49:51
まあ、宗教より定説でがんばっておくんなせえ
コテハンうぜー
461 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:56:07 BE:829262399-
JIS X 3010はC言語の処理系やライブラリの標準化のためのものであって 言葉狩りのためじゃないと思う。
463 :
デフォルトの名無しさん :2006/03/07(火) 04:00:24
だからそう思ってれば? どうも耳ふさいじゃったようなんで、こっちもやめとくわ
464 :
・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 04:02:18 BE:255945555-
ナル文字(笑)
465 :
デフォルトの名無しさん :2006/03/07(火) 04:03:08
>>462 あんたも言葉遣いがおかしいよ
人に物事を頼んだり尋ねたりするときは相応の態度で言いな
「Cプログラミング言語」の規格の文書の文中に出てくる【個々の語句】まで 同時に標準規格化されたものと思い込んでる痛い奴が居るスレはここですね?
467 :
デフォルトの名無しさん :2006/03/07(火) 04:07:59
いいんじゃね? ANSI とか言いながら米国規格の原文出せない奴も居るようだし
88 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/01(水) 09:25:32 92 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/01(水) 13:03:04 164 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/03(金) 19:56:13 178 名前:デフォルトの名無しさん[] 投稿日:2006/03/04(土) 07:12:24 467 名前:デフォルトの名無しさん[] 投稿日:2006/03/07(火) 04:07:59 「ANSI」なんてこのスレで300レス近く発した人間は居ない模様
469 :
デフォルトの名無しさん :2006/03/07(火) 04:17:15
明日水曜だな
470 :
デフォルトの名無しさん :2006/03/07(火) 06:44:15
「可変個数の実引数」か なら可変.{0,4}引数まで理解したるか
可変引数:非 const 引数とか、参照渡しの引数とか、そんな感じにも聞こえて紛らわしい。 可変長引数:引数の個数って長い短い・・・なのか? 日本語おかしくね? 可変個数引数:ちと冗長。可変個引数でいい。 可変引数リスト:何が可変なのかよく分からん。
>>471 >可変長引数:引数の個数って長い短い・・・なのか? 日本語おかしくね?
「長い文字列」に対して、「文字の個数が長い短いっておかしくね?」って言ってるようなもんだぞ
ひどい学歴コンプレックスを持った人間が混ざっていますね
このへんの用語なんて画一的なものがないんだから好きなの使っておけばおk。否定一切無し。 「Cの規格書に書いてある言い回しだけが正しい」ってのはただの基地外。何時言い回しまで規格化されたんだよw
475 :
デフォルトの名無しさん :2006/03/07(火) 10:33:01
用語に標準はないっ! と机を叩いてがんばってるアレな人が取り残されるのを助けてやるほど甘かねえし
>>475 は夜中からずっとがんばってるみたいだけど暇な学生かニートかな。
477 :
デフォルトの名無しさん :2006/03/07(火) 10:41:59
ミスリード甚だしいな。
規格書にない用語はおかしい!と机を叩いて頑張るアレな
>>475 であった。
479 :
デフォルトの名無しさん :2006/03/07(火) 11:01:04
プログラム技術板で人格攻撃にシフトする必要の出るような雑魚に心配してもらっても1円にもならん
ぬるぽ
プログラミングにおける、予約語のようなものでなく汎用的な用語を標準化するにしても、 普通は個々のプログラミング言語とは切り離して行われるもの。 引数の個数が可変な函数はC以前の言語から存在したものでCから始まったものじゃないし。 特許文書とか規格書とか書いたこと無い奴にはわからんだろうなぁ。
ガッ
483 :
:2006/03/07(火) 11:09:32
質問しますが、前からずっと探してるんですが、 →「汎用」これは何て読むんですか? ばんよう でも ぼんよう でも無いですし、何て言っているのか教えて下さい。
484 :
ぬるぽ :2006/03/07(火) 11:21:04
おまいらなんか〜〜〜〜〜〜〜〜嫌いだ・・・大嫌いだ。
>>485 凄まじくかっこ悪い呼び名なんですね・・・。
やっぱり皆大好きだ〜〜〜〜〜〜〜(ノ∀`)ありがとうございます。満足しました。
>>486 エヴァンゲリオン知ってれば読めるって事かな?9巻しか持ってないです。
釣りじゃ無かったのか・・・
もしかして、地図の凡例も「ぼんれい」とか読んでるのか。
なんだ違うのか
char *func(void) { return ""; } 関数内から空文字列を返す方法として、上記の方法は間違ってるでしょうか? リテラルだからリードオンリーですが、関数内のリテラルは関数の終了と同時に消滅 するのでしょうか? それともコンパイラによってまちまちなんでしょうか?
>>492 const char * func() {return "";}
なら問題ない。リテラルはstatic同様の期間、生き続ける。
494 :
デフォルトの名無しさん :2006/03/07(火) 16:53:32
>間違ってるでしょうか? という問いに対する答えだろうか
>>492 のような関数で、自作関数名に*をつける場合は(
>>492 の場合ではchar *funcの事ですが)
return したいものが、文字列、配列、ポインタの場合に関数名に*をつけるという
解釈でよろしいですか?
>>492 の関数を例としてみると、func関数は空文字列をリターンしてもらい、
func関数は空文字列の先頭アドレスの値を返す。という事ですよね?この解釈でいいのでしょうか?
その通り。 文字列は基本的にコンパイルしたときにデータセクションに置かれるから基本的にずっと生き続ける。
>>496 そうですか。ありがとうございました!!
>>495 ていうか、 return ""; って書いたら char * を返すことになるんだよ。
ダブルクォーテーションで括られた文字列定数はその文字の先頭を指す
char * なの。
配列の場合は、配列の名前だけ出すとそれはその配列へのポインタに
なる。char s[] = "abc"; printf("%s\n", s); と書いた時に printf()
に渡される s は char * だ。
>>498 て事は、func関数は空文字列の先頭を指すchar *を返す訳ですね。
文字列、配列、ポインタは奥が深すぎますね・・・。
ポインタをもっと勉強しますorzありがとうございます。
501 :
デフォルトの名無しさん :2006/03/07(火) 19:01:11
すいません、初心者に使いやすいC言語のコンパイラってありますか? Borlandのやつ設定がわからなかったので何かいいのがあれば教えて欲しいです。 やっぱり有料のコンパイラのほうがわかりやすいんでしょうか? ちなみに当方プログラミング初心者です。
>>501 Borlandでいいと思うけど。
設定ならググれば分かると思うよ。
VC++Exp
504 :
デフォルトの名無しさん :2006/03/07(火) 19:27:48
505 :
デフォルトの名無しさん :2006/03/07(火) 19:39:03
ここって学校の宿題の分からないところとか教えてくれます?(c言語)
>>500 そりゃC++だ。しかも推奨されてるだけ。
まあCでもC++でもそうした方がいいという話なら同意だが。
cursesのprintwなんてフォーマット文字列がchar*型でもうコロスって感じ
今なら BCC なんぞ使わんでも VC++ の無料版でいいじゃんかよ。
509 :
デフォルトの名無しさん :2006/03/07(火) 21:19:00
>>499 おまえの出した結論は何故か正しいが、
>>498 の説明を真に受けたりすると配列の配列とポインタの配列をごっちゃにしたりしそうでこわい。
""は元々char[1]だよ。自動型変換でchar*になる(ことがある)だけ。
512 :
デフォルトの名無しさん :2006/03/07(火) 21:32:36
>>504 ありがとうございます。早速フリーソフトを使ってみたいと思いますw
Expressはヘルプ改善されれば最強なんだけどな。
515 :
デフォルトの名無しさん :2006/03/07(火) 22:32:27
#include <windows.h> #include <stdlib.h> #include <string.h> #include<stdio.h> #include<stdlib.h> void AA(char *s) { printf("%d\n",sizeof(s)); return; } int main(int argc,char* argv[]) { char s[55]; printf("%d\n",sizeof(s)); AA(s); return 0; } 取得サイズが違う^0^
>>515 そりゃそうだ、AAの中ではsはchar *型だもの。
>>515 そりゃ違って当然。
AA() の方の sizeof は *s に対して行われている。
main() の方は s[55] に対して行われている。
どうすれば AAでちゃんと55サイズ取得できますか? printf("%d\n",sizeof(*s)); *sに変えてもだめでした
519 :
デフォルトの名無しさん :2006/03/07(火) 22:45:51
>>518 ヒント: AA(s); ではなく AA(&s); で渡す
>>518 Cではポインタを渡すしかない。
#include <stdio.h>
typedef char S[55];
void AA(S *s)
{
printf("%d\n", sizeof *s);
}
int main(void)
{
char s[55];
ptintf("%d\n", sizeof (s));
AA(&s);
return 0;
}
ヒント2:構造体で、くるんでしまう
>>518 もう答えは出ているが、要するにC言語は配列単体で配列全体を渡せない、ということ。
構造体の中に入れてしまうしかない。しかしあまりに大きい構造体をまるごと渡すのは
後々それ全体をコピーすることになるかも知れず、無駄な処理になる可能性が高い。
523 :
デフォルトの名無しさん :2006/03/07(火) 22:56:48
>>520 typedef 使ってて 55 が2回かよ・・・
そうなんですか〜。 構造体でくるんでみます。
>>523 このスレに常駐して全く無価値な突込みをし続けるのが君の生き甲斐なのか?
526 :
デフォルトの名無しさん :2006/03/07(火) 23:02:50
質問です。 #define FUNC(data) \ FuncA(#data, data) のように設定し、 int ABC = 10; FUNC(ABC); を設定すると、 FuncA("ABC", 10); になるとおもうのですが、これを可変引数で行うことは可能ですか? つまり、 FUNC(ABC, DEF, GHI);を FuncA("ABC", ABC, "DEF", DEF, "GHI", GHI); にしたいのです。 何か方法がありましたら教えてください。
XPでは メモリの開放自動でやってくれるのですが 98や2kは自動でやってくれますかね? 自動じゃないならちゃんと組まないと^^;
529 :
デフォルトの名無しさん :2006/03/07(火) 23:07:07
#define X(data) #data, data void FuncA(const char *, ...); FuncA(X(ABC), X(DEF), X(GHI)); # 俺はこんな馬鹿な真似はしないが
>529 ありがとうございます。 やっぱり馬鹿な真似ですかね。 実際に使う際にいちいち他人に FuncA("Data", Data); みたいに設定してもらうのではなく FuncA(Data); にして中で細工できないものかと考えていたので・・・ 可変引数にしなければ簡単ですがね〜・・・
532 :
デフォルトの名無しさん :2006/03/07(火) 23:13:12
>自動じゃないならちゃんと組まないと^^; スレ違いだが、大事な基本は持ち合わせているようだな 大きくなっても忘れるなよ
533 :
デフォルトの名無しさん :2006/03/07(火) 23:14:35
>可変引数にしなければ簡単ですがね〜・・・ ん? 何か縛りでもあるのか??
>533 実はこれ、Trace関数の機能の一部で格納データを固定にすると 変更があったときいっせいに変更するのも面倒なので可変個数の引数にしたいのです。 (規定数以上の個数のデータがセットされた場合は無視する) なるべく、関数の中身で細工し、呼び出しは簡単に・・・をめざしてます。
535 :
デフォルトの名無しさん :2006/03/07(火) 23:19:58
TRACE( VAR1, VAR2 )とかやったら、 VAR1:40 VAR2:14というような、「変数名:中身」出力になるような 関数TRACEがほしい、ってことでそ?可変数で。
>536 そんな感じです。 特に、バイナリで出力して、バイナリエディタで見る場合、変数名がないと、 その値がどのデータを示しているのかわからないので。 C99仕様だと可能だと聞いたのですが、コンパイラが対応していないので C99に頼らずにできないものかと考えております。
538 :
デフォルトの名無しさん :2006/03/08(水) 00:28:42
無意味なあげ
539 :
デフォルトの名無しさん :2006/03/08(水) 02:02:18
>>537 じゃあ
>>529 の方法しかないのでは?
ていうか、バイナリで出力? 出力しないでもデバッガで見ればいいのでは?
540 :
デフォルトの名無しさん :2006/03/08(水) 06:35:06
割り込み失礼します。 この問題が解けなくて困っています。 何回 入力しますか? と表示し 数字を入力 例えば 3 と入れた場合 1 22 333 6といれた場合 1 22 333 4444 55555 666666 となる プログラムです。 do whileを2つ使用しなくてはいけません。 わかるかたいたら教えてください!
>539 たしかにデバッグ時はデバッガで十分です。 しかし、私の作ってるのはメカ制御のため 実際には外で稼動し、何か問題があれば上位システムのログ を見て解析します。 なのでエラー発生時にトレースコマンドみたいなのを上位から送信してもらい 内部トレースを上位へ報告、そのログをバイナリエディタで確認・・・という流れです。
543 :
デフォルトの名無しさん :2006/03/08(水) 09:21:50
>>542 そういうことなら、なおさらあんな真似はおかしいんじゃね?
障害分析は片手間じゃなくシステムの根底から計画的に組み入れるものだぜ
処理系はBCC5.5.1です 乱数発生器にMTを使用しているのですが 乱数を使用した計算プログラムを作ってるうちにプログラムが常に同じ解を返す事に気がつきました しかもまったく同じソースを再ビルドしても同じ値を返してしまいます そんなことねーですか?
それが擬似乱数というものじゃ
ぇ、もしかしてMTって動的に発生させられるんじゃなくて コンパイル時に値が決定されるんですか(;´д`)
srand相当のAPIがあるだろ
MTにもsrand相当の種を与えるAPIはあります。 納得いかねーですが、これにtimeでも与えて解決する事にします...
>>546 unsigned long int next = 1;
int rand(void){
next = next * 1103515245 + 12345;
return (unsigned int)(next / 65536) % 32768;
}
void srand(unsigned int seed){
next = seed;
}
>>548 が納得しようがしよまいが、それが疑似乱数って物なんだけどな
そもそもSeedを与えるAPIが何のために存在すると思ってるんだ
何が納得いかねーんだ?
MTは軽量かつ偏りが少なくて従来の物より高性能ってだけで 擬似乱数であることには変わりないよ。 本当の意味での乱数が欲しいなら/dev/randでも使っとけ。
逆にいえば、同じ系列の擬似乱数を使えないと評価ができない場合もあるからね。
乱数って円周率を求めるために使うんじゃなかったんですか!?
>>554 32767までのランダムな数を得るためじゃなかったっけ?
そんな収束が遅い方法で円周率求めるんじゃねーよ・・・
557 :
デフォルトの名無しさん :2006/03/08(水) 19:06:57
#define PI 3
558 :
デフォルトの名無しさん :2006/03/08(水) 19:16:37
C/C++でネットワーク関連のアプリ(とりあえず簡単なチャットとか)を作りたいのですが、 良い参考書を教えて下さい。
559 :
デフォルトの名無しさん :2006/03/08(水) 19:19:45
すみません、スレ違いですた・・・。
560 :
デフォルトの名無しさん :2006/03/08(水) 19:44:55
>>556 速度が問題なら既存のデータを買うのが一番だが
そこをわざわざ自作するケースに於いて、速度は度外視だと思う
>543 しかし、きちんと設計し、レビューもし、デバッグも行い テストをし、さらにQAでの検査、正常、異常系、寿命テスト、 現地テストなどをこなし、ても不具合ってでるもんだからね・・・ とにかく、色々答えてくださりありがとうございました>ALL なんとか考えてトレース関数作ります。
何とか作るよりはCの流儀でやることをお勧めする。 Cは低級な言語なんだからあまり高級なことをやろうとして プリプロセッサだのフィルタだのかましてもいいことないよ。
低級言語と高級言語の意味を取り違えている人が若干居ます
実行時にオーバーヘッドがかかるようなものはC的でないかもしれんが プリプロセスはむしろCの十八番じゃね?
565 :
デフォルトの名無しさん :2006/03/08(水) 21:05:31
561の言ってる事と、やろうとしている事の厨房度のギャップがすごいな
567 :
デフォルトの名無しさん :2006/03/08(水) 21:54:25
そうか?
>>549 それなんて線形合同法?
MTはテーブル使う奴だよ。
>>544 「疑似乱数」の意味すら理解せずに疑似乱数を使うような
池沼は、C言語がどうこう以前にエンジニアにならないで
いただきたい。
570 :
デフォルトの名無しさん :2006/03/09(木) 00:06:29
と、疑似乱数しか使えない坊やが申しております
と、疑似じゃない乱数の凄さを知らない坊やが申しております。 >570がチューリング賞取ってたら失礼。
572 :
デフォルトの名無しさん :2006/03/09(木) 01:16:40
すみません。質問です。 はじめて見る文法が出てきたのですが、 下記の文法はどういう意味を持つのでしょうか? len1 = -len1;
len1=-len1 ⇔2len1=0 ⇔len1=0 ってことを遠回しに言っただけ
なるほど、なるほど。俺は len1 = -len1が成立するのは符合がないときだから、0のみ と考えていたよ。(数学的には同じだけど) いや〜ためになったな〜
擬似でない乱数関数: int r(){ return 0; }
処理系はDDT5.5.1蝶野スペシャルです 。 卵数発性器に彼女を使用しているのですが 排卵日を使用した計算プログラムを作ってるうちにプログラムが常に同じ解を返す事に気がつきました しかもまったくオギノ式を再オギノ式しても同じオギノ式を返してしまいます そんなことねーですか?
ウィンドウズ上でCができるツールありませんか? DOS起動してもキー押すだけで強制終了させられてしまうので
数独をとくプログラムってここの人たちなら作れるの?
TOTOを当てるプログラムってここの人たちなら作れるの?
>>580 効率悪くていいなら簡単でしょ。
>>581 支援くらいなら兎も角、当てるのは無理でしょ。
584 :
デフォルトの名無しさん :2006/03/09(木) 09:46:58
>>571 その賞は残念ながら東通工の人に先に取られてしまったよw
585 :
デフォルトの名無しさん :2006/03/09(木) 14:35:45
587 :
魔天王ザムデイン ◆XnE.rF0YCI :2006/03/09(木) 14:58:24
>>585 読んでみて、わからなかったら他のを読めばいい
589 :
デフォルトの名無しさん :2006/03/09(木) 15:20:44
(UNIXのgccでUDP使ってネットワーキングしてるんですが)
logoutした者の名前をファイルから削除するのってどうやるんですか?
ttp://www9.plala.or.jp/sgwr-t/c/sec17.html とか見ても書いてないし、""でせめて空白にはなるかとと思いきやしっかり残ってるし
ここの達人方はどうやって削除してるんですか?
typedef struct {
int recNum;
char userID[8];
} user;
void logOut(int option, char *id) {
FILE *file_ptr;
user record_file;
long int offset;
int recNum;
recNum = readUserID(id);
strcpy(record_file.userID, "");
if((file_ptr = fopen("CURRENT.DTA", "r+")) == NULL) {
printf("Can't open user ID file.\n");
exit(0);
}
offset = recNum * sizeof(record_file);
if(fseek(file_ptr, offset, SEEK_SET) != 0) {
printf("Can't find the file.");
exit(0);
}
fwrite(&record_file, sizeof(record_file), 1, file_ptr);
fclose(file_ptr);
}
>>589 前提条件が抜けていて何をしたいのかいまいち分からん。
君は何を作っているのか?
独自に作ったソフトでのログインとログアウトをしたいのか?
ならば独自にやればいいだけ。
592 :
588 :2006/03/09(木) 15:48:54
>>589 そもそも、「現在ログインしているユーザ」情報を、
ファイルで管理する方が珍しいかと。
whoの/etc/utmpを参考にしない理由を聞きたいな ちなみに構造体定義はsys/utmp.hより struct utmp { short ut_type; pid_t ut_pid; char ut_line[UT_LINESIZE]; char ut_id[UT_IDLEN]; time_t ut_time; char ut_user[UT_NAMESIZE]; char ut_host[UT_HOSTSIZE]; long ut_addr; };
595 :
デフォルトの名無しさん :2006/03/09(木) 19:58:43
すみません。質問させてください。 初心者です。 Borlandのコンパイラをダウンロードして、Widowsのメモ帳でプログラムを書いたところです。 これをコンパイルすると書いてるのですが、どうしたらいいのかわかりません。 教えてください。よろしくお願いします。
VC++ Express使え
598 :
デフォルトの名無しさん :2006/03/09(木) 21:47:42
チャットなどで表示されるOSを自由に書き換えるにはどうしたらよいのか。
603 :
デフォルトの名無しさん :2006/03/09(木) 22:00:09
(・∀・)ジサクジエーン
604 :
595 :2006/03/09(木) 22:04:30
レスありがとうございました!! 頑張ってみます。
605 :
デフォルトの名無しさん :2006/03/09(木) 22:05:26
すいません初歩的な質問です 人の書いたソースを読んでいるのですが 以下のような構造体があり func1という関数ポインタなのですが これはどこで定義されているのかわかりません・・・がなぜか動作しています; struct mode{ char *name; void (*func1)(struct mode *, int); }; すごく長いソースなのですがソースは1枚しかありません 構造体の中の関数は何か特別なんでしょうか?
606 :
デフォルトの名無しさん :2006/03/09(木) 22:07:09
>>605 struct mode{
char *name;
kansuu_pointer func1;
};
と、考えればいい
mode型をどっかで初期化してるんだろ。 構造体だから特別なことは何もない。 初期化せず正しく動作するということもありえない。
>>606-607 ああ、ありがとうございます
”func1”で検索かけていてぜんぜん引っかからないので・・・
なるほど以下にこんなコードありました 助かりました
ありがとうございます ありがとうございます
struct mode mode_list[] = {
{"123", get_qui},
{"434", get_rupus},
{"222", get_status},
{"333", get_goo}
};
>>605 func1は関数へのポインタを入れるためのただの変数
なので初期化されないままでも特に問題はない。
実際にその関数を呼び出したい時に struct mode *
と int を引数に取る void の関数へのポインタが
入っていればいいだけだ。
C言語でXML文書を出力するのによい方法ってありませんか?
611 :
デフォルトの名無しさん :2006/03/10(金) 01:02:35
fprintf
612 :
デフォルトの名無しさん :2006/03/10(金) 01:11:06
614 :
デフォルトの名無しさん :2006/03/10(金) 01:23:33
>>613 いや、なんとなく
おいらもXMLをファイルに書き出すときprintfでやりました
XMLを読むのは難しいけど書き出すときは簡単
スタック作ってタグのネストを管理するくらいかな。
616 :
デフォルトの名無しさん :2006/03/10(金) 01:30:32
>>615 関数だろアフォ
強いてもブロック・・・
アフォ言われてもなぁ 関数の再帰コールはデータの噛ませようによっては危険なので ヒープに自前スタック作ってループで処理するのが確実かつ速い。 関数再帰コールベースだと消費メモリが直感的にわかりにくいしな。
618 :
デフォルトの名無しさん :2006/03/10(金) 01:53:06
>関数再帰コールベースだと消費メモリが直感的にわかりにくいしな。 アフォ確定
はて。 クィックソートが再帰コールじゃないと記述できないと思ってる類の初心者でしょうか。 こういうの相手したくないんですが、最適化で再帰をループに展開しなおす処理系もあるくらい 再帰コールはコーディング効率はともかく実行効率的にはダサい代物であることは 把握しといて欲しいものです。 使い捨てならともかくセキュアなプログラム書こうと思ったら、再帰を利用すると 関数コールスタックのオーバーフロー対策がかえって面倒。 ヒープに自前スタック作ったほうが楽。 例外処理の為にsetjmp/lngjmpなんて使う必要も無い。
セキュアなプログラムを直感的に書く団子がいるスレはここですか?
「ネストの深さに応じてインデントを深くしたい」、というときに、 再帰コールだとスタティック変数やグローバル変数でも使うか、 いちいちスタックにカウントして渡してやんないと駄目っしょ。 管理したい状態が増えるとどうするか?関数の引数を追加する? グローバル変数を追加? どうみてもウンコです。本当にあr 1関数内だけで処理を済ませれば、ローカルの変数をみるだけで済む。 もし ヒープの容量が不足すればお塩ロック、リアルロック、もといreallocすればいいし アロケーションに失敗すれば例外処理に素早く移行できる。 よって、自前スタック使ってループまわして処理したほうがどう考えてもエレガント。 結局のところ、再帰コールが許されるのは初学者までだよねー、ってこと。 でも初学者であることを恥じる必要は無いと思うんだ。
610です。 XMLを書き出すときは、fprintfで書き出したほうがよいのですかね? XMLは色々便利ですけど Cで書き出すときは、CSVとかほうが扱いやすいですね・・・ 読み込みもexpatとか使わずに、自前で作りこんだほうがよい気がしてきました・・・
623 :
589 :2006/03/10(金) 03:38:56
>>590-594 全然答えになってないんですが。
達人の方のみ回答願います。
(ちゅーか、ファイルの内容の一部削除についての回答がまったくないのがこのスレらしい)
ファイルの内容の一部削除についての回答はまったくないスレなので、二度とこないでください。
626 :
589 :2006/03/10(金) 04:03:32
なるほど、達人はいないどころか、馬鹿ばっかなんですね、このスレには。( ´,_ゝ`)プッ
627 :
589 ◆Q6fo44/dLk :2006/03/10(金) 04:11:08
偽者が居るみたいなのでトリップ付けます。 どなたかわかりませんか?
前口上に惑わされて突っ込んじゃって、 さすがに文字列操作もファイル操作も理解 してないレベルだったとはおもわなかったんだろ。 "ネットワーキング"はギャグで言ってたんじゃなくて 若気の至りだったんだろうから、問題の切り分けも 要点を絞った質問もしないからといって無下にせず、 みんなちゃんとソースを読んでやれ。 strcpyの挙動ならスレで扱う範疇だろ?
C標準の関数では既存ファイルの内容一部削除は無理だろ
630 :
589 :2006/03/10(金) 04:26:17
一応言っとくと
>>627 は俺(=589)じゃない。
目的がなんだか判らんが。w
>>629 そりゃシーケンシャルファイルに限ったことじゃないのか?
ランダムアクセスファイルが何かも知らないくせに回答してんぢゃねーだろうな、おまいら?
631 :
589 ◆Q6fo44/dLk :2006/03/10(金) 04:33:13
>>630 辞めろって、いい加減にしてくれ!
そんな発言したら、俺が無能みたいじゃないか。
偽者氏ね
633 :
デフォルトの名無しさん :2006/03/10(金) 04:40:29
>>630 ランダムアクセスファイルって固定長レコードファイルでレコード番号でシークできるファイル、
それだけだよ。特定レコードを物理的に削除できるということはランダムアクセスファイルの
定義にはない。
これをやるんだったら、メモリーのリストにユーザー情報を保持し、ユーザーの追加・削除は
リスト上で行い、ファイルにはその結果を上書きするようにする。これしかない。
つまり、ひとりのユーザにログアウトでファイルの全レコードを置換するわけだ。
どう見ても釣りだろ
635 :
589 :2006/03/10(金) 07:14:17
>>633 ええ、マジでぇ?
シーケンシャルファイルだと最初から読むんで
そんな風に更新するしか手がない、というのは知ってるが
ランダムアクセスならseekで書き換えなんて余裕じゃん?
seekで空白にしてその一レコード分詰める
(ちゅーか詰めるんなら空白にする必要もないんだが)なんて出来ないの?
636 :
デフォルトの名無しさん :2006/03/10(金) 07:52:23
>>635 シーケンシャルファイルだってseekできるよ。
ただ可変長レコードからなるシーケンシャルファイルの場合、どれだけseekしていいかわからない
からランダムアクセスができないだけ。
というか、Cのファイルにはシーケンシャルファイルもランダムアクセスファイルもない。
あるのは先頭からなめるか、先頭から所定のバイト数をすっ飛ばして(seekして)読むかの
読み方の違いだけ。つまりseekを使うか使わないかの違いだけ。固定長レコードからなる
ファイルだと、N番目のレコードを読むには、先頭から(N−1)*レコードサイズをすっ飛ばして、
レコードサイズ分読むことで可能(=ランダムアクセス)。
>seekで空白にしてその一レコード分詰める
この詰めるということがCで扱うファイルではできない。
データベースはレコードの削除はできるけど、あれはCのファイルよりもっと複雑なデータの持ち方
をしているからできる。
詰める、てのは、それ以降の部分を読み込みながら上書くわけだなー。 やっぱり削除フラグにして、追加するときに、削除フラグのたってるところを 探して埋めた方がよくね? 1レコード=1ファイルにして、ファイルを削除するようにする手もあるな(w
638 :
589 :2006/03/10(金) 08:01:17
>>636-637 そこまで説明されると真実味がある。
じゃ、やっぱ削除フラグにするかな。
達人たち、どうもありがとう。
639 :
デフォルトの名無しさん :2006/03/10(金) 08:31:47
上に出てきたXMLなんて面白いと思うよ gccで使えるクラスライブラリがあればの話だが
納得いかないならデータベースライブラリ使え
641 :
デフォルトの名無しさん :2006/03/10(金) 10:35:09
ファイルスコープの関数ってどう記述すればいいのでしょうか? 関数外で以下のように記述すれば、ファイルスコープの“変数”は作れますよね?(←たぶんこれは合ってると思う…(^^;) static int i; 関数だとglobalになってしまい、他のファイルで定義した関数と被ってしまうので、ファイルスコープで宣言したいのです。
642 :
デフォルトの名無しさん :2006/03/10(金) 10:36:47
static void hoge() { }
643 :
641 :2006/03/10(金) 10:52:14
あああ。 なんか static つけてもうまくいかないので質問したのですが、 プロトタイプ宣言にだけstatic付けて、関数自体に付けてませんでした…orz ありがとうございます。
>>621 xmlみたいに上から下に向かってインデントが深くなるのは再帰よか
ループってのはわかるけど、例えば二分木を
*-+(19)
*-+(63)
| *-+(35)
*-+(74)
| | *-+(4)
| *-+(50)
*-+(87)
| *-+(78)
*-+(86)
*-+(83)
こんな感じで表示すんのはスパゲッティ回避しつつ効率よくループでいける?
>>643 いいえ、宣言にstaticがついていれば関数自体につける必要はありません。
>>644 出来れば団子の相手は避けて欲しい。
個人的には、末尾再帰でもない処理をループに置き換えるのは
避けたい。
>>646 末尾再帰ってこんなパターン?
int foo(args) { /*終端チェック...*/ return foo(some-args); }
648 :
647 :2006/03/10(金) 12:25:12
>>619 > 最適化で再帰をループに展開しなおす処理系もあるくらい
「いまどきのコンパイラなら末尾再帰はループに直すから、
効率を気にしないでどんどん使いましょう」
みたいな意見はよく見るけど、コンパイラがループにしてしまうから
使うなっていうのははじめてみた。
>「いまどきのコンパイラなら末尾再帰はループに直すから、 C/C++でこんなコンパイラあるのか?
再帰の深さが数万とかなら考えたほうがいいけど、数十くらいなら、 使ったってぜんぜん平気でしょう。
直しませんよw
654 :
652 :2006/03/10(金) 13:19:06
#include<iostream>
int fact(int n,int v=1){
if(n==0)return v;
else return fact(n-1,v*n);
}
int main(){
std::cout << fact(3);
}
>>653 g++ -O3 で末尾再帰は最適化されました。VCでも同じです。何が直さないのでしょうか?
>>653 最適化を切っているとか度合いを低く抑えているとか、
或いはお前が末尾再帰だと思い込んでいるだけで実際には末尾再帰でないという可能性もある。
>>656 ちょうど団子先生がいるんで聞きたいんだが
末尾再帰とそのループ展開について解説してるいいサイト無い?
全くわかりません><
定数入れて最適化されただろって言ってるの笑える
>>656 その糞コードで'|'や' 'をどうやってはさむつもりだ?wwwww
馬鹿も休み休み言えよwwwww
>>660 関数再帰コールベースなら簡単にできるとでも?馬鹿も休み休み言えよwwwwww
クイックソートの場合 スタックオーバーフローだけを心配するなら2分割したうちの短い方だけを再帰にして、長い方をループにするのが簡単 末尾再帰が最適化されることを前提にするなら短い方を先に呼び出す 自前でスタックを用意するなら長い方を先に積む これでスタックの深さは確実に O(log n)以下になる
>>659 gccとかなら-Sでも指定してアセンブラ吐き出せば
末尾再帰になってるのが一目瞭然ですが( ´_ゝ`)
665 :
652 :2006/03/10(金) 14:06:31
>>659 g++で-Sを付けて出てきたコードを見ればループになっているのが分ると思いますよ。
vcだとループにならない
喪前らコンパイラのバージョンくらい書け
おまいら俺にも理解できるように解説してくれ。
>>661 ループでは簡単に出来ないことを認めたな?wwwww
末尾再帰はループになるかどうかがコンパイラ依存になる時点で糞
せっかくだから
>>654 のコードをg++ -S -O3で(gcc 3.4.4)通してみた
関数の部分を見ると確かにループになってる。
gccって末尾再帰を最適化してくれるのか。知らんかった
__Z4factii:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
jmp L4
.p2align 4,,7
L7:
imull %edx, %eax
decl %edx
L4:
testl %edx, %edx
jne L7
popl %ebp
ret
>>669 端折ってるだけですが。単純化したほうが解りやすいだろ?
とりあえず関数の再帰を使うと簡単に書けることを証明してくれ。
インデント量をいちいちグローバル変数やパラメータで渡す必要がある時点で論外なのだが。
出力も厳密にはキューに溜め込んで、遅延処理することを想定してる。
入れ子になってる要素数に応じて、複数行に分けたり分けなかったりしたいからね。
さすがに構文解析とかの多段?再帰をループで書こうとは思わんな。 目的と労力との天秤じゃね?
どう考えても再帰の方が書くのも楽で分かりやすいのだが...
あーあ。腐れ団子が居付いちゃったじゃねーか。
楽ってなんだよ。 要は手抜きってことだろ。このカス
>>676 関数のプロトタイプが変わっちゃうでしょ。仕様変更に柔軟に対応しにくい。
何より、渡す引数が増えればその分だけ関数コールスタックの消費も増える。
>>675 XMLの解析なら、さすがにXercesやMSXML使うかな。
労力の少なさ重視ならCじゃなしにインタプリタ言語でも使いますわ。
実際のコンパイラやインタプリタのソース見れば再帰コールなんて、まず使ってませんわ。
バグの根源っす。
おいおいLALR(1)文法を再帰を使わずに書けるもんなら書いてみろよ 俺はfindの実装すらも再帰以外では書けないヘタレだから無理だけどな
>>680 ??変わっちゃうってどういうこと?
そもそも再帰コールで書くつもりで始めたのなら追加も何もないんじゃないの?
>>671 末尾再帰を最適化できないようなコンパイラを選定してる時点でダメ。
いまどき再帰がだめって、貧民プログラミングここに極まれりってかんじだな。
yacc を使うほど仰々しくなくて自前で独自の文法のミニインタープリタを ちゃちゃっと書いてテストするときって 先に再帰のほうを想像しないか? いきなりループで思考するとかえってドツボ&バグの温床のような…
末尾再帰をループに変換したコードを生成してくれるコンバータがあるから無問題
カスどもがwwwww void showTree(TREE* tree) { static char indent[INDENT_LENGTH] = ""; showTreeBody(tree->head, indent, 0, 0); } void showTreeBody(LPNODE current, char *indent, int above, int below) { static const char *nextIndent[] = {"  ","| "}; if(current) { showTreeBody(current->child, strncat(indent, nextIndent[above], INDENT_LENGTH), 0, 1); indent[strlen(indent)-2] = '\0'; printf("%s*-+(%d)\n", indent, current->data); showTreeBody(current->next, strncat(indent, nextIndent[below], INDENT_LENGTH), 1, 0); indent[strlen(indent)-2] = '\0'; } }
そもそも、BNF記法が再帰的だし、そのとおり実装しようとしたら再帰になるのが自然 ループだと不自然だろ?
>>688 ループで非再帰化したBNF記法のようなもの登場か!!!
…イラネ
1関数内だけで処理を済ませる団子先生なら何とかすんじゃね?
>>681 LRLRと自由文脈で英文法チェックルーチン(もどき)作るの講義でやったなぁ。懐かしい。
普通に自前スタックに退避で実現できるんじゃね?
Bisonあたりのソース参考にすればいい?ソースとってきてトレースして関数コールツリー
みてるけど、さて、再帰コールしてる箇所ってどこにあ(ry
findって要するにディレクトリツリーの中身全部展開して取得するだけでいいっしょ。
つい最近ディレクトリの中身を無駄なファイル除いてまとめてパックするプログラムとか
書かされたいたけど普通に再帰コールなしで出来たよ。いちおう参考までに。
>>682 共有しないといけないパラメータが、初期に想定してた分より変わるかもわからんね。
>>684 組み込みは無視ですか><
再帰不能
693 :
デフォルトの名無しさん :2006/03/10(金) 19:04:37
>>691 組み込みでも再帰は使うよ
案件によっては禁止の場合もあるってだけ
使う場合のノウハウはちゃんとある
int confirm() { char buf[256]; printf("Y/N?"); gets(buf); if(strcmp(buf, "Y")==0) return 1; if(strcmp(buf, "N")==0) return 0; return confirm(); }
ループで思考しそうなところを再帰で表現 か。 やっぱ思考の過程をそのまま記述するのが自然でよいな。 その上で問題があるなら ループ⇔再帰 の置換を行えばいいし。
696 :
デフォルトの名無しさん :2006/03/10(金) 19:17:32
>>694 うわー懐かし
新米の頃、似たようなこと書いて怒られたっけ(恥
マルチスレッドについて調べてたら、マルチタスクを解説してるページも ヒットしたので試しに読んだらスレッドとタスクの違いが良く分からなくなってきますた。 そんなC言語を習得中の漏れに解説して頂けるもっさエロイ人キボン。
699 :
デフォルトの名無しさん :2006/03/10(金) 21:18:16
ここの人たちが色々な関数を作ってライブラリ化したら面白いかな? prg2ch.libとか?
lib配布で使う強者はおらんやろ
701 :
デフォルトの名無しさん :2006/03/10(金) 21:54:35
もちろんソースつきだよな
10進数を2進数に変換したいのですが、どうにもできません。 何が間違っているのかご指摘を本当にお願いします。 #include <stdio.h> void change(int *data); int main(void) { int input; puts("値の入力"); scanf("%d",&input); change(&input); printf("%d",input); return 0; } void change(int *data) { int *temp; while(*data / 2 != 0){ *temp++ = *data % 2; *data = *data / 2; } }
実行結果では123と入力すると0しか帰って来ません。 と言いますか、全ての数字において0が帰ってきます。助けて下さい。 コンパイラはgccです。
内部的には10進数も2進数も違いはない 2進数で表示したいというのなら文字列にしないと changeについては殆ど意味のない関数になってる 単にdataが0か1になるまで割り算していってるだけ tempもまったく意味がない
あなたには2進数への変換の前にもっとやるべきことがある。
>>704 ほんとですか・・・文字列で書き直して再度聞きに来ます。ありがとうございます!!
>>705 それをぜひ教えて頂きたいです。
>>706 こんな感じで良いよ。
void change(int *data)
{
int temp=0;
int i=1;
while(temp = temp+*data%2*i,*data / 2 != 0){
i*=10;
*data = *data / 2;
}
*data = temp;
}
>>707 うぁぁ・・・むずかしい・・・orz。
少しwhile式内を考えてみます。わざわざ解答書いてくださりありがとうございます!
>>708 仕様ですw
>>709 >>707 は急いで書いたから変になったけど、こう書いたほうが読みやすいかもしれない。
void change(int *data)
{
int temp=0,i=1;
while(*data != 0){
temp = temp + *data%2 * i;
*data = *data / 2;
i *= 10;
}
*data = temp;
}
ビット表現ではなく単に2進数で 表示だけしたいのならこういう手もある void print_bin(int n) { if(n < 0){ putchar('-'); print_bin(-n); } else { if(n/2 != 0) print_bin(n/2); printf("%d",n%2); } } int main(void) { int n; scanf("%d",&n); print_bin(n); putchar('\n'); return 0; }
>>700 C:\Documments and Settings\だんご 食べたい\My Documents\Visual Studio Projects\
ってパス名が含まれるからですか?><
F:\Document and Settings\Administrator\My Documents\Visual Studio Projects\ じゃないのか。
>>710 式内の仕組みがやっと分かりました!!ありがとうございます!
これを参考にして16進数とかに挑戦してみます。
717 :
707 :2006/03/10(金) 23:35:49
>>716 特に変換処理をしなくても
printfで%xを指定したら自動的に16進数で表示してくれるよ
printf("%x",input);
ちょっと話を戻してすいませんが、Cで末尾再帰の最適化を 期待して書くのってやっぱり(仕事でやる場合)良くないこと なんですかね? 組織のポリシー次第と言えばそれまでですが… 自分は再帰の回数が十分少ないと断言できる場合のみ 使っています。楽ですし。
>>717 書式指定子の変更で16進に変換可能できるんですか!凄いですね(^ω^;)
ではいろいろネットで違う基本を学んできます。
Ackermann関数の洗礼を受けたので基本的に再帰コール使わずに書くのはポリシーです。
>>719 仕事なら、性能要件を満たす限りはなるべく分かりやすいコードがよい。
723 :
デフォルトの名無しさん :2006/03/10(金) 23:47:46
>>718 最適化に限ったことじゃないが「保証されている」かどうかが仕事では超重要
gccには-foptimize-sibling-callsというオプションが あるけど、これって末尾再帰最適化してくれるの?
末尾再帰のループ展開を言語仕様で保障してるのってSchemeとかあの手の言語くらいじゃね?
>>718 Cの規格でぜったい保障されてる範囲でしかコードを書かないってことになったら、
まともに実用のコードなんてかけないよ。
再起末尾の最適化がなしだとしても、再起の深さ数十回程度なら、まったく問題なし。
729 :
デフォルトの名無しさん :2006/03/11(土) 00:46:50
>>726 おめー、厳密規格合致プログラムのことを言っているのか?
処理系定義だって立派に保証されている動作だし、
void hoge(int); だって、それを出荷しているベンダーが保証している場合もあるぞ?
自分の仕事の成果に対する責任範囲と「移植性」を近藤しとるんちゃうか?
金もらう時点でここで引っかかる奴はいないはずだが・・・
>>729 この話の流れで、なんでそういう方向に行くのか分かりません。
intのサイズも決めていない規格に何を求めているのやら...
実行効率
あまりにも移植性ばかり考えると開発しづらくない? あまりにもトリッキーで環境依存なコードも問題あるが。 ・・・とここのスレを見て感じました。
意味もなくコストをかけて移植性を確保する奴はアホ。 意味もなくノーコストで得られる移植性を損なう奴もアホ。
735 :
デフォルトの名無しさん :2006/03/11(土) 11:02:36
関数の引数にダイレトで式を書いても問題 ないでしょうか? 以下は例です。 for (i=1;i<=10; i++) { malloc( i*4096 ); }
式の値が引数として渡されるから問題ないけど その例は別の意味で問題ある
737 :
デフォルトの名無しさん :2006/03/11(土) 11:15:10
> 736 ありがとうございます。 別の問題とは、どういう問題でしょうか?
どんな簡略化したサンプルにも必ず難癖つけてしまう病気だから気にするな。
違和感を感じないなら、気にしなくていいよ
malloc で確保したメモリのアドレスを受け取っていないから、free できないってことじゃね
741 :
デフォルトの名無しさん :2006/03/11(土) 11:40:06
> 740 ご指摘ありがとうございます。 確かにそうですね。例の誤りですね。
本に書いてあるプログラムで static char a[M+1][N+1];と宣言してあって その後、a[i][j]++;とかすぐにインクリメントしたりしてるんですが この宣言方法の場合、最初に0で初期化しなくても0が挿入されてるんですか?
staticはゼロで初期化される
>>743 ありがとうございます
流れ見ていく限り、どうもすべてに0が入っているのを
前提とした感じだなぁっていうのはわかったんですが
static使ったことなくて、調べても次に呼び出されたとき
値が変化しない静的としか書かれてなかったんでわかりませんでした
745 :
デフォルトの名無しさん :2006/03/11(土) 20:28:13
>>744 規格ではゼロ初期化ってことになってるけど
このルールには従っていない処理系が結構あるから
ちゃんと確認したほうがいいぞ
例えば?
>>745 そんな処理系無いだろ
少なくとも普通に手に入るであろう処理系ではの話だが
とゆうかstatic変数がゼロクリアされるのはC89で既に規格化されてるんだから
C89にすら準拠してないような糞処理系は窓からry
まあまあ。 結構あると言い切ってるんだから まずは話を聞いてみようじゃないか。
749 :
デフォルトの名無しさん :2006/03/11(土) 21:06:39
俺が直接くらったのは通算2つ 言っていいのはここまで 特に 747 みたいなのがいるところで言ったらシャレにならん
>言っていいのはここまで 何か厨臭いな
標準C以外の話は一切するなといってみたり 標準Cなんて信用するなといってみたり なかなか初心者に辛いスレだな。
組み込み向けコンパイラで、自分でスタートアップで初期化してねというものはあったが ANSIなどと書かれてるコンパイラならクリアされてるはずだわな
754 :
736 :2006/03/11(土) 22:03:17
ん?一応違うけど 736=743=754
結局
>>745 は大口叩いてた癖に、言えないとか言って消えたなw
756 :
:2006/03/11(土) 22:16:28
このプログラムについてprintf下3つが理解できないので、どのような動きを しているのか、解説をして頂きたいのですが、お願いします。 #include <stdio.h> char *c[]={ "ENTER", "NEW", "POINT", "FIRST" }; char **cp[]={c+3,c+2,c+1,c}; char ***cpp=cp; main() { printf("%s",**++cpp); printf("%s ",*--*++cpp+3); printf("%s",*cpp[-2]+3); printf("%s\n",cpp[-1][-1]+1); } 出力 POINTER STEW
すいません、理解したくありません。
そんなこと報告しなくていいよ
>>757 できればヒントをお願いします。
printf関数2番目で cppでの+3と++ではどちらが優先されるのでしょうか?
どちらを試しても答えとは違くなってしまうので、この場合の優先順位を教えて頂けないでしょうか?
760 :
デフォルトの名無しさん :2006/03/11(土) 22:35:35
++
>>760 ++ですか!。そうしますとcppのアドレスを増やす = NEW を指すとします。
(この時printf関数の1番目のアドレスの位置を記憶しているのでしょうか?)
していないとしますと、そしてアドレス位置の--によって ENTER を指し
cpp「0」+3と解釈し、POINT + ER でよろしいのでしょうか?
762 :
デフォルトの名無しさん :2006/03/11(土) 22:48:24
>>762 すいません・・・。NEWを指すのですか。ありがとうございます
764 :
デフォルトの名無しさん :2006/03/11(土) 22:53:26
>>763 まじめにやれ >NEWを指すのですか。
>>764 ではあと一つ答えて頂きたいのですが、4番目の式なんですが
cpp[-1][-1]+1は どうなるのでしょうか?
766 :
デフォルトの名無しさん :2006/03/11(土) 23:11:15
>>765 質問の意味が明らかになっていない
>printf関数2番目で cppでの+3と++ではどちらが優先されるのでしょうか?
例えばこういう風に論点をはっきりしろ
cppは配列cpの先頭を指しているようだが cpp[-1][-1]は何かよく分からんが配列より前を指すことになるので その動作は未定義 細かいことは規格票の加減演算子を嫁
>>756 (1)一つ目
文字列配列 c の要素へのポインタを c とは逆順に保持する cp の先頭アドレスで初期化された
文字列配列の要素へのポインタ配列の要素へのポインタ cpp をインクリメントし。その指し示す
文字列配列の要素へのポインタが指している文字列を表示。
(2)二つ目
一つ目でインクリメントした、文字列配列の要素へのポインタ配列の要素へのポインタ cppをさら
にインクリメントし、その指し示す保持列配列要素へのポインタをデクリメントして、その文字列配
列要素、つまり文字配列であるところの文字列先頭を指し示すポインタを3つ勧めたアドレス以降
を文字列としてその後ろにスペースをひとつ加えて表示。
(3)三つ目
さらに、文字列配列の要素へのポインタ配列要素へのポインタ cpp を、Cの構文糖であるところの [ ]
演算子による配列同等のアクセス方式を利用して、すなわち、cpp を文字列配列の要素へのポインタ
配列要素へのポインタを要素とする配列とみなし、オフセット -2 の位置の要素であるところのポインタ
が指し示す文字列配列要素へのポインタが指し示すポインタが指し示す文字列(つまり文字配列先頭
ポインタ)を3つ進めて、そのアドレス以降のデータを文字列として表示。
ちなみにcpp は(2)までに二回インクリメントされているので、cppを配列とみなした場合、そのオフセット
-2とは、つまりはcppの初期値が指し示す要素をあらわすことが自明。
四つ目
文字列配列の要素へのポインタ配列要素へのポインタ cppを構文糖により、文字列配列要素へのポイン
タの二次元配列とみなし、インデックス-1,-1位置の要素、すなわち文字配列であるところの文字列先頭
ポインタに1を足したアドレス以降のデータを文字列として表示。
ちなみにcpp は(2)までに二回インクリメントされているので、cppを文字列への二次元配列とみなした
場合、インデックス-1,-1とは、つまりはcppの初期値が指し示す要素の次の要素が指し示す文字列配列
要素へのポインタの指す要素の、一つ前の要素をあらわすことが自明。
演算子の優先順位なんてどんな入門書でも載せてるだろうが この場合の優先度も何も、優先順位が変わることは有り得ない
>>766 申し訳ないです。何を言おうとしているのか分からないですよねorz
>>767 そちらを探してみる事にします。
>>768 全部書いて下さりありがとうございます!1つずつ理解できるように読みます。
丁寧に書いて下さり本当に感謝しますm(__)m
>>769 勉強不足ですよね。もっと頑張ります。
答えて頂いた皆さん、本当にありがとうございました。
772 :
デフォルトの名無しさん :2006/03/11(土) 23:31:20
>>770 宿題なら宿題スレへ池
768 みたいな回答が欲しかっただけだろ
761 のここまではよかった
>++ですか!。そうしますとcppのアドレスを増やす =
cpp の指す先にあるのは cp と自分で書いておきながら NEW だのと言い出したあたりから
おまえさんとは話になりそうかどうかに疑問がわいていた
論議という所場代が払えない者に恵んでやる範囲にはきつい限界があるぜ
773 :
デフォルトの名無しさん :2006/03/12(日) 00:21:41
Cの開発環境ってなに使ってる? Eclipseでも出来なくはないけどさ,別にEclipse使うメリットもない。 むなしくエディタで書いてる漏れ。
Emacs
xyzzyとコンパイラを DOSもしくはHEWっていう統合環境上から使用。 エディタで十分でし。
秀丸で十分だろ
773じゃないけど win用のEmacsってあったっけ。あっても、最適な環境まですごく遠くない? ライブラリが用意してあるのか知らないけど
今はVC++ 2005 Express Edtion。 昔はBorland C++とK2Editorを使っていた。 更に遡るとLSI C-86とメモ帳。
C++ Express
Meadowじゃね?使ったこと無いけど
781 :
デフォルトの名無しさん :2006/03/12(日) 00:31:36
xyzzy
782 :
777 :2006/03/12(日) 00:36:10
Meadow、xyzzy、とかって秀丸の標準機能を作んなきゃなんないような偏見がある
でも補完機能とかデバッギングとか簡単にできる開発環境がフリーであって, やっぱJavaの方がとっつきやすいような希ガス。 最近の若者はC言語に見向きもしないんじゃないかと。
高ぇよ>秀丸 秀丸を使う人は、どんなとこが便利であの金額払ってるの?(払ってない人はスルーで)
秀丸の標準機能ってなんだ? オートインデント、予約語の強調、エディタ内でのmakeシェル起動、エラー箇所へのジャンプ、 正規表現を使ったによる置換、grepとhitファイルの該当行へのジャンプ、タグジャンプ、括弧 の対応関係表示。 これだけあれば取り合えず、プログラミングには十分だと思うが。 ちなみに上はxyzzyやMeadowならデフォルトで持ってる機能だ。
漏れはキーバインドが Windows 準拠っぽいやつで
>>786 満たしてればドレでも良いや。
秀丸の標準機能は鶴亀メールだと考えている
秀丸以外にインストールからヘルプまで揃ってるようなエディタがない
VC++ 2005 Express Edition使えよ。 無料の上にヘルプ込みの完全な統合開発環境だぞ。
791 :
777 :2006/03/12(日) 01:01:30
偏見だよ。E系使った事ないから矩形選択とかソートとかできないんじゃないかと
792 :
デフォルトの名無しさん :2006/03/12(日) 01:02:51
ヘルプは英語、補完もなし どこが完全な統合開発環境なんだ
>>790 に乗せられて今インストールしている俺がいる
学校のPC(Linux)でも使えるように、Meadow使ってみたいんだが どこから落とせばいいんだ?
>>795 C言語に関しては英語
無いのはリファクタリングだった
お詫びして訂正します
上位版にはあるのに・・・・
>>796 ランタイム ライブラリ リファレンス
printf、_printf_l、wprintf、_wprintf_l
参照 使用例
すべて折りたたむ すべて展開 言語のフィルタ : すべて 言語のフィルタ : 複数 言語のフィルタ : Visual Basic 言語のフィルタ : C# 言語のフィルタ : C++ 言語のフィルタ : J# 言語のフィルタ : JScript
Visual Basic (宣言)
Visual Basic (使用法)
C#
C++
J#
JScript
標準出力ストリームに書式付きで出力します。これらの関数にはセキュリティを強化したバージョンがあります。「printf_s、_printf_s_l、wprintf_s、_wprintf_s_l」を参照してください。
int printf(
const char *format [,
argument]...
);
int _printf_l(
const char *format,
locale_t locale [,
argument]...
);
int wprintf(
const wchar_t *format [,
argument]...
);
int _wprintf_l(
const wchar_t *format,
locale_t locale [,
argument]...
);
C言語の日本語版ヘルプとリファクタリングツールとやらは秀丸にはついてるの?
>>798 「完全な」統合開発環境というのを取り消せば許してやる
「そもそも完全ってなんだよwww」 ↓ 「 ・〜〜 ・〜〜 だよ」 ↓ 「うぇwwwwwんなのが完全なのかよ >>〜〜のお里が知れるなww」 ↓ 以降煽り、のの知り合い愛情を深めていく
>>799 おれでよければいくらでも取り消したる by798==785!=790
開発用のエディタとしてレジストの催促無視し続けてまで 禿丸使い続けるメリットなんて皆無だろ。
803 :
デフォルトの名無しさん :2006/03/12(日) 02:25:50
払えよw
804 :
デフォルトの名無しさん :2006/03/12(日) 02:42:47
巨大な配列をつくるとエラーが出てしまうのですが回避できませんか。
staticってつけるとなぜか解決
806 :
デフォルトの名無しさん :2006/03/12(日) 02:50:42
807 :
デフォルトの名無しさん :2006/03/12(日) 09:57:51
USBで持ち込み可能な統合環境なんてあります? 結局xyzzyなどのエディタとDOSコンパイラになってしまう
808 :
デフォルトの名無しさん :2006/03/12(日) 13:08:29
すみません 教えてください PAStaticDS.libとstrmiids.libをリンクすると IID_IKsPropertySet はすでに strmiids.lib(strmiids.obj) というようにリンクエラーがでます 回避する方法あります?
わからん、お前の話はぜんぜんわからん。 エラーメッセージを、一切加工せずに書け。
char *strcpyex(char *d, char *s) { strcpy(d, s); return d + strlen(d); } みたいな標準関数ないですか?
無い
自分で作れ
もう作ってるしw
814 :
デフォルトの名無しさん :2006/03/12(日) 15:42:38
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
http://pc8.2ch.net/test/read.cgi/prog/1140616676/
>>810 sprintf(d, "%s", s )
>return d + strlen(d) ここは?
別にd+sprintf(d,"%s",s)でもいいけどさ。 みたいな、だから。
俺は良くこうするな s += sprintf(s, "%s", hoge);
イタ
char型の配列の特定の箇所をatoiしたい場合はどうしたらよいのでしょう?
>>820 数値の前の空白、数値の直後の英字などは無視されるので、
atoi(" 123abc") は123を返すがそれでは不満か?
もしそうならsscanf()を使え。
sscanf(" 1234abc", "%3d", & foo)でfooに123が得られる。
>>821 そういう使い方もできるんですね
調べが甘かったです
ありがとうございました!
823 :
デフォルトの名無しさん :2006/03/12(日) 20:46:18
hairetuというchar配列をprintfで表示する場合、 printf(hairetu); では表示できるんですが、 printf("%s",hairetu); では表示できないんですけど、仕様ですか?
>>824 もう一度コンパイルし直したら出来ました
ありがとうございます
int main (void){ int c; char str[50]; scanf("%s", str); c = getchar(); return0;} とするとgetcharが行われないのですが何故でしょうか? 実行するとscanの部分だけで終了してしまいます。
>>826 scanfの食べ残した改行をgetcharが食べるから
どうやったら上の現象を回避してgetcharを機能させられるのですか?
int main (void){ int c; char str[50]; scanf("%s", str); getchar(); c = getchar(); return0;}
scanfって推薦されてなくなかったっけ
getcharを重ねるのが簡単なんでしょうか。
>>829 の方法で無事、動作しました。
scanfって改行を1個食べ残すからね。
>>829 こうで十分だろ。
scanf("%s%*c", str);
c = getchar();
834 :
デフォルトの名無しさん :2006/03/12(日) 22:59:56
835 :
デフォルトの名無しさん :2006/03/12(日) 23:08:06
>>826 「getchar が行われていない」 とは何を根拠に言っている?
>>835 正しくはgetcharのところでプロンプトが入力待ちにならないってことだが、
そんなの雰囲気で分かるやろ、ぼけ。
そんなの雰囲気で分かるやろ、ぼけ。 そんなの雰囲気で分かるやろ、ぼけ。 そんなの雰囲気で分かるやろ、ぼけ。 そんなの雰囲気で分かるやろ、ぼけ。 そんなの雰囲気で分かるやろ、ぼけ。 そんなの雰囲気で分かるやろ、ぼけ。 そんなの雰囲気で分かるやろ、ぼけ。
50バイト以上流し込ませないために%50dとやれば勝ち組ですか?
839 :
デフォルトの名無しさん :2006/03/12(日) 23:53:10
char s[100]="うんこ",s1[]="何?"; sprintf(s,"%s%s",s1,s); printf("%s\n", s); ”何?うんこ” になりません>< ”何?” になります。 きっとsprintfの入れ先がsだからいけないのでしょうか。 べつにs3[100]を確保してそこに入れればいいのですが メモリがもったいないです、確保したくありません 何か解決策ダサイ><
>>839 そのコードは鼻から悪魔。
素直に別領域使えよ、ボォケェ
自分でそういうコピーをする関数を作ればOK
char s[100]="うんこ",s1[]="何?"; int s1len = strlen(s1); memmove(s+s1len, s, strlen(s)+1); memcpy(s, s1, s1len); printf("%s\n", s);
843 :
デフォルトの名無しさん :2006/03/13(月) 00:13:40
>>824 THX><
暇だったからバッファ溢れを考えて作ってみた。 #include <stdio.h> #include <string.h> char *InsertStr(const char *src, char *dst, size_t dstSize) { size_t lenSrc = strlen(src); size_t lenDst = strlen(dst); if (lenSrc + lenDst + 1 > dstSize) /* 1は'\0'の分。次の行も*/ lenDst = dstSize - 1 - lenSrc; memmove(dst + lenSrc, dst, lenDst); dst[lenSrc + lenDst] = '\0'; memcpy(dst, src, strlen(src)); return dst; } int main(void) { char s1[16] = "Bar"; char s2[8] = "Hoge"; InsertStr("Foo", s1, sizeof s1); puts(s1); InsertStr("Ahya!", s2, sizeof s2); puts(s2); return 0; }
>>843 いけません>< PCがかわいそうです。 私は、林檎三個食べただけでもうアウアウなのに char s3[100]なんて確保したらPCがアウアウパウになります。
char s[100]; char *s1="うんこ"; char *s2="何?"; にすればメモリの消費量も解決(w
みんな可変長配列使えよう
>>845 ありがとうございます>< 私のPCもとてもよろこんでます。 / ̄ ̄ ̄ ̄/ / FMV / <うれピー! \/____/
850 :
デフォルトの名無しさん :2006/03/13(月) 00:23:37
んなRAM16Kバイトのマイコンじゃあるまいし100バイトの自動変数ぐらいでビクビクしてどうする。
char *s0="うんこ", *s1="何?"; char s[100]; sprintf(s,"%s%s",s0,s1); printf("%s\n", s);
s1[50]にして別にs3[50]を定義する。 メモリ使用量はほぼ変わらない。
そうやって資源を贅沢に使う姿勢が地球環境を破壊したことは否定できません
皇北都 「だって、わたしのPCにはもう2Gもメモリが実装されているんだもん。 いまさら配列サイズをケチったって、破壊された森林は戻ってこないわ」
初心者に限って小手先の効率を求める
856 :
デフォルトの名無しさん :2006/03/13(月) 01:16:16
初心者的な質問で申し訳ないのですが struct A{ int val; struct A *next; struct B *b;} *a1; struct B{ int val; struct *next;} *b1; a1->val = N; はできますよね a1->b->val = N; としようとするとエラーが出るんですがこういうようにしたい場合どう書けばいいんでしょうか?
>>856 >a1->val = N; はできますよね
できない
>a1->b->val = N; としようとするとエラーが出るんですが
当然
ポインタを理解できない人種ってこれのことか?
> struct A{ int val; struct A *next; struct B b;} *a1; > struct B{ int val; struct *next;} *b1; > > a1->val = N; はできますよね ポインタの先の実体が無いとできませんよ
変数宣言の時点でエラーになるんじゃねーか?
>>856 ポインタがインスタンスを指していないんじゃないんか?
a1 = malloc( sizeof(struct A) );
a1->b = malloc( sizeof (struct B) );
>>860 a1->bは集約関係だから必要ないだろ
だからこうしろって struct B{ int val; struct *next;} *b1; struct A{ int val; struct A *next; struct B *b;} *a1;
863 :
856 :2006/03/13(月) 01:31:24
すいません実体は用意しているつもりです struct A{ int val; struct A *next; struct B *b;} *a1; struct B{ int val; struct *next;} *b1; a1 = (struct A *)malloc(sizeof(struct A)); a1->b = (struct B *)malloc(sizeof(struct B)); これで a1->val = N; は大丈夫ですよね? a1->b->val = N; というようなことがしたいということです 書き忘れですすいません
>>863 普通に出来るはずだが
struct Aの宣言でエラーが出てるとか言ったら殺す
struct *next; で宣言でエラーが出てる、とかいって殺されるに1票
866 :
856 :2006/03/13(月) 01:38:58
>>864 できますか
これも書き間違えてましたがstruct Bの方が先に書いてあるのでそこではエラーは出ていません
a1->b->val = N;をなくすとコンパイルも通るので宣言の部分でのエラーというのは考えられません
他に変なところがないか見てみます
断固としてコンパイルエラーを書かないのは、明からに釣りの証拠(w
868 :
デフォルトの名無しさん :2006/03/13(月) 01:40:12 BE:152172443-
Windowの位置をランダムにしたいのですが、 どのように書けばいいのでしょうか。
870 :
856 :2006/03/13(月) 01:43:22
a1->b->val=N;としている行: error: dereferencing pointer to incomplete type というエラーが出ます
a1->bに型が違うポインタ代入してんだろ?
a1->b = (struct B *)malloc(sizeof(struct B)); している場所と a1->b->val = N; している場所は実は全然別で、片方には struct Bの定義が無かったというオチか?
a1->b->val = N; のところでstruct Aかstruct Bの宣言が欠けていると思われ
875 :
デフォルトの名無しさん :2006/03/13(月) 02:15:46
>>863 struct B{ int val; struct *next;} *b1;
↑
なんか抜けてねえか?
876 :
デフォルトの名無しさん :2006/03/13(月) 03:25:17
NULLとNILって違いはありますか?
CにNILなんてありません
879 :
876 :2006/03/13(月) 03:40:33
これは失礼しました
俺はNIL文化には付いていけない
温と煮
文字列の回文を出力したいのですが、回文の出力実行で表示がおかしくなるのですが 元々代入されている文字配列へ再度代入するという行為(一番下のfor文の所です)はダメなのでしょうか? #include <stdio.h> void main(void){ int i,j,str_size; char str[64]; puts("文字列の入力"); fgets(str,64,stdin); if(!str) puts("文字列は入力されていません"); printf("入力された文字列は%sです",str); str_size = sizeof(str)/sizeof(str[0]); //文字のサイズ for(i=0,j=str_size;i < '\0' , j >= 0 ; i++,j--) str[i] = str[j]; printf("回文は%sです",str); }
>>882 色々と間違えてる。
とりあえず、各変数の値がどうなるか、
一行ずつしっかり確認汁。
>>883 分かりました。変数を出力して確かめてみます。解答ありがとうございます!
>str_size = sizeof(str)/sizeof(str[0]); //文字のサイズ これは、文字のサイズじゃなくて配列の個数だと思うのだが。 strlen()とか使う。 しかし、2バイト文字はこのまま(char)だとうまくいかない。 わかるね? そして、 >str[i] = str[j]; 文字列上書きしてるだろ。
j=str_sizeの時点でおかしいし、i<'\0'も意味不明 それに回文を作るルーチンとしてもおかしい
こうやって、初心者からデバッグの方法を学ぶチャンスを奪っていくのですね。
>>885 すいません。そうでした要素数を計算したかったんです。
2バイト文字はcharの領域を倍使う事位しか知りません・・・。
もう一度やり直すべきですね・・・。
では言われた事を再度確認してきます。ありがとうございます。
>>886 というのはプログラム自体を考え直すべきなのですねOrz
>>887 デバッグの仕方を知りませんので、分からないです
回文じゃなくて、単に入力された文字を反転させてるだけだろ もっともそれすらうまくいってないが
文字列が一周して元に戻ってしまう(´・ω・`;) 回文というのは要素数が奇数でしたら下のi=jの条件でいいと思ってたんですが それすらもダメですね。偶数の場合の判定条件も要素が隣接したらブレイクする位しか 思いつかないし・・・orz この考えは回文としては不適切なのか教えて頂けないでしょうか? #include <stdio.h> #include <string.h> void main(void){ int i,j; char str[64]; puts("文字列の入力"); fgets(str,64,stdin); printf("入力された文字列は%s",str); j = strlen(str); for(i=0; i < '\0'; i++){ str[i] = str[j--]; if(i == j) break; } printf("回文は%s",str); }
>>891 i < '¥0'の時点でループが(ry
>>892 うわぁ・・・すいません。文字列での条件でした。
この糞っっぅぅぅっったたたれーーーーーー!!!!!!!!!カスがぁ!!!!! 回文なんか俺にはできる訳ねぇーーーーーーーーーーんだよ馬鹿めぇぇ!!!!!! うはははははははは見くびるな!もういい。俺はプログラムのデリケートな所が大嫌いだ。辞〜めた
なんて潔い
>>894 を回文で書いてあるのかと期待しちゃったじゃないか・・・
回文の意味を取り違えてました。ですので考え直したんですが、 下の結果で文字列strの入力した(文字数+1)に反転させた文字列をコピーさせるのですが 実行結果が入力12345→出力12345、回分が12345で同じになってしまいます。 なぜなのか教えて下さい('A`) printf("入力された文字列は%s",str); j = strlen(str); for(i = j+1 ; j >= 0 ;i++,j--){ str[i] = str[j]; } printf("回文は%s",str);
>>897 forループの最初でコピーされるstr[j]は何だと思う?
>>898 jはstrlen(str)によって求められた要素数ですので、12345を入力したとしたら
5になるわけですから、str[6] = str[5]になるのではないでしょうか?
そしてjをデクリメントして行く = 12345のj--によって配列4番目の要素がstr[7]に
代入される。というのが自分の考えです・
ですのでstr[j]は12345の場合5の要素・・・
あっ配列ですので要素数は-1されるんですね?ちょっとやってみます!!
・・・・・・僕にはまだ早いようです。ほんとうにありがとうございました。 文字列、配列の扱いが全然難しいので、文字列とはを検索して勉強します。
for文を、自分で展開してみなよ str[6] = str[5] // \0 str[7] = str[4] // 5 str[8] = str[3] // 4 str[9] = str[2] // 3 str[10] = str[1] // 2 str[11] = str[0] // 1 結果 1 2 3 4 5 \0 5 4 3 2 1 これを出力したら\0で止まるから12345だな
1 2 3 4 5 \0 \0 5 4 3 2 1 でした
入力12345、出力1234554321としたいんなら あと2箇所直せばいいだけなんだがな...惜しいな
904 :
デフォルトの名無しさん :2006/03/13(月) 16:02:23
文字列を逆さにする char moji[]="hello"; int len,i,l,mo; l = strlen(moji)-1; for(i = 0; i < l/2;i++){ mo =moji[i]; moji[i] = moji[l - i]; moji[l - i] =mo; }
>>903 文字列の回文できました!ありがとうございます!出力結果が改行されて見た目が
少し変ですけど、嬉しいです(ノ∀`)スッキリ
j+1→j-1 と str[j]→str[j-1]の変更でできました。ヒントありがとうございました。
>>904 それも挑戦してみたんですけど、できなかったので参考にさせて頂きます。
906 :
デフォルトの名無しさん :2006/03/13(月) 16:19:22
並列処理で'b'がtrueになるまでウェイトしたい時、 boolean b=false; while(b){} としたらできたのですが、友人に聞いたら、 それではメモリが支配されてしまう(?)ので、あまり良くないとのことです。 やはりそれではダメなのですか?ダメならどうすればいいですかね?
>>905 > j+1→j-1 と str[j]→str[j-1]の変更でできました。
いや、それは「たまたま」上手く動いているだけ
俺の考えた方法は
j = strlen(str) - 1; ← わざわざjを-1するより、ここで-1した方が良くね?
for(i = j+1 ; j >= 0 ;i++,j--){
str[i] = str[j];
}
str[i] = '\0'; ←非常に重要、何故重要なのかは宿題とする
あと、表示を綺麗にしたいなら
printf("\n回文は%s\n", str);
とでもすればいい
908 :
デフォルトの名無しさん :2006/03/13(月) 16:21:10
910 :
デフォルトの名無しさん :2006/03/13(月) 16:24:31
>>909 解決策については本人も分からないらしいです。
>>907 あっ・・・そちらの方が見やすいですね。
なぜstr[i]='\0'をするのかはfor文で代入直後には終了を示す'\0'が代入されて無いので
文字配列が終端を認識できないため、代入するという事だと思いますが・・・。
たぶんbをvolatileにすべきとか、CPUを眠らせるようにすべきとかそういうことだと思う。
メモリが支配されるってのはどういう事だ?
まぁおそらく
>>912 が書いてるようにCPUが占有されることだと思うが
並列処理については環境依存の方法使った方がいいんじゃないか?
知らない人は引っ込んでいた方がいいよ。
916 :
デフォルトの名無しさん :2006/03/13(月) 18:19:21
>>906 密結合でか?
メモリの帯域をどうシェアしているかによるが
疎結合で言うとフラグファイルのようなものって言えばわかるかな
917 :
デフォルトの名無しさん :2006/03/13(月) 18:26:54
独習Cは役に立ちますか?
918 :
デフォルトの名無しさん :2006/03/13(月) 18:28:06
>>913 そうでした、CPUが占有されるって言ってました。
>>916 ごめんなさいわかりません(@_@)
>>906 以外の方法で、条件が満たされるまでウェイトするような
方法はありませんかね?
919 :
デフォルトの名無しさん :2006/03/13(月) 18:35:18
>>918 密結合がわからないってことは、「並列」と言っているのはマルチスレッドか?
もっとかみ砕いて言うと、組み込みか、そうでないか、どっちだ
920 :
デフォルトの名無しさん :2006/03/13(月) 18:41:59
>>918 OSによってやり方が変わるが、シグナルとかを使う
922 :
デフォルトの名無しさん :2006/03/13(月) 18:47:26
>>921 OSによって変わるんですか…
いまの私には難しそうですね。
pthread使っとけ
ちょっと聞きたいんですが、if-elseの羅列の代わりに、 switch(TRUE){ case 論理式: 処理1。break; case 論理式: 処理2。break; ・ ・ ・ } っていう書き方はあり? 来月からマになってしまうんですが、今まで独学でやってきたので、 自分は変態なんじゃないか(書き方が)と不安で不安で…。 こんなこと恥ずかしくて同期には聞けないので教えてください(///)
ない
switchにする意味が分からない。
927 :
924 :2006/03/13(月) 20:50:02
else ifがいくつも並ぶとなんだかかっこ悪い気がして…。
新人類シニア世代(60代以降) : アセンブラ, PL/I, COBOL70 団塊の世代(50代-60代前半) : アセンブラ, PL/I, COBOL70 新人類世代(40代) : 新生COBOL, C バブル世代(30代後半) : C, C++(実際の所C言語レベルが大半), VB, Perl 偽団塊ジュニア世代(30代前半) : C, C++, VB, Perl, PHP 真性団塊ジュニア世代(20代後半) : C++, Java, Perl, PHP, AspectX (Xはそれぞれ適した言語) やる気のない世代(20代前半) : D言語, VB, C++, Java, Perl, PHP, AspectX(Xはそれぞれ適した言語)
Cではcaseに論理式は書けない。C-FAQ 20.18参照 ただし、 register n = (count + 7) / 8; switch (count % 8) { case 0: do { *to = *from++; case 7: *to = *from++; case 6: *to = *from++; case 5: *to = *from++; case 4: *to = *from++; case 3: *to = *from++; case 2: *to = *from++; case 1: *to = *from++; } while (--n > 0); } こういう変態的なコードは書けてしまったりする。
試す前に聞くような奴は役に立たない。
>>927 switchのほうが格好悪いし使いにくい。
while(なんかのイテレータ->hasNext()){
値 = イテレータ->next();
if(値が妥当で有れば){
//else-if文替わりに実行
}
}
ってかんじならelse-ifのかわりにできるだろう
>>924 そもそも、caseに書けるのは定数のみ。
式なんて書いたらコンパイル通らないだろ。
933 :
924 :2006/03/13(月) 21:24:44
ほんとだ…。Cコンパイラひっぱりだしてきてやってみたら怒られました。 最近ActionScriptとかperlしか触ってなかったので、cでも出来るんじゃねとか思ってました…。 > 929 なにやってるんだかまったくわかんない…。
多段if-elseがかっこ悪いというやつの方が switchが使いにくいっていうやつより有望ではあるな ま、でもCではif-elseにするしかない。 いやなら多段if-elseは関数にくくり出して結果をintにコード化して返してswitchで使うだわな。 コードに論理的意味付けを持たせれば、 判定実装と論理的意味に対する処理という異なるレイヤーを混在させなくてすむ。
関数ポインタの配列でも解決できそうな気がしないでもない
どこが有望なんだ。 switchは上から総なめするときに有効なだけで 無理して使うことは無い。
937 :
924 :2006/03/13(月) 21:42:32
ageちゃった。すいません。
今まで学問としてcや他の言語を学んだことがないので、
自分のソースコードってどうなんだろうと疑問に思ったんです。
周りの同期はみな大学でプログラムを学んでいるようなので、
書き方のお作法や定石なんかがしっかりしてるんだろうなと。
レスをもらって、そこら辺自分は甘いなぁと改めて感じました…。サンクスです。
>>931 ,
>>934 ,
>>935 判定用の関数を作ってイテレータをぐるぐる回すとかの方がカッコイイんですかね。
そうすれば、もう変にswitchになんかこだわらなくても良さそうです。
938 :
デフォルトの名無しさん :2006/03/13(月) 21:43:02
しょせん高級アセンブラ 935 も言いたげだが、自分で作るための言語にあれもこれも用意させてどうする
別に大学で情報科学専攻したからといって コーディングの作法はやらないと思うがな
コーディングは科学じゃない
941 :
デフォルトの名無しさん :2006/03/13(月) 21:50:43
それはそうだが、ソフトウェア工学は科学である。
943 :
デフォルトの名無しさん :2006/03/13(月) 21:55:37
>>942 C++ にあって C99 にないものか
944 :
デフォルトの名無しさん :2006/03/13(月) 22:54:43
コマンドプロントで、フォルダ名が全角のカタカナの場合はどうやってコマンドプロント画面に打てばいいですか? コピペしか方法が分かりません
Alt+[半角/全角] ↓これも併用して Windowsキー+Eを二秒押すと全角カナ設定が保存される。 Windowsキー+Lで編集が便利になる機能がオンになる。
tab使って0から補完
947 :
944 :2006/03/13(月) 23:13:03
ありがとうございます もう1つお願いします。全くの初心者なんですが、コンパイルするメモ帳のファイルはどこに置いたらいいですか? デスクトップのCというフォルダに保存してるんですが、今の場合だとC:\Documents and Settings\自分の名前\デスクトップ\C> という感じで長くなって見にくいです
C:\WINDOWS\直下がオススメ。 パスが通っている。
949 :
944 :2006/03/13(月) 23:15:01
直下というのは何でしょうか?
c:\home\c, c:\home\binとか作ってそこに置いとけ
952 :
944 :2006/03/13(月) 23:21:53
分かりました どうもありがとうございました
つーか、スレ違いだがね。
954 :
デフォルトの名無しさん :2006/03/13(月) 23:24:13
C言語用に、関数仕様書やフローチャートなんかを 自動生成するツールがあれば教えてもらえると嬉しいです。
doxygen
doxygenにフローチャートの作成機能なんてあったか? クラス図作成機能があったのは知ってるが
ソース読み込んでフローチャートを自動作成するやつあったら俺も知りたい
>>955 関数仕様書や処理フローも無く、どう製造するのかと問いたい。
960 :
デフォルトの名無しさん :2006/03/14(火) 00:04:08
>>955 因果関係が逆
関数からどんな意図が推定できるかではなく(ソース読む人を馬鹿にしすぎ)、
どんな意図からその関数が出てきたのかを示さねば人手で資料を作る意味はない
961 :
955 :2006/03/14(火) 00:19:07
他人のソース読む際の 足がかりに出来ないかなとか考えてました。
最初からそう言えやー 普通はタグテーブル作って参照できるようにするだけじゃないかね
doxygen
素人は思いもよらぬ発想でコード組んだりするので結構読めんもんだよ。
>>955 さんではないですけど私も今他人のコードを読んでるんですが
他人のコードを読むのはほぼ初めてで全然進まない状況なんですが
タグテーブルって何ですか?検索してもHTMLのタグのことばっかりでてきます
効率よく読める方法があれば是非教えてもらいたいのですが
Visual Studio使える奴には用無しだがな
他人のソースを読むなら、Understand for C++というまさにそのまんまな名前のソフトがあるにはある 少々癖がある+結構高い$495上に英語のみ(まぁここは問題ないだろうけど)だが 評価版もあるんで試してみると吉
自分のコードスタイルに編集しながら読んでいけばある時点ではっちゃけると思う。 全然進まないならタグテーブルでも情報量過多になることも考えられるので 相当物を手作業で作ったほうがよいかも。 ナビゲーション性が悪いとストレスが溜まるのでブックマークをつけられる エディタやヴューワを使ったほうがよい。 あとは印刷物にマーカー持って向き合うかだな。
>>966 横だけど、これいいね。xyzzyとも相性いいね。
VSのプロジェクトファイルがあるなら、VSがベストだけど
この軽さもいい感じ。いい情報ありがとう
ポインタの指してるアドレスって例えばint型だとすると4バイトのうちの先頭を指していると考えていいですか?
doxygenを 使ってる人います?使うとしたら形式はQTとJavaDocどっちにしてます? あとフローチャートを作成するのにお勧めToolはありますか? また関数からフローチャートを作成するToolも探してます。 できればフリーのほうがいいです なぜならQAの人たち(検査する人たち)に説明する際にソースを印刷するよりもフローのほうがいいからです。 よろしくお願いします。
>>971 まず、アドレスとは限らない。
# 実装としてアドレスが使われる事は多いが。
typedef struct person { char name[64]; struct person *next; }Person; Person* AllocNode(void) { Person *heap = (Person *)malloc(sizeof(Person)); return heap; } void TempPerson(Person *data) { Person *ptr; data->next = AllocNode(); ptr = data->next; printf("名前の入力");scanf("%s",ptr->name); printf("%s",ptr->name); }
978 :
デフォルトの名無しさん :2006/03/14(火) 19:07:19
>>977 みたいなコード打つヤツとは仕事したくねーな
AllocNodeをインラインにするかマクロにすれば俺は許す。
この場合は使ったメモリ、開放しなくていいんですか?
ここの回答者ってホント糞ばっかだな
一番の問題は拡張性の無さでいいのですか?
質問が糞だと回答もそれなりにならざるを得ないだろうな
scanf
>>987 の紹介文において、わいせつ行為で捕まえられないですか?
>>988 あれをわいせつ行為だと思える、その精神がわいせつ。
エロいことばっかり考えてるからそう思えるんだって。
"C"言語にもそういうこと期待してる?もしかして。
991 :
デフォルトの名無しさん :2006/03/14(火) 23:57:47
俺言語にdoxygenは使えますか?
992 :
デフォルトの名無しさん :2006/03/15(水) 01:03:38
#include <stdio.h> main () { int a; printf("a = %d\n",a); a = 2; printf("a = %d\n", a); return 0; } これを実行すると a = 1 a = 2 と出るのはなぜですか?なぜ最初にa = 1と出るかが分かりません
ローカル変数は初期値不定。
仕様です
995 :
デフォルトの名無しさん :2006/03/15(水) 01:10:03
ゴミの値が出るんだろ。
998 :
デフォルトの名無しさん :2006/03/15(水) 01:17:12
初心者には優しくしてください><
999
#include <stdio.h> main () { int a; ←宣言した時、a に入っている値は不定値。 printf("a = %d\n",a); ←ここでその不定値を表示してるだけ。不定値の意味くらいは分かるよな? a = 2; ←ここで初めて、a に2が入りました。 printf("a = %d\n", a); ←ここでその、a の中に入っている2を表示してると。 return 0; }
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。