C言語なら俺に聞け(入門篇) ぱぁと2〜

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
ではどうぞ

前スレ
C言語なら俺に聞け(入門篇)
http://pc8.2ch.net/test/read.cgi/tech/1146700389/
2デフォルトの名無しさん:2006/07/25(火) 19:32:50
ところで、俺一人暮らしなんだが最近後ろから気配を感じるんだが誰もいないはずなんだが、
ただ俺だけなんだがなんでだろう?
3デフォルトの名無しさん:2006/07/25(火) 20:57:57
そうだね、プロテインだね。
4デフォルトの名無しさん:2006/07/25(火) 21:38:52
>>2
ドッペルゲンガーかもしれん・・・・・
今のうちに出来ることをやっておいた方がいい。
5デフォルトの名無しさん:2006/07/25(火) 21:39:32
>>2
オヤシロサマの祟りじゃ〜
6デフォルトの名無しさん:2006/07/26(水) 11:15:26
オナヌーでもして寝たほうがいいよ。
疲れてるんだよきっと。
7デフォルトの名無しさん:2006/07/26(水) 12:03:25
インクルードファイル 'stdio.h' をオープンできない

っていうエラーが出るんですけど、どうしたらいいんでしょうか・・・
ボーランドのコンパイラで、例のhello〜っていうプログラムも実行できずにいます><
超初心者ですみません><
8デフォルトの名無しさん:2006/07/26(水) 12:37:06
>>7
入門以前の事だろそれは
出て行け
二度と来るな
9デフォルトの名無しさん:2006/07/26(水) 12:50:36
自己解決しますた^^
10デフォルトの名無しさん:2006/07/26(水) 13:45:56
おめでとお^^
11デフォルトの名無しさん:2006/07/26(水) 13:53:52
突然ですみません。3つほど質問があります。

@モーターへの出力命令の与え方

Agoto文の使い方

B作図の仕方


何度調べてもわかりませんでした。
知っている方、教えて下さい。
12デフォルトの名無しさん:2006/07/26(水) 14:18:26
>>11
入門以後の事だろそれは
出て行け
二度と来るな
13デフォルトの名無しさん:2006/07/26(水) 14:27:48
>>12
失礼しました
14デフォルトの名無しさん:2006/07/26(水) 23:20:40
>>11
@ Cの話じゃない
ハードの構成に依存する

A goto <ラベル>


B Cの話じゃない
紙に鉛筆などで好きに書け
15M:2006/07/29(土) 15:05:06
1.duble型変数へのポインタ変数dPtrを宣言する。
2.float型ポイント変数aにfloat型変数numberのアドレスを代入する。
3.ポインタ変数aが指すオブジェクトの値を1インクリメントする。
4.文字型配列aに格納されてる文字列をプリントする。
C言語でどうやってプログラムするんですか?(><)
16デフォルトの名無しさん:2006/07/29(土) 15:30:30
// 1.
duble * dPtr;
// 2.
float * a = & number;
// 3.
* a += 1;
// 4.
printf("%s", a);
17M:2006/07/29(土) 15:33:01
ありがとうございます☆
18デフォルトの名無しさん:2006/07/29(土) 17:13:17
"¥7"って何??

7円とかそういう落ちではなく、、
7回改行とか7文字分空白を空けるのかと思ったんだが。。
 cmdじゃ効果無いかな・・
19デフォルトの名無しさん:2006/07/29(土) 18:07:30
>>18
7の値を持つ文字のこと。ASCIIではBELと定義されいるので、一般的にコンソールに出力すればベルが鳴る。
#そういう意味においては、"\a"と等価。
20デフォルトの名無しさん:2006/07/29(土) 18:46:10
な、なんだって〜。。
だからエラーの時プープーて鳴るのか。
 (2つ書いたから)

なるほど、、トンクス>>19
21デフォルトの名無しさん:2006/07/29(土) 23:51:43
return文を書くときに、後ろに0とか-1とかつけるじゃないですか。
あれって、0を返すのと他の数値を返すのとではどう違うんですか?
プログラムを実行しても何も変わらないので、疑問に思いました。
どなたか教えてくれれば、幸いです。
22デフォルトの名無しさん:2006/07/30(日) 00:05:12
>>21
おそらく0と-1だったら向こう側ではエラーの有無をチェックしているのでは?
返す値によって何がどう違うかは戻り値の目的による。
23デフォルトの名無しさん:2006/07/30(日) 00:05:46
それは main のことか?
例えば、system 関数でそのプログラムを実行した時に
system の戻り値が変わったりする(でも、どうなるかは環境依存か)。
あとはシェルで実行した時に
プログラムの成功/失敗の判定に影響したり(これも環境依存か)。
まあ、環境依存だが、そんなところだ。
2421:2006/07/30(日) 00:08:10
ありがとうございます。
入門書を読んでも書いてなかったので。
ネットでも調べてみます。
25デフォルトの名無しさん:2006/07/30(日) 00:11:16
-10とか-100とかってのもあったなw

エラーで終わらせるのなら、exit()でないといかんか。。
26デフォルトの名無しさん:2006/07/30(日) 00:19:29
C言語なら自分でやれ(実践篇) ってタイトルのスレを立ててみてはいかがでしょうか?
何も書かずに自分で勝手にやれってことですけどw
27T:2006/07/30(日) 00:29:55
C言語で2Dないしは3Dのゲーム作りたいんですけどうまく解説してくれているサイトはありませんか?
28デフォルトの名無しさん:2006/07/30(日) 00:29:57
2get禁止にしないとものすごい勢いで荒れるぞそれwww
2928:2006/07/30(日) 00:33:33
すごい勢いでかぶったorz

>>27
こんなのあったけど
ttp://www.plustarnet.com/aspil/Programming/

つかググれよ
つ「DirectX C言語 ゲーム プログラム」
これで3個目に出たぞ
30デフォルトの名無しさん:2006/07/30(日) 00:38:48
C廚ってスキル低いね。
遅いのにJavaが全盛なのが理解出来た。
Cで組める香具師って絶滅種?
31デフォルトの名無しさん:2006/07/30(日) 00:39:48
っつか、アルゴリズムの勉強なら言語を選ばなくても良いし
初心者が手軽に手を出すからじゃね?
32デフォルトの名無しさん:2006/07/30(日) 00:47:20
JavaはGUI簡単だからな
ただな・・・仕事で使うんじゃないならJavaに利用価値があんまりないんだよ
3328:2006/07/30(日) 00:56:26
自分、VBですから
34デフォルトの名無しさん:2006/07/30(日) 12:50:10
やっぱBCBだな
35デフォルトの名無しさん:2006/07/30(日) 14:19:04






以下のやつの結果が表示されないのですけれど
どうすればよいのかご教授ください



#include <stdio.h>

int main()
{
int a;
a=10;
printf("変数aには%dが代入されています。", a);
return 0;
}
36デフォルトの名無しさん:2006/07/30(日) 14:36:24
うまくいくはずですが
37デフォルトの名無しさん:2006/07/30(日) 14:36:52
>>35
結果というのが何を指すか分からないが、
「変数aには10が代入されています。」
と表示されないということか?
まず、環境を書け。俺は表示された。
38デフォルトの名無しさん:2006/07/30(日) 14:54:06
出力される前に終了してるのか?
printfの後にfflush(stdout);を入れてみてもだめなのか?
3935:2006/07/30(日) 14:57:52
>>37
表示されたのですか!
>>38
これから試して見ます。

環境は
    WXP
    Borland 5.5です。

40デフォルトの名無しさん:2006/07/30(日) 14:59:17
表示されて、一瞬でコマンドプロンプトが閉じてるに一票。
4135:2006/07/30(日) 15:03:50
#include <stdio.h>

int main()
{
int a;
a=10;
printf fflush(stdout);("変数aには%dが代入されています。", a);
return 0;
}

こんな感じやってみたのですが
だめでした.....
42デフォルトの名無しさん:2006/07/30(日) 15:07:30
>>41
おいおいw
それじゃコンパイル通らないんじゃ?
こうだろ?
#include <stdio.h>

int main()
{
int a;
a=10;
printf("変数aには%dが代入されています。", a);
fflush(stdout);
return 0;
}
43デフォルトの名無しさん:2006/07/30(日) 15:10:09
まさかコマンドプロンプトからの実行でなく
エクスプローラで実行ファイルダブルクリックなのかな?orz
4435:2006/07/30(日) 15:10:51
>>40
コマンドプロントは閉じていないと思われます。
その代わりプロントタイプ宣言のない関数printfの呼び出し
という警告がでていますが.....
45デフォルトの名無しさん:2006/07/30(日) 15:13:08
俺はBorland C++ 5.5.1でやってるけど問題なく>>35でいけてるよ
stdio.hをインクルードしてるし、警告も出ない
4635:2006/07/30(日) 15:16:44
>>45
stdio.hをインクルードできてないのですが
どうすればよいのですか?
47デフォルトの名無しさん:2006/07/30(日) 15:17:35
>>46は結果が表示されないうんぬん以前にコンパイルできていないとみたがどうよ?
4835:2006/07/30(日) 15:25:49
>>47
その可能性もあるのでいれなおして見ます。
49デフォルトの名無しさん:2006/07/30(日) 15:26:24
>>48
ちゃんとbcc55のインストール手順に従ってインストールした?
bcc55を展開したディレクトリのreadme.txtに書いてあるはず
たぶんbcc32.cfgとilink32.cfgの設定を忘れてると思う
50デフォルトの名無しさん:2006/07/30(日) 15:34:06
だいたいコンパイル(&リンク)できてるかどうかなんて
実行ファイルの有無で一目瞭然だ
その可能性もあるなんて状況がいまいち分からん
5135:2006/07/30(日) 15:39:30
>>49
その手順は一度やり直してあるので
多分大丈夫だと思います。
52デフォルトの名無しさん:2006/07/30(日) 15:40:10
学校から出た課題なんですが,教えてください。
二次方程式ax^2+bx+c=0 の根を求めるプログラムを作成せよ。

ここまでは思いついたのですが,あと,どのようにすれば良いですか?
#include <stdio.h>
#include <math.h>

double d, x1,x2; int a,b,c;



x1=(-1*b+sqrt(d))/(2*a);
x2=(-1*b-sqrt(d))/(2*a);

この間に何を入れれば良いのでしょうか?
53デフォルトの名無しさん:2006/07/30(日) 15:51:08
scanf
54デフォルトの名無しさん:2006/07/30(日) 15:51:16
>>52
根の公式知ってるなら難しくはないと思われ
a=1;
b=3;
c=2;
d=b*b-4*a*c;
でも虚数解の場合はいらないのかい?
55デフォルトの名無しさん:2006/07/30(日) 15:58:24
>>54
はい。虚数解の場合は良いと思います。ただし,a≠0の場合です。
#include <stdio.h>
#include <math.h>
main(){

double d, x1,x2; int a,b,c;

a=1;
b=3;
c=2;
d=b*b-4*a*c;

x1=(-1*b+sqrt(d))/(2*a);
x2=(-1*b-sqrt(d))/(2*a);
}
こうですか?
56デフォルトの名無しさん:2006/07/30(日) 15:58:38
>>52
課題なら宿題スレに行けばたぶん完全なプログラムを書いてくれるよ
でも、その課題はさんざん既出な気がするよ
57デフォルトの名無しさん:2006/07/30(日) 16:00:33
>>55
基本的にはOK
でも、求めたx1とx2の値を表示する文が最後にほしいかな
58デフォルトの名無しさん:2006/07/30(日) 16:22:08
>>57
ありがとうございます。
具体的にx1とx2の値を表示する文とはどのように表現すれば良いのですか?
a,b,cの値をそれぞれ式に代入することですか?
59デフォルトの名無しさん:2006/07/30(日) 16:29:22
>>58
printf("ax^2+bx+c=0,a=%lg,b=%lg,c=%lg -> x1=%lg,x2=%lg\n",a,b,c,x1,x2);
をreturn文の前に入れておけば?
ってなんだこりゃー
int a,b,c;

double a,b,c;
にするべきかと
60デフォルトの名無しさん:2006/07/30(日) 16:33:02
この場合にはまあうまく答が出てくるけど一般的にするなら係数はintでなくdoubleの方がいいと思う
61デフォルトの名無しさん:2006/07/30(日) 16:39:19
すまん
return文が無かった
x1とx2への代入文の次に>>59のprintfを入れておいて
62デフォルトの名無しさん:2006/07/30(日) 16:41:25
初心者の俺が実況用のブラウザ作る!1!!11!
http://ex16.2ch.net/test/read.cgi/news4vip/1154167137/
まとめ
http://vanbl.blog.shinobi.jp/


現在新しい専ブラを開発中ですプログラミングに詳しい方
>>1にアドバイスをお願いします
63デフォルトの名無しさん:2006/07/30(日) 16:42:51
つまりはこういうことですか?
#include <stdio.h>
#include <math.h>
main(){

double d, x1,x2; double a,b,c;

a=1;
b=3;
c=2;
d=b*b-4*a*c;

x1=(-1*b+sqrt(d))/(2*a);
x2=(-1*b-sqrt(d))/(2*a);
printf("ax^2+bx+c=0,a=%lg,b=%lg,c=%lg -> x1=%lg,x2=%lg\n",a,b,c,x1,x2);

}
64デフォルトの名無しさん:2006/07/30(日) 16:46:15
>>63
まあ警告は出るけどそんなものでしょ
mainは暗黙のうちにintを返す関数とみなされてるから
最後にreturn 0;でも書いておけば警告も無くなると思う
実際実行してみれ
65デフォルトの名無しさん:2006/07/30(日) 16:50:19
>>64
ありがとうございます。
助かりました。
66デフォルトの名無しさん:2006/07/30(日) 19:48:03
#includ <stdio.h>
#includ <math.h>

int main()
{
   double a, b, c, d, x1, x2;

   scanf("%d", &a);
   scanf("%d", &b);
   scanf("%d", &c);

   d = b * b - 4 * a * c;

   if (0 > d)
   {
      return ー1;
   }

67デフォルトの名無しさん:2006/07/30(日) 19:49:48
>>66続き


   else
   {
      *x1 = (-b + sqrt(d)) / (2 * a);
      *x2 = (-b - sqrt(d)) / (2 * a);

      printf("x1 = %f\n", x1);
      printf("x2 = %f\n", x2);
   }

   return 0;
}


多分どこか間違ってると思う。
ってか、宿題ってこんなものでるんだ。f^_^;
知らなかった。
68デフォルトの名無しさん:2006/07/30(日) 20:04:38
>   scanf("%d", &a);
まともに動かないだろ。
69デフォルトの名無しさん:2006/07/30(日) 20:16:48
>>66
#includ > #include
return ー1 > return 1
scanf("%d", &a); 以下double型で宣言されている変数に対して %d > %lf
70デフォルトの名無しさん:2006/07/30(日) 20:18:41
あと>>66-67の全角スペースはここに書くために書いたのかもしれないけど
全角文字はタブー
71デフォルトの名無しさん:2006/07/30(日) 21:05:15
>>68-70
ご指摘ありがとうございます!!
72デフォルトの名無しさん:2006/07/30(日) 21:08:48
そんな時には&nbsp;と普通の半角空白を交互に並べればいい。
73デフォルトの名無しさん:2006/07/30(日) 21:21:24
最終的な全プログラムはどうなりますか? こうですか?
#include <stdio.h>
#include <math.h>

int main()
{
   double a, b, c, d, x1, x2;

   scanf("%d", &a);
   scanf("%d", &b);
   scanf("%d", &c);

   d = b * b - 4 * a * c;

   if (0 > d)
   {
      return 1;
   }
 else
   {
      *x1 = (-b + sqrt(d)) / (2 * a);
      *x2 = (-b - sqrt(d)) / (2 * a);

      printf("x1 = %f\n", x1);
      printf("x2 = %f\n", x2);
   }

   return 0;
}
74デフォルトの名無しさん:2006/07/30(日) 21:24:12
>>73
ですかって、自分でコンパイルして実行してみたの?
else { } 不要、*x1 *x2 前の * も不要
75デフォルトの名無しさん:2006/07/30(日) 21:27:07
>>73
scanf("%d", &a);  < %d を変えていないからエラーが起こる
76デフォルトの名無しさん:2006/07/30(日) 21:41:40
>>74
明日,学校で実行してみます。ご指摘ありがとうございました。
77デフォルトの名無しさん:2006/07/30(日) 21:49:13
>>76
自分のコンピュータにコンパイラを入れてやれいw
78デフォルトの名無しさん:2006/07/30(日) 22:13:25
>>74 これでだいたいおkかな?

#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,d,x1,x2;
scanf("%lf",&a);
scanf("%lf",&b);
scanf("%lf",&c);
d=b*b-4*a*c;
if(0>d) {return 1;}
x1=(-1*b+sqrt(d))/(2*a);
x2=(-1*b-sqrt(d))/(2*a);
printf("x1=%f\n",x1);
printf("x2=%f\n",x2);
return 0;
}
79デフォルトの名無しさん:2006/07/30(日) 22:36:03
>>76
おまえ何回か宿題スレにいたやつじゃないだろうな?
80デフォルトの名無しさん:2006/07/30(日) 22:37:13
complex.hをインクルードして、複素数を扱いたいと思っています。
complex<double> x と書けば、実数部と虚数部がそれぞれdouble型として定義されますよね?
その後、それぞれに任意の値を代入するために、どのようにして各部にアクセスすれば
良いのでしょうか?
x.real、x.imagというようにしてもコンパイルエラーがでました。
↓エラーの内容
「メンバー関数は呼び出すかそのアドレスをとらなければならない」
81デフォルトの名無しさん:2006/07/30(日) 22:50:34
>>80
C++ はスレ違い。
8280:2006/07/30(日) 22:53:42
>>81
失礼しました(汗)
83デフォルトの名無しさん:2006/07/31(月) 12:01:09
#include<stdio.h>
int main()
{
printf("Hello");
return 0;
}

こんな初歩的なプログラムでヘッダファイルの#include<stdio.h>を消して実行してみたら普通に実行できたんだけど・・・
普通に実行できるならヘッダファイルいらなくね?という疑問です。
84デフォルトの名無しさん:2006/07/31(月) 12:08:58
自転車組み立ててみたんだけど、ブレーキつけると巧く動かないから外したら普通に動いたんだけど……
普通に動くんだからブレーキなんて外しちゃってもよくね?
85デフォルトの名無しさん:2006/07/31(月) 12:11:36
言いたいことはなんとなく分かる。
でもなんか納得いかない。
「普通に動くけど、ないとダメな安全装置」って感じなのかな?
86デフォルトの名無しさん:2006/07/31(月) 12:12:36
int main(void)
{
 double d = fabs(-1.5);
 printf("%lf\n", d);
 return 0;
}

とやってみるとわかる。 ヘッダー有り無しで挙動違うから。
87デフォルトの名無しさん:2006/07/31(月) 12:16:09
>>83
printf()ならインクルードファイルなしでも動くけど、
ファイル操作もできなければ数学関数(sinなど)も使えない状態だね。
つまり、たまたま使える関数だけしか使わないのでない限り、標準インクルードファイルは必要。

単に、環境設定に失敗しているだけだろうから、使っている処理系関連のスレで聞いて味噌。
88デフォルトの名無しさん:2006/07/31(月) 12:47:10
>>86
プログラム自体が動かなすorz

逆にさ、#include<stdio.h>がないと正常に動作しねーよ!っていうプログラムって何か無いかな?
例をみないと理解できないよ...
89デフォルトの名無しさん:2006/07/31(月) 12:50:43
>>88
関数()の中身がプロトタイプ宣言されていないとintとみなされ、
戻り値の型もintと見なされるので、それでは都合の悪いプログラム
ならなんでもいいだろう。

int main(void)
{
}
90デフォルトの名無しさん:2006/07/31(月) 12:51:54
間違って改行してしまった。

printf("%f", sin(0.5)); とかね。

プロトタイプ宣言がないと、-1, 0, 1のどれかしか表示されないはず。
91デフォルトの名無しさん:2006/07/31(月) 12:56:39
#include<stdio.h>
int main(){
int i,j;
for(i=1; i<=1000; i++)
j=i+j;
printf("%d \n",j);
return 0;
}

これやって表示される結果の数を教えてください。
92デフォルトの名無しさん:2006/07/31(月) 13:01:30
いや、自分で試せよ
93デフォルトの名無しさん:2006/07/31(月) 13:02:43
いま手元に携帯しかなくて…
お願いします。
94デフォルトの名無しさん:2006/07/31(月) 13:05:05
悪いがオレも携帯なんだ
だがろくでも無い結果になるのはすぐに分かる
jを初期化してないからな
95デフォルトの名無しさん:2006/07/31(月) 13:05:51
そもそも初期化していない変数 j の値を元にする演算結果って不定じゃないのか?
96デフォルトの名無しさん:2006/07/31(月) 13:09:48
500500 + jの初期値
かな
97デフォルトの名無しさん:2006/07/31(月) 13:41:03
>>86
gcc だと math.h の関数の型は
math.h なしでもちゃんと認識される。
98デフォルトの名無しさん:2006/07/31(月) 14:05:45
>>97
暗黙の変換で int 化しないの? (特に引数側
微妙に拡張機能っぽいけど…

# プリプロセスの段階 or PASS1 の段階で math.h に含まれるシンボル比較してるんかな?
99デフォルトの名無しさん:2006/07/31(月) 14:10:27
>>96

あ、初期化してなかった^^;
ありがとうございました。
100デフォルトの名無しさん:2006/07/31(月) 16:14:22
>>98
微妙も何も、紛う方無く拡張機能
101デフォルトの名無しさん:2006/07/31(月) 21:45:20
つうか初心者の為にも警告して欲しいね
102デフォルトの名無しさん:2006/07/31(月) 22:11:08
どなたかすいませんが、ストリームの意味を正確に具体的にわかりやすく教えてください。
なんとなくはわかるし、コードを書くうえでも別に困りませんけど、参考として知りたいんです。

ぐぐっても「川の流れのようなものです」とか抽象的な解説しか出てきませんでした。
103デフォルトの名無しさん:2006/07/31(月) 22:16:49
流しそうめんの様なものかと

半分に割った竹の筒の中をバイト列がさらさらと流れます
104デフォルトの名無しさん:2006/07/31(月) 22:20:23
>>103
その竹筒は実際はなんなんですか?メモリ領域ですか?
105デフォルトの名無しさん:2006/07/31(月) 22:22:15
Cに関して解らない事があればココ訪れる、よろし。
http://l.huu.cc
管理人が質問に何百行も答えてるww
106104:2006/07/31(月) 22:37:13
すいません、書き忘れましたが、ファイル入出力に関しての話です。
107デフォルトの名無しさん:2006/07/31(月) 22:39:21
>>104
あくまで概念です

実際はシステムが適当にバッファリングして
適当にフラッシュしてディスクに書き込みます
108104:2006/07/31(月) 22:47:00
では、ストリームのアドレスと言うとどういう意味になるんでしょうか?
109104:2006/07/31(月) 23:12:51
ちょっと自分なりに考えて図にしてみました。
ttp://www.rupan.net/uploader/download/1154355021441513.8jmkZu

↑こういう理解でよろしいんでしょうか?
110デフォルトの名無しさん:2006/08/01(火) 00:07:32
>>88
FILEやsize_tを使うもの。
それかコンパイラ変えろ。
111デフォルトの名無しさん:2006/08/01(火) 00:12:07
ヘッダーがない場合、たとえ動いてもコンパイル時に警告がでるでしょう。
オレは基本的に警告は出ないようにすべきだと思っているので気持ち悪い。
おまいら警告が出ても平気なのか?
112デフォルトの名無しさん:2006/08/01(火) 00:15:58
C99からプロトタイプ必須になってなかったっけ。
113デフォルトの名無しさん:2006/08/01(火) 02:35:06
兵器
114デフォルトの名無しさん:2006/08/01(火) 05:28:57
等比数列 a, ar, ar^2, ar^3,・・・,ar^nについて a,r,nを与えて、
総和を求めるプログラムをよろしくお願いします^^
115デフォルトの名無しさん:2006/08/01(火) 05:54:10
116デフォルトの名無しさん:2006/08/01(火) 21:52:12
教えてください。
普通のCとVCって何か違うんでしょうか?

今日、「Cはやったことがあります」と言ったら、「やってもらうのはVCだからねえ・・・」と反応されました。
両者に違いがあるってことですか?
117デフォルトの名無しさん:2006/08/01(火) 21:53:43
>>116
ぜんぜんとは言わんが、明らかに名前からして違うやろ・・・
CはVC++の基本部分はあるけど
118デフォルトの名無しさん:2006/08/01(火) 22:04:20
>>117
えっ・・・具体的に何が違うんでしょうか?
調べたけど何が違うんだかわからないんです。
119デフォルトの名無しさん:2006/08/01(火) 22:19:13
>>118
だいたい、CとC++ってところで既に違うのだが
調べたって何をどうやって?実際に使ってみれば違いなんて分かるだろ
人に聞いて、言葉だけじゃ自分が理解できないことなんていくらでもあるだろ
論より証拠、自分で試せ
120デフォルトの名無しさん:2006/08/01(火) 22:25:25
>>119
スレタイ100回読んで出直せ
121デフォルトの名無しさん:2006/08/01(火) 22:28:52
>>120
オマエガナー
122デフォルトの名無しさん:2006/08/01(火) 22:29:13
C VC++ 違い
で検索したら説明サイトがあったぞ
123デフォルトの名無しさん:2006/08/01(火) 22:32:18
>>116
★初心者にVisual C++を教えるスレ★ Part23
http://pc8.2ch.net/test/read.cgi/tech/1140711893/

とにかく使え。それからVCなんて言語は俺は知らん
C言語で得た知識は使えるが、C++の言語の仕様について
新たに勉強する必要もある。オブジェクト指向についても理解できないと
後々苦労するけどな
124デフォルトの名無しさん:2006/08/01(火) 22:58:15
>>116
VCとはVisual C++の略称だが、
Visual C++とは、MicrosoftのC/C++コンパイラとIDEその他のツールなどをセットにした製品のこと。
そして、「Visual C++が使える」と言えば、ATLやMFCなどのVC特有のライブラリ・独自機能を使えると言う意味合いが強い。
125デフォルトの名無しさん:2006/08/03(木) 00:11:57
>>116
もげー
126デフォルトの名無しさん:2006/08/04(金) 02:47:37
「Cが使える」は「VCがつかえる」に内包される。
ただし両者の知識量には数十から数百倍の隔りがある。
127デフォルトの名無しさん:2006/08/05(土) 10:59:34
VCが使えるからといってCが使えるとは限らない。
128fg:2006/08/05(土) 12:16:39
線形リストにおいて
pがさしている節を消すには
その前のポインタをpのポインタがさす節にすればいいのだけど
pがさしている節の前の節をpであらわすのはどうすればいいのですか?

129デフォルトの名無しさん:2006/08/05(土) 13:25:49
dequeにする。
130デフォルトの名無しさん:2006/08/05(土) 14:17:29
最近C言語やりはじめた。Visua lC++ 2005 Express Edition使ってます。
10進数から2進数に変換するプログラム作ったのですがエラーが出てしまいます。
どこがエラーか考えてもわからないのでヒントをください。

#include<stdio.h>
void main(void){
int x;
int *y;

y=&x;
scanf("%d",&x);
while(x>0){
y++;
*y=x%2;
x=x/2;

}
while(y!=&x){
printf("%d",*y);
y--;
}
}
131デフォルトの名無しさん:2006/08/05(土) 14:18:59
ヒントはエラーメッセージ。
132130:2006/08/05(土) 14:19:24
実行したら一応結果が出るのですがそのまま終了せず、
エラーがでてしまいます(>_<)
133デフォルトの名無しさん:2006/08/05(土) 14:20:56
問題が発生したため、10sin-2sin.exeを終了します。ご不便をおかけして申し訳ありません。

と出ます(><)
134デフォルトの名無しさん:2006/08/05(土) 14:23:50
yをどこからかっぱらってるんだって話だな。
xのいる位置を間借りしてるから、最初のループでメモリぶっ壊しまくり。

int *y;
y=&x;


int y[128];

にでもしたら。
ついでに

while(y!=&x){

は終了条件として使い物にならなくなるので、
yを書き進めた回数は別の変数にカウントしなさいな。
135デフォルトの名無しさん:2006/08/05(土) 16:18:38
%7.3fと来ると、どういう感じに処理するっすか??
未だにようわからんorz
136デフォルトの名無しさん:2006/08/05(土) 16:24:44
整数7桁少数3桁を表示
137デフォルトの名無しさん:2006/08/05(土) 16:35:02
トンクス。。
138デフォルトの名無しさん:2006/08/05(土) 16:49:31
>>135
printf()系の書式指定の話なら、そのまま「%7.3f」と出力される。
これが"%7.3f"ならば、小数部3桁固定、全体最低7桁(カラム)で出力される。
従って、>136は二重に間違い。
139デフォルトの名無しさん:2006/08/05(土) 16:50:25
揚げ足取りだとは思うが、ここ入門スレだしなー。
素で間違えてる可能性があるから、怖いといえば怖い。
140デフォルトの名無しさん:2006/08/05(土) 18:41:49
JavaとかC++とかのイベント発生時のコールバックエントリしか宣言しない
リスナークラスみたいなのをCで実装するとしたらどうすればいいの?
関数ポインタ使うのが一般的?
141デフォルトの名無しさん:2006/08/05(土) 18:45:22
YES

リスナーとは違うけど、qsortや、bsearchでファンクションポインタを渡しているアレ。
142デフォルトの名無しさん:2006/08/07(月) 11:26:31
>>128
・次の要素が p となる要素 q を自前で探す。
 for (q=...; q!=p; q=q->next) ;

・逆連結なリスト構造(= deque) にする。
 struct foo { struct foo* prev; void* element; };

・双方向リストにする。
 struct bar { struct bar* prev; struct bar* next; void* element; };

好きなの選べ
143デフォルトの名無しさん:2006/08/07(月) 11:30:07
おっと間違えた。
 for (q=...; q->next != p; q=q->next) ;
だわ
144初心者:2006/08/07(月) 14:46:50
すみません、教えでください。
二つの数列がある。A数列の一部数をB列に入れて新しい数列を作るつもりで
例:
char hh[8]="sdfsddf";
char kk[6];
kkにhhの3,4,1,5,6番目の文字を入れる方法は??
入れる文字は無関係、順番が重要!!
145デフォルトの名無しさん:2006/08/07(月) 14:48:38
>>144
sprintf(kk, "%.2s%c%.2s", & hh[3], hh[1], & hh[5]);
146初心者:2006/08/07(月) 15:04:28
>>145
早く返事してありがとうございました!
試します。
147デフォルトの名無しさん:2006/08/07(月) 20:26:17
1番目ってもしかしてhh[0]?
148デフォルトの名無しさん:2006/08/07(月) 22:38:39
サンプルを元に、手入力してソースファイルを作り、コンパイルしようとすると文法エラーになります。
デバックしてみると、printf関数で読点「、」など特定の文字が入ってるとエラーになるようです。
原因と解決策わかる方お願いしますm(__)m

環境ですが
OS:Vine Linux 3.3.2-0v18
コンパイラ:GCC 3.3.2 20031218
ファイル形式:EUC-JP となっております。
149デフォルトの名無しさん:2006/08/08(火) 00:16:55
>>148
サンプルとはいったい何のこと?
150デフォルトの名無しさん:2006/08/08(火) 02:36:21
そしてエラーとは何のエラー?
情報を小出しにするのはアカンよ
151デフォルトの名無しさん:2006/08/08(火) 22:39:44
CでJavaのinvokeみたいに関数名指定して実行するような方法ありますか?
152デフォルトの名無しさん:2006/08/08(火) 22:55:35
そういうスタートアップを作ればできます。
#既にあるかどうかはしらね。
153デフォルトの名無しさん:2006/08/09(水) 00:52:36
DLLとかの呼び出しはそんな感じだけど、標準の手段は無いはずだよ。
しかし妙なものを欲しがるな。
154デフォルトの名無しさん:2006/08/09(水) 02:06:40
質問させて下さい。
自分はC言語の初心者なんですが、演習問題や
プログラムをやって力をつけたいと思ってます。
自分で調べて柴田望洋さんの「解きながら学ぶC言語」
がいいかなと思いましたが他にもお勧めの書籍ありますか?
わかりやすく丁寧に書かれている本を探しているのですが‥
155デフォルトの名無しさん:2006/08/09(水) 10:39:46
Cならこれが一番わかりやすいと思います。

「プログラミング言語C(第2版)」(B. W. カーニハン, D. M. リッチー著)
共立出版
156デフォルトの名無しさん:2006/08/09(水) 20:02:13
漏れは始めてのCで育ったけどなあ。
まあ漏れはあるけど一通りやってみて、ANSI Cとかの本に手をつけてみるといいと思うよ。
手っ取り早くならいきなりANSI Cでもいいけど多分何回で理解出来ないと思う。

はじめてのCだけで、終わるのは勧めない。

そもそもeucで句読点がどんなコードで表現されるか調べてみればいいのに。
157デフォルトの名無しさん:2006/08/09(水) 20:54:35
>>155
ありがとうございます!
すぐに本屋で買ってきてしっかり勉強します。
158デフォルトの名無しさん:2006/08/11(金) 21:20:18
ボードゲーム作っていて
あるセルの周りにある値が1のセルを数えようと思ってるんですけど

field[50][50]でボード作っていてsumに数えた値をいれるとして
for(i=0;i<50;i++){
for(j=0;j<50;j++){
if(i!=0&&j!=0)      if(field[i-1][j-1]==1)sum++;
if(i!=0)         if(field[i-1][j]==1)sum++;
if(j!=50&&i!=0)     if(field[i-1][j+1]==1)sum++;
if(j!=0)         if(field[i][j-1]==1)sum++;
if(j!=50)        if(field[i][j+1]==1)sum++;
if(i!=50&&j!=0)     if(field[i+1][j-1]==1)sum++;
if(i!=50)        if(field[i+1][j]==1)sum++;
if(j!=50&&i!=50)     if(field[i+1][j+1]==1)sum++;
}}

でやると端のセルだけうまく数えられません
だれかアドバイスください
159デフォルトの名無しさん:2006/08/11(金) 22:05:23
バッファを(サイズ+2)*(サイズ+2)作れば楽
160デフォルトの名無しさん:2006/08/11(金) 23:08:51
>>158
値が1のセルの内、周りにその「あるセル」がある場合のみ、数えればいいんでない?
161デフォルトの名無しさん:2006/08/12(土) 04:56:50
ポインタでわからなくなりました。

int func(int *x)
{
x = (int *)malloc(100);
return 0;
}

int main()
{
int *x = NULL;
func(x);
return 0;
}

funcでメモリ確保して、ポインタを引数で返したいのですが、
上だとうまくいきません。
どうやったらいいのでしょうか?

162デフォルトの名無しさん:2006/08/12(土) 05:19:52
int func(int **x)
{
 *x = ...
}
163デフォルトの名無しさん:2006/08/12(土) 05:24:57
funcでreturn x
mainでx=func()
164デフォルトの名無しさん:2006/08/12(土) 05:34:11
>>162
うまくいきません。

>>163
戻り値でなく引数でほしいのですが・・・
165デフォルトの名無しさん:2006/08/12(土) 05:39:30
うまくいくよ
166デフォルトの名無しさん:2006/08/12(土) 05:47:59
>>165
こうですか?

int func(int **x)
{
*x = (int *)malloc(100);
return 0;
}

int main()
{
int **x = NULL;
func(x);
return 0;
}

これだとビルドはできますが、実行するとmallocで死にます。
167デフォルトの名無しさん:2006/08/12(土) 06:00:03
func(&x)

Cは常に値渡し。
168デフォルトの名無しさん:2006/08/12(土) 06:01:52
C++なら参照渡しが出来るから、func(int *& x){}にfunc(x)で受け取れる。
でも、もしC++なら、mallocじゃなくてnewにしようね。
169デフォルトの名無しさん:2006/08/12(土) 06:30:20
またおかしな事ばかり教えて。

int **xにしたら、*xはどこを指しているんだ?ちゃんと初期化してから
渡さないとまた未定義の動作だぞ。
170デフォルトの名無しさん:2006/08/12(土) 07:24:03
なにが初期化だよ。
初期化して渡せば大丈夫だと?
どんな値で初期化するんだ?

引数に渡される値を変更するなら
最初から>>167みたいな使い方以外に無いだろうに。

標準関数のstrtol等だって、普通にそういう使われ方されてるだろ。
171デフォルトの名無しさん:2006/08/12(土) 07:36:40
そうじゃなくて、int **x = malloc(100);にどういう意味があるかと
聞いてるんじゃないか?まあint **x = malloc(25 * sizeof(int *));
のような物なら意味がありそうだが。
172デフォルトの名無しさん:2006/08/12(土) 08:03:07
そんなの知るかよ。

元の質問が>>161だろ?
で、さらに>>164と言ってるんだから
引数に渡した呼び出し側の変数の値を変更したい、としか
俺には見えないけどね(Cでは出来ないけど)。
それが偶然ポインタ変数だから、ポインタのポインタを使うというだけ。

だいたい、
int **x = malloc(100); // 引数とは別の変数を宣言した上で代入?
なんてコード、main()内にもfunc()内にも出てこないけど、
どこから出たんだい?
100という数字の意味なんて、>>161以外知らないし。
173デフォルトの名無しさん:2006/08/12(土) 08:04:47
>>171
お前は一体何を言ってるのだ?
174デフォルトの名無しさん:2006/08/12(土) 08:06:10
>>167
int *x;
func(&x);

まで書かないと、馬鹿がたかってくるようだぞ。
175デフォルトの名無しさん:2006/08/12(土) 11:25:47
int **x = NULL;
*x(**x[NULL]のアドレスが指してる*x型の場所) = 右辺; ← ×

NULLという数値(アドレス)を参照or間接代入するのは危険です
JavaでいうNullExceptionと同じです
なので>>174のように書いてください
176デフォルトの名無しさん:2006/08/12(土) 17:33:07
C言語やる前にアルゴリズムの勉強のほうが先じゃね?
英語習ったけど、ネィティブの言い回し知らないから書けないって状態。
177デフォルトの名無しさん:2006/08/12(土) 17:39:54
>>176
書けない理由はそこには無い
178デフォルトの名無しさん:2006/08/12(土) 19:08:51
アルゴリズムがどうこう言う以前に、計算機のアーキテクチャを
多少は知っておくべきだろうしなー
配列とポインタについてくらいは、それなりに理解しておかないと
そっちの勉強だって先に進められなくね?
179デフォルトの名無しさん:2006/08/12(土) 20:02:39
>>128
なにがしたいのかイマイチわかってないが、リストからpを消してつなぎかえる
だけなら必ずしもprevのポインタを構造体に用意する必要はない。
q0がリストの先頭として、

for (q = q0; q && q != p && q->next != p; q = q->next);
if (q) {
q->next = q->next->next;
free (p);
}

q!=pはq0がpであるときの用心。
180デフォルトの名無しさん:2006/08/12(土) 22:07:09
VisualStudio2005って
fopenの記述以外に、更にどこか変わったんですか?(2003ユーザです)
//C言語の話です。。
181デフォルトの名無しさん:2006/08/12(土) 22:08:54
MSDNも読めないやつは帰れ
182179:2006/08/12(土) 22:52:54
for (q = q0; q && q != p && q->next != p; q = q->next);
if (q) {
if(q->next) q->next = q->next->next;
free (p);
}
に訂正しときます。
183デフォルトの名無しさん:2006/08/12(土) 23:44:03
>>166
すでに議論は終わってるけど、ひょっとして混乱してるといけないので清書。
void
func (x)
int **x;
{
*x = (int*) malloc(sizeof(int)*100);
return;
}

int
main()
{
int *hoge;
func(&hoge);
return 0;
}
184デフォルトの名無しさん:2006/08/12(土) 23:49:20
>>183
つまんないよ
185デフォルトの名無しさん:2006/08/13(日) 00:04:39
これはひどい
186161:2006/08/13(日) 00:40:35
皆さん、ありがとうございます。
今、帰省中のため、ビルドして確認できませんが、とても勉強になりました。
int
187161:2006/08/13(日) 00:41:58
皆さん、ありがとうございます。
今、帰省中のため、ビルドして確認できませんが、とても勉強になりました。
int *x
188デフォルトの名無しさん:2006/08/13(日) 00:53:42
>>183 こりゃまたえらくなつかしい書き方だなおい
189デフォルトの名無しさん:2006/08/13(日) 01:46:58
func (x)
int **x;


懐かしすぎてなんか泣けてきた。
190183:2006/08/13(日) 02:35:31
引数多い場合は古い書きかたの方が見やすいんですよね。
func(struct hoge1 x, struct hoge1 *y, struct hoge2 *hage1, struct hoge2 hage2, struct hoge1 z)
より
func(x,y,hage1,hage2)
struct hoge1 x, *y, z;
struct hoge2 *hage1, hage2;
のほうがいいかんじ。
で、引数少ない場合でもこう書いてます。
191デフォルトの名無しさん:2006/08/13(日) 02:38:38 BE:314515679-2BP(201)
>>190
上の書き方で、改行を入れるのが普通だね。
192デフォルトの名無しさん:2006/08/13(日) 02:40:01
露骨に否定されてる書き方のはずなんだが、
今でもこれで書く人っているんだなあ。
自分じゃようやらんが、言ってることはまあ同意。
193デフォルトの名無しさん:2006/08/13(日) 02:42:44 BE:279569287-2BP(201)
古い書き方すると、型チェックが効かないんじゃないの?
(プロトタイプを書いとけば大丈夫なのか?)
194デフォルトの名無しさん:2006/08/13(日) 03:09:08
>>192
Rubyは今でもK&Rですよ。
以前、ANSIスタイルにしろといちゃもんつけてた人がいましたが、
華麗に却下されました。
195デフォルトの名無しさん:2006/08/13(日) 03:14:54
ここはC言語スレだがな!
196デフォルトの名無しさん:2006/08/13(日) 05:04:40
func(
 struct hoge1 x,
 struct hoge1 *y,
 struct hoge2 *hage1,
 struct hoge2 hage2,
 struct hoge1 z)

で十分。
右にコメントも入れられるし。
197デフォルトの名無しさん:2006/08/13(日) 09:46:49
int main(argc,argv)
register int argc;
register char **argv;
{
  /***/
  return 0;
}

たしかカルガリーコーパスのソースってこんな感じだった気がする。
198デフォルトの名無しさん:2006/08/13(日) 10:10:08
void func(foo)
float foo;
{
printf("%s\n", sizeof(foo) != sizeof(float) ? "differ" : "identical");
}
と書くと、differと出力されるコンパイラもあった。
199デフォルトの名無しさん:2006/08/13(日) 14:16:49
な、なんじゃそりゃー!
200デフォルトの名無しさん:2006/08/15(火) 12:14:21
>>198
昔のSunOSのccがそうだったかもしらん。
要は、スタックにfloatを積む手段がないからだな。
どうせならエラーにしてくれれば良さそうなのにね。
201デフォルトの名無しさん:2006/08/15(火) 15:23:25
malloc使うのにstdlib.hは要る?(C)
202デフォルトの名無しさん:2006/08/15(火) 15:35:46
Cならなくてもなんとかなる。
でもインクルードはしておいた方がいい。
203デフォルトの名無しさん:2006/08/16(水) 00:13:59
返信遅れましたが、どうも有難うございます。。
無くても動くのですね・・
204デフォルトの名無しさん:2006/08/16(水) 02:23:40
こういうことを言う人が出てくるから無くてもなんとかなるなんて言っちゃ駄目
205デフォルトの名無しさん:2006/08/16(水) 10:40:13
Q「街中を歩くのに何か着るものは要る?」
A「局部が隠れれば何とかなる。でも着ておいた方がいい。」
206デフォルトの名無しさん:2006/08/16(水) 10:49:44
>>205
どうも有難うございます。。
局部が隠れれば何とかなるんですね・・
207デフォルトの名無しさん:2006/08/16(水) 11:08:47
ういうことを言う人が出てくるから隠れればなんとかなるなんて言っちゃ駄目
208デフォルトの名無しさん:2006/08/16(水) 13:00:43
つまらん。
209デフォルトの名無しさん:2006/08/16(水) 15:11:06
int main(argc,argv)
register int argc;
register char **argv;
{
  /***/
  return 0;
}
この書き方だとVC2005でエラーにならない?
210デフォルトの名無しさん:2006/08/16(水) 23:32:24
>>200
つまり、foo は float と書いてるけど
int (おそらく2バイトな環境だよね?)になるってことか?
211デフォルトの名無しさん:2006/08/17(木) 01:00:49
環境によってビット数が違うのがCの欠点でもあり長所だな。
ビット数を考慮したプログラミングすればいいだけだが。

Cってアセンブラに近いからアーキテクチャ知らないと困ることに成るね。
厳密にはコンパイラの仕様つーかどういうコードを吐くかぐらいは考慮しないと嵌る。
元々、OS作るために作られた泥臭い言語だしな。
212デフォルトの名無しさん:2006/08/17(木) 01:05:10
>>211
全然そんなこと無い
213200:2006/08/17(木) 01:14:04
>>210
いや、SunOSの場合はdoubleと認識していたようだ。
呼び出し側でfunc((float) 3);としてもdoubleの値が積まれるから、
関数側でもdoubleで受ける必要があるんだろうね。
214デフォルトの名無しさん:2006/08/17(木) 01:21:44
>>209
VCのせいっつーか、その書き方はプロトタイプ宣言のなかったANSI以前のCのものなんで、
C89以降のコンパイラに対応していたものがあったのは移行期間に対する配慮って奴で、
言ってしまえば単なるお義理。
現在のC、ましてやC++コンパイラでエラーが出てもコンパイラたんのせいじゃないと思われ。
215デフォルトの名無しさん:2006/08/17(木) 01:38:18
いや、Cとしてコンパイルしてエラーが出たのでは規格違反。
216デフォルトの名無しさん:2006/08/17(木) 01:44:52
そうだっけ?
217デフォルトの名無しさん:2006/08/17(木) 02:06:11
そうだよ。

C++ならエラーにならなくちゃいけないけど。
218デフォルトの名無しさん:2006/08/17(木) 02:26:33
registerの話じゃないのか?
219デフォルトの名無しさん:2006/08/17(木) 02:33:37
いや、それは有っても無くても。
220デフォルトの名無しさん:2006/08/17(木) 02:35:14
int main(int, char**)
{
return 0;
}


むしろこれなら通るな
だからどうだってわけじゃないが
221デフォルトの名無しさん:2006/08/17(木) 08:26:22
>>220
C++では、そのように関数の定義時にも、仮引数名の省略が可能。
222デフォルトの名無しさん:2006/08/17(木) 17:26:30
>>213
あー、なるほど。
223デフォルトの名無しさん:2006/08/17(木) 21:49:52
>>209
1>------ ビルド開始: プロジェクト: register, 構成: Debug Win32 ------
1>コンパイルしています...
1>register.c
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>ビルドログは "file://c:\src\tmp\register\Debug\BuildLog.htm" に保存されました。
1>register - エラー 0、警告 0
========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ==========

釣られた?
224デフォルトの名無しさん:2006/08/17(木) 22:32:42
カルガリーコーパスってこれな
ftp://ftp.cpsc.ucalgary.ca/pub/projects/text.compression.corpus/

で、>>197>>209はオリジナルと比べてお行儀が良すぎる。
ftp://ftp.cpsc.ucalgary.ca/pub/projects/text.compression.corpus/progc
225デフォルトの名無しさん:2006/08/17(木) 23:40:27
>>223
.cppにすると通らないよ。
.cならCの文法で通る。
226デフォルトの名無しさん:2006/08/18(金) 01:15:13
ほんとだ。int main(register int argc, register char **argv)なら問題ないのな。
registerは釣り要素だったのねん
227デフォルトの名無しさん:2006/08/20(日) 02:00:04

最近Cをはじめて、webとかで公開されてるコード
漁って学習してたんですが、↓のコードの書きかたって
microsoftのコンパイラでビルドできます?

void LogToFile (char *, char *);

というかchar *の部分がよく分からないです・・・
228デフォルトの名無しさん:2006/08/20(日) 02:17:14
>>227
>microsoftのコンパイラでビルドできます?
できる。

>というかchar *の部分がよく分からないです・・・
仮引数名を省略した書き方。
自分で関数宣言する場合は、この書き方はお勧めできない。(宣言と定義(実装)は、コピペするほうがいい)
229デフォルトの名無しさん:2006/08/22(火) 23:55:39
 C言語のソースってよくネット状に転がっていると
聞きますが、どうやって調べたらいいんですか。
例えば、一つ例を教えて下さい。
画像処理について。
230デフォルトの名無しさん:2006/08/23(水) 00:24:26
いや、普通に転がってはいるけど網状にはなってないんじゃないか?
231デフォルトの名無しさん:2006/08/23(水) 01:17:13
ん、オープンソースって奴ですかな
232デフォルトの名無しさん:2006/08/23(水) 01:21:29
ぐーぐれ
233デフォルトの名無しさん:2006/08/23(水) 08:23:53
すんません、質問です。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2619.txt
↑のプログラムなんですけど
if(strcmp(buff,"text") == 0)
ってのが真にならないので困ってます。
ナル文字の前に絶対に10"ロ"ってのが入るんですけど
これが原因と思うんですけどコレなんでしょうか?

Script.txtの中はこんな感じです。

text
「誰もが自分の選んだ運命や偶然与えられた運命に満足せず、
他の道を歩んだ人々を羨むのはどういうわけだろう。」
.
234233:2006/08/23(水) 08:26:00
すいませんif(strcmp(buff,"text") == 0)じゃなくてif( i == 0 )です。
235デフォルトの名無しさん:2006/08/23(水) 08:41:24
>>233
fgets()は行末の改行を落とさない。
従って、自分でそれを取り除くか、ファイル末尾の問題がないなら"text\n"と比較すればよい。
236233:2006/08/23(水) 08:51:25
>>235
ありがとうございます。後者の方法で上手くいきました。
あと自分で取り除くって言うのは具体的にはどうやるんでしょうか?
改行の部分にナル文字を代入するとかでいいんでしょうか?
237デフォルトの名無しさん:2006/08/23(水) 09:00:36
chop


画像処理しているソフトを探す。
オープンソースかどうか調べる。
C言語のソース発見。ウマー!
238デフォルトの名無しさん:2006/08/23(水) 12:38:53
>>230
わろすw
239デフォルトの名無しさん:2006/08/23(水) 16:11:10
あれナル文字って読むのか!?
240デフォルトの名無しさん:2006/08/23(水) 16:38:39
結果をファイルで出力すると通常、実行したプログラムが
おいてある場所に作成されると思うんですけど、別のフォルダ
に出力したいときはどんな風に書けばよいのでしょうか?
例えば下のようなtest.txtファイルを出力する場合です。
fp = fopen("test.txt", "w");
知っている方がいたら教えてください。
241デフォルトの名無しさん:2006/08/23(水) 16:45:27
fp = fopen("subdir/test.txt", "w");
fp = fopen("subdir\\test.txt", "w");
242240:2006/08/23(水) 17:08:53
>241
ありがとうございました!
243デフォルトの名無しさん:2006/08/24(木) 08:25:15
>>236
fgets()の後に
char * p = strchr(buff, '\n');
if (p) * p = '\0';
244デフォルトの名無しさん:2006/08/25(金) 15:08:24
ポインタで躓いてます。以下のやると、b[3]まで出力されちゃうんですが
なぜなんでしょう。よろしくお願いします。

#include <stdio.h>
int main(void) {
char *a = "abcde";
char b[3] = "fgh";
while (a != "\0") {
printf("%s\n", a);
*a++;
}
}
245デフォルトの名無しさん:2006/08/25(金) 15:51:32
>>244
whileの条件がおかしいので、プログラムが暴走している。
while (*a != '\0')
246デフォルトの名無しさん:2006/08/25(金) 15:59:11
>>244
while (a != "\0")だが、
a ...文字列abcde\0の先頭アドレス
”\0" ...文字列\0\0の先頭アドレス
中身じゃなくてアドレスを比較してるよ
だから>>245

こんな指摘の仕方はダメデスカ?
247デフォルトの名無しさん:2006/08/25(金) 16:16:36
>>245-246
ありがとうございました。
aはアドレスなんですね。*aがそれの指す文字列と。
"\0"はアドレスになるんですか?あ、本当だ。
*a != "\0"
でやったら、
array.c:5: warning: comparison between pointer and integer
て出ました。だんだん分かってきたかなぁ。
一度分かったと思ってもすぐ分かんなくなるのがCのポインタ;(^^);
248デフォルトの名無しさん:2006/08/25(金) 21:34:53
プログラムの中で別のプログラムを実行する方法を
教えてください。a.cというプログラムの中でb.cという
プログラムを実行したい、という感じなのですが…
249デフォルトの名無しさん:2006/08/25(金) 21:41:10
#include ?
eval 相当@perl のことなのかな…
system() / exec() あたりだと思うけど
250248:2006/08/25(金) 21:55:49
>249
ありがとうございます。
systemを使うのは何となく分かってるんですけど
実行したいプログラム、b.cというファイルを
どこにどうやって書けばいいのかがわからないのです。。
251デフォルトの名無しさん:2006/08/25(金) 21:56:40
>>249
そこまでのことではなく、b.cに書いた関数をa.cの中から呼び出したいとかもっと単純ななことでは?
252デフォルトの名無しさん:2006/08/25(金) 22:17:11
でもそれがわからないなら、こういうとこで断片的な質問するより
入門書を一冊読んだ方がいい気がする
253デフォルトの名無しさん:2006/08/26(土) 00:00:24
体系的に学ぶのって重要だからね。特に言語は。


英語だっていきなり文法覚えても使えない。
こういう時はこう表現とか体系的に覚えないと役に立たない。

b.cが正しいかどうかチェックして実行しないと権限とられるよ。

一度分かったと思ってもすぐ分かんなくなる=分かったと思い込んでるだけ。
ちょっと応用やってみれば分からなくなるから、分かってないのはすぐ分かる。

null=ナル?
254デフォルトの名無しさん:2006/08/26(土) 01:18:56
これからCを独学で始めようと思うのですが、
お勧めの本を教えてください。
書店に行ってもたくさんありすぎてどれを選べばよいのか分かりません。
255デフォルトの名無しさん:2006/08/26(土) 01:37:44
プログラミング言語C++マジおぬぬめ。
256デフォルトの名無しさん:2006/08/26(土) 15:06:17
どういう環境(ウィンドウズとか)でどういう目的(フリーソフトを作りたいとか、単なる趣味とか、組み込み系の仕事のためとか)で学ぶかにも寄る。

ちょっと読んでみて、理解しやすい本を選べばいいと思うよ。
何冊か読んでみて、書評付きでここに晒してどうよと訊くと、いろいろ突っ込み入っていいかとおもう。
まあ全部買えとも言われるだろうけど(w

近所の図書館でもC言語の本ぐらいあると思うから、借りてきてじっくり読んでみるのもいい。
結局は、たくさん本を読めばそれだけ知識が得られるので、1冊でC言語は完璧みたいなのは期待し過ぎ。
東大生の頭で理解しやすい内容の書籍と、私立大生の頭で理解しやすい内容の書籍は違うし。
それぞれ、しょーもない説明にページ割き杉とか、難しくて理解出来ないとか感じ方も違う。
257デフォルトの名無しさん:2006/08/26(土) 16:32:41
258デフォルトの名無しさん:2006/08/26(土) 17:53:33
C言語のことで質問なんだが
コンパイルしてEXE作って実行すると
コマンドプロンプトが出てくるんだが
一瞬しか出てこない
この文章でわかったら教えてください
259デフォルトの名無しさん:2006/08/26(土) 17:56:02
環境がわからんがとりあえずファイルの先頭に
#include<conio.h>
って書いてmain関数の最後のほうに
getch();
とでも書いてみては?
260デフォルトの名無しさん:2006/08/26(土) 17:57:10
わかったやってみる
>>259d
もしできなかったらもう一度来ていい?
261デフォルトの名無しさん:2006/08/26(土) 17:58:16
(゚з゚)イインデネーノ?
262デフォルトの名無しさん:2006/08/26(土) 18:04:03
#include <stdio.h>

void main()
{
  printf( "好きなことを書きましょう" );
}
サイトに書いてあったやつでこんな感じでやったら
コンパイルのときエラーが返って来る
どこが違うかわかる?
263デフォルトの名無しさん:2006/08/26(土) 18:05:30
>>258
コンソールアプリをGUIから実行してるとかそういうこと?
コマンドライン立ち上げてコマンドから叩いて実行するとか、
テスト用bat書いて、実行後にpauseさせるとかって手もあるよ。
こっちなら王道っつーか、再コンパイルイラネーよ。
264デフォルトの名無しさん:2006/08/26(土) 18:07:08
>>263
俺がやってる環境書く
265デフォルトの名無しさん:2006/08/26(土) 18:08:11
>>262
printfの前の空白が全角スペースとか。
266デフォルトの名無しさん:2006/08/26(土) 18:08:43
BCC Developer

Borlandの組み合わせでやってる
267デフォルトの名無しさん:2006/08/26(土) 18:09:45
>>265
dエラー起きなかった
268デフォルトの名無しさん:2006/08/26(土) 18:10:55
#include <stdio.h>

void main()
{
printf( "好きなことを書きましょう" );
}
今こんな感じなんだが
一瞬しか出ない
どこに手を加えれば?
269デフォルトの名無しさん:2006/08/26(土) 18:14:00
>>268に追記
長くコマンドプロンプトを表示するためには
270デフォルトの名無しさん:2006/08/26(土) 18:19:39
>>258
ダブルクリックして実行するのではなく、
コマンドプロンプトの中で実行させろ。
271デフォルトの名無しさん:2006/08/26(土) 18:22:14
>>268
おまいさん、もうちっと考えてから書き込んだ方が良いぞ。
あと、プログラミングってのは、自分だけでどれだけ調べて試行錯誤したか、で
先行きが決まると言っても良い。
あとは、Cを使うなら、IDE環境使わずにコマンドラインに慣れた方が、
いろいろと理解が深まるぞ。

ちなみに、getch()するなら、こんな感じ。
俺もbcc32使いなんで、bcc32で確認済み。

#include <stdio.h>
#include <conio.h>

void main()
{
printf( "好きなことを書きましょう" );
getch();
}

まぁがんがれ。
272デフォルトの名無しさん:2006/08/26(土) 19:11:29
>>271−270
返事遅れてすまん
ありがd
がんがってみるよ
273デフォルトの名無しさん:2006/08/26(土) 19:12:53
>>270
コマンドプロンプトからの実行が前提のアプリなんざ
windowsでは受け入れられない現実
274デフォルトの名無しさん:2006/08/26(土) 19:15:11
#include <conio.h>
っていれてもいれなくてもいいんですか?
275デフォルトの名無しさん:2006/08/26(土) 19:18:01
関数はプロトタイプ宣言しないとわけわからないことする可能性がある
なので宣言が書かれているのヘッダファイルはincludeすべき

毎回面倒でPCスペックにも自身あるなら全てincliudeするようなヘッダファイル書いて毎回
使っても俺はいいと思う
276デフォルトの名無しさん:2006/08/26(土) 19:21:09
>>275
おkわかりました
277デフォルトの名無しさん:2006/08/26(土) 21:27:14
>>273
人に受けれられなくても、自分用ツールには十分さ。
278デフォルトの名無しさん:2006/08/27(日) 00:45:49
>>273
大学の講義で習ったのはそんなのばっかりだったな。
WindowsじゃなくてMacだったけど。
279デフォルトの名無しさん:2006/08/27(日) 01:14:58
ランチャー経由で起動すりゃいいのさー。
まあ、本末転倒な上にスレ違いではあるが。
280デフォルトの名無しさん:2006/08/27(日) 01:25:31
>>258
プログラム末尾に
scanf("%s", &str);
って書けばいいんじゃない?
281デフォルトの名無しさん:2006/08/27(日) 01:28:29
>>280
getch()が簡単でいいだろう。
それだとstr用意する必要とかあるし。
282デフォルトの名無しさん:2006/08/27(日) 02:23:45
VCか。
あれは面倒だな。
283デフォルトの名無しさん:2006/08/27(日) 03:27:44
VCだったらデバッグなしで実行を選べば
何かキーを押すまで勝手に止まってくれるはず
284デフォルトの名無しさん:2006/08/27(日) 10:02:24
GUIのほうが見栄えはいいけど、GUIのほうが気になって、C自体の学習に使う時間が無くなるので修練度が下がる。
まあコンパイラがCUIなんだから、CUI使えないとあとで困るけどな。
285デフォルトの名無しさん:2006/08/27(日) 10:07:10
となるとGUIの修練度が下がる。まさにクソソフトに成り下がってしまう。
286266:2006/08/27(日) 18:43:22
#include <stdio.h>
#include <conio.h>

void main()

{
int count;

for (count=0;count<4;count++)

{printf("countは今%dです。\n",count);}

if (count==4)

{printf("正解4でした。\n");}

else if (count==5)

{printf("正解は5でした。\n");}

else

{("4でも5でもありませんでした。\n");}

getch();

}

ifの文が反映されない。
287286:2006/08/27(日) 18:46:38
事故解決しました。
すいません。
288デフォルトの名無しさん:2006/08/27(日) 18:55:15
何その腹立つ書き方
289デフォルトの名無しさん:2006/08/27(日) 20:10:06
>>288
>>266 前後を見てみれば、自己解決出来てよかったなって感じになるぞ。w
少しは成長しているみたいだからな。w

>>286
書き込む前によく考えれば解る範囲だったってこったな。
だから俺が >271 で言ったろ?
もうちっと落ち着いて、考えてから書き込めって。w
290デフォルトの名無しさん:2006/08/27(日) 20:34:02
こんな後輩持ったら発狂しそう
291デフォルトの名無しさん:2006/08/27(日) 20:46:16
後輩どころか、同僚・友人・知人、どれもやだ
292デフォルトの名無しさん:2006/08/27(日) 20:53:10
恋人なら許せる
293デフォルトの名無しさん:2006/08/27(日) 21:21:17
超初心者です。
Cpad使って、明解C言語学習しようと思ってます。
Cpadでコンパイル?すると、以下のファイルが生成されます。

hello.cpp
hello.obj
hello.tds
hello.exe

各ファイルの説明お願いいたします。
ぐぐっても分からないでした。
しかもexe実行しようとダブルクリックしても
コマンドライン?がすぐ消えます。

make&実行できちんと表示されるのになぜでしょう?
294266:2006/08/27(日) 21:59:49
なんかすまないです
295デフォルトの名無しさん:2006/08/27(日) 22:15:49
>>293
hello.cpp:あなたが書いたソースファイル。
hello.obj:コンパイラが生成した、CPUへの命令が入っているファイル。オブジェクトファイルという。これ単独では実行できない。
hello.tds:中間ファイルなので、無視してよい。
hello.exe:hello.objをごにょごにょして作られた実行可能なファイル。

>コマンドライン?がすぐ消えます。
exploreでダブルクリックして起動すると、まずcmd.exeが立ち上がり、その中でhello.exeが動く。
hello.exeが終了すると、cmd.exeも終わってしまうので、すぐに消えたように見える。

これはこういうものなので、まずcmd.exeを起動してから、コマンドラインでhello.exeを実行するがよろし。
296デフォルトの名無しさん:2006/08/27(日) 22:27:05
フシューフシュー
297デフォルトの名無しさん:2006/08/27(日) 22:33:42
>>295
分かりやすい解説大変ありがとうございます。

コマンドラインから実行したらできました。感動です。
298デフォルトの名無しさん:2006/08/27(日) 22:38:08
「黒いのがすぐに消える」という質問はFAQだよなぁ。
>>1に入れとくといいかもしれん。
299デフォルトの名無しさん:2006/08/31(木) 17:10:30
#include <stdio.h>
#include <math.h>

#define PI 3.14159265358979323846264

void main(void)
{
double rad=0.0, deg=0.0; //角度
double m11=14.0, m20=14.0, m02=18.0; //モーメント変数

//慣性主軸の計算
rad = 0.5 * atan2(2 * m11, m20 - m02);
deg = rad * 180 / PI;
printf("慣性主軸θ=%f\n", deg);
}
答えが40.9になるはずなんですがどうしてもなりません。
どこがどう違うのか誰か教えてくれませんか。
お願いします。
300デフォルトの名無しさん:2006/08/31(木) 17:58:49
多分自己解決するだろう
301デフォルトの名無しさん:2006/08/31(木) 20:03:08
printfの書式をちぇき
302デフォルトの名無しさん:2006/09/01(金) 00:13:11
>>301
無知を晒さなくていいよ。

>>299
釣り?
40.9度になるところ何度になったかを書いてないから阿呆が沸いたじゃないか。
#しかも-40.9度だし。

マジレスしておくと、atan2()は引き数を象限を決めるために使われるので、
そのソースだと第二象限になるように角度が決定される。
つまり、atan(-7)は約-81度を返すがatan2(28, -4)は約+98度を返す。
従って、その半分を求めると-40.9度になるところが約49度になってしまっている。

m20 - m02がm02 - m20ならatan()でもatan2()でも第一象限だから等しく40.9度になるんだけどね。
303デフォルトの名無しさん:2006/09/01(金) 02:40:38
 >>302
 お返事頂きありがとうございました。
頑張ります。
304デフォルトの名無しさん:2006/09/03(日) 12:38:01
質問です。

引数としてファイル名とファイルポインタを受け取り、
その入力ファイルにある処理を行ったものを出力ファイルに書き込む、
というプログラムを作っているのですが、
出力ファイル名を"out_ファイル名"とするためにstrcat関数を使って
strcat(outfile,name) //outfile="out_",nameは入力ファイル名
としてfopenで開こうとするとセグメンテーションエラーが起きてしまいます。
どうすれば出力ファイル名を"out_ファイル名"とすることができるでしょうか?
どなたか分かる方教えて下さい。お願いします。
305デフォルトの名無しさん:2006/09/03(日) 12:40:00
304です。
以下が作成中のコードです。
void vis(char *name,FILE *fin)
{
FILE *fout;
int c, i;
char buf[BUFSIZ], *outfile="out_";

strcat(outfile,name);
printf("%s\n",outfile);

if((fout=fopen(outfile,"w"))==NULL){
printf("cannot open file!\n");
}

do{
for(i=0; (c=getc(fin)) != EOF ;){
if(!isprint(c)){
fprintf(fout,"\\X%X",c);
break;
}
buf[i++]=c;
if(i >= BUFSIZ)
break;
}
if(i >= MINLEN)
fprintf(fout,"%.*s\n",i, buf);
}while (c != EOF);

fclose(fout);
}
306デフォルトの名無しさん:2006/09/03(日) 13:01:35
>>305
これだとoutfileのchar配列が out_\0 分しか確保されないから文字追加できないよ
char outfile[適当な長さ]; にして
strcpy( outfile, "out_" );
strcat( outfile, name );
とかにしてみれば?
307デフォルトの名無しさん:2006/09/03(日) 13:07:30
>>306
早速のアドバイスありがとうございます。
char *outfile="out_"
と宣言した時点でoutfileは5文字分以上は追加できないんですね。
すごく初歩的なミスでした。
ありがとうございました。
308デフォルトの名無しさん:2006/09/03(日) 13:15:43
はじめまして,

Win32APIや.NET Frameworkを使って
「どのプロセス」が「どのファイル」に変更を加えたか(アクセスしたか)を
取得する方法はあるのでしょうか?
ReadDirectoryChangesWを使うことでファイルに変更が加えられたことは分かるのですが,
どのプロセスが変更を加えたかがわかりません.

どなたかご教授お願いします.
309デフォルトの名無しさん:2006/09/03(日) 14:51:12
そこまで専門的な話ならwin32apiスレで聞いてみたら?
多分フックしろって答えが返ってきそうだけど。
310デフォルトの名無しさん:2006/09/03(日) 20:43:10
質問です。

vis関数(入力ファイル中の表示可能文字列のみを出力ファイルにコピーする関数)で、出力ファイルにコピーする際に指定した桁数で行を折り返して表示するオプションを付けたいのですがどうもうまくいきません。
以下のように変数jとWIDTHを追加してみたのですが指定したWIDTHの長さで折り返しされません。
表示する際にjがWIDTH以上になると改行を入力するようにしてみましたがこのやり方はよくないのでしょうか?

do{
for(i=0,j=0;(c=getc(fin)) != EOF ;){
if(!isprint(c)){
break;
}
buf[i++]=c;
if(i >= BUFSIZ)
break;
}
if(j >= WIDTH){ //ここからが変更した点です
fprintf(fout,"\n"); //j >= WIDTHなら改行
j=0;         //j=0に初期化
}
else{
fprintf(fout,"%.*s\n",i, buf); //j < WIDTHなら表示
j++;             //jをインクリメント
}
}while (c != EOF);

fclose(fout);
}
311デフォルトの名無しさん:2006/09/03(日) 23:59:34
j += fprintf() にすれば?
312308:2006/09/04(月) 11:43:16
>309
ありがとうございます.行ってみます
313デフォルトの名無しさん:2006/09/05(火) 00:36:53
>>299
>>302
第二象限を求めているため答えが間違っている事はわかりました。
そこで質問なんですが、-40.9度にプログラムを修正したい場合は
どのようにしたらいいんでしょうか。
教えて下さい。
宜しくお願いします。
314デフォルトの名無しさん:2006/09/05(火) 00:56:53
>>313
atan2()をやめてatan()を使ったら?
#勿論、atan2()がやってくれるような例外処理は自前でやる必要があるけど。
315デフォルトの名無しさん:2006/09/05(火) 03:15:59
慣性主軸約 -40.9 度と約 49.1 度って何か違いあるの?
角度の範囲を 0°≦ θ ≦ 90° にするか
-90°≦ θ ≦ 0° にするかの違いだけじゃないの?
316デフォルトの名無しさん:2006/09/05(火) 04:49:13
違う。
317デフォルトの名無しさん:2006/09/05(火) 04:56:27
慣性主軸って合計3本あるんじゃないの?
-40.9°と 49.1°は両方とも慣性主軸っつー話では。
318デフォルトの名無しさん:2006/09/07(木) 00:48:02
質問です。
関数change()で配列a[0]とb[0]のアドレスを交換してるのですが
main()の方に戻ってくるとアドレスが交換されていません。
関数の中で引数を変更したいときはポインタを使えばいいと思ったのですが
どうも使い方が違うようで正しい結果がでないです。
どうすればいいですか?

main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[10]={11,12,13,14,15,16,17,18,19,20};
int *u = a;
int *v = b;
int i;

change(u,v);

for(i=0; i<10; i++, u++, v++){
printf("a[%d]:%d ",i , *u);
printf("b[%d]:%d\n",i , *v);
}
}

void change(int *val1, int *val2){
int *temp;

temp = val1;
val1 = val2;
val2 = temp;
}
319デフォルトの名無しさん:2006/09/07(木) 00:54:19
>>318
>>161-
320デフォルトの名無しさん:2006/09/07(木) 10:19:27
Cって人差し指を六弦に当てないようにするのが大変。
321デフォルトの名無しさん:2006/09/07(木) 10:36:58
>>320
1弦でなくて?
322デフォルトの名無しさん:2006/09/07(木) 12:39:05
memcpyの第2引数に関数の戻り値を指定するにはどうすればいいのでしょうか?
int* pt
memcpy(pt,strlen(゙hoge゙),sizeof(int))
でptに4を渡したいのですが…
一度適当な変数に退避させないと駄目ですか??
323デフォルトの名無しさん:2006/09/07(木) 13:01:15
ptが未初期化という点を置いとくにしても、
*pt = strlen("hoge");
で駄目なのか?
324デフォルトの名無しさん:2006/09/07(木) 14:44:43
>>320
爪切れ
325デフォルトの名無しさん:2006/09/07(木) 18:48:38
>>323
あっ、そうですね。
何で気がつかなかったんだろう…
326デフォルトの名無しさん:2006/09/07(木) 23:25:47
>>324
あっ、そうですね。
何で気がつかなかったんだろう…
327デフォルトの名無しさん:2006/09/08(金) 00:59:05
関数からひとつ以上の値を返すことは出来るのでしょうか?

やはり、外部変数あたりを使わなければそういうことは出来ないのですかねぇ〜?
328デフォルトの名無しさん:2006/09/08(金) 01:22:19
引数使ったり配列や構造体返してもいいし
329デフォルトの名無しさん:2006/09/08(金) 02:22:15
Cなら格納先のポインタ受け取ってそこに書きなされ。
そこでstaticやらグローバルやら使い始めたら、大抵ドツボだぞ。
330デフォルトの名無しさん:2006/09/08(金) 02:27:42
えっと
構造体と引数を関数で渡して、
両方の値を更新して返したいのですけど、
その場合は具体的にどんな風にやれば出来ますか?
331デフォルトの名無しさん:2006/09/08(金) 02:30:09
void func(STRUCT* pDest, int* pArg)
{
pDest->Value = 0;
*pArg = 10;
}

とか。
片方は普通に返り値で返してもいいよ。
332デフォルトの名無しさん:2006/09/08(金) 02:32:20
えっと、ポインタを引数にしていくつか渡して、
最終的にそのアドレスに入っている数値を関数の中で更新すればいいわけですね?

なるほど、
これで再び暇プログラムに移れます
ありがとうございました
333デフォルトの名無しさん:2006/09/08(金) 05:29:45
C言語を勉強してるのなら、
ビーケーワン:明解C言語 新版
http://www.bk1.co.jp/product/2655216
でも買って勉強しろ。定番の本だ。
334デフォルトの名無しさん:2006/09/08(金) 17:33:35
また地雷の柴田望洋か
335デフォルトの名無しさん:2006/09/09(土) 00:20:44
よく聞く名前だが、地雷なのか?
336デフォルトの名無しさん:2006/09/09(土) 01:29:39
2chで矢鱈メッタラもてはやされた時期があったな。
本自体はそんなに悪くはないが、作者の自信と内容が全く釣り合っていない。
337デフォルトの名無しさん:2006/09/09(土) 02:31:39

自分が底脳なことに気がつかない人が読む本なのかな

あぶなないオーラまんさい

よーがー
338デフォルトの名無しさん:2006/09/09(土) 02:46:10
根拠を示さず湧いてくる叩きはアレだな。相変わらず。
339デフォルトの名無しさん:2006/09/09(土) 02:49:37
望洋さん
もう2ちゃんねらーなんでしょ?
信者も多いし。
340デフォルトの名無しさん:2006/09/10(日) 14:24:41
warningをワーニングと呼ぶ奴はバカでアホで云々とかって
妙な粘着コラムを1ページ以上とか書いてた人だったっけ?
どっかで読んで引いた記憶が残ってる。

それだけ言っといてfalseをフェイルスとか呼ぶ人だったってオチが
ついたりしたら、大層面白いんだが。
341デフォルトの名無しさん:2006/09/10(日) 17:50:09
やっぱり!
そうか?
342デフォルトの名無しさん:2006/09/10(日) 23:04:44
ワーニング(笑)
343デフォルトの名無しさん:2006/09/11(月) 02:08:03
VC で 非Windows のソフトで Sleep(10) の代わりになる関数はないでしょうか?

344デフォルトの名無しさん:2006/09/11(月) 04:43:35
1ページ以上のコラムにするのはちと異常かもしれんが、
warning はウォーニングだという指摘を素直に受け入れられない奴も異常だな。
345デフォルトの名無しさん:2006/09/11(月) 04:50:19
>>344
ロケール/ロカールはロゥキャルだよな。
346デフォルトの名無しさん:2006/09/11(月) 05:04:18
ローカルと区別できるようにするために
ロケールにしてるんじゃないのか?
347デフォルトの名無しさん:2006/09/11(月) 05:30:20
正しい発音は、ロゥキャルが近いよ?
この指摘を素直に受け入れられないとしたら、異常だよ。
348デフォルトの名無しさん:2006/09/11(月) 05:42:37
そういう発音の場合、カタカナでは普通「ローカル」と書く。
349デフォルトの名無しさん:2006/09/11(月) 05:51:20
local と locale は英語だと区別がつく発音だが、
カタカナで書くと両方「ローカル」になって区別がつかない。
そのために後者を「ロケール」と書いて区別がつくようにしている。
化学の世界でも allyl と aryl が両方「アリル」になって区別がつかないから
後者を「アリール」と書くようにしている。
カタカナ語にはいろいろな制約と慣習があるから、
英語の発音通りになるとは限らない。

warning に関しては "war" は「ウォー」 "warm" は「ウォーム」 と書かれるし、
「ウォーニング」としたところで別に区別がつかない別の語があるわけでもないので、
「ウォーニング」にするのが妥当。
350デフォルトの名無しさん:2006/09/11(月) 09:20:01
>>343
VCで非Windowsってのがよくわからんのだが、
どんな環境想定してるのさ。
POSIXならsleep()があるし、Linuxならnanosleep()とかも使えるはず。
351デフォルトの名無しさん:2006/09/11(月) 10:22:42
カタカナで何が近いかではなくちゃんとした発音が出来て、
かつ、ワーニングと言っている人がいても
キレたりいちいち注意したりして話を腰を折るようなまねをしないのが正解
352デフォルトの名無しさん:2006/09/11(月) 10:34:57
小さいケツの穴を晒して枝葉末節を論じるスレはここですか?
353デフォルトの名無しさん:2006/09/11(月) 10:49:37
>>349
>local と locale は英語だと区別がつく発音だが、
>カタカナで書くと両方「ローカル」になって区別がつかない。

馬鹿じゃないの?カタカナで書けばロゥキャルだってば。
354デフォルトの名無しさん:2006/09/11(月) 10:51:50
>>353
ろーまじ読みして ろーかる ろーかれ
355デフォルトの名無しさん:2006/09/11(月) 10:54:18
ローマ字読みするなら、warningはワーニングだね。
356デフォルトの名無しさん:2006/09/11(月) 12:14:16
>>350
VC を使ってのコマンドプロンプトでのプログラムです。 (Windows マシン上で)
Sleep() が使えないので悩んでいます。
357デフォルトの名無しさん:2006/09/11(月) 12:25:37
::Sleep()使えないのか?
358デフォルトの名無しさん:2006/09/11(月) 12:32:28
user32.lib がリンクされてないんじゃないの?

VCのコマンドラインプロジェクト って
・CRT0 のエントリが main()
・user32/GDI その他もろもろの WinAPI ライブラリ指定が デフォではずれる
ぐらいで、Win32プロジェクトとの差は無かったハズ
359デフォルトの名無しさん:2006/09/11(月) 12:33:24
ゴメン user32 じゃなくて Kernel32 だった
360デフォルトの名無しさん:2006/09/11(月) 12:44:24
#include <windows.h>してないとか。
361デフォルトの名無しさん:2006/09/12(火) 01:51:29
main() {int y;for(y = 1900; y <= 2000; y++){if ((y%4 == 0 && y%100 != 0 )||y%400 == 0){printf("%d\n", y);}}return 0;}

長くてすみません、この{}について質問ですが
先ず最初の "{"intの左横の括弧は, 最後の"}"0;の右に掛かるのでしょうか?(括りに)
そしてifの左のの括弧はreturnの右に掛かるのでしょうか?(括り)
そしてprinftの左の括弧は、;}の右の括弧に掛かるのでしょうか?(括り)
たいへん解り辛くて、もしわけありません、何卒ご助言お願い致します。
この{}の括り方がいまいち解らず困っています。
362デフォルトの名無しさん:2006/09/12(火) 01:58:00
main()
{
  int y;
  for(y = 1900; y <= 2000; y++)
  {
    if ((y%4 == 0 && y%100 != 0 )||y%400 == 0)
    {
      printf("%d\n", y);
    }
  }
  return 0;
}


みたまんまや。
左右そろってるのが組になってる。
363361:2006/09/12(火) 02:03:54
>>362
main()
{
  int y;
  for(y = 1900; y <= 2000; y++)
  {
    if ((y%4 == 0 && y%100 != 0 )||y%400 == 0)
    {
      printf("%d\n", y);
    }
  }
  return 0;
}

参考書にもそう書いてありますが
この{}の法則が解りません・・・
この"}"括りの方がです。

364361:2006/09/12(火) 02:08:04
つまり、こういう事でしょうか?
{A-1{B-2{C-3}D-4}E-5}
365361:2006/09/12(火) 02:12:36
頭が混乱しそうです・・・
{A-1
 {B-2
  {C-3
  }D-4
 }E-5
}

こうではないんでしょうか?
366デフォルトの名無しさん:2006/09/12(火) 02:14:13
>>364
法則って…斜め上で悩んでるなぁ。w

>{A-1{B-2{C-3}D-4}E-5}
そそ。
開始された '{'は、必ず '}'によって閉じられる。
どっちか欠けるとエラーになるからね。
'{''}'で開始・終了される部分ってのは、意味上のブロック。
日本語で言う段落と言っても良い。
特に命令文によって開始されない '{''}'のくくりはまさにブロックという意味合い。
関数は必ず括られると覚えて良い。
if文やfor文も、続く処理の部分が複数行に渡るなら括る必要がある。
単文なら括らなくても良いって例外もあるが、原則括るつもりで居る方がベター。
ブロック化する意味は他にもあるが、基本的にこれだけ解っていれば先に進めるはず。
367デフォルトの名無しさん:2006/09/12(火) 02:14:57
{ の直前にある文の適用範囲を } まで と示している

main() は { から...
 for() は { から...
  if () は { から...
  } まで if () を適用
 } まで for() を適用
} まで main() を適用
368366:2006/09/12(火) 02:16:12
>>365
そうはならないな。
A-1がif文とするなら、
if ( expr ) {
 …
}
であって、先頭に括弧が来ちゃったら
{ if(expr) {
 }
}
こうなる。

if ( expr ) {  }
この場合の括弧は、if文中の式が成立しないと実行されない。
369361:2006/09/12(火) 02:30:54
皆さん、ありがとうございます。
何か考えれば考える程、混乱してきましたorz
頭冷やしてきます、皆さんはこういうので迷いませんでしたか?
370デフォルトの名無しさん:2006/09/12(火) 02:36:53
>>369
20年もコード書いてきて、一度も迷ったことないな。w

文法で悩むなんて無意味な行為だ。
こう書かないと動作しないっていうsyntaxなレベルの話なんだから、
これは体で覚えてしまわないといけない範囲の話。
371361:2006/09/12(火) 02:41:54
ありがとうございました。
他にも1904〜2000まで出力されるのが
括弧の{}の付け方で2001が出力出たりとか
もうやってて何が何だかわからなくなりました
マジレスシャワー浴びてきます。
372デフォルトの名無しさん:2006/09/12(火) 03:17:24
そこでシャワーを浴びたくなったことには疑問を持たないのね。
373デフォルトの名無しさん:2006/09/12(火) 04:26:50
黄金水のシャワーを浴びたくなる事あるだろ?
374デフォルトの名無しさん:2006/09/12(火) 04:39:36
あるあ・・・ねーよw
375デフォルトの名無しさん:2006/09/12(火) 09:00:55
361 のコードで main() 以外の { } の付け外しで、結果出力が 2001 になるパターンが想像つかん
{ } の中が単文だから、なおさら不可解だ。
376デフォルトの名無しさん:2006/09/12(火) 09:06:18
…書いてから思いついた ('A')

main() {
 for() { }
 if { }
 printf();
}

混乱の仕方が半端じゃないな。
数学の ( ) と同じようなものなのにね。

A * (1 + B * ( 1 + C * ( ) ) )
A -> main
B -> for
C -> if
377デフォルトの名無しさん:2006/09/12(火) 18:51:16
…何を混乱しているんだ?
378デフォルトの名無しさん:2006/09/12(火) 19:03:06
もしかしてこういう書き方なら納得するのか?

(main (…)
 (for (…)
  (…
   …)
 )
 (if (…)
  (printf(…))
 )
)
379デフォルトの名無しさん:2006/09/12(火) 19:07:28
Lispっぽいけど、イイ!!
380デフォルトの名無しさん:2006/09/12(火) 19:57:35
forなんて邪道
381361:2006/09/12(火) 20:14:36
遅レス、すんまそ。皆さん親切で感激です。
何回か読み返してみて何となく納得と言うか整理が多少できました。

でも、疑問も又浮かびました>>371で書いた通り
>>376さんの書いた様な文法にしたら(直ぐに括弧閉じ)

main() {
 for() { }
 if { }
 printf();
}

エラーは起こらず2001が出力されました、何故上の様に
関数(){}の様に直ぐに括弧を閉じたらいけないのでしょうか?
入門書にもこう書かれています

main(){
処理


関数名1(){
  関数の処理
}

関数2(){
関数の処理
}

と直ぐに括弧閉じになってます、たぶんこれが混乱の原因かと・・・
>>362さんみたいに最初に付けた括弧は最後に括るではないのでしょうか?
382デフォルトの名無しさん:2006/09/12(火) 20:32:27
>>381
括弧のくくる個所で、やりたいことの範囲を制御してるのさ。
# 改行位置やスペースの数は全く関係ないぞ。 念のため

for() { }
if () { }
printf();
廻りきってから(最終的に i=2001)
条件判断して(成り立ってもなにもせず)
iを表示

for() {
 if () {
  printf();
 }
}

廻りながら (現在のiの値について)条件判断して 成立すれば iを表示
383361:2006/09/12(火) 20:56:14
>>382
解った様な解らない様なきがしますが
何となく謎が解けてきている感じがします
助言ありがとうです、皆さんすごい参考になります。
384361:2006/09/12(火) 20:59:44
>>378
逆に解らなくなって、すんまそ

初心者なのであまり余計な事は考えないように
してやっていきたいと思います。
385デフォルトの名無しさん:2006/09/12(火) 22:28:45
インクルードファイル'stdio.h'をオープンできない
と出てしまうのですがどうすれば直るのでしょうか教えてください
386デフォルトの名無しさん:2006/09/12(火) 22:38:56
エスパーの登場を待つ
387デフォルトの名無しさん:2006/09/12(火) 22:49:28
昨日も同じ質問を別のスレで見かけたが
そいつはちゃんと環境とか書いてたしな。

ものわかりは悪かったけど。
388デフォルトの名無しさん:2006/09/12(火) 22:50:12
>>385
インクルードファイルが見えないんだろうから、
見えるようにコンパイラにオプション指定すればよい。
389デフォルトの名無しさん:2006/09/12(火) 22:58:25
自動設定のものを見つけたので解決しました
スレしてくれた皆様有難う御座いました
390デフォルトの名無しさん:2006/09/12(火) 23:05:41
誰かスレした人いますか?
先生怒らないから正直に手を挙げなさーい
391デフォルトの名無しさん:2006/09/13(水) 00:04:27
スレした人?
392デフォルトの名無しさん:2006/09/13(水) 02:37:58
スレした人だな
393デフォルトの名無しさん:2006/09/13(水) 05:11:10
馬鹿ほど自覚が無いしなあ。
いきなり応用に逝くから嵌る。最初は基本に忠実に一通りやってみればいいのに。
最初から答えを求めるアフォ並みの思考だよな。答えに到達する過程を養うのが重要なのに。
既知の答えを求めていたのでは、未知の問題への解決能力が育たない。
394デフォルトの名無しさん:2006/09/13(水) 09:00:28
>>385
馬鹿っていうなよwwwかわいそうだろwwwせめて
鹿くらいにしとけ
395デフォルトの名無しさん:2006/09/14(木) 01:46:39
ならば馬は俺が引き受けた!
396デフォルトの名無しさん:2006/09/14(木) 05:32:43
それならぬるぼは漏れが
397デフォルトの名無しさん:2006/09/14(木) 05:46:04
>>396
カ゚ッ?
398デフォルトの名無しさん:2006/09/16(土) 20:49:44
質問なのですが

#include <stdio.h>

main () {
int i = 5;

printf("数値: %d", 5);
return 0;
}

何故か , の後に5を入れるとエラーを起こしてしまいます。
, の後にiを入れれば成功しますが、i=5と宣言してありますが
何処に誤りがあるのでしょうか?

399デフォルトの名無しさん:2006/09/16(土) 20:55:20
エラーメッセージぐらい晒せ
400デフォルトの名無しさん:2006/09/16(土) 20:58:19
? 5を書いてエラーになるか? ならないと思うが…。
401デフォルトの名無しさん:2006/09/16(土) 21:04:59
俺もそう思う。とんでもない勘違いをしてるんじゃなかろうか。
だからエラーメッセージを晒してもらえばはっきりする。
402デフォルトの名無しさん:2006/09/16(土) 21:05:28
警告 W8004 bbb3.c 8: 'i' に代入した値は使われていない(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
403デフォルトの名無しさん:2006/09/16(土) 21:06:47
これなんですが、こう警告が出てしまいます。
404デフォルトの名無しさん:2006/09/16(土) 21:08:51
警告はあくまで警告なのであって、一応実行ファイルは出力されている。
無視してやることも可能。
405デフォルトの名無しさん:2006/09/16(土) 21:08:55
それはエラーじゃなくて警告でしょうが。
406デフォルトの名無しさん:2006/09/16(土) 21:11:45
ありがとうございました。
407デフォルトの名無しさん:2006/09/16(土) 21:18:37
i使わないなら宣言した意味ないぢゃん!バカチンが!
408デフォルトの名無しさん:2006/09/16(土) 22:17:12
ああなるほど、エラーじゃなくて警告だったのか、こりゃ一本取られた。
409デフォルトの名無しさん:2006/09/16(土) 23:05:11
何で警告が出たのでしょうか?参考書を読んだり調べたりしましたが
いまいち、何故警告が出たかわかりません、あと無視してもいいでしょうか?
もし、“5”と言うか数字を代入した場合、どういう文法にすればいいか
ご示唆下されば、ありがたいです、宜しくお願い致します。
410デフォルトの名無しさん:2006/09/16(土) 23:08:52
はい お前確定
411デフォルトの名無しさん:2006/09/16(土) 23:14:30
>>409
警告に基本的に無視すべきではない。

そのプログラムに対して出た警告は読んで字の如く。
今回の解決法は、そもそも使わない変数を宣言しないこと。
#include <stdio.h> 

main () {
    printf("数値: %d", 5); 
    return 0; 
412デフォルトの名無しさん:2006/09/16(土) 23:19:00
>>411
ありがとうございました、本にはこの事にいつては載ってなかったので
ネットで探していました、やっと解決しました。
413デフォルトの名無しさん:2006/09/16(土) 23:31:14
警告メッセージちゃんと日本語なんだから
読んで理解して欲しいもんだ。
414デフォルトの名無しさん:2006/09/16(土) 23:34:24
警告メッセージ分かりやすすぎワロタ
415デフォルトの名無しさん:2006/09/17(日) 01:04:15
質問なのですが、困っています
#include <stdio.h>

main(){
int d2 = 123;
int d1 = 5;
float f = 0.0001;
char c = 'a';
char str[] = "abc";

printf("実数f %1.4f, 文字c %c 文字列str %s" ,f,c,str);
printf("%10d:%5s",d1,str);
printf("%010d",d2);
printf("Hello!\nWorld!");

return 0;
}

とやると

コマンドプロンプト画面
C:\source>1-File
実数f 0.0001, 文字c a 文字列str abc 5: abc0000000123Hello!
World!

と表示されてしまいます、“5: abc0000000123
Hello!
World!”
と〜123の下に改行したいのですが、どうすれば改行できるか悩んでいます
もしくは、、“5: abc0000000123”の下を改行してみたいです
どの様なソースを書けば良いかわかりません
ご助言お願い致します。
416デフォルトの名無しさん:2006/09/17(日) 01:12:43
printf("\nHello!\nWorld!");
417デフォルトの名無しさん:2006/09/17(日) 01:18:51
>>416
ありがとうございました!!
あと、もう一つだけ質問があります
実数f 0.0001, 文字c a 文字列str abc 5: abc0000000123 Hello! World!と
                                   ↑
                                   ここを一桝空けたい場合は
どうすればいいでしょうか?
418デフォルトの名無しさん:2006/09/17(日) 01:21:55
printf("\n Hello!\nWorld!");
419デフォルトの名無しさん:2006/09/17(日) 01:31:34
ご返答ありがとうございます。
自分の言い方まちがっていました。

今まで通りだと、5: abc0000000123Hello!World! と
繋がってしまうので一個分スペース空けて
5: abc0000000123 Hello! World! のようにしたいです。
420デフォルトの名無しさん:2006/09/17(日) 01:44:26
printf(" Hello!\nWorld!");
421デフォルトの名無しさん:2006/09/17(日) 01:48:03
ありgとうございました。
これで先に進めます
422デフォルトの名無しさん:2006/09/17(日) 02:58:53
ご助言戴きたいので、宜しくお願いします。

コマンドプロンプト画面で結果に3を出したいのですが
どうやっても結果が0しかでません、ソースの誤りを指摘お願い致します。

#include <stdio.h>

main(){

int player=0;

printf("【ジャンケンゲーム】\n");
printf("ジャンケン・・・(グー:1 チョキ:2 パー:3を入力))>");
scanf("プレイヤーは %d",&player);
printf("プレイヤーは %d", player);

return 0;
}

こうすれば、1,2,3のどれかが出るはずなんですが
0しか出ません。
423デフォルトの名無しさん:2006/09/17(日) 03:05:46
int player=3; にすれば、3が出る(かもしれない)よ。
424デフォルトの名無しさん:2006/09/17(日) 03:09:02
>>423
ありがとうございます。
自分もそうおもったのですが・・・
入門書だとint player=o; になっていて3になると・・・・
425デフォルトの名無しさん:2006/09/17(日) 03:18:58
いや、3を入力すりゃ3が出るよ。
何も入力しなきゃ、playerの初期値が表示されるのが当たり前。
426デフォルトの名無しさん:2006/09/17(日) 03:19:49
そうですか…ありがとうごさいました
427デフォルトの名無しさん:2006/09/17(日) 03:35:37
#include <stdio.h>

main(){

int player;

printf("【ジャンケンゲーム】\n");
printf("ジャンケン・・・(グー:1 チョキ:2 パー:3を入力))>");
scanf("%d",&player);
printf("プレイヤーは %d",player );

return 0;
}

こんな簡単な手直しに時間掛かった
樹海逝ってくる(´;ω;`)
428デフォルトの名無しさん:2006/09/17(日) 03:45:09
あ、そうか。
マジで俺も気が付かなかったんだ。ごめんな。
429デフォルトの名無しさん:2006/09/17(日) 04:13:40
>>422
scanf中の"プレイヤーは %d"は入力として、

プレイヤーは3

のように、まず「プレイヤーは」という文字列が入力され、
その後に0個以上の空白文字が入り、
その後に整数が来ることを期待して処理しようとする。
整数だけを入力すると「プレイヤーは」がないため、そこで処理を止めてしまう。
その場合、playerへの操作は行われないため、playerの値はscanf後も初期値の0になる。
playerへの操作が行われていればscanf("プレイヤーは %d",&player);は1(1個処理した意)を返すし、
行われなければ0を返すので、scanfが返す値をチェックすればうまくscanfが動いたかどうか分かる。
詳しいことはscanfのリファレンスを参照のこと。

>>422が本来やりたかったと思われることは>>427のように%dだけを与えればできる。
430デフォルトの名無しさん:2006/09/17(日) 06:35:19
include
431デフォルトの名無しさん:2006/09/17(日) 08:10:15
printf("Hello World");で、
コマンドプロンプトに「Hello World」と表示されるけど、
このコマンドプロンプトの「Hello World」を、
printf("Hellow World");のプログラムのcharのポインタとかに渡すことってできますか?

system("dir");とかで、コマンドプロンプと上に表示されたファイル名を取得したいのです。
432デフォルトの名無しさん:2006/09/17(日) 08:19:18
やっぱり日本語書くにも訓練がいるんだね
433デフォルトの名無しさん:2006/09/17(日) 08:24:33
>>431
system関数では実行したコマンドの標準出力を呼び出した側で得ることはできないので、
"dir > tempfile"のように一時ファイルに結果を保存しておいて、
あとから一時ファイルを開いて結果を取り出す方法をとればいいと思う。

一時ファイルを作りたくないのなら、popen関数を使って、
popen("dir", "r")でdirの標準出力を得るファイルポインタを開ける。
434デフォルトの名無しさん:2006/09/17(日) 08:27:47
うお、sageミスったorz

>>432
質問の最後の1行がなければ意味が分からなかった
435431:2006/09/17(日) 08:32:04
>>433
なるほどなるほど。
436デフォルトの名無しさん:2006/09/17(日) 08:55:55
>>433
なるほどエスパー振りには感心するけど、指導方針としては
どうだろう?

オレの見立てだと431はコマンドの出力を取りたいわけじゃなくて、
プログラムでファイルの一覧を見たいんじゃなかろうか?
437デフォルトの名無しさん:2006/09/17(日) 09:41:49
>>436
うーん
431は表示されるもの一般を取り込みたい、と取ったんだが。
それがHello Worldであれ、dirの出力であれ。
最初の4行が無かったら、436の言うようにファイルの一覧が欲しいと思ったかもしれない。
誤読してしまったかな?

>>431
もし、ファイルの一覧が欲しいなら、opendir,readdir,closedir関数を使えば、
コマンド呼び出しに頼らずにできる。
例えば、カレントディレクトリのファイル名の一覧を表示するなら、

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

void main(void)
{
DIR *dir = opendir(".");
struct dirent *dp;

while ((dp = readdir(dir)) != NULL) {
printf("%s\n", dp->d_name);
}

closedir(dir);
}

Windows限定の方法もあるが、こちらの方が可搬性はあると思う。
438デフォルトの名無しさん:2006/09/17(日) 09:55:20
コマンドプロンプトと言っている以上Windowsなのは間違いない。
で、確か、opendir系はMS系(VC++等)には無かったような。
439431:2006/09/17(日) 10:01:56
>>436-437
説明が下手でごめんなさい……。
ファイル一覧を取り込む方法を知りたくて、
コマンドを利用して一覧を得るというアホな方法だけを考えてしまったんです。

>>437
2度も考えさせてしまって申し訳ない。
こちらのが単独で使えて良いっぽいですね。
ありがとう!
440431:2006/09/17(日) 10:03:23
>>438
WindowsでもLinuxでもOKです

アホは去ります ノシ
441デフォルトの名無しさん:2006/09/17(日) 10:24:03
>>439
俺が誤読しちゃったのね。
説明の取り違えなんてよくあること、気にしない気にしない。

>>438
POSIX準拠の関数だからといってあるとは限らないのか……

Windows APIを使って437と同じことをしたいときは、こんな感じ?

#include <stdio.h>
#include <windows.h>

void main(void)
{
WIN32_FIND_DATA fd;
HANDLE h = FindFirstFileEx("*", FindExInfoStandard, &fd, FindExSearchNameMatch, NULL, 0);

do {
printf("%s\n", fd.cFileName);
} while (FindNextFile(h, &fd));

FindClose(h);
}
442デフォルトの名無しさん:2006/09/17(日) 10:31:35
437も441もwarning: return type of 'main' is not `int'って怒られてしまったorz
443デフォルトの名無しさん:2006/09/17(日) 12:42:34
だからあれほどvoid mainは使うなと言うのに。
444デフォルトの名無しさん:2006/09/17(日) 13:37:14
return文を書くのが面倒になって、つい。bccだと警告しないし。
gccはデフォルトでしっかり怒ってくれる。
445デフォルトの名無しさん:2006/09/17(日) 16:14:14
日本語環境の場合、日本語のフォルダーとかファイルもある訳で扱いが面倒。
文字コードも環境によるし。
446デフォルトの名無しさん:2006/09/17(日) 16:16:18
C++やC99なら、int mainとした上で、main関数に限りreturnを省略できる。
その場合、末尾の}に着いたところでreturn 0;があると扱われる。
447デフォルトの名無しさん:2006/09/18(月) 02:01:34
とあるスレをみて興味を持ち始め、試しにCでオブジェクト指向っぽく
書いてみたんですが、コンパイルで警告がでてしまいます。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*class*/
typedef struct Car{
/*field*/
/*略*/
/*public method*/
void (*show)(struct Car *);
void (*repaint)(struct Car *, enum Color);
}Car;
/*implementation*/
Car_showImpl(struct Car *car)
{
/*略*/
}
Car_repaintImpl(struct Car * car, enum Color color)
{
  /*略*/
}
448デフォルトの名無しさん:2006/09/18(月) 02:03:09
Car * new_Car(char *name,int num,double gas)
{
Car *car = malloc(sizeof(Car));
  /*略*/

/*メソッドの登録*/
car->show = Car_showImpl; /*この二行に警告が出る*/
car->repaint = Car_repaintImpl;
}
void delete_Car(Car *car)
{
free(car);
}

int main(int argc, char *argv)
{
Car *car;
enum Color color=black;
car = new_Car("Honda Fit",1234,30.0);
car->show(car);
car->repaint(car,color);
car->show(car);
}
449デフォルトの名無しさん:2006/09/18(月) 02:04:16
コンパイラから出力されるメッセージは次のようになります。
$ gcc -o test5 test5.c
test5.c: In function ‘new_Car’:
test5.c:98: 警告: assignment from incompatible pointer type
test5.c:99: 警告: assignment from incompatible pointer type
処理系:Linux gcc 4.1.1

関数ポインタの型が違うから警告が出てるようなのですが、ソースを見る
限り型は一致しているように見えます。実行は見た目、正常に行われるんですが
、できる限り警告は取り除きたいものです。もし警告の原因をご存じの方がいら
っしゃいましたら、ご意見を下さい。
450デフォルトの名無しさん:2006/09/18(月) 02:41:57
Car_showImplとCar_repaintImplの定義に戻り値の型の指定がない。
あと、そのやり方では、メソッドの呼出がC++のメンバ関数の呼出と同じ見た目になるけど、
メモリの使い方に無駄ができるから個人的にはお勧めできない。
451449:2006/09/18(月) 03:11:22
>>450
すいません。voidを付けるのを見落としていました...orz

car->show(car);
ではなく
Car_show(car);
みたいに記述する方が確かに、オブジェクトのサイズが小さくなりますね。
CでC++っぽい書き方をすると面白いかなみたいな勢いで作っていました。

疑問が解決したので、ありがとうございました。
452fusian:2006/09/18(月) 10:11:39
#include <stdio.h>
void main()
{

printf( "%c" , 0xC1 );printf( "%c" , 0xDD );printf( "%c" , 0xCE );printf( "%c" , 0xDF );

}
453デフォルトの名無しさん:2006/09/18(月) 10:32:27
ファイル読み込みの関数で32ビットずつ読み込む関数ってないんですか。
getc=char, getw=16bit,get?=32bit
みたいな。
454デフォルトの名無しさん:2006/09/18(月) 10:47:20
>>453
非標準なら、getw()はある。MS系(DOS系?)ライブラリにはしばしば収録されている。
まぁ、fread()使えば事が足りるから普通は必要ないな。
455デフォルトの名無しさん:2006/09/18(月) 11:56:11
freadは書式が難しくてどこに読み込んだデータがあるのかわかりませんでした。
バッファの中身を見ても数値が入ってないんです。どうして?
456デフォルトの名無しさん:2006/09/18(月) 12:03:08
ちゃんと読み込めるよ。落ち着いてもう一度やってみたらいいと思う。

世界中のプログラマが使ってるライブラリの関数だし、それが間違っ
てることはまず無いから。
457デフォルトの名無しさん:2006/09/18(月) 12:24:25
お手数ですが、読み込んだバッファの中身を表示するプログラムを書いて欲しいです。
458デフォルトの名無しさん:2006/09/18(月) 12:42:50
その前に、お前はいったいどんなコードを書いたのか見せろ。
459デフォルトの名無しさん:2006/09/18(月) 18:34:26
標準関数のライブラリ全ての実装が間違っていないとは言い切れないが、
ライブラリやコンパイラを疑う前に自分のコードを疑った方がいいのは確か。
460デフォルトの名無しさん:2006/09/18(月) 19:28:52
>>457
書いたソース張れば? 該当部分なんて数行だろ。
見れば何が悪いのか誰か教えてくれるよ。
461デフォルトの名無しさん:2006/09/18(月) 21:24:17
半日レスが無いってことは釣りか?
462デフォルトの名無しさん:2006/09/19(火) 02:43:46
自己解決していちいち報告もめんどいから放置ってとこだなwww
463デフォルトの名無しさん:2006/09/19(火) 03:00:12
とっても恥ずかしい間違いに気付いたとかね
464デフォルトの名無しさん:2006/09/19(火) 03:18:56
そこを武士の情けで見逃してやらないお前らマジ鬼畜
465デフォルトの名無しさん:2006/09/19(火) 07:37:31
アーキテクチャ(エンディアン)依存だが、
int i;
fread(&i, sizeof int, 1, fp);
だな。
466デフォルトの名無しさん:2006/09/20(水) 02:23:00
こう、エラーメッセージが表示されてしまいます、ご教授お願いします。

C:\aaa>bcc32 bbb12-2.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
bbb12-2.c:
エラー E2040 bbb12-2.c 3: 宣言が正しく終了していない
*** 1 errors in Compile ***

#include <stdio.h>

switch(computer){
case1: printf("グー");
break;

case2: printf("チョキ");
break;

case3: printf("パー");
break;

default: break;

return 0;
}


最後に閉じてありますが、こう表示されてしまいます。
467デフォルトの名無しさん:2006/09/20(水) 02:27:19
>>466
main()の中に書いてない。
468デフォルトの名無しさん:2006/09/20(水) 02:32:09
>>467
ご教授、ありがとうございます。

#include <stdio.h>

main(){
switch(computer){
case1: printf("グー");
break;

case2: printf("チョキ");
break;

case3: printf("パー");
break;

default: break;
}
return 0;
}

このように書いても、次はこうエラーが出てしまいます。

C:\aaa>bcc32 bbb12-2.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
bbb12-2.c:
エラー E2451 bbb12-2.c 4: 未定義のシンボル computer(関数 main )
*** 1 errors in Compile ***
469デフォルトの名無しさん:2006/09/20(水) 02:39:11
>>468
computerという変数を宣言・定義してないから。
470デフォルトの名無しさん:2006/09/20(水) 02:47:47
>>469
やはりエラーが出てしまいます。

#include <stdio.h>

main(){
int = computer;

switch(computer){
case1: printf("グー");
break;

case2: printf("チョキ");
break;

case3: printf("パー");
break;

default: break;
}
return 0;
}

C:\aaa>bcc32 bbb12-2.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
bbb12-2.c:
エラー E2040 bbb12-2.c 4: 宣言が正しく終了していない(関数 main )
エラー E2451 bbb12-2.c 6: 未定義のシンボル computer(関数 main )
*** 2 errors in Compile ***
どうしても、わからないので、訂正ソースを書いて戴ければ幸いです。。。。

471デフォルトの名無しさん:2006/09/20(水) 02:51:06
int
main(){
int computer = 1;

switch(computer){
case1: printf("グー");
break;

case2: printf("チョキ");
break;

case3: printf("パー");
break;

default: break;
}
return 0;
}


つーかcomputerはどっから出てきたんだ。
472デフォルトの名無しさん:2006/09/20(水) 03:02:44
お手数かけて、すみませんでした。

computerは型の名前ですから書きました。
何故 int computer = 1; だけではいけないのでしょうか?
最初に int を宣言してますね・・・>>471さんの訂正文だと。

実行すると必ずグーしかでなのですが、グー以外はでないのでしょうか?
質問ばかりで、すみません。
473デフォルトの名無しさん:2006/09/20(水) 03:08:41
OK、順番に行こう。
まず

int computer;

は、int型の変数を宣言している。
変数名はcomputer。
これで以降intの入れ物の名前としてcomputerが使用可能になる。

int computer = 1;

で、宣言と同時に1を代入している。
これでcomputerの中身は1が入ってることになる。

int computer;
computer = 1;
でもいい。
この場合は宣言と代入の手続きが分かれてることになる。
474デフォルトの名無しさん:2006/09/20(水) 03:13:52
次、グー以外が出ないワケ。
switch()は、与えられた値に対応したcase以下の命令を実行する文。
ここではcomputerの中身は1だから、case1の直下にある
printf("グー");
break;
が実行されることになる。
breakでswitchからは抜けて、return 0;でmain()からも抜けて、プログラム終了。

グー以外が欲しいなら、
computer = 2;
ないしは
computer = 3;
を入れる必要がある。
=2ならcase2:に対応したチョキが、
=3ならcase3:に対応したパーが出るだろう。
試してみると良い。

ラスト、もしコンピュータにグーチョキパーのいずれかをデタラメに出させたいなら、
乱数という概念を覚える必要がある。読んで字のまま、呼び出すたびにデタラメな数を返してよこす
関数が、C言語にはある。

computer = (((unsigned int)rand()) % 3) + 1;

理屈はわからなくていいので、とりあえずやってみて欲しい。
グーチョキパー、少なくとも直接代入した覚えのないものが出るかもしれない。
475デフォルトの名無しさん:2006/09/20(水) 03:19:19
ありがとうございました!!!解りました!!!
夜分、遅く変な質問してすみませんですた。
476デフォルトの名無しさん:2006/09/20(水) 03:20:56
補足。

rand() でコンパイルエラーが出るなら、ソースの先頭に
#include <math.h>
を追加すること。

また、何度実行しても同じ結果(グーチョキパーのうちの同じ手)が返ってきて、
不思議に思うかもしれない。

これはrand()が寄越すのは実は乱数っぽいだけの規則性のある数字でしかないからで、
これをちゃんとした乱数っぽく使うためには、少し工夫が必要になる。

rand()を呼び出す前に、
srand(100);
というおまじないを入れてみて欲しい。
多分結果が変わるはずだ(三分の一の確率で変わらないかもしれないが)。
srand()はrand()が作る乱数のタネとなる値を与える関数で、ここにある程度
デタラメな値を最初に与えることで、rand()がそれなりに信用できる乱数を返せる様になる。

これが本当に最後。
ソース先頭に
#include <time.h>
を追加して、rand()の前のsrand()を
srand((unsigned int)time(NULL));
にして欲しい。
実行した時の時間を乱数のタネとすることで、実行するたびに異なる手を出すじゃんけんプログラムになる。

こんなとこでどうだろか。
477デフォルトの名無しさん:2006/09/20(水) 03:34:13
詳しく本当にありがとうございます。
rand()を使えば適当な数字がでます、そこで% 3) + 1; を使う
ですが、同じ数字しかでない?から時間をずらす time を使うって
大まか解釈して宜しいでしょうか?
srand(100); この括弧内の100が解らないのですが、取り敢えずやってみます。
478デフォルトの名無しさん:2006/09/20(水) 03:59:44
>srand(100); この括弧内の100が

これは俺が適当に入れた、完全に適当な値。
10でも100でも1000でも119でもなんでもいい。

ただ、それらのデタラメな値でも、毎回同じ値を入れてると、
次に取り出される値もやっぱり同じ値になる。

timeを使ったのは、起動時の時間の端数は概ねバラついているもので、
乱数のタネとして使いやすいから。
実際、起動するたびに違う答えを返すようになったと思う。
それを期待したわけだと。
479デフォルトの名無しさん:2006/09/20(水) 04:01:22
どう見ても釣りです。そうでないなら自演です。そうでもないなら只の阿呆です。
480デフォルトの名無しさん:2006/09/20(水) 04:12:01
うるせーばか氏ね
481デフォルトの名無しさん:2006/09/20(水) 04:57:45
このスレに質問に来る椰子はアホばっかですね
才能無いから辞めたほうがいいんでないか?
482デフォルトの名無しさん:2006/09/20(水) 05:15:15
うるせーバカ氏ね
483デフォルトの名無しさん:2006/09/20(水) 05:24:27
froatとかcherとか書いてた香具師と同じ奴か?
484デフォルトの名無しさん:2006/09/20(水) 06:26:43
うるせーバカ氏ね
485デフォルトの名無しさん:2006/09/20(水) 07:43:52
みんなで仲良くね
486デフォルトの名無しさん:2006/09/20(水) 07:50:53
不正入力で、変数に代入されなかった
文字列をprintf関数で、画面に出力することは
出来るんでしょうか?
具体的に説明すると、scanf("%d",&s);となっているところに
文字列をキーボードから入力したとして
変数sに代入されなかったその文字列を、表示できるのか?
ということです。
くだらない質問だとは思いますが、どなたか教えて下されば
幸いです。
487デフォルトの名無しさん:2006/09/20(水) 09:31:43
代入できない物を拾えたら簡単にバッファーオーバフロー攻撃できそうだが。
488デフォルトの名無しさん:2006/09/20(水) 09:32:34
>>486
#include <stdio.h>
int main(void)
{
int s;
char x[100];
int n;
n = scanf("%d", &s);
if (n == 1) {
printf("success:%d\n", s);
} else if (n != EOF) {
scanf("%99s", x);
printf("failed:%s\n", x);
} else {
printf("no input\n");
}
return 0;
}
さらに入力が残っているときはそのまま。
489デフォルトの名無しさん:2006/09/20(水) 14:01:44
質問させてください。。
以下のソースをコンパイルして実行に移したのですが、
画面に表示される月収の値だけ、まともに出てきません。
どうしたら、ちゃんと計算してくれるのでしょうか?
どうか、ご教授願います。
#define NITTOU 10130
#define MONTH 30
#include<stdio.h>
int main( int argc, char* argv[])
{
int a, b, c, d, e;

a = 8000;
printf( "日当は%d円です\n", a);
b = 1730;
printf( "交通費は%d円です\n",b );
c = a + b;
printf( "合計%d円です\n",c );
d = (a * 0.05) + a + b;
printf( "消費税含め日当は%d円です\n", d );
e = d * MONTH;
printf( "月収は%d円です\n", e );

return 0;
}
490デフォルトの名無しさん:2006/09/20(水) 14:35:29
>>489
期待してるのはどういう金額で、実行するとなんて表示されるの?
491489:2006/09/20(水) 14:58:36
>>490
レスありがとうございます。
実行すると以下の分が表示されます。

日当は8000円です。
交通費は1730円です。
合計9730円です。
消費税含め日当は10130円です。
月収は-23780円です。    ← ここがおかしい
以上

       
月収の期待値は、303900円と欲しいんですが、
-23780円となってしまいます。

どこがおかしいか指摘してください。お願いします。
492デフォルトの名無しさん:2006/09/20(水) 15:08:26
>>491
たぶん、intが2バイトの処理系
だから、303900はオーバーフローして、-23780になる
ためしに、short=2バイトの処理系で、
そのプログラムをint→shortにしてコンパイル、実行したら、その結果になった
493デフォルトの名無しさん:2006/09/20(水) 15:08:41
>>491
俺の環境じゃなんねーよ?
コピペそのままでbcc32でコンパイルしたけど。

C:\c\てすつ>test00
日当は8000円です
交通費は1730円です
合計9730円です
消費税含め日当は10130円です
月収は303900円です
494デフォルトの名無しさん:2006/09/20(水) 15:26:45
>>491
sizeof(long)の値を見てみて2より大きいようなら、
intをlongに変更すれば幸せになれるかもしれん。
495489:2006/09/20(水) 16:23:02

>>492
>>493
>>494
ご指摘ありがとうございます。

ご指摘どおり、データ型をintからlongまたはshortへ変更し、
それぞれ試したんですが、実行結果は変わりませんでした orz

ちなみに8バイト処理(私が知る限り最高の数値)
のdoubleも試した結果、何故かすべての戻り値が0に
返されました。
ちなみに今、使用しているコンパイラは LSI C-86 ver3.30試食版です。

コンピュータの融通の利かなさに、ほとほと困り果てています。
496デフォルトの名無しさん:2006/09/20(水) 17:14:11
>>495
LSI C-86試食版は16ビットコンパイラでいろいろ制限が多いから、
もし導入に問題が無いならBCCとかに移行したほうがいいかも。
16ビット環境なんだったら仕方ないが。
でも、LSI C-86でもlongのサイズは4バイトだった気がするけど。確認していないが。
あと、doubleを試して全部0になったのは、
たぶんprintfの書式指定を%dのままにしているからのような気がする。
497デフォルトの名無しさん:2006/09/20(水) 17:40:27
ttp://www.lsi-j.co.jp/freesoft/index_2.html
doubleで0が出るのはここの一番下が原因なのかもしれない。
-lmathlibを指定していないときのsoubleの表示がどうなるのか分からないが。
498デフォルトの名無しさん:2006/09/20(水) 17:53:13
何でLSICはいまだに大人気なんだろう?
16ビットでやりたいなら
ttp://bdn.borland.com/museum/
ここにある TurboC の方が良くね?
499489:2006/09/20(水) 19:27:49
本当に参考になるご指摘ばかりでとても助かります。
まだ、解決には至ってませんが、なんとかがんばろうと思います。
また、機会があればご教授ください。

たくさんのご意見、ご指摘ありがとうございました。



500489:2006/09/20(水) 19:40:21
いけました!!

>>496さんのおっしゃるとおり、書式指定が間違っていたようですorz
かなりうれしいです!ありがとうございました!!

501デフォルトの名無しさん:2006/09/20(水) 20:10:35
srand(time(NULL));
ってやるのって何か馬鹿っぽくね?
普通に srand(rand()); ってやったほうが簡単じゃね?
502デフォルトの名無しさん:2006/09/20(水) 20:29:12
C初心者がLSI Cに手を出すと痛い目に遭うorz
C言語以外の事で悩むことが多くて、結局Quick-C買ったな。
今はネットで情報探せるから、多少ましになってるかもしれんが。

>>501
srand無しでのrand()は、常に同じシーケンスの値を返す可能性がある。
よって、srand(rand())した後のrand()も同じシーケンスの値を返す可能性がある。

……srandのseedに同じ値を渡したとき、同じシーケンスを生成って保証されていたっけ?
503デフォルトの名無しさん:2006/09/20(水) 20:34:58
>>501
それでは無意味。

srand(rand());とすると、内側のrandの呼出時にはまだsrandが呼ばれていない。
srandが1度も呼び出されないままrandが呼ばれるた場合、
randは、予めsrand(1)を行っていた場合と同じ値を返すようにならなければならないと定められている。

だから内側のrandは結局毎回同じ値を返すことになるので、
それではsrandに定数を与えて乱数列を初期化するのと同じことになってしまう。
504デフォルトの名無しさん:2006/09/20(水) 21:04:36
つりだろ
505デフォルトの名無しさん:2006/09/20(水) 21:42:13
質問です今困っています。
とあるプログラムを書いているのですが
メモリ使用量が増え続けるのです。
動的変数は使っていません。
考えられる原因を教えてください。
506デフォルトの名無しさん:2006/09/20(水) 21:44:47
そのエディタにバグがある。
507デフォルトの名無しさん:2006/09/20(水) 21:50:10
エディタとはエディタ自体の拡張機能にバグがあるということですか?
508デフォルトの名無しさん:2006/09/20(水) 21:52:19
>動的変数は使っていません。
ほんとか?
509デフォルトの名無しさん:2006/09/20(水) 21:56:55
はい
外部変数と自動変数しか使っていないのですが
510デフォルトの名無しさん:2006/09/20(水) 22:00:06
エディタにバグが無くても普通に使ってれば文字の追加に伴いメモリ使用量は増えるよな。
511デフォルトの名無しさん:2006/09/20(水) 22:05:57
>メモリ使用量が増え続けるのです。
現象が再現されるぎりぎりまでコードを絞ったら
何か分かるんじゃないか?
512デフォルトの名無しさん:2006/09/20(水) 22:07:12
すいません言葉が不適切でした
今作っているプログラムを起動するとメモリ使用量が増えます。
513デフォルトの名無しさん:2006/09/20(水) 22:12:26
そりゃ増えるさ。
514デフォルトの名無しさん:2006/09/20(水) 22:13:22
今作っているのはゲームでモード別に分けてあるんですが
どのモードでも使用率が増えてしまいます
515デフォルトの名無しさん:2006/09/20(水) 22:15:33
昨日もそれで悩んでいたんですが放っておいたら1Gまで増えました
まだ増え続けていたんですがそこで終了しました
516デフォルトの名無しさん:2006/09/20(水) 22:17:15
ウミガメのスープみたいだなw
エスパー期待するにしてもせめてもう少し解るように書いてくれよ。
517デフォルトの名無しさん:2006/09/20(水) 22:20:06
入れ子になったままどんどん処理してるだろ。
518デフォルトの名無しさん:2006/09/20(水) 22:24:00
え〜と
While文でエラーが出るまでまわしてますけど・・・
519デフォルトの名無しさん:2006/09/20(水) 22:28:02
★★ウミガメのスープ★★@クイズ・雑学板 part60
http://game9.2ch.net/test/read.cgi/quiz/1153486251/
★ウミガメのスープ★@クイズ・雑学板 ★雑談スレ2
http://game9.2ch.net/test/read.cgi/quiz/1113148299/
520デフォルトの名無しさん:2006/09/20(水) 22:30:59
とりあえず
@そもそも何のゲームなのか?
Aモードとは?
521デフォルトの名無しさん:2006/09/20(水) 22:32:43
Bメモリの問題以外は期待通りに動いているのかどうか?
522デフォルトの名無しさん:2006/09/20(水) 22:36:15
現状を一回整理します。
今作っているEXEファイルがあります。
そのEXEファイルを起動し、タスクマネージャーでプロセスを見るとメモリ使用率が1〜6MB/sの速さで増えます。
EXEファイルは音ゲーです。
TITLE・MAIN・ENDを1・2・3の定数にして別に変数xを用意し
switch(x){
case TITLE:
*************
break;
case MAIN:
*************
break;
case END:
*************
break;
}
のようになっています
523デフォルトの名無しさん:2006/09/20(水) 22:36:49
メモリ以外はちゃんと動いています
524デフォルトの名無しさん:2006/09/20(水) 22:39:41
ゲームならそれなりの大きさだろ。mallocもnewもまったく使ってないのか?
525デフォルトの名無しさん:2006/09/20(水) 22:41:01
はい
まだCをはじめたばかりなので存在を知りませんでした。
526デフォルトの名無しさん:2006/09/20(水) 22:43:00
EXEファイル自体は1.2Mです
527デフォルトの名無しさん:2006/09/20(水) 22:44:20
たぶんスレ違い。
528デフォルトの名無しさん:2006/09/20(水) 22:47:26
じゃあ内部でメモリ確保するライブラリ呼んで、対応する
開放ルーチン呼んでないんじゃないのか?

それにしても、はじめたばかりでexeが1.2MBってのはでかいな。
何かあるのかもね
529デフォルトの名無しさん:2006/09/20(水) 22:58:06
え〜と
メモリ確保はint/char/float/stringで変数を宣言したくらいです。
構造体変数 abc があるんですけどそれが配列でabc[1000]にしてあります。
ほかにchar efg[100][30];などもあるんですけど原因はここら辺でしょうか?
530デフォルトの名無しさん:2006/09/20(水) 23:05:35
ポインタをJava/C#とかの参照と勘違いしていて、
delete無しでnewしまくり、とか。
531デフォルトの名無しさん:2006/09/20(水) 23:14:07
クラスは作っていません
532デフォルトの名無しさん:2006/09/20(水) 23:16:06
>int/char/float/stringで変数を宣言
stringがある時点で本当にC言語か?
533デフォルトの名無しさん:2006/09/20(水) 23:16:49
音ゲーって書いてたけど、音鳴らすのにWindowsAPIとか使ってんの?
534デフォルトの名無しさん:2006/09/20(水) 23:17:31
少し話がそれるんですが試行錯誤の上で動的変数を試してみたときに強制終了してしまいました。
535デフォルトの名無しさん:2006/09/20(水) 23:18:59
ソースファイルは.cppにしてあります。
音を鳴らすのはDXライブラリのPlaySoundMemを使っています
536デフォルトの名無しさん:2006/09/20(水) 23:19:46
話しそらすなよ。stringがある時点で本当にC言語か?
537デフォルトの名無しさん:2006/09/20(水) 23:20:50
stringは文字列の足し算のときに使いました。
538デフォルトの名無しさん:2006/09/20(水) 23:22:01
拡張子cppの時点で絶対にC++だ。
539デフォルトの名無しさん:2006/09/20(水) 23:24:35
だからstringはC言語に無い。何のstringだ?
C++で何かのライブラリ使ってんの?

いずれにせよここで聞いてても答えは分らないと思うよ。
基本的な文法ミスとかじゃなくて、組み上げる上でのスキルが
そもそも足りてない感じだから。

いきなり1.2MBなんてでかいプログラムじゃなくて、
Hello Worldからやり直した方が吉
540デフォルトの名無しさん:2006/09/20(水) 23:24:59
DXライブラリが使いたかったんで・・・
541デフォルトの名無しさん:2006/09/20(水) 23:27:08
だからそれを行うための積み上げが君の中で足りてないって
言ってるの。走る前にしっかり歩けるように勉強した方がいい。
542デフォルトの名無しさん:2006/09/20(水) 23:28:31
stringとfstreamも使ってます
543デフォルトの名無しさん:2006/09/20(水) 23:34:05
ちなみに理3です。
544デフォルトの名無しさん:2006/09/20(水) 23:37:40
ありえない
545デフォルトの名無しさん:2006/09/20(水) 23:38:32
さぁ、偽物も出てきて盛り上がって参りましたw
546デフォルトの名無しさん:2006/09/20(水) 23:43:43
547デフォルトの名無しさん:2006/09/21(木) 00:05:05
自動変数の破棄はどうすればいいんですか
548デフォルトの名無しさん:2006/09/21(木) 00:07:36
スコープから抜ければいい。
549デフォルトの名無しさん:2006/09/21(木) 00:09:24
関数のスコープから抜けるのではだめなのですか?
550デフォルトの名無しさん:2006/09/21(木) 00:10:37
関数の定義のスコープから抜けるのではだめなのですか?
551デフォルトの名無しさん:2006/09/21(木) 00:29:47
秋田
552デフォルトの名無しさん:2006/09/21(木) 00:30:50
メモリ問題解決しました。
スコープを抜けても自動変数が破棄されなかったのでやむを得ずすべてグローバル変数にしました。
553デフォルトの名無しさん:2006/09/21(木) 00:47:54
抜ける前に自分で破棄しろよ
そんなのグローバル変数を使う止むを得ない理由にはならんぞ
554デフォルトの名無しさん:2006/09/21(木) 00:52:11
破棄の仕方教えてください!!
555デフォルトの名無しさん:2006/09/21(木) 00:53:44
いったいどんなコードを書けば破棄されないのかと問いたいわ。
そしてグローバル変数にすれば問題なくなるとは如何に。
556デフォルトの名無しさん:2006/09/21(木) 00:56:47
int foo()
{
char *p = malloc(1024);
}
557デフォルトの名無しさん:2006/09/21(木) 00:57:21
自動変数を使っていたら破棄されずにどんどん新しいのを作ってメモリが・・・となってしまったわけです
558デフォルトの名無しさん:2006/09/21(木) 00:58:25
派手にメモリリークしまくって、メモリを食い尽くしてOSごと落とす最強のプログラムができてる悪寒。
何日動くか耐久ベンチやろうぜ(w
559デフォルトの名無しさん:2006/09/21(木) 00:59:08
自動変数自体というより
スコープ内で割り当てた自動変数から辿れる領域が
そのままになってるんじゃないのか?
560デフォルトの名無しさん:2006/09/21(木) 00:59:30
すいません
int foo()
{
char *p = malloc(1024);
}
でさえついていけなくなりました
561デフォルトの名無しさん:2006/09/21(木) 01:01:32
スコープ内で開放ルーチンは一切つかっておりません
何か必要でしょうか?
562デフォルトの名無しさん:2006/09/21(木) 01:02:52
#include<stdio.h>
void main (void)

{

int year;

printf("how old are you?\n");

scanf("%d",&year);

switch {

case1: year<30
printf("you are young");
break;

case2: year>=30&&year<60
printf("chuunenn.");
break;

case2: year>=59&&year<100
printf("otoshiyori.");
break;

default: year>=100
printf("you are lying! aren't you??!!.\n");

}
printf("The program end.Thank you for answer.\n")
}
563デフォルトの名無しさん:2006/09/21(木) 01:02:55
お前に必要なのは開放ルーチンだ
564デフォルトの名無しさん:2006/09/21(木) 01:04:37
最後のプリントエフのところのせみころんがぬけてた、。・ 訂正。
565デフォルトの名無しさん:2006/09/21(木) 01:06:51
上の年齢判定プログラムの意図がわからないのですが
開放ルーチンが必要なことがよくわかりました
ありがとうございました
566デフォルトの名無しさん:2006/09/21(木) 01:07:00
>>562
あんたに必要なのはCの制御構文の再勉強だ
switch文はそんな書き方はしないし、
たぶんやりたいことはswitch文でなく、
if...else if...elseでできる。
567デフォルトの名無しさん:2006/09/21(木) 01:07:44
自分を解き放て。

ω
568デフォルトの名無しさん:2006/09/21(木) 01:08:27
買うべき本を間違えたのか
萎え
569デフォルトの名無しさん:2006/09/21(木) 04:08:19
 ヽ('A`)ノ  開放ルーちん!
  (  ) ゛
 ゛/ω\

 __[警]
  (  ) ('A`) !?
  (  )Vノ )
   | |  | |
570デフォルトの名無しさん:2006/09/21(木) 06:13:19
(´・ω・`)   n
⌒`γ´⌒`ヽ( E)  グッジョブ
( .人 .人 γ ノ
ミ(こノこノ `ー´
)にノこ(
571デフォルトの名無しさん:2006/09/21(木) 17:08:19
いきなりゲーム作るか? そもそも..
572デフォルトの名無しさん:2006/09/21(木) 17:30:35
WinXPを使っているのですが、"\x1B[2J"などのエスケープシーケンスが使えません。
VC++とBccとLSI-C全て試したのですが、できませんでした。
config.ntファイルも編集したのですが、動きませんでした。
私の環境ではエスケープシーケンスを使うのは無理なのでしょうか?
573デフォルトの名無しさん:2006/09/21(木) 17:37:01
>>572
ansi.sys入れてもだめか。
574デフォルトの名無しさん:2006/09/21(木) 17:38:48
>>572
諦めろ。NT系ではエスケープシーケンスを使うのは限りなく無理。
勿論代わりの方法がWindows APIに関数として用意されている。
ttp://www.kumei.ne.jp/c_lang/intro/no_58.htm
575572:2006/09/21(木) 17:43:05
>573
本に従って、config.ntファイルに
device=%SystemRoot%\system32\ansi.sys
dosonly
を追加したんですが、
printf("\x1B[2J"); を試してみたら、
変な記号が出ただけでした…
576デフォルトの名無しさん:2006/09/21(木) 17:47:17
>>575
LSI-Cでやったか?

NTでansi.sysのエスケープシーケンスが使えるのは、
16bit DOSアプリケーションだけだぞ。
577デフォルトの名無しさん:2006/09/21(木) 17:50:43
teraterm使えばいいじゃん。
578デフォルトの名無しさん:2006/09/21(木) 17:52:44
>576
LSI-Cでもやったのですが、
←[2J と出ただけでした(泣)
579デフォルトの名無しさん:2006/09/21(木) 17:54:15
ボーランドのフリーコンパイラなら
画面制御が簡単に使えるからとりあえずそっち使っとけば?
conio.h 読めばすぐ解るよ。
580デフォルトの名無しさん:2006/09/21(木) 19:09:35
>>575
>>579の方法なら、
ESC[2J(画面消去)はclrscr()で一発
581572:2006/09/21(木) 22:02:47
>580
画面消去はsystem("cls")で対応していたのですが、
今読んでいる本でエスケープシーケンスが多用されていたので…
582デフォルトの名無しさん:2006/09/22(金) 00:11:34
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

main(){
int player = 0, computer;

srand(time(NULL));

printf("【ジャンケンゲーム】\n");

printf("ジャンケンゲーム・・・(グー:1 チョキ:2 パー:3を入力) > ");
scanf("%d", &player);

computer = rand()%3 + 1;
printf("コンピュターは");
if(computer == 1) {printf("グー");}
else if(computer = 2) {printf("チョキ");}
else {printf("パー");}
printf("! ");

if(computer == player){printf("あいこ\n");}
else if(player == 1 && computer == 2) {printf("プレイヤーの勝ち\n");}
else if(player == 2 && computer == 3) {printf("プレイヤーの勝ち\n");}
else if(player == 3 && computer == 1) {printf("プレイヤーの勝ち\n");}

return 0;
}
583デフォルトの名無しさん:2006/09/22(金) 00:12:20
>else if(computer = 2) {printf("チョキ");}
584デフォルトの名無しさん:2006/09/22(金) 00:13:26
こうすると、コマンドプロンプトで
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
janken.c:
警告 W8060 janken.c 23: おそらく不正な代入(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

と警告が表示されますが無視して、実行しても構わないのでしょうか?
もし、違っている部分が有れば、どの箇所に誤りがあるか、ご指摘頂けると幸いです。
585デフォルトの名無しさん:2006/09/22(金) 00:13:59
>23: おそらく不正な代入
586デフォルトの名無しさん:2006/09/22(金) 00:15:12
23ってのが23行目だってことは知ってる?
警告文は読める?
587デフォルトの名無しさん:2006/09/22(金) 00:19:25
23行目else if(computer = 2) {printf("チョキ");} の
何が違っているのかわかりません。

本の通りにやっていrのですが・・・
588デフォルトの名無しさん:2006/09/22(金) 00:21:31
>>587
もう一度一文字ずつよく見ろカスが
589デフォルトの名無しさん:2006/09/22(金) 00:23:37
ありがとうございました。
自分の不注意でした。
590デフォルトの名無しさん:2006/09/22(金) 00:35:11
ソースを見て自分のミスに気づかないのはよくある。
まずはあれだ、警告文を良く見る癖をつけようぜ。
「代入」って単語について1秒でも気をつけれていればすぐに解決するはず。
591デフォルトの名無しさん:2006/09/22(金) 00:55:55
本当に本のとおりなら本の印刷が間違っている。
592デフォルトの名無しさん :2006/09/22(金) 12:20:39
すみません、正しく計算されなくて本当に困っています。
#define PI 3.141592654
sin(PI);の値に0が出てこないのですがパソコンが壊れているのでしょうか?
もしよろしければ解決方などのアドバイスをお願いします。m(_ _)m
593デフォルトの名無しさん:2006/09/22(金) 12:23:23
#include <math.h>
594デフォルトの名無しさん:2006/09/22(金) 13:39:20
>>592
πと3.141592654との誤差があるので、sin(PI)は0にはなりません。
#多分、-1e-10程度になったのではないかと思いますが。
環境にも拠りますが、math.hにかなり正確なM_PIが定義されていると思うのでその値で試してみてください。
恐らく、1e-15程度に0に近い数値になるはずです。
595デフォルトの名無しさん:2006/09/22(金) 14:48:47
以下のようなファンクションがあるのですが、

void spi_tx(USHORT adrs, USHORT data) {
USHORT tx_stream;

while ((*(UINT *)McBSP0_SPCR&0x00020000)==0); // wait until tx ready
tx_stream=(adrs&0x0f)<<9;
tx_stream=tx_stream|(data&0x01ff);
*(USHORT *)McBSP0_DXR=tx_stream;
}

*(USHORT *)や(*(UINT *))みたいな部分は一体なにをやってるのでしょうか?もし、参考になるような
サイトがありましたら、ついでにお教え願います。
596デフォルトの名無しさん:2006/09/22(金) 14:53:31
>>595
キャスト演算子と間接参照演算子など。
597595:2006/09/22(金) 15:19:37
一個目の*は間接参照演算子で説明がつきますが、2個めの*がなんなのか意味がわかりません
598デフォルトの名無しさん:2006/09/22(金) 15:21:19
2個目の*はUINTでそのアドレスにアクセスして読んでいる。
599デフォルトの名無しさん:2006/09/22(金) 16:00:19
メモリマップドI/Oだね
600デフォルトの名無しさん:2006/09/22(金) 16:03:33
まあ、俺なら
#define McBSP0_SPCR xxx
だけじゃなくて
#define McBSP0_SPCR_DATA (*(volatile UINT *)McBSP0_SPCR)
みたいなのを用意して
見た目グローバル変数みたいにするけどな。
601デフォルトの名無しさん :2006/09/22(金) 17:29:21
>>594
誤差だったんですね!
教えて頂きありがとうございました。
602デフォルトの名無しさん:2006/09/22(金) 17:33:56
そう。πは3だから。
603デフォルトの名無しさん:2006/09/22(金) 22:30:52
>>601
#define PI 3.141592653589793

この桁まで定義すれば充分。
逆に、これより少ない桁数だと不十分。
604デフォルトの名無しさん:2006/09/22(金) 23:16:40
おいおい…
605595:2006/09/23(土) 10:40:20
なるほどありがとうございます。
>>600
なんで、#define McBSP0_SPCR xxx
ってなってるってわかるんですか?
606デフォルトの名無しさん:2006/09/23(土) 14:49:16
エスパーだから
607デフォルトの名無しさん:2006/09/23(土) 18:40:30
ソースみれば
あぁ整数をポインタとして扱ってるぽいな

と普通思うから
608デフォルトの名無しさん:2006/09/25(月) 12:57:22
#include<stdio.h>

int REsize(char *x)
{
return ( sizeof(x) );
}

int main(void)
{
char buf[256];

printf("%d\n",REsize(buf));

return 0;
}

これを実行すると
4
となります。bufの配列長を戻したいときにはどうすればいいのですか?
609(^-^) ◆MONSOON/qo :2006/09/25(月) 13:24:31
>>608
char型ポインタのサイズ( 32bit )をかえしているとおもわれ
610デフォルトの名無しさん:2006/09/25(月) 13:49:31
>>608
REsize()はcharへのポインタのサイズを返す関数なので意図したものは返らない。

int main(void)
{
char buf[256];

printf("%d\n", sizeof(buf));

return 0;
}
としない理由は何?
611デフォルトの名無しさん:2006/09/25(月) 13:51:18
609のとおり。32bitとはナンセンスだがまあいい。

REsizeの中では、bufの大きさを知ることは不可能。
たとえばfgetsのように大きさを別途渡すのが、Cでは一般的。
612デフォルトの名無しさん:2006/09/25(月) 13:56:26
>>610
main関数で定義した配列長を、外部関数から戻り値として戻せるのかなと思い質問させていただきました。

>>611
配列長は配列長で別に引数として渡すことにします。どうもありがとうございます。
613(^-^) ◆MONSOON/qo :2006/09/25(月) 14:02:44
>>612
ポインタだけからでも多分出来るよ
sizeofの動作を調べればいい
bufには変数の型が記録されているはず
それを自力で取得するんだ
614(^-^) ◆MONSOON/qo :2006/09/25(月) 14:08:28
変数の型はどこに記録されてるの?取得することは可能?
615デフォルトの名無しさん:2006/09/25(月) 14:16:28
その珍妙な自作自演コテはどうにかならんのか。

C++ならtypeidが使えるが、Cでは基本無理。
616デフォルトの名無しさん:2006/09/25(月) 14:16:55
>>613-614
Cではどこにも記録されないのが原則。
デバッガを使うのでもない限り不要だから。

sizeofは定数を返す、つまりコンパイル時に値が決まるのが原則。
C99の可変長配列は例外だが、sizeofの結果はソースコード上の型で決まることに変わりはないので、
608のコードではやはり4が返ることに変わりはない。
617デフォルトの名無しさん:2006/09/25(月) 14:19:21
>>615
608のREsizeの中でtypeid (x)を使っても、
それはtypeid (char*)と同じことになるので、
sizeofと全く状況は変わらない。

C++ならむしろRangeとして参照を受け渡すようにすれば、boost::sizeが使える。
618(^-^) ◆MONSOON/qo :2006/09/25(月) 14:20:41
>>616
コンパイル時の型チェックが済めば型は記録されないって事か
619デフォルトの名無しさん:2006/09/25(月) 16:16:57
>618
そういうこと。
620デフォルトの名無しさん:2006/09/25(月) 18:31:59
解らなくて困っています、助言お願い致します。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

main(){
int player,computer;
int limit = 5; //5の繰り返し
int i;

printf("【%d回勝負ジャンケンゲーム】\n",limit);
srand(time(NULL));
for(i = 0; 1<limit; i++){
printf("ジャンケンゲ・・・(グー:1 チョキ;2 パー:3を入力) > ");
player = 0;
scanf("%d", &player);
while(getchar() != '\n') {}
computer = rand()%3 + 1;
printf("コンピュターは");
if(computer == 1) {printf("グー");}
else if(computer == 2) {printf("チョキ");}
else{printf("パー");}
printf("! ");

if(computer == player) {printf("あいこ\n");}
else if(player == 1 && computer == 2) {printf("プライヤーの勝ち\n");}
else if(player == 2 && computer == 3) {printf("プレイヤーの勝ち\n");}
else if(player == 3 && computer == 1) {printf("プレイヤーの勝ち\n");}
else {printf("コンピュターの勝ち\n");}
}
return 0;
}
621デフォルトの名無しさん:2006/09/25(月) 18:33:11
このソースだと
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
3-1.c:
警告 W8004 3-1.c 34: 'i' に代入した値は使われていない(関数 mai
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

表示されてしまます、34行目の何が違うかわかりません
622デフォルトの名無しさん:2006/09/25(月) 18:43:00
for(i = 0; 1<limit; i++){

for(i = 0; i<limit; i++){
623デフォルトの名無しさん:2006/09/25(月) 19:10:12
真にありがとうございました。
こんなミスよくわかりますね
624デフォルトの名無しさん:2006/09/25(月) 21:04:57
#include <stdio.h>

main(){
int player;
int i;
for(i = 0; i<5; i++ )
{scanf("%d",&player);
printf("%d 回目 %d\n", i+1, player);}

return 0;
}

3
1 回目 3
100
2 回目 100
6
3 回目 6
5
4 回目 5
345
5 回目 345

このソースを実行すると、ちゃんと成功しますが疑問があります。


625デフォルトの名無しさん:2006/09/25(月) 21:06:11
printf("%d 回目 %d\n", i+1, player);} のソース部分で
%d\n には3を入力すると結果3が出ますが
最初の1回目となる %d には何故1と入力していないのに
勝手に1回目と表示されるのでしょうか?仕組みがわかりません
例3 ←3を入力

1 回目 3

何故、1と入力していないのに、1が出るんでしょうか?

もう一つの疑問が i+1 と言う部分です
これはこのソースの意味上、どういう意味(役割)あるのでしょうか?
626デフォルトの名無しさん:2006/09/25(月) 21:09:47
stat.hを使わずにファイルサイズを調べる方法はありませんか?
627(^-^) ◆MONSOON/qo :2006/09/25(月) 21:16:10
>>624
これ動かしてみて

#include <stdio.h>

main(){
int i;
for(i = 0; i<20; i++ ){
printf("%d×%dは%dです\n",i,i,i*i);
}
}
628デフォルトの名無しさん:2006/09/25(月) 21:19:58
ご返答、ありがとうございます。
>>627さんのソースで入力してみたら
3は3、1は1と言うような結果出ましたが・・・
629デフォルトの名無しさん:2006/09/25(月) 21:22:30
もぅC言語を勉強しようとして何度もコンパイラーなどを入れようとしているのですが
もうだいぶ自分の力では無理だということに気づきました。
C言語の参考書などで、もうcpadなどもすべて入っているものはありませんか??
630デフォルトの名無しさん:2006/09/25(月) 21:22:41
【ジャンケンゲーム】
ジャンケンゲーム・・・・(グー:1 チョキ:2 パー:3を入力) > 3
プレイヤーは 3

【ジャンケンゲーム】
ジャンケンゲーム・・・・(グー:1 チョキ:2 パー:3を入力) > 1
プレイヤーは 1
631(^-^) ◆MONSOON/qo :2006/09/25(月) 21:22:53
>>628
1 × 1 は 1 って出なかった?
そして19までくりかえさなかった?
632デフォルトの名無しさん:2006/09/25(月) 21:24:21
>>626
fseek ファイルサイズでググると見つかるかも
633デフォルトの名無しさん:2006/09/25(月) 21:27:19
>>631
いえ・・・>>630の結果が出ただけですが・・・
634デフォルトの名無しさん:2006/09/25(月) 21:31:06
>>629
先ずは日本語から。
635(^-^) ◆MONSOON/qo :2006/09/25(月) 21:33:06
>>633
for(i = 0; i<5; i++ )
の意味は、0から5未満までiを動かすということ。


printf("%d \n", i+1 );
の意味はi+1を整数出力( %d ) して改行(\n) するということ。
636デフォルトの名無しさん:2006/09/25(月) 21:40:07
>>635
>>printf("%d \n", i+1 );
の意味はi+1を整数出力( %d ) して改行(\n) するということ。

これの意味がいまいちわかりません、
i+1 が %d \n に代入されるんですよね?
それで何故、1 回目 3
      ↑
の1がでるのでしょうか?
637デフォルトの名無しさん:2006/09/25(月) 21:42:46
代入じゃないんだが・・・
ループの最初は
i=0
だろ
638デフォルトの名無しさん:2006/09/25(月) 21:42:47
じゃあ何が出たら不思議じゃないの?
639デフォルトの名無しさん:2006/09/25(月) 21:44:49
ん〜・・・何が何だか混乱してきました、すみません
もう一回参考書などを読み直して出直して来ます
640(^-^) ◆MONSOON/qo :2006/09/25(月) 21:45:12
>>636
printf("%d 回目 %d\n", i+1, j)の意味は 

%d( i+1で置き換わる)  回目 %d( jで置き換わる) \n(改行する)
が出力される

printf("%d 回目\n\n %d", i+1, j)だと
i+1のあとに2つ改行してからjが出力される
641(^-^) ◆MONSOON/qo :2006/09/25(月) 21:46:45
>>638
printfの構文とforの構文がわかっていないとおもわれ
642デフォルトの名無しさん:2006/09/25(月) 21:51:16
>>(^-^) ◆MONSOON/qo
ありがとうございます。

たぶん、forとprintfが混乱してるかもしれません
自分の認識だと、簡単に言えばfor文は繰り返し
printf文は文字を出力です・・・
643デフォルトの名無しさん:2006/09/25(月) 21:56:02
>◆MONSOON/qo
こいつのせいでスレの密度が薄まる薄まる
644デフォルトの名無しさん:2006/09/25(月) 22:16:26
とあるマイコンの内部レジスタにデータを書くときに、
自分は

#deifine LAMP_RED (*(unsigned char *)0x8888)
#define LAMP_ON 1
#defrine LAMP_OFF 0

LAMP_RED = LAMP_ON;
のように書くのですが、

#deifine LAMP_RED (*(unsigned char *)0x8888)
#defrine LAMP_RED_ON ( LAMP_RED = 1; )
#define LAMP_RED_OFF ( LAMP_RED = 0; )

LAMP_RED_ON;

と書く人がいるようです。いきなり関数の中にマクロが出てくるのが気持ちが悪いのですが。
どっちが一般的で正しいのでしょうか?
645デフォルトの名無しさん:2006/09/25(月) 22:24:59
#define LAMP_RED_ON() {LAMP_RED = 1;}

LAMP_RED_ON();
646デフォルトの名無しさん:2006/09/25(月) 22:25:46
そんなことオレが知るかよ。
質問するスレを間違えてるんじゃねえのか。
647デフォルトの名無しさん:2006/09/25(月) 22:30:31
じゃレスするなよ
648644:2006/09/25(月) 22:36:03
下のほうは()じゃなくて{}でした。間違ってましたすみません。
>>645がしっくりしてますね。ありがとうございます。
649デフォルトの名無しさん:2006/09/25(月) 23:48:12
char *tmp = "AAA\0BBB\0CCC";

array[0] = "AAA"
array[1] = "BBB"
array[2] = "CCC"
みたいに配列に入れるにはどうすれば
よいですか?
標準関数だと、途中のNUL文字が邪魔でうまく
値をとれません。
650デフォルトの名無しさん:2006/09/26(火) 00:01:40
arrayがchar*の配列なら、

char tmp[] = "AAA\0BBB\0CCC";

size_t n=0;
int i=0;
while(n > sizeof(tmp))
{
array[i] = &tmp[n];
n += strlen(&tmp[n])+1;
++i;
}

とかじゃ駄目かね。
651デフォルトの名無しさん:2006/09/26(火) 00:02:26
間違えた。
while(n < sizeof(tmp))
だ。すまん。
652デフォルトの名無しさん:2006/09/26(火) 00:35:18
>>651
ありがとうございました。
やりたいことができました。
653デフォルトの名無しさん:2006/09/26(火) 02:26:17
stat.hを呼びたくない理由って何?
654デフォルトの名無しさん:2006/09/26(火) 08:11:44
2次元配列の要素は、およそどのくらいの規模まで用意し、
使用できるのでしょうか?

例えば、100万×10=1000万要素の二次元配列を使用することは
可能ですか?

PCのメモリは512です。
どうぞよろしくお願いします。
655デフォルトの名無しさん:2006/09/26(火) 08:38:22
やってみりゃいいじゃん
656デフォルトの名無しさん:2006/09/26(火) 08:48:21
わからないならレスしないでください。
657デフォルトの名無しさん:2006/09/26(火) 09:02:16
>>654
それほど大きなメモリは動的確保するのが一般的。

ただし静的あるいは大域変数ならそれ位の要素があっても平気だと思う。
自動変数でも、スタックをかなり大きくとれば平気なはず。
だが、それでも動的確保するのが一般的。

それ程の量のメモリを使うとなると、メモリ確保できなかった場合をまじめに考える必要が出てきる。
動的確保以外では、メモリ確保できなかった場合、プログラム内からは殆どと言って良いほど何もできない。
動的確保なら比較的自由にエラー処理を行える。そのためもあって動的確保が好まれている。
658デフォルトの名無しさん:2006/09/26(火) 09:59:09
>>657
適当いってんじゃねー、タコ
659デフォルトの名無しさん:2006/09/26(火) 10:49:32
>>658
うるせーぬるぽ
660デフォルトの名無しさん:2006/09/26(火) 12:07:47
ガッ!!。。
661デフォルトの名無しさん:2006/09/26(火) 13:14:25
動的確保だと、メモリがフラグメントされて遅くなるし、必要になったときにメモリが確保される保証も無い。
処理の最終段階でメモリが足りませんでしたって終了してしまって、時間だけを無駄に消費させるプログラムを書くプログラマはクズだと思う。

DOSで全メモリを自由に使えた時代は良かった。
662デフォルトの名無しさん:2006/09/26(火) 13:18:55
使うかどうか判らないのに大量のメモリを占有するプログラムも嫌だけどな。
663デフォルトの名無しさん:2006/09/26(火) 13:19:35
>>661 お前がクズなんじゃないか?
664デフォルトの名無しさん:2006/09/26(火) 13:26:16
セグメント:オフセットの世界へは戻りたくないな。
665デフォルトの名無しさん:2006/09/26(火) 14:10:33
DOS時代が良かったって?
DOSに仮想記憶ってあったっけ?

動的確保でフラグメントされるって何?
動的確保だと必ず細切れ確保しなきゃいけないとでも思ってるの?
666デフォルトの名無しさん:2006/09/26(火) 14:31:48
知識がない馬鹿は放っておくのがいいよ。
667デフォルトの名無しさん:2006/09/26(火) 18:00:25
すいません。なぜエラーになるか分からないので教えてください。
BCC Developerを使っています。

#include <stdio.h>

int main(void)
{
printf("Hello, world");
return 0;
}

なのですが・・・。
エラー E2268 c:\gengo\aki\a\w.cpp 8: 未定義の関数 'printf' を呼び出した(関数 main() )
*** 2 errors in Compile ***

** error 1 ** deleting Debug\w.obj

と出てしまいます。お願いします。

Compile End !! (Elapsed time 0:00.093)
668(^-^) ◆MONSOON/qo :2006/09/26(火) 18:16:39
>>667
↓は動きますか?


#include <iostream.h>

int main(void)
{
cout << "Hello, world!\n";
return 0;
}
669デフォルトの名無しさん:2006/09/26(火) 18:23:51
>>668
氏ね
670デフォルトの名無しさん:2006/09/26(火) 18:28:56
>>669
それをCで表現しろ
671デフォルトの名無しさん:2006/09/26(火) 18:35:28
連鎖あぼーん機能を初めて使ったぜ。
すっきり。
672デフォルトの名無しさん:2006/09/26(火) 18:36:38
>>667
スレ違い。
673デフォルトの名無しさん:2006/09/26(火) 18:47:18
#include <stdio.h>
int main(void)
{
int a,b=2;
a=b++;
printf("a=%d\nb=%d\n",a,b);
return 0;
}


実行結果
a=2
b=3

このソースなのですがエラーとかは出ませんが、
=と++の演算子の優先順位に疑問があります。
参考書には++の方が=よりも優先順位が高いとなっているのですが、
そうするとこの場合まずb++を処理してその値をaに代入することになり、
a=3
b=3
になると思うのですが結果は違いますよね?
この場合はどのように考えればいいのでしょうか?
詳しい方お教え下さい。よろしくお願いいたします。
}
674デフォルトの名無しさん:2006/09/26(火) 18:59:35
>>673
後置インクリメント演算子は、結果としてインクリメント前の値を返す。
従って、疑問の余地なくこの場合は2となる。
675デフォルトの名無しさん:2006/09/26(火) 19:07:14
>>674
嘘を言わないように。
676デフォルトの名無しさん:2006/09/26(火) 19:08:44
>>668
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\gengo\aki\q\e.cpp:
エラー E2209 c:\gengo\aki\q\e.cpp 1: インクルードファイル 'iostream.h' をオープンできない
エラー E2451 c:\gengo\aki\q\e.cpp 6: 未定義のシンボル cout(関数 main() )
*** 2 errors in Compile ***

** error 1 ** deleting Debug\e.obj

Compile End !! (Elapsed time 0:00.094)

と出でしまいました。

スレ違いだったらすいません。
677デフォルトの名無しさん:2006/09/26(火) 19:09:03
かえれ!
678デフォルトの名無しさん:2006/09/26(火) 19:14:52
>>675
どこが嘘?
もしかして:675=無知故に釣りに失敗した673?
679デフォルトの名無しさん:2006/09/26(火) 19:16:38
>>675
なんで?>>674はあってるだろ?何か見落としてるかな…
680デフォルトの名無しさん:2006/09/26(火) 19:16:42
>>673
優先順位はあってるでしょ。
a = b++
は、
a = (b++)
であって、
(a = b)++
ではないのだから。
681(^-^) ◆MONSOON/qo :2006/09/26(火) 19:16:52
>>676
もう一度、ボーランドC++5.5のインストールした方がいいかもしれないです
一度、c:\bcc5.5っていうフォルダを削除して再インストールしてみてください

直リン
ftp://ftp.borland.co.jp/pub/cppbuild/freecommandlinetools2.exe
ftp://ftp.borland.co.jp/pub/cppbuild/freecommandlinetools_update.exe
http://www.cmagazine.jp/download/setbcc15b.exe
682デフォルトの名無しさん:2006/09/26(火) 19:28:53
いい加減、スレ違いなんだが
683673:2006/09/26(火) 19:31:47
673です。釣りじゃありませんtt
最近はじめたばかりなので言ってることがおかしかったらすいません。

>>674
これは後置インクリメントが先に処理されてもっていう意味でしょうか?
値を返した後に+1するっていうことですか?

>>680
優先順位があっているならば、b++の段階でbに+1されるのではないのですか?
そもそもこの考え方がおかしいのかな?
684デフォルトの名無しさん:2006/09/26(火) 19:34:14
>>681
お前この前からいい加減にしたらどうだ。
iostream.hの名前自体が現在使用を勧められるものじゃないだろが。
>>676
多分

#include <iostream.h>を
#include <iostream>にするだけで通るぞ。

iostream.h のファイル名は古い仕様のC++のもので、
今現在も使用可能な場合があるのは、単にベンダ側が
過去に配慮しているってだけ。
使えなくても怒られた義理じゃない。
#include <iostream>も通らない様なら、includeのパスの問題だろうが。

元のソースコードはいつのものだ?
685デフォルトの名無しさん:2006/09/26(火) 19:34:35
>>683
・優先順位はあっている
・後置インクリメントは結果としてインクリメント前の値を返す
よって、a = 2, b = 3になる。
686デフォルトの名無しさん:2006/09/26(火) 19:36:58
>>683
>これは後置インクリメントが先に処理されてもっていう意味でしょうか?
>値を返した後に+1するっていうことですか?
Yes

>優先順位があっているならば、b++の段階でbに+1されるのではないのですか?
No
そうしたいなら、 a=++b とする。

>そもそもこの考え方がおかしいのかな?
Yes
前置と後置の違いを勉強してきなされ。
687(^-^) ◆MONSOON/qo :2006/09/26(火) 19:37:07
>>684

>>667はなぜ動かないのか?

688デフォルトの名無しさん:2006/09/26(火) 19:37:17
>>683
後置インクリメントはそうしたものです。
つまり a = b++; と書いた場合、a = b, b++; と等価です。
#仮に、インクリメント後の値を返すとしたら前置インクリメントと同じになっちゃいますね。
689デフォルトの名無しさん:2006/09/26(火) 19:38:00
>>683
いや、それで合ってる。
=より先に++が処理されているし、b++の時点でbには+1されているが、
b++が返すのはbのインクリメント前の値なので、
a=b++は

b++;
a = b;

じゃなくって、概ね

int c = b;
++b;
a = c;

に等しくなる。
690デフォルトの名無しさん:2006/09/26(火) 19:39:43
>>687
スレ違いですから。
691デフォルトの名無しさん:2006/09/26(火) 20:23:05
The result of the postfix ++ operator is the value of the operand. After the result is
obtained, the value of the operand is incremented.
692673:2006/09/26(火) 20:49:14
>>685
>>686
>>688
>>689
>>691
疑問に思っていたことが解消できました。
感謝感謝です。みなさまありがとうございました。
693デフォルトの名無しさん:2006/09/26(火) 21:49:40
コンパイルで
'min'は前方で暗黙的に `int' を返すと宣言されました
とエラーがでるのですが原因はなんなんでしょうか?
int同士で割ってもdouble型に代入したら型はdoubleでprintfできたので
宣言とかの問題ではないとは思うのですが、、、

double Word_Spam(int ngood, int nbad, int good, int bad)
{
double f;
double b,g;

b = bad/nbad;
g = good/ngood;

f = min(1.0, b)/(min(1.0, g)+min(1.0, b));

return f;
}

double min(double a, double b)
{
if(a < b){
return a;
}
else{
return b;
}

}
694デフォルトの名無しさん:2006/09/26(火) 21:55:18
693です。
すみません、自分でなんとかできそうです。。。。たぶん
695デフォルトの名無しさん:2006/09/26(火) 23:01:05
>>694
質問自体はいいとして、 b = bad / nbad;は拙いだろう。
696デフォルトの名無しさん:2006/09/26(火) 23:15:58
>>694

nbad,ngoodが0だと、やばい
あと、関数の宣言の仕方が逆でWord_Spam()の中で
min()を呼び出してるから、まだmin()関数の場所がWord_Spam()内
ではわかってない。
ま、プロトタイプ宣言をヘッダなり、main()の前に書けば良いと思う。
697デフォルトの名無しさん:2006/09/27(水) 00:11:49
#include <stdio.h>

main(){
int d;

do {printf("数値を入力>"); scanf("%d", &d);}
while (d !=!);
return 0;
}

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
ccc4.c:
エラー E2188 ccc4.c 7: 式の構文エラー(関数 main )
*** 1 errors in Compile ***

エラーが出ますが、自分では何がいけないのか検討もつきません
ご指摘お願いします。
698デフォルトの名無しさん:2006/09/27(水) 00:14:09
解決しますた、すんまそ
699デフォルトの名無しさん:2006/09/27(水) 01:04:59
>>696
0の可能性はないとふんでたんですが、よく考えたらありました。。。。
ありがとうございます。関数を呼ぶ前にngood,nbadは0なら+1するようにしました。
>>695
最終的にこうなりましたが、やっぱり拙いでしょうか?
b = (double)(bad)/(double)(nbad);
g = (double)(good)/(double)(ngood);
700デフォルトの名無しさん:2006/09/27(水) 01:19:52
>>699
一応こう書けばすむことを知った上で、後はご自由に。

double b = (double) bad / nbad == 0 ? 1 : nbad; // 0チェックはこっちでやった方が親切
double g = (double) good / ngood == 0 ? 1 : ngood; // その辺も、お好みでどうぞ

double min_b_1 = min(1, b); // 同じ関数を全く同じ条件で2度呼ぶのは一応避けてみた
double min_g_1 = min(1, g); // そうなると立場上、こちらも合わせることに
return min_b_1 / min_g_1 + min_b_1; // fは必ずしも要らない
701デフォルトの名無しさん:2006/09/27(水) 01:34:34
0だった場合に勝手に1にしてしまっていいの?
702デフォルトの名無しさん:2006/09/27(水) 01:58:23
>>700
実際動かしてみましたが
((double) bad / nbad == 0) ? 1 : nbad
とはならずに
(double)(bad)/(nbad == 0 ? 1 : nbad);
になりますね!

0で割るとオーバーフローで落ちること以外になにか致命的なことが起こる可能性
はありますか?(メモリを確保していないとき並にまずいことなど)
検索すればすぐにでてくると思ったのですが案外なかったです。。。
703デフォルトの名無しさん:2006/09/27(水) 02:08:28
701>>
このプログラムは正確な確率を求めるものではないので大丈夫だと思ってます。
nbadなどの値は徐々に増えていくのですが
例えばbad/nbad=200/4000が200/4001になっても確率はそれほど変わらないからです。
704デフォルトの名無しさん:2006/09/27(水) 02:25:29
d != !

これはなんだ。AAか。
冗談はさておき、そこは多分

d != 1

あたりなんじゃないかとエスパー予想。
705デフォルトの名無しさん:2006/09/28(木) 02:34:18
自作プログラムで処理途中のログを特定のフォルダの特定のファイル名で
出力しているのですが、そうすると、同じプログラムを二本同時に
動かすと、ややこしいことになります。
なので、フォルダ名は今まで通り固定しても、ファイル名は実行した
プログラムごとに名前を変えたいのですが、こういう場合、決して
重複しないようにファイル名を作り出す方法って、どういうのが
ありますか?日時やプロセスのIDなどを利用するのが良いでしょうか?
それとも、もっとスマートな方法がありますか?
706デフォルトの名無しさん:2006/09/28(木) 03:24:35
単純に重複排除したいだけなら、日時でいいんじゃまいか?
707デフォルトの名無しさん:2006/09/28(木) 06:41:22
同じくプロセスのIDはそう悪く無い手だとは思うけど、
ファイル名に脈絡の無いゴミ文字が入るのは微妙っちゃ微妙かもかな。
708デフォルトの名無しさん:2006/09/28(木) 08:40:39
ログファイルを排他して一つに複数のプロセスからアクセスするのが常套手段だな。
709デフォルトの名無しさん:2006/09/28(木) 08:49:48
tmpname()
710デフォルトの名無しさん:2006/09/28(木) 09:11:17
>709
おお、こんな便利な関数があったとは!
ありがとうございました。
711デフォルトの名無しさん:2006/09/28(木) 09:54:22
ウインドウズならイベント、
ユニックスならシスログ
に出した方が汎用性があって監視とかも楽だよ。
712デフォルトの名無しさん:2006/09/28(木) 11:27:17
めちゃくちゃ初心者です。C言語をはじめたいけど、ソフトが必要ですよね?高いんですか?どうしればいいんでしょう。
ユニックスってのを入れるんですか?
713デフォルトの名無しさん:2006/09/28(木) 11:32:06
入門書をかえ。
Visual C++ 2005を検索してDLしろ。
714(^-^) ◆MONSOON/qo :2006/09/28(木) 11:39:05
>>712
BCC developerがいいですよ
あと>>681(ボーランドc++)を入れれば直ぐ出来ます

715デフォルトの名無しさん:2006/09/28(木) 12:34:32
716デフォルトの名無しさん:2006/09/28(木) 12:36:00
211じゃなくて>>712だった。
717デフォルトの名無しさん:2006/09/28(木) 13:11:55
初心者ならVisual C++のがいい。
718デフォルトの名無しさん:2006/09/28(木) 14:04:50
質問です
int a=10;
int *pa=&a;
int *pp;
というのがあったとして
ppに&aを入れたいんですが、paを経由して入れるにはどうすればいいですか?
719デフォルトの名無しさん:2006/09/28(木) 14:07:40
pp = pa;
720(^-^) ◆MONSOON/qo :2006/09/28(木) 14:13:59
>>717
初心者にはBCCの方がいいよ
コンパイル速度が速いし複雑さが少ない
721デフォルトの名無しさん:2006/09/28(木) 14:14:25
>>719
ありがとうございました
722デフォルトの名無しさん:2006/09/28(木) 14:25:04
コンパイル時間が気になるほど大きなプログラムは書くようなやつはもはや初心者ではない。
723デフォルトの名無しさん:2006/09/28(木) 14:27:44
おまえ知らないのか?
数あてゲーム程度のプログラムなのに
数万行ものコード書いてくるヤツを。
724デフォルトの名無しさん:2006/09/28(木) 14:27:51
初心者はBCCの場合はDeveloper必須
725デフォルトの名無しさん:2006/09/28(木) 14:30:03
だったら Turbo C++ 1.0 使うといいよ。
IDE付きだからすぐ使える。
ttp://bdn.borland.com/museum/
ここにあるよ。
726デフォルトの名無しさん:2006/09/28(木) 14:43:30
ホントだ。
こりゃ使いやすいや!
727デフォルトの名無しさん:2006/09/28(木) 15:02:59
>>723の初心者の定義を聞きたい
728デフォルトの名無しさん:2006/09/28(木) 15:10:45
>>727
その数万行が全部 main() の中に書いてあるんだぜ?
729デフォルトの名無しさん:2006/09/28(木) 17:28:36
>>728
もはや初心者とか中級者とか上級者で分類できねーYO
おまいがその凝り性を良い方向へ導け
730デフォルトの名無しさん:2006/09/28(木) 19:47:14
むしろそんだけ無駄に何やってるのかが気になる。
ヒンズースクワットしながらピロシキでも焼いてるのか。
731デフォルトの名無しさん:2006/09/28(木) 20:29:40
自作のプログラムで、
整数の割り算をすると答えに小数点以下が表示されない・・・・
(5÷4 = 1.0 と表示されてしまう)

@ 関数の宣言は、 double = ans ; と宣言してるし。
A 表示の部分は  printf("%f\n")で、小数点の表示に対応できるようにしているんですけど。

732デフォルトの名無しさん:2006/09/28(木) 20:39:11
intとintの割り算の結果はintですよ馬鹿
733デフォルトの名無しさん:2006/09/28(木) 20:54:37
>731
#include <stdio.h>
double divine( double a, double b ) {
return ( a / b );
}
int main() {
printf( "%f\n", divine( 4, 5 ) );
return 0;
}

俺が昔消防の頃、割り算が面倒で、N88BASICでツール作ったことがあったが、
剰余の計算方法が解らず「余り」が出せなくて、結局自分で宿題をやった記憶がある。w
734(^-^) ◆MONSOON/qo :2006/09/28(木) 21:01:39
>>731
ans = (double)5/4;
ans = (5+0.0)/4;
と書けばOK

ansがdoubleでも自動では変換されない
735デフォルトの名無しさん:2006/09/28(木) 22:09:50
5.0でいいいやん
736(^-^) ◆MONSOON/qo :2006/09/28(木) 22:26:01
>>735
int a=5, b=4;のときは
ans = (a+0.0)/b; と書くしかないよ
737デフォルトの名無しさん:2006/09/28(木) 22:30:22
Java 5のことだけど?
738デフォルトの名無しさん:2006/09/28(木) 22:46:40
ans = (double)a/b;
739デフォルトの名無しさん:2006/09/28(木) 23:13:45
>>734
スクリプト系の言語ならいざ知らず、Cなら後者はナンセンス。
>>736
そんなことはない。
740デフォルトの名無しさん:2006/09/28(木) 23:24:36
>>738
まともな人間ならこれだな
741(^-^) ◆MONSOON/qo :2006/09/28(木) 23:25:22
>>739
ans = a.0 / b;は駄目だよ?
742デフォルトの名無しさん:2006/09/28(木) 23:38:29
>>741
だから結局double型へのキャストがCでは一番まともな方法。
743デフォルトの名無しさん:2006/09/29(金) 00:01:13
2038年問題に対しての対応策などは考えられてるのでしょうか?
744デフォルトの名無しさん:2006/09/29(金) 00:29:07
>>743
最近の処理系ではtime_tを64ビットにしたり、
当面の回避策としてtime64_tなる64ビットの方を用意していたりするものが徐々に増えている。
745デフォルトの名無しさん:2006/09/29(金) 01:52:05
それがオーバーフローする頃にはまた問題が起きるわけだが。
746デフォルトの名無しさん:2006/09/29(金) 02:48:36
何億年後の話だw
とりあえず漏れらの生きてる間には起きないだろうから安心しれ。
747デフォルトの名無しさん:2006/09/29(金) 08:31:02
惑星の寿命が尽きてそうだな
748デフォルトの名無しさん:2006/09/29(金) 19:32:15
filelengthと_filelengthなど、同じ機能の関数が二つあるのは
なぜですか?(使ってるのはVCですが、他の環境でもこうなん
でしょうか?)
749デフォルトの名無しさん:2006/09/29(金) 19:44:30
自分で作ったものには真似して '_' を付けたりするんじゃないぞ。
750デフォルトの名無しさん:2006/09/29(金) 20:54:29
先頭が_で始まる関数名は処理系予約。
マクロ等で置換される可能性があり、通常ユーザは使ってはいけない。

VCのライブラリが同じ定義をアンダースコア付きと無しで
同じ様な名前の関数を二重に持っている様に見えるのは、
大抵の場合マルチバイト文字列前提とUNICODE文字列前提で
使用する関数を切り替えたり、バッファオーバーフロー対策を施していたりといった
機能上の違いを使い分けるためだったり、色々。

MSDN見れば大抵対応が載ってるから、読め。

あと微妙にスレ違いな。
お前さん、機種依存環境依存の問題とC言語の問題の区別がついてないっぽいから
基本VCのスレか、環境依存OKなC/C++室スレに常駐しれ。
751デフォルトの名無しさん:2006/09/29(金) 21:17:12
VCで下線の有無以外同名という関数は全てPOSIX由来の関数のはず。
752デフォルトの名無しさん:2006/09/29(金) 22:44:23
昔は_なししか用意してなかったが
ISOだかANSIだかで処理系依存のものには_を付けることが推奨(?)されたため
_付きのが用意され、そちらを使うのが推奨されるようになった。
が、互換性のため、昔の名前のままのも残されている。
753デフォルトの名無しさん:2006/09/29(金) 23:18:38
くだらない質問で、すみませんが _ ってどうやって出すのでしょうか?
754デフォルトの名無しさん:2006/09/29(金) 23:26:16
>>753
日本語106キーボードでは、Shift+ろ(右Shiftのすぐ左)
101キーボードでは、Shift+-(0のすぐ右)
755デフォルトの名無しさん:2006/09/29(金) 23:58:24
ありがとうです!携帯ならすぐでますが、PCではわかりませんでした
756デフォルトの名無しさん:2006/10/01(日) 00:07:15
スレ違いかもしれませんが質問させてください。
他スレから誘導されてきました。

俺はC言語全くの初心者です。
勉強しようと思って本は買いました。
ついでに何かソフトも買ってキーボードを叩きながら覚えようと思うのですが・・・
何かお薦めのソフトはありますか?
教えて君で申し訳ないのですが。。。教えてください。
757デフォルトの名無しさん:2006/10/01(日) 00:09:47
>>756
誘導された旨を知っているから、とりあえず>>756はマルチじゃないと言っておく


さて、次の一文が論理的推論が間違っているように思うのだが
> ソフトも買ってキーボードを叩きながら覚えようと思うのですが・・・何かお薦めのソフトはありますか?
つまり「お勧めのソフトを買って、キーボードを叩きながら覚えよう」としているのだろうか?
C言語を覚える手段を「キーボードを叩きながら」と明言しているにも関わらず、なぜソフトを要求する?
758デフォルトの名無しさん:2006/10/01(日) 00:18:04
無意味な絡みはやめて適当にBCCとかVC2005EEとか教えとけばいいんじゃまいか

そうすれば一回り大きくなって帰ってきて
「stdio.hがインクルードできません」
「__WinMain がリンクできません」

等の質問でスレを活性化してくれるさ
759756:2006/10/01(日) 00:28:14
>>757,758
レスありがとうです。

>>757
俺の文章の書き方がおかしかったのかな。
申し訳ないっす。
学習ソフトとか初心者用のソフトとかそんな感じのが市販されているのであれば、
それを買って実際にプログラムを動かしながら覚えてみたいってことです。
こんなんでわかるかな・・・?

>>758
そのBCCとかVC2005EEとかは普通にビックとかヨドバシに売ってます?
明日行ってみよう。。。
760デフォルトの名無しさん:2006/10/01(日) 00:36:31
>>759
学習ソフトか…
プログラミング言語の学習ソフトなんてあるのかな?
とりあえず俺は見たことも無いし使ったことも無いのでアテになりません
プログラミングの基本はもう「馴れ」しかないから、サンプルコードを惜しまず手を使って書いて悩めばそれで十分でそ

BCCとVC2005EEは無料で落とせる
BCC:borland フリー Cコンパイラ でググってみたり
VC2005EE:Visual C++ 2005 express でググってみたり

他にDMCとかもあるけど…うん、アレはあれでいいかも(古いままかも)
DMC:Digital Mars C++ compiler

他のもあるけど、最初は道があったほうがらくだよね。
VC2005はマシンスペックが結構必要になる、ついでに登録必要のはず。
BCCはまぁ、コンパイラだけだったと思うからそれほど必要じゃないね、でも登録必要。
DMCは最近使って無いから忘れた…マジで古いC++(#include <iostream.h>とかやらにゃならん)かも。
761デフォルトの名無しさん:2006/10/01(日) 01:15:33
素直にVisualStudioにしとけ。ちょっとサイズ大きいけど。
ttp://www.microsoft.com/japan/msdn/vstudio/express/visualc/

学習用に割り切るならBCCも悪くは無いが、いかんせんマイナーだ。
762デフォルトの名無しさん:2006/10/01(日) 04:03:49
どのスレに書いて良いのかわからなかったので、
このスレで質問させていただきます。

問い:コンピュータの整数は、ある数までしか表現できない。
その数を上回ると負の数になってしまう。
最大公約数を求めるプログラムを使って、データを少しずつ大きくしていき、
どの数まで正しく表現できるか調べる場合、どのようにすればよいか。

という問題なのですが、どのようにすればいいんでしょうか?
お願いしますm(__)m
763(^-^) ◆MONSOON/qo :2006/10/01(日) 04:21:35
>>762
char , short int ,int ,long , doubleとかの型が不明なときに
アルゴリズムで型を判定する問題ですか?
764デフォルトの名無しさん:2006/10/01(日) 04:34:57
>>763
型はint型です。
先日プログラムの勉強を始めたばかりの初心者なので…

最大公約数を求めるプログラムを書いた方が良いでしょうか?
765(^-^) ◆MONSOON/qo :2006/10/01(日) 05:01:53
>>762
なぜ最大公約数を求めるプログラムが必要なのかわかりません
766デフォルトの名無しさん:2006/10/01(日) 05:33:46
>>765
>最大公約数を求めるプログラムを使って、データを少しずつ大きくしていき、
>どの数まで正しく表現できるか調べる場合、どのようにすればよいか。

ていう前提なんだから、先生に聞けよ、そんなことは。
要はユークリッドの互除法でも使えって話しなんだろ。
767デフォルトの名無しさん:2006/10/01(日) 08:01:12
気圧計を使ってビルの高さを求めるって問題があったな。
最大公約数を求めるプログラムの実装に依存するが、
#include <stdio.h>
int gcd(int a,int b){
  if(!a || !b) return 0;
  while(a!=b) if(a<b) b-=a; else a-=b;
  return a;
}
int main(){ 
  int i,j=0;
  while(0<=gcd(j,j)) i=j++;
  printf("%d\n",i);
  return 0;
768デフォルトの名無しさん:2006/10/01(日) 08:04:53
最大公約数を求めるプログラムを使わないとこんな感じ

#include <stdio.h>
#include <limits.h>
int main(){ 
  printf("%d\n",INT_MAX);
  return 0;



#include <stdio.h>
int main(){ 
  int i,j=0;
  while(0<=j) i=j++;
  printf("%d\n",i);
  return 0;

本当に「最大公約数を求めるプログラムを使う」問題か確認するよろし
769デフォルトの名無しさん:2006/10/01(日) 09:42:11
どうやら宿題っぽいな。
自分で考えたプログラムすら晒さないし。

C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/l50

まあ単位落としてまじめに勉強してくれ。つーか友達に訊けよ。友達居ないのか?
770762:2006/10/01(日) 13:00:12
ありがとうございました。
もう少し自分で考えてみますm(__)m

先週から独学で始めたばかりで、周りにプログラムに詳しい人がいなくて
ここで聞いたのですが…
ご迷惑おかけしました。
771デフォルトの名無しさん:2006/10/01(日) 13:04:18
いや、スレさえ間違えなければ構わないんだ。
つーか実際にここでもいいのかもしれないが、
宿題スレの方が気の利いた答えが貰えると思う。

めげずにまた来ておくれ。
772デフォルトの名無しさん:2006/10/01(日) 13:57:33
昨日から始めたのですが10進数の8進数、16進数での表記がうまくできません。
16進数で表すと何故か必ず13ffb8となってしまいます。何がいけないんでしょうか

#include<stdio.h>
int main(void)
{
int m;
printf("整数mの値を入力して下さい");
scanf("%d", &m);

printf("mの値は%d進数で10,8進数で%o,16進数で%xです。\n", m);

return(0);
}
773デフォルトの名無しさん:2006/10/01(日) 14:00:50
, m, m);
774デフォルトの名無しさん:2006/10/01(日) 14:01:18
じゃねえや
, m, m, m);
775デフォルトの名無しさん:2006/10/01(日) 14:03:09
>>773-774
本当だ!!即レスありがとうございます
776デフォルトの名無しさん:2006/10/01(日) 15:28:13
10進数で%d じゃね??
777デフォルトの名無しさん:2006/10/01(日) 15:37:11
間違いではないな
778デフォルトの名無しさん:2006/10/01(日) 15:42:54
さすがに気づいてるだろ
779772:2006/10/01(日) 16:12:59
>>776-778
そこはすぐに気付きました。ハズカシス。何度も質問して申し訳ないのですが
下記のプログラムで名前に2文字以上入力してもはじめの1文字しか表示されず、
%dの値が勝手に「1」になってしまいます。名前に1文字しか入力しなかった場合は問題なく動きます
これは何がいけないんでしょうか

#include<stdio.h>
int main(void)
{
int birth;
char name;
printf("名前を入力して下さい");
scanf("%c", &name);

printf("%cさん、生まれた月を入力して下さい", name);
scanf("%d", &birth);

printf("%d月生まれですね\n", birth);
return(0);
}
780(^-^) ◆MONSOON/qo :2006/10/01(日) 16:15:52
char name[100];
printf("名前を入力して下さい");
scanf("%s", name);

でいいのでは
781779:2006/10/01(日) 16:25:37
>>780
出来ました。でも何故?
782デフォルトの名無しさん:2006/10/01(日) 16:27:20
単複系でるのかなぁ wkwk
(´∩ω∩`)
783デフォルトの名無しさん:2006/10/01(日) 16:28:28
「文字」と「文字列」の違いを調べよう。
784デフォルトの名無しさん:2006/10/01(日) 16:53:22
>>780
そう書きたいなら
scanf("%99s", name);
寿限無を入力されたら困ったことになるよ
785デフォルトの名無しさん:2006/10/01(日) 17:02:58
scanf_s() を使えよ。
786デフォルトの名無しさん:2006/10/01(日) 17:04:00
年、日付、時刻などを表示するプログラムを作ろうとしたんだが、何故か10月に実行しても9月と表示される・・・orz
プログラムここに載せようとしたら長すぎて載せられなかったから下のURLにうpしたし見てくれないか?
間違ってるとこあったら教えてくれ〜。

http://walatte.web.fc2.com/jikoku.JPG
787デフォルトの名無しさん:2006/10/01(日) 17:34:28
>>786
1足せ1
788デフォルトの名無しさん:2006/10/01(日) 17:37:17
tm_mon は 0から11だからね
789デフォルトの名無しさん:2006/10/01(日) 17:41:33
そ、そうだったのか・・・orz
ありがとう、1足して使うよ(^o^)/
790731です:2006/10/01(日) 18:33:40
733さん、734さん、736さん、738さんありがとうございました。
三人とも正解でした!
791790です:2006/10/01(日) 18:36:22
すみません!

三人 → 四人でした。
792デフォルトの名無しさん:2006/10/01(日) 19:01:45
>>786

ソースはもう少しきれいに書きましょう。
793デフォルトの名無しさん:2006/10/01(日) 19:03:02
doxgen用にマジメにコメント書いてたらソースの2/3がコメントになってしまった件
794デフォルトの名無しさん:2006/10/01(日) 19:10:39
普通はソースコード読めば分かるように書くよね
不必要なコメントはそれこそ可読性を落とすゴミ以外何者でも無いし

ただ、コメントがどうしても必要な場合があって、
それはたとえば
1 専門家の考えるような概念が直接取り入れられている(FFTやWavelet、LZ法など)
2 ソースコードを読む時間を省くため
  →その割にはコメント読まなきゃいけなかったりする
3 実はゴリゴリ書いていて、コメント無しじゃ何を意味してるのか汲み取れないシロウトコード
  →コメントを書く以前の作業に戻らなきゃならない
こんな風になる。もっと多くの事項もあるけれど、たいていこれらに集約される。

で、分かったこと。
1番以外はコメント書く必要が無い。
そして1番はそれほど多くない。
したがって、2番や3番などの場合以外でコメントを必要とする場面が少ない。
で、コメントがいらなくなっていくわけですか。

もう何言ってるのかわからないのでやめときます //スルーsage
795デフォルトの名無しさん:2006/10/01(日) 19:25:00
よくわからないのですが、C言語に於いて
参照とはどういう意味なのでしょうか?
違う物に喩えてお願いします。
796デフォルトの名無しさん:2006/10/01(日) 19:40:12
>>795
んー、もうちょい具体的に分からないところをあげるといい
797デフォルトの名無しさん:2006/10/01(日) 19:46:03
>>796
よく、最初に〜を参照するとか本には書かれていますが
その参照の意味がわかりません
何を比較して照らし合わせているのでしょうか?
798デフォルトの名無しさん:2006/10/01(日) 19:50:12
参照@infoseek国語辞書
他のものと照らし合わせてみること。
「第一章を―せよ」「―項目」

比較はしていないな。
799デフォルトの名無しさん:2006/10/01(日) 20:25:27
>>798
さんくす・・・
800756&759:2006/10/01(日) 22:03:10
>>760
レスが遅れてしまい、ホントに申し訳ないっす(汗
今とりあえずborlandをダウンロードしてインストールしてます。
>>757,758も>>760もご指導ありがとうございました。
とりあえず自分で色々と格闘してみます。
わからないことがあったらまた来ますんで、
その時は、ご迷惑かもですがよろしくです。
801(^-^) ◆MONSOON/qo :2006/10/01(日) 23:22:37
>>800
Bcc developerがお勧めですよ
802デフォルトの名無しさん:2006/10/01(日) 23:27:23
かなり初歩的な質問かもしれないけど、
C言語の簡単なアプリケーションのソースをサイトからもらってきて実行したら、
「resource.hが開けません。」と、エラーが出ました。
これは何故出るんですか?
ググってみたら「resource.h→メモ帳で新たに作り、define文をコピーして保存する。」と書いてあったのですが、よく意味が分かりません。

もしかして、アプリケーションを作って実行する時って"Cのプログラムを書いたファイル"だけじゃなくて他にも"そのresourceとか言うのを書いたファイル"とかが要るんですか?
803デフォルトの名無しさん:2006/10/02(月) 00:06:27
#include <stdio.h>
int main(void)
#define NUM 3
{
int i,j;
char ch;
char test[NUM][100];
printf("文字列を3つ入力してください。\n");
for(i=0;i<NUM;i++){
printf("%dつ目\n",i+1);
scanf("%s",test[i]);
}
for(i=0;i<NUM;i++){
printf("%s\n",test[i]);
}
printf("縦書きにしますか?yかnを入力して下さい。\n");
ch=getchar();
if(ch=='y'||ch=='Y'){
for(i=0;i<NUM;i++){
for(j=0;test[i][j]!='\0';j++){
printf("%c\n",test[i][j]);
}
}
}
return 0;
}つい数日前にC言語の勉強を始めたものです。
上に上げたコードなのですが、コンパイル後に実行しても
なぜかch=getchar();以降の部分がうまく処理されていません。
(キーボードからの入力待ちにならずにプログラムが終了する)
これはなぜなんでしょうか?
804デフォルトの名無しさん:2006/10/02(月) 00:12:02
printf("chの文字コードは %x です\n", ch);
805デフォルトの名無しさん :2006/10/02(月) 00:49:10
>>803
文字コードなんて関係ない
scanf()で、入力していくと、ストリームにEnterキー押したときの
改行文字'\n'が残ってる。
そんでgetchar()はその'\n'を読み込んでしまうため次のif文で否定される
あと、getchar()の戻り値はint型
806デフォルトの名無しさん:2006/10/02(月) 01:04:02
なんの本か忘れたけど、ポインタは使わずに配列でやってしまえってのがあったな。
なんの本だっけ?
807デフォルトの名無しさん:2006/10/02(月) 01:07:08
>>805
おまえがヒントだけでは理解できない人間だというのは良くわかったよ。
808803:2006/10/02(月) 01:07:34
>>805
レスありがとうございます。
ストリームというのが何なのかまだ理解できていませんが、
getchar()より上の部分で使っているscanf()が悪さをしているということですね。
あとgetchar();についてですが、私の持っている参考書には1文字をキーボードから
入力する際に使うようにかかれており、char型の変数=getchar();と書かれていたのですが
これが間違っているということですね。
勉強になりました。ありがとうございました。
809デフォルトの名無しさん:2006/10/02(月) 01:17:17
>>802
"Cのプログラムを書いたファイル"だけじゃなくて他にも"そのresourceとか言うのを書いたファイル"を読み込むように書いたCのプログラムは
"Cのプログラムを書いたファイル"だけじゃなくて他にも"そのresourceとか言うのを書いたファイル"が必要になります。
810デフォルトの名無しさん:2006/10/02(月) 04:31:10
自分で書いたプログラムを後で参照しやすいようにコメントを書くことがほとんどだろう。
でも他人との理解度が違うので、他人が書いたプログラムのコメントなんて糞の役にも立たないというのが現実。
結局、作った香具師に訊くか、自分で解析するしかなくなる。

まあ実際の案件では、事前に十分に研修なりで理解度の意識統一をしておくのが吉。
インデントつーか書式に付いても個人差があるから、タブ字下げかスペースなら何文字とか統一すべき。
811デフォルトの名無しさん:2006/10/02(月) 20:42:16
>>802
「実行」って具体的に何をしたん?
812デフォルトの名無しさん:2006/10/02(月) 23:05:05
>>811
文意から察するとコンパイルかけたっぽいが…

>>802 もしかして Windows の窓を作るサンプルじゃないか?
つか猫?
813デフォルトの名無しさん:2006/10/02(月) 23:58:13
なあ、>>803についてだが、
for(i=0;i<NUM;i++){
printf("%dつ目\n",i+1);
scanf("%s",test[i]);
}
fflush(stdin);
と、fflushで処理するのは邪道なの?
814デフォルトの名無しさん:2006/10/03(火) 00:03:43
>>813
fflushは書き込み可能なストリーム用
815デフォルトの名無しさん:2006/10/03(火) 00:08:44
運良く意図通りになる処理系(ライブラリ)も多いけど
未定義動作であることは確か。
816813:2006/10/03(火) 00:13:23
 そーか。よくわかった。サンクス。
ま、素直にfgets使うわ。
817デフォルトの名無しさん:2006/10/03(火) 20:05:24
strcmpの比較の意味がわかりません…辞書順に違うと言われても
意味が…「abc」は「agc」よりも前なので小さいと説明がされていますが
よくわかりません、他にも「4」「12」では「12」が先に来るから「4」が大きい
と説明されてます。
818デフォルトの名無しさん:2006/10/03(火) 20:09:43
出席番号とかと同じだよ。
あいうえお順、ABC順。
819デフォルトの名無しさん:2006/10/03(火) 20:12:47
アルファベットの方は理解できますが、
>「4」「12」では「12」が先に来るから「4」が大きい
は理解できません
820デフォルトの名無しさん:2006/10/03(火) 20:15:25
字ズラを登場順に比較している とでもいうべきか。

12 と 4 は じゅうに と よん を比較しているのではなくて、
 いち と よん を比較して(この段階で いち のほうが小さいから 集合[12] は先)
同じなら
 に と (無し) を比較する

abc と agc は
 エー と エー (同じ
 ビー と ジー (b の方が若いから 集合[abc] のほうが先
821デフォルトの名無しさん:2006/10/03(火) 20:20:07
辞書順ってのは、
使われてるエンコード上で文字コードが若い順/古い順ってことになる
822デフォルトの名無しさん:2006/10/03(火) 20:20:16
難しい…
イメージは掴めました、ありがとうございました。
823817:2006/10/03(火) 20:32:50
ここで、又解らない事があります

int i;

char str1[] = "abc";
char str2[] = "def";

i = strcmp(str1, str2);

変数iには-3が代入されました。

と参考書にありますが、何処でどうしたら
-3が出てきて代入されるのか検討もつきません。
ご指導御願いたします
824デフォルトの名無しさん:2006/10/03(火) 20:42:18
>>823
きっとstrcmpにstr1とstr2を渡したら戻り値が-3となって、i に代入されたのです
825デフォルトの名無しさん:2006/10/03(火) 20:44:05
'a' - 'd' だな。
「文字コード」について調べるといいよ。
それと、ちょっとその参考書名を晒してくれんか。
826デフォルトの名無しさん:2006/10/03(火) 20:44:55
ぶっちゃけ検討する必要はありません。
もちろん見当をつける必要もありません。
規格ではstrcmpはゼロより小さい、等しい、大きい整数を返せばよいことになっています。
それが-3だろうが-127だろうが何も問題ありません。
827デフォルトの名無しさん:2006/10/03(火) 20:45:43
strcmp(s1,s2)で得られる数値の意味は
・負:s1の方がs2より、辞書順で先にあらわれる=s1<s2
・0:s1とs2が等しい=s1==s2
・正:s1の方がs2より、辞書順で後にあらわれる=s1>s2

戻り値の符号以外の意味は規定されていないようです。
なので正か負か、0か”だけ”を判断すべき、と分かります
828817:2006/10/03(火) 20:47:18
続けて質問で、すみません
文字列を数値に変換する関数atoiについてなのですが

"atoi(文字列)
引数に指定した文字列を数値に変換した値を返します
char str[] = "123";

文字列strは「123」です。これは数値の123ではありませんので
数値に見なしてプラス1をした値を得たくても[str + 1]とはできません
このような時、atoi関数を使います。

int i;
char str[] = "123";
i = atoi(str) + 1;

変数は124になります。"

と参考書にはかいてあります。
>>引数に指定した文字列を数値に変換した値を返します。
と言うのの返しますと言うのが、いまいち難しいです。

次に
>>数値に見なしてプラス1をした値を得たくても[str + 1]とはできません
の意味が解りません・・・何故、プラス1が出てくるのか・・・。


829デフォルトの名無しさん:2006/10/03(火) 20:50:06
> と言うのの返しますと言うのが、いまいち難しいです。
そうですか。

> の意味が解りません・・・何故、プラス1が出てくるのか・・・。
わかりませんか。そうですか。
830817:2006/10/03(火) 20:50:21
>>824->>825
ご返答、ありがとうございます。
>>きっとstrcmpにstr1とstr2を渡したら戻り値が-3となって、i に代入されたのです
簡単に比喩で喩えると、どういう事でしょうかね?ご迷惑、申し訳ありません。

参考書は"10日で覚えるC言語"です。
831デフォルトの名無しさん:2006/10/03(火) 20:52:23
なまいきなやつだな〜
お礼は。
参考書名は。

お前の質問の前に、まず、
ここはお前のなんだと思ってるのか、教えてくれるか?
それとも殺して欲しいのか?
832デフォルトの名無しさん:2006/10/03(火) 20:53:11
使ってるコンパイラによって違う。
strcmp の決まりごとは >>827 まで。
-3返すコンパイラもあれば、-1返すのもある。
833デフォルトの名無しさん:2006/10/03(火) 20:55:51
>>829 >>831
まず投稿する前に自分に言ってみたか?
何を伝えたいのか全くわからんよ

>>828
理解するのとは別に難しいならなれるしかない。
理解はしているか?

> >>数値に見なしてプラス1をした値を得たくても[str + 1]とはできません
> の意味が解りません・・・何故、プラス1が出てくるのか・・・。
俺にも作者の意図は分からない、
str+1 は 123+1でないことがわかればいい

詳しいことはもっと本を読むべし
834817:2006/10/03(火) 20:56:11
ありがとうございます。

混乱してて自分でもよく解らなくなっています、一旦散歩でもして
頭冷やしてきます、ありがとうございました。m(__)m
835デフォルトの名無しさん:2006/10/03(火) 21:01:11
>>834
おまえは、まず>>833をやっつけてみろ。
ウザイ虫は潰してから集中するもんだろ。
836デフォルトの名無しさん:2006/10/03(火) 21:01:55
その参考書「だけ」で覚えない方がいいかもよ。
著者自身が解ってない人かもしれん。
使うなとは言わんが、あまり書いてあることを真に受けない方がいい。
とりあえず一通り目を通してから、
テンプレにあるような解説サイトなんかも見てみるべき。
837817:2006/10/03(火) 21:04:16
>>835
>>836
ここの皆さん、優しいですね
そうします。本当にありがとうございました
838デフォルトの名無しさん:2006/10/03(火) 21:28:59
>>837
始めからその態度でいればよかったんじゃないか。
どこに行っても相手にされずに、行くところがなくなったらまた戻って来いよ。
839デフォルトの名無しさん:2006/10/03(火) 21:53:24
別人装えば叩かれることもないのに…。謙虚なのか恥知らずなのかよく分からん奴だなw

>>827
文字列と数値が違うものだってことは分かってる?
詳しいこと話しても理解出来ないだろうから簡単に説明するけど、
「数値」っていうのは、「数値」同士で足したり引いたり出来るモノ。
「文字列」ってのは、読んで字のごとく「文字」がならんで文章やデータを表したものだ。
"66" は文字列を表していて、数値ではない。数値じゃないから足したり引いたりってことは出来ない。
でも、atoi("66") とすると、文字列が表した66という数値が返ってくる。敢えて誤解を恐れずに言うと、
atoi("66") が66という数値。だから足したり出来るわけ。
66 + 1 // 数値 + 数値なので、結果は67
atoi("66") + 1 // 数値 + 数値なので、結果は67
"66" + 1 // 文字列 + 数値なので、間違い。67にはならない。
// (厳密には間違いではないが…。)
840827:2006/10/03(火) 21:58:43
えーと・・・俺?
841デフォルトの名無しさん:2006/10/03(火) 22:01:56
すまんすまん、アンカー間違えた。お前だお前。
842デフォルトの名無しさん:2006/10/03(火) 22:03:46
違った…ora
827→817
843827:2006/10/03(火) 22:09:46
>>839
おお!これで悶々が解決しました気がします!!
サンクスでした!!!散歩した甲斐がありました。
844827:2006/10/03(火) 22:11:46
>>839
最後に質問なのですが、
>>"66" は文字列を表していて、数値ではない
と言う事ですが、"6"なら数値ですよね?
要は連なっていれば文字列と言う事でしょうか?
845デフォルトの名無しさん:2006/10/03(火) 22:13:44
>>844
"6"も文字列( {'6',0} という配列をちぢめて書いたもの)
まぁ、>>839さんのを何度もよんでみることです
846827:2006/10/03(火) 22:18:08
>>845
返答、ありがとうございます。
では、数値が何か(どういうものか疑問が又湧いてきます)

とにかくじっくり読んでみて数値と文字列の違いを理解したいと
思います。
847デフォルトの名無しさん:2006/10/03(火) 22:21:29
なんかひどく馬鹿にされた気分なんだけど、気のせいかな。
848デフォルトの名無しさん:2006/10/03(火) 22:26:04
俺たちが思ってる数値をどうやってコンパイラさんに教え込むか?
「1」ってかいてあったら、数値の1であるかもしれないし、文字の1かもしれないし、関数名の一部かもしれない

そこでコンパイラさんに「いまからint型の数値の1を書くからね」ということを教えたり、
「いまから文字列の abc を書くからね」と教えたりする必要が出てくる
一番なのは、話し言葉のようにコンパイラさんに全部伝えることだけれども、それではコーディングに支障がでる
そこで、(ある文脈における)”特別な書き方”をすることで、コンパイラさんに分かってもらわなきゃならなくなってくる

”int型の数値"として 1 を書いた場合、この”1”をint型のリテラルと呼ぶことにする
リテラルは「型とその実体」を表すものとしてプログラム中にしばしば現れる
int型のリテラルは 1I (たぶん)だったり、long型のリテラルは 1L だったりする
文字のリテラルは 'A' のようにシングルクォートで囲んでみたりできる
蛇足だが、文字のリテラルの”型”は char型 なので、文字リテラルが書いてあるところにはchar型に適合可能な型が変わりに入れられる

文字列のリテラルはchar型の配列+null終端文字を表す
C++にいたっては配列のリテラルが存在しているので、"abc"は{'a','b','c',0}に同一である

らしい
849デフォルトの名無しさん:2006/10/04(水) 00:58:44
まずマシン語を勉強して、データの扱いを勉強した方が。
Cというかコンパイラは、1やAを指定によりどう扱うかを決めてマシン語に変換してるだけ。

うまく動かないときにはイライラするけど、冷静にCPUやコンパイラの気持ちに成って考えてみるのが吉。
自分は絶対悪くない、C言語やコンパイルが悪いとか妄想しちゃう香具師はプログラム作成に向いてないよ。
漏れは他人のプログラムを解読するとイライラするのでプログラマに成るのは諦めた。
850デフォルトの名無しさん:2006/10/04(水) 01:30:38
>漏れは他人のプログラムを解読するとイライラするのでプログラマに成るのは諦めた。

気持ちは痛いほどわかるが、なら何故この板に居るw
851デフォルトの名無しさん:2006/10/04(水) 01:31:37
あれだ、「プログラムは思った通りに動かない。書いた通りに動く。」
852デフォルトの名無しさん:2006/10/04(水) 01:36:40
使いこなせないのって、とってもイライラするよね。
こんな簡単なのにね〜
853デフォルトの名無しさん:2006/10/04(水) 02:16:50
本人に取っては簡単じゃないけどね。
できない子って頭が悪い(=知能指数とかが低い)訳じゃなくて、十分な理解ができてないだけ。
854デフォルトの名無しさん:2006/10/04(水) 03:28:56
コンパイラさん、あのソースマジむかつきますよ
あの野郎しめてやって下さいよ
855デフォルトの名無しさん:2006/10/04(水) 03:42:45
すいません質問です
fscanfを使わないで指定されたデータファイルから
データを読み込みデータ件数、最大データ長、最大値、最小値
を出力するプログラムはどうするのですか?
自分はfgetcを使うと思ってるのですが
お願いします教えてください
856デフォルトの名無しさん:2006/10/04(水) 03:44:29
fgetsのことも思い出してあげてください。
857デフォルトの名無しさん:2006/10/04(水) 05:56:11
警告じゃね?
i=5で初期化したあとiを使ってないよな。
変数に数値を代入したあと使っていない旨の警告がでたような
858デフォルトの名無しさん:2006/10/04(水) 06:00:17
ちょ…。
400位のレスよんでたのに何をとちくるったのかレスしてしまった。
俺テラハズカシスorz
どんだけ亀なんだと
859デフォルトの名無しさん:2006/10/04(水) 06:02:05
>>398だったよママン。
吊ってくるノシ
860デフォルトの名無しさん:2006/10/04(水) 17:04:31
自分で書いたプログラムを後で読むならイライラしないんだろ。
861デフォルトの名無しさん:2006/10/04(水) 17:10:32
質問なんですが、
2進数16桁の加減算プログラムをmain関数で作成するのですが、
加算はできたのですが、減算のプログラムがイマイチできません。

加算のプログラムに追加しなければいけない、プログラムはなんでしょうか?
桁上がりを考慮したプログラムです。
どなたかわかりませんか?
862デフォルトの名無しさん:2006/10/04(水) 17:12:49
その2進数に符号(±)の概念はあるの?
863デフォルトの名無しさん:2006/10/04(水) 17:13:26
減算用のプログラムを別に書けばいいよ
864861:2006/10/04(水) 17:14:41
>>862
符号の概念はなく、2の補数を使うのですが、
そこがわからなくて・・・
865デフォルトの名無しさん:2006/10/04(水) 17:16:59
減算用なんて要らないよ。
加算用を使えばいい。
866デフォルトの名無しさん:2006/10/04(水) 17:18:27
そもそも2の補数表現は減算を加算回路で行なうためのもの。
867デフォルトの名無しさん:2006/10/04(水) 17:19:21
わからないなら単純化するのがデフォだろ
868デフォルトの名無しさん:2006/10/04(水) 18:45:32
>>864
2の補数を使うのが分かってるなら、引く数を2の補数にして
加算ルーチンに入れればOK

2の補数が分からないのなら、全ビット反転して1足せばよい。
1足すのは加算があるから問題ないでしょ
869デフォルトの名無しさん:2006/10/04(水) 19:48:30
870デフォルトの名無しさん:2006/10/08(日) 11:37:17
無料でC*.NETを作るにはどれをインスコすれば良いですか?
マイクロソフトのは登録(クレカ決済?)が必要でした。orz
871デフォルトの名無しさん:2006/10/08(日) 11:40:03
フレームワークを作るの? そりゃ大変だ。
Cだけで作るのは難しいんで内科医?
872デフォルトの名無しさん:2006/10/08(日) 11:59:06
C*.NETを作るのか。.NETに商標とか無いのかな?だいじょうぶ?
873(^-^) ◆MONSOON/qo :2006/10/08(日) 12:12:38
C++(加法)
C# ( ++++ )

から一気にC*(乗法)か
進化だな
874デフォルトの名無しさん:2006/10/08(日) 13:40:39
C//とかC川(///)とかC土(+-)とか
875デフォルトの名無しさん:2006/10/08(日) 16:25:30
fopneでファイルを開くときに変数で指定する方法を教えてください。
876デフォルトの名無しさん:2006/10/08(日) 16:50:32
fp = fopen(filename, mode);
877デフォルトの名無しさん:2006/10/08(日) 18:10:46
free()関数の仕組みを教えてください

malloc()やrealloc()でメモリを確保するじゃないですか
その後free()で開放するとき、バッファのサイズを指定せずに
どうやって正確にメモリを開放しているのでしょうか?
特殊な変数にでも値を保存しているんですか?
878デフォルトの名無しさん:2006/10/08(日) 18:12:52
>>877
大抵の処理系は、malloc()系の関数で領域を確保する際に、その領域の直前に
サイズを記憶している。
879デフォルトの名無しさん:2006/10/08(日) 18:15:28
>>878
早い回答ありがとうございます。
880デフォルトの名無しさん:2006/10/08(日) 18:15:46
まあこういうお馬鹿なプログラムで確かめる事もできるわけだ。
もちろん未定義の動作となるので実行は自分の責任で。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int *i = malloc(16384);

printf("%d\n", *(i - 1));
free(i);
return 0;
}
881デフォルトの名無しさん:2006/10/08(日) 23:30:12
>>848
Cにおいて、文字リテラルはchar型ではなくint型だ。

# C++ではchar型だがな
882デフォルトの名無しさん:2006/10/09(月) 01:01:42
すみません、ちょっと質問です
Windowsのテキストモードの改行コードって何か教えてください
883デフォルトの名無しさん:2006/10/09(月) 01:30:46
¥r¥n
884デフォルトの名無しさん:2006/10/09(月) 01:44:08
なんだろう・・・この正しいけど微妙な感じ
885デフォルトの名無しさん:2006/10/09(月) 01:53:39
>>884
書くの面倒だし。
テキストモードが存在する理由をあなたが書いてあげてください。
886デフォルトの名無しさん:2006/10/09(月) 02:33:03
>>885
いや、その、なんだ・・・ねぇ
887デフォルトの名無しさん:2006/10/09(月) 03:28:09
>>883
寧ろ、
\r\n
かと。
888デフォルトの名無しさん:2006/10/09(月) 03:39:50
>>887
ウインドウズだから¥のほうが親切なんじゃないの?
大文字なのはわざとです。
889デフォルトの名無しさん:2006/10/09(月) 03:41:42
大文字じゃなかった。
読み替えて。
890デフォルトの名無しさん:2006/10/09(月) 03:56:12
#include <stdio.h>
#include <stdlib.h>

main () {

FILE *fp;//ファイルポインタ
char c;//読み込んだ文字を格納する
char str[8]; //読み込んだ文字列を格納する

//ファイルを1文字ずつ読み込む

if((fp = fopen("test.txt", "r")) == NULL)
{//ファイルがオープンできなかった場合の処理 printf("ファイルオープンエラー\n");
exit(1); //強制終了する}

while((c = fgetc(fp)) != EOF) {printf("%c", c);}
fclose(fp);

//ファイルをまとめて読み込む

if((fp = fopen("test.txt", "r")) == NULL)
{printf("ファイルオープンエラー\n"); exit(1);}

while(fgets(str, 7, fp)) {printf("%s", str);}
fclose(fp);

return 0;
}
891デフォルトの名無しさん:2006/10/09(月) 03:57:43
と上の様に書くと

エラー E2134 5-01.c 28: 複合文に } がない(関数 main )
警告 W8070 5-01.c 28: 関数は値を返すべき(関数 main )
*** 1 errors in Compile ***

と出てしまいます、"{}"の括弧数は足りているはずです。
ご指導、お願い致します。
892890-891:2006/10/09(月) 04:03:32
因みに、こう書けば成功はしますが・・・

#include <stdio.h>
#include <stdlib.h>

main(){

FILE *fp; //ファイルポインタ
char c; //読み込んだ文字を格納する
char str[8]; //読み込んだ文字列を格納

//ファイルを一文字ずつ読み込む

if((fp = fopen("test.txt","r")) == NULL)
{//ファイルがオープンできなかった場合の処理 printf("ファイルオープンエラー\n");
exit(1); //強制終了する}

while((c = fgetc(fp)) != EOF) {printf("%c",c);}
fclose(fp);

//ファイルを纏めて読み込む

if((fp = fopen("test.txt","r")) == NULL)
{printf("ファイルオープンエラー\n"); exit(1);}

while(fgets(str,7,fp)) {printf("%s",str);}
fclose(fp);
}
return 0;
}
893890-891:2006/10/09(月) 04:07:10
これをプロンプトで表示させたいです

●ファイルは、通常、自分でエディタやその他の専用ソフトから作成したり、中を読んだ
りコピーしたりできます。C言語では、ファイルを扱う関数が用意されているので、プロ
グラムからでもファイルの中身を読んだりファイルを作成することができます。ファイル
の中身を読み込むことをファイル入力、ファイルへデータを書き出すことをファイル出力
と言います。

●ファイルは、通常、自分でエディタやその他の専用ソフトから作成したり、中を読んだ
りコピーしたりできます。C言語では、ファイルを扱う関数が用意されているので、プロ
グラムからでもファイルの中身を読んだりファイルを作成することができます。ファイル
の中身を読み込むことをファイル入力、ファイルへデータを書き出すことをファイル出力
と言います。

でも、上のように表示されません、こう表示されるだけです。

C:\source>そのファイル名

だけの入力待ちになってしまいます。
894デフォルトの名無しさん:2006/10/09(月) 04:10:57
if((fp = fopen("test.txt", "r")) == NULL)
{//ファイルがオープンできなかった場合の処理 printf("ファイルオープンエラー\n");
exit(1); //強制終了する}

この書き方がおかしすぎでしょ
895(^-^) ◆MONSOON/qo :2006/10/09(月) 04:11:22
//強制終了する}





//強制終了する
}
896デフォルトの名無しさん:2006/10/09(月) 04:13:17
コメントを全部消してみるとか。
897890-891:2006/10/09(月) 04:14:53
#include <stdio.h>
#include <stdlib.h>

main () {

FILE *fp;//ファイルポインタ
char c;//読み込んだ文字を格納する
char str[8]; //読み込んだ文字列を格納する

//ファイルを1文字ずつ読み込む
if((fp = fopen("test.txt", "r")) == NULL) {
//ファイルがオープンできなかった場合の処理
printf("ファイルオープンエラー\n");
exit(1); //強制終了する
}
while((c = fgetc(fp)) != EOF){
printf("%c", c);
}
fclose(fp);
//ファイルをまとめて読み込む
if((fp = fopen("test.txt", "r")) == NULL) {
printf("ファイルオープンエラー\n");
exit(1);
}
while(fgets(str, 7, fp)){
printf("%s", str);
}
fclose(fp);
return 0;
}

こうすれば、>>893の文章が表示されます。{}括弧をずらしたらエラーがでるんでしょうか?
898デフォルトの名無しさん:2006/10/09(月) 04:16:52
>>892
//は行末までコメント。大事なものがコメントアウトされて内科医?

>>893
DOSプロンプトの使い方なら鼬害。
プログラミングの話なら具体的にどうぞ。
899890-891:2006/10/09(月) 04:17:41
お答え、ありがとうございます。

>>895
何故、そのようにしなければいけないんでしょうか?
強制終了と言うコメントを消して

if((fp = fopen("test.txt", "r")) == NULL)
{ printf("ファイルオープンエラー\n"); exit(1); }

とすれば宜しいんでしょうか?
900890-891:2006/10/09(月) 04:22:24
>>898
????
と言うと、コメントが{}の中に入る場合は、
//強制終了する}





//強制終了する
}

ようにずらせばいいのでしょうか?

>>896
コメント消して、こうしたら成功しました。
901デフォルトの名無しさん:2006/10/09(月) 04:22:52
おまいはコメントの仕様わかってるのか
そもそもCの仕様に//でのコメントは無かったような
902890-891:2006/10/09(月) 04:23:14
#include <stdio.h>
#include <stdlib.h>

main(){

FILE *fp; //ファイルポインタ
char c; //読み込んだ文字を格納する
char str[8]; //読み込んだ文字列を格納

//ファイルを一文字ずつ読み込む

if((fp = fopen("test.txt","r")) == NULL)
{ printf("ファイルオープンエラー\n"); exit(1);}

while((c = fgetc(fp)) != EOF) {printf("%c",c);}
fclose(fp);

//ファイルを纏めて読み込む

if((fp = fopen("test.txt","r")) == NULL)
{printf("ファイルオープンエラー\n"); exit(1);}

while(fgets(str,7,fp)) {printf("%s",str);}
fclose(fp);

return 0;
}

やはりコメントを消すか、{}ずをらすかしなければいけないようですね。
903デフォルトの名無しさん:2006/10/09(月) 04:25:45
そもそもなんでそんな変態なコーディングスタイルなのかしらんが、
/* 強制終了する */ }
これなら通るだろ。
904890-891:2006/10/09(月) 04:29:06
ありがとうございます、解決しました。。。>>903
905デフォルトの名無しさん:2006/10/09(月) 04:33:42
VS使ったほうがいいかも知れんね。
906890-891:2006/10/09(月) 04:43:08
>>905
違うコンバータの事でしょうか?

もう一つ質問ですが
"%c"とは文字Cの事ですよね?

夜分遅くお騒がせひて、すみません。
907デフォルトの名無しさん:2006/10/09(月) 04:48:38
文字Cってなに?
908デフォルトの名無しさん:2006/10/09(月) 04:49:50
http://www.microsoft.com/japan/msdn/vstudio/

文字Cというより、先のソースコードではcを文字として。
909890ー891:2006/10/09(月) 04:50:44
cはchar c のcを指します
910デフォルトの名無しさん:2006/10/09(月) 04:57:01
cを文字として表示する場合と数字として表示する場合では、
cの値が同じでも表示が変わるでしょう。
VSを使えば、実行中のcの値がエディタ上で見られるので、
そのあたりの理解が早いと思う。
先の書き込みを見る限り、今お使いのコンパイラはそれほど
わかりやすいエラー内容を表示しないようですし、
VSを使ったほうがいいんじゃないかと思いました。
911890ー891:2006/10/09(月) 05:06:21
何から何まで、ありがとうございました。
是非、ぐぐってみます。
912(^-^) ◆MONSOON/qo :2006/10/09(月) 05:38:20
今日始めてCのバリナリサーチが動かせたよ
始めて使ってみたけど
913デフォルトの名無しさん:2006/10/09(月) 06:09:27
「パンはパンでも食べられないパンは?」
これは最も有名ななぞなぞの一つだ
答えの設定はご存知の通り「フライパン」
この答えをどうボケたら面白くなるのだろうか


普通に食べられないパンを言う
解:腐ったパン

フライパンを間違えてみる
解:ナベ

別のパンと付くものにしてみる
解:パンツ

下ネタにしてみる
解:うんこパン

「食べられない」を間違える
解:フランスパン

「なぞなぞ」を「質問」と間違えてみる
解:コロネが苦手です

すべて間違える
解:乳輪大納言
914デフォルトの名無しさん:2006/10/09(月) 06:12:04
…大変言いにくいのだが誤爆だ
すまない
915デフォルトの名無しさん:2006/10/09(月) 06:28:32
「パンはパンでも食べられないフライパンは?」
これは最も有名ななぞなぞの一つだ
答えの設定はご存知の通り「フライパン」
この答えをどうボケたら面白くなるのだろうか
916(^-^) ◆MONSOON/qo :2006/10/09(月) 06:55:56
すみません
昨日、nビット目が1かどうか調べる方法を聞いたんですが
それについて質問なんですけど
(x>>j)&1と書くところを間違えて(x<<j)&1 (xはchar型、jは8未満)と書いてコンパイルしてしまいました
とりあえずは動いたのですが正しい式にすると実行時にエラーで止まってしまいます
なぜでしょうか?
917(^-^) ◆MONSOON/qo :2006/10/09(月) 07:15:57
自己解決しました
char型とint型を間違えていました
918デフォルトの名無しさん:2006/10/09(月) 09:17:01
>>915
この板的な反応を返す
解:スレ違いだボケ、氏ね
919デフォルトの名無しさん:2006/10/09(月) 09:26:58
どうみても板違いです。
本当に(ry
920デフォルトの名無しさん:2006/10/09(月) 14:05:14
*/
921デフォルトの名無しさん:2006/10/09(月) 14:21:30
/*コメント開始
922デフォルトの名無しさん:2006/10/09(月) 14:44:19

ここまで
*/
923デフォルトの名無しさん:2006/10/09(月) 14:59:24
while(1)malloc(10);
924デフォルトの名無しさん:2006/10/10(火) 07:36:39
2次元の問題を解くのに、2次元配列でうまく出来たのですが、
同じ問題を3次元で解くのに、3次元配列つかったら上手くいきません。
コンパイルはするのですが、プログラムが作動しません。
何かいい手はないですか?
925デフォルトの名無しさん:2006/10/10(火) 07:39:59
整数の範囲で四則演算と剰余演算を行います。
簡易電卓プログラムを作成せよ。
というプログラムなんですが・・・
よろしくお願いします。
926デフォルトの名無しさん:2006/10/10(火) 08:21:29
>>925
いえいえこちらこそよろしくお願いします^^
927デフォルトの名無しさん:2006/10/10(火) 09:38:02
つ宿題スレ。

C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/l50
928デフォルトの名無しさん:2006/10/10(火) 23:54:40
C言語でASP.NETを作るにはどうすれば良いの?
929デフォルトの名無しさん:2006/10/11(水) 00:05:35
ぐーっと行ってこうがーっと。
930デフォルトの名無しさん:2006/10/11(水) 04:06:33
#include <stdio.h>
#include <stdlib.h>

main(){
//ファイル改行数を数える
FILE *fp; //ファイルポインタ
char filename[256]; //ファイル名
char c;//読み込んだ文字
int total = 0; //改行文字をカウントする変数

//ファイル名決定
printf("ファイル名を入力して下さい > ");
gets(filename);

//ファイルオープン
if((fp = fopen(filename,"r")) == NULL);
{printf("ファイルオープンエラー\n"); exit(1);}

//ファイル読み込み
while((c == fgetc(fp)) != EOF)
{if(C == '\n') {total++;}}

fclose(fp);
printf("行数 %d\n", total+1);

return 0;
}

エラー E2451 5-2.c 22: 未定義のシンボル C(関数 main )
*** 1 errors in Compile ***

これで何故かエラーがでます、ご指導宜しくお願い致します。
931デフォルトの名無しさん:2006/10/11(水) 04:07:40
ごめんなさい
此処に書いたら、Cが大きくなってるのにきづきました
932デフォルトの名無しさん:2006/10/11(水) 04:13:45
やはり、解決していませんでした
これを実行すると

ファイル名を入力して下さい > janken
ファイルオープンエラー

とエラーをおこしてしまいます
ディレクトリ内にエディッタがあるにもかかわらずです
ソースに誤りがあるのでしょうか?是非、ご指導お願い致します
933デフォルトの名無しさん:2006/10/11(水) 04:56:32
>>932
char c;//読み込んだ文字 → int c;//読み込んだ文字
if((fp = fopen(filename,"r")) == NULL); → if((fp = fopen(filename,"r")) == NULL)
while((c == fgetc(fp)) != EOF) → while((c = fgetc(fp)) != EOF)

一行一行何をやってるのか考えながらコーディングすれば間違いは減らせる。
あと、getsを使う癖をつけてはいけない。必ずfgetsを使うように。
934デフォルトの名無しさん:2006/10/11(水) 04:58:18
> ディレクトリ内にエディッタがあるにもかかわらずです
???

本当にファイルがあるか証明出来る?
935932:2006/10/11(水) 05:05:46
>>933
ありがとうございます。
微妙な変化にきづきませんでした。
やはり書き直しても、
ファイル名を入力して下さい > janken
ファイルオープンエラー

になってしまいます・・・

>>934
証明はできません、すみません
エラーって事は、やはりないんですかね?

936デフォルトの名無しさん:2006/10/11(水) 05:15:06
>>935
エラーメッセージからみてBCCだと思うのでWindowsと思うが、
5-2.exeがあるディレクトリがカレントディレクトリになっているとして、
dir janken
で、ファイルがない旨表示されればファイルはそのディレクトリには無い。
937デフォルトの名無しさん:2006/10/11(水) 05:16:10
開こうとしてるファイル名のファイルをエディタかなんかで開いたままにしてるんじゃね?
938デフォルトの名無しさん:2006/10/11(水) 05:19:35
読み取りオープンも許さない排他制御しているエディタならその可能性があるね
939デフォルトの名無しさん:2006/10/11(水) 05:20:43
>>936
BCCです。だとすると、もしかしたらそこにないのかも?しれません
もう一度、考えてみます

>>937
閉じています

黎明までつきあって頂き、ありがとうでした。
940デフォルトの名無しさん:2006/10/11(水) 05:22:34
>>938
普通のメモ帳使っています。
941デフォルトの名無しさん:2006/10/11(水) 05:31:50
jankenのあとに.txtなどの拡張子がいるのでは?
942デフォルトの名無しさん:2006/10/11(水) 05:33:19
以前実行したやつなので .c にはなっているんですがね…
943デフォルトの名無しさん:2006/10/11(水) 05:35:03
janken.cならjanken.cって入れなきゃ
944デフォルトの名無しさん:2006/10/11(水) 05:40:02
あーっ!
電源落としてしまったので、起きたらやってみます
945デフォルトの名無しさん:2006/10/11(水) 08:05:44
>941も理解できないなら、鼬害だな。拡張子を調べてこい。
946デフォルトの名無しさん:2006/10/11(水) 08:21:49
PC初心者に拡張子を教えるのは本当にむずかしい
947デフォルトの名無しさん:2006/10/11(水) 11:50:48
bmpをjpgに変えただけで
jpeg画像になったと思うやつもいるしな。。
948デフォルトの名無しさん:2006/10/12(木) 02:48:17
>鼬害

これが読めない
949デフォルトの名無しさん:2006/10/12(木) 03:08:14
初心者板行って再変換のやり方聞いて来い
950デフォルトの名無しさん:2006/10/12(木) 03:28:19
昨夜は、ありがとうございました。

プロンプトで正確に表示されました。

C:\aaa>5-2
ファイル名を入力して下さい > janken.c
行数 35

そこでジャンケンエディッタとの行数が合いません・・・
何度数えても・・・
951デフォルトの名無しさん:2006/10/12(木) 03:29:11
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

main(){
int player = 0, computer;

srand(time(NULL));

printf("【ジャンケンゲーム】\n");

//プレイヤーの手を入力
printf("ジャンケンゲーム・・・(グー:1 チョキ:2 パー:3を入力) > ");
scanf("%d", &player);

computer = rand()%3 + 1;
printf("コンピュターは");
if(computer == 1) {printf("グー");}
else if(computer == 2) {printf("チョキ");}
else {printf("パー");}
printf("! ");

if(computer == player){printf("あいこ\n");}
else if(player == 1 && computer == 2) {printf("プレイヤーの勝ち\n");}
else if(player == 2 && computer == 3) {printf("プレイヤーの勝ち\n");}
else if(player == 3 && computer == 1) {printf("プレイヤーの勝ち\n");}
else{printf("コンピュターの勝ち\n");}

return 0;
}

janken.cです。
952デフォルトの名無しさん:2006/10/12(木) 03:30:58
参考書の、この解説と関係あるのですが
その説明がいまいちつかめません。

ファイルの行数の数え方

【ファイル1】
aaa(改行文字)
bbbb(改行文字)

【ファイル2】
aaa(改行文字)
bbbb(改行文字)
(EOF)

ファイル1の行数は2、ファイル2の行数は3になります。
つまりファイルの行数をカウントするには、ファイルの中に出てくる
改行文字の数を数えて、それに1を足した数字を算出します。
ファイルの中身はfgetc関数を使って1文字づつ読み込みます。

※参考書より文章抜粋

これらの意味が、よくわかりませんので、教授お願い致します。
953デフォルトの名無しさん:2006/10/12(木) 03:34:58
>>>改行文字の数を数えて、それに1を足した数字を算出します。

これの意味が掴めないんです。
954デフォルトの名無しさん:2006/10/12(木) 03:39:16
>>952
EOFは改行文字ではないので、EOFを改行文字と数えるかどうかで
結果が異なる。通常はファイル1もファイル2も2行。
955(^-^) ◆MONSOON/qo :2006/10/12(木) 03:47:23
>>954
しかしNULLが返ってくるのは違う?
956デフォルトの名無しさん:2006/10/12(木) 03:48:51
fgetcでNULLが返る?int型を返すんだぞ、NULLなんて返さない。
もしかしてNUL文字の事を言っているならお門違い。
957デフォルトの名無しさん:2006/10/12(木) 03:50:09
>>954
通常なら数えなくてもいいみたいですね。
ありがとうございます。

>>>改行文字の数を数えて、それに1を足した数字を算出します。
これが、どう考えてもわかりません
958デフォルトの名無しさん:2006/10/12(木) 03:51:43
>>957
それは最後の行が改行文字で終わってないファイルの時だろ。
面倒だからfgets()で読めよ。
959デフォルトの名無しさん:2006/10/12(木) 03:59:36
>>958
fgets()を使い読めよばいいのですね
わかりました。
960デフォルトの名無しさん:2006/10/12(木) 04:01:52
最大の疑問が、>>951のジャンケンエディッタとの行数と
C:\aaa>5-2
ファイル名を入力して下さい > janken.c
行数 35

と算出された行数です、たぶん改行が関係してると
自分なりに解釈していますが・・・
961デフォルトの名無しさん:2006/10/12(木) 04:06:31
厳密に言えば、自分なりの解釈ですが>>951のソースでは
各改行が一個文なので、total + 1 と解釈しています。
962デフォルトの名無しさん:2006/10/12(木) 04:11:01
俺の環境では>>930修正して実行して>>951のファイル読み込んだら普通に30行と表示されたけど…
単に一番下の } の後に無駄に改行入れてるだけでは?
963デフォルトの名無しさん:2006/10/12(木) 04:17:42
>>962
う〜ん、こっちだと35になるのですが・・・
やはりムダによみこまれているのですかね
964デフォルトの名無しさん:2006/10/12(木) 04:23:09
>>962
すみません、30でした。こっちのミスでした。

他にも、この

fclose(fp);
printf("行数 %d\n", total+1);

の total+1 が説明を読んでも理解し難いです
このtotal+1が何をさしてるのかが
965デフォルトの名無しさん:2006/10/12(木) 04:45:55
だからこれのことでしょ?
>>>改行文字の数を数えて、それに1を足した数字を算出します。

信じられないならtotal自体の値をprintf(totalの値: %d\n,total);とでもして表示汁
で、その値が実際調べるファイルの行数より1少ないなら、少なくとも君の環境(&その本の著者の環境)では
正しい行数を表示するにはtotalに(つまり改行文字の数に)1足さなければならない証左になる
966デフォルトの名無しさん:2006/10/12(木) 04:47:05
すまん寝ぼけてた…orz printf("totalの値: %d\n",total);ね
967デフォルトの名無しさん:2006/10/12(木) 05:12:10
本当に夜分遅くまでつきあって頂き、ありがとうございます

はい、では改行で+1が必要なのは>>961で書いた解釈で
宜しいみたいですね。

ちょっと、混乱して {totl++;} と混同している部分もあるみたいです
質問ばかりで、申し訳ありませんが、int total = 0 にするのは
{total++;} でインクリメントするのと関係あるからでしょうか?
もしくは、単に初期化という意味なのでしょうか?
参考書には詳しく説明はされていません、明日にでも本屋行って
わかりやすいのを買ってきます、余談ですが。
968デフォルトの名無しさん:2006/10/12(木) 05:29:26
>>>改行文字の数を数えて
についてはわかりますた、インクリメントの++ と整理が
ついたみたいです
969デフォルトの名無しさん:2006/10/12(木) 05:44:01
何故、改行文字で終わってないなら 1を足さなければならないか
と言う理由が難しい、自分が一番わからないのはそこだと思いました
とにかく混乱してるみたいなので、書いてもらった事を参考に
改めて考えたいと思います、スレを占領して申し訳ないです。
970デフォルトの名無しさん:2006/10/12(木) 05:48:16
void hello(void)
ってhelloっていう新しい関数使って
こんにちは。って表示して改行したいんだが
できん・・・

void なんちゃら(int no)
とか
int なちゃら(void)
はできるんだが
両方voidになるとわからん・・・;;;
さらに新しい関数を作ったほうがいいのかなぁ・・・
たすけてくれー
971デフォルトの名無しさん:2006/10/12(木) 06:23:14
>>970

#include <stdio.h>

void hello(void)
{
printf(" ヘ_ヘ\n");
printf("ミ・・ ミ\n");
printf("(   )〜\n");
}

int main(void)
{
hello();
}
972デフォルトの名無しさん:2006/10/12(木) 06:26:44
mainのreturn文がなくてもgccだとデフォルトで警告がでないな…
973(^-^) ◆MONSOON/qo :2006/10/12(木) 06:33:42
mainのリータンは標準では入れない方がいいですよ
終端までいくと自動で終了しますから
プログラムの途中で終了するときは入れてみてください
974デフォルトの名無しさん:2006/10/12(木) 06:58:36
できた・・・hello()で関数が使えるんだな。
ってかそうだよな
無駄にprintfとかつかってしまった・・・
ありがとう。
975デフォルトの名無しさん:2006/10/12(木) 06:59:41
intを返す宣言しているのに何も返さない書き方になってるんだから本当は警告すべき
終端で自動で終了することと返り値なしであるように書いてもmainでは警告しないこととは別の話
976デフォルトの名無しさん:2006/10/12(木) 07:33:05
main()のreturn文を省略できるのはC++だけだっけ?
977デフォルトの名無しさん:2006/10/12(木) 07:42:17
>>972-976
C++だけでなくC99でもmainのreturnは省略できる。
もちろんmain関数の終わりでreturn 0;扱い。

gccはC99対応しているから、デフォルトで警告を出さないのも不思議ではない。
978(^-^) ◆MONSOON/qo :2006/10/12(木) 07:44:29
void main
int main
を統一的に扱うにはReturnを入れない方がいい
979デフォルトの名無しさん:2006/10/12(木) 08:04:38
void mainなんて考えなくていいですから。
980デフォルトの名無しさん:2006/10/12(木) 08:32:54
なんだ? また糞コテが意味不明なことでも言ってるのか?
981デフォルトの名無しさん:2006/10/12(木) 09:01:19
>>970
void型のものは「関数」とは呼ばない。
982デフォルトの名無しさん:2006/10/12(木) 09:21:12
といすると何ていうのがいいの?
てか、そうだとすると関数って何ナノ?
983デフォルトの名無しさん:2006/10/12(木) 10:49:00
int main(int, char *[]) 以外の main() は実装依存(implementation-defined)
(C++規格3.6.1.2)(C99規格5.1.2.2.1.1)

int main() 内の return 文は exit() を呼ぶ
(C++規格3.6.1.5)(C99規格5.1.2.2.3.1)

int main() の末尾までに return 文に出会わなければ return 0; と同じ結果になる
(C++規格3.6.1.5)(C99規格5.1.2.2.3.1)
→ 結果として exit(0) が呼ばれる

main() の返値が int と互換性がない場合、それは規格上の終了ステータスとしては扱われない
(C99規格5.1.2.2.3.1)

よって ◆MONSOON/qo は肉蝿
984デフォルトの名無しさん:2006/10/12(木) 11:04:18
規格を持ち出す以前に例のクソコテは肉蝿。
しかし肉蝿ってなんて読むんだ。ニクフライ?
985デフォルトの名無しさん:2006/10/12(木) 11:22:23
//イタチガイかよ。。
986デフォルトの名無しさん:2006/10/12(木) 14:55:31
voidなんて使ってるのはアフォ。
basicでも使ってろクズ。
987デフォルトの名無しさん:2006/10/12(木) 16:52:16
ぽかーん
988デフォルトの名無しさん:2006/10/12(木) 18:49:12
ちんちん
989デフォルトの名無しさん:2006/10/12(木) 20:39:02
>>983
一応つっこむがC99: int main(void)とC++: int main()も受け付けることになっているだろ。
無論C++はそこからint main(void)も良いということになるが。
990デフォルトの名無しさん:2006/10/13(金) 01:36:18
うわーん、わかんねーよー寝る
991デフォルトの名無しさん:2006/10/13(金) 01:42:38
ぐふぉー
992デフォルトの名無しさん:2006/10/13(金) 02:06:53
http://pc8.2ch.net/test/read.cgi/tech/1160580550/
俺なんかに頼らず俺に聞いてくれ
993デフォルトの名無しさん:2006/10/13(金) 03:36:08
>>965
昨夜は助言、ありがとうございます。
実行したした結果、printf(totalの値: %d\n,total); だと

ファイル名を入力して下さい > janken.c
totalの値: 30

printf(totalの値: %d\n,total + 1); だと

ファイル名を入力して下さい > janken.c
totalの値: 31

と表示されました、又疑問なのですが
何故、自分の環境だとt
totatに(つまり改行文字の数に)1足さなければならないのでしょうか?
>>958にかいてあるからでしょうか?

もう一つは、
ファイルの行数の数え方

【ファイル1】
aaa(改行文字)
bbbb(改行文字)

【ファイル2】
aaa(改行文字)
bbbb(改行文字)
(EOF)

ファイル1の行数は2、ファイル2の行数は3になります。
で、ファイル2の行数は3とは、(EOF) を数えないで
その +1 だから3になるからでしょうか?
994デフォルトの名無しさん:2006/10/13(金) 03:49:41
正直なところファイル1と2の違いがわからん。
ファイル2のみ終端文字が入ってるなら、それを1行と数えて
3になるのは正しい動作に思えるが、納得いかんかね。
995デフォルトの名無しさん:2006/10/13(金) 03:56:57
>>994
>>954をみると改行文字ではなみたいなので
先ほどから出ている環境設定の違いの +1 を
使うのかと思いました。
では、EOFを改行文字として1文字文と数えるのでしょうか?

996デフォルトの名無しさん:2006/10/13(金) 04:09:15
EOFは終端文字で、改行文字ではないと思う。
997デフォルトの名無しさん:2006/10/13(金) 04:14:50
改行文字が無くても、行に1文字でもあれば、それは1行として数えていいだろう。

aaa(改行文字)
bbbb(改行文字)
ぬるぽ(改行文字なしで終端)

これは3行だべ?


終端文字しかない行をカウントしたくないなら、それはそれでちゃんと処理してやる必要がある。
が、それだけの問題だと思われ。
998デフォルトの名無しさん:2006/10/13(金) 04:19:14
(1)
一行目\r\n
\x1A[EOF]

(2)
一行目\r\n
[EOF]

(3)
一行目[EOF]

まあWindowsでテキストモードで扱うなら、これだけ種類がある罠
999デフォルトの名無しさん:2006/10/13(金) 04:24:51
>>997
それはfgets()でうまく処理できるべ。
1000デフォルトの名無しさん:2006/10/13(金) 04:25:00
皆さん、ありがとうございます。
>>997
では、最後に行がなくてもカウントしてもいいのですね

では>>993で述べた、
>>何故、自分の環境だとtotatに(つまり改行文字の数に)1足さなければならないのでしょうか?

で、何故自分の環境だと1を足さなければならないのかが
他の参考書などを調べましたが解決しません・・・・
理由は改行文字で終わってないなら 1を足さなければならないからですかね?


10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。