C言語なら俺に聞け(入門篇) Part 10 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/03/19 16:45:25
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 9
スレリンク(tech板)

過去スレ
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)

関連スレ
C/C++の宿題を片付けます 84代目
スレリンク(tech板)
くだすれC言語(初心者用) Part.2
スレリンク(tech板)
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
スレリンク(tech板)
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
スレリンク(tech板)

【C 関数検索 man on WWW】 URLリンク(www.linux.or.jp)

2:デフォルトの名無しさん
07/03/19 16:51:46
manよりMSDNの方がいいぜ!!ワンワン

3:デフォルトの名無しさん
07/03/19 16:52:17
それはジョークで言ってるんだよな?

4:C言語
07/03/19 16:56:18
見てみて!
僕が作ったプログラムアップロードした★
URLリンク(www.geocities.jp)
パスワードは[cgengo]
ダウンドーロしてちょ?

5:デフォルトの名無しさん
07/03/19 16:56:35

ウイルス

6:C言語
07/03/19 16:57:26
今まで黙っててごめん。
今日の午前中中学校の卒業式だったんだ…。
だから暇で暇でしょうがなくてつくちゃた。
URLリンク(www.geocities.jp)
パスワードは[cgengo]

7:デフォルトの名無しさん
07/03/19 16:58:02

ウイルス

8:C言語
07/03/19 16:59:38
>>5
ごめんね。
今度君の狂った脳みそのためのアンチウイルスソフト作ってあげるから許して。

9:デフォルトの名無しさん
07/03/19 17:40:32
c言語を始めたいと思っていますが
無料でc言語をコンパイルして実際に
ゲームとかできる環境になるのでしょうか?
できるのならソフトとかのURLはってください
今は無料で手に入れたソフトを使っていますが
使い勝手が悪いのでいいやつをおしえてください。

10:9
07/03/19 17:45:34
自己解決しました
スルーしてください。

11:デフォルトの名無しさん
07/03/19 17:47:04
>>9
お前には無理だ
あきらめて学業に専念するか働きに出なさい

12:デフォルトの名無しさん
07/03/19 19:56:15
Cでゲームを簡単に作れると思ってるなら辞めとけ。
多分、>>9が考えてるようなゲームを1人で作るには10年かかる。

せめてVC++,C#とかなら・・・スレ違いだけど。

13:デフォルトの名無しさん
07/03/19 20:20:35
C言語を触りだけしかやったことのない初心者ですが
これから本格的にC言語を学びたいと思っています
使用用途はロボット等を制御する事です
何かお勧めの入門書はありますか?

14:デフォルトの名無しさん
07/03/19 20:54:25
シミュレーションで学ぶ自動制御技術入門

15:13
07/03/19 21:06:02
>>14
ありがとうございます
明日本屋で探してみます

16:デフォルトの名無しさん
07/03/19 21:22:47
test

17:デフォルトの名無しさん
07/03/19 21:29:48
どっちかっていうとC言語そのものより
開発環境の作り方とか制御の仕方とかの方がしんどいと思うよ

18:13
07/03/19 23:34:55
あのー僕が13なのですが・・・
でも15と言いたい事は同じですw
なんか影の自分が暗躍してるのかと思ったw

19:デフォルトの名無しさん
07/03/19 23:37:11
なんか前スレから乗り替わる奴いるから、大事な質問ならトリップつけた方がいいかもね

20: ◆auEy42rRqA
07/03/19 23:47:03
てす


#うんこちんちん

21:デフォルトの名無しさん
07/03/20 13:06:14
#include <stdio.h>
int main ()
{
char c;
scanf("%c", &c);
if (c == 'a'); { printf("入力値はaです。"); }/*警::コードは関数をもたない*/
else if (c == 'b') { printf("入力値はbです。"); }/*エラー:elseの位置が間違ってる*/
else if (c == 'c') { printf("入力値はcです。"); }
else { printf("入力値はa,b,c以外です。") n; }/*エラー:ステートメントにセミコロン(;)がない*/
return 0;
}
と出るのですが、どうしてなのでしょうか?
if else構文の最後のelse文の「どれにもあてはまらなかった場合に行う処理」の正しい書き方がよくわからないです。

22:デフォルトの名無しさん
07/03/20 13:08:41
>if (c == 'a'); { printf("入力値はaです。"); }/*警::コードは関数をもたない*/
セミコロンが余計。

23:デフォルトの名無しさん
07/03/20 13:09:14
>>21
>if (c == 'a'); {

セミコロンがあるので、そこに空文があると見なされている。



24:デフォルトの名無しさん
07/03/20 13:09:15
他にもTypoがあるな。

25:デフォルトの名無しさん
07/03/20 13:09:42
/*標準入力とswitch構文sample19.c*/
#include <stdio.h>
int main ()
{
char c;

scanf("%c", &c);
switch (c) {
case 'a': printf("入力値はaです。");
break;
case 'b': printf("入力値はbです。");
break;
case 'c': printf("入力値はcです。");
break;
default: printf("入力値はa,b,c以外です。");
break;
}
return 0;
}
21は22をif else構文の形に書き換えてみようと思ってやったものです。
どなたか詳しい方ご教授ください。
コメント部分の箇所にエラーや警告文を書きました。

26:デフォルトの名無しさん
07/03/20 13:10:20
printf("入力値はa,b,c以外です。") n;
nがこんなところに!?

27:デフォルトの名無しさん
07/03/20 13:10:21
素早いレスどうもです。
ちょっとやってきます。

28:デフォルトの名無しさん
07/03/20 13:10:52
22として書く前にソッコーでレスが付いたなw


29:デフォルトの名無しさん
07/03/20 13:26:31
21ですがおかげさまでできました。
参考書の例文に「else{ 処理n;}」と書かれてたので↑でやってたのですが、
どうやらnはn番目という表記だったようですね。勘違いしてたみたいです。

ありがとうございました。
また聞きに来るとは思うのですが、その時はよろしくおねがいします。

30:デフォルトの名無しさん
07/03/20 13:40:44
1行にいろいろ詰め込むと、どのエラーかわかりにくくなるぞ。

31:デフォルトの名無しさん
07/03/20 17:15:05
for(;;;)
printf("\a");
と、ビープ音鳴らしまくったら、
ハードの方とかおかしくなったりします?

32:デフォルトの名無しさん
07/03/20 17:17:49
音波振動によるダメージがあるかも

33:デフォルトの名無しさん
07/03/20 17:28:01
ねーよ。

34:デフォルトの名無しさん
07/03/20 17:29:11
>>31
デバッガで実行するなら兎も角、環境によってはかなり止めにくくなるからやめた方がいいよ。

35:デフォルトの名無しさん
07/03/20 20:05:15
>>31
ビープ音を聞き続ける人間というハードがおかしくなるかもしれない。

36:デフォルトの名無しさん
07/03/20 20:24:25
VisualStudio2005にしたけどVS2002の時のソース、コンパイル普通に通るんだね。。
(全て_s付きの物に変えないといけないかと思った。

けど唯一、経過時間のところでtime_tがどうとか言われて通らない・・

37:デフォルトの名無しさん
07/03/20 20:44:34
>>36
で、何が聞きたい?

解決策が知りたいならエラーメッセージをコピペしてちょ

38:デフォルトの名無しさん
07/03/20 20:55:31
VC++ 2005のtime_tは通常64ビットになったが、
_USE_32BIT_TIME_Tを定義しておくと今までどおり32ビットになる。
試しにプロジェクトオプションでそれを追加してみたらどう?

でもこうすると当然2038年問題の影響を受けることになるから、
それで動くようになったとしても早めに直せよ。

39:36
07/03/20 21:06:26
>>37すまそ、>>38の言うとおりにしたらコンパイルできたよ。。

ただの実行日時(JST)と経過秒数が出るだけの、
2038年まで使う予定もないテストプログラムだから別に今はいいや・・orz

40:デフォルトの名無しさん
07/03/21 21:19:32
/*sample49.c*/
#include <stdio.h>

int main (void)
{
printf("%s %d %d\n", str, &str, &(*str));
str = "日本語";
printf("%s %d %d\n", str, &str, &(*str));
return 0;
}

strが未定義のシンボルと判断されてしまうのですが、どこがいけないのでしょうか?
ポインタ変数を使ってアドレスをを表示させるというのをやっています。

41:デフォルトの名無しさん
07/03/21 21:22:38
char* str;
がなくね?

42:デフォルトの名無しさん
07/03/21 21:22:47
/*sample49.c*/
#include <stdio.h>

int main (void)
{
char *str = "abc";
printf("%s %d %d\n", str, &str, &(*str));
str = "日本語";
printf("%s %d %d\n", str, &str, &(*str));
return 0;
}


43:デフォルトの名無しさん
07/03/21 21:24:03
>>40
strを宣言してください

char *str;

44:デフォルトの名無しさん
07/03/21 21:28:37
3人も同時にレスありがとうございます。
「char* str」を書いたら大丈夫でした。
参考書通りにやったのに駄目だったのでほんと助かりました。

45:デフォルトの名無しさん
07/03/21 21:31:47
さあ、その参考書名・著者をさらすんだ。

46:デフォルトの名無しさん
07/03/21 21:32:54
普通に1文わすれてただけっぽ〜い

47:デフォルトの名無しさん
07/03/21 21:34:32
実は図書館で借りた本で、既に次版で修正されてるとか正誤表に載ってるとか
そうじゃなかったら
その参考書名・著者をさらすんだ。

48:デフォルトの名無しさん
07/03/21 21:36:55
「次のプログラムの空欄に適切なコードを入れなさい」って穴埋め問題の宿題なんじゃないか?
(と、かんぐってみる)

49:デフォルトの名無しさん
07/03/21 22:00:48
なんかレスいっぱいついちゃってますね。
著者が坂下夕里さんの「これならわかるC 入門の入門」ってやつの194Pです。
2006年7月5日の初版第3版だそうです。
値段は1,600+税。


50:デフォルトの名無しさん
07/03/21 22:14:39
URLリンク(www.seshop.com)

ミスみたいだな
著者が答えてる部分が>>42そのままなんだけど

51:デフォルトの名無しさん
07/03/21 22:17:17
入門書なんて書くと
BCCがインスコできませんとか
パスが通せませんとか
VC++で実行したらいきなり画面が閉じましたとか
見るだけで嫌になるFAQがいっぱい来るんだろうな・・・

52:デフォルトの名無しさん
07/03/21 23:14:00
C99以前の規格で質問です
変数の宣言はブロックの最初でなければならないとのことですが、

void hoge(void) {
int i;

//なんだかの処理

for(i = 0; i < 10; i++) {
int value;//←ここで変数宣言
//なんだかの処理
}
}

上記のvalueの変数宣言はOKでしょうか?

関数の最初に変数が宣言できることは覚えているのですが、ブロックの中でもfor文などの中の先頭で宣言できるのか忘れて島しました
手元にあるコンパイラだと、独自拡張されているのか、処理中の変数宣言もOKになってしまいます。
よろしくお願いいたします。


53:デフォルトの名無しさん
07/03/21 23:16:01
ブロック先頭での変数宣言はOKです

54:デフォルトの名無しさん
07/03/21 23:24:28
for文の{}もブロックっていうんじゃないのか?

55:デフォルトの名無しさん
07/03/21 23:26:01
途中に { } 入れて宣言してたこともあったなあ

56:デフォルトの名無しさん
07/03/21 23:30:46
まだ初心者だった頃caseの後でなぜ宣言できないのが不思議だった。

57:デフォルトの名無しさん
07/03/21 23:59:41
特定のcaseだけでしか使わないローカル変数を定義したくて
case xxx: {
}
なんてすることもあるかもしれない。

とりあえず52はブロックという言葉の意味を正しく知るべき。


58:デフォルトの名無しさん
07/03/22 07:53:00
レガシーCでは通るがC++では通らない(かも知れない)コード。
switch (0) {
int i;
case 0:
printf("foo\n");
case 1:
for (i = 0; i < 10; ++i) {
printf("%d\n", i);
}
}

59:デフォルトの名無しさん
07/03/22 16:56:55
/************************************************************************/
/*                        ぬるぽ                       */
/************************************************************************/

↑こういうコメントをVisualStudio2003を使って楽に入力する方法ってありませんか?
/*********************************************************************/
って部分はIMEに登録(60文字超えるんで前半部分と後半部分に分けて)したりしてるんですが、
二行目の/*の自動挿入とか文字列の中央ぞろえとか終端の*/の入力の仕方がわかりません

60:デフォルトの名無しさん
07/03/22 17:05:14
文字列の中央揃えや終端の*/の位置調節などといった
無駄なことはやめた方がいい

61:デフォルトの名無しさん
07/03/22 17:10:23
確かに
考えるだけ時間の無駄

62:デフォルトの名無しさん
07/03/22 17:20:56
エディタをvimを使うようにしてmapで登録すればいいIDEのエディタは総じてくそ

63:デフォルトの名無しさん
07/03/22 17:22:12
Sakura等のマクロ使えば一発なのに・・・

64:デフォルトの名無しさん
07/03/22 17:25:16
IDEのエディタは総じてくそ

65:デフォルトの名無しさん
07/03/22 17:32:22
vimのcindentのオプション使ってると、勝手にコメントの * を揃えてくれるから

 /*****************************
.  * コメント
.  *****************************/
. ↑ここを揃えてくれる

こんな書き方してるけど、これって一般的な書き方なのかな?
コメントの書き方で定番みたいなものはあるんかな…

66:デフォルトの名無しさん
07/03/22 17:32:45
>>59
GreatCode でディレクトリ内のソースコードを一括変換すると楽
表記の揺らぎもなくなるし

67:デフォルトの名無しさん
07/03/22 18:04:04
>>65
次のようなコメントを見かける。
#等幅に見せるために2バイト文字に変換済み。
/*******/
/*□ぷげら□*/
/*□もげら□*/
/*******/
/*******
□*□ぷげら□*
□*□もげら□*
□*******/
/*******\
*□□ぷげら□□*
*□□もげら□□*
\*******/
/*******
□*□ぷげら
□*□もげら
□*******/
/*******
□*□ぷげら
□*□もげら
□*******
□*/
/*
□*******
□*□ぷげら
□*□もげら
□*******
□*/

68:デフォルトの名無しさん
07/03/22 18:33:45
先ほどCを始めたのですが,いきなり行き詰ってしまいました.
逆斜線ってどうやるのでしょうか?
\で代用すればいいのでしょうか?
お願いします

69:デフォルトの名無しさん
07/03/22 18:36:03
いいです。半角でな

70:デフォルトの名無しさん
07/03/22 18:37:52
>>69
ありがとうございます!!

71:デフォルトの名無しさん
07/03/22 18:57:17
>>65
定番のコメント記法をただ探すんじゃなくて、
定番のドキュメント生成ツールを探して
それが要求するコメント記述方式に従うのがいいと思う。

勝手に*を揃えてくれるのだって、
ドキュメント生成ツールを意識した動作だろうし。

72:デフォルトの名無しさん
07/03/22 20:20:22
>>65
そういうコメントは、ファイルの先頭で使うくらいだな。
いっぱい使ってると、かなり素人くさい。

73:デフォルトの名無しさん
07/03/22 21:38:30
玄人好みのコメントplz

74:デフォルトの名無しさん
07/03/22 21:40:54
/* You are not expected to understand this */


75:デフォルトの名無しさん
07/03/22 21:44:06
コメントに罫線やら装飾の多いヤツは素人。

76:デフォルトの名無しさん
07/03/22 21:45:05
>>74
訳するとこんな感じ?
/* あなたがこれを理解できるなんて期待してないです */
/* これ見ても分からないっしょ? */
/* 分かるかな〜? 分かんね〜だろ〜な〜 */

77:デフォルトの名無しさん
07/03/22 21:56:24
VC++ って VBA マクロ使えなかったっけ?

78:デフォルトの名無しさん
07/03/22 22:04:57
*/の位置を気にして半角スペースを駆使するような奴は負け
端的に言えば>>59なわけだが

79:デフォルトの名無しさん
07/03/22 22:08:29
40カラム〜80カラムは問答無用でコメント、という規約のプロジェクトがあった。

80:デフォルトの名無しさん
07/03/22 23:25:36
カラムなんて言葉を聞くと
FORTRAN を思い出して嫌になる

81:デフォルトの名無しさん
07/03/22 23:58:35
>>79
某大手が未だにそんな規約を持っている。
極悪なのは、関数内の最初のインデントと二段目のインデントの量が違うと言う……

82:デフォルトの名無しさん
07/03/23 00:16:15
つ c-set-offset

83:デフォルトの名無しさん
07/03/23 01:23:11
/*******************************
* 俺はよくこれを目にするんだが
* たぶんずれるからポップうp 
*    >>83
*/

84:デフォルトの名無しさん
07/03/23 01:27:09
>>83
&nbsp; を使え。

85:デフォルトの名無しさん
07/03/23 13:01:51
俺も>83形式だなー
但し一行目の * の数は5個固定で、その右にコメントの頭を入れるんだが。

86:65
07/03/23 20:15:44
コメントにも色々あるんもんですね

>定番のドキュメント生成ツール
これってDoxygenみたいなやつですか?

87:デフォルトの名無しさん
07/03/23 20:32:55
doxygenは /** で始まり */ で終わるコメントにも対応しているな。
俺は大抵/*! 〜 */を使うが。

88:デフォルトの名無しさん
07/03/23 20:41:15
javadoc形式に対応してるんだっけか

89:デフォルトの名無しさん
07/03/24 00:38:26
どうして構造体はmain外のグローバルなところに書くのが多いのでしょうか

90:デフォルトの名無しさん
07/03/24 00:39:14
main の外で使うから

91:・∀・)っ-○◎●
07/03/24 00:40:34
関数内で定義したら関数内でしか使えないから

92:デフォルトの名無しさん
07/03/24 01:35:21
doxygenは///や//!にも対応しているからC99なら///で書ける。

93:デフォルトの名無しさん
07/03/24 12:08:14
xmlコメントにも対応してるんでしょうか?>doxygen

94:デフォルトの名無しさん
07/03/24 13:17:26
//コメントを/*コメントに変換するツールないかなぁ。
// printf("///");
// return 0; /* ぬるぽ */
こんな行のこと考えると結構面倒だ。

95:・∀・)っ-○◎●
07/03/24 13:30:53
つPerl

96:デフォルトの名無しさん
07/03/24 13:35:01
>>95
Perlで書いても面倒だと思うんだけど。

そもそも今時規格に乗っ取ってないという理由で//コメントを禁止する某芝の某氏が阿呆だと思うのだが。
つーか、人には禁止しておいて自分では使ってるしおまけにprintf()で"%lf"なんか使うし……

97:・∀・)っ-○◎●
07/03/24 13:37:51
そこでJIS-X 3010:2003ですよ

98:デフォルトの名無しさん
07/03/24 13:39:17
エディッタなりIDEなりの機能使ってマクロ組めばいいよ
エンター押した瞬間にその行の文字列評価して置き換えるようにすりゃ手軽

99:・∀・)っ-○◎●
07/03/24 13:41:26
他人の書いたコードの整形を自分好みに直すためだけにxyzzy使ってる

100:デフォルトの名無しさん
07/03/24 13:48:54
取り敢えず、//→/*と$→*/を変換して>94に挙げたような怪しげな行をリポートするスクリプトをawkで作った。
リポート行を(コンパイラのエラーと同じように)xyzzyで取り込んでタグジャンプすれば後は手作業で何とか、かな。

>>97
kwsk

>>98
30ファイル30000行もあるとやってられない。

>>99
私も普段使っているのがWin2kなのでWinSCPのエディタをxyzzycliにしてLinuxのファイルも整形して読んでる。
#編集はvimですることが多いけど。

101:デフォルトの名無しさん
07/03/24 13:52:50
//コメント禁止って酷いよね・・・

102:デフォルトの名無しさん
07/03/24 14:01:15
/* */ 使われてるから、全体的に広くコメントアウトしたい場合、#if 0 〜 #endif を使うが
そんな環境に限って VC6.0 だったりするから色が変わってくれない

103:デフォルトの名無しさん
07/03/24 14:11:53
そういうスクリプトや小物ツールを自前でサッと組めるようになりたい・・・

104:デフォルトの名無しさん
07/03/24 15:04:29
>>103
生の//を変換するだけで、/* // */ とか "//" を考慮しなくていいならawkでこれだけ。
一応、/* *//* */は大丈夫。
awk '/[^*]\/\// || /^\/\// {sub("// *", "/* "); sub(" *$", " */");} {print;}'
実際には他にも、3個以上の/の連続ををどうするとか、//で終わる行をどうするとか、
行頭//が複数行続いたらどうするとか、考え始めると切りがない罠。

105:デフォルトの名無しさん
07/03/24 15:26:10
/**********************************/
はまだいいとして、
右側をそろえて */ するのって意味あるんかいな?
本当に重要な内容を書きにくくするだけなんだが。
100歩譲っても
 /**********************************
  * ほげほげ
  **********************************/
あるいは
 ///////////////////////////////////
 // ほげほげ
 ///////////////////////////////////
って社内で言ったら「右をそろえたほうが見やすい」といわれた。

106:デフォルトの名無しさん
07/03/24 15:29:47
社内にはプロポーショナルフォントで組んでる変態とかいるから、
行頭のインデント以外は桁をそろえるようなことはしないなあ。

107:デフォルトの名無しさん
07/03/24 15:41:32
右端を揃える奴はキモイ
どれぐらいキモイかっていうと
GNUのコーディング規約の中括弧の1000分の1くらい

108:デフォルトの名無しさん
07/03/24 15:47:44
入門編にいる僕にはわかりません><

109:デフォルトの名無しさん
07/03/24 16:04:10
最近のエディタならコメント部分の色が変わるのが普通なんだからわざわざ
/**********************************
* ほげほげ
**********************************/
とかやってコメントを目立たせる必要はないんじゃまいか。
/*
* ほげほげ
*/
で充分ですよ。解ってくださいよ。

110:デフォルトの名無しさん
07/03/24 16:06:19
>>105
漏れのところでは、「右側を揃えたいなら揃えてもいいから、間違ったコメントを書くな」という方針にした。
で、実際に不適切なコメントをリリース版に残した香具師には右側揃え禁止措置を取った。
……そして誰も右側を揃えなく(揃えられなく)なった。


111:・∀・)っ-○◎●
07/03/24 16:17:29
>>100
ISO C 1999のJIS版

//コメントは仕様に入ってるし%lfも全力でおk

112:デフォルトの名無しさん
07/03/24 22:36:53
>>109
色がついてなくても、下ので十分だよ。
行頭になんか印がついてれば、すぐわかるだろ。

113:デフォルトの名無しさん
07/03/24 22:38:19
/*
  これでもいいかゐ?
*/

114:デフォルトの名無しさん
07/03/24 22:40:30
それで十分

115:デフォルトの名無しさん
07/03/24 22:42:56
>>113
それはだめ。

116:デフォルトの名無しさん
07/03/24 22:45:32
なんで?(^ω^;)

117:デフォルトの名無しさん
07/03/24 22:49:15
/*
* じゃあこれからコメントの標準はこれで。
*/

118:デフォルトの名無しさん
07/03/25 03:33:32
>>116
grep で引っかかったときにコメントかどうかが判らないから。
とはいえ、1行でも全部みれば判るけどね。

119:デフォルトの名無しさん
07/03/25 04:25:36
おまえら楽しそうだなw
おれも楽しいけどw


120:デフォルトの名無しさん
07/03/25 05:17:34
#ifdef _DEBUG

#define DEBUG_ONLY

#else

#define Paste(a, b) a##b
#define DEBUG_ONLY(fn) Paste(/, *) fn Paste(*, /)

#endif

こんなマクロを作ったんだが、これって邪道?

121:デフォルトの名無しさん
07/03/25 05:26:30
>>120
自己レスだがどう考えてもこっちの方がいいです。
本当にありがとうございました。

#ifdef _DEBUG
#define DEBUG_ONLY
#else
#define DEBUG_ONLY(fn)
#endif

122:デフォルトの名無しさん
07/03/25 07:55:21
漏れはこんなの作ってみた。
#ifdef DEBUG
#define IF_DEBUG 1 && /**< 常に有効 */
#else
#define IF_DEBUG 0 && /**< 常に無効(このマクロの右辺は生成されない) */
#endif
警告は出ちゃうけどね。

123:デフォルトの名無しさん
07/03/25 12:59:08
俺はいつもこれ使ってる。
release 時は最適化で消えるはず。

#ifdef NDEBUG
#define DEBUG if(1); else
#else
#define DEBUG if(0); else
#endif

124:デフォルトの名無しさん
07/03/25 13:00:58
俺は C で書く時は // は使わんな。
-ansi -pedantic -Wall で警告すら出ないように
ガチガチに書くようにしてるから、
// 使うとエラーになる。

125:デフォルトの名無しさん
07/03/25 13:12:05
そこで-std=c99ですよ

126:デフォルトの名無しさん
07/03/25 13:48:50
わざわざCで書く理由ってのは移植性やpoorな環境の問題、レガシーコードの
保守などがメインだと思うんだが……

C99なんて使う機会あるか?
C99使えるぐらいならC++が使えないか?

127:デフォルトの名無しさん
07/03/25 13:57:34
int (*f(int argc, char* argv[]))(int argc, char* argv[]), (main);

こういう変態な書き方ってどうやったら読めるんすか?
っていうか何やってるんすかこれ?

128:デフォルトの名無しさん
07/03/25 16:49:49
>>127
mainの再宣言のようだけど


129:デフォルトの名無しさん
07/03/25 21:23:21
Filename_ni_comment_wo_kakeba_iijyo.c

130:デフォルトの名無しさん
07/03/25 21:48:45
/*
読み込んだ実数値と0.1との和・差・積・商を表示
*/
#include<stdio.h>

int main(void)
{
double num;
printf("実数を入力してください:");
scanf("%1f",&num);
printf("0.1を加えると%fです。\n",num+0.1);
printf("0.1を減じると%fです。\n",num-0.1);
printf("0.1を乗じると%fです。\n",num*0.1);
printf("0.1を除すと%fです。\n",num/0.1);
return(0);
}

なぜかどんな実数を入力しても0を入力された扱いになってしまいます。
どこが悪いのでしょうか?

131:デフォルトの名無しさん
07/03/25 21:49:58
>>130
URLリンク(www.linux.or.jp)

%lf

132:デフォルトの名無しさん
07/03/25 21:50:07
%1f
%lf

133:デフォルトの名無しさん
07/03/25 21:50:17
%1f

134:デフォルトの名無しさん
07/03/25 21:52:01
>>131-133
ありがとうございます!!!
ってか0とOを間違えるくらい恥ずかしい…orz

135:デフォルトの名無しさん
07/03/25 23:28:41
なんだ、floatで精度指定してんのかと思ったらdoubleだったんだ。

136:デフォルトの名無しさん
07/03/27 13:22:37
C言語ゲームを作成中です。他スレから移動です。
6つのファイル公開中しています(読みやすくしたつもりです。>_<;)
ここならCの意見を・・・記述スタイル、変数名など・・・
一通り完成しましたが、大幅に改修している初期の段階の内容です。

現段階は自機が動いて弾を撃つまでです。その他の内容はReadme.txtより
コンソールシューティングゲーム
URLリンク(gamdev.org)

137:デフォルトの名無しさん
07/03/27 13:28:35
>6つのファイル公開中しています(読みやすくしたつもりです。>_<;)
先ず、日本語の勉強をすべきかと。

138:デフォルトの名無しさん
07/03/27 14:19:18
C++ じゃん・・・と思ったら、中身はほとんど C だな。

グローバル変数使い過ぎというのが先ず目につく。クラス化汁。
Console みたいに内部変数にすると不便だというなら、
Singleton パターンを使えば、そのクラスのインスタンスを1つに保証できる。
関数でデータ処理させる際のオーバーヘッドが気になるなら inline 関数にすればいい。
(って、C のスレの回答じゃないな、これじゃ)

名前のローマ字はまあいいとして、player のメンバ名が気になる。
px, py, pspd の p は player の、
ptx, pty, ptflg の pt は player の tama の略だと思うけど、
プレイヤーの情報と弾の情報が同じレベルで混在してるのはどうなのかと思う。
struct tama {
 float x, y;
 char fHassha;
};
struct player {
 float x, y, spd;
 struct tama tama;
};
という風に切り分けた方がいいんじゃないかな。
x, y も、座標構造体やらクラスやらにした方がいいと思う。

GetRandom は、もうちょい double でキャストしないと、オーバーフローが怖い。

(eny + ei)->ex は eny[ei].ex じゃダメなのか?
まあ、このあたりは趣味も関わってくる話かもしれんが。

SYori は Syori だよね?
0, 1 のフラグは、char じゃなくて bool にしようぜ(って、これも C じゃないな)。
InitFunc の中身は全部機能別に関数化した方が読みやすいかもと思った。
まあ、関数化してない部分は短いから、別にいいかもしれんが。

139:デフォルトの名無しさん
07/03/27 14:31:39
ゲームの場合、綺麗に書く必要はそれほど無いので、
とにかくゲームとして仕上げることが大事。
一本完成すると自信になる

140:デフォルトの名無しさん
07/03/27 15:24:54
>>136
ヘッダファイルの読み込み順を意識しないといけないのは嫌いだ

141:デフォルトの名無しさん
07/03/27 15:56:31
レス有り難うございます^^
>>137 すまそ >_<;
>>138
C言語は一定のレベルになると、まったくわかっていない!調べます。
構造体、double、(eny + ei)->ex は eny[ei].ex とか・・・あと変数名も検討する
自機と自機弾は分けようかとしたが・・・現在は暫定ような感じです。t は弾の略です^^

PlayerSYoriですよね!直しました。気づかんかった…
機能別関数化は大きくなった時など考えていきます。
クラス、インスタンス、Singleton パターンinline 関数この辺は
Cの後に挑戦したいと思っています!

>>139
確かに…結構挫折が多かったのでよくわかりますorz 一つ完成させるのが大事!
一応一通り形はできたのですが・・・(そのほうが質問しやすいと思ったから)
しかし、理解せずに進んだため信じられんほど、時間が
かかり過ぎた >_<;毎日泣きそだった。ぐぐりまくってもわからんし…

>>140 見直してみます><
まずは、グローバル、構造体、ヘッダーをみてみます。

142:デフォルトの名無しさん
07/03/27 17:06:35
>>136
向こうのスレを見ている者だが、最初に比べると随分上達したな。
個人的にはローマ字命名はちょっと…だが。

143:デフォルトの名無しさん
07/03/27 17:44:57
>>141
どのスレから来たんだい?

144:デフォルトの名無しさん
07/03/28 18:50:32
ある人が書いたソース見ていたら、ヘッダファイルに以下のような部分を
見つけました。

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifdef _MSC_VER
#include "resource.h"
#endif

私の疑問は、 "resource.h" というファイルを探したのですが、
見当たらなかったのですが、エラーなくコンパイルできます。
その理由がわかりません。教えて下さい。

145:デフォルトの名無しさん
07/03/28 18:58:55
必要とされてないからでしょう

146:デフォルトの名無しさん
07/03/28 19:50:41
>>144
#ifdef _MSC_VER
#include "resource.h"
#endif

もし _MSC_VER が定義されていたら
resource.h をインクルードする
_MSC_VER が定義されていないならインクルードしない
君の環境では_MSC_VER が定義されていないので resource.h がなくても問題ない

147:デフォルトの名無しさん
07/03/28 20:08:08
K&RのP270に
「宣言中の最初の添え字は配列が消費するメモリ量を決めるのには役立つが、
添え字の計算には関係しないということである。」
という文があるのですが
int array[2][4][6];
と宣言した場合の2,4,6はそれぞれ配列の要素数を決めているだけで
*(array[2][4]+6)のシンタックスシュガーな訳ではないってことですか?

148:デフォルトの名無しさん
07/03/28 20:14:08
「最初の添え字」つまり、その例では2のこと。4,6は関係する。

149:デフォルトの名無しさん
07/03/28 20:35:08
arrayの各要素のメモリ内での位置を計算するのに2は必要ないというだけの意味。

150:147
07/03/28 20:36:24
>>148
添え字の計算には関係しない、の意味がよくわからないんですが
array[1][2][3]は*(array[1][2]+3)に読み替えられて、array[1][2]は配列だから
(array[0]+1)[2]になるんですよね?

151:147
07/03/28 20:39:32
すいません更新してませんでした
>>149
どういう風に必要ないのかいまいちよく分からないです…

152:デフォルトの名無しさん
07/03/28 20:41:33
たとえばarray[1][3][5]のアドレスはarrayの先頭要素から、
(1)*4*6+(3)*6+(5)要素サイズ分だけ離れていると計算できるから、
最初の添え字のサイズである2は計算に必要とされない。
array全体のサイズを決めるためには2も必要。

153:152
07/03/28 20:49:36
152の説明だと正確ではないか。
array全体が一塊で割り当てられているときは152の計算でいける。
まあ、そうでなくて、
array = (int***)malloc(2*sizeof(int**))
array[.] = (int**)malloc(4*sizeof(int*))
array[.][.] = (int*)malloc(6*sizeof(int))
みたいになっていたとしても、やはり最初の添え字サイズは必要ない。

154:147
07/03/28 20:50:43
>>152
あ、最初の添え字の数-1までしか必要とされないって意味ですか

155:デフォルトの名無しさん
07/03/28 20:54:15
>>153
たいていのコンパイラはint array[2][4][6];って宣言してたらまとまった領域を割り当てると思うがな

156:デフォルトの名無しさん
07/03/28 20:57:33
147 の質問に対して153のメモリ確保の説明は、関係ないんじゃあないのか?
147は
int array[2][4][6];
と宣言した場合の質問をしているんだよな。


157:デフォルトの名無しさん
07/03/28 20:59:30
>>154
「添え字の計算」というのは例えばarray[0][1][2]みたいにindexが与えられた時に
それはメモリ上のどこにあるのかを計算するって意味だ
その計算には配列の最初の次元の大きさは必要ないよってK&Rは言っている

158:152
07/03/28 21:02:03
>>155-156
うん、そうだね。いらないことを気にしすぎて余計なことを書いた。

159:147
07/03/28 21:06:46
>>157
あ、array[1][3][5]の添え字計算だと(1)*4*6+(3)*6+(5)みたいに
当然(式の中の)最初の添え字の1も含めて1,3,5は当然使うし
元の宣言にある4と6も使うけれど、同じく元の宣言の中にある2は使わないってことですね
ようやく分かりました、皆さんどうもありがとうございます

160:デフォルトの名無しさん
07/03/28 21:10:18
要するにint a[5];でa[x]とアクセスするのに、
5という情報は要らない(要るのはintという型情報)、ってだけ。

161:デフォルトの名無しさん
07/03/30 01:20:50
↓のようなことって技術的に可能ですか?
何分↓スレに専門知識を持った人間がおらず、真偽が分からなかったので
ここで質問させていただきました

558 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:06:29 ID:ENSP49sq
そうだ
一応書いておくわ

CとかJavaとか言語でわけてる現状がそもそもおかしいから

ソースコード翻訳機作ってやってるよ
おまえも参加しろwww

役に立たない下っ端を使えるようにする秘策だぞwwww

561 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:12:11 ID:ENSP49sq
意味分からないのか??

コンパイラじゃなく
ソースコードをそれぞれに変換するってことだぞ

意味分からないかな??

564 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:14:33 ID:ENSP49sq
たとえば
Cで書いたコード100万行を
自動変換で
Javaコードに変換するって奴だwwwwww

分かるかな???

スレリンク(dame板)l50

162:デフォルトの名無しさん
07/03/30 01:26:14
>>161
多少手作業部分やなんらかの制限等は生まれるだろうが、
いったいどこに本質的に不可能だとされる可能性があるんだ?

163:デフォルトの名無しさん
07/03/30 01:26:47
しまった。マルチにマジレスしちまった。orz

164:デフォルトの名無しさん
07/03/30 01:31:45
実例の1つとしてあげておくけど、初期のC++コンパイラは、
まずCへ翻訳してからコンパイルしていた。


165:デフォルトの名無しさん
07/03/30 01:47:21
言語的には難しくない、100万行のlibcのみ依存のソフトなら自動変換できる。
でも、たとえば、Win32とか、BarkleySocketに依存していたら、
ライブラリの流儀をJavaに直すのは難しすぎる。
ましてやハードを叩いてたりすると。

166:デフォルトの名無しさん
07/03/30 01:49:53
>>164-165
お前らなにマルチにマジレスしてんだ?

167:デフォルトの名無しさん
07/03/30 17:38:14
ちゃんと動いたプログラムのソースに、大きな配列を追加してBCCでコンパイルしたら、
全く関係ない所でアプリケーションエラーで終了するようになったのですが、
メモリ不足でしょうか。mallocとか面倒だけどしないとだめでしょうか。
><わかんないんです。おしえてください。

168:デフォルトの名無しさん
07/03/30 17:41:38
>>167
エラー貼ってみて

169:デフォルトの名無しさん
07/03/30 17:44:12
>>167
ソースplz

170:デフォルトの名無しさん
07/03/30 18:07:21
>>167
アプリケーション エラー
エラーが発生したため、(ファイル名).exeを終了します。プログラムをもう一度開始する必要があります。

エラーログを作成しています。

>>169
3000行超えちゃうので無理です><
とりあえずグローバル変数宣言だけで50行で、
int型の要素が100個ぐらいの配列と、
char型で256文字入る配列を4個ほど宣言してあります。

171:デフォルトの名無しさん
07/03/30 18:09:22
どこかにアップロード汁

172:デフォルトの名無しさん
07/03/30 18:09:57
グローバル変数多過ぎだろ。

173:デフォルトの名無しさん
07/03/30 18:15:31
>>172
グローバル変数にしないと各関数の引数に変数や配列のポインタを
10個ぐらい渡さないといけなくなっちゃうんで…
大小まとめて数えて関数を30個ほど作ってあるので大変です…。

174:デフォルトの名無しさん
07/03/30 18:17:28
>>170
10分の1くらいにおさえたら、どうか?

175:デフォルトの名無しさん
07/03/30 18:17:42
>>173
釣りうぜえ

さっさとソース&エラーうpしろやクズが

176:デフォルトの名無しさん
07/03/30 18:19:13
構造体作ってポインタ渡せばいいじゃん。馬鹿?

177:デフォルトの名無しさん
07/03/30 18:20:56
あっ、すいません、変数名がかぶってたのが原因みたいです><
お騒がせいたしました

178:デフォルトの名無しさん
07/03/30 18:25:53
同じ名前で大きさが違う配列に無理やり値を詰め込んだのが原因でした><
皆さん、本当にありがとうございました

179:デフォルトの名無しさん
07/03/30 18:32:16
>>175
キレすぎだろw

180:デフォルトの名無しさん
07/03/30 18:43:32
>>178
結果的に「釣りだった」という見解が・・・

181:デフォルトの名無しさん
07/03/30 18:45:46
作り方が下手糞だと、ちょっとした間違いにも
気づきにくいという典型例だな。

182:デフォルトの名無しさん
07/03/30 19:06:36
><ほんとうにすいませんでした

183:デフォルトの名無しさん
07/03/30 19:13:30
特定の関数を特定の関数からしか呼び出せないようにすることって可能ですか?

184:デフォルトの名無しさん
07/03/30 19:21:42
>>176
次からはよくつかう変数を
構造体に詰め込むことにします><
苦手意識のせいで気付かなかったです
アドバイスありがとうございました


185:デフォルトの名無しさん
07/03/30 19:28:48
>>182
もしマジレスだったなら、謝る必要はないよ

186:デフォルトの名無しさん
07/03/30 19:29:58
>>184
続けることが大事だから頑張って!^_^;マジレスならね・・・

187:デフォルトの名無しさん
07/03/30 19:33:40
ところで>>170のいうように3000行を越えてるのに、
>>173でいうように関数が30個って少なすぎね?
もうすこし論理的意味単位で分割した方がいいと思うよ。

188:デフォルトの名無しさん
07/03/30 19:38:02
>>183
呼ぶ側と呼ばれる側の関数だけからなるファイルを作って、
呼ばれる方はstaticにする。


189:デフォルトの名無しさん
07/03/30 19:38:30
もう一つ質問しても良いでしょうか?
lccで行数の多い関数が入ったファイルをコンパイルすると
out of memory
とエラーが出るのですが
関数を短くしないといけないのでしょうか?><

190:デフォルトの名無しさん
07/03/30 19:41:50
つーか、データの依存関係が強すぎだろ。

191:デフォルトの名無しさん
07/03/30 19:43:11
>>189
LSICを使っているのなら、窓から投げ捨てろ。
あれは、関数を評価する為のコンパイラが使用するメモリ空間をたった32KBだか64KBだかに抑えている。

192:183
07/03/30 19:46:08
>>188
関数に付けるstaticってこういう時に使うんですね、ありがとうございました

193:デフォルトの名無しさん
07/03/30 19:54:31
URLリンク(s03.2log.net)

194:183
07/03/30 20:02:13
ついでで申し訳ないんですが、関数は何も指定しないと自動的にextern指定されるということでいいんでしょうか?

195:デフォルトの名無しさん
07/03/30 20:03:36
そうでs

196:デフォルトの名無しさん
07/03/30 20:04:24
>>194
いえす。
関数はファイルの外部から見える(extern)か見えない(static)かの2通りで
省略時はextern扱いされる。
外部に見せる必要がない関数は積極的にstaticを付けておくのはよい習慣。


197:デフォルトの名無しさん
07/03/30 20:05:10
>>194
staticをつけない限り、そうなる。
従って、ソースファイル外から使いたい関数以外は無条件にstaticをつけた方がいい。
#最近のコンパイラはstaticな関数は積極的にインライン展開しようとすることだし。

198:183
07/03/30 20:08:08
>>195-197
ありがとうございます、これからは習慣付けるようにします

199:デフォルトの名無しさん
07/03/30 20:11:46
windowsから消しておきました><

200:デフォルトの名無しさん
07/03/30 21:16:58
質問です

if( a[7] != 0 )
{
  cnt = 16 ;
  while( (a[0] & 0x0f) == 0 && cnt != 0 )
  {
    for( ct = 0 ; ct != 8 ; ct++ )
    {
      ((struct ST4bit *)&a[0+ct]->4bit_0
        = ((struct ST4bit *)&a[0+ct])->4bit_1 ;
      ((struct ST4bit *)&a[0+ct]->4bit_1
        = ((struct ST4bit *)&a[1+ct])->4bit_0 ;
    }
    ((struct ST4bit *)&a[7])->4bit_1 = 0 ;
    cont-- ;
  }
}

struct ST4bitはunsigned型で{4bit_0 ; 4bit_1}がメンバ(各4bit)

この時、このプログラムの意味することは、
a[0]〜a[7]で後ろ詰めに格納されているものを
前詰めにしている、というのでいいでしょうか?

またこうすればもっと簡単にできるというのがありましたら、ご教授お願いします。

201:デフォルトの名無しさん
07/03/30 21:29:41
printfってプリントフって読むの?それともプリントエフって読むの?

202:デフォルトの名無しさん
07/03/30 21:42:20
プリントエフがデフォ

203:デフォルトの名無しさん
07/03/30 22:36:15
>200
forループの中でa[8]にアクセスしてるみたいだけど、いいの?

204:デフォルトの名無しさん
07/03/30 22:43:08
>202
THX

205:デフォルトの名無しさん
07/03/30 22:48:21
>>200
C言語じゃないよね?

206:デフォルトの名無しさん
07/03/30 22:48:25
正式には プリント ウィズ フォーマット だっけ?

207:デフォルトの名無しさん
07/03/30 22:56:32
はあ?

208:デフォルトの名無しさん
07/03/30 22:57:10
>>200
鼻からなんか出る前に消してしまえ

209:デフォルトの名無しさん
07/03/30 22:58:29
識別子の先頭に数字はないだろ・・・
常識的に考えて・・・

210:デフォルトの名無しさん
07/03/30 23:18:47
常識というか、それが通るコンパイラがあったら是非私に知らせて欲しい。
頼んだぞ。

211:デフォルトの名無しさん
07/03/30 23:38:47
識別子をプレゼントつ「unko_program」

212:デフォルトの名無しさん
07/03/30 23:41:37
>>200
データサイズが膨大 or 組み込み用途 or 学習目的
のいずれでも無いならビットフィールド使うのをやめるのが吉

long long に対応しているコンパイラならシフト演算一回で終わる
※但し、データの並び順が変わるのに注意

213:212
07/03/30 23:47:05
データの並び順が変わる

コンピュータのバイトオーダによってはデータの並び順が変わる

214:デフォルトの名無しさん
07/03/30 23:49:18
標準入力のフラッシュは非標準らしいですが、
これをサポートしてない環境の例ってあります?
たとえば組み込み用の一部ではサポートしてないとかそういうのでしょうか?

215:デフォルトの名無しさん
07/03/30 23:52:04
>>214
バッファリングしない環境では実装されてないってことは普通にあるかもね。

216:デフォルトの名無しさん
07/03/31 00:00:20
ファイルをリダイレクトされた標準入力をフラッシュされたらどうなるんだって話があるしな。

217:212
07/03/31 00:02:43
>>214
linux のターミナルだと使えなかったよ

218:デフォルトの名無しさん
07/03/31 13:00:19
>>214
fflush(stdin)のことを言ってるならWINXPでできなかった記憶がある

219:デフォルトの名無しさん
07/03/31 16:29:09
>>191
LSI-C の用途があなたの想定する用途と違うだけ

220:デフォルトの名無しさん
07/03/31 16:39:06
>>219
MS-DOS用コンパイラをWindowsで動かす積極的な理由は何かある?
まさか、製品版のLSI-C80の話をしているわけじゃないよね?

221:デフォルトの名無しさん
07/03/31 16:56:08
>>220
そんな理由はあるかどうか分からない
ただ DOS で動くプログラムがごく稀に必要になることはある

元になったレスは lcc って書いてあるから lsic86 とは関係ないっぽい

222:デフォルトの名無しさん
07/03/31 16:59:36
制御系なら DOS の方が楽
リアルタイムOS として DOS を使う場合もある
再起動も早いし

223:デフォルトの名無しさん
07/03/31 18:50:53
int ascii_to_integer(char *ascii) {
int i;
int integer;
for (i = 0; *(ascii+i) >= '0' && *(ascii+i) <= '9'; ++i)
integer = 10 * integer + (*(ascii+i) - '0');
return integer;
}

これってasciiをポインタと配列のどっちで書いたほうがいい? それともどっちでもいい?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5371日前に更新/183 KB
担当:undef