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
を使え。
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をポインタと配列のどっちで書いたほうがいい? それともどっちでもいい?
224:デフォルトの名無しさん
07/03/31 18:51:40
>>223
atoi 使うのがイイ
225:デフォルトの名無しさん
07/03/31 18:53:53
>>223
ついでに変数 integer の初期化が必要
226:デフォルトの名無しさん
07/03/31 19:00:45
>>223
そのasciiは、「『関数の仮引数』だから」
char *asciiと書いてもchar ascii[]と書いても、同じ。
char *asciiと書いたかのようにcharへのポインタ型として扱われる。
URLリンク(kmaebashi.com)
URLリンク(www.kouno.jp)
あと、'0'から'9'までの文字かどうかの判定にはisdigitが使える、というより使え。
そして勉強ならいいが、実用なら>>224。
227:デフォルトの名無しさん
07/03/31 19:04:34
>>221、>>222
で、元質が制御系だとかDOSプログラムを作ってるだとか言う根拠は?
ちなみに、LSI-C86ならコンパイラの実行モジュール名がlccだな。
他にもlccはあるが、ちょっとした関数で音を上げることから察すればLSI-Cだろう。
228:デフォルトの名無しさん
07/03/31 19:20:05
>>227
根拠も何も無い
DOS が好きなだけなんだ
だから DOS で使えるコンパイラが貶められるのが嫌だった
それだけ
好きなものは好きなんだ、理屈じゃないんだ!
そういうもんだろ?
229:デフォルトの名無しさん
07/03/31 19:21:00
だったら、窓(Windows)だけ投げ捨てろ?w
230:デフォルトの名無しさん
07/03/31 19:43:33
ここといい宿題スレといい争いが絶えませんね
231:デフォルトの名無しさん
07/03/31 19:56:23
テキトーなことを言う奴が後を絶たないせい
232:デフォルトの名無しさん
07/03/31 20:11:57
/* 期待する出力は ababababab */
#include<stdio.h>
/* こんな時 func_t はどんな型で typedef すればいいのしょうか? */
typedef void *(*func_t)(void);
func_t a(void);
func_t b(void);
func_t a(void){putchar('a');return b;}
func_t b(void){putchar('b');return a;}
int main(void){
func_t func=a;
int i;
for(i=0;i<10;i++) func=func();
return 0;
}
233:デフォルトの名無しさん
07/03/31 20:20:15
どう見ても入門者の質問じゃありません。適切なスレへどうぞ。
234:デフォルトの名無しさん
07/03/31 20:24:41
期待する出力はあばばばばぶ
>>232
typedef func_tA;
typedef func_tA (*func_t)(void);
func_tA a(void);
func_tA b(void);
func_tA a(void){putchar('a');return (func_tA)b;}
func_tA b(void){putchar('b');return (func_tA)a;}
int main(void){
func_t func=a;
int i;
for(i=0;i<10;i++) func=(func_t)func();
return 0;
}
これでうまくいったけど
たぶん改善の余地ありだろうな
235:デフォルトの名無しさん
07/03/31 20:29:44
再帰みたいになるのか。
236:デフォルトの名無しさん
07/03/31 20:31:36
いや戻りとして相手の関数ポインタを返してるだけだから再帰とは違うでしょ
自分が相手を呼び出してるわけじゃないし
237:デフォルトの名無しさん
07/03/31 20:34:55
ポインタpに対して
p[2]が使えたんだけど
これは文法的にok?
238:デフォルトの名無しさん
07/03/31 20:38:42
>>237
文法的にはok
論理的(規格の用件に合致する、正常に実行できるなど)な観点からは
okかどうかそれだけではわからない。
239:デフォルトの名無しさん
07/03/31 20:40:55
func_t a(void);
void b(void);
func_t a(void) { putchar('a'); return b; }
これで、ここまで、ならば通る。
func_t b(void);
に変えると
typedef func_t (*func2_t)(void);
func2_t a(void);
にしなければならなくなる。
すると今度は・・・
難しいね。
240:デフォルトの名無しさん
07/03/31 20:41:08
>>237
p[2] の領域が確保されていればおk
例.
int a[10]={0}, *p;
p=&a[3];
p[2]=0x1234; // p[2] == a[5] なので O.K.
p=&a[9];
p[2]=0x5678; // p[2] == a[11] なので N.G.
241:デフォルトの名無しさん
07/03/31 20:43:24
大学でC言語を習った人がプログラマになってからよくやってしまう間違いや
効率の悪いプログラムの書き方とかあれば教えて下さい(-_-;)
242:デフォルトの名無しさん
07/03/31 20:45:58
>>232 下でキャスト無しでいけるけど、関数の型が変わったらダメ?
typedef void *(*func_t)(void);
void *a(void){putchar('a');return b;}
void *b(void){putchar('b');return a;}
243:デフォルトの名無しさん
07/03/31 20:50:53
しかし質問者が無反応なのが恐ろしい
244:デフォルトの名無しさん
07/03/31 20:50:57
>>241
よくある失敗はバッファオーバーラン
効率の悪いプログラムの書き方は標準関数を自作してしまう
245:デフォルトの名無しさん
07/03/31 20:51:13
strcpyの代わりにsprintfをよく使っちゃうけど問題ない?
246:デフォルトの名無しさん
07/03/31 20:52:55
>>245
無いよ。
247:デフォルトの名無しさん
07/03/31 20:55:22
>>244
よく自作しようとしてしまう関数って
どんなものがあるんでしょうか(-_-;)
248:デフォルトの名無しさん
07/03/31 20:59:44
>>241
局所変数のポインタを返すとか。
値を受け取るための引数に未初期化ポインタを渡すとか。
てか、大学関係ない単なるC言語初心者か。
249:デフォルトの名無しさん
07/03/31 20:59:50
>>245
sprintfはstrcpy並に問題ある。
バッファオーバーラン防止のため、snprintf使え。
250:デフォルトの名無しさん
07/03/31 21:00:51
>>232 です
>>234
すみません。
キャストしなくても警告の出ない方法があればと思い質問しました。
>>239
そうなんです。ループしてしまうので宣言の仕方がわからないんです。
>>242
void * にすると代入する時の型チェックが無くなってしまうので
できれば関数の型を残したいです
251:デフォルトの名無しさん
07/03/31 21:05:28
char a[]="1,2,3";
int i;
のとき
sscanf(a,"%d,%s",&i,a);
とか
sscanf(a,"%s,%d",a,&i);
って大丈夫?
252:デフォルトの名無しさん
07/03/31 21:11:24
>>241
エラーチェックをしてないのも多い気がする
fopen が失敗したかどうかチェックしてないとか
253:デフォルトの名無しさん
07/03/31 21:15:17
>>252
あぁ…確かにソケット通信のプログラムで
関数のエラーの戻り値を知らずに大変なことがありました(-_-;)
254:デフォルトの名無しさん
07/03/31 21:19:29
>>247
文字列操作する時に多いと思う
str??? 関係 (strrchr strcat とか)
is??? 関係 (isdigit isalpha とか)
あと scanf 系の書式指定で対応できるところを自作するとか
printf の %*d 書式相当のものとか
255:251
07/03/31 21:23:45
あと
sprintf(a,"%d,%s",i,a);
とか
sprintf(a,"%s,%d",a,i);
みたいに上書きしても大丈夫ですか?
256:デフォルトの名無しさん
07/03/31 21:26:15
>>255
大丈夫じゃないです
257:デフォルトの名無しさん
07/03/31 21:32:25
>>250
ん~
無理じゃないかなぁそれは
typedef func_t (*func_t)(void);
こういう宣言が許されない以上キャストするかvoid *使うかしかないと思う
それ以前に関数ポインタを戻りとして返さないとダメかな?
つまりこういうのじゃダメ?
typedef void (*func_t)(void);
void a(void);
void b(void);
void a(void){printf("a");}
void b(void){printf("b");}
int main(void){
func_t func[]={a,b};
int i;
for(i=0;i<10;i++) func[i%2]();
return 0;
}
258:デフォルトの名無しさん
07/03/31 21:38:07
>>257
無理なようですね。
書き方を変えることにします。
>>回答を下さった皆さん
どうもありがとうございました。
259:255
07/03/31 22:51:37
>>256
sscanf(a,"%d,%s",&i,b);
sscanf(b,"%s",a);
とか
sscanf(a,"%s,%d",b,&i);
sscanf(b,"%s", a);
とか
sprintf(b,"%d,%s",i,a);
sprintf(a,"%s",b);
とか
sprintf(b,"%s,%d",a,i);
sprintf(a,"%s",b);
でやればいいんですかね?
260:デフォルトの名無しさん
07/03/31 22:58:07
>>259
まあそうだが、
信頼できない入力に対して%sを使うのはバッファオーバーランの
危険があるから、やめといたほうがいいとはおもう
261:デフォルトの名無しさん
07/03/31 23:21:16
>>260
%100.100sとか書けばええだけちゃうの?
262:デフォルトの名無しさん
07/03/31 23:28:14
%as
263:デフォルトの名無しさん
07/03/31 23:37:43
じゃこうだね
まあ練習用のプログラムだから
int ascii_to_integer(char *ascii) {
int i;
int integer;
integer = 0;
for (i = 0; *(ascii+i) >= '0' && *(ascii+i) <= '9'; ++i)
integer = 10 * integer + (*(ascii+i) - '0');
return integer;
}
*(ascii+i)とascii[i]ってどっちが普通? 括弧が少ない分, ascii[i]がよく使われるのかな?
264:デフォルトの名無しさん
07/04/01 00:48:55
ascii[i];
の方が俺としては読みやすい
265:デフォルトの名無しさん
07/04/01 01:09:46
C FAQを読んで
配列 = ポインタ + 書き換え可能なメモリー
じゃないことが分かった
さっきまでの自分が恥ずかしい
266:デフォルトの名無しさん
07/04/01 01:30:58
行列の積を解くプログラム教えてください
267:デフォルトの名無しさん
07/04/01 01:37:56
URLリンク(www.google.co.jp)
別に煽ったりとかではないが
こんくらい、そのまんま検索ひっかかるよ。。。
268:デフォルトの名無しさん
07/04/01 01:41:10
ヘッダの中にヘッダをインクルードするのは、
通常どういう見解ですか?Cソースだけにしたほうが良いですか?
269:デフォルトの名無しさん
07/04/01 01:47:31
どういう見解も何も、必要だからインクルードしているんだろう。
インクルードガードはちゃんと付けとけよ。
270:デフォルトの名無しさん
07/04/01 01:53:27
#ifndef _INCLUDE_ADD_
#define _INCLUDE_ADD_
//内容
#endif
>>269 おそらく、こうゆガードですね。有り難うございました。
271:デフォルトの名無しさん
07/04/01 02:26:34
>>270
_INCLUDE_ADD_は予約済み識別子なので使わないほうがいい
使用すると未定義動作になる
272:デフォルトの名無しさん
07/04/01 02:57:15
>>271
忠告どうもです。予約語意外にします。
273:デフォルトの名無しさん
07/04/01 03:00:38
_で始まって大文字や_が続く識別子は全部予約されているので念の為
274:デフォルトの名無しさん
07/04/01 03:28:59
>>257
i%2 -> i&1
のほうが速いかも
275:デフォルトの名無しさん
07/04/01 03:35:29
>>272
最近は"予想外"が流行りらしいぞ。
276:デフォルトの名無しさん
07/04/01 07:17:25
srand()の存在意義が分かりません。rand()にseedを渡す設計にすれば
済みそうなのに、何故わざわざ別の関数にしたのでしょう?
277:デフォルトの名無しさん
07/04/01 07:25:53
アフォ
rand()呼ぶたびにいちいちseed渡さにゃならんかったらめんどくさいだろうが
278:276
07/04/01 08:16:45
仮に rand(seed); とするすると、()の中を毎回書くのが面倒ってこと
ですかね? そんなに面倒かなぁ
279:デフォルトの名無しさん
07/04/01 08:25:51
じゃなくて毎回同じseedを渡していたら、
randから返ってくる値がおなじになるじゃないか。
280:デフォルトの名無しさん
07/04/01 08:28:23
rand(&seed) とすれば seed は変わる。
ただ、こういう実装にすると、
rand のアルゴリズムに制限がかかる。
あるいは、結局 srand みたいなものが必要になる。
281:デフォルトの名無しさん
07/04/01 08:37:30
int my_rand(int seed)
{
srand(seed);
return rand();
}
で別れていれば自分で実装できるじゃん。なのでやりたければどうぞ。
おれはsrandとrandに別れている方がいいので、
my_randしかなければ困ったことになる。
282:276
07/04/01 08:52:16
>>280の回答が親切で比較的納得しやすいと思った。
>>281の回答は疑問に対する答えになっていないのでは……
rand(time(NULL)); とでもすればseedは毎回変わるし、これで良いので
は? と思ったのが疑問の出発です。レス見て分かったような分からな
いような気分だけど、そのうち実感できるときが来るかもしれない。回
答ありがとうございました。
283:デフォルトの名無しさん
07/04/01 09:09:18
>>282
それだと、時間が立たない限り
何度読んでも同じ値しか返ってこないよ
284:デフォルトの名無しさん
07/04/01 09:23:58
同じ種で始めれば同じ乱数列が得られるというのも疑似乱数列の
性質としては重要(再現性)なので、基本となるライブラリにある
関数が毎回勝手に裏で種を変えるような造りだと不便な気がする。
必要なら自分でそこにある素材から作れるわけだし。
285:デフォルトの名無しさん
07/04/01 09:25:57
>>282
ん。そうか? 別れていれば
・別れている方がいいよ派
・毎回seedを渡したいよ派
の両方の要求を満たせるということをかいたつもりなんだが、
わかりづらかったかな…
286:デフォルトの名無しさん
07/04/01 10:31:11
配列でできることってすべてポインタでできるなら配列はいらないと思うんだけど
そこんとこどうよエロイ人
287:デフォルトの名無しさん
07/04/01 10:31:54
だから、毎回seedを設定してたら乱数にならないんだってば。
288:デフォルトの名無しさん
07/04/01 10:49:49
>>286
配列で出来ることでポインタで出来ないことがあります。
なので配列は必要です。同様にポインタも必要です。
289:デフォルトの名無しさん
07/04/01 11:32:58
>>287
「一連の乱数を得る」という単位での「毎回」と読むのであろう。
290:デフォルトの名無しさん
07/04/01 11:52:23
毎回seed渡すrandって単なるハッシュ関数だな
291:デフォルトの名無しさん
07/04/01 11:53:25
>>289
一連の乱数を、どうやって一回の関数呼び出しで実現するんだ?
一連の乱数を必要な回数の関数呼び出しで実現するのなら、どうやって連の先頭でのみseedを渡すんだ?
それに対する真っ当な回答が、連の先頭でのみsrand()を呼び、以降rand()のみを呼ぶことなんだが。
292:デフォルトの名無しさん
07/04/01 11:56:01
>>291
君、読解力ないね。
293:デフォルトの名無しさん
07/04/01 12:04:14
>>288
具体的にはどんなことがあるの?
294:デフォルトの名無しさん
07/04/01 12:33:58
int a[10];
これをポインタで実現できる?
295:デフォルトの名無しさん
07/04/01 12:37:10
>>294
ポインタだけじゃないけど
struct linked_list {
struct linked_list *next;
...
};
を定義してmallocで動的にメモリーを割り当てればおkじゃない?
296:デフォルトの名無しさん
07/04/01 12:40:16
>>295
せめて a = malloc(sizeof(int) * 10) を使おうよ。
# より配列らしく使うならallocaにしたいが。
297:デフォルトの名無しさん
07/04/01 13:51:19
>>296
alloca?
int a[10];がどういう文脈で使われてるか分からんし、
スタックに割り付けることが配列らしく使うことになるとは思えんのだが。
callocなら分からんでもないけど。
298:デフォルトの名無しさん
07/04/01 14:08:51
どういう文脈で使われるかわからんのにcalloc()ならなんで「わからんでもない」なんだろ。
299:デフォルトの名無しさん
07/04/01 14:20:04
allocaのほうがfreeせずに済む分配列っぽいということか。
ただし、ローカル変数なら。
300:デフォルトの名無しさん
07/04/01 14:28:18
callocなら要素サイズと要素個数を別個に指定して割り付けるから配列宣言っぽい、という意味で分からんでもない。
使いどころが限られているallocaよりも、int a[10];がどういう文脈で使われていても、とりあえずcallocはヒープに取れるし。
301:デフォルトの名無しさん
07/04/01 14:32:14
>>299
ああ、納得。確かにfreeが不要っていう点ではallocaは配列と共通点を持ってるね。
302:デフォルトの名無しさん
07/04/01 15:43:45
>>281
これは seed が更新できないから使い物にならない
303:デフォルトの名無しさん
07/04/01 15:46:04
>>294 の意図しているところがワカランのが困る。
どこまで再現して欲しいのか。
304:デフォルトの名無しさん
07/04/01 15:56:33
[ ]のオーバーr(ry
305:デフォルトの名無しさん
07/04/01 16:02:24
int b[10],*a=b;
306:デフォルトの名無しさん
07/04/01 16:03:08
[]もオーバーライドできるのか…
307:デフォルトの名無しさん
07/04/01 16:49:53
int (*a)[10] = malloc(sizeof (int) * 10);
こういう事がやりたいのか?
308:デフォルトの名無しさん
07/04/01 17:09:33
calloc()は0クリアされるという仕様である時点で、ローカル配列とは似ても似つかないのだが。
309:デフォルトの名無しさん
07/04/01 17:26:43
それ以前に「要素のサイズと、数を別々に指定できるから、alloca()より配列に近い」ってのも、あれじゃね?
310:デフォルトの名無しさん
07/04/02 02:59:18
エイプリルフールも終ったね
ネタは乱数の種と配列をポインタで実現だけか
つまらん
311:デフォルトの名無しさん
07/04/02 03:14:05
ネタスレじゃないし
312:デフォルトの名無しさん
07/04/02 11:43:43
今年は偽RFC来なかったの?
313:デフォルトの名無しさん
07/04/02 13:13:23
4824
314:デフォルトの名無しさん
07/04/02 14:15:30
手旗信号かワロタ。アブストしか読んでないけど。
315:デフォルトの名無しさん
07/04/02 16:10:23
VCExpressでCW_USEDEFAULTが定数として呼び出せないのはなぜなんだぜ?
: error C2664: 'CreateWindowExA' : 4 番目の引数を 'LPCSTR' から 'DWORD' に変換できません。(新しい機能 ; ヘルプを参照)
教えてください。お願いします。
316:デフォルトの名無しさん
07/04/02 16:17:00
HWND CreateWindowExA(
DWORD dwExStyle,
PCTSTR pszClassName,
PCTSTR pszWindowName,
DWORD dwStyle,
int x,
(ry
317:デフォルトの名無しさん
07/04/02 17:00:15
>>316
ズレてたわけですか。
hWnd = CreateWindow(szClassName,
"猫でもわかるWindowsプログラミング", //タイトルバーにこの名前が表示されます
(LPCSTR)WS_OVERLAPPEDWINDOW, //ウィンドウの種類
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
引用スマソ。EXAではないのですが、EXにして第一引数を加えると
: warning C4002: マクロ 'CreateWindowA' に指定された実引数の数が多すぎます。
: error C2664: 'CreateWindowExA' : 2 番目の引数を 'long' から 'LPCSTR' に変換できません。(新しい機能 ; ヘルプを参照)
と出ます。ウィンドウクラスはEXなんですが、なぜでしょうか?
お願いします。
318:デフォルトの名無しさん
07/04/02 17:03:01
CreateWindowEX': 識別子が見つかりませんでした
違った。こっちがエラーだ
319:デフォルトの名無しさん
07/04/02 17:22:31
解決しました。誤字があったようで
ありがとうございました。
320:デフォルトの名無しさん
07/04/02 17:39:03
質問文を作るだけで疑問が解決する事も結構あるのね…
321:デフォルトの名無しさん
07/04/02 17:40:40
質問しようとして疑問点を整理していくと何が問題なのかわかっちゃうことって結構あるよね
322:デフォルトの名無しさん
07/04/02 17:42:39
それがデバッグじゃね?
323:デフォルトの名無しさん
07/04/02 17:54:59
デバッグというより洗い出しというか整理というか
324:デフォルトの名無しさん
07/04/02 21:40:54
何か格言ぽいのなかったっけ
「人に聞く前に目の前のクマさん人形に説明してみろ」
とかなんとか
325:デフォルトの名無しさん
07/04/02 21:48:39
うんk
326:デフォルトの名無しさん
07/04/02 21:55:25
コンピュータ系の演習室か何かにゴムのアヒルちゃんがおいてあって、
常駐してる相談員に質問する前にはそのアヒルちゃんに質問してから、
というルールがあるという話をどっかで読んだ。
327:デフォルトの名無しさん
07/04/02 21:59:54
「ゴムのアヒルに質問する」という設定だけなら
「達人プログラマー(The Pragmatic Programmer)」
にあった。
なんでアヒル?
328:デフォルトの名無しさん
07/04/02 22:04:39
「ゴムのアヒル」ってのが小さな子供が遊ぶおもちゃの象徴だからじゃないか?
幼児に馴染みのある人形って日本だと何だろう?
アンパンマンとか?
329:デフォルトの名無しさん
07/04/02 22:05:32
その辺に置いてあったからじゃね?
別にダースベイダーのボトルキャップでもいいわけで
330:デフォルトの名無しさん
07/04/02 22:43:13
ビット列の上位から下位までを逆順にしたい。
例えば、
01100111 -> 11100110
というように。
(0bit目が7bit目に、1bit目が6bit目に…)
何かスマートなやり方はありますか?
331:デフォルトの名無しさん
07/04/02 23:02:34
>>330
LUT
332:デフォルトの名無しさん
07/04/02 23:32:00
これでよくね?
int y = 0;
if(x & 1) y |= 128;
if(x & 2) y |= 64;
if(x & 4) y |= 32;
if(x & 8) y |= 16;
if(x & 16) y |= 8;
if(x & 32) y |= 4;
if(x & 64) y |= 2;
if(x & 128) y |= 1;
333:デフォルトの名無しさん
07/04/02 23:41:31
全然スマートじゃないけどな
334:デフォルトの名無しさん
07/04/02 23:48:09
10 進法で考えたら分かりやすくね?
int a = 1365;
int b = 0;
while (a>0) {
b *= 10;
b += a % 10;
a /= 10;
}
これを応用して
int a = 1365;
int b = 0;
while (a>0) {
b << 1;
b |= a & 1;
a >> 1;
}
335:デフォルトの名無しさん
07/04/02 23:50:36
スマートって結局主観だろ。
他人のことなんてわからん。
余計なことして気分的にスマートって思いたいだけだろ。
336:デフォルトの名無しさん
07/04/02 23:56:24
それに加え「速いのが良ければ実測しろ」だしな。
337:デフォルトの名無しさん
07/04/02 23:56:28
int test8bit(int x)
{
static BYTE table[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
int y = table[x>>4] | (table[x&15]<<4);
return y;
}
int test16bit(int x)
{
int y = test8bit(x>>8) | (test8bit(x&255)<<8);
return y;
}
intは32ビット以上前提で
338:デフォルトの名無しさん
07/04/02 23:57:12
そんな言い訳ばかり並べて逃げるやつからは何も生まれてこないと思うんだ。
339:330
07/04/02 23:57:19
LUT作りました。
皆さん、ありがとう。
340:デフォルトの名無しさん
07/04/03 00:01:40
まあ>>332をスマートだと思う奴なんていないだろうけどな
341:デフォルトの名無しさん
07/04/03 00:06:38
そんなことに時間かけるくらいなら
可読性も速度も無難なのがいい。
342:330
07/04/03 00:12:13
可読性と速度を考えてLUT。
実測はしてないですが。
343:デフォルトの名無しさん
07/04/03 00:13:58
まあ、速すぎて調べても誤差程度にしかならんけどね。
344:デフォルトの名無しさん
07/04/03 23:57:14
文字列を戻り値に指定するときに
char ch[] = " ";
return ch;
だとエラーが出て
char ch[] = " ";
return &ch[0];
だと通ったんですが、戻り値に配列を指定するときは
return ch;
のように省略して書いてはいけないのでしょうか?
345:デフォルトの名無しさん
07/04/04 00:01:54
関数内で宣言した変数は静的変数(static付けた奴)以外、
関数を抜けると同時に破棄される。
呼出元に戻ったらもうそんな変数を指すポインタは無意味と化している。
だから前者ではそのことを警告されただけだと思う。
無論後者の書き方をしたところで問題の解決にはなっていない。
346:デフォルトの名無しさん
07/04/04 00:20:51
>>344
エラーがでるでないはともかく関数内で宣言したローカル変数を戻り値にしちゃだめだよぉ
return で戻ったときにはchar ch[] はもう亡くなっているだろうから
347:デフォルトの名無しさん
07/04/04 00:32:46
結論、Cでは文字列を単純には戻り値にはできない。
348:デフォルトの名無しさん
07/04/04 00:34:15
なんでそういう結論になるのか
349:デフォルトの名無しさん
07/04/04 00:43:41
>>348
他の結論になるとでも?
350:デフォルトの名無しさん
07/04/04 00:45:26
後者は&リテラル返してるじゃん
351:デフォルトの名無しさん
07/04/04 00:50:12
呼び出し元で確保しておけと。
352:デフォルトの名無しさん
07/04/04 00:51:02
>>344
C言語で関数から文字列を返却したいときは、戻り値にしないで引数で返す
つまり、呼び側関数内で配列の領域を確保し、呼ばれる関数に渡す
353:デフォルトの名無しさん
07/04/04 00:51:35
被ったorz
354:デフォルトの名無しさん
07/04/04 01:30:59
超初心者で申し訳ないんですけど、
コンパイルしようとしたときに、cant open: stdio.hっていうエラーが出るんです。
解説お願いします。
355:デフォルトの名無しさん
07/04/04 02:15:58
すいません、自己解決しました。
356:デフォルトの名無しさん
07/04/04 03:58:31
>>347は要するにC言語では配列そのものをreturn文で返すことはできない、
ってことだろ。
自動的にポインタに変換されてしまうから。
357:デフォルトの名無しさん
07/04/04 04:33:37
BinarySearchTreeの勉強をしてるんですが
階層の数はどんな感じで出せばいいですか?
358:デフォルトの名無しさん
07/04/04 12:04:32
350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26
後者は&リテラル返してるじゃん
359:デフォルトの名無しさん
07/04/04 12:05:34
356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31
自動的にポインタに変換されてしまうから。
360:デフォルトの名無しさん
07/04/04 12:07:33
358 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:04:32
350 デフォルトの名無しさん sage 2007/04/04(水) 00:45:26
後者は&リテラル返してるじゃん
359 名前:デフォルトの名無しさん[sage] 投稿日:2007/04/04(水) 12:05:34
356 デフォルトの名無しさん sage 2007/04/04(水) 03:58:31
自動的にポインタに変換されてしまうから。
361:デフォルトの名無しさん
07/04/04 12:16:40
自分で考えろ
362:デフォルトの名無しさん
07/04/04 12:36:27
ソケット通信ってchar型以外のデータを送信できるのでしょうか?
構造体でデータをまとめて通信したいんですけど…
363:デフォルトの名無しさん
07/04/04 12:40:33
送信する関数のポインタの型を良く見ろ
364:デフォルトの名無しさん
07/04/04 13:28:03
>>362
「ネットワークバイトオーダー」でググるよろし。
365:344
07/04/04 16:54:10
ローカル変数だってことすっかり忘れてました…
staticにするか引数に渡すかしないといけなかったんですね。。
皆さん分かりやすい説明ありがとうございました。
366:デフォルトの名無しさん
07/04/04 17:19:44
前者がリテラルへの参照、後者がリテラルの先頭アドレスを返してる。
char* moji(){
char ch[] = "a";
return ch;//もしくはreturn &ch[0];
}
int main(){
char* b=moji();
return 0;
}
これで、各所にブレークポイント置いて、メモリとレジスタを見てみりゃわかる。
ローカル変数はベースポインタ(EBPレジスタ)からのオフセットで決まるから、
moji()からmain()に戻ってくりゃ、ベースポインタが変わるから、リテラルへの参照chは意味を成さなくなる。
ただし、戻り値(EAPレジスタ)の残骸が残っている場合、一見何事もなく済んでしまう場合もある。
ch[0]というのは、リテラルそのもの、文字がメモリにセメダインで張り付いてるようなもので、値を変えようとすると
AccessViolationでOSから怒られる。&ch[0]は参照じゃなく直接リテラルのアドレスを返している。
367:デフォルトの名無しさん
07/04/04 17:31:18
>>366
>リテラル
何か混乱しているようですが、そのコード中の文字列リテラルは "a" のみです。
ch はリテラルではなく、単なる char[2] のローカル変数です。
368:デフォルトの名無しさん
07/04/04 17:31:47
真っ赤な間違い乙
369:デフォルトの名無しさん
07/04/04 17:32:18
真っ赤な間違いは>366ね。
370:デフォルトの名無しさん
07/04/04 17:43:37
>>367
だから、chは文字リテラル"a"への参照だよ。
chは、単なるch[2]のローカル変数?
だから違うよ、ch[2]の先頭を参照するローカル変数。
参照ってなに?
371:デフォルトの名無しさん
07/04/04 17:51:02
>>367
左辺値と右辺値の区別くらいつけろや
372:デフォルトの名無しさん
07/04/04 17:56:47
>>366
Cならいついかなる場合でも配列chに対して、chと&ch[0]は同じ。
どちらも配列の先頭要素を指すポインタが式の結果として得られる。
373:デフォルトの名無しさん
07/04/04 17:57:01
安価間違ってない?
374:デフォルトの名無しさん
07/04/04 17:58:42
vipperはカエレ
375:デフォルトの名無しさん
07/04/04 18:00:17
安価とか言うのは高確率で
おっさん
376:デフォルトの名無しさん
07/04/04 18:06:40
>配列ch
だからchはアドレス参照だと
それと、結果は同じでも過程は違うとはよくいったもんで
377:デフォルトの名無しさん
07/04/04 18:06:57
なんか恥ずかしいやつが混じっているなぁ。
char ch[2] = "a";
char foo[2] = {'a', '\0'};
printf("%p, %p\n", ch, foo);
を実際にコンパイルして(アセンブル出力を見るか)実行してみれば直ぐに判ることだろうに。
378:デフォルトの名無しさん
07/04/04 18:08:43
行火
379:デフォルトの名無しさん
07/04/04 18:16:00
>>377
そのプログラムを実行して結果を見たところで何がわかるのやら
380:デフォルトの名無しさん
07/04/04 18:19:42
何も判らないならプログラミングは止めたほうがいい。
381:デフォルトの名無しさん
07/04/04 18:25:49
>>366
ちなみに文字列リテラルそのもの(の先頭要素)を指すポインタを返したければこうする
どちらも結果的には同じこと
char* moji() {
return "a";
}
char* moji() {
char* ch = "a"
return ch;
}
382:デフォルトの名無しさん
07/04/04 18:27:26
>>380
当然過ぎる結果が返ってきたということだw
上の方のレスはカオス過ぎて読んでいない。
383:デフォルトの名無しさん
07/04/04 18:27:45
どうせなら
char *p = "a";
も付け足しとけ。
384:デフォルトの名無しさん
07/04/04 18:30:53
「配列とポインタは同じ」
って罪な言葉だな…
385:344
07/04/04 18:31:09
つまり
ch → "a"の先頭アドレスを参照
ch[0] → 'a'を参照
&ch[0] → 'a'のアドレスを指す
と言うことで、これらは全部
'a' '\0'
を参照しているからアドレスは同じってことですか?
386:デフォルトの名無しさん
07/04/04 18:32:37
>>366のアホさに久々にワロタ
387:デフォルトの名無しさん
07/04/04 18:33:17
>>385
違う。
388:デフォルトの名無しさん
07/04/04 18:34:01
なんつーか、参照って言葉をむやみに使わないほうがいいと思うんだ。
389:デフォルトの名無しさん
07/04/04 18:35:43
配列の初期化子に使う場合でも文字列リテラルって言うの?
390:デフォルトの名無しさん
07/04/04 18:39:39
>>389
URLリンク(e-words.jp)
391:デフォルトの名無しさん
07/04/04 18:40:44
>>389
そう言う。
規格上、charの配列を文字列リテラルで初期化できるという規則になっているから。
392:デフォルトの名無しさん
07/04/04 18:42:09
ch → 配列の先頭を指すポインタとして見なされる
ch[0] → char型の値
&ch[0] → ch[0]のアドレス
393:デフォルトの名無しさん
07/04/04 18:44:38
>>390
いやリテラルであることに疑問の余地はないんだけど、文字列リテラルってなんか微妙に違和感あったもんで…
>>391
規格じゃあしょうがないね
394:344
07/04/04 18:56:51
>>388
少し調べたんですが、
参照ってC++だと特別な意味があったんですね。。
これから気をつけます。
>>392
ありがとうございます。
自分が考えていたことと全然違いますね…
395:デフォルトの名無しさん
07/04/04 19:00:32
URLリンク(kmaebashi.com)
より引用
" で囲まれた文字列を、文字列リテラルと呼ぶ。
通常は、文字列リテラルは、「char の配列」を意味する。 よって、式の中では「charへのポインタ」に読み換えられる。
しかし、char の配列を初期化する場合は例外である。 (こちらを参照のこと) この場合の文字列リテラルは、中括弧内に文字を区切って書く初期化子の 省略形として、コンパイラに特別に解釈される。
char str[] = "abc"; /* この宣言は、下の宣言と同義 */
char str[] = {'a', 'b', 'c', '\0'}; /* 配列の最外周なので、要素数は省略できる */
…だそうだ
396:デフォルトの名無しさん
07/04/04 19:12:16
コード上で"で囲まれてれば全部文字列リテラルなのねー
感覚としてはあたかも文字列リテラルのように書くことが許されてるって感じだった
397:デフォルトの名無しさん
07/04/04 19:15:40
でも現実的には初めそう教えておくほうがいいと俺は思う。
398:デフォルトの名無しさん
07/04/04 19:31:04
>>366
がアホなのは解った。
399:デフォルトの名無しさん
07/04/04 19:39:27
オレはC言語はきちんと理解できていないが
ゲームなんかのクラックをして変な知識だけはある
しかもアセンブラの意味も分かっているわけではなく
シンボルを見て分かった気になっているだけの
スクリプトキディみたいなもんだ
言っとくがオレは >>366 でも代弁者でもないぞ
400:デフォルトの名無しさん
07/04/04 19:44:49
>>399
どういう流れでその書き込みなのか頭の悪い俺に教えてください。
401:デフォルトの名無しさん
07/04/04 19:47:48
>>399
いったい、誰に対して何の主張をしてるんだ?
402:デフォルトの名無しさん
07/04/04 20:02:08
それをこれから書くところなんじゃないか
403:デフォルトの名無しさん
07/04/04 20:02:45
スレ違いはスルー汁
404:デフォルトの名無しさん
07/04/04 20:28:28
とりあえず>>370の
char ch[] = "a"; は文字リテラル"a"への参照だよ。
ってのはおかしいよね・・・?
405:デフォルトの名無しさん
07/04/04 20:37:08
argv[1][2]って*(p+2)みたいに表現できないの? > エロイ人(愛を込めて)
406:デフォルトの名無しさん
07/04/04 20:43:08
>>405
*(argv[1] + 2)
407:デフォルトの名無しさん
07/04/04 20:50:32
>>405
もしくは
*(*(argv+1)+2)
408:デフォルトの名無しさん
07/04/04 20:52:20
argv[ i ][ k ] = *(*(argv+i)+k)
と等価って意味ね
409:デフォルトの名無しさん
07/04/04 21:05:21
2[1[argv]]
410:デフォルトの名無しさん
07/04/04 21:13:52
argv[i][k] == *(*(argv+i)+k) == k[i[argv]]
411:デフォルトの名無しさん
07/04/04 21:22:45
>>406-410
サンクス
なるほど *を2回使うのね
412:デフォルトの名無しさん
07/04/04 21:53:54
a[b]におけるaとbの可換則だけは釈然としない
こんなの使って可読性が上がる場合なんてあんの?
413:デフォルトの名無しさん
07/04/04 21:57:04
>>412
その仕様は初期のコンパイラの都合によるものと思われる
でも、できるからといって使う必要はないじゃないか
414:デフォルトの名無しさん
07/04/04 23:35:53
char *argv[]に対して
*(argv+i)って言うのはargv[i]
*(*(argv+i))って言うのはargv[i][]
と同じと考えておk?
415:デフォルトの名無しさん
07/04/04 23:37:44
下は *(*(argv+i)) == *(*(argv+i)+0) == argv[i][0] ?
416:デフォルトの名無しさん
07/04/04 23:45:43
うん。
*p == p[0]
417:デフォルトの名無しさん
07/04/04 23:48:02
構造体ってのは最初に宣言しないといけないの?
#include <stdio.h>
int main(void){
struct person{
char *sei;
int age;
}taro;
taro.age=13;
taro.sei="山田";
struct person hanako;
printf("太郎の姓は%s、年齢は%dです\n",taro.sei,taro.age);
return 0;
}
これコンパイルできないんだけど
418:デフォルトの名無しさん
07/04/04 23:50:09
struct person hanako;
を削ってみ。
419:デフォルトの名無しさん
07/04/04 23:51:59
>>417
Cの場合宣言(struct person hanako; )は関数スコープの最初に
taro.age=13; taro.sei="山田"; の後で宣言はダメ
420:デフォルトの名無しさん
07/04/04 23:52:17
>>417
コンパイルできるよ。
421:デフォルトの名無しさん
07/04/04 23:57:13
あれがコンパイルできるC99は残念ながら普及していないのさ
422:デフォルトの名無しさん
07/04/04 23:59:18
gccが普及してないとでも?
423:デフォルトの名無しさん
07/04/05 00:10:03
GCCは普及しているものの、社会がC99を使う風潮になっていない。
見たことあるか?C99で書かれたプログラム。
424:デフォルトの名無しさん
07/04/05 00:17:24
FreeBSDのソースがC99でかかれてたなー。
425:デフォルトの名無しさん
07/04/05 00:23:08
拡張子をcppにすればいい
426:デフォルトの名無しさん
07/04/05 00:44:47
>>423
コメントが//のCのソースコードをよく見るんだが
427:デフォルトの名無しさん
07/04/05 03:02:41
C99で書かれたものは、C89でも書ける。
極端な事言えば、C++でusing namespace std;
をグローバルで宣言して、あとはCの様に書けば
事足りる。
なんだよ、_BOOLって (w
428:デフォルトの名無しさん
07/04/05 03:09:55
極端な事言えば、 で書かれたものは機械語でも書ける。
429:デフォルトの名無しさん
07/04/05 07:05:03
ふつうにboolにしてくれた方が使いやすい
430:デフォルトの名無しさん
07/04/05 07:51:37
>>423
毎日飽きるほど見てますが、何か。
431:デフォルトの名無しさん
07/04/05 08:04:55
>>427>>429
<stdbool.h>
432:デフォルトの名無しさん
07/04/05 12:49:55
int *a;
ってやったら
aにはたとえば0x123456ff
みたいなアドレスが入ってるんだよね?
だから、a=12みたいなことはできないってことはわかったんだけど
char *c
c="abcdef";
みたいなことができるのはなんで?
char *cって指定した時点で
cには0x12345678みたいなアドレスが入ってんじゃないの?
433:デフォルトの名無しさん
07/04/05 12:54:00
"abcdef"は、文字列abcdefのアドレスの意味
434:デフォルトの名無しさん
07/04/05 12:54:04
int *aもchar *cも宣言した時点では(有効な)アドレスは入ってない。
435:デフォルトの名無しさん
07/04/05 12:59:11
あれ?
アドレス表示しても6桁なんだけど…
なんで?
436:デフォルトの名無しさん
07/04/05 12:59:55
a=12だってできる。
437:デフォルトの名無しさん
07/04/05 13:00:32
>>435
上が0なんだろ・・・
438:435
07/04/05 13:02:00
#include <stdio.h>
int main()
{
int a = 1 ;
printf ( "%x" , &a ) ;
return 0 ;
}
で実行すると
12fed4
どういうこと?
439:デフォルトの名無しさん
07/04/05 13:02:42
>>437
なるほど^^
お騒がせしました
440:デフォルトの名無しさん
07/04/05 13:04:32
>>432
そういうC言語の仕様。
「char型の配列はダブルクォーテーションで囲む文字列(これを文字列リテラルと言う)で初期化できる」
っていうルールがあるの。ただおまいはその書き込みから色々誤解してそうなフシがあるから注記しとくと
・初期化が無い宣言の時点ではその変数の値は決まってない。
その変数を格納するためのメモリ領域に元々入ってるデータがそのまま値になる。
・文字列リテラルで出来るのはあくまで初期化であり、代入は出来ない。
つまり、char c[] = "unko";はできるけどchar c[20]; c = "unko";はダメ。
・ポインタに対しても同じ事が出来るけどそれはchar *cのに対して静的なリテラルのアドレスが代入されたのであって
↑のルールとは無関係。だから厳密に言えば↑のレスは的外れになる。
441:デフォルトの名無しさん
07/04/05 13:14:58
>>438
0x12fed4
16進表記だよ
442:デフォルトの名無しさん
07/04/05 13:22:39
%p ならなんとかしてくれるかもしんない。
あ。 ゼロサプレスしてたっけか?
443:デフォルトの名無しさん
07/04/05 13:45:42
なるほどー。
char c[20];
ってやって、初期化しなかった場合に代入したいときは
scanfとかstrcpy使わないとだめなのかな?
c="asdf"はできなくてstrcpy(c,"asdf")はできるんだよね。。。
なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか
444:デフォルトの名無しさん
07/04/05 13:54:28
>>443
char c[20];
char *p=c; cのアドレスをpにコピー
コピーしたのは「アドレス」であってデータそのもの("ABCDE")ではない
このときpには c のアドレスが入っている
次に p="ABCDE";
を実行すると p は"ABCDE"というリテラルの「アドレス」が代入され
cに"ABCDE"がコピーされるわけではない
c(=p)にコピーしたいのなら strcpy(p,"ABCDE"); としなければいけない
445:デフォルトの名無しさん
07/04/05 13:54:41
>>443
> なんでc="asdf"はだめでstrcpyは良いのかよくわからないけども、まぁいっか
c="asdf"は、char型の20個の領域にアドレス(="asdf")を代入しているからだめ
strcpyは、char型の20個の領域に文字列asdfをコピーしているから良い
446:デフォルトの名無しさん
07/04/05 13:56:06
>>443
Cでは配列間での代入はできない。また、"asdf"は'a'を指すポインタと解釈される。
従って、c = "asdf"は配列へのポインタの代入と言うことになり、当然できない。
どうしても代入したければ、要素を一つずつ代入すればよい。
#そしてそれを、ナル終端文字列専用にしたのがstrcpy()だ。
447:デフォルトの名無しさん
07/04/05 13:58:01
c="asdf" ← というか、そもそも、c = で使えない。(cは配列の先頭を表してるってだけ)
strcpy(c,"asdf") ← c(配列の先頭のアドレス)とリテラルのアドレスを渡して、
'a','s'・・・を順次入れているだけ。
448:デフォルトの名無しさん
07/04/05 14:06:51
>>443
"asdf" は文字列が格納されている先頭メモリ番地
c="asdf" はアドレス値をコピーしようとしている
strcpy(c,"asdf") はアドレスが指すデータをコピーしようとしている
449:デフォルトの名無しさん
07/04/05 15:45:32
for (i = 0; i < THREAD_COUNT; i++) {
/* スレッド生成 */
if (pthread_create(&thread_id, NULL, threadFunc, (void *)thread_arg) == 0) {
thread_count++;
}
}
とやって、THREAD_COUNTの数をいろいろ変えているのですが
ある一定の数以上は、必ず失敗するようになります。
自分の環境では303個めまでのスレッドは作成できますが
それ以上は作成できません。
どこかでスレッドの上限というのは決められているのでしょうか?
450:デフォルトの名無しさん
07/04/05 16:32:12
/*
1000以下の素数を求める(第1版)
*/
#include <stdio.h>
int main(void)
{
int i, no;
unsigned long counter = 0;
for (no = 2; no <= 1000; no++) {
for (i = 2; i < no; i++) {
counter++;
if (no % i == 0) /* 割り切れると素数ではない */
break; /* それ以上の繰返しは不要 */
}
if (no == i) /* 最後まで割り切れなかった */
printf("%d\n", no);
}
printf("乗除を行った回数:%lu\n", counter);
return (0);
}
これでnoが3の時二個目のfor分のところのiが<演算子なのに3になるんですか?
3にならなければ3素数なのにprintfで表示されないですよね
451:デフォルトの名無しさん
07/04/05 16:42:23
no = 3, i = 2 → 割り切れない
no = 3, i = 3 → i < noを満たさないのでループ終了
no == i なので3は素数
452:デフォルトの名無しさん
07/04/05 16:44:38
<これでも
3<3までいくんだ?
<=じゃなくても
453:デフォルトの名無しさん
07/04/05 16:45:38
3になったからループを抜けるわけで
454:デフォルトの名無しさん
07/04/05 16:47:32
ループの流れ
i = 2
i < no の判定
処理
i++
i < no の判定
処理
i++
i < no の判定
処理
i++
・
・
・
455:デフォルトの名無しさん
07/04/05 16:48:36
>>450=452 ...か?
妥当なインデント付けて、最初のforループの中を一行ずつ追っていけば
何となく分かるかもね。
456:デフォルトの名無しさん
07/04/05 17:04:32
>>452
そうじゃなくて
no=3 のとき iのループは3になったら抜けるわけでループ内では2までしか処理されない
ループを抜けているのはiが3だからループのあとiは3になっている
457:デフォルトの名無しさん
07/04/05 17:46:40
printf()が負値を返すのはエラーが発生した場合とのことですが
具体的にエラーが発生するのってどんな状況のときなんですかね?
458:デフォルトの名無しさん
07/04/05 17:59:47
>>457
厳密には、printf()は出力に失敗するとEOFを返す。
リダイレクト先の出力がなんらかの制限のあるデバイスにでも振り向けられていなければ、
一般的には出力は必ず成功する。
459:デフォルトの名無しさん
07/04/05 18:44:50
てか画面以外は失敗する可能性あるよね。
460:デフォルトの名無しさん
07/04/05 18:58:02
>>459
画面って何?
/dev/consoleのこと? 必ずしも画面とは限らないのだけど……
461:デフォルトの名無しさん
07/04/05 19:03:19
要は、下位のwriteが失敗するかどうかが大体のキモだね。
printf(NULL)みたいなどうしようもないようなものをのぞけば。
462:デフォルトの名無しさん
07/04/05 19:32:07
>>457
普通にファイルに書いてたって空き領域がなくなることはあるだろうし
リムーバブルなメディアなら途中で引っこ抜かれるかも試練。
463:デフォルトの名無しさん
07/04/05 19:40:07
実は、バッファリングされているから必ずしもエラーにならない罠。
464:デフォルトの名無しさん
07/04/05 19:46:53
必ずしもの使い方が間違っている希ガス
465:デフォルトの名無しさん
07/04/05 19:47:44
463ではないが、必ずしもエラーになるとは限らない、かな?
466:デフォルトの名無しさん
07/04/05 19:50:25
容量オーバーした瞬間にエラーにならない可能性はあるが、
失敗する可能性は十分あり得るということでFA?
467:デフォルトの名無しさん
07/04/05 21:26:44
すみません。前回はありがとうございます。
また質問させていただきます。
URLリンク(www.uploda.org)
スパゲティですみません。
game3.hの構造体sceneDataなんですが変数dFFがメンバじゃないと出るんですが、
何ででしょうか?
要素が多すぎるんでしょうか?
pはsageです。
468:デフォルトの名無しさん
07/04/05 21:31:37
>>467
grep で検索しても dFF はどこにも宣言されて無いようだ