トップページ⇒tech
1001コメント250KB

C言語なら俺に聞け(入門篇) Part 51

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG?DIA(296430)
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 129代目
http://pc12.2ch.net/test/read.cgi/tech/1247438792/

・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 50
http://pc12.2ch.net/test/read.cgi/tech/1246342847/

過去スレ
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
0153デフォルトの名無しさん2009/07/26(日) 14:45:10
>>152
じゃあ何?ってことで>>144て書き込みされたと思うんだが
0154デフォルトの名無しさん2009/07/26(日) 14:46:48
Windowsじゃないと思いながらWindowsなら同じでしょ?って聞くとかどうかしてる
0155デフォルトの名無しさん2009/07/26(日) 14:49:29
>>151
>>150をみて「「gccならnixにちげぇねぇwwww」なんて自己中な人」と決めるのもかわいそうなもので
0156デフォルトの名無しさん2009/07/26(日) 14:49:51
最近他人のレスにケチつけるのが流行ってるのか?
0157デフォルトの名無しさん2009/07/26(日) 14:50:31
最近じゃなく前から
0158デフォルトの名無しさん2009/07/26(日) 14:50:45
という話だったのさ
オープンクエスチョンはしんでいい
0159デフォルトの名無しさん2009/07/26(日) 14:51:43
みんな!
これからはクローズドクエスチョンで行きましょう!!
0160デフォルトの名無しさん2009/07/26(日) 14:52:16
いつものことじゃん。
自演が多分に含まれてそうな気配がするのもいつものこと
0161デフォルトの名無しさん2009/07/26(日) 14:53:17
>>154
俺はどうかしてるとは思わない

>>155
俺はかわいそうだと思わなかったwww
0162デフォルトの名無しさん2009/07/26(日) 14:54:37
>>160
IDがほしいお

IDチェンジで自演されてもいいからIDほしいお
0163デフォルトの名無しさん2009/07/26(日) 14:55:56
IDつけろって話も何度も出てるのにねぇ。
01641622009/07/26(日) 14:58:20
まあID欲しい理由は他にもあって質問者が最初に書き込んだレス番を名前欄にその後入れないことが多いからなんだよな
質問者の発言なんのかを見分けにくいときあるし質問が近い時期に重なった際はどっちのことなのかこれまた見分けにくいとかあるし
0165デフォルトの名無しさん2009/07/26(日) 15:03:43
にしてもlinuxならフォルダじゃなくてディレクトリって呼んで欲しいな
0166デフォルトの名無しさん2009/07/26(日) 15:06:11
急に伸びたな
0167デフォルトの名無しさん2009/07/26(日) 23:14:35
read()とwrite()で画面に文字を表示するにはどうすれば…?
0168デフォルトの名無しさん2009/07/26(日) 23:15:41
>>167
read は無理
0169デフォルトの名無しさん2009/07/26(日) 23:16:54
下記のマクロが引数なしでよばれても動作するようにするにはどうしたらいいでしょうか。
2回目のsprintfの部分でコンパイルエラーになるます

#define DBG_PRINT(...) {       \
  FILE* fp;              \
  char str[100];           \
  fp = fopen("dbg.txt", "a+");    \
  sprintf(str, "line: %d", __LINE__); \
  fputs(str, fp);           \
  sprintf(str, __VA_ARGS__);    \
  fputs(str, fp);           \
  fclose(fp);             \
}
0170デフォルトの名無しさん2009/07/26(日) 23:17:29
恐ろしい方法だが
スクリーンバッファにreadで読み込めば表示は可能
0171デフォルトの名無しさん2009/07/26(日) 23:26:53
>>169
無理
話は変わるけど fprintf は使わないの?
0172デフォルトの名無しさん2009/07/26(日) 23:30:47
>>169
書式指定フォーマットが即値のリテラルの場合に限られる場合のみこれでおk

#define DBG_PRINT(...) { \
FILE* fp; \
fp = fopen("dbg.txt", "a+"); \
fprintf(fp, "line: %d ", __LINE__); \
fprintf(fp, "" __VA_ARGS__); \
fclose(fp); \
}
0173デフォルトの名無しさん2009/07/26(日) 23:32:01
引数がどうであれ改行したいんでしょう
0174デフォルトの名無しさん2009/07/26(日) 23:32:56
うそつきました。
0175デフォルトの名無しさん2009/07/26(日) 23:54:05
#define の効果範囲ってどこまでなの?
ソースファイルを分割してる場合とかって、#defineをしてるソースファイル内だけが定義範囲になるの?
0176デフォルトの名無しさん2009/07/26(日) 23:56:43
コンパイル単位でのみ有効
.cに書いてて、それをincludeしているファイルが無ければそのファイルに閉じられるよ
0177デフォルトの名無しさん2009/07/27(月) 00:09:48
Cプリプロセッサ言語はC言語と別系統
0178デフォルトの名無しさん2009/07/27(月) 00:11:50
a→b→a→a→c→d→b→c→c→d
のようなリストがあるときに、a,b,c,dの出現回数を調べたいときは
どうやるといいですか?
0179デフォルトの名無しさん2009/07/27(月) 00:13:59
普通にリストを巡回して現れた文字に対応する整数を++すればいいよ
0180デフォルトの名無しさん2009/07/27(月) 00:14:07
リストを全走査
0181デフォルトの名無しさん2009/07/27(月) 00:15:09
>>178
リストにぶら下がってる各情報の種別がわかるような識別情報を割り当てておいて先頭からチェック
0182デフォルトの名無しさん2009/07/27(月) 00:24:55
>>179-181
ありがとうございます。やってみます。
0183デフォルトの名無しさん2009/07/27(月) 00:28:50
char list[] = "a→b→a→a→c→d→b→c→c→d";
char *p = list;
int count['z' % 'a' + 1] = {0}, i;

while(*p) if('a' <= *p && *p << 'z') ++count[*(p++) % 'a'];
0184デフォルトの名無しさん2009/07/27(月) 00:32:33
>>176-177
ありがとう。
0185デフォルトの名無しさん2009/07/27(月) 00:33:17
>>183
ほうっへ

こっちの方がよくね?
char list[] = "a→b→a→a→c→d→b→c→c→d";
printf("count(list(a))=%d\n", 3);
printf("count(list(b))=%d\n", 1);
printf("count(list(c))=%d\n", 3);
printf("count(list(d))=%d\n", 2);

存在するリスト全体に対して個別に定義すれば問題ない
0186デフォルトの名無しさん2009/07/27(月) 04:04:58
調べると表示するは違う
0187デフォルトの名無しさん2009/07/27(月) 10:25:50
自分で調べるか、プログラムを作ってコンピュータに調べさせるかの違いだな
リストが1つで要素が10個なら自分で数えた方が早い
0188デフォルトの名無しさん2009/07/27(月) 10:28:34
なぜCプログラマは>>183>>185のような回答をしたがるのか
0189デフォルトの名無しさん2009/07/27(月) 10:46:10
・ヒマだから
・要求が明確ではない場合にこうなるという教え
・ヒマだから
0190デフォルトの名無しさん2009/07/27(月) 10:48:32
もう一つ
・IOCCCモドキの書き方をしたがる
0191デフォルトの名無しさん2009/07/27(月) 10:51:32
あーたしかに。
今回のはそれにあたらないけど、、、っていうか*p <= 'z'だろ
0192デフォルトの名無しさん2009/07/27(月) 10:52:03
・要求が明確ではない場合にこうなるという教え
明確になるように話を引き出せばいい

あ、できないからこんなところで初心者に嫌がらせして楽しんでるのか・・・
0193デフォルトの名無しさん2009/07/27(月) 10:54:24
このような外野がうるさくなる現象に何か名前をつけようず
0194デフォルトの名無しさん2009/07/27(月) 10:55:16
だってテンプレに書いてあるんだもの。
今回のだってリストの実装が分からなければコードの示しようがないし
概略でいいならすでに回答者は満足を得られたようだし
0195デフォルトの名無しさん2009/07/27(月) 10:55:18
>>192
まずはテメーでな^^
0196デフォルトの名無しさん2009/07/27(月) 10:55:54
>>193
>>183>>185のようなアホな回答しなければ静かだよ>ここ
0197デフォルトの名無しさん2009/07/27(月) 11:02:10
>>179
マルチポストか。
http://ex24.2ch.net/test/read.cgi/pc2nanmin/1080308026/648
0198デフォルトの名無しさん2009/07/27(月) 11:03:42
>>183
2文字目でpが++されないから無限ループ
0199デフォルトの名無しさん2009/07/27(月) 11:07:17
>>198
ほい
while(*p){if('a' <= *p && *p <= 'z')++count[*p % 'a'];p++;}
0200デフォルトの名無しさん2009/07/27(月) 11:08:01
いやそのコードはもういいって
0201デフォルトの名無しさん2009/07/27(月) 11:09:28
あほみたいな質問するのも答えるのも禁止したらこのスレなんか必要ないじゃん
0202デフォルトの名無しさん2009/07/27(月) 11:11:35
言い方悪いけど、勝手に騒いでろ、って感性で行けばどうってことない
0203デフォルトの名無しさん2009/07/27(月) 11:11:49
あほみたいな質問は禁止してない
アホみたいな回答をするな、その回答をネタに雑談するなと言ってる
0204デフォルトの名無しさん2009/07/27(月) 11:12:01
いやいいじゃないか
暇なCプログラマがじゃれ合うスレが一つぐらいあっても
ここが潰れたら皆他のスレに迷惑掛けに行くだろ?w
0205デフォルトの名無しさん2009/07/27(月) 12:12:28
>>203
よい回答の例をおながいします
0206デフォルトの名無しさん2009/07/27(月) 12:19:34
「アホみたいな回答」にちゃちゃ入れて悦に入るのもkのスレの目的
0207デフォルトの名無しさん2009/07/27(月) 13:10:51
データをそのまま配列のインデックスに使うのってありふれた手法だよなあ
バグやインデントはともかく、>>183がアホみたいな回答と言われる理由がわからん
0208デフォルトの名無しさん2009/07/27(月) 13:37:46
いちいち説明しないとわからないほどアホなんだろうけど
それに説明するのはもっとアホらしいなぁ。
0209デフォルトの名無しさん2009/07/27(月) 13:59:36
質問をよく嫁
178が調べたいのは配列じゃなくてリスト
179-182で解決済
0210デフォルトの名無しさん2009/07/27(月) 16:00:08
ソースコード中に直書きした文字列の文字コードはどう決まるの?
コンパイラが決めるの?それともソースファイルの文字コード?
0211デフォルトの名無しさん2009/07/27(月) 16:06:07
あ、それとコマンドラインから入力した文字の文字コードもよくわからないです
0212デフォルトの名無しさん2009/07/27(月) 16:13:22
>>210
文字コードを決めるのはソースファイルを入力する人間。
コンパイラ、というかプリプロセッサはソースファイルの中に非アスキー文字が混じっていたら
16進の形式に変換するだけ。

で、ソースファイルの文字コードとコマンドラインの文字コードが一致していないと
プログラムがうまく動かなかったり文字化けしたり、たまにコンパイルできなかったりする。
0213デフォルトの名無しさん2009/07/27(月) 16:27:05
>>211
コンパイラ次第。例えばgccの場合、ソースとバイナリと入出力のエンコーディングを個別に指定できる。
0214デフォルトの名無しさん2009/07/27(月) 19:30:14
thx
XPのVC++IDEだとソースもコマンドラインもshift_jisっぽいですね
0215デフォルトの名無しさん2009/07/27(月) 20:03:31
Unicodeだよ?
Shift JISの場合はコード変換されるので遅くなるって
msdnに書いてある。
0216デフォルトの名無しさん2009/07/27(月) 22:07:12
VCはBOM付きのソースファイルを扱える。 UTF-16でも、UTF-8でも可。
0217デフォルトの名無しさん2009/07/27(月) 23:25:32
質問です
下のprintf(...............);に入る文を教えてください。
実行結果は下の通りです

要素x[0]は 7.526 y[0]は 2.474 z[0]は10.000
要素x[1]は 3.125 y[1]は 6.785 z]1]は10.000

#include <stdio.h>
double sum(double x,double y);
int main(void)
{
int i,n=2;
double x[2]={7.526,3.125};
double y[2]={2.474,6.785};
double z[2];
for(i=0;i<n;i++)
{
z[i]=sum(x[i],y[i]);
printf(.........................);
}
return 0;
}

double sum(double a,double b);
{
double c; c=a+b;return c;
}

0218デフォルトの名無しさん2009/07/27(月) 23:27:15
要素x[0]は 7.526 y[0]は 2.474 z[0]は10.000
要素x[1]は 3.125 y[1]は 6.785 z]1]は10.000
こういう感じで表示されればいいの?
0219デフォルトの名無しさん2009/07/27(月) 23:35:29
printf("要素x[%d]は%f y[%d]は%f z[%d]は%f\n", i, x[i], i, y[i], i, z[i])
0220デフォルトの名無しさん2009/07/27(月) 23:40:04
>>218
なんか不安な点があったの?
0221デフォルトの名無しさん2009/07/27(月) 23:41:41
小数点表示の制限もあるっぽいな
printf("要素x[%d]は%.3f y[%d]は%.3f z[%d]は%.3f\n", i, x[i], i, y[i], i, z[i]);
になるのか
0222デフォルトの名無しさん2009/07/27(月) 23:43:54
ああ、z]1]か。
3項演算子が放り込まれたコードが出てくるかね。
0223デフォルトの名無しさん2009/07/27(月) 23:44:49
printf("要素x[0]は 7.526 y[0]は 2.474 z[0]は10.000\n要素x[1]は 3.125 y[1]は 6.785 z]1]は10.000");

あほな質問はやめろって言ってんだろ
0224デフォルトの名無しさん2009/07/27(月) 23:48:50
何のひねりもなくてつまらんかった
0225デフォルトの名無しさん2009/07/27(月) 23:54:38
宿題は宿題スレへ
0226デフォルトの名無しさん2009/07/28(火) 07:07:07
宿題は自分でやれ
0227デフォルトの名無しさん2009/07/28(火) 08:51:20
宿題終わらせないと9月が来ないからな。
0228デフォルトの名無しさん2009/07/28(火) 09:03:01
9月が来ないなら、人生を終わらせておけばいいじゃない。
0229デフォルトの名無しさん2009/07/28(火) 09:33:21
>>223
あほな回答はやめろって言ってんだろw
0230デフォルトの名無しさん2009/07/28(火) 09:55:14
ハルヒを押し倒さないと9月は来ませんよ
0231デフォルトの名無しさん2009/07/28(火) 09:57:24
で、ループは抜けたのか?
0232デフォルトの名無しさん2009/07/28(火) 11:03:08
>>227
それって最高だろw
0233デフォルトの名無しさん2009/07/28(火) 14:20:39
配列の初期化で質問です。
配列を0で埋めたい場合、
int a[100] = {0};
というサンプルを見たのですが、0xffffで埋めたい場合はどう書けばいいのでしょうか?
0234デフォルトの名無しさん2009/07/28(火) 14:22:45
>>233
それで埋まるんだっけ?
0235デフォルトの名無しさん2009/07/28(火) 14:29:24
足りない分は0で埋める仕様
初期化時に任意の値で足りない分を埋める仕様は無い
0236デフォルトの名無しさん2009/07/28(火) 14:32:07
じゃあfor文で埋めるか
int i;int a[100];for ( i=0; i<100; i++ ) { a[i] = 0xffff; }
0237デフォルトの名無しさん2009/07/28(火) 14:32:35
#include <stdio.h>
int main()
{
for (int ic = 0; ic < 100; ++ic) printf("0xffff, ");
return 0;
}
--
というプログラムを作って./a.out > foo.i とでもしてfoo.iを作ったら、
int a[100] = {
#include "foo.i"
};
--
でOK。
0238デフォルトの名無しさん2009/07/28(火) 14:43:32
>237CXXerか。

C99なら、いや、やっぱり何でもない。オナニーは一人でするもんだ。
0239デフォルトの名無しさん2009/07/28(火) 15:03:06
int a[100];
memset(a, 0xff, sizeof(a));
0240デフォルトの名無しさん2009/07/28(火) 15:11:07
>>239残念
0241デフォルトの名無しさん2009/07/28(火) 15:12:37
int が 16bit のときだけおkだ
0242デフォルトの名無しさん2009/07/28(火) 15:20:34
8bitでなくて?
0243デフォルトの名無しさん2009/07/28(火) 15:21:21
ん?
>>239でも問題ないよ。
0244デフォルトの名無しさん2009/07/28(火) 15:23:38
問題あるわ
0245デフォルトの名無しさん2009/07/28(火) 15:25:07
sizeof(a) はちゃんと400になったぞ?
0246デフォルトの名無しさん2009/07/28(火) 15:26:16
全部 0xff で埋めちゃだめ。
02472432009/07/28(火) 15:27:44
ああ、0x0000ffffか。
ごめん、俺が間違えてた。
0248デフォルトの名無しさん2009/07/28(火) 15:34:20
int a[10];
とか書いたらスタックメモリ(?)にプログラムの最初から最後までint 10個分のメモリは存在し続けるんでしょうか?
それともその配列のあるスコープに入ったら確保されるんでしょうか?
0249デフォルトの名無しさん2009/07/28(火) 15:36:16
実装依存。
スコープよりも少し広く、関数に入った時点で確保する実装もありそう。
0250デフォルトの名無しさん2009/07/28(火) 16:03:23
最適化の影響もあるだろうしな。
0251デフォルトの名無しさん2009/07/28(火) 16:04:11
スコープに入っている間は少なくとも有効であることは保証される

っていうだけで、いつから確保するか、いつ捨てるかは特に規定されていない。
02522392009/07/28(火) 16:18:56
ああそうか、0xffffか。
すまんかった><
■ このスレッドは過去ログ倉庫に格納されています