1 :
デフォルトの名無しさん :
2006/07/25(火) 18:07:43
ところで、俺一人暮らしなんだが最近後ろから気配を感じるんだが誰もいないはずなんだが、 ただ俺だけなんだがなんでだろう?
そうだね、プロテインだね。
>>2 ドッペルゲンガーかもしれん・・・・・
今のうちに出来ることをやっておいた方がいい。
オナヌーでもして寝たほうがいいよ。 疲れてるんだよきっと。
7 :
デフォルトの名無しさん :2006/07/26(水) 12:03:25
インクルードファイル 'stdio.h' をオープンできない っていうエラーが出るんですけど、どうしたらいいんでしょうか・・・ ボーランドのコンパイラで、例のhello〜っていうプログラムも実行できずにいます>< 超初心者ですみません><
>>7 入門以前の事だろそれは
出て行け
二度と来るな
9 :
デフォルトの名無しさん :2006/07/26(水) 12:50:36
自己解決しますた^^
おめでとお^^
突然ですみません。3つほど質問があります。 @モーターへの出力命令の与え方 Agoto文の使い方 B作図の仕方 何度調べてもわかりませんでした。 知っている方、教えて下さい。
>>11 入門以後の事だろそれは
出て行け
二度と来るな
>>11 @ Cの話じゃない
ハードの構成に依存する
A goto <ラベル>
B Cの話じゃない
紙に鉛筆などで好きに書け
15 :
M :2006/07/29(土) 15:05:06
1.duble型変数へのポインタ変数dPtrを宣言する。 2.float型ポイント変数aにfloat型変数numberのアドレスを代入する。 3.ポインタ変数aが指すオブジェクトの値を1インクリメントする。 4.文字型配列aに格納されてる文字列をプリントする。 C言語でどうやってプログラムするんですか?(><)
// 1. duble * dPtr; // 2. float * a = & number; // 3. * a += 1; // 4. printf("%s", a);
17 :
M :2006/07/29(土) 15:33:01
ありがとうございます☆
"¥7"って何?? 7円とかそういう落ちではなく、、 7回改行とか7文字分空白を空けるのかと思ったんだが。。 cmdじゃ効果無いかな・・
>>18 7の値を持つ文字のこと。ASCIIではBELと定義されいるので、一般的にコンソールに出力すればベルが鳴る。
#そういう意味においては、"\a"と等価。
な、なんだって〜。。
だからエラーの時プープーて鳴るのか。
(2つ書いたから)
なるほど、、トンクス
>>19
21 :
デフォルトの名無しさん :2006/07/29(土) 23:51:43
return文を書くときに、後ろに0とか-1とかつけるじゃないですか。 あれって、0を返すのと他の数値を返すのとではどう違うんですか? プログラムを実行しても何も変わらないので、疑問に思いました。 どなたか教えてくれれば、幸いです。
>>21 おそらく0と-1だったら向こう側ではエラーの有無をチェックしているのでは?
返す値によって何がどう違うかは戻り値の目的による。
それは main のことか? 例えば、system 関数でそのプログラムを実行した時に system の戻り値が変わったりする(でも、どうなるかは環境依存か)。 あとはシェルで実行した時に プログラムの成功/失敗の判定に影響したり(これも環境依存か)。 まあ、環境依存だが、そんなところだ。
24 :
21 :2006/07/30(日) 00:08:10
ありがとうございます。 入門書を読んでも書いてなかったので。 ネットでも調べてみます。
-10とか-100とかってのもあったなw エラーで終わらせるのなら、exit()でないといかんか。。
C言語なら自分でやれ(実践篇) ってタイトルのスレを立ててみてはいかがでしょうか? 何も書かずに自分で勝手にやれってことですけどw
27 :
T :2006/07/30(日) 00:29:55
C言語で2Dないしは3Dのゲーム作りたいんですけどうまく解説してくれているサイトはありませんか?
2get禁止にしないとものすごい勢いで荒れるぞそれwww
29 :
28 :2006/07/30(日) 00:33:33
C廚ってスキル低いね。 遅いのにJavaが全盛なのが理解出来た。 Cで組める香具師って絶滅種?
っつか、アルゴリズムの勉強なら言語を選ばなくても良いし 初心者が手軽に手を出すからじゃね?
JavaはGUI簡単だからな ただな・・・仕事で使うんじゃないならJavaに利用価値があんまりないんだよ
33 :
28 :2006/07/30(日) 00:56:26
自分、VBですから
やっぱBCBだな
35 :
デフォルトの名無しさん :2006/07/30(日) 14:19:04
以下のやつの結果が表示されないのですけれど どうすればよいのかご教授ください #include <stdio.h> int main() { int a; a=10; printf("変数aには%dが代入されています。", a); return 0; }
うまくいくはずですが
>>35 結果というのが何を指すか分からないが、
「変数aには10が代入されています。」
と表示されないということか?
まず、環境を書け。俺は表示された。
出力される前に終了してるのか? printfの後にfflush(stdout);を入れてみてもだめなのか?
39 :
35 :2006/07/30(日) 14:57:52
>>37 表示されたのですか!
>>38 これから試して見ます。
環境は
WXP
Borland 5.5です。
表示されて、一瞬でコマンドプロンプトが閉じてるに一票。
41 :
35 :2006/07/30(日) 15:03:50
#include <stdio.h> int main() { int a; a=10; printf fflush(stdout);("変数aには%dが代入されています。", a); return 0; } こんな感じやってみたのですが だめでした.....
>>41 おいおいw
それじゃコンパイル通らないんじゃ?
こうだろ?
#include <stdio.h>
int main()
{
int a;
a=10;
printf("変数aには%dが代入されています。", a);
fflush(stdout);
return 0;
}
まさかコマンドプロンプトからの実行でなく エクスプローラで実行ファイルダブルクリックなのかな?orz
44 :
35 :2006/07/30(日) 15:10:51
>>40 コマンドプロントは閉じていないと思われます。
その代わりプロントタイプ宣言のない関数printfの呼び出し
という警告がでていますが.....
俺はBorland C++ 5.5.1でやってるけど問題なく
>>35 でいけてるよ
stdio.hをインクルードしてるし、警告も出ない
46 :
35 :2006/07/30(日) 15:16:44
>>45 stdio.hをインクルードできてないのですが
どうすればよいのですか?
>>46 は結果が表示されないうんぬん以前にコンパイルできていないとみたがどうよ?
48 :
35 :2006/07/30(日) 15:25:49
>>47 その可能性もあるのでいれなおして見ます。
>>48 ちゃんとbcc55のインストール手順に従ってインストールした?
bcc55を展開したディレクトリのreadme.txtに書いてあるはず
たぶんbcc32.cfgとilink32.cfgの設定を忘れてると思う
だいたいコンパイル(&リンク)できてるかどうかなんて 実行ファイルの有無で一目瞭然だ その可能性もあるなんて状況がいまいち分からん
51 :
35 :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); この間に何を入れれば良いのでしょうか?
scanf
>>52 根の公式知ってるなら難しくはないと思われ
a=1;
b=3;
c=2;
d=b*b-4*a*c;
でも虚数解の場合はいらないのかい?
>>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);
}
こうですか?
>>52 課題なら宿題スレに行けばたぶん完全なプログラムを書いてくれるよ
でも、その課題はさんざん既出な気がするよ
>>55 基本的にはOK
でも、求めたx1とx2の値を表示する文が最後にほしいかな
>>57 ありがとうございます。
具体的にx1とx2の値を表示する文とはどのように表現すれば良いのですか?
a,b,cの値をそれぞれ式に代入することですか?
>>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;
にするべきかと
この場合にはまあうまく答が出てくるけど一般的にするなら係数はintでなくdoubleの方がいいと思う
すまん
return文が無かった
x1とx2への代入文の次に
>>59 のprintfを入れておいて
62 :
デフォルトの名無しさん :2006/07/30(日) 16:41:25
つまりはこういうことですか? #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); }
>>63 まあ警告は出るけどそんなものでしょ
mainは暗黙のうちにintを返す関数とみなされてるから
最後にreturn 0;でも書いておけば警告も無くなると思う
実際実行してみれ
#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; }
>>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^_^;
知らなかった。
> scanf("%d", &a); まともに動かないだろ。
>>66 #includ > #include
return ー1 > return 1
scanf("%d", &a); 以下double型で宣言されている変数に対して %d > %lf
あと
>>66-67 の全角スペースはここに書くために書いたのかもしれないけど
全角文字はタブー
そんな時には と普通の半角空白を交互に並べればいい。
最終的な全プログラムはどうなりますか? こうですか? #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; }
>>73 ですかって、自分でコンパイルして実行してみたの?
else { } 不要、*x1 *x2 前の * も不要
>>73 scanf("%d", &a); < %d を変えていないからエラーが起こる
>>74 明日,学校で実行してみます。ご指摘ありがとうございました。
>>76 自分のコンピュータにコンパイラを入れてやれいw
>>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;
}
>>76 おまえ何回か宿題スレにいたやつじゃないだろうな?
complex.hをインクルードして、複素数を扱いたいと思っています。 complex<double> x と書けば、実数部と虚数部がそれぞれdouble型として定義されますよね? その後、それぞれに任意の値を代入するために、どのようにして各部にアクセスすれば 良いのでしょうか? x.real、x.imagというようにしてもコンパイルエラーがでました。 ↓エラーの内容 「メンバー関数は呼び出すかそのアドレスをとらなければならない」
82 :
80 :2006/07/30(日) 22:53:42
#include<stdio.h> int main() { printf("Hello"); return 0; } こんな初歩的なプログラムでヘッダファイルの#include<stdio.h>を消して実行してみたら普通に実行できたんだけど・・・ 普通に実行できるならヘッダファイルいらなくね?という疑問です。
自転車組み立ててみたんだけど、ブレーキつけると巧く動かないから外したら普通に動いたんだけど…… 普通に動くんだからブレーキなんて外しちゃってもよくね?
言いたいことはなんとなく分かる。 でもなんか納得いかない。 「普通に動くけど、ないとダメな安全装置」って感じなのかな?
int main(void) { double d = fabs(-1.5); printf("%lf\n", d); return 0; } とやってみるとわかる。 ヘッダー有り無しで挙動違うから。
>>83 printf()ならインクルードファイルなしでも動くけど、
ファイル操作もできなければ数学関数(sinなど)も使えない状態だね。
つまり、たまたま使える関数だけしか使わないのでない限り、標準インクルードファイルは必要。
単に、環境設定に失敗しているだけだろうから、使っている処理系関連のスレで聞いて味噌。
>>86 プログラム自体が動かなすorz
逆にさ、#include<stdio.h>がないと正常に動作しねーよ!っていうプログラムって何か無いかな?
例をみないと理解できないよ...
>>88 関数()の中身がプロトタイプ宣言されていないとintとみなされ、
戻り値の型もintと見なされるので、それでは都合の悪いプログラム
ならなんでもいいだろう。
int main(void)
{
}
間違って改行してしまった。 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; } これやって表示される結果の数を教えてください。
いや、自分で試せよ
93 :
デフォルトの名無しさん :2006/07/31(月) 13:02:43
いま手元に携帯しかなくて… お願いします。
悪いがオレも携帯なんだ だがろくでも無い結果になるのはすぐに分かる jを初期化してないからな
そもそも初期化していない変数 j の値を元にする演算結果って不定じゃないのか?
500500 + jの初期値 かな
>>86 gcc だと math.h の関数の型は
math.h なしでもちゃんと認識される。
>>97 暗黙の変換で int 化しないの? (特に引数側
微妙に拡張機能っぽいけど…
# プリプロセスの段階 or PASS1 の段階で math.h に含まれるシンボル比較してるんかな?
99 :
デフォルトの名無しさん :2006/07/31(月) 14:10:27
>>96 あ、初期化してなかった^^;
ありがとうございました。
つうか初心者の為にも警告して欲しいね
102 :
デフォルトの名無しさん :2006/07/31(月) 22:11:08
どなたかすいませんが、ストリームの意味を正確に具体的にわかりやすく教えてください。 なんとなくはわかるし、コードを書くうえでも別に困りませんけど、参考として知りたいんです。 ぐぐっても「川の流れのようなものです」とか抽象的な解説しか出てきませんでした。
流しそうめんの様なものかと 半分に割った竹の筒の中をバイト列がさらさらと流れます
104 :
デフォルトの名無しさん :2006/07/31(月) 22:20:23
>>103 その竹筒は実際はなんなんですか?メモリ領域ですか?
106 :
104 :2006/07/31(月) 22:37:13
すいません、書き忘れましたが、ファイル入出力に関しての話です。
>>104 あくまで概念です
実際はシステムが適当にバッファリングして
適当にフラッシュしてディスクに書き込みます
108 :
104 :2006/07/31(月) 22:47:00
では、ストリームのアドレスと言うとどういう意味になるんでしょうか?
109 :
104 :2006/07/31(月) 23:12:51
>>88 FILEやsize_tを使うもの。
それかコンパイラ変えろ。
111 :
デフォルトの名無しさん :2006/08/01(火) 00:12:07
ヘッダーがない場合、たとえ動いてもコンパイル時に警告がでるでしょう。 オレは基本的に警告は出ないようにすべきだと思っているので気持ち悪い。 おまいら警告が出ても平気なのか?
C99からプロトタイプ必須になってなかったっけ。
兵器
114 :
デフォルトの名無しさん :2006/08/01(火) 05:28:57
等比数列 a, ar, ar^2, ar^3,・・・,ar^nについて a,r,nを与えて、 総和を求めるプログラムをよろしくお願いします^^
教えてください。 普通のCとVCって何か違うんでしょうか? 今日、「Cはやったことがあります」と言ったら、「やってもらうのはVCだからねえ・・・」と反応されました。 両者に違いがあるってことですか?
>>116 ぜんぜんとは言わんが、明らかに名前からして違うやろ・・・
CはVC++の基本部分はあるけど
>>117 えっ・・・具体的に何が違うんでしょうか?
調べたけど何が違うんだかわからないんです。
>>118 だいたい、CとC++ってところで既に違うのだが
調べたって何をどうやって?実際に使ってみれば違いなんて分かるだろ
人に聞いて、言葉だけじゃ自分が理解できないことなんていくらでもあるだろ
論より証拠、自分で試せ
C VC++ 違い で検索したら説明サイトがあったぞ
>>116 VCとはVisual C++の略称だが、
Visual C++とは、MicrosoftのC/C++コンパイラとIDEその他のツールなどをセットにした製品のこと。
そして、「Visual C++が使える」と言えば、ATLやMFCなどのVC特有のライブラリ・独自機能を使えると言う意味合いが強い。
「Cが使える」は「VCがつかえる」に内包される。 ただし両者の知識量には数十から数百倍の隔りがある。
VCが使えるからといってCが使えるとは限らない。
128 :
fg :2006/08/05(土) 12:16:39
線形リストにおいて pがさしている節を消すには その前のポインタをpのポインタがさす節にすればいいのだけど pがさしている節の前の節をpであらわすのはどうすればいいのですか?
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--; } }
ヒントはエラーメッセージ。
132 :
130 :2006/08/05(土) 14:19:24
実行したら一応結果が出るのですがそのまま終了せず、 エラーがでてしまいます(>_<)
問題が発生したため、10sin-2sin.exeを終了します。ご不便をおかけして申し訳ありません。 と出ます(><)
yをどこからかっぱらってるんだって話だな。 xのいる位置を間借りしてるから、最初のループでメモリぶっ壊しまくり。 int *y; y=&x; を int y[128]; にでもしたら。 ついでに while(y!=&x){ は終了条件として使い物にならなくなるので、 yを書き進めた回数は別の変数にカウントしなさいな。
%7.3fと来ると、どういう感じに処理するっすか?? 未だにようわからんorz
整数7桁少数3桁を表示
トンクス。。
>>135 printf()系の書式指定の話なら、そのまま「%7.3f」と出力される。
これが"%7.3f"ならば、小数部3桁固定、全体最低7桁(カラム)で出力される。
従って、>136は二重に間違い。
揚げ足取りだとは思うが、ここ入門スレだしなー。 素で間違えてる可能性があるから、怖いといえば怖い。
JavaとかC++とかのイベント発生時のコールバックエントリしか宣言しない リスナークラスみたいなのをCで実装するとしたらどうすればいいの? 関数ポインタ使うのが一般的?
YES リスナーとは違うけど、qsortや、bsearchでファンクションポインタを渡しているアレ。
>>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; };
好きなの選べ
おっと間違えた。 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番目の文字を入れる方法は?? 入れる文字は無関係、順番が重要!!
>>144 sprintf(kk, "%.2s%c%.2s", & hh[3], hh[1], & hh[5]);
146 :
初心者 :2006/08/07(月) 15:04:28
>>145 早く返事してありがとうございました!
試します。
1番目ってもしかしてhh[0]?
サンプルを元に、手入力してソースファイルを作り、コンパイルしようとすると文法エラーになります。 デバックしてみると、printf関数で読点「、」など特定の文字が入ってるとエラーになるようです。 原因と解決策わかる方お願いしますm(__)m 環境ですが OS:Vine Linux 3.3.2-0v18 コンパイラ:GCC 3.3.2 20031218 ファイル形式:EUC-JP となっております。
そしてエラーとは何のエラー? 情報を小出しにするのはアカンよ
CでJavaのinvokeみたいに関数名指定して実行するような方法ありますか?
そういうスタートアップを作ればできます。 #既にあるかどうかはしらね。
DLLとかの呼び出しはそんな感じだけど、標準の手段は無いはずだよ。 しかし妙なものを欲しがるな。
154 :
デフォルトの名無しさん :2006/08/09(水) 02:06:40
質問させて下さい。 自分はC言語の初心者なんですが、演習問題や プログラムをやって力をつけたいと思ってます。 自分で調べて柴田望洋さんの「解きながら学ぶC言語」 がいいかなと思いましたが他にもお勧めの書籍ありますか? わかりやすく丁寧に書かれている本を探しているのですが‥
155 :
デフォルトの名無しさん :2006/08/09(水) 10:39:46
Cならこれが一番わかりやすいと思います。 「プログラミング言語C(第2版)」(B. W. カーニハン, D. M. リッチー著) 共立出版
漏れは始めてのCで育ったけどなあ。 まあ漏れはあるけど一通りやってみて、ANSI Cとかの本に手をつけてみるといいと思うよ。 手っ取り早くならいきなりANSI Cでもいいけど多分何回で理解出来ないと思う。 はじめてのCだけで、終わるのは勧めない。 そもそもeucで句読点がどんなコードで表現されるか調べてみればいいのに。
>>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++; }} でやると端のセルだけうまく数えられません だれかアドバイスください
バッファを(サイズ+2)*(サイズ+2)作れば楽
>>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でメモリ確保して、ポインタを引数で返したいのですが、 上だとうまくいきません。 どうやったらいいのでしょうか?
int func(int **x) { *x = ... }
funcでreturn x mainでx=func()
うまくいくよ
>>165 こうですか?
int func(int **x)
{
*x = (int *)malloc(100);
return 0;
}
int main()
{
int **x = NULL;
func(x);
return 0;
}
これだとビルドはできますが、実行するとmallocで死にます。
func(&x) Cは常に値渡し。
C++なら参照渡しが出来るから、func(int *& x){}にfunc(x)で受け取れる。 でも、もしC++なら、mallocじゃなくてnewにしようね。
またおかしな事ばかり教えて。 int **xにしたら、*xはどこを指しているんだ?ちゃんと初期化してから 渡さないとまた未定義の動作だぞ。
なにが初期化だよ。
初期化して渡せば大丈夫だと?
どんな値で初期化するんだ?
引数に渡される値を変更するなら
最初から
>>167 みたいな使い方以外に無いだろうに。
標準関数のstrtol等だって、普通にそういう使われ方されてるだろ。
そうじゃなくて、int **x = malloc(100);にどういう意味があるかと 聞いてるんじゃないか?まあint **x = malloc(25 * sizeof(int *)); のような物なら意味がありそうだが。
そんなの知るかよ。
元の質問が
>>161 だろ?
で、さらに
>>164 と言ってるんだから
引数に渡した呼び出し側の変数の値を変更したい、としか
俺には見えないけどね(Cでは出来ないけど)。
それが偶然ポインタ変数だから、ポインタのポインタを使うというだけ。
だいたい、
int **x = malloc(100); // 引数とは別の変数を宣言した上で代入?
なんてコード、main()内にもfunc()内にも出てこないけど、
どこから出たんだい?
100という数字の意味なんて、
>>161 以外知らないし。
>>167 int *x;
func(&x);
まで書かないと、馬鹿がたかってくるようだぞ。
int **x = NULL;
*x(**x[NULL]のアドレスが指してる*x型の場所) = 右辺; ← ×
NULLという数値(アドレス)を参照or間接代入するのは危険です
JavaでいうNullExceptionと同じです
なので
>>174 のように書いてください
C言語やる前にアルゴリズムの勉強のほうが先じゃね? 英語習ったけど、ネィティブの言い回し知らないから書けないって状態。
アルゴリズムがどうこう言う以前に、計算機のアーキテクチャを 多少は知っておくべきだろうしなー 配列とポインタについてくらいは、それなりに理解しておかないと そっちの勉強だって先に進められなくね?
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であるときの用心。
VisualStudio2005って fopenの記述以外に、更にどこか変わったんですか?(2003ユーザです) //C言語の話です。。
MSDNも読めないやつは帰れ
182 :
179 :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); } に訂正しときます。
>>166 すでに議論は終わってるけど、ひょっとして混乱してるといけないので清書。
void
func (x)
int **x;
{
*x = (int*) malloc(sizeof(int)*100);
return;
}
int
main()
{
int *hoge;
func(&hoge);
return 0;
}
185 :
デフォルトの名無しさん :2006/08/13(日) 00:04:39
これはひどい
186 :
161 :2006/08/13(日) 00:40:35
皆さん、ありがとうございます。 今、帰省中のため、ビルドして確認できませんが、とても勉強になりました。 int
187 :
161 :2006/08/13(日) 00:41:58
皆さん、ありがとうございます。 今、帰省中のため、ビルドして確認できませんが、とても勉強になりました。 int *x
>>183 こりゃまたえらくなつかしい書き方だなおい
func (x) int **x; 懐かしすぎてなんか泣けてきた。
190 :
183 :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; のほうがいいかんじ。 で、引数少ない場合でもこう書いてます。
>>190 上の書き方で、改行を入れるのが普通だね。
露骨に否定されてる書き方のはずなんだが、 今でもこれで書く人っているんだなあ。 自分じゃようやらんが、言ってることはまあ同意。
古い書き方すると、型チェックが効かないんじゃないの? (プロトタイプを書いとけば大丈夫なのか?)
>>192 Rubyは今でもK&Rですよ。
以前、ANSIスタイルにしろといちゃもんつけてた人がいましたが、
華麗に却下されました。
ここはC言語スレだがな!
func( struct hoge1 x, struct hoge1 *y, struct hoge2 *hage1, struct hoge2 hage2, struct hoge1 z) で十分。 右にコメントも入れられるし。
int main(argc,argv) register int argc; register char **argv; { /***/ return 0; } たしかカルガリーコーパスのソースってこんな感じだった気がする。
void func(foo) float foo; { printf("%s\n", sizeof(foo) != sizeof(float) ? "differ" : "identical"); } と書くと、differと出力されるコンパイラもあった。
な、なんじゃそりゃー!
>>198 昔のSunOSのccがそうだったかもしらん。
要は、スタックにfloatを積む手段がないからだな。
どうせならエラーにしてくれれば良さそうなのにね。
malloc使うのにstdlib.hは要る?(C)
Cならなくてもなんとかなる。 でもインクルードはしておいた方がいい。
返信遅れましたが、どうも有難うございます。。 無くても動くのですね・・
こういうことを言う人が出てくるから無くてもなんとかなるなんて言っちゃ駄目
Q「街中を歩くのに何か着るものは要る?」 A「局部が隠れれば何とかなる。でも着ておいた方がいい。」
>>205 どうも有難うございます。。
局部が隠れれば何とかなるんですね・・
ういうことを言う人が出てくるから隠れればなんとかなるなんて言っちゃ駄目
つまらん。
209 :
デフォルトの名無しさん :2006/08/16(水) 15:11:06
int main(argc,argv) register int argc; register char **argv; { /***/ return 0; } この書き方だとVC2005でエラーにならない?
>>200 つまり、foo は float と書いてるけど
int (おそらく2バイトな環境だよね?)になるってことか?
環境によってビット数が違うのがCの欠点でもあり長所だな。 ビット数を考慮したプログラミングすればいいだけだが。 Cってアセンブラに近いからアーキテクチャ知らないと困ることに成るね。 厳密にはコンパイラの仕様つーかどういうコードを吐くかぐらいは考慮しないと嵌る。 元々、OS作るために作られた泥臭い言語だしな。
213 :
200 :2006/08/17(木) 01:14:04
>>210 いや、SunOSの場合はdoubleと認識していたようだ。
呼び出し側でfunc((float) 3);としてもdoubleの値が積まれるから、
関数側でもdoubleで受ける必要があるんだろうね。
>>209 VCのせいっつーか、その書き方はプロトタイプ宣言のなかったANSI以前のCのものなんで、
C89以降のコンパイラに対応していたものがあったのは移行期間に対する配慮って奴で、
言ってしまえば単なるお義理。
現在のC、ましてやC++コンパイラでエラーが出てもコンパイラたんのせいじゃないと思われ。
いや、Cとしてコンパイルしてエラーが出たのでは規格違反。
そうだっけ?
そうだよ。 C++ならエラーにならなくちゃいけないけど。
registerの話じゃないのか?
いや、それは有っても無くても。
int main(int, char**) { return 0; } むしろこれなら通るな だからどうだってわけじゃないが
>>220 C++では、そのように関数の定義時にも、仮引数名の省略が可能。
>>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 スキップ ==========
釣られた?
>>223 .cppにすると通らないよ。
.cならCの文法で通る。
ほんとだ。int main(register int argc, register char **argv)なら問題ないのな。 registerは釣り要素だったのねん
最近Cをはじめて、webとかで公開されてるコード 漁って学習してたんですが、↓のコードの書きかたって microsoftのコンパイラでビルドできます? void LogToFile (char *, char *); というかchar *の部分がよく分からないです・・・
>>227 >microsoftのコンパイラでビルドできます?
できる。
>というかchar *の部分がよく分からないです・・・
仮引数名を省略した書き方。
自分で関数宣言する場合は、この書き方はお勧めできない。(宣言と定義(実装)は、コピペするほうがいい)
C言語のソースってよくネット状に転がっていると 聞きますが、どうやって調べたらいいんですか。 例えば、一つ例を教えて下さい。 画像処理について。
いや、普通に転がってはいるけど網状にはなってないんじゃないか?
231 :
デフォルトの名無しさん :2006/08/23(水) 01:17:13
ん、オープンソースって奴ですかな
ぐーぐれ
234 :
233 :2006/08/23(水) 08:26:00
すいませんif(strcmp(buff,"text") == 0)じゃなくてif( i == 0 )です。
>>233 fgets()は行末の改行を落とさない。
従って、自分でそれを取り除くか、ファイル末尾の問題がないなら"text\n"と比較すればよい。
236 :
233 :2006/08/23(水) 08:51:25
>>235 ありがとうございます。後者の方法で上手くいきました。
あと自分で取り除くって言うのは具体的にはどうやるんでしょうか?
改行の部分にナル文字を代入するとかでいいんでしょうか?
chop 画像処理しているソフトを探す。 オープンソースかどうか調べる。 C言語のソース発見。ウマー!
239 :
デフォルトの名無しさん :2006/08/23(水) 16:11:10
あれナル文字って読むのか!?
結果をファイルで出力すると通常、実行したプログラムが おいてある場所に作成されると思うんですけど、別のフォルダ に出力したいときはどんな風に書けばよいのでしょうか? 例えば下のようなtest.txtファイルを出力する場合です。 fp = fopen("test.txt", "w"); 知っている方がいたら教えてください。
fp = fopen("subdir/test.txt", "w"); fp = fopen("subdir\\test.txt", "w");
242 :
240 :2006/08/23(水) 17:08:53
>241 ありがとうございました!
>>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++; } }
>>244 whileの条件がおかしいので、プログラムが暴走している。
while (*a != '\0')
>>244 while (a != "\0")だが、
a ...文字列abcde\0の先頭アドレス
”\0" ...文字列\0\0の先頭アドレス
中身じゃなくてアドレスを比較してるよ
だから
>>245 こんな指摘の仕方はダメデスカ?
>>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という プログラムを実行したい、という感じなのですが…
#include ? eval 相当@perl のことなのかな… system() / exec() あたりだと思うけど
250 :
248 :2006/08/25(金) 21:55:49
>249 ありがとうございます。 systemを使うのは何となく分かってるんですけど 実行したいプログラム、b.cというファイルを どこにどうやって書けばいいのかがわからないのです。。
>>249 そこまでのことではなく、b.cに書いた関数をa.cの中から呼び出したいとかもっと単純ななことでは?
でもそれがわからないなら、こういうとこで断片的な質問するより 入門書を一冊読んだ方がいい気がする
体系的に学ぶのって重要だからね。特に言語は。 英語だっていきなり文法覚えても使えない。 こういう時はこう表現とか体系的に覚えないと役に立たない。 b.cが正しいかどうかチェックして実行しないと権限とられるよ。 一度分かったと思ってもすぐ分かんなくなる=分かったと思い込んでるだけ。 ちょっと応用やってみれば分からなくなるから、分かってないのはすぐ分かる。 null=ナル?
これからCを独学で始めようと思うのですが、 お勧めの本を教えてください。 書店に行ってもたくさんありすぎてどれを選べばよいのか分かりません。
プログラミング言語C++マジおぬぬめ。
どういう環境(ウィンドウズとか)でどういう目的(フリーソフトを作りたいとか、単なる趣味とか、組み込み系の仕事のためとか)で学ぶかにも寄る。 ちょっと読んでみて、理解しやすい本を選べばいいと思うよ。 何冊か読んでみて、書評付きでここに晒してどうよと訊くと、いろいろ突っ込み入っていいかとおもう。 まあ全部買えとも言われるだろうけど(w 近所の図書館でもC言語の本ぐらいあると思うから、借りてきてじっくり読んでみるのもいい。 結局は、たくさん本を読めばそれだけ知識が得られるので、1冊でC言語は完璧みたいなのは期待し過ぎ。 東大生の頭で理解しやすい内容の書籍と、私立大生の頭で理解しやすい内容の書籍は違うし。 それぞれ、しょーもない説明にページ割き杉とか、難しくて理解出来ないとか感じ方も違う。
C言語のことで質問なんだが コンパイルしてEXE作って実行すると コマンドプロンプトが出てくるんだが 一瞬しか出てこない この文章でわかったら教えてください
環境がわからんがとりあえずファイルの先頭に #include<conio.h> って書いてmain関数の最後のほうに getch(); とでも書いてみては?
わかったやってみる
>>259 d
もしできなかったらもう一度来ていい?
(゚з゚)イインデネーノ?
#include <stdio.h> void main() { printf( "好きなことを書きましょう" ); } サイトに書いてあったやつでこんな感じでやったら コンパイルのときエラーが返って来る どこが違うかわかる?
>>258 コンソールアプリをGUIから実行してるとかそういうこと?
コマンドライン立ち上げてコマンドから叩いて実行するとか、
テスト用bat書いて、実行後にpauseさせるとかって手もあるよ。
こっちなら王道っつーか、再コンパイルイラネーよ。
>>262 printfの前の空白が全角スペースとか。
BCC Developer と Borlandの組み合わせでやってる
#include <stdio.h> void main() { printf( "好きなことを書きましょう" ); } 今こんな感じなんだが 一瞬しか出ない どこに手を加えれば?
>>268 に追記
長くコマンドプロンプトを表示するためには
>>258 ダブルクリックして実行するのではなく、
コマンドプロンプトの中で実行させろ。
>>268 おまいさん、もうちっと考えてから書き込んだ方が良いぞ。
あと、プログラミングってのは、自分だけでどれだけ調べて試行錯誤したか、で
先行きが決まると言っても良い。
あとは、Cを使うなら、IDE環境使わずにコマンドラインに慣れた方が、
いろいろと理解が深まるぞ。
ちなみに、getch()するなら、こんな感じ。
俺もbcc32使いなんで、bcc32で確認済み。
#include <stdio.h>
#include <conio.h>
void main()
{
printf( "好きなことを書きましょう" );
getch();
}
まぁがんがれ。
>>271 −270
返事遅れてすまん
ありがd
がんがってみるよ
>>270 コマンドプロンプトからの実行が前提のアプリなんざ
windowsでは受け入れられない現実
#include <conio.h> っていれてもいれなくてもいいんですか?
関数はプロトタイプ宣言しないとわけわからないことする可能性がある なので宣言が書かれているのヘッダファイルはincludeすべき 毎回面倒でPCスペックにも自身あるなら全てincliudeするようなヘッダファイル書いて毎回 使っても俺はいいと思う
>>273 人に受けれられなくても、自分用ツールには十分さ。
278 :
デフォルトの名無しさん :2006/08/27(日) 00:45:49
>>273 大学の講義で習ったのはそんなのばっかりだったな。
WindowsじゃなくてMacだったけど。
ランチャー経由で起動すりゃいいのさー。 まあ、本末転倒な上にスレ違いではあるが。
>>258 プログラム末尾に
scanf("%s", &str);
って書けばいいんじゃない?
>>280 getch()が簡単でいいだろう。
それだとstr用意する必要とかあるし。
VCか。 あれは面倒だな。
VCだったらデバッグなしで実行を選べば 何かキーを押すまで勝手に止まってくれるはず
GUIのほうが見栄えはいいけど、GUIのほうが気になって、C自体の学習に使う時間が無くなるので修練度が下がる。 まあコンパイラがCUIなんだから、CUI使えないとあとで困るけどな。
となるとGUIの修練度が下がる。まさにクソソフトに成り下がってしまう。
286 :
266 :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の文が反映されない。
287 :
286 :2006/08/27(日) 18:46:38
事故解決しました。 すいません。
何その腹立つ書き方
>>288 >>266 前後を見てみれば、自己解決出来てよかったなって感じになるぞ。w
少しは成長しているみたいだからな。w
>>286 書き込む前によく考えれば解る範囲だったってこったな。
だから俺が >271 で言ったろ?
もうちっと落ち着いて、考えてから書き込めって。w
こんな後輩持ったら発狂しそう
後輩どころか、同僚・友人・知人、どれもやだ
恋人なら許せる
超初心者です。 Cpad使って、明解C言語学習しようと思ってます。 Cpadでコンパイル?すると、以下のファイルが生成されます。 hello.cpp hello.obj hello.tds hello.exe 各ファイルの説明お願いいたします。 ぐぐっても分からないでした。 しかもexe実行しようとダブルクリックしても コマンドライン?がすぐ消えます。 make&実行できちんと表示されるのになぜでしょう?
294 :
266 :2006/08/27(日) 21:59: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を実行するがよろし。
フシューフシュー
>>295 分かりやすい解説大変ありがとうございます。
コマンドラインから実行したらできました。感動です。
「黒いのがすぐに消える」という質問はFAQだよなぁ。
>>1 に入れとくといいかもしれん。
#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になるはずなんですがどうしてもなりません。 どこがどう違うのか誰か教えてくれませんか。 お願いします。
多分自己解決するだろう
printfの書式をちぇき
>>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度になるんだけどね。
>>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); }
>>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を使うことでファイルに変更が加えられたことは分かるのですが, どのプロセスが変更を加えたかがわかりません. どなたかご教授お願いします.
そこまで専門的な話なら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); }
j += fprintf() にすれば?
312 :
308 :2006/09/04(月) 11:43:16
>309 ありがとうございます.行ってみます
>>299 >>302 第二象限を求めているため答えが間違っている事はわかりました。
そこで質問なんですが、-40.9度にプログラムを修正したい場合は
どのようにしたらいいんでしょうか。
教えて下さい。
宜しくお願いします。
>>313 atan2()をやめてatan()を使ったら?
#勿論、atan2()がやってくれるような例外処理は自前でやる必要があるけど。
慣性主軸約 -40.9 度と約 49.1 度って何か違いあるの? 角度の範囲を 0°≦ θ ≦ 90° にするか -90°≦ θ ≦ 0° にするかの違いだけじゃないの?
違う。
慣性主軸って合計3本あるんじゃないの? -40.9°と 49.1°は両方とも慣性主軸っつー話では。
質問です。 関数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; }
Cって人差し指を六弦に当てないようにするのが大変。
322 :
デフォルトの名無しさん :2006/09/07(木) 12:39:05
memcpyの第2引数に関数の戻り値を指定するにはどうすればいいのでしょうか? int* pt memcpy(pt,strlen(゙hoge゙),sizeof(int)) でptに4を渡したいのですが… 一度適当な変数に退避させないと駄目ですか??
ptが未初期化という点を置いとくにしても、 *pt = strlen("hoge"); で駄目なのか?
>>323 あっ、そうですね。
何で気がつかなかったんだろう…
>>324 あっ、そうですね。
何で気がつかなかったんだろう…
327 :
デフォルトの名無しさん :2006/09/08(金) 00:59:05
関数からひとつ以上の値を返すことは出来るのでしょうか? やはり、外部変数あたりを使わなければそういうことは出来ないのですかねぇ〜?
引数使ったり配列や構造体返してもいいし
Cなら格納先のポインタ受け取ってそこに書きなされ。 そこでstaticやらグローバルやら使い始めたら、大抵ドツボだぞ。
330 :
デフォルトの名無しさん :2006/09/08(金) 02:27:42
えっと 構造体と引数を関数で渡して、 両方の値を更新して返したいのですけど、 その場合は具体的にどんな風にやれば出来ますか?
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
また地雷の柴田望洋か
よく聞く名前だが、地雷なのか?
2chで矢鱈メッタラもてはやされた時期があったな。 本自体はそんなに悪くはないが、作者の自信と内容が全く釣り合っていない。
自分が底脳なことに気がつかない人が読む本なのかな あぶなないオーラまんさい よーがー
根拠を示さず湧いてくる叩きはアレだな。相変わらず。
望洋さん もう2ちゃんねらーなんでしょ? 信者も多いし。
warningをワーニングと呼ぶ奴はバカでアホで云々とかって 妙な粘着コラムを1ページ以上とか書いてた人だったっけ? どっかで読んで引いた記憶が残ってる。 それだけ言っといてfalseをフェイルスとか呼ぶ人だったってオチが ついたりしたら、大層面白いんだが。
やっぱり! そうか?
ワーニング(笑)
VC で 非Windows のソフトで Sleep(10) の代わりになる関数はないでしょうか?
1ページ以上のコラムにするのはちと異常かもしれんが、 warning はウォーニングだという指摘を素直に受け入れられない奴も異常だな。
>>344 ロケール/ロカールはロゥキャルだよな。
ローカルと区別できるようにするために ロケールにしてるんじゃないのか?
正しい発音は、ロゥキャルが近いよ? この指摘を素直に受け入れられないとしたら、異常だよ。
そういう発音の場合、カタカナでは普通「ローカル」と書く。
local と locale は英語だと区別がつく発音だが、 カタカナで書くと両方「ローカル」になって区別がつかない。 そのために後者を「ロケール」と書いて区別がつくようにしている。 化学の世界でも allyl と aryl が両方「アリル」になって区別がつかないから 後者を「アリール」と書くようにしている。 カタカナ語にはいろいろな制約と慣習があるから、 英語の発音通りになるとは限らない。 warning に関しては "war" は「ウォー」 "warm" は「ウォーム」 と書かれるし、 「ウォーニング」としたところで別に区別がつかない別の語があるわけでもないので、 「ウォーニング」にするのが妥当。
>>343 VCで非Windowsってのがよくわからんのだが、
どんな環境想定してるのさ。
POSIXならsleep()があるし、Linuxならnanosleep()とかも使えるはず。
カタカナで何が近いかではなくちゃんとした発音が出来て、 かつ、ワーニングと言っている人がいても キレたりいちいち注意したりして話を腰を折るようなまねをしないのが正解
小さいケツの穴を晒して枝葉末節を論じるスレはここですか?
>>349 >local と locale は英語だと区別がつく発音だが、
>カタカナで書くと両方「ローカル」になって区別がつかない。
馬鹿じゃないの?カタカナで書けばロゥキャルだってば。
ローマ字読みするなら、warningはワーニングだね。
>>350 VC を使ってのコマンドプロンプトでのプログラムです。 (Windows マシン上で)
Sleep() が使えないので悩んでいます。
::Sleep()使えないのか?
user32.lib がリンクされてないんじゃないの? VCのコマンドラインプロジェクト って ・CRT0 のエントリが main() ・user32/GDI その他もろもろの WinAPI ライブラリ指定が デフォではずれる ぐらいで、Win32プロジェクトとの差は無かったハズ
ゴメン user32 じゃなくて Kernel32 だった
#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の左の括弧は、;}の右の括弧に掛かるのでしょうか?(括り) たいへん解り辛くて、もしわけありません、何卒ご助言お願い致します。 この{}の括り方がいまいち解らず困っています。
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; } みたまんまや。 左右そろってるのが組になってる。
363 :
361 :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;
}
参考書にもそう書いてありますが
この{}の法則が解りません・・・
この"}"括りの方がです。
364 :
361 :2006/09/12(火) 02:08:04
つまり、こういう事でしょうか? {A-1{B-2{C-3}D-4}E-5}
365 :
361 :2006/09/12(火) 02:12:36
頭が混乱しそうです・・・ {A-1 {B-2 {C-3 }D-4 }E-5 } こうではないんでしょうか?
>>364 法則って…斜め上で悩んでるなぁ。w
>{A-1{B-2{C-3}D-4}E-5}
そそ。
開始された '{'は、必ず '}'によって閉じられる。
どっちか欠けるとエラーになるからね。
'{''}'で開始・終了される部分ってのは、意味上のブロック。
日本語で言う段落と言っても良い。
特に命令文によって開始されない '{''}'のくくりはまさにブロックという意味合い。
関数は必ず括られると覚えて良い。
if文やfor文も、続く処理の部分が複数行に渡るなら括る必要がある。
単文なら括らなくても良いって例外もあるが、原則括るつもりで居る方がベター。
ブロック化する意味は他にもあるが、基本的にこれだけ解っていれば先に進めるはず。
{ の直前にある文の適用範囲を } まで と示している main() は { から... for() は { から... if () は { から... } まで if () を適用 } まで for() を適用 } まで main() を適用
368 :
366 :2006/09/12(火) 02:16:12
>>365 そうはならないな。
A-1がif文とするなら、
if ( expr ) {
…
}
であって、先頭に括弧が来ちゃったら
{ if(expr) {
}
}
こうなる。
if ( expr ) { }
この場合の括弧は、if文中の式が成立しないと実行されない。
369 :
361 :2006/09/12(火) 02:30:54
皆さん、ありがとうございます。 何か考えれば考える程、混乱してきましたorz 頭冷やしてきます、皆さんはこういうので迷いませんでしたか?
>>369 20年もコード書いてきて、一度も迷ったことないな。w
文法で悩むなんて無意味な行為だ。
こう書かないと動作しないっていうsyntaxなレベルの話なんだから、
これは体で覚えてしまわないといけない範囲の話。
371 :
361 :2006/09/12(火) 02:41:54
ありがとうございました。 他にも1904〜2000まで出力されるのが 括弧の{}の付け方で2001が出力出たりとか もうやってて何が何だかわからなくなりました マジレスシャワー浴びてきます。
そこでシャワーを浴びたくなったことには疑問を持たないのね。
黄金水のシャワーを浴びたくなる事あるだろ?
あるあ・・・ねーよw
361 のコードで main() 以外の { } の付け外しで、結果出力が 2001 になるパターンが想像つかん { } の中が単文だから、なおさら不可解だ。
…書いてから思いついた ('A') main() { for() { } if { } printf(); } 混乱の仕方が半端じゃないな。 数学の ( ) と同じようなものなのにね。 A * (1 + B * ( 1 + C * ( ) ) ) A -> main B -> for C -> if
377 :
デフォルトの名無しさん :2006/09/12(火) 18:51:16
…何を混乱しているんだ?
もしかしてこういう書き方なら納得するのか? (main (…) (for (…) (… …) ) (if (…) (printf(…)) ) )
Lispっぽいけど、イイ!!
forなんて邪道
381 :
361 :2006/09/12(火) 20:14:36
遅レス、すんまそ。皆さん親切で感激です。
何回か読み返してみて何となく納得と言うか整理が多少できました。
でも、疑問も又浮かびました
>>371 で書いた通り
>>376 さんの書いた様な文法にしたら(直ぐに括弧閉じ)
main() {
for() { }
if { }
printf();
}
エラーは起こらず2001が出力されました、何故上の様に
関数(){}の様に直ぐに括弧を閉じたらいけないのでしょうか?
入門書にもこう書かれています
main(){
処理
}
関数名1(){
関数の処理
}
関数2(){
関数の処理
}
と直ぐに括弧閉じになってます、たぶんこれが混乱の原因かと・・・
>>362 さんみたいに最初に付けた括弧は最後に括るではないのでしょうか?
>>381 括弧のくくる個所で、やりたいことの範囲を制御してるのさ。
# 改行位置やスペースの数は全く関係ないぞ。 念のため
for() { }
if () { }
printf();
廻りきってから(最終的に i=2001)
条件判断して(成り立ってもなにもせず)
iを表示
for() {
if () {
printf();
}
}
廻りながら (現在のiの値について)条件判断して 成立すれば iを表示
383 :
361 :2006/09/12(火) 20:56:14
>>382 解った様な解らない様なきがしますが
何となく謎が解けてきている感じがします
助言ありがとうです、皆さんすごい参考になります。
384 :
361 :2006/09/12(火) 20:59:44
>>378 逆に解らなくなって、すんまそ
初心者なのであまり余計な事は考えないように
してやっていきたいと思います。
385 :
デフォルトの名無しさん :2006/09/12(火) 22:28:45
インクルードファイル'stdio.h'をオープンできない と出てしまうのですがどうすれば直るのでしょうか教えてください
エスパーの登場を待つ
昨日も同じ質問を別のスレで見かけたが そいつはちゃんと環境とか書いてたしな。 ものわかりは悪かったけど。
>>385 インクルードファイルが見えないんだろうから、
見えるようにコンパイラにオプション指定すればよい。
389 :
デフォルトの名無しさん :2006/09/12(火) 22:58:25
自動設定のものを見つけたので解決しました スレしてくれた皆様有難う御座いました
誰かスレした人いますか? 先生怒らないから正直に手を挙げなさーい
スレした人?
スレした人だな
馬鹿ほど自覚が無いしなあ。 いきなり応用に逝くから嵌る。最初は基本に忠実に一通りやってみればいいのに。 最初から答えを求めるアフォ並みの思考だよな。答えに到達する過程を養うのが重要なのに。 既知の答えを求めていたのでは、未知の問題への解決能力が育たない。
>>385 に
馬鹿っていうなよwwwかわいそうだろwwwせめて
鹿くらいにしとけ
!
ならば馬は俺が引き受けた!
それならぬるぼは漏れが
398 :
デフォルトの名無しさん :2006/09/16(土) 20:49:44
質問なのですが #include <stdio.h> main () { int i = 5; printf("数値: %d", 5); return 0; } 何故か , の後に5を入れるとエラーを起こしてしまいます。 , の後にiを入れれば成功しますが、i=5と宣言してありますが 何処に誤りがあるのでしょうか?
エラーメッセージぐらい晒せ
? 5を書いてエラーになるか? ならないと思うが…。
俺もそう思う。とんでもない勘違いをしてるんじゃなかろうか。 だからエラーメッセージを晒してもらえばはっきりする。
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
これなんですが、こう警告が出てしまいます。
警告はあくまで警告なのであって、一応実行ファイルは出力されている。 無視してやることも可能。
それはエラーじゃなくて警告でしょうが。
406 :
デフォルトの名無しさん :2006/09/16(土) 21:11:45
ありがとうございました。
i使わないなら宣言した意味ないぢゃん!バカチンが!
ああなるほど、エラーじゃなくて警告だったのか、こりゃ一本取られた。
409 :
デフォルトの名無しさん :2006/09/16(土) 23:05:11
何で警告が出たのでしょうか?参考書を読んだり調べたりしましたが いまいち、何故警告が出たかわかりません、あと無視してもいいでしょうか? もし、“5”と言うか数字を代入した場合、どういう文法にすればいいか ご示唆下されば、ありがたいです、宜しくお願い致します。
はい お前確定
>>409 警告に基本的に無視すべきではない。
そのプログラムに対して出た警告は読んで字の如く。
今回の解決法は、そもそも使わない変数を宣言しないこと。
#include <stdio.h>
main () {
printf("数値: %d", 5);
return 0;
}
412 :
デフォルトの名無しさん :2006/09/16(土) 23:19:00
>>411 ありがとうございました、本にはこの事にいつては載ってなかったので
ネットで探していました、やっと解決しました。
警告メッセージちゃんと日本語なんだから 読んで理解して欲しいもんだ。
警告メッセージ分かりやすすぎワロタ
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”の下を改行してみたいです どの様なソースを書けば良いかわかりません ご助言お願い致します。
printf("\nHello!\nWorld!");
417 :
デフォルトの名無しさん :2006/09/17(日) 01:18:51
>>416 ありがとうございました!!
あと、もう一つだけ質問があります
実数f 0.0001, 文字c a 文字列str abc 5: abc0000000123 Hello! World!と
↑
ここを一桝空けたい場合は
どうすればいいでしょうか?
printf("\n Hello!\nWorld!");
419 :
デフォルトの名無しさん :2006/09/17(日) 01:31:34
ご返答ありがとうございます。 自分の言い方まちがっていました。 今まで通りだと、5: abc0000000123Hello!World! と 繋がってしまうので一個分スペース空けて 5: abc0000000123 Hello! World! のようにしたいです。
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しか出ません。
int player=3; にすれば、3が出る(かもしれない)よ。
424 :
デフォルトの名無しさん :2006/09/17(日) 03:09:02
>>423 ありがとうございます。
自分もそうおもったのですが・・・
入門書だとint player=o; になっていて3になると・・・・
いや、3を入力すりゃ3が出るよ。 何も入力しなきゃ、playerの初期値が表示されるのが当たり前。
426 :
デフォルトの名無しさん :2006/09/17(日) 03:19:49
そうですか…ありがとうごさいました
#include <stdio.h> main(){ int player; printf("【ジャンケンゲーム】\n"); printf("ジャンケン・・・(グー:1 チョキ:2 パー:3を入力))>"); scanf("%d",&player); printf("プレイヤーは %d",player ); return 0; } こんな簡単な手直しに時間掛かった 樹海逝ってくる(´;ω;`)
あ、そうか。 マジで俺も気が付かなかったんだ。ごめんな。
>>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");とかで、コマンドプロンプと上に表示されたファイル名を取得したいのです。
やっぱり日本語書くにも訓練がいるんだね
>>431 system関数では実行したコマンドの標準出力を呼び出した側で得ることはできないので、
"dir > tempfile"のように一時ファイルに結果を保存しておいて、
あとから一時ファイルを開いて結果を取り出す方法をとればいいと思う。
一時ファイルを作りたくないのなら、popen関数を使って、
popen("dir", "r")でdirの標準出力を得るファイルポインタを開ける。
うお、sageミスったorz
>>432 質問の最後の1行がなければ意味が分からなかった
435 :
431 :2006/09/17(日) 08:32:04
>>433 なるほどエスパー振りには感心するけど、指導方針としては
どうだろう?
オレの見立てだと431はコマンドの出力を取りたいわけじゃなくて、
プログラムでファイルの一覧を見たいんじゃなかろうか?
>>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限定の方法もあるが、こちらの方が可搬性はあると思う。
コマンドプロンプトと言っている以上Windowsなのは間違いない。 で、確か、opendir系はMS系(VC++等)には無かったような。
439 :
431 :2006/09/17(日) 10:01:56
>>436-437 説明が下手でごめんなさい……。
ファイル一覧を取り込む方法を知りたくて、
コマンドを利用して一覧を得るというアホな方法だけを考えてしまったんです。
>>437 2度も考えさせてしまって申し訳ない。
こちらのが単独で使えて良いっぽいですね。
ありがとう!
440 :
431 :2006/09/17(日) 10:03:23
>>438 WindowsでもLinuxでもOKです
アホは去ります ノシ
>>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);
}
437も441もwarning: return type of 'main' is not `int'って怒られてしまったorz
だからあれほどvoid mainは使うなと言うのに。
return文を書くのが面倒になって、つい。bccだと警告しないし。 gccはデフォルトでしっかり怒ってくれる。
日本語環境の場合、日本語のフォルダーとかファイルもある訳で扱いが面倒。 文字コードも環境によるし。
C++やC99なら、int mainとした上で、main関数に限りreturnを省略できる。 その場合、末尾の}に着いたところでreturn 0;があると扱われる。
とあるスレをみて興味を持ち始め、試しに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) { /*略*/ }
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); }
コンパイラから出力されるメッセージは次のようになります。 $ 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 関数ポインタの型が違うから警告が出てるようなのですが、ソースを見る 限り型は一致しているように見えます。実行は見た目、正常に行われるんですが 、できる限り警告は取り除きたいものです。もし警告の原因をご存じの方がいら っしゃいましたら、ご意見を下さい。
Car_showImplとCar_repaintImplの定義に戻り値の型の指定がない。 あと、そのやり方では、メソッドの呼出がC++のメンバ関数の呼出と同じ見た目になるけど、 メモリの使い方に無駄ができるから個人的にはお勧めできない。
451 :
449 :2006/09/18(月) 03:11:22
>>450 すいません。voidを付けるのを見落としていました...orz
car->show(car);
ではなく
Car_show(car);
みたいに記述する方が確かに、オブジェクトのサイズが小さくなりますね。
CでC++っぽい書き方をすると面白いかなみたいな勢いで作っていました。
疑問が解決したので、ありがとうございました。
452 :
fusian :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 みたいな。
>>453 非標準なら、getw()はある。MS系(DOS系?)ライブラリにはしばしば収録されている。
まぁ、fread()使えば事が足りるから普通は必要ないな。
455 :
デフォルトの名無しさん :2006/09/18(月) 11:56:11
freadは書式が難しくてどこに読み込んだデータがあるのかわかりませんでした。 バッファの中身を見ても数値が入ってないんです。どうして?
ちゃんと読み込めるよ。落ち着いてもう一度やってみたらいいと思う。 世界中のプログラマが使ってるライブラリの関数だし、それが間違っ てることはまず無いから。
457 :
デフォルトの名無しさん :2006/09/18(月) 12:24:25
お手数ですが、読み込んだバッファの中身を表示するプログラムを書いて欲しいです。
その前に、お前はいったいどんなコードを書いたのか見せろ。
標準関数のライブラリ全ての実装が間違っていないとは言い切れないが、 ライブラリやコンパイラを疑う前に自分のコードを疑った方がいいのは確か。
>>457 書いたソース張れば? 該当部分なんて数行だろ。
見れば何が悪いのか誰か教えてくれるよ。
半日レスが無いってことは釣りか?
自己解決していちいち報告もめんどいから放置ってとこだなwww
とっても恥ずかしい間違いに気付いたとかね
そこを武士の情けで見逃してやらないお前らマジ鬼畜
アーキテクチャ(エンディアン)依存だが、 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; } 最後に閉じてありますが、こう表示されてしまいます。
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 ***
>>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 ***
どうしても、わからないので、訂正ソースを書いて戴ければ幸いです。。。。
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 さんの訂正文だと。
実行すると必ずグーしかでなのですが、グー以外はでないのでしょうか?
質問ばかりで、すみません。
OK、順番に行こう。 まず int computer; は、int型の変数を宣言している。 変数名はcomputer。 これで以降intの入れ物の名前としてcomputerが使用可能になる。 int computer = 1; で、宣言と同時に1を代入している。 これでcomputerの中身は1が入ってることになる。 int computer; computer = 1; でもいい。 この場合は宣言と代入の手続きが分かれてることになる。
次、グー以外が出ないワケ。 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
ありがとうございました!!!解りました!!! 夜分、遅く変な質問してすみませんですた。
補足。 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が解らないのですが、取り敢えずやってみます。
>srand(100); この括弧内の100が これは俺が適当に入れた、完全に適当な値。 10でも100でも1000でも119でもなんでもいい。 ただ、それらのデタラメな値でも、毎回同じ値を入れてると、 次に取り出される値もやっぱり同じ値になる。 timeを使ったのは、起動時の時間の端数は概ねバラついているもので、 乱数のタネとして使いやすいから。 実際、起動するたびに違う答えを返すようになったと思う。 それを期待したわけだと。
どう見ても釣りです。そうでないなら自演です。そうでもないなら只の阿呆です。
うるせーばか氏ね
このスレに質問に来る椰子はアホばっかですね 才能無いから辞めたほうがいいんでないか?
うるせーバカ氏ね
froatとかcherとか書いてた香具師と同じ奴か?
うるせーバカ氏ね
みんなで仲良くね
486 :
デフォルトの名無しさん :2006/09/20(水) 07:50:53
不正入力で、変数に代入されなかった 文字列をprintf関数で、画面に出力することは 出来るんでしょうか? 具体的に説明すると、scanf("%d",&s);となっているところに 文字列をキーボードから入力したとして 変数sに代入されなかったその文字列を、表示できるのか? ということです。 くだらない質問だとは思いますが、どなたか教えて下されば 幸いです。
代入できない物を拾えたら簡単にバッファーオーバフロー攻撃できそうだが。
>>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; }
>>489 期待してるのはどういう金額で、実行するとなんて表示されるの?
491 :
489 :2006/09/20(水) 14:58:36
>>490 レスありがとうございます。
実行すると以下の分が表示されます。
日当は8000円です。
交通費は1730円です。
合計9730円です。
消費税含め日当は10130円です。
月収は-23780円です。 ← ここがおかしい
以上
月収の期待値は、303900円と欲しいんですが、
-23780円となってしまいます。
どこがおかしいか指摘してください。お願いします。
>>491 たぶん、intが2バイトの処理系
だから、303900はオーバーフローして、-23780になる
ためしに、short=2バイトの処理系で、
そのプログラムをint→shortにしてコンパイル、実行したら、その結果になった
>>491 俺の環境じゃなんねーよ?
コピペそのままでbcc32でコンパイルしたけど。
C:\c\てすつ>test00
日当は8000円です
交通費は1730円です
合計9730円です
消費税含め日当は10130円です
月収は303900円です
>>491 sizeof(long)の値を見てみて2より大きいようなら、
intをlongに変更すれば幸せになれるかもしれん。
495 :
489 :2006/09/20(水) 16:23:02
>>492 >>493 >>494 ご指摘ありがとうございます。
ご指摘どおり、データ型をintからlongまたはshortへ変更し、
それぞれ試したんですが、実行結果は変わりませんでした orz
ちなみに8バイト処理(私が知る限り最高の数値)
のdoubleも試した結果、何故かすべての戻り値が0に
返されました。
ちなみに今、使用しているコンパイラは LSI C-86 ver3.30試食版です。
コンピュータの融通の利かなさに、ほとほと困り果てています。
>>495 LSI C-86試食版は16ビットコンパイラでいろいろ制限が多いから、
もし導入に問題が無いならBCCとかに移行したほうがいいかも。
16ビット環境なんだったら仕方ないが。
でも、LSI C-86でもlongのサイズは4バイトだった気がするけど。確認していないが。
あと、doubleを試して全部0になったのは、
たぶんprintfの書式指定を%dのままにしているからのような気がする。
499 :
489 :2006/09/20(水) 19:27:49
本当に参考になるご指摘ばかりでとても助かります。 まだ、解決には至ってませんが、なんとかがんばろうと思います。 また、機会があればご教授ください。 たくさんのご意見、ご指摘ありがとうございました。
500 :
489 :2006/09/20(水) 19:40:21
いけました!!
>>496 さんのおっしゃるとおり、書式指定が間違っていたようですorz
かなりうれしいです!ありがとうございました!!
srand(time(NULL)); ってやるのって何か馬鹿っぽくね? 普通に srand(rand()); ってやったほうが簡単じゃね?
C初心者がLSI Cに手を出すと痛い目に遭うorz
C言語以外の事で悩むことが多くて、結局Quick-C買ったな。
今はネットで情報探せるから、多少ましになってるかもしれんが。
>>501 srand無しでのrand()は、常に同じシーケンスの値を返す可能性がある。
よって、srand(rand())した後のrand()も同じシーケンスの値を返す可能性がある。
……srandのseedに同じ値を渡したとき、同じシーケンスを生成って保証されていたっけ?
>>501 それでは無意味。
srand(rand());とすると、内側のrandの呼出時にはまだsrandが呼ばれていない。
srandが1度も呼び出されないままrandが呼ばれるた場合、
randは、予めsrand(1)を行っていた場合と同じ値を返すようにならなければならないと定められている。
だから内側のrandは結局毎回同じ値を返すことになるので、
それではsrandに定数を与えて乱数列を初期化するのと同じことになってしまう。
つりだろ
505 :
デフォルトの名無しさん :2006/09/20(水) 21:42:13
質問です今困っています。 とあるプログラムを書いているのですが メモリ使用量が増え続けるのです。 動的変数は使っていません。 考えられる原因を教えてください。
そのエディタにバグがある。
507 :
デフォルトの名無しさん :2006/09/20(水) 21:50:10
エディタとはエディタ自体の拡張機能にバグがあるということですか?
>動的変数は使っていません。 ほんとか?
509 :
デフォルトの名無しさん :2006/09/20(水) 21:56:55
はい 外部変数と自動変数しか使っていないのですが
エディタにバグが無くても普通に使ってれば文字の追加に伴いメモリ使用量は増えるよな。
>メモリ使用量が増え続けるのです。 現象が再現されるぎりぎりまでコードを絞ったら 何か分かるんじゃないか?
512 :
デフォルトの名無しさん :2006/09/20(水) 22:07:12
すいません言葉が不適切でした 今作っているプログラムを起動するとメモリ使用量が増えます。
そりゃ増えるさ。
514 :
デフォルトの名無しさん :2006/09/20(水) 22:13:22
今作っているのはゲームでモード別に分けてあるんですが どのモードでも使用率が増えてしまいます
515 :
デフォルトの名無しさん :2006/09/20(水) 22:15:33
昨日もそれで悩んでいたんですが放っておいたら1Gまで増えました まだ増え続けていたんですがそこで終了しました
ウミガメのスープみたいだなw エスパー期待するにしてもせめてもう少し解るように書いてくれよ。
入れ子になったままどんどん処理してるだろ。
518 :
デフォルトの名無しさん :2006/09/20(水) 22:24:00
え〜と While文でエラーが出るまでまわしてますけど・・・
とりあえず @そもそも何のゲームなのか? Aモードとは?
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
メモリ以外はちゃんと動いています
ゲームならそれなりの大きさだろ。mallocもnewもまったく使ってないのか?
525 :
デフォルトの名無しさん :2006/09/20(水) 22:41:01
はい まだCをはじめたばかりなので存在を知りませんでした。
526 :
デフォルトの名無しさん :2006/09/20(水) 22:43:00
EXEファイル自体は1.2Mです
たぶんスレ違い。
じゃあ内部でメモリ確保するライブラリ呼んで、対応する 開放ルーチン呼んでないんじゃないのか? それにしても、はじめたばかりでexeが1.2MBってのはでかいな。 何かあるのかもね
529 :
デフォルトの名無しさん :2006/09/20(水) 22:58:06
え〜と メモリ確保はint/char/float/stringで変数を宣言したくらいです。 構造体変数 abc があるんですけどそれが配列でabc[1000]にしてあります。 ほかにchar efg[100][30];などもあるんですけど原因はここら辺でしょうか?
ポインタをJava/C#とかの参照と勘違いしていて、 delete無しでnewしまくり、とか。
531 :
デフォルトの名無しさん :2006/09/20(水) 23:14:07
クラスは作っていません
>int/char/float/stringで変数を宣言 stringがある時点で本当にC言語か?
音ゲーって書いてたけど、音鳴らすのにWindowsAPIとか使ってんの?
534 :
デフォルトの名無しさん :2006/09/20(水) 23:17:31
少し話がそれるんですが試行錯誤の上で動的変数を試してみたときに強制終了してしまいました。
535 :
デフォルトの名無しさん :2006/09/20(水) 23:18:59
ソースファイルは.cppにしてあります。 音を鳴らすのはDXライブラリのPlaySoundMemを使っています
話しそらすなよ。stringがある時点で本当にC言語か?
537 :
デフォルトの名無しさん :2006/09/20(水) 23:20:50
stringは文字列の足し算のときに使いました。
拡張子cppの時点で絶対にC++だ。
だからstringはC言語に無い。何のstringだ? C++で何かのライブラリ使ってんの? いずれにせよここで聞いてても答えは分らないと思うよ。 基本的な文法ミスとかじゃなくて、組み上げる上でのスキルが そもそも足りてない感じだから。 いきなり1.2MBなんてでかいプログラムじゃなくて、 Hello Worldからやり直した方が吉
540 :
デフォルトの名無しさん :2006/09/20(水) 23:24:59
DXライブラリが使いたかったんで・・・
だからそれを行うための積み上げが君の中で足りてないって 言ってるの。走る前にしっかり歩けるように勉強した方がいい。
542 :
デフォルトの名無しさん :2006/09/20(水) 23:28:31
stringとfstreamも使ってます
ちなみに理3です。
ありえない
さぁ、偽物も出てきて盛り上がって参りましたw
547 :
デフォルトの名無しさん :2006/09/21(木) 00:05:05
自動変数の破棄はどうすればいいんですか
スコープから抜ければいい。
549 :
デフォルトの名無しさん :2006/09/21(木) 00:09:24
関数のスコープから抜けるのではだめなのですか?
550 :
デフォルトの名無しさん :2006/09/21(木) 00:10:37
関数の定義のスコープから抜けるのではだめなのですか?
秋田
552 :
デフォルトの名無しさん :2006/09/21(木) 00:30:50
メモリ問題解決しました。 スコープを抜けても自動変数が破棄されなかったのでやむを得ずすべてグローバル変数にしました。
抜ける前に自分で破棄しろよ そんなのグローバル変数を使う止むを得ない理由にはならんぞ
554 :
デフォルトの名無しさん :2006/09/21(木) 00:52:11
破棄の仕方教えてください!!
いったいどんなコードを書けば破棄されないのかと問いたいわ。 そしてグローバル変数にすれば問題なくなるとは如何に。
int foo() { char *p = malloc(1024); }
557 :
デフォルトの名無しさん :2006/09/21(木) 00:57:21
自動変数を使っていたら破棄されずにどんどん新しいのを作ってメモリが・・・となってしまったわけです
派手にメモリリークしまくって、メモリを食い尽くしてOSごと落とす最強のプログラムができてる悪寒。 何日動くか耐久ベンチやろうぜ(w
自動変数自体というより スコープ内で割り当てた自動変数から辿れる領域が そのままになってるんじゃないのか?
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") }
お前に必要なのは開放ルーチンだ
564 :
デフォルトの名無しさん :2006/09/21(木) 01:04:37
最後のプリントエフのところのせみころんがぬけてた、。・ 訂正。
565 :
デフォルトの名無しさん :2006/09/21(木) 01:06:51
上の年齢判定プログラムの意図がわからないのですが 開放ルーチンが必要なことがよくわかりました ありがとうございました
>>562 あんたに必要なのはCの制御構文の再勉強だ
switch文はそんな書き方はしないし、
たぶんやりたいことはswitch文でなく、
if...else if...elseでできる。
自分を解き放て。 ω
568 :
デフォルトの名無しさん :2006/09/21(木) 01:08:27
買うべき本を間違えたのか 萎え
ヽ('A`)ノ 開放ルーちん! ( ) ゛ ゛/ω\ __[警] ( ) ('A`) !? ( )Vノ ) | | | |
(´・ω・`) n ⌒`γ´⌒`ヽ( E) グッジョブ ( .人 .人 γ ノ ミ(こノこノ `ー´ )にノこ(
いきなりゲーム作るか? そもそも..
572 :
デフォルトの名無しさん :2006/09/21(木) 17:30:35
WinXPを使っているのですが、"\x1B[2J"などのエスケープシーケンスが使えません。 VC++とBccとLSI-C全て試したのですが、できませんでした。 config.ntファイルも編集したのですが、動きませんでした。 私の環境ではエスケープシーケンスを使うのは無理なのでしょうか?
575 :
572 :2006/09/21(木) 17:43:05
>573 本に従って、config.ntファイルに device=%SystemRoot%\system32\ansi.sys dosonly を追加したんですが、 printf("\x1B[2J"); を試してみたら、 変な記号が出ただけでした…
>>575 LSI-Cでやったか?
NTでansi.sysのエスケープシーケンスが使えるのは、
16bit DOSアプリケーションだけだぞ。
teraterm使えばいいじゃん。
578 :
デフォルトの名無しさん :2006/09/21(木) 17:52:44
>576 LSI-Cでもやったのですが、 ←[2J と出ただけでした(泣)
ボーランドのフリーコンパイラなら 画面制御が簡単に使えるからとりあえずそっち使っとけば? conio.h 読めばすぐ解るよ。
581 :
572 :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; }
>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 と警告が表示されますが無視して、実行しても構わないのでしょうか? もし、違っている部分が有れば、どの箇所に誤りがあるか、ご指摘頂けると幸いです。
>23: おそらく不正な代入
23ってのが23行目だってことは知ってる? 警告文は読める?
587 :
デフォルトの名無しさん :2006/09/22(金) 00:19:25
23行目else if(computer = 2) {printf("チョキ");} の 何が違っているのかわかりません。 本の通りにやっていrのですが・・・
589 :
デフォルトの名無しさん :2006/09/22(金) 00:23:37
ありがとうございました。 自分の不注意でした。
ソースを見て自分のミスに気づかないのはよくある。 まずはあれだ、警告文を良く見る癖をつけようぜ。 「代入」って単語について1秒でも気をつけれていればすぐに解決するはず。
本当に本のとおりなら本の印刷が間違っている。
592 :
デフォルトの名無しさん :2006/09/22(金) 12:20:39
すみません、正しく計算されなくて本当に困っています。 #define PI 3.141592654 sin(PI);の値に0が出てこないのですがパソコンが壊れているのでしょうか? もしよろしければ解決方などのアドバイスをお願いします。m(_ _)m
#include <math.h>
>>592 πと3.141592654との誤差があるので、sin(PI)は0にはなりません。
#多分、-1e-10程度になったのではないかと思いますが。
環境にも拠りますが、math.hにかなり正確なM_PIが定義されていると思うのでその値で試してみてください。
恐らく、1e-15程度に0に近い数値になるはずです。
以下のようなファンクションがあるのですが、 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 *))みたいな部分は一体なにをやってるのでしょうか?もし、参考になるような サイトがありましたら、ついでにお教え願います。
597 :
595 :2006/09/22(金) 15:19:37
一個目の*は間接参照演算子で説明がつきますが、2個めの*がなんなのか意味がわかりません
2個目の*はUINTでそのアドレスにアクセスして読んでいる。
メモリマップドI/Oだね
まあ、俺なら #define McBSP0_SPCR xxx だけじゃなくて #define McBSP0_SPCR_DATA (*(volatile UINT *)McBSP0_SPCR) みたいなのを用意して 見た目グローバル変数みたいにするけどな。
>>594 誤差だったんですね!
教えて頂きありがとうございました。
そう。πは3だから。
>>601 #define PI 3.141592653589793
この桁まで定義すれば充分。
逆に、これより少ない桁数だと不十分。
おいおい…
605 :
595 :2006/09/23(土) 10:40:20
なるほどありがとうございます。
>>600 なんで、#define McBSP0_SPCR xxx
ってなってるってわかるんですか?
エスパーだから
ソースみれば あぁ整数をポインタとして扱ってるぽいな と普通思うから
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 )をかえしているとおもわれ
>>608 REsize()はcharへのポインタのサイズを返す関数なので意図したものは返らない。
int main(void)
{
char buf[256];
printf("%d\n", sizeof(buf));
return 0;
}
としない理由は何?
609のとおり。32bitとはナンセンスだがまあいい。 REsizeの中では、bufの大きさを知ることは不可能。 たとえばfgetsのように大きさを別途渡すのが、Cでは一般的。
>>610 main関数で定義した配列長を、外部関数から戻り値として戻せるのかなと思い質問させていただきました。
>>611 配列長は配列長で別に引数として渡すことにします。どうもありがとうございます。
613 :
(^-^) ◆MONSOON/qo :2006/09/25(月) 14:02:44
>>612 ポインタだけからでも多分出来るよ
sizeofの動作を調べればいい
bufには変数の型が記録されているはず
それを自力で取得するんだ
614 :
(^-^) ◆MONSOON/qo :2006/09/25(月) 14:08:28
変数の型はどこに記録されてるの?取得することは可能?
その珍妙な自作自演コテはどうにかならんのか。 C++ならtypeidが使えるが、Cでは基本無理。
>>613-614 Cではどこにも記録されないのが原則。
デバッガを使うのでもない限り不要だから。
sizeofは定数を返す、つまりコンパイル時に値が決まるのが原則。
C99の可変長配列は例外だが、sizeofの結果はソースコード上の型で決まることに変わりはないので、
608のコードではやはり4が返ることに変わりはない。
>>615 608のREsizeの中でtypeid (x)を使っても、
それはtypeid (char*)と同じことになるので、
sizeofと全く状況は変わらない。
C++ならむしろRangeとして参照を受け渡すようにすれば、boost::sizeが使える。
618 :
(^-^) ◆MONSOON/qo :2006/09/25(月) 14:20:41
>>616 コンパイル時の型チェックが済めば型は記録されないって事か
>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行目の何が違うかわかりません
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 と言う部分です これはこのソースの意味上、どういう意味(役割)あるのでしょうか?
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までくりかえさなかった?
>>626 fseek ファイルサイズでググると見つかるかも
633 :
デフォルトの名無しさん :2006/09/25(月) 21:27:19
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がでるのでしょうか?
代入じゃないんだが・・・ ループの最初は i=0 だろ
じゃあ何が出たら不思議じゃないの?
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文は文字を出力です・・・
>◆MONSOON/qo こいつのせいでスレの密度が薄まる薄まる
とあるマイコンの内部レジスタにデータを書くときに、 自分は #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; と書く人がいるようです。いきなり関数の中にマクロが出てくるのが気持ちが悪いのですが。 どっちが一般的で正しいのでしょうか?
#define LAMP_RED_ON() {LAMP_RED = 1;} LAMP_RED_ON();
そんなことオレが知るかよ。 質問するスレを間違えてるんじゃねえのか。
じゃレスするなよ
648 :
644 :2006/09/25(月) 22:36:03
下のほうは()じゃなくて{}でした。間違ってましたすみません。
>>645 がしっくりしてますね。ありがとうございます。
char *tmp = "AAA\0BBB\0CCC"; を array[0] = "AAA" array[1] = "BBB" array[2] = "CCC" みたいに配列に入れるにはどうすれば よいですか? 標準関数だと、途中のNUL文字が邪魔でうまく 値をとれません。
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; } とかじゃ駄目かね。
間違えた。 while(n < sizeof(tmp)) だ。すまん。
>>651 ありがとうございました。
やりたいことができました。
stat.hを呼びたくない理由って何?
2次元配列の要素は、およそどのくらいの規模まで用意し、 使用できるのでしょうか? 例えば、100万×10=1000万要素の二次元配列を使用することは 可能ですか? PCのメモリは512です。 どうぞよろしくお願いします。
やってみりゃいいじゃん
わからないならレスしないでください。
>>654 それほど大きなメモリは動的確保するのが一般的。
ただし静的あるいは大域変数ならそれ位の要素があっても平気だと思う。
自動変数でも、スタックをかなり大きくとれば平気なはず。
だが、それでも動的確保するのが一般的。
それ程の量のメモリを使うとなると、メモリ確保できなかった場合をまじめに考える必要が出てきる。
動的確保以外では、メモリ確保できなかった場合、プログラム内からは殆どと言って良いほど何もできない。
動的確保なら比較的自由にエラー処理を行える。そのためもあって動的確保が好まれている。
ガッ!!。。
動的確保だと、メモリがフラグメントされて遅くなるし、必要になったときにメモリが確保される保証も無い。 処理の最終段階でメモリが足りませんでしたって終了してしまって、時間だけを無駄に消費させるプログラムを書くプログラマはクズだと思う。 DOSで全メモリを自由に使えた時代は良かった。
使うかどうか判らないのに大量のメモリを占有するプログラムも嫌だけどな。
セグメント:オフセットの世界へは戻りたくないな。
DOS時代が良かったって? DOSに仮想記憶ってあったっけ? 動的確保でフラグメントされるって何? 動的確保だと必ず細切れ確保しなきゃいけないとでも思ってるの?
知識がない馬鹿は放っておくのがいいよ。
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;
}
連鎖あぼーん機能を初めて使ったぜ。 すっきり。
#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 になると思うのですが結果は違いますよね? この場合はどのように考えればいいのでしょうか? 詳しい方お教え下さい。よろしくお願いいたします。 }
>>673 後置インクリメント演算子は、結果としてインクリメント前の値を返す。
従って、疑問の余地なくこの場合は2となる。
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)
と出でしまいました。
スレ違いだったらすいません。
かえれ!
>>675 どこが嘘?
もしかして:675=無知故に釣りに失敗した673?
>>673 優先順位はあってるでしょ。
a = b++
は、
a = (b++)
であって、
(a = b)++
ではないのだから。
681 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 19:16:52
いい加減、スレ違いなんだが
683 :
673 :2006/09/26(火) 19:31:47
673です。釣りじゃありませんtt
最近はじめたばかりなので言ってることがおかしかったらすいません。
>>674 これは後置インクリメントが先に処理されてもっていう意味でしょうか?
値を返した後に+1するっていうことですか?
>>680 優先順位があっているならば、b++の段階でbに+1されるのではないのですか?
そもそもこの考え方がおかしいのかな?
>>681 お前この前からいい加減にしたらどうだ。
iostream.hの名前自体が現在使用を勧められるものじゃないだろが。
>>676 多分
#include <iostream.h>を
#include <iostream>にするだけで通るぞ。
iostream.h のファイル名は古い仕様のC++のもので、
今現在も使用可能な場合があるのは、単にベンダ側が
過去に配慮しているってだけ。
使えなくても怒られた義理じゃない。
#include <iostream>も通らない様なら、includeのパスの問題だろうが。
元のソースコードはいつのものだ?
>>683 ・優先順位はあっている
・後置インクリメントは結果としてインクリメント前の値を返す
よって、a = 2, b = 3になる。
>>683 >これは後置インクリメントが先に処理されてもっていう意味でしょうか?
>値を返した後に+1するっていうことですか?
Yes
>優先順位があっているならば、b++の段階でbに+1されるのではないのですか?
No
そうしたいなら、 a=++b とする。
>そもそもこの考え方がおかしいのかな?
Yes
前置と後置の違いを勉強してきなされ。
687 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 19:37:07
>>683 後置インクリメントはそうしたものです。
つまり a = b++; と書いた場合、a = b, b++; と等価です。
#仮に、インクリメント後の値を返すとしたら前置インクリメントと同じになっちゃいますね。
>>683 いや、それで合ってる。
=より先に++が処理されているし、b++の時点でbには+1されているが、
b++が返すのはbのインクリメント前の値なので、
a=b++は
b++;
a = b;
じゃなくって、概ね
int c = b;
++b;
a = c;
に等しくなる。
The result of the postfix ++ operator is the value of the operand. After the result is obtained, the value of the operand is incremented.
692 :
673 :2006/09/26(火) 20:49:14
コンパイルで '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; } }
693です。 すみません、自分でなんとかできそうです。。。。たぶん
>>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
解決しますた、すんまそ
>>696 0の可能性はないとふんでたんですが、よく考えたらありました。。。。
ありがとうございます。関数を呼ぶ前にngood,nbadは0なら+1するようにしました。
>>695 最終的にこうなりましたが、やっぱり拙いでしょうか?
b = (double)(bad)/(double)(nbad);
g = (double)(good)/(double)(ngood);
>>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は必ずしも要らない
0だった場合に勝手に1にしてしまっていいの?
>>700 実際動かしてみましたが
((double) bad / nbad == 0) ? 1 : nbad
とはならずに
(double)(bad)/(nbad == 0 ? 1 : nbad);
になりますね!
0で割るとオーバーフローで落ちること以外になにか致命的なことが起こる可能性
はありますか?(メモリを確保していないとき並にまずいことなど)
検索すればすぐにでてくると思ったのですが案外なかったです。。。
701>> このプログラムは正確な確率を求めるものではないので大丈夫だと思ってます。 nbadなどの値は徐々に増えていくのですが 例えばbad/nbad=200/4000が200/4001になっても確率はそれほど変わらないからです。
d != ! これはなんだ。AAか。 冗談はさておき、そこは多分 d != 1 あたりなんじゃないかとエスパー予想。
705 :
デフォルトの名無しさん :2006/09/28(木) 02:34:18
自作プログラムで処理途中のログを特定のフォルダの特定のファイル名で 出力しているのですが、そうすると、同じプログラムを二本同時に 動かすと、ややこしいことになります。 なので、フォルダ名は今まで通り固定しても、ファイル名は実行した プログラムごとに名前を変えたいのですが、こういう場合、決して 重複しないようにファイル名を作り出す方法って、どういうのが ありますか?日時やプロセスのIDなどを利用するのが良いでしょうか? それとも、もっとスマートな方法がありますか?
単純に重複排除したいだけなら、日時でいいんじゃまいか?
同じくプロセスのIDはそう悪く無い手だとは思うけど、 ファイル名に脈絡の無いゴミ文字が入るのは微妙っちゃ微妙かもかな。
ログファイルを排他して一つに複数のプロセスからアクセスするのが常套手段だな。
tmpname()
710 :
デフォルトの名無しさん :2006/09/28(木) 09:11:17
>709 おお、こんな便利な関数があったとは! ありがとうございました。
ウインドウズならイベント、 ユニックスならシスログ に出した方が汎用性があって監視とかも楽だよ。
712 :
デフォルトの名無しさん :2006/09/28(木) 11:27:17
めちゃくちゃ初心者です。C言語をはじめたいけど、ソフトが必要ですよね?高いんですか?どうしればいいんでしょう。 ユニックスってのを入れるんですか?
入門書をかえ。 Visual C++ 2005を検索してDLしろ。
714 :
(^-^) ◆MONSOON/qo :2006/09/28(木) 11:39:05
>>712 BCC developerがいいですよ
あと
>>681 (ボーランドc++)を入れれば直ぐ出来ます
初心者ならVisual C++のがいい。
718 :
デフォルトの名無しさん :2006/09/28(木) 14:04:50
質問です int a=10; int *pa=&a; int *pp; というのがあったとして ppに&aを入れたいんですが、paを経由して入れるにはどうすればいいですか?
pp = pa;
720 :
(^-^) ◆MONSOON/qo :2006/09/28(木) 14:13:59
>>717 初心者にはBCCの方がいいよ
コンパイル速度が速いし複雑さが少ない
721 :
デフォルトの名無しさん :2006/09/28(木) 14:14:25
コンパイル時間が気になるほど大きなプログラムは書くようなやつはもはや初心者ではない。
おまえ知らないのか? 数あてゲーム程度のプログラムなのに 数万行ものコード書いてくるヤツを。
初心者はBCCの場合はDeveloper必須
ホントだ。 こりゃ使いやすいや!
>>727 その数万行が全部 main() の中に書いてあるんだぜ?
>>728 もはや初心者とか中級者とか上級者で分類できねーYO
おまいがその凝り性を良い方向へ導け
むしろそんだけ無駄に何やってるのかが気になる。 ヒンズースクワットしながらピロシキでも焼いてるのか。
731 :
デフォルトの名無しさん :2006/09/28(木) 20:29:40
自作のプログラムで、 整数の割り算をすると答えに小数点以下が表示されない・・・・ (5÷4 = 1.0 と表示されてしまう) @ 関数の宣言は、 double = ans ; と宣言してるし。 A 表示の部分は printf("%f\n")で、小数点の表示に対応できるようにしているんですけど。
intとintの割り算の結果はintですよ馬鹿
>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でも自動では変換されない
5.0でいいいやん
736 :
(^-^) ◆MONSOON/qo :2006/09/28(木) 22:26:01
>>735 int a=5, b=4;のときは
ans = (a+0.0)/b; と書くしかないよ
Java 5のことだけど?
ans = (double)a/b;
>>734 スクリプト系の言語ならいざ知らず、Cなら後者はナンセンス。
>>736 そんなことはない。
741 :
(^-^) ◆MONSOON/qo :2006/09/28(木) 23:25:22
>>739 ans = a.0 / b;は駄目だよ?
>>741 だから結局double型へのキャストがCでは一番まともな方法。
743 :
デフォルトの名無しさん :2006/09/29(金) 00:01:13
2038年問題に対しての対応策などは考えられてるのでしょうか?
>>743 最近の処理系ではtime_tを64ビットにしたり、
当面の回避策としてtime64_tなる64ビットの方を用意していたりするものが徐々に増えている。
それがオーバーフローする頃にはまた問題が起きるわけだが。
何億年後の話だw とりあえず漏れらの生きてる間には起きないだろうから安心しれ。
惑星の寿命が尽きてそうだな
filelengthと_filelengthなど、同じ機能の関数が二つあるのは なぜですか?(使ってるのはVCですが、他の環境でもこうなん でしょうか?)
自分で作ったものには真似して '_' を付けたりするんじゃないぞ。
先頭が_で始まる関数名は処理系予約。 マクロ等で置換される可能性があり、通常ユーザは使ってはいけない。 VCのライブラリが同じ定義をアンダースコア付きと無しで 同じ様な名前の関数を二重に持っている様に見えるのは、 大抵の場合マルチバイト文字列前提とUNICODE文字列前提で 使用する関数を切り替えたり、バッファオーバーフロー対策を施していたりといった 機能上の違いを使い分けるためだったり、色々。 MSDN見れば大抵対応が載ってるから、読め。 あと微妙にスレ違いな。 お前さん、機種依存環境依存の問題とC言語の問題の区別がついてないっぽいから 基本VCのスレか、環境依存OKなC/C++室スレに常駐しれ。
VCで下線の有無以外同名という関数は全てPOSIX由来の関数のはず。
昔は_なししか用意してなかったが ISOだかANSIだかで処理系依存のものには_を付けることが推奨(?)されたため _付きのが用意され、そちらを使うのが推奨されるようになった。 が、互換性のため、昔の名前のままのも残されている。
753 :
デフォルトの名無しさん :2006/09/29(金) 23:18:38
くだらない質問で、すみませんが _ ってどうやって出すのでしょうか?
>>753 日本語106キーボードでは、Shift+ろ(右Shiftのすぐ左)
101キーボードでは、Shift+-(0のすぐ右)
755 :
デフォルトの名無しさん :2006/09/29(金) 23:58:24
ありがとうです!携帯ならすぐでますが、PCではわかりませんでした
スレ違いかもしれませんが質問させてください。 他スレから誘導されてきました。 俺はC言語全くの初心者です。 勉強しようと思って本は買いました。 ついでに何かソフトも買ってキーボードを叩きながら覚えようと思うのですが・・・ 何かお薦めのソフトはありますか? 教えて君で申し訳ないのですが。。。教えてください。
>>756 誘導された旨を知っているから、とりあえず
>>756 はマルチじゃないと言っておく
さて、次の一文が論理的推論が間違っているように思うのだが
> ソフトも買ってキーボードを叩きながら覚えようと思うのですが・・・何かお薦めのソフトはありますか?
つまり「お勧めのソフトを買って、キーボードを叩きながら覚えよう」としているのだろうか?
C言語を覚える手段を「キーボードを叩きながら」と明言しているにも関わらず、なぜソフトを要求する?
無意味な絡みはやめて適当にBCCとかVC2005EEとか教えとけばいいんじゃまいか そうすれば一回り大きくなって帰ってきて 「stdio.hがインクルードできません」 「__WinMain がリンクできません」 等の質問でスレを活性化してくれるさ
759 :
756 :2006/10/01(日) 00:28:14
>>757 ,758
レスありがとうです。
>>757 俺の文章の書き方がおかしかったのかな。
申し訳ないっす。
学習ソフトとか初心者用のソフトとかそんな感じのが市販されているのであれば、
それを買って実際にプログラムを動かしながら覚えてみたいってことです。
こんなんでわかるかな・・・?
>>758 そのBCCとかVC2005EEとかは普通にビックとかヨドバシに売ってます?
明日行ってみよう。。。
>>759 学習ソフトか…
プログラミング言語の学習ソフトなんてあるのかな?
とりあえず俺は見たことも無いし使ったことも無いのでアテになりません
プログラミングの基本はもう「馴れ」しかないから、サンプルコードを惜しまず手を使って書いて悩めばそれで十分でそ
BCCとVC2005EEは無料で落とせる
BCC:borland フリー Cコンパイラ でググってみたり
VC2005EE:Visual C++ 2005 express でググってみたり
他にDMCとかもあるけど…うん、アレはあれでいいかも(古いままかも)
DMC:Digital Mars C++ compiler
他のもあるけど、最初は道があったほうがらくだよね。
VC2005はマシンスペックが結構必要になる、ついでに登録必要のはず。
BCCはまぁ、コンパイラだけだったと思うからそれほど必要じゃないね、でも登録必要。
DMCは最近使って無いから忘れた…マジで古いC++(#include <iostream.h>とかやらにゃならん)かも。
どのスレに書いて良いのかわからなかったので、 このスレで質問させていただきます。 問い:コンピュータの整数は、ある数までしか表現できない。 その数を上回ると負の数になってしまう。 最大公約数を求めるプログラムを使って、データを少しずつ大きくしていき、 どの数まで正しく表現できるか調べる場合、どのようにすればよいか。 という問題なのですが、どのようにすればいいんでしょうか? お願いしますm(__)m
763 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 04:21:35
>>762 char , short int ,int ,long , doubleとかの型が不明なときに
アルゴリズムで型を判定する問題ですか?
>>763 型はint型です。
先日プログラムの勉強を始めたばかりの初心者なので…
最大公約数を求めるプログラムを書いた方が良いでしょうか?
765 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 05:01:53
>>762 なぜ最大公約数を求めるプログラムが必要なのかわかりません
>>765 >最大公約数を求めるプログラムを使って、データを少しずつ大きくしていき、
>どの数まで正しく表現できるか調べる場合、どのようにすればよいか。
ていう前提なんだから、先生に聞けよ、そんなことは。
要はユークリッドの互除法でも使えって話しなんだろ。
気圧計を使ってビルの高さを求めるって問題があったな。 最大公約数を求めるプログラムの実装に依存するが、 #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; }
最大公約数を求めるプログラムを使わないとこんな感じ #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; } 本当に「最大公約数を求めるプログラムを使う」問題か確認するよろし
770 :
762 :2006/10/01(日) 13:00:12
ありがとうございました。 もう少し自分で考えてみますm(__)m 先週から独学で始めたばかりで、周りにプログラムに詳しい人がいなくて ここで聞いたのですが… ご迷惑おかけしました。
いや、スレさえ間違えなければ構わないんだ。 つーか実際にここでもいいのかもしれないが、 宿題スレの方が気の利いた答えが貰えると思う。 めげずにまた来ておくれ。
昨日から始めたのですが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); }
, m, m);
じゃねえや , m, m, m);
10進数で%d じゃね??
間違いではないな
さすがに気づいてるだろ
779 :
772 :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); でいいのでは
781 :
779 :2006/10/01(日) 16:25:37
単複系でるのかなぁ wkwk (´∩ω∩`)
「文字」と「文字列」の違いを調べよう。
>>780 そう書きたいなら
scanf("%99s", name);
寿限無を入力されたら困ったことになるよ
scanf_s() を使えよ。
tm_mon は 0から11だからね
そ、そうだったのか・・・orz ありがとう、1足して使うよ(^o^)/
790 :
731です :2006/10/01(日) 18:33:40
733さん、734さん、736さん、738さんありがとうございました。 三人とも正解でした!
791 :
790です :2006/10/01(日) 18:36:22
すみません! 三人 → 四人でした。
>>786 ソースはもう少しきれいに書きましょう。
doxgen用にマジメにコメント書いてたらソースの2/3がコメントになってしまった件
普通はソースコード読めば分かるように書くよね 不必要なコメントはそれこそ可読性を落とすゴミ以外何者でも無いし ただ、コメントがどうしても必要な場合があって、 それはたとえば 1 専門家の考えるような概念が直接取り入れられている(FFTやWavelet、LZ法など) 2 ソースコードを読む時間を省くため →その割にはコメント読まなきゃいけなかったりする 3 実はゴリゴリ書いていて、コメント無しじゃ何を意味してるのか汲み取れないシロウトコード →コメントを書く以前の作業に戻らなきゃならない こんな風になる。もっと多くの事項もあるけれど、たいていこれらに集約される。 で、分かったこと。 1番以外はコメント書く必要が無い。 そして1番はそれほど多くない。 したがって、2番や3番などの場合以外でコメントを必要とする場面が少ない。 で、コメントがいらなくなっていくわけですか。 もう何言ってるのかわからないのでやめときます //スルーsage
795 :
デフォルトの名無しさん :2006/10/01(日) 19:25:00
よくわからないのですが、C言語に於いて 参照とはどういう意味なのでしょうか? 違う物に喩えてお願いします。
>>795 んー、もうちょい具体的に分からないところをあげるといい
797 :
デフォルトの名無しさん :2006/10/01(日) 19:46:03
>>796 よく、最初に〜を参照するとか本には書かれていますが
その参照の意味がわかりません
何を比較して照らし合わせているのでしょうか?
参照@infoseek国語辞書 他のものと照らし合わせてみること。 「第一章を―せよ」「―項目」 比較はしていないな。
799 :
デフォルトの名無しさん :2006/10/01(日) 20:25:27
>>760 レスが遅れてしまい、ホントに申し訳ないっす(汗
今とりあえずborlandをダウンロードしてインストールしてます。
>>757 ,758も
>>760 もご指導ありがとうございました。
とりあえず自分で色々と格闘してみます。
わからないことがあったらまた来ますんで、
その時は、ご迷惑かもですがよろしくです。
801 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 23:22:37
>>800 Bcc developerがお勧めですよ
かなり初歩的な質問かもしれないけど、 C言語の簡単なアプリケーションのソースをサイトからもらってきて実行したら、 「resource.hが開けません。」と、エラーが出ました。 これは何故出るんですか? ググってみたら「resource.h→メモ帳で新たに作り、define文をコピーして保存する。」と書いてあったのですが、よく意味が分かりません。 もしかして、アプリケーションを作って実行する時って"Cのプログラムを書いたファイル"だけじゃなくて他にも"そのresourceとか言うのを書いたファイル"とかが要るんですか?
#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();以降の部分がうまく処理されていません。 (キーボードからの入力待ちにならずにプログラムが終了する) これはなぜなんでしょうか?
printf("chの文字コードは %x です\n", ch);
805 :
デフォルトの名無しさん :2006/10/02(月) 00:49:10
>>803 文字コードなんて関係ない
scanf()で、入力していくと、ストリームにEnterキー押したときの
改行文字'\n'が残ってる。
そんでgetchar()はその'\n'を読み込んでしまうため次のif文で否定される
あと、getchar()の戻り値はint型
なんの本か忘れたけど、ポインタは使わずに配列でやってしまえってのがあったな。 なんの本だっけ?
>>805 おまえがヒントだけでは理解できない人間だというのは良くわかったよ。
808 :
803 :2006/10/02(月) 01:07:34
>>805 レスありがとうございます。
ストリームというのが何なのかまだ理解できていませんが、
getchar()より上の部分で使っているscanf()が悪さをしているということですね。
あとgetchar();についてですが、私の持っている参考書には1文字をキーボードから
入力する際に使うようにかかれており、char型の変数=getchar();と書かれていたのですが
これが間違っているということですね。
勉強になりました。ありがとうございました。
>>802 "Cのプログラムを書いたファイル"だけじゃなくて他にも"そのresourceとか言うのを書いたファイル"を読み込むように書いたCのプログラムは
"Cのプログラムを書いたファイル"だけじゃなくて他にも"そのresourceとか言うのを書いたファイル"が必要になります。
自分で書いたプログラムを後で参照しやすいようにコメントを書くことがほとんどだろう。 でも他人との理解度が違うので、他人が書いたプログラムのコメントなんて糞の役にも立たないというのが現実。 結局、作った香具師に訊くか、自分で解析するしかなくなる。 まあ実際の案件では、事前に十分に研修なりで理解度の意識統一をしておくのが吉。 インデントつーか書式に付いても個人差があるから、タブ字下げかスペースなら何文字とか統一すべき。
>>811 文意から察するとコンパイルかけたっぽいが…
>>802 もしかして Windows の窓を作るサンプルじゃないか?
つか猫?
なあ、
>>803 についてだが、
for(i=0;i<NUM;i++){
printf("%dつ目\n",i+1);
scanf("%s",test[i]);
}
fflush(stdin);
と、fflushで処理するのは邪道なの?
>>813 fflushは書き込み可能なストリーム用
運良く意図通りになる処理系(ライブラリ)も多いけど 未定義動作であることは確か。
816 :
813 :2006/10/03(火) 00:13:23
そーか。よくわかった。サンクス。 ま、素直にfgets使うわ。
817 :
デフォルトの名無しさん :2006/10/03(火) 20:05:24
strcmpの比較の意味がわかりません…辞書順に違うと言われても 意味が…「abc」は「agc」よりも前なので小さいと説明がされていますが よくわかりません、他にも「4」「12」では「12」が先に来るから「4」が大きい と説明されてます。
出席番号とかと同じだよ。 あいうえお順、ABC順。
819 :
デフォルトの名無しさん :2006/10/03(火) 20:12:47
アルファベットの方は理解できますが、 >「4」「12」では「12」が先に来るから「4」が大きい は理解できません
字ズラを登場順に比較している とでもいうべきか。 12 と 4 は じゅうに と よん を比較しているのではなくて、 いち と よん を比較して(この段階で いち のほうが小さいから 集合[12] は先) 同じなら に と (無し) を比較する abc と agc は エー と エー (同じ ビー と ジー (b の方が若いから 集合[abc] のほうが先
辞書順ってのは、 使われてるエンコード上で文字コードが若い順/古い順ってことになる
822 :
デフォルトの名無しさん :2006/10/03(火) 20:20:16
難しい… イメージは掴めました、ありがとうございました。
823 :
817 :2006/10/03(火) 20:32:50
ここで、又解らない事があります int i; char str1[] = "abc"; char str2[] = "def"; i = strcmp(str1, str2); 変数iには-3が代入されました。 と参考書にありますが、何処でどうしたら -3が出てきて代入されるのか検討もつきません。 ご指導御願いたします
>>823 きっとstrcmpにstr1とstr2を渡したら戻り値が-3となって、i に代入されたのです
'a' - 'd' だな。 「文字コード」について調べるといいよ。 それと、ちょっとその参考書名を晒してくれんか。
ぶっちゃけ検討する必要はありません。 もちろん見当をつける必要もありません。 規格ではstrcmpはゼロより小さい、等しい、大きい整数を返せばよいことになっています。 それが-3だろうが-127だろうが何も問題ありません。
strcmp(s1,s2)で得られる数値の意味は ・負:s1の方がs2より、辞書順で先にあらわれる=s1<s2 ・0:s1とs2が等しい=s1==s2 ・正:s1の方がs2より、辞書順で後にあらわれる=s1>s2 戻り値の符号以外の意味は規定されていないようです。 なので正か負か、0か”だけ”を判断すべき、と分かります
828 :
817 :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が出てくるのか・・・。
> と言うのの返しますと言うのが、いまいち難しいです。 そうですか。 > の意味が解りません・・・何故、プラス1が出てくるのか・・・。 わかりませんか。そうですか。
830 :
817 :2006/10/03(火) 20:50:21
>>824-
>>825 ご返答、ありがとうございます。
>>きっとstrcmpにstr1とstr2を渡したら戻り値が-3となって、i に代入されたのです
簡単に比喩で喩えると、どういう事でしょうかね?ご迷惑、申し訳ありません。
参考書は"10日で覚えるC言語"です。
831 :
デフォルトの名無しさん :2006/10/03(火) 20:52:23
なまいきなやつだな〜 お礼は。 参考書名は。 お前の質問の前に、まず、 ここはお前のなんだと思ってるのか、教えてくれるか? それとも殺して欲しいのか?
使ってるコンパイラによって違う。
strcmp の決まりごとは
>>827 まで。
-3返すコンパイラもあれば、-1返すのもある。
>>829 >>831 まず投稿する前に自分に言ってみたか?
何を伝えたいのか全くわからんよ
>>828 理解するのとは別に難しいならなれるしかない。
理解はしているか?
> >>数値に見なしてプラス1をした値を得たくても[str + 1]とはできません
> の意味が解りません・・・何故、プラス1が出てくるのか・・・。
俺にも作者の意図は分からない、
str+1 は 123+1でないことがわかればいい
詳しいことはもっと本を読むべし
834 :
817 :2006/10/03(火) 20:56:11
ありがとうございます。 混乱してて自分でもよく解らなくなっています、一旦散歩でもして 頭冷やしてきます、ありがとうございました。m(__)m
その参考書「だけ」で覚えない方がいいかもよ。 著者自身が解ってない人かもしれん。 使うなとは言わんが、あまり書いてあることを真に受けない方がいい。 とりあえず一通り目を通してから、 テンプレにあるような解説サイトなんかも見てみるべき。
837 :
817 :2006/10/03(火) 21:04:16
>>837 始めからその態度でいればよかったんじゃないか。
どこに行っても相手にされずに、行くところがなくなったらまた戻って来いよ。
別人装えば叩かれることもないのに…。謙虚なのか恥知らずなのかよく分からん奴だなw
>>827 文字列と数値が違うものだってことは分かってる?
詳しいこと話しても理解出来ないだろうから簡単に説明するけど、
「数値」っていうのは、「数値」同士で足したり引いたり出来るモノ。
「文字列」ってのは、読んで字のごとく「文字」がならんで文章やデータを表したものだ。
"66" は文字列を表していて、数値ではない。数値じゃないから足したり引いたりってことは出来ない。
でも、atoi("66") とすると、文字列が表した66という数値が返ってくる。敢えて誤解を恐れずに言うと、
atoi("66") が66という数値。だから足したり出来るわけ。
66 + 1 // 数値 + 数値なので、結果は67
atoi("66") + 1 // 数値 + 数値なので、結果は67
"66" + 1 // 文字列 + 数値なので、間違い。67にはならない。
// (厳密には間違いではないが…。)
840 :
827 :2006/10/03(火) 21:58:43
えーと・・・俺?
すまんすまん、アンカー間違えた。お前だお前。
違った…ora 827→817
843 :
827 :2006/10/03(火) 22:09:46
>>839 おお!これで悶々が解決しました気がします!!
サンクスでした!!!散歩した甲斐がありました。
844 :
827 :2006/10/03(火) 22:11:46
>>839 最後に質問なのですが、
>>"66" は文字列を表していて、数値ではない
と言う事ですが、"6"なら数値ですよね?
要は連なっていれば文字列と言う事でしょうか?
>>844 "6"も文字列( {'6',0} という配列をちぢめて書いたもの)
まぁ、
>>839 さんのを何度もよんでみることです
846 :
827 :2006/10/03(火) 22:18:08
>>845 返答、ありがとうございます。
では、数値が何か(どういうものか疑問が又湧いてきます)
とにかくじっくり読んでみて数値と文字列の違いを理解したいと
思います。
なんかひどく馬鹿にされた気分なんだけど、気のせいかな。
俺たちが思ってる数値をどうやってコンパイラさんに教え込むか? 「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}に同一である らしい
まずマシン語を勉強して、データの扱いを勉強した方が。 Cというかコンパイラは、1やAを指定によりどう扱うかを決めてマシン語に変換してるだけ。 うまく動かないときにはイライラするけど、冷静にCPUやコンパイラの気持ちに成って考えてみるのが吉。 自分は絶対悪くない、C言語やコンパイルが悪いとか妄想しちゃう香具師はプログラム作成に向いてないよ。 漏れは他人のプログラムを解読するとイライラするのでプログラマに成るのは諦めた。
>漏れは他人のプログラムを解読するとイライラするのでプログラマに成るのは諦めた。 気持ちは痛いほどわかるが、なら何故この板に居るw
あれだ、「プログラムは思った通りに動かない。書いた通りに動く。」
使いこなせないのって、とってもイライラするよね。 こんな簡単なのにね〜
本人に取っては簡単じゃないけどね。 できない子って頭が悪い(=知能指数とかが低い)訳じゃなくて、十分な理解ができてないだけ。
コンパイラさん、あのソースマジむかつきますよ あの野郎しめてやって下さいよ
すいません質問です fscanfを使わないで指定されたデータファイルから データを読み込みデータ件数、最大データ長、最大値、最小値 を出力するプログラムはどうするのですか? 自分はfgetcを使うと思ってるのですが お願いします教えてください
fgetsのことも思い出してあげてください。
警告じゃね? i=5で初期化したあとiを使ってないよな。 変数に数値を代入したあと使っていない旨の警告がでたような
ちょ…。 400位のレスよんでたのに何をとちくるったのかレスしてしまった。 俺テラハズカシスorz どんだけ亀なんだと
自分で書いたプログラムを後で読むならイライラしないんだろ。
質問なんですが、 2進数16桁の加減算プログラムをmain関数で作成するのですが、 加算はできたのですが、減算のプログラムがイマイチできません。 加算のプログラムに追加しなければいけない、プログラムはなんでしょうか? 桁上がりを考慮したプログラムです。 どなたかわかりませんか?
その2進数に符号(±)の概念はあるの?
減算用のプログラムを別に書けばいいよ
864 :
861 :2006/10/04(水) 17:14:41
>>862 符号の概念はなく、2の補数を使うのですが、
そこがわからなくて・・・
減算用なんて要らないよ。 加算用を使えばいい。
そもそも2の補数表現は減算を加算回路で行なうためのもの。
わからないなら単純化するのがデフォだろ
>>864 2の補数を使うのが分かってるなら、引く数を2の補数にして
加算ルーチンに入れればOK
2の補数が分からないのなら、全ビット反転して1足せばよい。
1足すのは加算があるから問題ないでしょ
無料でC*.NETを作るにはどれをインスコすれば良いですか? マイクロソフトのは登録(クレカ決済?)が必要でした。orz
フレームワークを作るの? そりゃ大変だ。 Cだけで作るのは難しいんで内科医?
C*.NETを作るのか。.NETに商標とか無いのかな?だいじょうぶ?
873 :
(^-^) ◆MONSOON/qo :2006/10/08(日) 12:12:38
C++(加法) C# ( ++++ ) から一気にC*(乗法)か 進化だな
C//とかC川(///)とかC土(+-)とか
875 :
デフォルトの名無しさん :2006/10/08(日) 16:25:30
fopneでファイルを開くときに変数で指定する方法を教えてください。
fp = fopen(filename, mode);
877 :
デフォルトの名無しさん :2006/10/08(日) 18:10:46
free()関数の仕組みを教えてください malloc()やrealloc()でメモリを確保するじゃないですか その後free()で開放するとき、バッファのサイズを指定せずに どうやって正確にメモリを開放しているのでしょうか? 特殊な変数にでも値を保存しているんですか?
>>877 大抵の処理系は、malloc()系の関数で領域を確保する際に、その領域の直前に
サイズを記憶している。
まあこういうお馬鹿なプログラムで確かめる事もできるわけだ。 もちろん未定義の動作となるので実行は自分の責任で。 #include <stdio.h> #include <stdlib.h> int main(void) { int *i = malloc(16384); printf("%d\n", *(i - 1)); free(i); return 0; }
>>848 Cにおいて、文字リテラルはchar型ではなくint型だ。
# C++ではchar型だがな
882 :
デフォルトの名無しさん :2006/10/09(月) 01:01:42
すみません、ちょっと質問です Windowsのテキストモードの改行コードって何か教えてください
883 :
デフォルトの名無しさん :2006/10/09(月) 01:30:46
¥r¥n
なんだろう・・・この正しいけど微妙な感じ
885 :
デフォルトの名無しさん :2006/10/09(月) 01:53:39
>>884 書くの面倒だし。
テキストモードが存在する理由をあなたが書いてあげてください。
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 *** と出てしまいます、"{}"の括弧数は足りているはずです。 ご指導、お願い致します。
892 :
890-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; }
893 :
890-891 :2006/10/09(月) 04:07:10
これをプロンプトで表示させたいです ●ファイルは、通常、自分でエディタやその他の専用ソフトから作成したり、中を読んだ りコピーしたりできます。C言語では、ファイルを扱う関数が用意されているので、プロ グラムからでもファイルの中身を読んだりファイルを作成することができます。ファイル の中身を読み込むことをファイル入力、ファイルへデータを書き出すことをファイル出力 と言います。 ●ファイルは、通常、自分でエディタやその他の専用ソフトから作成したり、中を読んだ りコピーしたりできます。C言語では、ファイルを扱う関数が用意されているので、プロ グラムからでもファイルの中身を読んだりファイルを作成することができます。ファイル の中身を読み込むことをファイル入力、ファイルへデータを書き出すことをファイル出力 と言います。 でも、上のように表示されません、こう表示されるだけです。 C:\source>そのファイル名 だけの入力待ちになってしまいます。
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
コメントを全部消してみるとか。
897 :
890-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 の文章が表示されます。{}括弧をずらしたらエラーがでるんでしょうか?
>>892 //は行末までコメント。大事なものがコメントアウトされて内科医?
>>893 DOSプロンプトの使い方なら鼬害。
プログラミングの話なら具体的にどうぞ。
899 :
890-891 :2006/10/09(月) 04:17:41
お答え、ありがとうございます。
>>895 何故、そのようにしなければいけないんでしょうか?
強制終了と言うコメントを消して
if((fp = fopen("test.txt", "r")) == NULL)
{ printf("ファイルオープンエラー\n"); exit(1); }
とすれば宜しいんでしょうか?
900 :
890-891 :2006/10/09(月) 04:22:24
>>898 ????
と言うと、コメントが{}の中に入る場合は、
//強制終了する}
↓
//強制終了する
}
ようにずらせばいいのでしょうか?
>>896 コメント消して、こうしたら成功しました。
おまいはコメントの仕様わかってるのか そもそもCの仕様に//でのコメントは無かったような
902 :
890-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; } やはりコメントを消すか、{}ずをらすかしなければいけないようですね。
そもそもなんでそんな変態なコーディングスタイルなのかしらんが、 /* 強制終了する */ } これなら通るだろ。
904 :
890-891 :2006/10/09(月) 04:29:06
ありがとうございます、解決しました。。。
>>903
905 :
デフォルトの名無しさん :2006/10/09(月) 04:33:42
VS使ったほうがいいかも知れんね。
906 :
890-891 :2006/10/09(月) 04:43:08
>>905 違うコンバータの事でしょうか?
もう一つ質問ですが
"%c"とは文字Cの事ですよね?
夜分遅くお騒がせひて、すみません。
文字Cってなに?
908 :
デフォルトの名無しさん :2006/10/09(月) 04:49:50
909 :
890ー891 :2006/10/09(月) 04:50:44
cはchar c のcを指します
910 :
デフォルトの名無しさん :2006/10/09(月) 04:57:01
cを文字として表示する場合と数字として表示する場合では、 cの値が同じでも表示が変わるでしょう。 VSを使えば、実行中のcの値がエディタ上で見られるので、 そのあたりの理解が早いと思う。 先の書き込みを見る限り、今お使いのコンパイラはそれほど わかりやすいエラー内容を表示しないようですし、 VSを使ったほうがいいんじゃないかと思いました。
911 :
890ー891 :2006/10/09(月) 05:06:21
何から何まで、ありがとうございました。 是非、ぐぐってみます。
912 :
(^-^) ◆MONSOON/qo :2006/10/09(月) 05:38:20
今日始めてCのバリナリサーチが動かせたよ 始めて使ってみたけど
「パンはパンでも食べられないパンは?」 これは最も有名ななぞなぞの一つだ 答えの設定はご存知の通り「フライパン」 この答えをどうボケたら面白くなるのだろうか 普通に食べられないパンを言う 解:腐ったパン フライパンを間違えてみる 解:ナベ 別のパンと付くものにしてみる 解:パンツ 下ネタにしてみる 解:うんこパン 「食べられない」を間違える 解:フランスパン 「なぞなぞ」を「質問」と間違えてみる 解:コロネが苦手です すべて間違える 解:乳輪大納言
…大変言いにくいのだが誤爆だ すまない
「パンはパンでも食べられないフライパンは?」 これは最も有名ななぞなぞの一つだ 答えの設定はご存知の通り「フライパン」 この答えをどうボケたら面白くなるのだろうか
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型を間違えていました
>>915 この板的な反応を返す
解:スレ違いだボケ、氏ね
どうみても板違いです。 本当に(ry
*/
/*コメント開始
ここまで */
while(1)malloc(10);
924 :
デフォルトの名無しさん :2006/10/10(火) 07:36:39
2次元の問題を解くのに、2次元配列でうまく出来たのですが、 同じ問題を3次元で解くのに、3次元配列つかったら上手くいきません。 コンパイルはするのですが、プログラムが作動しません。 何かいい手はないですか?
925 :
デフォルトの名無しさん :2006/10/10(火) 07:39:59
整数の範囲で四則演算と剰余演算を行います。 簡易電卓プログラムを作成せよ。 というプログラムなんですが・・・ よろしくお願いします。
>>925 いえいえこちらこそよろしくお願いします^^
C言語でASP.NETを作るにはどうすれば良いの?
ぐーっと行ってこうがーっと。
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 ファイルオープンエラー とエラーをおこしてしまいます ディレクトリ内にエディッタがあるにもかかわらずです ソースに誤りがあるのでしょうか?是非、ご指導お願い致します
>>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を使うように。
> ディレクトリ内にエディッタがあるにもかかわらずです ??? 本当にファイルがあるか証明出来る?
935 :
932 :2006/10/11(水) 05:05:46
>>933 ありがとうございます。
微妙な変化にきづきませんでした。
やはり書き直しても、
ファイル名を入力して下さい > janken
ファイルオープンエラー
になってしまいます・・・
>>934 証明はできません、すみません
エラーって事は、やはりないんですかね?
>>935 エラーメッセージからみてBCCだと思うのでWindowsと思うが、
5-2.exeがあるディレクトリがカレントディレクトリになっているとして、
dir janken
で、ファイルがない旨表示されればファイルはそのディレクトリには無い。
937 :
デフォルトの名無しさん :2006/10/11(水) 05:16:10
開こうとしてるファイル名のファイルをエディタかなんかで開いたままにしてるんじゃね?
読み取りオープンも許さない排他制御しているエディタならその可能性があるね
939 :
デフォルトの名無しさん :2006/10/11(水) 05:20:43
>>936 BCCです。だとすると、もしかしたらそこにないのかも?しれません
もう一度、考えてみます
>>937 閉じています
黎明までつきあって頂き、ありがとうでした。
940 :
デフォルトの名無しさん :2006/10/11(水) 05:22:34
941 :
デフォルトの名無しさん :2006/10/11(水) 05:31:50
jankenのあとに.txtなどの拡張子がいるのでは?
942 :
デフォルトの名無しさん :2006/10/11(水) 05:33:19
以前実行したやつなので .c にはなっているんですがね…
janken.cならjanken.cって入れなきゃ
944 :
デフォルトの名無しさん :2006/10/11(水) 05:40:02
あーっ! 電源落としてしまったので、起きたらやってみます
>941も理解できないなら、鼬害だな。拡張子を調べてこい。
PC初心者に拡張子を教えるのは本当にむずかしい
bmpをjpgに変えただけで jpeg画像になったと思うやつもいるしな。。
>鼬害 これが読めない
初心者板行って再変換のやり方聞いて来い
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を足した数字を算出します。 これの意味が掴めないんです。
>>952 EOFは改行文字ではないので、EOFを改行文字と数えるかどうかで
結果が異なる。通常はファイル1もファイル2も2行。
955 :
(^-^) ◆MONSOON/qo :2006/10/12(木) 03:47:23
fgetcでNULLが返る?int型を返すんだぞ、NULLなんて返さない。 もしかしてNUL文字の事を言っているならお門違い。
957 :
デフォルトの名無しさん :2006/10/12(木) 03:50:09
>>954 通常なら数えなくてもいいみたいですね。
ありがとうございます。
>>>改行文字の数を数えて、それに1を足した数字を算出します。
これが、どう考えてもわかりません
>>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 と解釈しています。
俺の環境では
>>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が何をさしてるのかが
だからこれのことでしょ? >>>改行文字の数を数えて、それに1を足した数字を算出します。 信じられないならtotal自体の値をprintf(totalの値: %d\n,total);とでもして表示汁 で、その値が実際調べるファイルの行数より1少ないなら、少なくとも君の環境(&その本の著者の環境)では 正しい行数を表示するにはtotalに(つまり改行文字の数に)1足さなければならない証左になる
すまん寝ぼけてた…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
>>>改行文字の数を数えて についてはわかりますた、インクリメントの++ と整理が ついたみたいです
何故、改行文字で終わってないなら 1を足さなければならないか と言う理由が難しい、自分が一番わからないのはそこだと思いました とにかく混乱してるみたいなので、書いてもらった事を参考に 改めて考えたいと思います、スレを占領して申し訳ないです。
void hello(void) ってhelloっていう新しい関数使って こんにちは。って表示して改行したいんだが できん・・・ void なんちゃら(int no) とか int なちゃら(void) はできるんだが 両方voidになるとわからん・・・;;; さらに新しい関数を作ったほうがいいのかなぁ・・・ たすけてくれー
>>970 #include <stdio.h>
void hello(void)
{
printf(" ヘ_ヘ\n");
printf("ミ・・ ミ\n");
printf("( )〜\n");
}
int main(void)
{
hello();
}
mainのreturn文がなくてもgccだとデフォルトで警告がでないな…
973 :
(^-^) ◆MONSOON/qo :2006/10/12(木) 06:33:42
mainのリータンは標準では入れない方がいいですよ 終端までいくと自動で終了しますから プログラムの途中で終了するときは入れてみてください
できた・・・hello()で関数が使えるんだな。 ってかそうだよな 無駄にprintfとかつかってしまった・・・ ありがとう。
intを返す宣言しているのに何も返さない書き方になってるんだから本当は警告すべき 終端で自動で終了することと返り値なしであるように書いてもmainでは警告しないこととは別の話
main()のreturn文を省略できるのはC++だけだっけ?
>>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を入れない方がいい
void mainなんて考えなくていいですから。
なんだ? また糞コテが意味不明なことでも言ってるのか?
>>970 void型のものは「関数」とは呼ばない。
といすると何ていうのがいいの? てか、そうだとすると関数って何ナノ?
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 は肉蝿
規格を持ち出す以前に例のクソコテは肉蝿。 しかし肉蝿ってなんて読むんだ。ニクフライ?
//イタチガイかよ。。
voidなんて使ってるのはアフォ。 basicでも使ってろクズ。
ぽかーん
ちんちん
>>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
ぐふぉー
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になるからでしょうか?
正直なところファイル1と2の違いがわからん。 ファイル2のみ終端文字が入ってるなら、それを1行と数えて 3になるのは正しい動作に思えるが、納得いかんかね。
995 :
デフォルトの名無しさん :2006/10/13(金) 03:56:57
>>994 >>954 をみると改行文字ではなみたいなので
先ほどから出ている環境設定の違いの +1 を
使うのかと思いました。
では、EOFを改行文字として1文字文と数えるのでしょうか?
EOFは終端文字で、改行文字ではないと思う。
改行文字が無くても、行に1文字でもあれば、それは1行として数えていいだろう。 aaa(改行文字) bbbb(改行文字) ぬるぽ(改行文字なしで終端) これは3行だべ? 終端文字しかない行をカウントしたくないなら、それはそれでちゃんと処理してやる必要がある。 が、それだけの問題だと思われ。
(1) 一行目\r\n \x1A[EOF] (2) 一行目\r\n [EOF] (3) 一行目[EOF] まあWindowsでテキストモードで扱うなら、これだけ種類がある罠
>>997 それはfgets()でうまく処理できるべ。
1000 :
デフォルトの名無しさん :2006/10/13(金) 04:25:00
皆さん、ありがとうございます。
>>997 では、最後に行がなくてもカウントしてもいいのですね
では
>>993 で述べた、
>>何故、自分の環境だとtotatに(つまり改行文字の数に)1足さなければならないのでしょうか?
で、何故自分の環境だと1を足さなければならないのかが
他の参考書などを調べましたが解決しません・・・・
理由は改行文字で終わってないなら 1を足さなければならないからですかね?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。