1read 100read
2012年4月プログラム30: C言語なら俺に聞け(入門編)Part 100 (1001) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Rubyについて Part47 (172)
くだすれDelphi(超初心者用)その54 (468)
【Scheme】Schemeインタプリタ Mosh Part1【Lisp】 (195)
日本発、次世代言語: 織田信長 (528)
Silverlight登場で.NET使い大勝利!!! Part2 (473)
【SL4】Windows Phone 7 アプリ開発スレ Part3【XNA】 (432)

C言語なら俺に聞け(入門編)Part 100


1 :12/03/30 〜 最終レス :Over
C言語の入門者向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 99
http://toro.2ch.net/test/read.cgi/tech/1331786500/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 156代目
http://toro.2ch.net/test/read.cgi/tech/1328276597/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
長くなりそうなコードはcodepadに貼り付けてもいいでしょう
http://codepad.org/

2 :
part 0x64 おめでとう!

3 :
>>1


4 :
>>1


5 :
文字列の細かい操作はやっぱりC++よりCの方がやりやすいなあ
え?独り言はチラシの裏に書けって?どうも

6 :
>>5
std::stringが使いにくいってこと?
それなら同意。

7 :
rubyやpythonと比べたら使いづらいけど
Cと比べれば全然マシだと思うけどなぁ

8 :
sprintfの万能さには勝てない。

9 :
sprintfじゃバッファオーバーフローが防げない
char buff[十分なバッファ];
とかしてsnprintfの戻り値チェックとかめんどくさいっす

10 :
/dev/nullに書いて長さ調べるのはだめなの?

11 :
数スレ前で同じような話があった気がする

12 :
テンプレートライブラリって普及してるの?
あれってコンパイルするとマクロみたいに展開されて
デバッグ凄く大変になるんじゃなかったっけ?
昔ATLとか出始めの時に使おうと思ったけど
メンテナンス性が凄く悪そうな印象だったからやめた記憶がある。
なんかライブラリと自分のコードの境目が曖昧になるのって
あんまり居心地がよく無い

13 :
普及してる

14 :
>>10
どういうこと?
できたらサンプルソースお願い。

15 :
>>14
#include <stdio.h>
#include <stdarg.h>
int formattedLength(const char * form, ...)
{
FILE * fp = fopen("/dev/null", "w");
va_list args;
va_start(args, form);
int len = vfprintf(fp, form, args);
va_end(args);
fclose(fp);
return len;
}
int main(int argc, char ** argv)
{
printf("%d\n", formattedLength(argc > 1 ? argv[1] : "%g", 1. / 3));
return 0;
}

16 :
文字配列の初期化って0x00で初期化するのがいいの?
ヌル文字で初期化ってどうなのかなあ。
0x20で初期化するのってどう?

17 :
危険

18 :
>>16
asciiの積もりだろうから空白文字だろうけど、それで初期化することは無意味。
先頭にナル文字を書いておけば、長さ0の文字列として扱える。

19 :
>>15
んーと、それを簡単に書くと
int len = snprintf(NULL,0,...);
でしょ?
int len = snprintf(NULL,0,...);
int plen = len+1;
char *p = malloc(plen);
snprintf(p, plen, ...); /* erro check 省略 */
free(p);
毎回、snprintfを2回呼んでmalloc/freeはダサくね?って話。
とはいえ、固定長バッファで溢れたらエラーで終わりってのも微妙だし
バッファを使いまわしてreallocするのも微妙

20 :
天地明察の原作者が一番かわいそうだわ

21 :
誤爆ごめんなさい

22 :
asprintf使えよ

23 :
assprintf?

24 :
処理系依存じゃん

25 :
うん

26 :
俺はC言語の達人
まいったか!?

27 :
まいりました

28 :
なにこの名前欄

29 :
これもすべてQZクズのせい

30 :
http://toro.2ch.net/test/read.cgi/tech/1333095907/46,48,50

31 :
yaccで分岐ステートメントをインタープリター実装する方法がわからないので教えてください。
selection:
__STATE_IF expression __STATE_THEN expression __STATE_ELSE expression
とした場合にthen、else両expressionが還元されるので、
if x then a=1 else a=2のような構文がインタープリター動作の場合破綻してしまい困ってます。
これを解決する一般的な良い方法があったら教えてください。

32 :
パースの段階では構文木を構築するだけにして、実行とは段階を分けるのが普通。
小手先のトリックを使えばなんとかならんでもないけど…
例えば
cond: __STATE_IF expression __STATE_THEN
ifstatement: cond expression __STATE_ELSE expression
という風にふたつに分離してしまえば条件節の結果を先に得られるので、
それが真であれば else 節はよみとばす (パースだけして副作用を発生させないようにフラグを立てるとか) というような実装にできる。

33 :
>>32
フラグで読み飛ばすって、具体的にどうやるか思いつかないです。
cond: __STATE_IF expression __STATE_THEN {$$=$2; if_cond=$2;}
ifstatement: cond if_expression __STATE_ELSE if_expression
if_expression : expression {if (if_cond) 各種;}
的なことだろうけど、このif_cond をどう使えばいいのかイメージが沸きません。
>>実行とは分けるのが普通
たしかに全体を一旦中間コード(おれアセンブラコード)へ変換するアプローチの方が
逆に簡単なような気がしてきましたorz
(簡単のためにインタープリターにしようと思ったのだけど、コンパイラー作る方が逆に簡単っぽい)

34 :
いま閃いたんですけど、
lexのパーサーモードに%x <if_then>や %x <if_else>を用意して
字句解析の段階でダイレクトに if_expression の読み飛ばしを指定してみてはどうかと。
gotoをラベルテーブルに対するyyin操作で実装するような感じで。

35 :
>>32
ありがとうございます。とてもいいヒントになりました。

36 :
&((HOGE + i)->fuga) という表記って、もっとすっきり書けないんでしたっけ?
(別にポインタを用意するのはナシで)
もう長年使ってないから忘れてもーた…(´Д`)

37 :
&HOGE[i].fuga

38 :
>>36
あんま変わんね
&HOGE[i].fuga

39 :
FUGA* getFugaReference(HOGE* hoge, int index);

40 :
やっぱ直接メンバ指定すると配列になっちゃうかー
dd

41 :
プログラミングの勉強を始める時に色々オススメの本を教えて頂いた者です。どうしてもお礼が言いたくなり、この場を借りてお礼を言わせて下さい!あの時は本当にありがとうございました!お陰で苦手だった勉強も楽しくなってきました!本当ありがとうございます!

42 :
>>41
また困ったことがあればいらっしゃい

43 :
可愛いやつだ

44 :
http://qune.cside.com/archives/001941.html
> また,この本は,プログラム内の定数にマクロ定数を使えと言う。今でもそゆ古典的なことを勧めてる人がいるのかと,ちょっとびっくりしたんだけれども,何も知らない子に変なこと教えるなといいたい。
このブログにこんなことが書いてあったのだけど、普通はどうするんでしょうか。

45 :
ステマ乙www

46 :
>>44
#defineではなく、enumで、数値に名前をつける。constもつかえる
「数値は、マクロではなく定数として定義しよう。Cプログラマは、マジックナンバー
の値を管理するのに伝統的に#defineを使ってきた。しかしCのプリプロセッサは
強力だが乱暴なツール(中略)
CとC++では、整定数をenum文で定義できる。C++では任意の型の定数をconstで
宣言できる。
 const int MAXROW = 24, MAXCOL = 80;

『プログラミング作法』p. 41(ブライアン・W・カーニハン、ロブ・パイク)

47 :
>>44
オブジェクトサイズは言語に計算させよう(中略)
2や4ではなく、sizeof(int)
(中略)
 char buf[1024];
 fgets(buf, sizeof(buf), stdin);
バッファサイズは依然としてマジックナンバーだが、宣言に1回登場するだけで
済む」
『プログラミング作法』p. 43(ブライアン・W・カーニハン、ロブ・パイク)

48 :
>>46
C++ならいいけど、Cのconstは外部リンケージだから定数には使いにくいっていうか。
配列の要素数とか使えないところもあるし。

49 :
>>44
未来から来て、過去の人を笑うのは簡単。
100%バグのないプログラムもない。
人間謙虚でありたいものですね。

50 :
> 配列の要素数とか使えないところもあるし。
具体例ほしいなー

51 :
>>50
const int TBL_SIZE = 10;
int tbl[TBL_SIZE]; ← エラー

52 :
>>51
あー、ごめん
それがエラーになるような実行環境の具体例ね。

53 :
マクロはプリプロセッサーだけど
constはコンパイラーオプションだからな

54 :
>>52
アホなん?
http://codepad.org/hAuu0X9H

55 :
>>52
バカのくせに上から目線w

56 :
>>44
これもC++の仕様と混同してるだけなんじゃないの?

57 :
え?
そいつ、C++知らねーんじゃねーの?
今時Cの本もないだろに。

58 :
>>54
初めて知ったわ
file scopeだとダメなんだね

59 :
>>48にそのまま書いてあるのに、アホなん?

60 :
>>57
C++だとマクロよりconstやらinline関数の使用が推奨されてるから、
Cでもそうだと思ってるんじゃないの? >>44 のブログの人。

61 :
本 人 乙。

62 :
enumハックなつかしいなぁ。

63 :
即値やdefineマクロを使わずイミディエイト値を用意するとなると・・・

64 :
#define定数をconst定数に書き換えたところで大してありがたみを感じたことって実際ないよな
#defineで普通に問題なく事は進んでいくし

65 :
まぁデバッガで見えるのと、括弧をつけたつけないで変なことにならなくて
済むってくりだからね。

66 :
C++ での NULLの実装は… 任意なんだっけ?
ほとんど #define でやってるように見受けられるけど

67 :
関数のプロトタイプにconst付いてない場合にconst定数を引数で渡すと引数の型が違うとか言って怒られるし
プロトタイプを変更したらconst付けてないのが渡せなくなるしマジうざいんだけど

68 :
>>67
なんか違ってないか?

69 :
>プロトタイプを変更したらconst付けてないのが渡せなくなるしマジうざいんだけど
こう言う動作だっけ?
もうC++書いてないから忘れたけど
関数の引数でconst宣言するのって
関数内部で参照先の値を変えませんよって言ってるだけじゃなかったっけ?
呼び出し側でパラメーターに非const渡せないとか有るんだけっけ?

70 :
ス レ 違 い

71 :
プログラミング作法って本当に良書だよなあ
さすがカニチャーハンさん
尊敬しております(^人^)

72 :
間違いを突っ込まれるとスレ違いって言い出す人が現れるな。

73 :
どこがつっこみだよ。
ろくに知りもしないなら書くなよ。

74 :
constは糞でFA

75 :
自分がconstの仕様を知らないのをconstが糞だって言ってごまかしてたらいつまでたっても上達できないだろ。

76 :
>>69
メンバ変数を書き変えませんよの const メソッドとごっちゃになってる気配

77 :
単にプロトタイプと定義の両方を同時に変更してないってだけじゃね?

78 :
>>71 鬱になって会社辞めた時、もうプログラムなんてしない
と思って「プログラミング作法」捨てたんだよな。
もったいないことした。

79 :
もうプログラムなんてしないなんて言わないよ絶対〜

80 :
デスマ はじまるよ
ほら また 僕のそばで〜

81 :
こういうのってマヌケがよく書くよな。

82 :
>>71
俺も欝でITは辞めたけど、未だにプログラムは書いてる。
でも辞めた際、結構本捨てたなぁ…

83 :
>>42、43
レス遅くなってすみません。色々あって職を変えることになり、覗く暇がなかったもので^^;
なるべく自分で答えを見つけたいのでどうしても分からなくてどうしようもない時はまたお願いしていいですか?優しい言葉ありがとうございます!

84 :
C++のconstはオブジェクトを値で渡すイメージで使いたい時にとても便利
オブジェクトを実際に値で渡すとスタックを大きく消費するしそのたびにコンストラクターや
コピー演算子が呼ばれてしまうが、constを付けることでオブジェクトのアドレスをスタックにコピーするだけですむのだ
関数内部でオブジェクトが変更されないことが保証されているので、
呼び出し側はあたかも引数に渡したオブジェクトをプリミティブ型のように扱うことが出来る。
いわゆる近代的な言語で設計されているStringオブジェクトやIntegerオブジェクトのようなプリミティブ型を
具象化したクラスが、非コンストメンバーを持たないことで、プリミティブ型のような動作を
するのはとても興味深い。このような動作をさせるのにコンスタントオブジェクトという考え方はとても重要である。

85 :
何アホなこといってんだコイツ
脳みそにウジでも湧いてんのか
Cのconst語れよ低能

86 :
>>84
C++スレでやれ

87 :
>>84
それは const とともに & も必要じゃないかい?

88 :
まだC言語スレでC++を語る馬鹿がいたのか

89 :
つかC99で可変長配列おkになったよね?
なんか>>51とか>>54で不安になって確認しなおしちゃったよ

90 :
C99でもダメじゃないのか?

91 :
C99では、配列宣言時には要素数に変数も使えるんじゃなかったか?
真の意味の可変長配列(スコープの途中で要素数を変更したりできるもの)ではないけど…

92 :
>>90
http://privatepaste.com/bfbce325f4

93 :
>>91
そう、それのこと

94 :
>>87
珍しくあってる。

95 :
>>92
いや、>>54の話。

96 :
ああ、ファイルスコープか

97 :
>>92
これ、ちゃんと最適化されて静的配列になるのかね。
ヘッダーファイルで#define のかわりにconst使うとすると、
static const int n = 100;
とか
extern const int n;
とかしないといけないじゃん。
下のようにすると最適化は不可能だよね。
C99のお作法的にはどうするのが正解なんだろ。

98 :
>>97
処理系によって、状況によって最適化されるよ。
VC や gcc は翻訳単位をまたぐ最適化もできる。

99 :
C言語で2Dゲーム作るのにDXライブラリーより簡単なライブラリーってある?

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
Cで書くかアセンブラで書くか・・・ (824)
CVS導入スレ〜 Rev.3 (836)
サミー777townのVB 2005マクロを貼るスレpart1 (144)
C#, C♯, C#相談室 Part71 (1001)
DarkBASIC (447)
【GPGPU】くだすれCUDAスレ part5【NVIDIA】 (696)
--log9.info------------------
【GIGABYTE】GA-Z77/B75総合【LGA1155】 (316)
改造バカ一台 高橋敏也スレ20 パーツパラダイス (808)
自作PC初心者にエスパーレスするスレ 175台目 (593)
5000円以下の超低価格ビデオカード総合44 (884)
【MHF】モンハンフロンティアベンチ結果報告スレ4 (383)
秋田県の自作事情 Part27 (551)
大須・名古屋の自作ショップ Part202 (280)
【ASUS】 P8Z P8P P8H シリーズ 18枚目【LGA1155】 (769)
原発事故・震災関連@自作PC板 2 (542)
Z68・P67・H67・H61のLGA1155マザーボード総合 35 (303)
Z77・H77・Z75のLGA1155マザーボード総合6 (1001)
福岡県パソコンパーツショップ 1件目 (204)
【懐古スレ】秋葉原もつまらなくなったな 24 (308)
【】ASRock Part48【普通?】 (962)
【SATA】OCZ SSD Part3【PCIe】 (760)
まだまだ現役7600GT/GS part4 (165)
--log55.com------------------
三國無双立志モード復活を望むスレ
一文字変えるだけで暗愚になる武将・人物
信長の野望・創造シリーズ 改造スレ 14
信長の野望・創造 戦国立志伝 改造スレ 16
歴ゲーの理不尽な点を強引に解釈するスレ 弐の陣
オランダ妻は電気ウナギの夢を見るか?
最近まで阿国を「あこく」と呼んでた人が集うスレ!
【三国志12】三國志12 Part55