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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味して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/
2デフォルトの名無しさん:2006/02/26(日) 14:24:48
3デフォルトの名無しさん:2006/02/26(日) 14:25:07
お疲れです
4デフォルトの名無しさん:2006/02/26(日) 14:28:06
舞-乙
5デフォルトの名無しさん:2006/02/26(日) 14:37:26
hello world を7色でひょうじするにわどうしたらよいでしょうか?
コンソールで、コンパイラはgcc。Bcc32でつ。

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

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

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

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

高速化したいプログラムはメモリの初期化(0で初期化)です。
とりあえず、アセンブリ?
17デフォルトの名無しさん:2006/02/26(日) 20:24:35
クマー
18デフォルトの名無しさん:2006/02/26(日) 20:25:27
>>16
C、C++の最適化について語るスレ
http://pc8.2ch.net/test/read.cgi/tech/1084676298/
19デフォルトの名無しさん:2006/02/26(日) 22:33:45
>>16
現在の処理時間がどれくらいで、それを高速化でどのくらいにしようとしているの?
20デフォルトの名無しさん:2006/02/26(日) 23:26:05
>>16
始めに目的ありき
まずどんな条件をクリアできればいいのかをはっきりさせ
測定方法などの手段はその次に考える
21デフォルトの名無しさん:2006/02/26(日) 23:34:14
なるべくちょっとでも速く、と言うのはあるぞ
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
>>25
Oh yeah! 素晴らCでーす!
27デフォルトの名無しさん:2006/02/27(月) 03:33:00
>>16
んなもんな memset() 使え。
ライブラリに任せろ。
28デフォルトの名無しさん:2006/02/27(月) 05:15:53
>27
memsetだとバイト単位だから遅い。そんなものもわからんのか?
対象とする環境がどんなものかわからんがな。
29デフォルトの名無しさん:2006/02/27(月) 05:37:23
memsetは普通は組み込み関数として最適化されるから
バイト単位とは限らない
30デフォルトの名無しさん:2006/02/27(月) 08:28:01
というかむしろbyte単位に書き込む、
未最適化のmemsetをコンパイラ製作者が提供するほうが珍しいと思う。
31デフォルトの名無しさん:2006/02/27(月) 08:54:18
DMA転送になるんだよ
32デフォルトの名無しさん:2006/02/27(月) 22:12:34
>memsetは普通は組み込み関数として最適化されるから
>バイト単位とは限らない

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

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

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

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

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

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

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

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

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

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

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

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

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


文字列をひっくり返すプログラム組んだんですが、数字を入れてもひっくり
返えるんですよ。
なんででしょうか?すみません、初歩で。
72デフォルトの名無しさん:2006/03/01(水) 00:31:11
コマンドライン引数は全部文字列
123を渡したらやはり"123"という文字列として渡される
73デフォルトの名無しさん:2006/03/01(水) 00:33:45
>>71
数字って数字文字列じゃないの?
74デフォルトの名無しさん:2006/03/01(水) 00:41:48
>>72、73
コマンドラインはすべて、文字列ですか・・・ありがとうございました。
勉強不足でした。
75デフォルトの名無しさん:2006/03/01(水) 02:05:40
memsetにかぎらず、printfなどいわゆる標準関数のソースって
どこで入手できる?
76デフォルトの名無しさん:2006/03/01(水) 02:14:42
Microsoftで
77デフォルトの名無しさん:2006/03/01(水) 02:20:20
なんで入手できると思う?
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言語で設計し、
その関数のソースコードを書いてください。

・・・こんな問題を出されたんですが、どういう意味なんでしょうか??
どなたか教えてください・・・;
80デフォルトの名無しさん:2006/03/01(水) 02:51:00
宿題は宿題スレへ
81デフォルトの名無しさん:2006/03/01(水) 02:51:33
それ以上説明の仕様が無い。
簡潔に分かりやすく書いてあると思うけど。
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");
とやってみましたが、全然変わらないです。

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

プラットフォームに関係なく
最新のデータを清算後にリネームする場面はいくらでもあると思うんですが。
実際、自分もこの後UNIXに移さないといけないですし。
9083:2006/03/01(水) 12:29:43
91デフォルトの名無しさん:2006/03/01(水) 12:40:47
>>83
まず、エラー要因の調査くらいしろ。
92デフォルトの名無しさん:2006/03/01(水) 13:03:04
ああ。rename()とremove()は ANSI C だな。
93デフォルトの名無しさん:2006/03/01(水) 14:03:46
>>83
WindowsならWinAPIのMoveFile類も試してみろ。
当然スレ違いだからWinAPIについて聞きたいときにはVC++やWinAPIのスレで聞くこと。
94デフォルトの名無しさん:2006/03/01(水) 15:08:48
95age:2006/03/01(水) 16:35:09
初心者なのですがgprofを用いて、プロファイルを見ていた
のですが、70%以上が"_fini"に費やされていました。
この関数はなんなのでしょうか?(おそらくfprintf関連かと予想しています)

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

>初心者なのですが
見苦しい言い訳だ。
97デフォルトの名無しさん:2006/03/01(水) 18:25:08
出た出たw
「自称初心者」を言い訳としか捉えられない人w
こういう人って自分にも思い当たる節があるんだろうな…。
テメーの使えねー脳みそのレベルを教える側の為の指針として明示してくれてんだよ。
例えそれが良い解決法だったとしても馬鹿にはあまり難しいこと教えても理解できないだろ?
そいつを防ぐ為の予防策だよ。ムカつくんなら教えなくていい。
98:2006/03/01(水) 18:28:27
  真正初心者
99デフォルトの名無しさん:2006/03/01(水) 18:30:08
>>95
プ ロ フ ァ イ ル 見 せ ろ
10095: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
10195: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
102デフォルトの名無しさん:2006/03/01(水) 18:42:56
>>101
勝手に端折るな
103デフォルトの名無しさん:2006/03/01(水) 18:47:22
>>100
MT法ですか・・・

_finiってmainのあとに実行される関数じゃなかったけ?
10495: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]
-----------------------------------------------
10595:2006/03/01(水) 19:03:36
>>103

はい、MT法です。とってきたのをそのまま用いているだけですが…。

>_finiってmainのあとに実行される関数じゃなかったけ?

うーん、そうなんですかね。
とりあえず、今回用いているプログラムには_finiという関数名
は見当たらないです。
106デフォルトの名無しさん:2006/03/01(水) 19:04:33
C言語歴がたったの20年しかない初心者なのでわかりません。
107デフォルトの名無しさん:2006/03/01(水) 19:07:19
>>105
Linuxいじったことねえからな〜
108デフォルトの名無しさん:2006/03/01(水) 19:13:44
ここに書いてあるっぽいですよ。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/dlopen.3.html

なんか後始末する関数?みたいですね。
109デフォルトの名無しさん:2006/03/01(水) 19:16:30
>>95
ttp://www.linux.or.jp/JF/JFdocs/Program-Library-HOWTO/miscellaneous.html

>5.2. ライブラリのコンストラクタ関数およびデストラクタ関数
あたりが参考になるかも?
古いデストラクタを制御する関数らしい
110デフォルトの名無しさん:2006/03/01(水) 19:23:25
ってことは、C++だからスレ違いかな?
111デフォルトの名無しさん:2006/03/01(水) 19:28:17
ここでいうデストラクタは、C++のインスタンスが破棄される時に呼ばれるアレぢゃなくて、
何らかの後始末をするルーチンのことを総称してそう呼んでるのでは?
11295: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
>>113
すべての {・・・} の外
115デフォルトの名無しさん:2006/03/01(水) 20:35:17
>>114
サンクス
116デフォルトの名無しさん:2006/03/01(水) 21:01:39
>>115
ただし、参照しているところよりも上で定義されていなければならない。
117デフォルトの名無しさん:2006/03/01(水) 21:11:54
>>116
前方でも宣言すればできるが…。
118デフォルトの名無しさん:2006/03/01(水) 21:24:15
宣言は関数内でもできる。定義は無理だけど

#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;
}
119デフォルトの名無しさん:2006/03/02(木) 03:10:46
CPadのLSI C−86 を使っている方で、
コマンドラインオプションのやり方がわからないので教えていただきたいです、
お願いします。ヘルプ見たのですが、どうもわからなくて・・・
120デフォルトの名無しさん:2006/03/02(木) 03:32:40
>>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にしろ
125デフォルトの名無しさん:2006/03/02(木) 08:57:44
>>122
Borland C++ならVirtualAlloc使えるだろ。
126デフォルトの名無しさん:2006/03/02(木) 09:24:17
>>125
そんな「高レベル」な話じゃないだろ
おおかた単にスタック調整の方法を知らないだけ
127デフォルトの名無しさん:2006/03/02(木) 11:14:30
printfで%を表示させたいのですが、どうすればでるのでしょうか?
128デフォルトの名無しさん:2006/03/02(木) 11:32:15
%%
129デフォルトの名無しさん:2006/03/02(木) 11:32:21
%%
130デフォルトの名無しさん:2006/03/02(木) 11:34:36
%%
131デフォルトの名無しさん:2006/03/02(木) 11:36:22
>>127
%%
132デフォルトの名無しさん:2006/03/02(木) 11:40:30
"%s", "%"
133デフォルトの名無しさん:2006/03/02(木) 11:48:14
>>99
ス レ 違 い の 相 手 を す る な
134127:2006/03/02(木) 12:04:06
あざーっす!
135デフォルトの名無しさん:2006/03/02(木) 12:40:49
>>127
printf( "%c", '%' );
136デフォルトの名無しさん:2006/03/02(木) 13:01:20
printf("%");
137デフォルトの名無しさん:2006/03/02(木) 13:10:35
printf("o/o");
138デフォルトの名無しさん:2006/03/02(木) 14:03:17
printf("%\x25");
139デフォルトの名無しさん:2006/03/02(木) 14:08:23
printf("÷");
140デフォルトの名無しさん:2006/03/02(木) 14:14:33
#define printf hoge_printf
int printf( const char *format, ...)
{
putchar('%');
}

void main()
{
printf(NULL);
}
141デフォルトの名無しさん:2006/03/02(木) 14:35:01
printf("O/\n");
printf("/O\n");
142デフォルトの名無しさん:2006/03/02(木) 14:56:02
変なコンテスト開催しないでください><
143デフォルトの名無しさん:2006/03/02(木) 15:38:23
144デフォルトの名無しさん:2006/03/02(木) 16:05:19
それはパーミル
145デフォルトの名無しさん:2006/03/02(木) 16:17:13
>>120

lcc file名 のように書いていただければありがたいのですが。
146デフォルトの名無しさん:2006/03/02(木) 17:42:40
>>145
オプションはlccとファイル名の間に空白で区切って指定する。
つうか個別のコンパイラの話はスレ違い。
147デフォルトの名無しさん:2006/03/02(木) 18:50:57
何故BCCで

void strcpy(char *to,char *from){
while(*to++ = *from++);
}

と書くとWarningが出るんでしょうか。
148デフォルトの名無しさん:2006/03/02(木) 18:51:29
>>147
if文で代入しているから
149デフォルトの名無しさん:2006/03/02(木) 18:56:39
>>147
==を誤って=と書き間違えてないか、と警告しているわけだ
150デフォルトの名無しさん:2006/03/02(木) 18:57:07
>>148
>>147のどこにif文があるのかと(ry

>>147
(whileの)条件式で代入しているため。
151デフォルトの名無しさん:2006/03/02(木) 19:03:35
ここは初心者スレなのか?
152デフォルトの名無しさん:2006/03/02(木) 19:07:18
このスレは超初心者から初心者まで、幅広く利用できるスレです
153デフォルトの名無しさん:2006/03/02(木) 19:07:26
そうだよ?
154デフォルトの名無しさん:2006/03/02(木) 19:15:27
>>145
こちらで聞いてみては?
http://pc8.2ch.net/test/read.cgi/tech/1141294369/
155デフォルトの名無しさん:2006/03/02(木) 19:58:43
>>148-150
成程。
ありがとうございます。
156デフォルトの名無しさん:2006/03/02(木) 22:02:27
サキュバスクエストなら俺に聞け
157デフォルトの名無しさん:2006/03/03(金) 12:13:10
>>150
あれは制御式ってゆうんだよ
これだから学のないやつは
158デフォルトの名無しさん:2006/03/03(金) 12:15:28


             ↓

      →     ゆう     ←

             ↑
159デフォルトの名無しさん:2006/03/03(金) 12:28:31
>>157
その名前を知らないからって何か困る事でも?
160デフォルトの名無しさん:2006/03/03(金) 13:45:50
正規表現を使って文字列の置換をしようと思い
regexecを使ってみたのですが
一行内で複数回マッチさせることができません
どのようにしたらいいでしょうか?orz
161デフォルトの名無しさん:2006/03/03(金) 14:16:28
とりあえずスーパーサイヤ人にでもなればいい。
162デフォルトの名無しさん:2006/03/03(金) 17:46:31
>>160
スレ違い
163デフォルトの名無しさん:2006/03/03(金) 19:54:50
>>160
pmatch[] とか使えばいんじゃないか?
164デフォルトの名無しさん:2006/03/03(金) 19:56:13
>>162
ああ。そうか。ANSI C とかとは関係ないな。
regexはPOSIXだ。
165デフォルトの名無しさん:2006/03/03(金) 20:05:20
ゴミみたいな雑談はOKでPOSIXはNGというのもわけのわからんスレだな
166デフォルトの名無しさん:2006/03/03(金) 20:48:32
Cの標準ライブラリで遅延処理を行う関数はありませんか?
forやwhileで遅延ループすると高負荷になってしまって。
167デフォルトの名無しさん:2006/03/03(金) 20:52:47
>>165<ゴミ
168デフォルトの名無しさん:2006/03/03(金) 21:36:43
>>166
sleep あたりかな。
169デフォルトの名無しさん:2006/03/03(金) 21:50:43
sleepってPOSIXだから標準ライブラリじゃないんじゃね?
標準で同等のは無かった希ガス
170デフォルトの名無しさん:2006/03/03(金) 21:51:51
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

てな感じでプリプロセッサに切り替えさせればいい。
171デフォルトの名無しさん:2006/03/04(土) 00:03:11
sleepつくりゃええやん
172デフォルトの名無しさん:2006/03/04(土) 00:09:43
( ゚д゚)ポカーン
173デフォルトの名無しさん:2006/03/04(土) 00:41:29
( ゚Д゚)カポーン
174デフォルトの名無しさん:2006/03/04(土) 01:19:36
(゚д゚)
175デフォルトの名無しさん:2006/03/04(土) 02:10:58
チャンクってみんな知ってる?
176デフォルトの名無しさん:2006/03/04(土) 02:16:34
知ってる
177デフォルトの名無しさん:2006/03/04(土) 02:29:31
>>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++にはあるのでしょうか?
179デフォルトの名無しさん:2006/03/04(土) 08:28:20
>>178
Cの標準ライブラリにはない。
C++の標準ライブラリにもそのような置換をする関数はない。
(指定した箇所を指定した文字列で置換する関数はあるが、検索して置き換えるというものはない)

1から作るのが面倒なら置換を持った正規表現のライブラリを探せばいいと思う。
180デフォルトの名無しさん:2006/03/04(土) 10:26:38
>>178
strstr()/strchr()とsprintf()を組み合わせれば数行でできるよ。
181デフォルトの名無しさん:2006/03/04(土) 10:34:10
>175
>176
チャンクって何ですか?
182デフォルトの名無しさん:2006/03/04(土) 11:06:24
>>181
>>1のテンプレより
>質問する前には最低限検索を。

検索しても理解できなかったんだな。
そんな低能は芯だほうがいいね。
183デフォルトの名無しさん:2006/03/04(土) 11:40:50
検索しても分かりませんでした。
チャンクって何ですか?
184デフォルトの名無しさん:2006/03/04(土) 11:43:52
データの塊みたいなもん
http://www.usagi-goten.com/jp/AVI_structure.html
185デフォルトの名無しさん:2006/03/04(土) 11:49:27
チャンコなら知ってる
186デフォルトの名無しさん:2006/03/04(土) 11:49:43
教える馬鹿が一番たちが悪い
187デフォルトの名無しさん:2006/03/04(土) 11:58:57
チャンクの意味はわかったけど利用方法というか利用価値というか
みなさんは普通、チャンクをどのように使用しますか?

ログ?
188デフォルトの名無しさん:2006/03/04(土) 12:00:02
スレ違い
189デフォルトの名無しさん:2006/03/04(土) 12:00:53
じゃあ>>175は何だったの?
190デフォルトの名無しさん:2006/03/04(土) 12:01:18
わからんなら使わなけりゃいいじゃない
191デフォルトの名無しさん:2006/03/04(土) 12:02:22
わからないなら必要無いという事だ。
192デフォルトの名無しさん:2006/03/04(土) 12:04:30
>>187
マルチメディア系のデータの塊をチャンクと呼ぶことが多いというだけで
その質問に意味はない。質問の意図を明確にして一般スレで聞きなおせ。
193デフォルトの名無しさん:2006/03/04(土) 12:12:59
>187
他人が作った昔のソースを眺めていたらLOGという名のディレクトリにチャンクに関する
ソースがあった。

だから、ログの機能でつかうんじゃないの?
194デフォルトの名無しさん:2006/03/04(土) 13:22:16
じゃぁそれでいいだろ。
はい、次の人。
195デフォルトの名無しさん:2006/03/04(土) 13:40:49
>>178
後者はC++にある。けど(文字列ではなく)文字の置換になってるのがただのtypoならやっぱりない。
196デフォルトの名無しさん:2006/03/04(土) 16:16:37
if.exeというファイルをつくってコマンドプロンプトから
if
と入力して実行しようとしたら
「コマンドの構文が誤っています。」
と出たんですが、なぜでしょうか?

因みにif.exeと拡張子まで入力したら実行できました。
197デフォルトの名無しさん:2006/03/04(土) 16:25:02
これって何でだめなんでしたっけ?
理由が良く分かりません。

#include <stdio.h>

char* aaa;

void func(void){
  char bbb[] = "Hello.";
  aaa = bbb;
  return;
}

int main(void){
  func();
  printf("%s\n", aaa);
  return 0;
}
198デフォルトの名無しさん:2006/03/04(土) 16:25:24
>>196
C:\>help if
199196:2006/03/04(土) 16:30:35
>>198
ありがとうございました。
200デフォルトの名無しさん:2006/03/04(土) 16:31:46
>>197
変数の寿命を考えれ
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デフォルトの名無しさん:2006/03/04(土) 16:41:32
とーしろならどっちでもいい
プロならいけない事
203デフォルトの名無しさん:2006/03/04(土) 16:42:56
>>201
書いてあるとおりだと思うが・・・
204デフォルトの名無しさん:2006/03/04(土) 16:47:11
>>202
そうですか。
もう一つ質問ですが、
printf("%e\n",pai);の所を3.141593e+00ではなく3.141593e+000

printf("もう少し詳しい値は%20.18fです\n",pai);の所を
もう少し詳しい値は3.141592653589790007ですではなく
もう少し詳しい値は3.141592653589790000

にするにはどうしたらいいですか?
205デフォルトの名無しさん:2006/03/04(土) 16:49:08
>>203
何がいけないのかを聞いてるんだろ。
つーか何故最初に2を代入した?
206デフォルトの名無しさん:2006/03/04(土) 16:52:10
>>204
doubleの精度が高い環境でコンパイルして動かす。
もしくはprintf("もう少し詳しい値は%20.17f0です\n",pai);

>>205
「なにがいけないか?」ではなく「いけない事なのか否か?」を聞いてるんでしょ。
207デフォルトの名無しさん:2006/03/04(土) 16:52:45
paiはねーだろpaiは
208デフォルトの名無しさん:2006/03/04(土) 16:55:21
いや、多数決でいかんのは「flt」だと思う。furotoとかtan(単精度)とかがよからまし。
209201:2006/03/04(土) 16:55:38
>>207
なんで?
210デフォルトの名無しさん:2006/03/04(土) 16:58:52
>>209
paiは2つしかないから。
211デフォルトの名無しさん:2006/03/04(土) 16:59:46
  _   ∩
( ゚∀゚)彡 おっpai!おっpai!
 ⊂彡
212デフォルトの名無しさん:2006/03/04(土) 17:01:00
πはギリシャ語で
英語ではpiと書く。
213201:2006/03/04(土) 17:01:03
>>210
何が2つしかないの?
214デフォルトの名無しさん:2006/03/04(土) 17:06:17
>>213
  _   ∩
( ゚∀゚)彡 おっpai!おっpai!
 ⊂彡
215デフォルトの名無しさん:2006/03/04(土) 17:06:21
スペースアルクで調べたところ、paiは100です。
216デフォルトの名無しさん:2006/03/04(土) 17:18:00
>>201
paiotu
217デフォルトの名無しさん:2006/03/04(土) 17:32:20
>>208
tanはだめだろtanは

つかfloatに何かくっつケロ
218デフォルトの名無しさん:2006/03/04(土) 18:23:47
tan壷
219デフォルトの名無しさん:2006/03/04(土) 18:35:29
    / / / / /  / 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
              ,,,-/,,-'''"ヽ  ,,,,-‐''-─'/ |   ,,-''/                |
           ,,-‐'"/-'/┌‐''''/    /ノ ,,-| ,,-'ヽ/                 |
220デフォルトの名無しさん:2006/03/04(土) 18:35:59
         /    /-‐入 ./   /''",-'''ヽメ /                   |
        /ノ    ノ_,二l///"  ,-''"-''"ヽ\ ,,-'"                    |
       //,,    /-─l  // ,,‐'"''" ゙i ヽ_,,-‐___    | /                |
      ,,-''~   /-‐''/   /‐"~ヽ,,メ=ニ二 ̄   、    Y  ,,              |
    ,,-'~     メ‐''"~| ,,l,,-‐'''"~--──-、,,_゙"''ヽ-、,,_゙''‐-、| /               |
   ./      {,,-,r-''"  ,-‐''~'''''─-,-、,,_゙ヽ、゙'''ヽ-、゙''ヽ、∨                 }
  ., '       ,,,/   ‐''''~~ ̄≧-、,,, / /ヽ-、-゙''ヽ-、゙"''メ,                 i
 /       /''"      ,,-‐'"~ ,,,-‐''---、,/_ ゙/ヽ-、 ̄"'ヽi                |
. i       /         ,,,,/~   ....::::::.:.. \、/ ゙/ヽ、 ヽ.               |
.{    ,,-'''i'"        エ二,,,,,,,,,,,,,,;;;;、,,;).:.:.::   ゙ヾ、 / ゙メ、ヽ.              |
"i,  ,,-イ‐/ヽ          ___,,,,,-‐':.:.:.:.:.:     \、 ノ /ヽ,               ノ
 ∨~ |''"/''ヽ       ,-'゙i                 ヾ / l              ゙i,
‐'"   |// ゙メ、   ,/// ゙、                ∧ソ./}               }
221デフォルトの名無しさん:2006/03/04(土) 18:52:47
>>219-220
二人とも何を貼っている?
222デフォルトの名無しさん:2006/03/04(土) 18:57:21
>219-220
おもわず、ちんこがたちました
223デフォルトの名無しさん:2006/03/04(土) 19:08:15
かちんこちんのちんこ
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
-----------------------------------
225デフォルトの名無しさん:2006/03/04(土) 19:43:41
マルチポスト市ね
おまえみたいな奴は社会に出てもお荷物になるだけだから
226デフォルトの名無しさん:2006/03/04(土) 20:34:08
C言語習得した事によって、何ができる?
227デフォルトの名無しさん:2006/03/04(土) 20:38:01
>ランタイム ライブラリ リファレンス
>NULL

>NULL は、多くのポインタ演算およびポインタ関数で使用される NULL ポインタの値です。

MSDN殺す
228デフォルトの名無しさん:2006/03/04(土) 20:41:05
タブ区切りのデータ(数値のみ)で列数が任意数あるファイルを読み込むとき、
sscanfでやるのは限界があるような気がします。

そこで考えたのが、sprintfの反復試行による分割なのですが、効率を考えると気が進みません。
定石ともいえる方法はどんな方法でしょうか?
229デフォルトの名無しさん:2006/03/04(土) 20:42:25
↑ごめんなさい。
タブ区切りで配列に入れることが目的です。
230デフォルトの名無しさん:2006/03/04(土) 20:45:28
データの先頭のポインタ覚えといてstrstrでスキャンしながら切り出していく
231デフォルトの名無しさん:2006/03/04(土) 20:46:52
訂正:一文字ずつコピーしながら区切りのタブを検索していく。
232デフォルトの名無しさん:2006/03/04(土) 21:05:38
>>226
ウィルスの作成、スパムツールの作成、ワームの作成、
233デフォルトの名無しさん:2006/03/04(土) 21:18:30
>>231
ありがとうございます。
マジっすか、もうちょっと調べてみます。
234デフォルトの名無しさん:2006/03/04(土) 21:19:18
>>232
ありがとうございます。
勉強するのやめます。
235デフォルトの名無しさん:2006/03/04(土) 21:19:25
>>226
AIが止まらない! を読むんだ
236デフォルトの名無しさん:2006/03/04(土) 21:24:44
sscanfをやめてfscanfで一つづつ読む。
ただしこれだと行末に来たのかどうかが分からない。
237デフォルトの名無しさん:2006/03/04(土) 21:26:37
調べる間に書き終わるだろ・・・
238デフォルトの名無しさん:2006/03/04(土) 21:28:58
1行読み込む(やり方は適宜調べよ)。末尾位置を退避。
\tを\0に変換。
先頭をatoi。strlen+1だけ後ろにずれる。…というのを末尾まで繰り返す。
239デフォルトの名無しさん:2006/03/04(土) 21:31:16
>\tを\0に変換。
イミナサス
240デフォルトの名無しさん:2006/03/04(土) 21:34:16
>>235
結構好きだw
アセンブリも使えるようになりたい俺
241デフォルトの名無しさん:2006/03/04(土) 22:57:31
エディタは何使ってる?
242デフォルトの名無しさん:2006/03/04(土) 23:09:11
vi
243デフォルトの名無しさん:2006/03/04(土) 23:11:19
vim
244デフォルトの名無しさん:2006/03/04(土) 23:18:43
>>242-243
d
でも色んな種類があるんだな(´・ω・`)迷う
245デフォルトの名無しさん:2006/03/04(土) 23:18:58
xyzzy
246デフォルトの名無しさん:2006/03/04(土) 23:21:30
emacsよりvi派です。
247デフォルトの名無しさん:2006/03/04(土) 23:29:34
XXYBA
248デフォルトの名無しさん:2006/03/04(土) 23:44:09
ゴミみたいな雑談は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を使うのはやめとけ。
251デフォルトの名無しさん:2006/03/05(日) 00:14:09
strncpy(d, s, n);
*((char*)d+n)=0;
を1命令でやってくれる関数ないですか?
252デフォルトの名無しさん:2006/03/05(日) 00:20:52
>>251
一命令でこなす関数と言うかCPUはシラね

つ【strlcpy】
253デフォルトの名無しさん:2006/03/05(日) 00:21:25
>>251
sprintf(d, "%.*s", n, s);
254デフォルトの名無しさん:2006/03/05(日) 00:28:33
トーシローが適当に書いてみるテスト
*(strncpy(d, s, n) + n) = 0;
255デフォルトの名無しさん:2006/03/05(日) 00:29:46
strncpy(d, s, n)[n] = '\0';
256デフォルトの名無しさん:2006/03/05(日) 00:31:58
>>252
サンクス。BSD系のものですね。
しかし何でWikipediaに載ってるんだw
257デフォルトの名無しさん:2006/03/05(日) 00:39:34
autoconfを活用すればどの環境でも使える
258デフォルトの名無しさん:2006/03/05(日) 00:58:26
257が理解せずに書いてるように思えて仕方がない
259デフォルトの名無しさん:2006/03/05(日) 01:07:34
/*
260デフォルトの名無しさん:2006/03/05(日) 01:44:59
スレ違いだったらすいません。
C言語でプログラムを作り、H8マイコンに入力して、オシロスコープに
文字(アルファベットなど)を表示させるという実験をしているのですが、
どう考えたらいいか分かりません。sin波形や円は出せたのですが、文字に
ついてはサッパリです。どなたか分かる方、考え方を教えて下さい。

261デフォルトの名無しさん:2006/03/05(日) 01:46:46
スレ違い。
プログラム関係ない
262デフォルトの名無しさん:2006/03/05(日) 01:51:00
オシロスコープに文字を表示させることじたい無謀な気がするんだが・・・
263デフォルトの名無しさん:2006/03/05(日) 01:52:42
>>262
そんな事無いぞ
264デフォルトの名無しさん:2006/03/05(日) 01:54:54
>>263
今ググって見たがそんな機能がついてるものがあったなんて・・・
265デフォルトの名無しさん:2006/03/05(日) 01:56:40
>>264
機能なんて必要ないって。
オシロの基本の機能だけでできる。
266260:2006/03/05(日) 02:01:30
ちょっと質問が悪かったです。
文字というのは、H8マイコンの出力をオシロで観測して、波形の
組み合わせで作るという事です。
また、この質問について、どなたかスレ誘導お願いします。
267デフォルトの名無しさん:2006/03/05(日) 02:03:27
>>266
円ではなく線を書くのはできた?
268デフォルトの名無しさん:2006/03/05(日) 02:14:12
せめて制御系スレに行ってください。
269260: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;
}
}

この自分と同じ型へのポインタを持つやつの扱い方がなんかあやふやなんですが
なんか書いててすごく違和感があるんですがこの書き方は変で普通こう書くって部分はありますか?
(実際に書いてるのはこのデータ構造ではないのでこの場合特有というのではなく、一般的な話で)
271デフォルトの名無しさん:2006/03/05(日) 02:20:35
>>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;

だよな。
275270:2006/03/05(日) 02:43:44
>>271
LISTは間違ってました

>>273,>>274
なるほど確かにそうですね


ありがとうございました
276デフォルトの名無しさん:2006/03/05(日) 02:49:08
中規模な数値計算プログラムを書いています。
実際はケースバイケースだとは思いますが、
VisualC++8[高速化オプション]+Pentium4 PCの場合
a+b と a*b の実行速度は大体何倍くらい
違うんでしょうか?
277デフォルトの名無しさん:2006/03/05(日) 02:49:51
自分で測定汁
278デフォルトの名無しさん:2006/03/05(日) 05:02:07
プログラムのプの字も分からないくらいのど初心者が、
それこそ基礎の基礎から分かるようなC言語の参考書などありますか?
279デフォルトの名無しさん:2006/03/05(日) 05:02:23
無い
280デフォルトの名無しさん:2006/03/05(日) 05:51:03
プの字もってコンパイラもIDEも隣家も何それ状態だろ
初期の俺がそうだったからわかる
281・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/05(日) 05:57:09
>>276
5倍は違う
282デフォルトの名無しさん:2006/03/05(日) 05:59:09
>>276
3倍くらい
283デフォルトの名無しさん:2006/03/05(日) 06:28:32
12倍ぐらいじゃない
284デフォルトの名無しさん:2006/03/05(日) 06:45:13
そんなにいかねーよ、2倍だろ
285デフォルトの名無しさん:2006/03/05(日) 08:51:21
>>249
それかっこいいですね!使わせていただきます!
286デフォルトの名無しさん:2006/03/05(日) 10:46:42
*/
287デフォルトの名無しさん:2006/03/05(日) 10:55:40
>>285
プ
288デフォルトの名無しさん:2006/03/05(日) 11:18:35
>>285
ポ
289デフォルトの名無しさん:2006/03/05(日) 12:13:22
「!=」を入力するの大変なんだけど。
右小指でシフト押して「!」、左小指でシフト押して「=」。あほか
290デフォルトの名無しさん:2006/03/05(日) 12:25:27
左親指で左シフト押したまま左薬指で!、右中指で=
291デフォルトの名無しさん:2006/03/05(日) 12:26:29
Delphiなら<>ってかけるぞ。乗り換えろ。
292デフォルトの名無しさん:2006/03/05(日) 12:51:12
でふぁいんしる
293デフォルトの名無しさん:2006/03/05(日) 12:56:01
どうやるの
294デフォルトの名無しさん:2006/03/05(日) 13:07:18
#define not_eq !=
295デフォルトの名無しさん:2006/03/05(日) 13:08:10
これで<>
296デフォルトの名無しさん:2006/03/05(日) 16:20:22
Cファイルのファイル名に規制とかある?
全角使っちゃだめとか、文字数制限とか
297デフォルトの名無しさん:2006/03/05(日) 16:40:41
それOS依存
Winならパス込みで256文字以下でスペース・全角込みでもOK
298デフォルトの名無しさん:2006/03/05(日) 16:40:44
OSとかコンパイラに依存。
MS-DOS/Windows16ビット版は最大8文字だった。
299296:2006/03/05(日) 16:42:25
>>297-298
ありがとうございました。
300デフォルトの名無しさん:2006/03/05(日) 16:51:32
おまいら、コンパイラ何使ってる?
301デフォルトの名無しさん:2006/03/05(日) 17:03:28
High C
302デフォルトの名無しさん:2006/03/05(日) 17:08:40
>>294
<iso646.h>があるだろ。
303デフォルトの名無しさん:2006/03/05(日) 17:46:28
Machine C


あ、コンパイラじゃねえ
304 :2006/03/05(日) 17:50:45
C言語におけるプログラムのスッタク領域に積まれるアドレスで
ローカル変数、関数の引数、リターンアドレス、ebpレジスタの保存値が
挙げられますが、このebpレジスタの値とは、main関数やユーザー定義関数等
での始まりのアドレスの値の事を指していると言う解釈でよろしいでしょうか?

どなたかebpレジスタの値について、大まかな説明をして頂けませんか?お願いします。
305デフォルトの名無しさん:2006/03/05(日) 17:51:56
すいません名前消し忘れました。あとスタックでした。申し訳ないです
306デフォルトの名無しさん:2006/03/05(日) 17:54:56
(・∀・)スッタク!!
307デフォルトの名無しさん:2006/03/05(日) 17:58:22
ebpレジスタで検索かけた上で聞いてるのか?
308304:2006/03/05(日) 17:59:25
すいません自己解決してしまいました。スルーして下さい。
309デフォルトの名無しさん:2006/03/05(日) 17:59:55
>>304
アセンブラ系のスレの方がいいかもね。
うろ覚えで間違っているかもしれないけど、ebpは積まれている
現在のアドレスだったような気がする
310304:2006/03/05(日) 18:00:40
>>307
なんとなく理解できました。すいませんでした・・・。以後気をつけます。
311304:2006/03/05(日) 18:02:22
>>309
わざわざありがとうございます。すいませんでした。本当に申し訳ないです
312309:2006/03/05(日) 18:07:36
やべーespと勘違いしていた(汗)
でも自己解決したならいいか。スレ汚しスマソ
313デフォルトの名無しさん:2006/03/05(日) 19:25:27
アーキテクチャ依存の話をするな
314デフォルトの名無しさん:2006/03/05(日) 19:40:08
脊髄反射乙
315デフォルトの名無しさん:2006/03/05(日) 20:17:22
エスパーの話はするくせに
316デフォルトの名無しさん:2006/03/05(日) 20:54:18
Visual C++ 2005 Express Editionを導入して、自分に合わなかったので削除したら
Cファイルが開けなくなってしまいました。
何が原因でしょうか?

http://www.imgup.org/iup172215.jpg
317デフォルトの名無しさん:2006/03/05(日) 20:55:25
無理やり開いてアプリと関連付けろ
318デフォルトの名無しさん:2006/03/05(日) 20:56:47
>何が原因でしょうか?

>Visual C++ 2005 Express Editionを導入して
>削除した
から
319デフォルトの名無しさん:2006/03/05(日) 20:59:43
元に戻すにはどうしたら?
320デフォルトの名無しさん:2006/03/05(日) 21:02:14
321デフォルトの名無しさん:2006/03/05(日) 21:06:19
どうしてみんな後藤さんを嫌うの?
322デフォルトの名無しさん:2006/03/05(日) 21:10:34
>>319
Microsoft .NET Framework 2.0
Microsoft .NET Framework 2.0 日本語 Language Pack

この二つ消してみ
323デフォルトの名無しさん:2006/03/05(日) 21:10:44
ITブームに乗って人財産稼ぎたく
C言語という物を始めてみたいのですが
OSの入れ方が分かりません。
何が原因でしょうか?
324デフォルトの名無しさん:2006/03/05(日) 21:11:36
>>323
なんでC言語始めるのにOSの入れ方聞くの?
325デフォルトの名無しさん:2006/03/05(日) 21:13:20
>>324
氏ね
326324:2006/03/05(日) 21:14:58
>>325
寂しい人生おくってんだね。女房の尻にしかれてこんなところでしかストレス発散できない。
がんばれ。応援するよ。
327デフォルトの名無しさん:2006/03/05(日) 21:27:15
http://www.imgup.org/iup172215.jpg

「VCExpress.c.8.0」と書いてあるところを「Cファイル」にするにはどうしたらいいですか?
>>322
削除したけど元に戻りませんでした。
328・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/05(日) 21:29:20 BE:255945555-
フォルダオプションで関連付け弄れよ。スレ違いっていうか板違い。
329デフォルトの名無しさん:2006/03/05(日) 21:47:45
あらゆる物の入り口でつまずいて中には入れなさそうな316に幸あれかし
330デフォルトの名無しさん:2006/03/05(日) 21:48:54
やっと元に戻りました(´・ω・`)
331デフォルトの名無しさん:2006/03/05(日) 23:35:36
ちっ戻りやがったか
332デフォルトの名無しさん:2006/03/05(日) 23:36:49
慌てるな、まだ振り出しに戻っただけだ
333デフォルトの名無しさん:2006/03/05(日) 23:39:23
俺はVC++のCファイルのアイコン好きだけどな
まぁ関連付けは標準エディタにしてるけど
334デフォルトの名無しさん:2006/03/05(日) 23:41:03
関連付けしたアプリ以外が持つアイコンでも良いんだけどね
335デフォルトの名無しさん:2006/03/05(日) 23:43:05
別に関係ないしね
336デフォルトの名無しさん:2006/03/05(日) 23:45:02
memcpy(buf+len,buf,len)

でlenはbufの長さなんだが上の場合bufの最後の要素を保持する
メモリの次からbufの内容がもう一個続くという解釈でよい?
337デフォルトの名無しさん:2006/03/05(日) 23:48:28
は?
338デフォルトの名無しさん:2006/03/05(日) 23:48:51
いいんじゃない?
lenが本当にbufの長さなら、バッファオーバーラン確実なわけだが
339デフォルトの名無しさん:2006/03/05(日) 23:52:41
buf+lenって何よ
340デフォルトの名無しさん:2006/03/05(日) 23:56:07
あ・・・lenって整数かスマソ
341デフォルトの名無しさん:2006/03/05(日) 23:56:11
ポインタ演算ですがなにか?
342デフォルトの名無しさん:2006/03/05(日) 23:56:56
>>338
bufの大きさはlenの2倍以上あり、
memcpyする前にbufのうち有効なデータを保持しているのはlen分だけだということでは?
343デフォルトの名無しさん:2006/03/06(月) 00:04:00
まだbufが(unsigned?) char*だと決まったわけじゃねえし、何とも言えないなあ。
344デフォルトの名無しさん:2006/03/06(月) 00:05:53
なぜ質問してる奴そっちのけでエスパーごっこしてるのか分からん。
345デフォルトの名無しさん:2006/03/06(月) 00:07:35
エスパーごっこって何?
346デフォルトの名無しさん:2006/03/06(月) 00:08:49
>なぜ
暇だから
347デフォルトの名無しさん:2006/03/06(月) 00:29:09
もっとポップでクールでセクシーでワイルドな質問を持ってきてくれよ。
348デフォルトの名無しさん:2006/03/06(月) 00:38:23
printf(const char * __format, ...);
こうゆう宣言はどうゆう意味なの?
349デフォルトの名無しさん:2006/03/06(月) 00:43:27
350・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/06(月) 00:46:16
可変長引数。
第1引数は形式の通り。第2引数以降は、主に第一引数で与えられたパラメータで指定される。
printfの場合、%dとか%sとかの書式を判断して、第2引数以降をスタックから取り出している。

第1引数の書式を間違える第2引数以降の解釈がおかしくなる危険を伴う、諸刃の剣。
素人にはお勧めできない。
351デフォルトの名無しさん:2006/03/06(月) 00:57:20
Thanks ☆☆** v( ̄ー ̄)v**☆☆ Thanks
352デフォルトの名無しさん:2006/03/06(月) 01:09:16
まぁスタックとは限らないがな
353デフォルトの名無しさん:2006/03/06(月) 01:47:33
スタックトレースを自作しようと思うのだが、
何をすればいいんだ?
エロいお前ら教えてくれ。
354デフォルトの名無しさん:2006/03/06(月) 02:16:30
環境依存なのでスレ違い
355デフォルトの名無しさん:2006/03/06(月) 04:06:53
標準関数の自作方法みたいの載ってるサイトないですか?
356デフォルトの名無しさん:2006/03/06(月) 04:11:43
>>355
・newlibのソースを読む
・Cマガの実用ライブラリ開発講座の連載を見る
357デフォルトの名無しさん:2006/03/06(月) 05:50:32
>可変長引数。

引数個々の長さを変更できたりはしないんだが・・・ もしかして可変個数引数のことか?

# 可変長と不定長を混同する奴がときどきいるが、それ以前だな・・・
358デフォルトの名無しさん:2006/03/06(月) 06:02:38
別に可変長引数で意味は通る気がする。
むしろ可変個数引数っていう言い方のが聞きなれない。
359デフォルトの名無しさん:2006/03/06(月) 06:26:59
すまん。ちょっと助けてください。
char型の変数から一文字ずつ取り出して行きたいのだが、どのような方法があるのでしょうか?
ファイルじゃないのでfgetじゃできなくて困っています。
360デフォルトの名無しさん:2006/03/06(月) 06:31:05
>別に可変長引数で意味は通る気がする。
                   ^^^^^^^^^^^
俺用語の典型だなw
361デフォルトの名無しさん:2006/03/06(月) 06:43:06
char型の変数には一文字しか入ってませんが
362デフォルトの名無しさん:2006/03/06(月) 06:51:19
個でも長でも俺用語だよ
可変引数(variable argument)ですから

可変.{0,2}引数程度なら俺は理解してやるよ
363デフォルトの名無しさん:2006/03/06(月) 08:55:09
>>359
char型の変数には最初から1文字しか入ってないから
迷うまでもない
364デフォルトの名無しさん:2006/03/06(月) 09:15:25
charの配列って事なら
char data[256], *p = data;
for(i=0; i<10; i++)
 printf("%c\n", *p++);
とかこんな感じ
365デフォルトの名無しさん:2006/03/06(月) 11:16:23
>>364
forでやるならいちいちポインタ使わなくても
for(i=0;i<10;i++) printf("%c\n",data[i]);
で良くないか
366デフォルトの名無しさん:2006/03/06(月) 13:15:59
ポインタを使うにしても、せめてこうしようと思う。
for (; *p != '\0'; ++p)
367デフォルトの名無しさん:2006/03/06(月) 14:40:56
>>363
複数バイト文字は無視していいのか? いいならいいんだが。
368デフォルトの名無しさん:2006/03/06(月) 15:31:08
どうすればC言語の中級者っていえますか?
369デフォルトの名無しさん:2006/03/06(月) 15:35:30
普通に喋れる人なら「しーげんごのちゅうきゅうしゃ」くらい言えます。
勇気を出して言ってみましょう。
370デフォルトの名無しさん:2006/03/06(月) 15:37:39
文法と標準ライブラリを諳んじて
一つのプロジェクトで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
無視しないでオシエレ。
374デフォルトの名無しさん:2006/03/06(月) 15:51:39
やりたい物、やらなければいけない物が無いのに、なんでプログラムなんてやるの?
375デフォルトの名無しさん:2006/03/06(月) 15:52:44
Cファイルのファイル名にチルダ~を使っても大丈夫ですか?
376デフォルトの名無しさん:2006/03/06(月) 15:53:37
sizeof

↑なんて読むの?
377デフォルトの名無しさん:2006/03/06(月) 15:55:16
さあもりさがってまいりました
378デフォルトの名無しさん:2006/03/06(月) 15:55:39
>>375
それはOS次第だがたいていは大丈夫。
ただエディタのテンポラリファイルとかに使われるから
間違って消されても知らないぞ。
379デフォルトの名無しさん:2006/03/06(月) 15:56:28
しっかり無視か。サイズオブに決まってんだろ。他にどう読むのか知りたいね。
380デフォルトの名無しさん:2006/03/06(月) 15:57:44
他人に聞かなくても、次に何をやればいいのか
自分で調べられるようになったら、中級者。
381デフォルトの名無しさん:2006/03/06(月) 15:59:37
>>380
うまい言葉ですね。わかりました。結局は自分で頑張るのが普通という事でしたか。
ありがとうございました。
382376:2006/03/06(月) 16:20:44
>>379
ありがとうございました。
383デフォルトの名無しさん:2006/03/06(月) 16:23:35
#include <stdio.h>

int main(void)
{
  char str[64];
  fgets("str",64,stdin);
  puts("str");

  return 0;
}

質問なんですが、これを実行すると出力文字が文字化けして表示されます。
原因はなんですか?
384デフォルトの名無しさん:2006/03/06(月) 16:23:43
>>378
間違えました。
Cファイルを保存しておくフォルダの名前です。
385デフォルトの名無しさん:2006/03/06(月) 16:26:15
>>383
久々にわろたwww
386デフォルトの名無しさん:2006/03/06(月) 16:26:42
>>383
おまい、Perlユーザーだろ?
387デフォルトの名無しさん:2006/03/06(月) 16:29:25
>>385
笑わないで教えて下さいorz

>>386
それが分かるのがすごいですね。
388デフォルトの名無しさん:2006/03/06(月) 16:31:42
"str"は文字列
strは変数
""取っ払え
389デフォルトの名無しさん:2006/03/06(月) 16:33:49
>>388
あっ!!実行できた!!!ダブルクォーテーションでしたか・・・。
初歩ミスすいません。ありがとうございました。
390デフォルトの名無しさん:2006/03/06(月) 19:20:30
>>389
Perlでも効率悪いからこんな書き方すべきじゃない
391デフォルトの名無しさん:2006/03/06(月) 19:28:15
>>386
なるほど。そういう見方があるか。
たいした洞察力だな、おまいはw
392デフォルトの名無しさん:2006/03/06(月) 19:30:01
UNIXやLinuxのシェルユーザーかも知れ
393デフォルトの名無しさん:2006/03/06(月) 19:56:19
puts( &1["\0aiueo"] );

どうやっても文字が表示されてしまいます
どうすればいいんでしょうか?
394デフォルトの名無しさん:2006/03/06(月) 20:02:16
puts( &0["\0aiueo"] );
395デフォルトの名無しさん:2006/03/06(月) 20:08:25
こんなソース書いてるやついたら殺したくなるな
396デフォルトの名無しさん:2006/03/06(月) 20:24:29
ここまで何をしようとしているかわからないコードは初めて。
397デフォルトの名無しさん:2006/03/06(月) 20:31:40
>>395
通報しま(ry
398デフォルトの名無しさん:2006/03/06(月) 20:35:11
>>393
/dev/null にリダイレクト。
399デフォルトの名無しさん:2006/03/06(月) 20:39:16
アドレスを表示したいのかとESPを使ってみる
400デフォルトの名無しさん:2006/03/06(月) 20:50:39
>>393
どうなる事を想定したのかも書けよ
401デフォルトの名無しさん:2006/03/06(月) 21:03:36
よーーーし、おまいら、まずは質問の前に童貞を捨てろ、つまる話が
「初めてのC」を理解してから出直せってことだ、わかったか?
402デフォルトの名無しさん:2006/03/06(月) 21:15:30
>>393,401
どう見ても釣りです
本当にありがとうございました
403デフォルトの名無しさん:2006/03/06(月) 21:16:26
>>402
釣りの意味わかってないだろ?単なるボケで釣りかよw
404デフォルトの名無しさん:2006/03/06(月) 21:17:22
>>393
puts( &1["\0aiueo"] );

/* puts( &1["\0aiueo"] ); */
405デフォルトの名無しさん:2006/03/06(月) 21:21:08
>>404
ソレダ!
406デフォルトの名無しさん:2006/03/06(月) 21:22:48
#define puts(x)
puts( &1["\0aiueo"] );
407デフォルトの名無しさん:2006/03/06(月) 21:31:42
'a'を表示したいのかも?
408デフォルトの名無しさん:2006/03/06(月) 21:48:13
>>362
晒しage
409デフォルトの名無しさん:2006/03/06(月) 21:52:40
>>407
んじゃこうか?
putchar("aiueo"[0]);
ていうか[]の中に定数使うなら putchar('a'); でいいな。
410デフォルトの名無しさん:2006/03/06(月) 21:57:54
狭いグループでのみウケるネタを全世界に放映して得意がってるアフォハケーン
411デフォルトの名無しさん:2006/03/06(月) 22:01:47
もともとプログラミングネタでウケる人間なんて微々たるもんなんだから目くそ鼻くそ
412デフォルトの名無しさん:2006/03/06(月) 22:03:59
何やってるのか分からないから教えて欲しい。
413デフォルトの名無しさん:2006/03/06(月) 22:05:31
世界中の「微々たる人々」にどのくらいウケるか平均レベルを知らないだけだろ
414デフォルトの名無しさん:2006/03/06(月) 22:07:47
>>362
晒しagain

# 同一人物くせえし
415厨房:2006/03/06(月) 22:17:21
C言語ってなに?
416デフォルトの名無しさん:2006/03/06(月) 22:24:36
417デフォルトの名無しさん:2006/03/06(月) 22:31:48
>>415
メジャーなプログラミング言語の1つ。
最近はどちらかというとC++/Java/C#への足がかりに勉強する奴が多い気がする。
418デフォルトの名無しさん:2006/03/06(月) 22:37:50
C言語、それは男のロマン
419デフォルトの名無しさん:2006/03/06(月) 23:01:13
C言語かっこいい!!
420デフォルトの名無しさん:2006/03/06(月) 23:15:14
C言語の入門書を読んで、感想文を書かなきゃいけないんですけど
・・・・・・・・・・・・・・何を書きゃいいんだ?
421デフォルトの名無しさん:2006/03/06(月) 23:16:58
>>420
printf("C言語はつまらない。\n");
422デフォルトの名無しさん:2006/03/06(月) 23:19:05
>>420
MsgBox("時代はVBだと思った。")
423デフォルトの名無しさん:2006/03/06(月) 23:20:00
レスありがとう!
でもそれだと感想文1行で終了だよ。。。はぁ。。。
424・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/06(月) 23:24:05 BE:184280663-
>>362
「可変長引数」で意味は通るよ。
スタックはいわゆる配列構造だからそれの長さが可変ってことで意味通るでっしゃろ。
http://www.google.com/search?num=50&hl=ja&ie=Shift_JIS&oe=Shift_JIS&q=%89%C2%95%CF%92%B7%88%F8%90%94

K&Rの訳本みたら「可変引数リスト」だった。
425デフォルトの名無しさん:2006/03/06(月) 23:32:55
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は無知だろう。レジスタ渡しだけで済むのは引数の個数が決まってる場合だけだ。
428デフォルトの名無しさん:2006/03/07(火) 00:02:23
>>427
お前の脳内規格はどうでもいいんだけど。
429デフォルトの名無しさん:2006/03/07(火) 00:08:12
JISにあるC言語の規格書を見ようと思ったんだが

。。。ただ今、ファイルを開いております。

しばらくお待ちください。

と出たまま見れない
この症状は俺だけかな?
去年は見れたんだけど・・・
430・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 00:13:16 BE:153567353-
気紛れでGCCのソース取ってきてるんでいろんなアーキ向けのstdarg.h見てるけど
どうみてもスタック実装です。本当にありがとうございました。
431デフォルトの名無しさん:2006/03/07(火) 00:18:13
規格では実装はスタックに限定していないが実質ほぼスタック実装、でFA
432デフォルトの名無しさん:2006/03/07(火) 00:43:42
>>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 秒)



# ちなみに、漏れは「可変個引数」派
433デフォルトの名無しさん:2006/03/07(火) 00:59:32
スタックマシン以外ではCを実装しちゃいけませんか、そうですか。
434デフォルトの名無しさん:2006/03/07(火) 01:07:58
"可変引数"だと911件という罠
435・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 01:09:09 BE:122854043-
アキュムレータマシン・レジスタマシン・スタックマシンなんて区別って、いまどき意味あんのかなぁ。
PowerPCなんかにもスタック専用レジスタはないけどソフト的にスタック作って管理してんじゃん。
push/pop専用命令があるかどうかなんて問題じゃないと思うんだ。
436429:2006/03/07(火) 01:30:03
ごめんね、反応もらえないからアドレス出しておく
ttp://www.jisc.go.jp/app/pager?id=139035
437・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 01:39:55 BE:429988267-
>>436
404っぽくね?
438デフォルトの名無しさん:2006/03/07(火) 02:26:46
>>427
自動変数をスタックに作らなくても実現は出来る。
引渡す時にとにかく引数が列んでいればいい。
スタック構造のデータを使うとしても、それがCPUの
持つスタックレジスタを利用したものでなくても良い。

実際のところ、リターンアドレスまで入っている場所を
バッファオーバーフローをチェックしない言語の変数
領域として使うというのは危ない設計のように思える。
せめてリターンアドレスと関係ない所に作った方がいい
んじゃないだろうか。
439デフォルトの名無しさん:2006/03/07(火) 02:47:07
>>432
アフォが多いのはわかったよ

だが、どうあがいても誤りは誤りであって
言葉遣いがおかしいのを指摘されて
まだ正式名を調べずに必死で突っぱるだけな
DQN ぶりはとりわけム板では痛いだけ
440デフォルトの名無しさん:2006/03/07(火) 02:53:14
>>436でも紹介されてるJISによるC言語の規格書では
「可変個数の実引数」と呼ばれてるよ

K&Rほど一般的ではないかもしれないが、JISの規格書だしこっちが正統だと思うんだが
441デフォルトの名無しさん:2006/03/07(火) 02:57:00
可変個数 の検索結果のうち 日本語のページ 約 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とか研究で使ってる先生だけど。
446デフォルトの名無しさん:2006/03/07(火) 03:23:30
何の実装だったかは忘れたが、可変個数の引き数をレジスタに積めるだけ積むのがあったな。
通常使うような、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
こうすれば?

□□□□□□□□□□□□□□□□
□□□□□□■■■■■■■■■■←スタック
●●●●●●●●●●●●●●●●←コード(リードオンリー)
●●●●●●●●●●●●●●●●(書き込みアクセス不可)
●●●●●●●●●●〇〇〇〇〇〇
バッファ→
■■■■■■■■■■□□□□□□
□□□□□□□□□□□□□□□□
449デフォルトの名無しさん:2006/03/07(火) 03:28:12
まあ、指導者の影響はすごく受けやすいけど・・・
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-
http://www.google.com/search?num=50&hl=ja&inlang=ja&ie=Shift_JIS&oe=Shift_JIS&q=%22%89%C2%95%CF%92%B7%88%F8%90%94%22+site%3Aco.jp&lr=
つか、どれが間違いだとか宗教じみてるから辞めない?


正規表現のバックリファレンスが前方参照か後方参照か並に不毛だと思う。
454デフォルトの名無しさん:2006/03/07(火) 03:42:50
すげえ、工業規格が宗教かい
455デフォルトの名無しさん:2006/03/07(火) 03:42:51
JIS規格ってあれだろ?
"ナル文字"とかいう言葉使ってるやつだろ?
456デフォルトの名無しさん:2006/03/07(火) 03:45:25
もともと不毛な行き違いを防ぐためにあるものに
俺は従わないって主張されちゃ勝手にしろとしか言いようがない
457デフォルトの名無しさん:2006/03/07(火) 03:48:29
言語弁護士と呼ばれたいんだけどどうすればいいですか?
458・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:48:31 BE:122854526-
日本をニホンともニッポンとも読めるくらいの大らかさがあってもいいじゃないですか。
459デフォルトの名無しさん:2006/03/07(火) 03:49:51
まあ、宗教より定説でがんばっておくんなせえ
460デフォルトの名無しさん:2006/03/07(火) 03:50:19
コテハンうぜー
461・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/07(火) 03:56:07 BE:829262399-
JIS X 3010はC言語の処理系やライブラリの標準化のためのものであって
言葉狩りのためじゃないと思う。
462デフォルトの名無しさん:2006/03/07(火) 03:59:37
>>439
とりあえずソース出せ
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
あんたも言葉遣いがおかしいよ
人に物事を頼んだり尋ねたりするときは相応の態度で言いな
466デフォルトの名無しさん:2006/03/07(火) 04:06:11
「Cプログラミング言語」の規格の文書の文中に出てくる【個々の語句】まで

同時に標準規格化されたものと思い込んでる痛い奴が居るスレはここですね?
467デフォルトの名無しさん:2006/03/07(火) 04:07:59
いいんじゃね? ANSI とか言いながら米国規格の原文出せない奴も居るようだし
468デフォルトの名無しさん:2006/03/07(火) 04:14:02
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}引数まで理解したるか
471デフォルトの名無しさん:2006/03/07(火) 07:51:09
可変引数:非 const 引数とか、参照渡しの引数とか、そんな感じにも聞こえて紛らわしい。
可変長引数:引数の個数って長い短い・・・なのか? 日本語おかしくね?
可変個数引数:ちと冗長。可変個引数でいい。
可変引数リスト:何が可変なのかよく分からん。
472デフォルトの名無しさん:2006/03/07(火) 08:37:55
>>471
>可変長引数:引数の個数って長い短い・・・なのか? 日本語おかしくね?
「長い文字列」に対して、「文字の個数が長い短いっておかしくね?」って言ってるようなもんだぞ
473デフォルトの名無しさん:2006/03/07(火) 08:56:11
ひどい学歴コンプレックスを持った人間が混ざっていますね
474デフォルトの名無しさん:2006/03/07(火) 10:26:29
このへんの用語なんて画一的なものがないんだから好きなの使っておけばおk。否定一切無し。
「Cの規格書に書いてある言い回しだけが正しい」ってのはただの基地外。何時言い回しまで規格化されたんだよw
475デフォルトの名無しさん:2006/03/07(火) 10:33:01
用語に標準はないっ! と机を叩いてがんばってるアレな人が取り残されるのを助けてやるほど甘かねえし
476デフォルトの名無しさん:2006/03/07(火) 10:40:55
>>475は夜中からずっとがんばってるみたいだけど暇な学生かニートかな。
477デフォルトの名無しさん:2006/03/07(火) 10:41:59
>>475
ニート乙
478デフォルトの名無しさん:2006/03/07(火) 10:48:28
ミスリード甚だしいな。
規格書にない用語はおかしい!と机を叩いて頑張るアレな>>475であった。
479デフォルトの名無しさん:2006/03/07(火) 11:01:04
プログラム技術板で人格攻撃にシフトする必要の出るような雑魚に心配してもらっても1円にもならん
480デフォルトの名無しさん:2006/03/07(火) 11:03:17
ぬるぽ
481デフォルトの名無しさん:2006/03/07(火) 11:05:58
プログラミングにおける、予約語のようなものでなく汎用的な用語を標準化するにしても、
普通は個々のプログラミング言語とは切り離して行われるもの。
引数の個数が可変な函数はC以前の言語から存在したものでCから始まったものじゃないし。

特許文書とか規格書とか書いたこと無い奴にはわからんだろうなぁ。
482デフォルトの名無しさん:2006/03/07(火) 11:06:30
ガッ
483 :2006/03/07(火) 11:09:32
質問しますが、前からずっと探してるんですが、
→「汎用」これは何て読むんですか?
ばんよう でも ぼんよう でも無いですし、何て言っているのか教えて下さい。
484ぬるぽ:2006/03/07(火) 11:21:04
おまいらなんか〜〜〜〜〜〜〜〜嫌いだ・・・大嫌いだ。
485デフォルトの名無しさん:2006/03/07(火) 11:24:30
486デフォルトの名無しさん:2006/03/07(火) 11:25:03
>>483
謝れ!エヴァンゲリオンに謝れ!
487デフォルトの名無しさん:2006/03/07(火) 11:31:08
>>485
凄まじくかっこ悪い呼び名なんですね・・・。
やっぱり皆大好きだ〜〜〜〜〜〜〜(ノ∀`)ありがとうございます。満足しました。

>>486
エヴァンゲリオン知ってれば読めるって事かな?9巻しか持ってないです。
488デフォルトの名無しさん:2006/03/07(火) 11:35:27
釣りじゃ無かったのか・・・
489デフォルトの名無しさん:2006/03/07(火) 11:58:38
もしかして、地図の凡例も「ぼんれい」とか読んでるのか。
490デフォルトの名無しさん:2006/03/07(火) 12:02:35
なんだ違うのか
491デフォルトの名無しさん:2006/03/07(火) 12:04:05
>>487
まあ10巻はこれからだからね。原作も何もかもあるのにこれほどゆっくりな連載も珍しい。

>>483
http://dictionary.goo.ne.jp/search.php?MT=%A4%CF%A4%F3%A4%E8%A4%A6&kind=jn&mode=0&base=1&row=3
492デフォルトの名無しさん:2006/03/07(火) 16:38:05
char *func(void)
{
return "";
}

関数内から空文字列を返す方法として、上記の方法は間違ってるでしょうか?
リテラルだからリードオンリーですが、関数内のリテラルは関数の終了と同時に消滅
するのでしょうか? それともコンパイラによってまちまちなんでしょうか?
493デフォルトの名無しさん:2006/03/07(火) 16:49:11
>>492
const char * func() {return "";}
なら問題ない。リテラルはstatic同様の期間、生き続ける。
494デフォルトの名無しさん:2006/03/07(火) 16:53:32
>間違ってるでしょうか?

という問いに対する答えだろうか
495デフォルトの名無しさん:2006/03/07(火) 17:10:21
>>492のような関数で、自作関数名に*をつける場合は(>>492の場合ではchar *funcの事ですが)
return したいものが、文字列、配列、ポインタの場合に関数名に*をつけるという
解釈でよろしいですか?

>>492の関数を例としてみると、func関数は空文字列をリターンしてもらい、
func関数は空文字列の先頭アドレスの値を返す。という事ですよね?この解釈でいいのでしょうか?
496デフォルトの名無しさん:2006/03/07(火) 17:18:07
その通り。
文字列は基本的にコンパイルしたときにデータセクションに置かれるから基本的にずっと生き続ける。
497デフォルトの名無しさん:2006/03/07(火) 17:20:30
>>496
そうですか。ありがとうございました!!
498デフォルトの名無しさん:2006/03/07(火) 17:21:39
>>495
ていうか、 return ""; って書いたら char * を返すことになるんだよ。
ダブルクォーテーションで括られた文字列定数はその文字の先頭を指す
char * なの。

配列の場合は、配列の名前だけ出すとそれはその配列へのポインタに
なる。char s[] = "abc"; printf("%s\n", s); と書いた時に printf()
に渡される s は char * だ。
499デフォルトの名無しさん:2006/03/07(火) 17:31:43
>>498
て事は、func関数は空文字列の先頭を指すchar *を返す訳ですね。
文字列、配列、ポインタは奥が深すぎますね・・・。
ポインタをもっと勉強しますorzありがとうございます。
500デフォルトの名無しさん:2006/03/07(火) 18:25:13
>>498
const char *
501デフォルトの名無しさん:2006/03/07(火) 19:01:11
すいません、初心者に使いやすいC言語のコンパイラってありますか?
Borlandのやつ設定がわからなかったので何かいいのがあれば教えて欲しいです。
やっぱり有料のコンパイラのほうがわかりやすいんでしょうか?
ちなみに当方プログラミング初心者です。
502デフォルトの名無しさん:2006/03/07(火) 19:04:15
>>501
Borlandでいいと思うけど。
設定ならググれば分かると思うよ。
503デフォルトの名無しさん:2006/03/07(火) 19:19:23
VC++Exp
504デフォルトの名無しさん:2006/03/07(火) 19:27:48
>>501
Borland の環境設定をやってくれるフリーソフトもある
http://www.vector.co.jp/vpack/filearea/win/prog/c/index.html

cygwin をインストールすると、gcc が設定作業なしですぐ使えたりもする
インストール中にオプション選択画面がでたら Devel の中の gcc を選択する必要あり
http://www.cygwin.com
英語が苦手な人にはつらい環境だけど、目指すレベルによっては英語は絶対に逃げられない

Borland C++ 5.5.1 は出たばかりの頃はとても優秀な印象だったけど
あれから6年、今となってはさすがに gcc の最新版に比べると見劣りがし始めている
505デフォルトの名無しさん:2006/03/07(火) 19:39:03
ここって学校の宿題の分からないところとか教えてくれます?(c言語)
506デフォルトの名無しさん:2006/03/07(火) 19:42:42
>>505
スレ違い
あと氏ね
507デフォルトの名無しさん:2006/03/07(火) 19:43:13
>>500
そりゃC++だ。しかも推奨されてるだけ。
まあCでもC++でもそうした方がいいという話なら同意だが。

cursesのprintwなんてフォーマット文字列がchar*型でもうコロスって感じ
508デフォルトの名無しさん:2006/03/07(火) 20:55:53
今なら BCC なんぞ使わんでも
VC++ の無料版でいいじゃんかよ。
509デフォルトの名無しさん:2006/03/07(火) 21:19:00
http://yy25.60.kg/test/read.cgi/miyata/1141733716/
>>505
新しいスレ作ったから、そこで
510デフォルトの名無しさん:2006/03/07(火) 21:19:38
>>505
丸投げなら宿題スレへ
511デフォルトの名無しさん:2006/03/07(火) 21:26:19
>>499
おまえの出した結論は何故か正しいが、
>>498の説明を真に受けたりすると配列の配列とポインタの配列をごっちゃにしたりしそうでこわい。
""は元々char[1]だよ。自動型変換でchar*になる(ことがある)だけ。
512デフォルトの名無しさん:2006/03/07(火) 21:32:36
>>504
ありがとうございます。早速フリーソフトを使ってみたいと思いますw
513デフォルトの名無しさん:2006/03/07(火) 21:39:48
>>501
Microsoft Visual C++ 2005 Express Edition 日本語版
ttp://www.microsoft.com/japan/msdn/vstudio/express/visualc/
514デフォルトの名無しさん:2006/03/07(火) 22:05:55
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^
516デフォルトの名無しさん:2006/03/07(火) 22:36:10
>>515
そりゃそうだ、AAの中ではsはchar *型だもの。
517デフォルトの名無しさん:2006/03/07(火) 22:37:12
>>515
そりゃ違って当然。
AA() の方の sizeof は *s に対して行われている。
main() の方は s[55] に対して行われている。
518デフォルトの名無しさん:2006/03/07(火) 22:43:46
どうすれば
AAでちゃんと55サイズ取得できますか?
printf("%d\n",sizeof(*s));
*sに変えてもだめでした
519デフォルトの名無しさん:2006/03/07(火) 22:45:51
>>518
ヒント: AA(s); ではなく AA(&s); で渡す
520デフォルトの名無しさん:2006/03/07(火) 22:48:23
>>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;
}
521デフォルトの名無しさん:2006/03/07(火) 22:48:45
ヒント2:構造体で、くるんでしまう
522デフォルトの名無しさん:2006/03/07(火) 22:52:23
>>518
もう答えは出ているが、要するにC言語は配列単体で配列全体を渡せない、ということ。
構造体の中に入れてしまうしかない。しかしあまりに大きい構造体をまるごと渡すのは
後々それ全体をコピーすることになるかも知れず、無駄な処理になる可能性が高い。
523デフォルトの名無しさん:2006/03/07(火) 22:56:48
>>520
typedef 使ってて 55 が2回かよ・・・
524デフォルトの名無しさん:2006/03/07(火) 22:57:11
そうなんですか〜。
構造体でくるんでみます。
525デフォルトの名無しさん:2006/03/07(火) 23:00:03
>>523
このスレに常駐して全く無価値な突込みをし続けるのが君の生き甲斐なのか?
526デフォルトの名無しさん:2006/03/07(火) 23:02:50
>>525
いいからコードで恥晒すなよ
527デフォルトの名無しさん:2006/03/07(火) 23:03:06
質問です。
#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);
にしたいのです。

何か方法がありましたら教えてください。
528デフォルトの名無しさん:2006/03/07(火) 23:04:02
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));

# 俺はこんな馬鹿な真似はしないが
530デフォルトの名無しさん:2006/03/07(火) 23:09:19
>>528
>1
531デフォルトの名無しさん:2006/03/07(火) 23:11:19
>529
ありがとうございます。

やっぱり馬鹿な真似ですかね。
実際に使う際にいちいち他人に
FuncA("Data", Data);
みたいに設定してもらうのではなく
FuncA(Data);
にして中で細工できないものかと考えていたので・・・
可変引数にしなければ簡単ですがね〜・・・
532デフォルトの名無しさん:2006/03/07(火) 23:13:12
>自動じゃないならちゃんと組まないと^^;

スレ違いだが、大事な基本は持ち合わせているようだな
大きくなっても忘れるなよ
533デフォルトの名無しさん:2006/03/07(火) 23:14:35
>可変引数にしなければ簡単ですがね〜・・・

ん? 何か縛りでもあるのか??
534デフォルトの名無しさん:2006/03/07(火) 23:17:33
>533
実はこれ、Trace関数の機能の一部で格納データを固定にすると
変更があったときいっせいに変更するのも面倒なので可変個数の引数にしたいのです。
(規定数以上の個数のデータがセットされた場合は無視する)

なるべく、関数の中身で細工し、呼び出しは簡単に・・・をめざしてます。
535デフォルトの名無しさん:2006/03/07(火) 23:19:58
>>534
コマンド名と関数の辞書みたいのか?
536デフォルトの名無しさん:2006/03/07(火) 23:45:11
TRACE( VAR1, VAR2 )とかやったら、
VAR1:40 VAR2:14というような、「変数名:中身」出力になるような
関数TRACEがほしい、ってことでそ?可変数で。
537デフォルトの名無しさん:2006/03/07(火) 23:49:55
>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つ使用しなくてはいけません。
わかるかたいたら教えてください!
541デフォルトの名無しさん:2006/03/08(水) 08:11:39
>>540
C/C++の宿題を片付けます 62代目
http://pc8.2ch.net/test/read.cgi/tech/1141363718/l50
542デフォルトの名無しさん:2006/03/08(水) 08:17:55
>539
たしかにデバッグ時はデバッガで十分です。
しかし、私の作ってるのはメカ制御のため
実際には外で稼動し、何か問題があれば上位システムのログ
を見て解析します。
なのでエラー発生時にトレースコマンドみたいなのを上位から送信してもらい
内部トレースを上位へ報告、そのログをバイナリエディタで確認・・・という流れです。
543デフォルトの名無しさん:2006/03/08(水) 09:21:50
>>542
そういうことなら、なおさらあんな真似はおかしいんじゃね?
障害分析は片手間じゃなくシステムの根底から計画的に組み入れるものだぜ
544デフォルトの名無しさん:2006/03/08(水) 18:11:26
処理系はBCC5.5.1です

乱数発生器にMTを使用しているのですが
乱数を使用した計算プログラムを作ってるうちにプログラムが常に同じ解を返す事に気がつきました
しかもまったく同じソースを再ビルドしても同じ値を返してしまいます
そんなことねーですか?
545デフォルトの名無しさん:2006/03/08(水) 18:14:42
それが擬似乱数というものじゃ
546デフォルトの名無しさん:2006/03/08(水) 18:15:51
ぇ、もしかしてMTって動的に発生させられるんじゃなくて
コンパイル時に値が決定されるんですか(;´д`)
547デフォルトの名無しさん:2006/03/08(水) 18:16:24
srand相当のAPIがあるだろ
548デフォルトの名無しさん:2006/03/08(水) 18:22:40
MTにもsrand相当の種を与えるAPIはあります。
納得いかねーですが、これにtimeでも与えて解決する事にします...
549デフォルトの名無しさん:2006/03/08(水) 18:22:55
>>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;
}
550デフォルトの名無しさん:2006/03/08(水) 18:25:33
>>548が納得しようがしよまいが、それが疑似乱数って物なんだけどな
そもそもSeedを与えるAPIが何のために存在すると思ってるんだ
551デフォルトの名無しさん:2006/03/08(水) 18:27:24
何が納得いかねーんだ?
552デフォルトの名無しさん:2006/03/08(水) 18:31:26
MTは軽量かつ偏りが少なくて従来の物より高性能ってだけで
擬似乱数であることには変わりないよ。
本当の意味での乱数が欲しいなら/dev/randでも使っとけ。
553デフォルトの名無しさん:2006/03/08(水) 18:43:15
逆にいえば、同じ系列の擬似乱数を使えないと評価ができない場合もあるからね。
554デフォルトの名無しさん:2006/03/08(水) 18:49:56
乱数って円周率を求めるために使うんじゃなかったんですか!?
555デフォルトの名無しさん:2006/03/08(水) 18:53:09
>>554
32767までのランダムな数を得るためじゃなかったっけ?
556デフォルトの名無しさん:2006/03/08(水) 18:53:56
そんな収束が遅い方法で円周率求めるんじゃねーよ・・・
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
速度が問題なら既存のデータを買うのが一番だが
そこをわざわざ自作するケースに於いて、速度は度外視だと思う
561デフォルトの名無しさん:2006/03/08(水) 20:40:23
>543
しかし、きちんと設計し、レビューもし、デバッグも行い
テストをし、さらにQAでの検査、正常、異常系、寿命テスト、
現地テストなどをこなし、ても不具合ってでるもんだからね・・・

とにかく、色々答えてくださりありがとうございました>ALL
なんとか考えてトレース関数作ります。
562デフォルトの名無しさん:2006/03/08(水) 20:49:08
何とか作るよりはCの流儀でやることをお勧めする。
Cは低級な言語なんだからあまり高級なことをやろうとして
プリプロセッサだのフィルタだのかましてもいいことないよ。
563デフォルトの名無しさん:2006/03/08(水) 20:52:54
低級言語と高級言語の意味を取り違えている人が若干居ます
564デフォルトの名無しさん:2006/03/08(水) 21:02:14
実行時にオーバーヘッドがかかるようなものはC的でないかもしれんが
プリプロセスはむしろCの十八番じゃね?
565デフォルトの名無しさん:2006/03/08(水) 21:05:31
>>561
CEの対応とかマニュアル化してる?
566デフォルトの名無しさん:2006/03/08(水) 21:33:01
561の言ってる事と、やろうとしている事の厨房度のギャップがすごいな
567デフォルトの名無しさん:2006/03/08(水) 21:54:25
そうか?
568・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/08(水) 21:59:16
>>549
それなんて線形合同法?

MTはテーブル使う奴だよ。
569デフォルトの名無しさん:2006/03/09(木) 00:01:05
>>544
「疑似乱数」の意味すら理解せずに疑似乱数を使うような
池沼は、C言語がどうこう以前にエンジニアにならないで
いただきたい。
570デフォルトの名無しさん:2006/03/09(木) 00:06:29
と、疑似乱数しか使えない坊やが申しております
571デフォルトの名無しさん:2006/03/09(木) 00:43:09
と、疑似じゃない乱数の凄さを知らない坊やが申しております。
>570がチューリング賞取ってたら失礼。
572デフォルトの名無しさん:2006/03/09(木) 01:16:40
すみません。質問です。
はじめて見る文法が出てきたのですが、
下記の文法はどういう意味を持つのでしょうか?

len1 = -len1;
573デフォルトの名無しさん:2006/03/09(木) 01:28:22
>>572
それくらい実行してみろよ。
574デフォルトの名無しさん:2006/03/09(木) 01:31:01
len1=-len1
⇔2len1=0
⇔len1=0
ってことを遠回しに言っただけ
575デフォルトの名無しさん:2006/03/09(木) 01:39:56
なるほど、なるほど。俺は
len1 = -len1が成立するのは符合がないときだから、0のみ
と考えていたよ。(数学的には同じだけど)
いや〜ためになったな〜
576デフォルトの名無しさん:2006/03/09(木) 01:40:17
擬似でない乱数関数:
int r(){ return 0; }
577デフォルトの名無しさん:2006/03/09(木) 01:43:28
処理系はDDT5.5.1蝶野スペシャルです 。

卵数発性器に彼女を使用しているのですが
排卵日を使用した計算プログラムを作ってるうちにプログラムが常に同じ解を返す事に気がつきました
しかもまったくオギノ式を再オギノ式しても同じオギノ式を返してしまいます
そんなことねーですか?
578デフォルトの名無しさん:2006/03/09(木) 02:20:01
ウィンドウズ上でCができるツールありませんか?
DOS起動してもキー押すだけで強制終了させられてしまうので
579デフォルトの名無しさん:2006/03/09(木) 02:30:26
580デフォルトの名無しさん:2006/03/09(木) 07:37:36
数独をとくプログラムってここの人たちなら作れるの?
581デフォルトの名無しさん:2006/03/09(木) 07:44:54
TOTOを当てるプログラムってここの人たちなら作れるの?
582デフォルトの名無しさん:2006/03/09(木) 08:37:10
>>574-575
ぉぃぉぃ
583デフォルトの名無しさん:2006/03/09(木) 09:11:41
>>580
効率悪くていいなら簡単でしょ。

>>581
支援くらいなら兎も角、当てるのは無理でしょ。
584デフォルトの名無しさん:2006/03/09(木) 09:46:58
>>571
その賞は残念ながら東通工の人に先に取られてしまったよw
585デフォルトの名無しさん:2006/03/09(木) 14:35:45
書籍スレッドでレスがあまりつかなかったので教えていただきたいのですが、
プログラム未経験でC言語を学びたいのですが
入門に適した書籍を紹介していただけないでしょうか?
よろしくおねがいします。

http://www.amazon.co.jp/exec/obidos/ASIN/4894710293/
これなんかよさそうだと思うのですが
586デフォルトの名無しさん:2006/03/09(木) 14:51:41
>>585
ここで聞くなボケ
587魔天王ザムデイン ◆XnE.rF0YCI :2006/03/09(木) 14:58:24
>>586
ア?早く答えろやボケが
588デフォルトの名無しさん:2006/03/09(木) 15:09:34
>>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);
}
590デフォルトの名無しさん:2006/03/09(木) 15:23:41
>>589
前提条件が抜けていて何をしたいのかいまいち分からん。
君は何を作っているのか?
独自に作ったソフトでのログインとログアウトをしたいのか?
ならば独自にやればいいだけ。
591デフォルトの名無しさん:2006/03/09(木) 15:32:22
>>588
削除フラグでも立てとけば?
592588:2006/03/09(木) 15:48:54
>>591
それではファイルが膨れ上がる罠です
593デフォルトの名無しさん:2006/03/09(木) 16:22:08
>>589
そもそも、「現在ログインしているユーザ」情報を、
ファイルで管理する方が珍しいかと。
594デフォルトの名無しさん:2006/03/09(木) 16:24:47
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のメモ帳でプログラムを書いたところです。
これをコンパイルすると書いてるのですが、どうしたらいいのかわかりません。
教えてください。よろしくお願いします。
596デフォルトの名無しさん:2006/03/09(木) 19:59:13
VC++ Express使え
597デフォルトの名無しさん:2006/03/09(木) 20:25:17
>>595
コンパイラにパスを通すんだが、面倒だからCPadっての使って
適当に設定して
ttp://www.vector.co.jp/soft/win95/prog/se141451.html
598デフォルトの名無しさん:2006/03/09(木) 21:47:42
599デフォルトの名無しさん:2006/03/09(木) 21:53:01
チャットなどで表示されるOSを自由に書き換えるにはどうしたらよいのか。
600デフォルトの名無しさん:2006/03/09(木) 21:54:18
>>599
日本語でOK
601デフォルトの名無しさん:2006/03/09(木) 21:55:27
>>600
なるほどサンクス
602デフォルトの名無しさん:2006/03/09(木) 21:57:17
>>601
どういたしまして
603デフォルトの名無しさん:2006/03/09(木) 22:00:09
(・∀・)ジサクジエーン
604595: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;

};
と、考えればいい
607デフォルトの名無しさん:2006/03/09(木) 22:07:34
mode型をどっかで初期化してるんだろ。
構造体だから特別なことは何もない。
初期化せず正しく動作するということもありえない。
608デフォルトの名無しさん:2006/03/09(木) 22:14:21
>>606-607
ああ、ありがとうございます
”func1”で検索かけていてぜんぜん引っかからないので・・・
なるほど以下にこんなコードありました 助かりました
ありがとうございます ありがとうございます
struct mode mode_list[] = {
{"123", get_qui},
{"434", get_rupus},
{"222", get_status},
{"333", get_goo}
};
609デフォルトの名無しさん:2006/03/09(木) 22:20:51
>>605
func1は関数へのポインタを入れるためのただの変数
なので初期化されないままでも特に問題はない。
実際にその関数を呼び出したい時に struct mode *
と int を引数に取る void の関数へのポインタが
入っていればいいだけだ。
610デフォルトの名無しさん:2006/03/10(金) 00:06:52
C言語でXML文書を出力するのによい方法ってありませんか?
611デフォルトの名無しさん:2006/03/10(金) 01:02:35
fprintf
612デフォルトの名無しさん:2006/03/10(金) 01:11:06
>>611
ワロタ
613デフォルトの名無しさん:2006/03/10(金) 01:13:08
>>612
どこが笑う所だ?
614デフォルトの名無しさん:2006/03/10(金) 01:23:33
>>613
いや、なんとなく

おいらもXMLをファイルに書き出すときprintfでやりました
XMLを読むのは難しいけど書き出すときは簡単
615・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 01:27:46
スタック作ってタグのネストを管理するくらいかな。
616デフォルトの名無しさん:2006/03/10(金) 01:30:32
>>615
関数だろアフォ
強いてもブロック・・・
617・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 01:41:01
アフォ言われてもなぁ

関数の再帰コールはデータの噛ませようによっては危険なので
ヒープに自前スタック作ってループで処理するのが確実かつ速い。

関数再帰コールベースだと消費メモリが直感的にわかりにくいしな。
618デフォルトの名無しさん:2006/03/10(金) 01:53:06
>関数再帰コールベースだと消費メモリが直感的にわかりにくいしな。

アフォ確定
619・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 02:14:25
はて。


クィックソートが再帰コールじゃないと記述できないと思ってる類の初心者でしょうか。
こういうの相手したくないんですが、最適化で再帰をループに展開しなおす処理系もあるくらい
再帰コールはコーディング効率はともかく実行効率的にはダサい代物であることは
把握しといて欲しいものです。

使い捨てならともかくセキュアなプログラム書こうと思ったら、再帰を利用すると
関数コールスタックのオーバーフロー対策がかえって面倒。
ヒープに自前スタック作ったほうが楽。
例外処理の為にsetjmp/lngjmpなんて使う必要も無い。
620デフォルトの名無しさん:2006/03/10(金) 02:24:42
セキュアなプログラムを直感的に書く団子がいるスレはここですか?
621・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 03:15:41
「ネストの深さに応じてインデントを深くしたい」、というときに、
再帰コールだとスタティック変数やグローバル変数でも使うか、
いちいちスタックにカウントして渡してやんないと駄目っしょ。
管理したい状態が増えるとどうするか?関数の引数を追加する?
グローバル変数を追加?
どうみてもウンコです。本当にあr

1関数内だけで処理を済ませれば、ローカルの変数をみるだけで済む。
もし  ヒープの容量が不足すればお塩ロック、リアルロック、もといreallocすればいいし
アロケーションに失敗すれば例外処理に素早く移行できる。
よって、自前スタック使ってループまわして処理したほうがどう考えてもエレガント。

結局のところ、再帰コールが許されるのは初学者までだよねー、ってこと。
でも初学者であることを恥じる必要は無いと思うんだ。
622デフォルトの名無しさん:2006/03/10(金) 03:23:46
610です。
XMLを書き出すときは、fprintfで書き出したほうがよいのですかね?
XMLは色々便利ですけど
Cで書き出すときは、CSVとかほうが扱いやすいですね・・・
読み込みもexpatとか使わずに、自前で作りこんだほうがよい気がしてきました・・・
623589:2006/03/10(金) 03:38:56
>>590-594
全然答えになってないんですが。

達人の方のみ回答願います。
(ちゅーか、ファイルの内容の一部削除についての回答がまったくないのがこのスレらしい)
624デフォルトの名無しさん:2006/03/10(金) 03:42:27
ファイルの内容の一部削除についての回答はまったくないスレなので、二度とこないでください。
625デフォルトの名無しさん:2006/03/10(金) 03:46:58
>>622
Cでやるのはやめた方がいいよ。
626589:2006/03/10(金) 04:03:32
なるほど、達人はいないどころか、馬鹿ばっかなんですね、このスレには。( ´,_ゝ`)プッ
627589 ◆Q6fo44/dLk :2006/03/10(金) 04:11:08
偽者が居るみたいなのでトリップ付けます。
どなたかわかりませんか?
628デフォルトの名無しさん:2006/03/10(金) 04:13:28
前口上に惑わされて突っ込んじゃって、
さすがに文字列操作もファイル操作も理解
してないレベルだったとはおもわなかったんだろ。

"ネットワーキング"はギャグで言ってたんじゃなくて
若気の至りだったんだろうから、問題の切り分けも
要点を絞った質問もしないからといって無下にせず、
みんなちゃんとソースを読んでやれ。

strcpyの挙動ならスレで扱う範疇だろ?
629デフォルトの名無しさん:2006/03/10(金) 04:16:14
C標準の関数では既存ファイルの内容一部削除は無理だろ
630589:2006/03/10(金) 04:26:17
一応言っとくと>>627は俺(=589)じゃない。
目的がなんだか判らんが。w

>>629
そりゃシーケンシャルファイルに限ったことじゃないのか?
ランダムアクセスファイルが何かも知らないくせに回答してんぢゃねーだろうな、おまいら?
631589 ◆Q6fo44/dLk :2006/03/10(金) 04:33:13
>>630
辞めろって、いい加減にしてくれ!
そんな発言したら、俺が無能みたいじゃないか。
632デフォルトの名無しさん:2006/03/10(金) 04:40:04
偽者氏ね
633デフォルトの名無しさん:2006/03/10(金) 04:40:29
>>630
ランダムアクセスファイルって固定長レコードファイルでレコード番号でシークできるファイル、
それだけだよ。特定レコードを物理的に削除できるということはランダムアクセスファイルの
定義にはない。

これをやるんだったら、メモリーのリストにユーザー情報を保持し、ユーザーの追加・削除は
リスト上で行い、ファイルにはその結果を上書きするようにする。これしかない。

つまり、ひとりのユーザにログアウトでファイルの全レコードを置換するわけだ。
634デフォルトの名無しさん:2006/03/10(金) 04:43:41
どう見ても釣りだろ
635589: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のファイルよりもっと複雑なデータの持ち方
をしているからできる。

637デフォルトの名無しさん:2006/03/10(金) 07:54:00
詰める、てのは、それ以降の部分を読み込みながら上書くわけだなー。
やっぱり削除フラグにして、追加するときに、削除フラグのたってるところを
探して埋めた方がよくね?
1レコード=1ファイルにして、ファイルを削除するようにする手もあるな(w
638589:2006/03/10(金) 08:01:17
>>636-637
そこまで説明されると真実味がある。
じゃ、やっぱ削除フラグにするかな。

達人たち、どうもありがとう。
639デフォルトの名無しさん:2006/03/10(金) 08:31:47
上に出てきたXMLなんて面白いと思うよ
gccで使えるクラスライブラリがあればの話だが
640デフォルトの名無しさん:2006/03/10(金) 08:52:26
納得いかないならデータベースライブラリ使え
641デフォルトの名無しさん:2006/03/10(金) 10:35:09
ファイルスコープの関数ってどう記述すればいいのでしょうか?

関数外で以下のように記述すれば、ファイルスコープの“変数”は作れますよね?(←たぶんこれは合ってると思う…(^^;)
static int i;

関数だとglobalになってしまい、他のファイルで定義した関数と被ってしまうので、ファイルスコープで宣言したいのです。
642デフォルトの名無しさん:2006/03/10(金) 10:36:47
static void hoge() { }
643641:2006/03/10(金) 10:52:14
あああ。
なんか static つけてもうまくいかないので質問したのですが、
プロトタイプ宣言にだけstatic付けて、関数自体に付けてませんでした…orz

ありがとうございます。
644デフォルトの名無しさん:2006/03/10(金) 12:03:13
>>621
xmlみたいに上から下に向かってインデントが深くなるのは再帰よか
ループってのはわかるけど、例えば二分木を

    *-+(19)
  *-+(63)
  |  *-+(35)
  *-+(74)
  |    |  *-+(4)
  |    *-+(50)
*-+(87)
  |  *-+(78)
  *-+(86)
    *-+(83)

こんな感じで表示すんのはスパゲッティ回避しつつ効率よくループでいける?
645デフォルトの名無しさん:2006/03/10(金) 12:09:36
>>643
いいえ、宣言にstaticがついていれば関数自体につける必要はありません。
646デフォルトの名無しさん:2006/03/10(金) 12:10:36
>>644
出来れば団子の相手は避けて欲しい。
個人的には、末尾再帰でもない処理をループに置き換えるのは
避けたい。
647デフォルトの名無しさん:2006/03/10(金) 12:14:33
>>646
末尾再帰ってこんなパターン?
int foo(args) { /*終端チェック...*/ return foo(some-args); }
648647:2006/03/10(金) 12:25:12
649デフォルトの名無しさん:2006/03/10(金) 12:48:53
>>619
> 最適化で再帰をループに展開しなおす処理系もあるくらい

「いまどきのコンパイラなら末尾再帰はループに直すから、
効率を気にしないでどんどん使いましょう」
みたいな意見はよく見るけど、コンパイラがループにしてしまうから
使うなっていうのははじめてみた。
650デフォルトの名無しさん:2006/03/10(金) 12:51:45
>「いまどきのコンパイラなら末尾再帰はループに直すから、
C/C++でこんなコンパイラあるのか?
651デフォルトの名無しさん:2006/03/10(金) 12:52:22
再帰の深さが数万とかなら考えたほうがいいけど、数十くらいなら、
使ったってぜんぜん平気でしょう。

652デフォルトの名無しさん:2006/03/10(金) 12:59:12
>>650
gcc,vcは直した
653デフォルトの名無しさん:2006/03/10(金) 13:13:32
直しませんよw
654652: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でも同じです。何が直さないのでしょうか?
655デフォルトの名無しさん:2006/03/10(金) 13:19:27
>>653
最適化を切っているとか度合いを低く抑えているとか、
或いはお前が末尾再帰だと思い込んでいるだけで実際には末尾再帰でないという可能性もある。
656・∀・)っ-●○◎- ◆Pu/ODYSSEY :2006/03/10(金) 13:43:19
>>644
クィックソートあたりの実装を参考にするといいお。

こっちが再帰コール版
http://www.comp.dit.ie/rlawlor/Alg_DS/sorting/quickSort.c
再帰コールせず自前スタック管理とループで実現
http://www.d.umn.edu/~gshute/C/examples/quicksort.C.html

まぁ俺ならこんなコードにするかな。細かい部分は端折るが。

int depth = 0; //現在の階層; 0がトップ
LPNODE p = tree->head;
LPNODE *stack = (LPNODE*) malloc( sizeof (LPNODE) * 100 ) ;
for ( ;; ) {
  if ( p->child ) { //ネストあり
    開始タグ出力
    stack[depth++] = p; //push, 下の階層に逝く
    p = p->child;
  }

  出力とか

  if ( !p->next ) { //同階層の終端に達した
    p = stack[depth--]; //pop , 上の階層に戻る
    終了タグ出力
    if (depth == -1) break;
  }
  p = p->next; //同階層の次の要素を参照
}
free(stack);
657デフォルトの名無しさん:2006/03/10(金) 13:48:49
>>656
ちょうど団子先生がいるんで聞きたいんだが
末尾再帰とそのループ展開について解説してるいいサイト無い?
658デフォルトの名無しさん:2006/03/10(金) 13:50:53
全くわかりません><
659デフォルトの名無しさん:2006/03/10(金) 13:52:24
定数入れて最適化されただろって言ってるの笑える
660デフォルトの名無しさん:2006/03/10(金) 13:55:34
>>656
その糞コードで'|'や' 'をどうやってはさむつもりだ?wwwww
馬鹿も休み休み言えよwwwww
661・∀・)っ-●○◎- ◆Pu/ODYSSEY :2006/03/10(金) 13:58:59
>>660
関数再帰コールベースなら簡単にできるとでも?馬鹿も休み休み言えよwwwwww
662デフォルトの名無しさん:2006/03/10(金) 14:01:59
663デフォルトの名無しさん:2006/03/10(金) 14:03:25
クイックソートの場合
スタックオーバーフローだけを心配するなら2分割したうちの短い方だけを再帰にして、長い方をループにするのが簡単
末尾再帰が最適化されることを前提にするなら短い方を先に呼び出す
自前でスタックを用意するなら長い方を先に積む

これでスタックの深さは確実に O(log n)以下になる
664デフォルトの名無しさん:2006/03/10(金) 14:04:42
>>659
gccとかなら-Sでも指定してアセンブラ吐き出せば
末尾再帰になってるのが一目瞭然ですが( ´_ゝ`)
665652:2006/03/10(金) 14:06:31
>>659
g++で-Sを付けて出てきたコードを見ればループになっているのが分ると思いますよ。
666デフォルトの名無しさん:2006/03/10(金) 14:09:23
vcだとループにならない
667デフォルトの名無しさん:2006/03/10(金) 14:10:06
喪前らコンパイラのバージョンくらい書け
668デフォルトの名無しさん:2006/03/10(金) 14:12:54
おまいら俺にも理解できるように解説してくれ。
669デフォルトの名無しさん:2006/03/10(金) 14:13:28
>>661
ループでは簡単に出来ないことを認めたな?wwwww
670デフォルトの名無しさん:2006/03/10(金) 14:14:25
>>662
サンクス、ちょっと読んでくる
671デフォルトの名無しさん:2006/03/10(金) 14:17:19
末尾再帰はループになるかどうかがコンパイラ依存になる時点で糞
672デフォルトの名無しさん:2006/03/10(金) 14:18:41
せっかくだから>>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
673デフォルトの名無しさん:2006/03/10(金) 14:19:40
C、C++の最適化について語るスレ
http://pc8.2ch.net/test/read.cgi/tech/1084676298/
674・∀・)っ-●○◎- ◆Pu/ODYSSEY :2006/03/10(金) 14:29:25
>>669
端折ってるだけですが。単純化したほうが解りやすいだろ?

とりあえず関数の再帰を使うと簡単に書けることを証明してくれ。
インデント量をいちいちグローバル変数やパラメータで渡す必要がある時点で論外なのだが。

出力も厳密にはキューに溜め込んで、遅延処理することを想定してる。
入れ子になってる要素数に応じて、複数行に分けたり分けなかったりしたいからね。
675デフォルトの名無しさん:2006/03/10(金) 14:31:23
さすがに構文解析とかの多段?再帰をループで書こうとは思わんな。
目的と労力との天秤じゃね?
676デフォルトの名無しさん:2006/03/10(金) 14:39:01
>>674
>>656dクス
そういえば>>621でも言ってるけど関数の引数を追加するとなんかまずいの?
677デフォルトの名無しさん:2006/03/10(金) 14:43:06
どう考えても再帰の方が書くのも楽で分かりやすいのだが...
678デフォルトの名無しさん:2006/03/10(金) 14:43:13
あーあ。腐れ団子が居付いちゃったじゃねーか。
679・∀・)っ-○○◎- ◇Pu/ODYSSEY:2006/03/10(金) 14:52:10
楽ってなんだよ。 要は手抜きってことだろ。このカス
680・∀・)っ-●○◎- ◆Pu/ODYSSEY :2006/03/10(金) 14:53:29
>>676
関数のプロトタイプが変わっちゃうでしょ。仕様変更に柔軟に対応しにくい。
何より、渡す引数が増えればその分だけ関数コールスタックの消費も増える。

>>675
XMLの解析なら、さすがにXercesやMSXML使うかな。
労力の少なさ重視ならCじゃなしにインタプリタ言語でも使いますわ。

実際のコンパイラやインタプリタのソース見れば再帰コールなんて、まず使ってませんわ。
バグの根源っす。
681デフォルトの名無しさん:2006/03/10(金) 15:01:51
おいおいLALR(1)文法を再帰を使わずに書けるもんなら書いてみろよ
俺はfindの実装すらも再帰以外では書けないヘタレだから無理だけどな
682デフォルトの名無しさん:2006/03/10(金) 15:03:04
>>680
??変わっちゃうってどういうこと?
そもそも再帰コールで書くつもりで始めたのなら追加も何もないんじゃないの?
683デフォルトの名無しさん:2006/03/10(金) 15:08:40
>>671
末尾再帰を最適化できないようなコンパイラを選定してる時点でダメ。
684デフォルトの名無しさん:2006/03/10(金) 15:12:58
いまどき再帰がだめって、貧民プログラミングここに極まれりってかんじだな。

685デフォルトの名無しさん:2006/03/10(金) 15:16:29
yacc を使うほど仰々しくなくて自前で独自の文法のミニインタープリタを
ちゃちゃっと書いてテストするときって 先に再帰のほうを想像しないか?
いきなりループで思考するとかえってドツボ&バグの温床のような…
686デフォルトの名無しさん:2006/03/10(金) 15:19:01
末尾再帰をループに変換したコードを生成してくれるコンバータがあるから無問題
687デフォルトの名無しさん:2006/03/10(金) 15:20:48
カスどもが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';
  }
}
688デフォルトの名無しさん:2006/03/10(金) 15:20:48
そもそも、BNF記法が再帰的だし、そのとおり実装しようとしたら再帰になるのが自然
ループだと不自然だろ?
689デフォルトの名無しさん:2006/03/10(金) 15:31:46
>>688
ループで非再帰化したBNF記法のようなもの登場か!!!
…イラネ
690デフォルトの名無しさん:2006/03/10(金) 15:39:03
1関数内だけで処理を済ませる団子先生なら何とかすんじゃね?
691・∀・)っ-●○◎- ◆Pu/ODYSSEY :2006/03/10(金) 15:56:29
>>681
LRLRと自由文脈で英文法チェックルーチン(もどき)作るの講義でやったなぁ。懐かしい。
普通に自前スタックに退避で実現できるんじゃね?
Bisonあたりのソース参考にすればいい?ソースとってきてトレースして関数コールツリー
みてるけど、さて、再帰コールしてる箇所ってどこにあ(ry

findって要するにディレクトリツリーの中身全部展開して取得するだけでいいっしょ。
つい最近ディレクトリの中身を無駄なファイル除いてまとめてパックするプログラムとか
書かされたいたけど普通に再帰コールなしで出来たよ。いちおう参考までに。

>>682
共有しないといけないパラメータが、初期に想定してた分より変わるかもわからんね。

>>684
組み込みは無視ですか><
692デフォルトの名無しさん:2006/03/10(金) 17:35:36
再帰不能
693デフォルトの名無しさん:2006/03/10(金) 19:04:37
>>691
組み込みでも再帰は使うよ
案件によっては禁止の場合もあるってだけ
使う場合のノウハウはちゃんとある
694デフォルトの名無しさん:2006/03/10(金) 19:07:57
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();
}
695デフォルトの名無しさん:2006/03/10(金) 19:11:32
ループで思考しそうなところを再帰で表現 か。
やっぱ思考の過程をそのまま記述するのが自然でよいな。
その上で問題があるなら ループ⇔再帰 の置換を行えばいいし。
696デフォルトの名無しさん:2006/03/10(金) 19:17:32
>>694
うわー懐かし
新米の頃、似たようなこと書いて怒られたっけ(恥
697デフォルトの名無しさん:2006/03/10(金) 20:52:21
マルチスレッドについて調べてたら、マルチタスクを解説してるページも
ヒットしたので試しに読んだらスレッドとタスクの違いが良く分からなくなってきますた。
そんなC言語を習得中の漏れに解説して頂けるもっさエロイ人キボン。
698デフォルトの名無しさん:2006/03/10(金) 20:55:38
>>697
スレ違い。
699デフォルトの名無しさん:2006/03/10(金) 21:18:16
ここの人たちが色々な関数を作ってライブラリ化したら面白いかな?
prg2ch.libとか?
700デフォルトの名無しさん:2006/03/10(金) 21:20:33
lib配布で使う強者はおらんやろ
701デフォルトの名無しさん:2006/03/10(金) 21:54:35
もちろんソースつきだよな
702デフォルトの名無しさん:2006/03/10(金) 22:36:27
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;
  }
}
703デフォルトの名無しさん:2006/03/10(金) 22:38:45
実行結果では123と入力すると0しか帰って来ません。
と言いますか、全ての数字において0が帰ってきます。助けて下さい。

コンパイラはgccです。
704デフォルトの名無しさん:2006/03/10(金) 22:42:12
内部的には10進数も2進数も違いはない
2進数で表示したいというのなら文字列にしないと
changeについては殆ど意味のない関数になってる
単にdataが0か1になるまで割り算していってるだけ
tempもまったく意味がない
705デフォルトの名無しさん:2006/03/10(金) 22:42:27
あなたには2進数への変換の前にもっとやるべきことがある。
706デフォルトの名無しさん:2006/03/10(金) 22:44:49
>>704
ほんとですか・・・文字列で書き直して再度聞きに来ます。ありがとうございます!!

>>705
それをぜひ教えて頂きたいです。
707デフォルトの名無しさん:2006/03/10(金) 22:50:11
>>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;
}
708デフォルトの名無しさん:2006/03/10(金) 22:56:04
>>707
dataでかいとあふれるぜ
709デフォルトの名無しさん:2006/03/10(金) 22:58:29
>>707
うぁぁ・・・むずかしい・・・orz。

少しwhile式内を考えてみます。わざわざ解答書いてくださりありがとうございます!
710デフォルトの名無しさん:2006/03/10(金) 22:59:20
>>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;
}
711デフォルトの名無しさん:2006/03/10(金) 23:04:39
ビット表現ではなく単に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;
}
712・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 23:07:18
>>700
C:\Documments and Settings\だんご 食べたい\My Documents\Visual Studio Projects\
ってパス名が含まれるからですか?><
713デフォルトの名無しさん:2006/03/10(金) 23:11:16
F:\Document and Settings\Administrator\My Documents\Visual Studio Projects\
じゃないのか。
714デフォルトの名無しさん:2006/03/10(金) 23:11:32
>>711
-2147483648
715デフォルトの名無しさん:2006/03/10(金) 23:13:17
>>714
仕様で(ry
まじごめん
716デフォルトの名無しさん:2006/03/10(金) 23:24:32
>>710
式内の仕組みがやっと分かりました!!ありがとうございます!
これを参考にして16進数とかに挑戦してみます。
717707:2006/03/10(金) 23:35:49
>>716
特に変換処理をしなくても
printfで%xを指定したら自動的に16進数で表示してくれるよ

printf("%x",input); 
718デフォルトの名無しさん:2006/03/10(金) 23:36:03
ちょっと話を戻してすいませんが、Cで末尾再帰の最適化を
期待して書くのってやっぱり(仕事でやる場合)良くないこと
なんですかね? 組織のポリシー次第と言えばそれまでですが…

自分は再帰の回数が十分少ないと断言できる場合のみ
使っています。楽ですし。
719デフォルトの名無しさん:2006/03/10(金) 23:42:52
>>717
書式指定子の変更で16進に変換可能できるんですか!凄いですね(^ω^;)
ではいろいろネットで違う基本を学んできます。
720・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 23:43:29
Ackermann関数の洗礼を受けたので基本的に再帰コール使わずに書くのはポリシーです。
721デフォルトの名無しさん:2006/03/10(金) 23:45:39
>>719
仕事なら、性能要件を満たす限りはなるべく分かりやすいコードがよい。
722デフォルトの名無しさん:2006/03/10(金) 23:46:25
×>>719
>>718
723デフォルトの名無しさん:2006/03/10(金) 23:47:46
>>718
最適化に限ったことじゃないが「保証されている」かどうかが仕事では超重要
724デフォルトの名無しさん:2006/03/10(金) 23:49:37
gccには-foptimize-sibling-callsというオプションが
あるけど、これって末尾再帰最適化してくれるの?
725・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 23:51:00
末尾再帰のループ展開を言語仕様で保障してるのってSchemeとかあの手の言語くらいじゃね?
726デフォルトの名無しさん:2006/03/11(土) 00:31:06
>>718
Cの規格でぜったい保障されてる範囲でしかコードを書かないってことになったら、
まともに実用のコードなんてかけないよ。
727デフォルトの名無しさん:2006/03/11(土) 00:37:04
再起末尾の最適化がなしだとしても、再起の深さ数十回程度なら、まったく問題なし。
728・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/11(土) 00:46:36
http://www.db.is.kyushu-u.ac.jp/adp/

ここは俺的に要ブックマーク
729デフォルトの名無しさん:2006/03/11(土) 00:46:50
>>726
おめー、厳密規格合致プログラムのことを言っているのか?
処理系定義だって立派に保証されている動作だし、
void hoge(int); だって、それを出荷しているベンダーが保証している場合もあるぞ?

自分の仕事の成果に対する責任範囲と「移植性」を近藤しとるんちゃうか?
金もらう時点でここで引っかかる奴はいないはずだが・・・
730デフォルトの名無しさん:2006/03/11(土) 00:54:04
>>729
この話の流れで、なんでそういう方向に行くのか分かりません。
731デフォルトの名無しさん:2006/03/11(土) 01:15:14
intのサイズも決めていない規格に何を求めているのやら...
732デフォルトの名無しさん:2006/03/11(土) 08:21:19
実行効率
733デフォルトの名無しさん:2006/03/11(土) 10:57:05
あまりにも移植性ばかり考えると開発しづらくない?
あまりにもトリッキーで環境依存なコードも問題あるが。

・・・とここのスレを見て感じました。
734デフォルトの名無しさん:2006/03/11(土) 10:58:22
意味もなくコストをかけて移植性を確保する奴はアホ。
意味もなくノーコストで得られる移植性を損なう奴もアホ。
735デフォルトの名無しさん:2006/03/11(土) 11:02:36
関数の引数にダイレトで式を書いても問題
ないでしょうか? 以下は例です。

for (i=1;i<=10; i++) {
malloc( i*4096 );
}

736デフォルトの名無しさん:2006/03/11(土) 11:05:25
式の値が引数として渡されるから問題ないけど
その例は別の意味で問題ある
737デフォルトの名無しさん:2006/03/11(土) 11:15:10
> 736 ありがとうございます。
別の問題とは、どういう問題でしょうか?
738デフォルトの名無しさん:2006/03/11(土) 11:15:51
どんな簡略化したサンプルにも必ず難癖つけてしまう病気だから気にするな。
739デフォルトの名無しさん:2006/03/11(土) 11:17:18
違和感を感じないなら、気にしなくていいよ
740デフォルトの名無しさん:2006/03/11(土) 11:37:24
malloc で確保したメモリのアドレスを受け取っていないから、free できないってことじゃね
741デフォルトの名無しさん:2006/03/11(土) 11:40:06
> 740 ご指摘ありがとうございます。
確かにそうですね。例の誤りですね。
742デフォルトの名無しさん:2006/03/11(土) 11:45:14
本に書いてあるプログラムで

static char a[M+1][N+1];と宣言してあって
その後、a[i][j]++;とかすぐにインクリメントしたりしてるんですが
この宣言方法の場合、最初に0で初期化しなくても0が挿入されてるんですか?
743デフォルトの名無しさん:2006/03/11(土) 11:46:29
staticはゼロで初期化される
744デフォルトの名無しさん:2006/03/11(土) 11:52:01
>>743
ありがとうございます
流れ見ていく限り、どうもすべてに0が入っているのを
前提とした感じだなぁっていうのはわかったんですが
static使ったことなくて、調べても次に呼び出されたとき
値が変化しない静的としか書かれてなかったんでわかりませんでした
745デフォルトの名無しさん:2006/03/11(土) 20:28:13
>>744
規格ではゼロ初期化ってことになってるけど
このルールには従っていない処理系が結構あるから
ちゃんと確認したほうがいいぞ
746デフォルトの名無しさん:2006/03/11(土) 20:29:36
例えば?
747デフォルトの名無しさん:2006/03/11(土) 20:31:35
>>745
そんな処理系無いだろ
少なくとも普通に手に入るであろう処理系ではの話だが

とゆうかstatic変数がゼロクリアされるのはC89で既に規格化されてるんだから
C89にすら準拠してないような糞処理系は窓からry
748デフォルトの名無しさん:2006/03/11(土) 20:48:43
まあまあ。
結構あると言い切ってるんだから
まずは話を聞いてみようじゃないか。
749デフォルトの名無しさん:2006/03/11(土) 21:06:39
俺が直接くらったのは通算2つ
言っていいのはここまで

特に 747 みたいなのがいるところで言ったらシャレにならん
750デフォルトの名無しさん:2006/03/11(土) 21:16:54
>言っていいのはここまで
何か厨臭いな
751デフォルトの名無しさん:2006/03/11(土) 21:23:55
標準C以外の話は一切するなといってみたり
標準Cなんて信用するなといってみたり
なかなか初心者に辛いスレだな。
752デフォルトの名無しさん:2006/03/11(土) 21:35:30
組み込み向けコンパイラで、自分でスタートアップで初期化してねというものはあったが
ANSIなどと書かれてるコンパイラならクリアされてるはずだわな
753デフォルトの名無しさん:2006/03/11(土) 21:56:17
>>736>>745は同一人物なのかね。不毛な突っ込み方がそっくりだな。
754736:2006/03/11(土) 22:03:17
ん?一応違うけど
736=743=754
755デフォルトの名無しさん:2006/03/11(土) 22:15:52
結局>>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デフォルトの名無しさん:2006/03/11(土) 22:22:46
すいません、理解したくありません。
758デフォルトの名無しさん:2006/03/11(土) 22:28:04
そんなこと報告しなくていいよ
759デフォルトの名無しさん:2006/03/11(土) 22:28:35
>>757
できればヒントをお願いします。

printf関数2番目で  cppでの+3と++ではどちらが優先されるのでしょうか?
どちらを試しても答えとは違くなってしまうので、この場合の優先順位を教えて頂けないでしょうか?
760デフォルトの名無しさん:2006/03/11(土) 22:35:35
++
761デフォルトの名無しさん:2006/03/11(土) 22:42:12
>>760
++ですか!。そうしますとcppのアドレスを増やす = NEW を指すとします。
(この時printf関数の1番目のアドレスの位置を記憶しているのでしょうか?)
していないとしますと、そしてアドレス位置の--によって ENTER を指し
cpp「0」+3と解釈し、POINT + ER でよろしいのでしょうか?
762デフォルトの名無しさん:2006/03/11(土) 22:48:24
>>761
まじめにやれ >NEW を指す
763デフォルトの名無しさん:2006/03/11(土) 22:52:53
>>762
すいません・・・。NEWを指すのですか。ありがとうございます
764デフォルトの名無しさん:2006/03/11(土) 22:53:26
>>763
まじめにやれ >NEWを指すのですか。
765デフォルトの名無しさん:2006/03/11(土) 23:00:43
>>764
ではあと一つ答えて頂きたいのですが、4番目の式なんですが
cpp[-1][-1]+1は どうなるのでしょうか?
766デフォルトの名無しさん:2006/03/11(土) 23:11:15
>>765
質問の意味が明らかになっていない

>printf関数2番目で  cppでの+3と++ではどちらが優先されるのでしょうか?
例えばこういう風に論点をはっきりしろ
767デフォルトの名無しさん:2006/03/11(土) 23:11:32
cppは配列cpの先頭を指しているようだが
cpp[-1][-1]は何かよく分からんが配列より前を指すことになるので
その動作は未定義

細かいことは規格票の加減演算子を嫁
768デフォルトの名無しさん:2006/03/11(土) 23:13:06
>>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の初期値が指し示す要素の次の要素が指し示す文字列配列
要素へのポインタの指す要素の、一つ前の要素をあらわすことが自明。
769デフォルトの名無しさん:2006/03/11(土) 23:15:17
演算子の優先順位なんてどんな入門書でも載せてるだろうが
この場合の優先度も何も、優先順位が変わることは有り得ない
770デフォルトの名無しさん:2006/03/11(土) 23:24:28
>>766
申し訳ないです。何を言おうとしているのか分からないですよねorz
>>767
そちらを探してみる事にします。
>>768
全部書いて下さりありがとうございます!1つずつ理解できるように読みます。
丁寧に書いて下さり本当に感謝しますm(__)m
>>769
勉強不足ですよね。もっと頑張ります。

答えて頂いた皆さん、本当にありがとうございました。
771デフォルトの名無しさん:2006/03/11(土) 23:31:13
>>768
天才w
772デフォルトの名無しさん:2006/03/11(土) 23:31:20
>>770
宿題なら宿題スレへ池
768 みたいな回答が欲しかっただけだろ

761 のここまではよかった
>++ですか!。そうしますとcppのアドレスを増やす =
cpp の指す先にあるのは cp と自分で書いておきながら NEW だのと言い出したあたりから
おまえさんとは話になりそうかどうかに疑問がわいていた

論議という所場代が払えない者に恵んでやる範囲にはきつい限界があるぜ
773デフォルトの名無しさん:2006/03/12(日) 00:21:41
Cの開発環境ってなに使ってる?
Eclipseでも出来なくはないけどさ,別にEclipse使うメリットもない。
むなしくエディタで書いてる漏れ。
774デフォルトの名無しさん:2006/03/12(日) 00:26:32
Emacs
775デフォルトの名無しさん:2006/03/12(日) 00:27:27
xyzzyとコンパイラを
DOSもしくはHEWっていう統合環境上から使用。

エディタで十分でし。
776デフォルトの名無しさん:2006/03/12(日) 00:29:02
秀丸で十分だろ
777デフォルトの名無しさん:2006/03/12(日) 00:29:34
773じゃないけど
win用のEmacsってあったっけ。あっても、最適な環境まですごく遠くない?
ライブラリが用意してあるのか知らないけど
778デフォルトの名無しさん:2006/03/12(日) 00:31:00
今はVC++ 2005 Express Edtion。
昔はBorland C++とK2Editorを使っていた。
更に遡るとLSI C-86とメモ帳。
779デフォルトの名無しさん:2006/03/12(日) 00:31:02
C++ Express
780デフォルトの名無しさん:2006/03/12(日) 00:31:30
Meadowじゃね?使ったこと無いけど
781デフォルトの名無しさん:2006/03/12(日) 00:31:36
xyzzy
782777:2006/03/12(日) 00:36:10
Meadow、xyzzy、とかって秀丸の標準機能を作んなきゃなんないような偏見がある
783デフォルトの名無しさん:2006/03/12(日) 00:37:34
>>782
日本語でおk
784デフォルトの名無しさん:2006/03/12(日) 00:40:52
でも補完機能とかデバッギングとか簡単にできる開発環境がフリーであって,
やっぱJavaの方がとっつきやすいような希ガス。
最近の若者はC言語に見向きもしないんじゃないかと。
785デフォルトの名無しさん:2006/03/12(日) 00:45:49
高ぇよ>秀丸
秀丸を使う人は、どんなとこが便利であの金額払ってるの?(払ってない人はスルーで)
786デフォルトの名無しさん:2006/03/12(日) 00:49:12
秀丸の標準機能ってなんだ?

オートインデント、予約語の強調、エディタ内でのmakeシェル起動、エラー箇所へのジャンプ、
正規表現を使ったによる置換、grepとhitファイルの該当行へのジャンプ、タグジャンプ、括弧
の対応関係表示。

これだけあれば取り合えず、プログラミングには十分だと思うが。
ちなみに上はxyzzyやMeadowならデフォルトで持ってる機能だ。
787デフォルトの名無しさん:2006/03/12(日) 00:51:09
漏れはキーバインドが Windows 準拠っぽいやつで >>786 満たしてればドレでも良いや。
788デフォルトの名無しさん:2006/03/12(日) 00:52:27
秀丸の標準機能は鶴亀メールだと考えている
789デフォルトの名無しさん:2006/03/12(日) 00:53:20
秀丸以外にインストールからヘルプまで揃ってるようなエディタがない
790デフォルトの名無しさん:2006/03/12(日) 00:53:44
VC++ 2005 Express Edition使えよ。
無料の上にヘルプ込みの完全な統合開発環境だぞ。
791777:2006/03/12(日) 01:01:30
偏見だよ。E系使った事ないから矩形選択とかソートとかできないんじゃないかと
792デフォルトの名無しさん:2006/03/12(日) 01:02:51
ヘルプは英語、補完もなし
どこが完全な統合開発環境なんだ
793デフォルトの名無しさん:2006/03/12(日) 01:04:43
>>790に乗せられて今インストールしている俺がいる
794デフォルトの名無しさん:2006/03/12(日) 01:05:14
学校のPC(Linux)でも使えるように、Meadow使ってみたいんだが
どこから落とせばいいんだ?
795デフォルトの名無しさん:2006/03/12(日) 01:07:16
>>792
日本語のヘルプと補完あるぞ
796デフォルトの名無しさん:2006/03/12(日) 01:10:24
>>795
C言語に関しては英語
無いのはリファクタリングだった
お詫びして訂正します
上位版にはあるのに・・・・
797デフォルトの名無しさん:2006/03/12(日) 01:13:11
>>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]...
);
798デフォルトの名無しさん:2006/03/12(日) 01:13:57
C言語の日本語版ヘルプとリファクタリングツールとやらは秀丸にはついてるの?
799デフォルトの名無しさん:2006/03/12(日) 01:16:15
>>798
「完全な」統合開発環境というのを取り消せば許してやる
800デフォルトの名無しさん:2006/03/12(日) 01:19:14
「そもそも完全ってなんだよwww」


・〜〜
・〜〜
だよ」

「うぇwwwwwんなのが完全なのかよ >>〜〜のお里が知れるなww」

以降煽り、のの知り合い愛情を深めていく
801デフォルトの名無しさん:2006/03/12(日) 01:24:00
>>799
おれでよければいくらでも取り消したる by798==785!=790
802デフォルトの名無しさん:2006/03/12(日) 01:59:56
開発用のエディタとしてレジストの催促無視し続けてまで
禿丸使い続けるメリットなんて皆無だろ。
803デフォルトの名無しさん:2006/03/12(日) 02:25:50
払えよw
804デフォルトの名無しさん:2006/03/12(日) 02:42:47
巨大な配列をつくるとエラーが出てしまうのですが回避できませんか。
805デフォルトの名無しさん:2006/03/12(日) 02:43:29
staticってつけるとなぜか解決
806デフォルトの名無しさん:2006/03/12(日) 02:50:42
>>805
ありがd!
できました!
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)
というようにリンクエラーがでます
回避する方法あります?
809デフォルトの名無しさん:2006/03/12(日) 14:03:20
わからん、お前の話はぜんぜんわからん。
エラーメッセージを、一切加工せずに書け。
810デフォルトの名無しさん:2006/03/12(日) 15:09:25
char *strcpyex(char *d, char *s)
{
 strcpy(d, s);
 return d + strlen(d);
}
みたいな標準関数ないですか?
811デフォルトの名無しさん:2006/03/12(日) 15:23:17
無い
812デフォルトの名無しさん:2006/03/12(日) 15:23:52
自分で作れ
813デフォルトの名無しさん:2006/03/12(日) 15:24:30
もう作ってるしw
814デフォルトの名無しさん:2006/03/12(日) 15:42:38
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。

http://pc8.2ch.net/test/read.cgi/prog/1140616676/
815デフォルトの名無しさん:2006/03/12(日) 16:13:54
>>810
sprintf(d, "%s", s )
816>815:2006/03/12(日) 18:29:35
>return d + strlen(d)

ここは?
817デフォルトの名無しさん:2006/03/12(日) 18:34:29
別にd+sprintf(d,"%s",s)でもいいけどさ。
みたいな、だから。
818デフォルトの名無しさん:2006/03/12(日) 18:54:39
俺は良くこうするな
s += sprintf(s, "%s", hoge);
819デフォルトの名無しさん:2006/03/12(日) 19:14:05
イタ
820デフォルトの名無しさん:2006/03/12(日) 19:32:09
char型の配列の特定の箇所をatoiしたい場合はどうしたらよいのでしょう?
821デフォルトの名無しさん:2006/03/12(日) 19:42:04
>>820
数値の前の空白、数値の直後の英字などは無視されるので、
atoi(" 123abc") は123を返すがそれでは不満か?
もしそうならsscanf()を使え。
sscanf(" 1234abc", "%3d", & foo)でfooに123が得られる。
822デフォルトの名無しさん:2006/03/12(日) 19:57:42
>>821
そういう使い方もできるんですね
調べが甘かったです
ありがとうございました!
823デフォルトの名無しさん:2006/03/12(日) 20:46:18
hairetuというchar配列をprintfで表示する場合、

printf(hairetu);

では表示できるんですが、

printf("%s",hairetu);

では表示できないんですけど、仕様ですか?
824デフォルトの名無しさん:2006/03/12(日) 20:51:33
>>823
普通に出来る
825デフォルトの名無しさん:2006/03/12(日) 20:53:56
>>824
もう一度コンパイルし直したら出来ました
ありがとうございます
826デフォルトの名無しさん:2006/03/12(日) 21:39:01
int main (void){
int c;
char str[50];
scanf("%s", str);
c = getchar();
return0;}

とするとgetcharが行われないのですが何故でしょうか?
実行するとscanの部分だけで終了してしまいます。
827デフォルトの名無しさん:2006/03/12(日) 21:51:32
>>826
scanfの食べ残した改行をgetcharが食べるから
828デフォルトの名無しさん:2006/03/12(日) 21:57:30
どうやったら上の現象を回避してgetcharを機能させられるのですか?
829デフォルトの名無しさん:2006/03/12(日) 22:08:47
int main (void){
int c;
char str[50];
scanf("%s", str);
getchar();
c = getchar();
return0;}
830デフォルトの名無しさん:2006/03/12(日) 22:11:49
scanfって推薦されてなくなかったっけ
831デフォルトの名無しさん:2006/03/12(日) 22:22:49
getcharを重ねるのが簡単なんでしょうか。
>>829の方法で無事、動作しました。
832・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/12(日) 22:22:57
scanfって改行を1個食べ残すからね。
833デフォルトの名無しさん:2006/03/12(日) 22:34:49
>>829
こうで十分だろ。
scanf("%s%*c", str);
c = getchar();
834デフォルトの名無しさん:2006/03/12(日) 22:59:56
>>829
そこに50バイト以上流し込んでやる。
835デフォルトの名無しさん:2006/03/12(日) 23:08:06
>>826
「getchar が行われていない」 とは何を根拠に言っている?
836デフォルトの名無しさん:2006/03/12(日) 23:24:42
>>835
正しくはgetcharのところでプロンプトが入力待ちにならないってことだが、
そんなの雰囲気で分かるやろ、ぼけ。
837デフォルトの名無しさん:2006/03/12(日) 23:30:10
そんなの雰囲気で分かるやろ、ぼけ。
そんなの雰囲気で分かるやろ、ぼけ。
そんなの雰囲気で分かるやろ、ぼけ。
そんなの雰囲気で分かるやろ、ぼけ。
そんなの雰囲気で分かるやろ、ぼけ。
そんなの雰囲気で分かるやろ、ぼけ。
そんなの雰囲気で分かるやろ、ぼけ。
838デフォルトの名無しさん:2006/03/12(日) 23:51:09
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]を確保してそこに入れればいいのですが
メモリがもったいないです、確保したくありません
何か解決策ダサイ><
840デフォルトの名無しさん:2006/03/12(日) 23:56:40
>>839
そのコードは鼻から悪魔。
素直に別領域使えよ、ボォケェ
841デフォルトの名無しさん:2006/03/13(月) 00:01:09
自分でそういうコピーをする関数を作ればOK
842デフォルトの名無しさん:2006/03/13(月) 00:07:56
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
>>839
メモリを使え。ケチるな。
844デフォルトの名無しさん:2006/03/13(月) 00:13:41
>>824
THX><
845デフォルトの名無しさん:2006/03/13(月) 00:15:38
暇だったからバッファ溢れを考えて作ってみた。
#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;
}
846デフォルトの名無しさん:2006/03/13(月) 00:16:38
>>843
いけません><
PCがかわいそうです。
私は、林檎三個食べただけでもうアウアウなのに
char s3[100]なんて確保したらPCがアウアウパウになります。
847デフォルトの名無しさん:2006/03/13(月) 00:19:04
char s[100];
char *s1="うんこ";
char *s2="何?";
にすればメモリの消費量も解決(w
848デフォルトの名無しさん:2006/03/13(月) 00:20:46
みんな可変長配列使えよう
849デフォルトの名無しさん:2006/03/13(月) 00:21:05
>>845
ありがとうございます><
私のPCもとてもよろこんでます。

     / ̄ ̄ ̄ ̄/
    /  FMV  /  <うれピー!
  \/____/
850デフォルトの名無しさん:2006/03/13(月) 00:23:37
んなRAM16Kバイトのマイコンじゃあるまいし100バイトの自動変数ぐらいでビクビクしてどうする。
851デフォルトの名無しさん:2006/03/13(月) 00:28:22
char *s0="うんこ", *s1="何?";
char s[100];
sprintf(s,"%s%s",s0,s1);
printf("%s\n", s);
852デフォルトの名無しさん:2006/03/13(月) 00:41:04
s1[50]にして別にs3[50]を定義する。
メモリ使用量はほぼ変わらない。
853デフォルトの名無しさん:2006/03/13(月) 00:49:42
そうやって資源を贅沢に使う姿勢が地球環境を破壊したことは否定できません
854デフォルトの名無しさん:2006/03/13(月) 00:53:01
皇北都 「だって、わたしのPCにはもう2Gもメモリが実装されているんだもん。
      いまさら配列サイズをケチったって、破壊された森林は戻ってこないわ」
855デフォルトの名無しさん:2006/03/13(月) 00:57:02
初心者に限って小手先の効率を求める
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; としようとするとエラーが出るんですがこういうようにしたい場合どう書けばいいんでしょうか?
857デフォルトの名無しさん:2006/03/13(月) 01:22:58
>>856
>a1->val = N; はできますよね
できない
>a1->b->val = N; としようとするとエラーが出るんですが
当然

ポインタを理解できない人種ってこれのことか?
858デフォルトの名無しさん:2006/03/13(月) 01:23:20
> struct A{ int val; struct A *next; struct B b;} *a1;
> struct B{ int val; struct *next;} *b1;
>
> a1->val = N; はできますよね

ポインタの先の実体が無いとできませんよ
859デフォルトの名無しさん:2006/03/13(月) 01:23:32
変数宣言の時点でエラーになるんじゃねーか?
860デフォルトの名無しさん:2006/03/13(月) 01:27:13
>>856
ポインタがインスタンスを指していないんじゃないんか?
a1 = malloc( sizeof(struct A) );
a1->b = malloc( sizeof (struct B) );
861デフォルトの名無しさん:2006/03/13(月) 01:28:44
>>860
a1->bは集約関係だから必要ないだろ
862デフォルトの名無しさん:2006/03/13(月) 01:29:50
だからこうしろって

struct B{ int val; struct *next;} *b1;
struct A{ int val; struct A *next; struct B *b;} *a1;

863856: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; というようなことがしたいということです

書き忘れですすいません
864デフォルトの名無しさん:2006/03/13(月) 01:35:40
>>863
普通に出来るはずだが
struct Aの宣言でエラーが出てるとか言ったら殺す
865デフォルトの名無しさん:2006/03/13(月) 01:37:41
struct *next;
で宣言でエラーが出てる、とかいって殺されるに1票
866856:2006/03/13(月) 01:38:58
>>864
できますか

これも書き間違えてましたがstruct Bの方が先に書いてあるのでそこではエラーは出ていません
a1->b->val = N;をなくすとコンパイルも通るので宣言の部分でのエラーというのは考えられません
他に変なところがないか見てみます
867デフォルトの名無しさん:2006/03/13(月) 01:39:46
断固としてコンパイルエラーを書かないのは、明からに釣りの証拠(w
868デフォルトの名無しさん:2006/03/13(月) 01:40:12 BE:152172443-
Windowの位置をランダムにしたいのですが、
どのように書けばいいのでしょうか。
869デフォルトの名無しさん:2006/03/13(月) 01:40:42
>>866
変なのは藻前の頭
870856:2006/03/13(月) 01:43:22
a1->b->val=N;としている行: error: dereferencing pointer to incomplete type

というエラーが出ます
871デフォルトの名無しさん:2006/03/13(月) 01:43:35
>>868
スレ違い。死ね
872デフォルトの名無しさん:2006/03/13(月) 01:47:10
a1->bに型が違うポインタ代入してんだろ?
873デフォルトの名無しさん:2006/03/13(月) 01:51:08
a1->b = (struct B *)malloc(sizeof(struct B));
している場所と
a1->b->val = N;
している場所は実は全然別で、片方には
struct Bの定義が無かったというオチか?
874デフォルトの名無しさん:2006/03/13(月) 01:54:46
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って違いはありますか?
877デフォルトの名無しさん:2006/03/13(月) 03:32:48
CにNILなんてありません
878デフォルトの名無しさん:2006/03/13(月) 03:34:00
>>876
NILの定義を示してください
879876:2006/03/13(月) 03:40:33
これは失礼しました
880デフォルトの名無しさん:2006/03/13(月) 03:48:03
俺はNIL文化には付いていけない
881デフォルトの名無しさん:2006/03/13(月) 03:54:50
温と煮
882デフォルトの名無しさん:2006/03/13(月) 12:03:39
文字列の回文を出力したいのですが、回文の出力実行で表示がおかしくなるのですが
元々代入されている文字配列へ再度代入するという行為(一番下の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);
}
883デフォルトの名無しさん:2006/03/13(月) 12:26:52
>>882
色々と間違えてる。
とりあえず、各変数の値がどうなるか、
一行ずつしっかり確認汁。
884デフォルトの名無しさん:2006/03/13(月) 12:32:09
>>883
分かりました。変数を出力して確かめてみます。解答ありがとうございます!
885デフォルトの名無しさん:2006/03/13(月) 12:32:11
>str_size = sizeof(str)/sizeof(str[0]); //文字のサイズ

これは、文字のサイズじゃなくて配列の個数だと思うのだが。
strlen()とか使う。

しかし、2バイト文字はこのまま(char)だとうまくいかない。
わかるね?
そして、
>str[i] = str[j];
文字列上書きしてるだろ。
886デフォルトの名無しさん:2006/03/13(月) 12:32:43
j=str_sizeの時点でおかしいし、i<'\0'も意味不明
それに回文を作るルーチンとしてもおかしい
887デフォルトの名無しさん:2006/03/13(月) 12:36:06
こうやって、初心者からデバッグの方法を学ぶチャンスを奪っていくのですね。
888デフォルトの名無しさん:2006/03/13(月) 12:36:35
>>885
すいません。そうでした要素数を計算したかったんです。

2バイト文字はcharの領域を倍使う事位しか知りません・・・。
もう一度やり直すべきですね・・・。
では言われた事を再度確認してきます。ありがとうございます。
889デフォルトの名無しさん:2006/03/13(月) 12:38:41
>>886
というのはプログラム自体を考え直すべきなのですねOrz
>>887
デバッグの仕方を知りませんので、分からないです
890デフォルトの名無しさん:2006/03/13(月) 12:56:49
回文じゃなくて、単に入力された文字を反転させてるだけだろ
もっともそれすらうまくいってないが
891デフォルトの名無しさん:2006/03/13(月) 13:03:02
文字列が一周して元に戻ってしまう(´・ω・`;)
回文というのは要素数が奇数でしたら下の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);
}
892デフォルトの名無しさん:2006/03/13(月) 13:08:51
>>891
i < '¥0'の時点でループが(ry
893デフォルトの名無しさん:2006/03/13(月) 13:12:04
>>892
うわぁ・・・すいません。文字列での条件でした。
894デフォルトの名無しさん:2006/03/13(月) 13:29:22
この糞っっぅぅぅっったたたれーーーーーー!!!!!!!!!カスがぁ!!!!!

回文なんか俺にはできる訳ねぇーーーーーーーーーーんだよ馬鹿めぇぇ!!!!!!

うはははははははは見くびるな!もういい。俺はプログラムのデリケートな所が大嫌いだ。辞〜めた
895デフォルトの名無しさん:2006/03/13(月) 13:52:31
なんて潔い
896デフォルトの名無しさん:2006/03/13(月) 13:56:34
>>894 を回文で書いてあるのかと期待しちゃったじゃないか・・・
897デフォルトの名無しさん:2006/03/13(月) 14:41:32
回文の意味を取り違えてました。ですので考え直したんですが、
下の結果で文字列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);
898デフォルトの名無しさん:2006/03/13(月) 14:45:28
>>897
forループの最初でコピーされるstr[j]は何だと思う?
899デフォルトの名無しさん:2006/03/13(月) 14:52:07
>>898
jはstrlen(str)によって求められた要素数ですので、12345を入力したとしたら
5になるわけですから、str[6] = str[5]になるのではないでしょうか?
そしてjをデクリメントして行く = 12345のj--によって配列4番目の要素がstr[7]に
代入される。というのが自分の考えです・

ですのでstr[j]は12345の場合5の要素・・・

あっ配列ですので要素数は-1されるんですね?ちょっとやってみます!!
900デフォルトの名無しさん:2006/03/13(月) 14:58:19
・・・・・・僕にはまだ早いようです。ほんとうにありがとうございました。
文字列、配列の扱いが全然難しいので、文字列とはを検索して勉強します。
901デフォルトの名無しさん:2006/03/13(月) 15:41:41
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だな
902デフォルトの名無しさん:2006/03/13(月) 15:42:25
1 2 3 4 5 \0 \0 5 4 3 2 1
でした
903デフォルトの名無しさん:2006/03/13(月) 15:46:04
入力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;
}
905デフォルトの名無しさん:2006/03/13(月) 16:10:22
>>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){}
としたらできたのですが、友人に聞いたら、
それではメモリが支配されてしまう(?)ので、あまり良くないとのことです。
やはりそれではダメなのですか?ダメならどうすればいいですかね?
907デフォルトの名無しさん:2006/03/13(月) 16:19:22
>>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
>>906
(b)→(!b)
ですm(_ _)m
909デフォルトの名無しさん:2006/03/13(月) 16:21:54
>>906
友人に聞け
910デフォルトの名無しさん:2006/03/13(月) 16:24:31
>>909
解決策については本人も分からないらしいです。
911デフォルトの名無しさん:2006/03/13(月) 16:32:14
>>907
あっ・・・そちらの方が見やすいですね。

なぜstr[i]='\0'をするのかはfor文で代入直後には終了を示す'\0'が代入されて無いので
文字配列が終端を認識できないため、代入するという事だと思いますが・・・。
912デフォルトの名無しさん:2006/03/13(月) 16:32:53
たぶんbをvolatileにすべきとか、CPUを眠らせるようにすべきとかそういうことだと思う。
913デフォルトの名無しさん:2006/03/13(月) 17:58:09
メモリが支配されるってのはどういう事だ?
まぁおそらく>>912が書いてるようにCPUが占有されることだと思うが

並列処理については環境依存の方法使った方がいいんじゃないか?
914デフォルトの名無しさん:2006/03/13(月) 18:09:47
知らない人は引っ込んでいた方がいいよ。
915デフォルトの名無しさん:2006/03/13(月) 18:11:23
>>914
そうします。
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
>>919
組みこみでないと思います。
921デフォルトの名無しさん:2006/03/13(月) 18:42:36
>>918
OSによってやり方が変わるが、シグナルとかを使う
922デフォルトの名無しさん:2006/03/13(月) 18:47:26
>>921
OSによって変わるんですか…
いまの私には難しそうですね。
923デフォルトの名無しさん:2006/03/13(月) 19:45:27
pthread使っとけ
924デフォルトの名無しさん:2006/03/13(月) 20:45:12
ちょっと聞きたいんですが、if-elseの羅列の代わりに、

switch(TRUE){
   case 論理式:
      処理1。break;
   case 論理式:
      処理2。break;
      ・
      ・
      ・
}

っていう書き方はあり?

来月からマになってしまうんですが、今まで独学でやってきたので、
自分は変態なんじゃないか(書き方が)と不安で不安で…。
こんなこと恥ずかしくて同期には聞けないので教えてください(///)
925デフォルトの名無しさん:2006/03/13(月) 20:46:32
ない
926デフォルトの名無しさん:2006/03/13(月) 20:47:27
switchにする意味が分からない。
927924:2006/03/13(月) 20:50:02
else ifがいくつも並ぶとなんだかかっこ悪い気がして…。
928デフォルトの名無しさん:2006/03/13(月) 20:52:19
新人類シニア世代(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はそれぞれ適した言語)
929デフォルトの名無しさん:2006/03/13(月) 20:59:16
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);
}
こういう変態的なコードは書けてしまったりする。
930デフォルトの名無しさん:2006/03/13(月) 21:00:10
試す前に聞くような奴は役に立たない。
931デフォルトの名無しさん:2006/03/13(月) 21:14:36
>>927
switchのほうが格好悪いし使いにくい。

while(なんかのイテレータ->hasNext()){
 値 = イテレータ->next();
 if(値が妥当で有れば){
  //else-if文替わりに実行
}
}

ってかんじならelse-ifのかわりにできるだろう
932デフォルトの名無しさん:2006/03/13(月) 21:22:04
>>924
そもそも、caseに書けるのは定数のみ。
式なんて書いたらコンパイル通らないだろ。
933924:2006/03/13(月) 21:24:44
ほんとだ…。Cコンパイラひっぱりだしてきてやってみたら怒られました。
最近ActionScriptとかperlしか触ってなかったので、cでも出来るんじゃねとか思ってました…。

> 929
なにやってるんだかまったくわかんない…。
934デフォルトの名無しさん:2006/03/13(月) 21:24:48
多段if-elseがかっこ悪いというやつの方が
switchが使いにくいっていうやつより有望ではあるな

ま、でもCではif-elseにするしかない。
いやなら多段if-elseは関数にくくり出して結果をintにコード化して返してswitchで使うだわな。
コードに論理的意味付けを持たせれば、
判定実装と論理的意味に対する処理という異なるレイヤーを混在させなくてすむ。
935デフォルトの名無しさん:2006/03/13(月) 21:30:36
関数ポインタの配列でも解決できそうな気がしないでもない
936デフォルトの名無しさん:2006/03/13(月) 21:30:54
どこが有望なんだ。
switchは上から総なめするときに有効なだけで
無理して使うことは無い。
937924:2006/03/13(月) 21:42:32
ageちゃった。すいません。
今まで学問としてcや他の言語を学んだことがないので、
自分のソースコードってどうなんだろうと疑問に思ったんです。
周りの同期はみな大学でプログラムを学んでいるようなので、
書き方のお作法や定石なんかがしっかりしてるんだろうなと。

レスをもらって、そこら辺自分は甘いなぁと改めて感じました…。サンクスです。

>>931, >>934, >>935
判定用の関数を作ってイテレータをぐるぐる回すとかの方がカッコイイんですかね。
そうすれば、もう変にswitchになんかこだわらなくても良さそうです。
938デフォルトの名無しさん:2006/03/13(月) 21:43:02
しょせん高級アセンブラ
935 も言いたげだが、自分で作るための言語にあれもこれも用意させてどうする
939デフォルトの名無しさん:2006/03/13(月) 21:46:37
別に大学で情報科学専攻したからといって
コーディングの作法はやらないと思うがな
940デフォルトの名無しさん:2006/03/13(月) 21:47:51
コーディングは科学じゃない
941デフォルトの名無しさん:2006/03/13(月) 21:50:43
>>940
true
942デフォルトの名無しさん:2006/03/13(月) 21:54:04
それはそうだが、ソフトウェア工学は科学である。
943デフォルトの名無しさん:2006/03/13(月) 21:55:37
>>942
C++ にあって C99 にないものか
944デフォルトの名無しさん:2006/03/13(月) 22:54:43
コマンドプロントで、フォルダ名が全角のカタカナの場合はどうやってコマンドプロント画面に打てばいいですか?
コピペしか方法が分かりません
945デフォルトの名無しさん:2006/03/13(月) 22:56:27
Alt+[半角/全角]

↓これも併用して

Windowsキー+Eを二秒押すと全角カナ設定が保存される。
Windowsキー+Lで編集が便利になる機能がオンになる。
946デフォルトの名無しさん:2006/03/13(月) 22:58:13
tab使って0から補完
947944:2006/03/13(月) 23:13:03
ありがとうございます
もう1つお願いします。全くの初心者なんですが、コンパイルするメモ帳のファイルはどこに置いたらいいですか?
デスクトップのCというフォルダに保存してるんですが、今の場合だとC:\Documents and Settings\自分の名前\デスクトップ\C>
という感じで長くなって見にくいです
948デフォルトの名無しさん:2006/03/13(月) 23:13:38
C:\WINDOWS\直下がオススメ。
パスが通っている。
949944:2006/03/13(月) 23:15:01
直下というのは何でしょうか?
950デフォルトの名無しさん:2006/03/13(月) 23:16:18
c:\home\c, c:\home\binとか作ってそこに置いとけ
951デフォルトの名無しさん:2006/03/13(月) 23:17:55
俺は>>948だ。>>948は嘘だから>>950に従っておけ。
あと質問は一回にまとめろ。本はやさしいものを買え。
952944:2006/03/13(月) 23:21:53
分かりました
どうもありがとうございました
953デフォルトの名無しさん:2006/03/13(月) 23:24:00
つーか、スレ違いだがね。
954デフォルトの名無しさん:2006/03/13(月) 23:24:13
>>948
こりゃまた最悪な種をまいたもんだな
955デフォルトの名無しさん:2006/03/13(月) 23:40:37
C言語用に、関数仕様書やフローチャートなんかを
自動生成するツールがあれば教えてもらえると嬉しいです。
956デフォルトの名無しさん:2006/03/13(月) 23:41:09
doxygen
957デフォルトの名無しさん:2006/03/13(月) 23:42:20
doxygenにフローチャートの作成機能なんてあったか?
クラス図作成機能があったのは知ってるが
958デフォルトの名無しさん:2006/03/13(月) 23:45:53
ソース読み込んでフローチャートを自動作成するやつあったら俺も知りたい
959デフォルトの名無しさん:2006/03/14(火) 00:01:29
>>955
関数仕様書や処理フローも無く、どう製造するのかと問いたい。
960デフォルトの名無しさん:2006/03/14(火) 00:04:08
>>955
因果関係が逆
関数からどんな意図が推定できるかではなく(ソース読む人を馬鹿にしすぎ)、
どんな意図からその関数が出てきたのかを示さねば人手で資料を作る意味はない
961955:2006/03/14(火) 00:19:07
他人のソース読む際の
足がかりに出来ないかなとか考えてました。
962デフォルトの名無しさん:2006/03/14(火) 00:39:31
最初からそう言えやー
普通はタグテーブル作って参照できるようにするだけじゃないかね
963デフォルトの名無しさん:2006/03/14(火) 00:41:07
doxygen
964デフォルトの名無しさん:2006/03/14(火) 00:44:35
素人は思いもよらぬ発想でコード組んだりするので結構読めんもんだよ。
965デフォルトの名無しさん:2006/03/14(火) 00:47:43
>>955さんではないですけど私も今他人のコードを読んでるんですが
他人のコードを読むのはほぼ初めてで全然進まない状況なんですが
タグテーブルって何ですか?検索してもHTMLのタグのことばっかりでてきます
効率よく読める方法があれば是非教えてもらいたいのですが
966デフォルトの名無しさん:2006/03/14(火) 00:51:48
ctagsで検索すればいい
なんか初心者向けなフロントエンドあったっけな
と思って検索してみたらこんなの出た
http://catfish.virtualave.net/ctagsbr/ctagsbr.html
967デフォルトの名無しさん:2006/03/14(火) 00:59:38
Visual Studio使える奴には用無しだがな
968デフォルトの名無しさん:2006/03/14(火) 01:35:39
他人のソースを読むなら、Understand for C++というまさにそのまんまな名前のソフトがあるにはある
少々癖がある+結構高い$495上に英語のみ(まぁここは問題ないだろうけど)だが
評価版もあるんで試してみると吉
969デフォルトの名無しさん:2006/03/14(火) 02:03:34
自分のコードスタイルに編集しながら読んでいけばある時点ではっちゃけると思う。
全然進まないならタグテーブルでも情報量過多になることも考えられるので
相当物を手作業で作ったほうがよいかも。
ナビゲーション性が悪いとストレスが溜まるのでブックマークをつけられる
エディタやヴューワを使ったほうがよい。
あとは印刷物にマーカー持って向き合うかだな。
970デフォルトの名無しさん:2006/03/14(火) 02:27:00
>>966
横だけど、これいいね。xyzzyとも相性いいね。
VSのプロジェクトファイルがあるなら、VSがベストだけど
この軽さもいい感じ。いい情報ありがとう
971デフォルトの名無しさん:2006/03/14(火) 04:08:25
ポインタの指してるアドレスって例えばint型だとすると4バイトのうちの先頭を指していると考えていいですか?
972デフォルトの名無しさん:2006/03/14(火) 05:17:54
>>972
だめ
973デフォルトの名無しさん:2006/03/14(火) 05:18:53
>>971だ ねぼけとった
974デフォルトの名無しさん:2006/03/14(火) 08:05:31
doxygenを
使ってる人います?使うとしたら形式はQTとJavaDocどっちにしてます?

あとフローチャートを作成するのにお勧めToolはありますか?
また関数からフローチャートを作成するToolも探してます。
できればフリーのほうがいいです

なぜならQAの人たち(検査する人たち)に説明する際にソースを印刷するよりもフローのほうがいいからです。
よろしくお願いします。
975デフォルトの名無しさん:2006/03/14(火) 09:02:34
>>971
まず、アドレスとは限らない。
# 実装としてアドレスが使われる事は多いが。
976デフォルトの名無しさん:2006/03/14(火) 11:21:38
C言語なら俺に聞け! Part 124
http://pc8.2ch.net/test/read.cgi/tech/1142302804/
977デフォルトの名無しさん:2006/03/14(火) 18:17:29
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みたいなコード打つヤツとは仕事したくねーな
979デフォルトの名無しさん:2006/03/14(火) 19:35:24
>>978
何でですか><
980デフォルトの名無しさん:2006/03/14(火) 19:40:00
AllocNodeをインラインにするかマクロにすれば俺は許す。
981デフォルトの名無しさん:2006/03/14(火) 19:52:29
この場合は使ったメモリ、開放しなくていいんですか?
982デフォルトの名無しさん:2006/03/14(火) 19:57:51
>>980
インラインでググッテきます。
983デフォルトの名無しさん:2006/03/14(火) 20:11:13
>>980
インライン云々の問題じゃないと思われ
984デフォルトの名無しさん:2006/03/14(火) 20:11:45
ここの回答者ってホント糞ばっかだな
985デフォルトの名無しさん:2006/03/14(火) 20:13:23
一番の問題は拡張性の無さでいいのですか?
986デフォルトの名無しさん:2006/03/14(火) 20:27:42
質問が糞だと回答もそれなりにならざるを得ないだろうな
987デフォルトの名無しさん:2006/03/14(火) 20:31:25 BE:67935757-
scanf
988デフォルトの名無しさん:2006/03/14(火) 20:33:17
>>987
の紹介文において、わいせつ行為で捕まえられないですか?
989デフォルトの名無しさん:2006/03/14(火) 23:39:32
>>988
あれをわいせつ行為だと思える、その精神がわいせつ。
エロいことばっかり考えてるからそう思えるんだって。
"C"言語にもそういうこと期待してる?もしかして。
990デフォルトの名無しさん:2006/03/14(火) 23:55:20
セックル言語!!>>989はもっとエロいのかw
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と出るかが分かりません
993デフォルトの名無しさん:2006/03/15(水) 01:05:24
ローカル変数は初期値不定。
994デフォルトの名無しさん:2006/03/15(水) 01:05:34
仕様です
995デフォルトの名無しさん:2006/03/15(水) 01:10:03
>>993>>994
1以外の値にはならないんですか?
996デフォルトの名無しさん:2006/03/15(水) 01:11:11
ゴミの値が出るんだろ。
997デフォルトの名無しさん:2006/03/15(水) 01:11:27
>>995
>>993-994で理解できないなら向いてないからやめた方がいいよ^^
998デフォルトの名無しさん:2006/03/15(水) 01:17:12
初心者には優しくしてください><
999デフォルトの名無しさん:2006/03/15(水) 01:18:32
999
1000デフォルトの名無しさん:2006/03/15(水) 01:21:16
#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;
}
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。