C言語なら俺に聞け(入門篇) Part 11
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/04/17(火) 18:01:23・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 10
http://pc11.2ch.net/test/read.cgi/tech/1174290325/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 http://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 http://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 http://pc11.2ch.net/test/read.cgi/tech/1173284217/
関連スレ
C/C++の宿題を片付けます 85代目
http://pc11.2ch.net/test/read.cgi/tech/1175129517/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
【初心者歓迎】C/C++室 Ver.36【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1175436073/
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0153137
2007/04/21(土) 03:24:44ありがとうございます。変数headはポインタですが、
この場合addUser関数に対して参照渡しとならないのでしょうか?
0154デフォルトの名無しさん
2007/04/21(土) 03:38:040155デフォルトの名無しさん
2007/04/21(土) 03:39:43入力関数も分けておこうや。
0156137
2007/04/21(土) 03:45:51参照渡しまでも勘違いしているかも…。
headにはアドレスが渡り、そのアドレスが
NULLから別のアドレスに変わると思っていました。
値渡し…よく分からなくなってきました。
0157デフォルトの名無しさん
2007/04/21(土) 04:05:45すっきりどころか無駄に長くなったように見える
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3847.txt
0158デフォルトの名無しさん
2007/04/21(土) 04:11:25ただし
else if (d == 0.0) /* 判別式D=0 */
と
else if (pSolutions->d == 0.0) /* 判別式D=0 */
はいただけない。とは思うものの宿題レベルだからこれでいいのかな…。
0159デフォルトの名無しさん
2007/04/21(土) 05:02:44先ずは>152で指摘されたことをやってみよう。
0160デフォルトの名無しさん
2007/04/21(土) 07:12:34>いんや、元のよりはずっとわかりやすいよ。
だから「ように見える」と言ったわけで。
「無駄に長い」という言葉から察するに
おそらく>>150の期待していたすっきり感には当てはまらないだろうが、
可読性はそういう初心者の主観的直観的なものとは別のところにあるということを匂わせたつもり。
0161デフォルトの名無しさん
2007/04/21(土) 15:52:00currentの直前のリストのnextにNULLが入ってくれません。(�@の処理)
どうすればNULLを入れられるでしょうか?
void deleteAllList(LIST *node)
{
LIST *current;
current = node;
if(current != NULL){
deleteAllList(current->next);
free(current->name);
free(current->specialty);
free(current);
current = NULL; … �@
} else{
return;
}
}
0162デフォルトの名無しさん
2007/04/21(土) 16:04:41えーと
void foo(int bar) {bar = 1;}
があったときに
int baz = 10;
foo(baz);
printf("%d", baz); // 10が出る
のと同じ理由でそれでは直前のnextにNULLは入りません。
多分、deleteAllList(baka->next);って呼んでるんだよね。
LIST型が双方向リストじゃない限りその関数の中から直前の
ポインタを求めることはできないから(始点を別に持ってたら別だけど)、
ひとつまえのポインタを渡すようにしてやればいいんじゃないかな。
0163デフォルトの名無しさん
2007/04/21(土) 16:10:49current = nodeとなっているのをcurrent = node->next;に書き換え、
current = NULL;とやっているところを、node->next = NULL;
に書き換えればいい。
もちろんdeleteAllListを呼んでいるところは全部ひとつ前のポインタを
渡すように書き換える必要がある。deleteAllList(baka->next);とやっていたとしたら、
deleteAllList(baka);のように。
0164デフォルトの名無しさん
2007/04/21(土) 20:17:49このc言語のプログラムを動かしたいのですが、うまく動きません。
プログラミングは初めてで、あまり詳しく分からないです・・・。
pastとnowとfutureとdvとvfという小数の変数を使ってfutureを求めたいです。
コンパイルしようとすると変数のtypeが違うかconflictingがどうとかでます。あと、main関数の返り値がint型でないと
言われるのですが・・・。 どう改善したらうまくいくのか教えて頂ければうれしいです。
よろしくお願いします
#include <stdio.h>
float past,now,future,dt,vf;
vf=1;
dt=0.01;
now=vf*dt-1;
past=-1;
float verlet(void)
{
2*now-past-4*now*(now*now-1)*dt*dt;};
float main(void)
{
printf("past=%f,now=%f",past,now);
future=verlet(void);
printf("future=%f",future);
}
0165デフォルトの名無しさん
2007/04/21(土) 20:20:20>コンパイルしようとすると変数のtypeが違うかconflictingがどうとかでます
せっかくコンパイラが親切に、エラー内容を教えてくれてるのに
無視しないで具体的に書いてよ
0166デフォルトの名無しさん
2007/04/21(土) 20:26:33ついでに言うと、どう直せばいいのか以前に無茶苦茶すぎる
おとなしく基本から順にやった方がいいよ
・main の戻り値を float じゃなくて int にする
・verlet の定義の最後の } の後の ; はいらない
・verlet に return がない
・以下の部分は main の中に移動
>vf=1;
>dt=0.01;
>now=vf*dt-1;
>past=-1;
などなど
0167デフォルトの名無しさん
2007/04/21(土) 20:44:04とりあえず数時間まともに入門サイトでも読んできたら?
0168デフォルトの名無しさん
2007/04/21(土) 22:07:48指摘の通り、前のリストのnextを持たせてやる事で
NULLを入れてやることができました。
ありがとうございました。
0169デフォルトの名無しさん
2007/04/21(土) 22:31:54これは釣りか?釣りなのか?
マジなら、まず人のソースを読め。
#include <stdio.h>
float past, now, future, dt, vf;
float varlet(void)
{
return 2.0f*now-past-4.0f*now*(now*now-1.0f)*dt*dt; /* 戻り値がvoid以外ならreturn書け!*/
}
int main(void) /* mainは、今のうちは呪文のように←のように書け */
{
vf = 1.0f; /* 代入と計算は関数の中でしろ。少なくとも今のうちは */
dt = 0.01f;
now = vf * dt - 1.0f; /* vf * dt - 1; でも悪くも無いが、今のうちは型を統一しとけ! */
past = -1.0f; /* これも! */
printf("past=%f,now=%f\n",past, now); /* \nは要らないけど次の文字列とくっついちゃうだろ */
future = verlet();
printf("future=%f",future);
return 0; /* 今のうちは付けとけ */
}
0170デフォルトの名無しさん
2007/04/21(土) 22:35:25元はといえば、甘やかして育てた母が悪いのです。
でも、立派な社会人で幸せな家庭を築いていますので、許してやってください。
0171デフォルトの名無しさん
2007/04/21(土) 22:35:55浮動小数点数は常にdoubleを使っておけばよいと思う。
0172デフォルトの名無しさん
2007/04/22(日) 00:02:110173デフォルトの名無しさん
2007/04/22(日) 00:03:350175デフォルトの名無しさん
2007/04/22(日) 00:28:46a.txt
**A**
**B**
**C**
・
・
・
-------------------
b.txt
A
B
C
・
・
・
-------------------
b.txtのAをa.txtのAに挿入
b.txtのBをa.txtのBに挿入
b.txtのCをa.txtのcに挿入
するプログラムのソース作れる方いますか?
0176かなり初心者
2007/04/22(日) 00:35:00void moji (int);int heikin(int,int);
int main(int argc, char *argv[])
{ int kazu;
int x,y;
while(1){ printf("値1を入力:");
scanf("%d",&x);moji(x);
if (x<0){break;}
printf("値2を入力:");
scanf("%d",&y);moji(y);
kazu=heikin(x,y);
printf("平均%d\n",kazu);
moji(kazu);}
system("PAUSE");
return 0;}
int heikin(int a,int b){
int hei;
hei=(a+b)/2;
return hei; }
void moji (int a){
if (a>=60){
printf("合格%d\n",a);
}else{
printf("不合格%d\n",a);
}}
このプログラムで終了時「不合格−1」と表示されないようにしたいです。
どなたか教えてください。
0177デフォルトの名無しさん
2007/04/22(日) 00:53:08と
>if (x<0){break;}
を入れ替えたらいいんじゃね?
0178164
2007/04/22(日) 02:01:56ありがとうございます。ホンマすいません。今大学4回生で研究室配属になって
同級生たちは皆プログラムできるから基礎の説明とばされて、課題だされてちょっと勉強してやってみたんですが
こんなアリサマでした・・・。提出火曜で(出題は金曜)土日は研究室にだれもいなくてきけなくて困ってたのです。。。
returnの使い方がいまいち分からないのですがあとは分かった気がします。returnは数学でいうところの
f(x)=の部分ってことで、プログラムの関数のカッコの中が数学でいうところの関数の中身って感じでいいんですかね。。。
0179デフォルトの名無しさん
2007/04/22(日) 02:04:420180デフォルトの名無しさん
2007/04/22(日) 02:23:070181デフォルトの名無しさん
2007/04/22(日) 02:24:590182デフォルトの名無しさん
2007/04/22(日) 02:34:320183デフォルトの名無しさん
2007/04/22(日) 03:06:53このようになる理由がわからない。教えてください。
0184デフォルトの名無しさん
2007/04/22(日) 03:14:230185デフォルトの名無しさん
2007/04/22(日) 03:38:142^31=2147483648
2^32(値の上限は2^32-1)を2進数で表して、先頭の32桁目を1か0で符号として扱い
+-で半分に分けて使っていることに関して理解していりゃ、あとは
>>184 の理屈で16進数に置き換えて -2^31 が 80000000
FFFFFFFF が-1というのが分かれば良いかと。
0186デフォルトの名無しさん
2007/04/22(日) 03:49:573×3のマスでたとえば
111
1□□□
1□□□
1□□□
となっていればこれの条件を満たすのは
111
1■□□
1□■□
1□□■
111
1□□■
1□■□
1■□□
となりますがこのように縦横彫るマスの数だけを与えて
それを満たすすべてのパターンを出力ってできますか
0187デフォルトの名無しさん
2007/04/22(日) 03:55:14ピクロスではありません。
0188デフォルトの名無しさん
2007/04/22(日) 04:14:28その横軸と縦軸に並んでいる数字も変化するんだよな?
0189デフォルトの名無しさん
2007/04/22(日) 05:40:190190デフォルトの名無しさん
2007/04/22(日) 07:46:58ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3851.c
なんか上手いやり方ないんかな。
0192デフォルトの名無しさん
2007/04/22(日) 18:01:32int func(void){
static int a=0;
return ++a;
}
main(){
int b,i;
for(i=0;i<3;++i)
b=func();
printf("%d",b);
}
何故これの結果が3になるのかがわからりません。
2回目,3回目のfunc関数呼び出しでは、static変数になっててもa=0になるから
returnはずっと1だと思ったんですが違うようで・・お願いします
0193デフォルトの名無しさん
2007/04/22(日) 18:02:58static int a=0;は一度しか初期化されない
2回目以降は前回の値を保持している
0194デフォルトの名無しさん
2007/04/22(日) 18:04:33一度しか初期化されないんですか。謎が解けました!。ありがとうございました
0195デフォルトの名無しさん
2007/04/22(日) 18:38:01static変数とグローバル変数だけだぞ。
int func(void){
int a=0;
return ++a;
}
だと、関数が呼び出される度にa=0で初期化されるからな。念のため
0196デフォルトの名無しさん
2007/04/22(日) 18:48:25了解しました。auto変数は毎回初期化されるんですね
0197デフォルトの名無しさん
2007/04/22(日) 19:16:370198デフォルトの名無しさん
2007/04/22(日) 20:17:42思うと分かりやすいかな。
その関数専用で外部に見せる必要がない管理データを持つのに使ったりする。
0199かなり初心者(176)
2007/04/22(日) 22:35:34しかし、どうして入れ替えただけでいいんでしょう?
まったく基礎ができてないやつです。
0200デフォルトの名無しさん
2007/04/22(日) 22:54:06プログラムは基本、上から順に実行されるんだから
上から順に追っていってみなよ
0201199
2007/04/22(日) 23:12:41int mainの中に入れないといけないプログラムと
{}の外に書くプログラムの違いってなんですか?
参考書見てまんま書き写しているだけなんで、教えてください。
0202デフォルトの名無しさん
2007/04/22(日) 23:26:29別の関数に書き出してそれをmain関数から呼び出すことで特定の処理をmain関数から追い出す
後で再利用することもできるので何度も書く手間も省ける
0203デフォルトの名無しさん
2007/04/22(日) 23:50:21教えようにも、君に分かるように教えるのはたぶん無理
足し算引き算すら知らない幼稚園児に、高校数学の微積を教えることが出来るか?
そーいうことだ
0204デフォルトの名無しさん
2007/04/23(月) 00:41:38うちじゃへぼSEのせいで1プロジェクトが終わっても再利用できるものは何もないという有様w
0205デフォルトの名無しさん
2007/04/23(月) 01:35:16>int mainの中に入れないといけないプログラムと
>{}の外に書くプログラムの違いってなんですか?
main関数とは限らないけどソースに直接書くのは
宣言か関数定義だけ。
関数の外に文を書くことはできない。
行頭が#で始まる。プリプロセッサ命令はC言語の文法とは全く別。
0206デフォルトの名無しさん
2007/04/23(月) 02:40:400207デフォルトの名無しさん
2007/04/23(月) 02:51:19って一斉につっこみが入るくらい長文かつややこしい説明になるんじゃないかなあ…
0208デフォルトの名無しさん
2007/04/23(月) 06:02:230209デフォルトの名無しさん
2007/04/23(月) 12:28:03一部を抜粋してるだけなんじゃないかな
それをmainの外だと勘違いしてるのだと思う
0210デフォルトの名無しさん
2007/04/23(月) 12:59:34戻り値がint*型の関数は
*を付ければ代入式の左辺にしてもいいですか?
struct p{
a[10];
b[10];
};
int *f(struct p *x, int i){
if(i<10){
return x->a[i];
}else{
return x->b[i-10];
}
}
int main(void){
int i;
struct p *x;
for(i=0;i<20;i++){
*f(i)=i;
}
return 0;
}
0211210
2007/04/23(月) 13:00:390212デフォルトの名無しさん
2007/04/23(月) 13:03:29らめぇ
0213デフォルトの名無しさん
2007/04/23(月) 13:30:41一概には言えない。そのコードの場合は、それ以前の段階でダメ。
0214デフォルトの名無しさん
2007/04/23(月) 14:43:140215デフォルトの名無しさん
2007/04/23(月) 15:24:23今、専門学校でデータベースやXMLやっててCやったせいか理解しやすい
皆、ちんぷんかんぷだ。俺はすんなり入る。
オマイ等、サンクス!オマイ等に光あれ!
0216デフォルトの名無しさん
2007/04/23(月) 15:38:260217デフォルトの名無しさん
2007/04/23(月) 16:10:44それはお前が頑張った証拠だ
感謝するなら自分のやる気に感謝しとけw
0218デフォルトの名無しさん
2007/04/23(月) 17:07:01このプログラムを起動して最初に58を入力したらいきなり画面が黒くなってオーバーなんとか
って表示されてPCがうんとも寸ともいわなくなって強制終了したんですが
そうなった原因は何かわかりますか?
#include <stdio.h>
void sa(int *ko);
int main(void)
{
int i,te[10];
for(i=0;te[i]!=-1;i++){
printf("数字を入力(100以内)\n");
scanf("%d",&te[i]);
while(te[i]>100){
printf("やり直し\n");
scanf("%d",&te[i]);}}
sa(te);
return 0;
}
void sa(int *ko)
{
int i=0;
while(ko[i]!=-1){
printf("%d\n",ko[i]);
i++;}}
0219デフォルトの名無しさん
2007/04/23(月) 17:17:08色々と突っ込みどころだらけで恐らくは期待した通りには動かないだろうとは思うけど、
いきなり画面が黒くなったりうんともすんとも言わなくなるとは思えないな。
0220デフォルトの名無しさん
2007/04/23(月) 17:17:170221デフォルトの名無しさん
2007/04/23(月) 17:21:31scanf の落とし穴に引っかかっても
画面が(ry になるような感じじゃないものな
0222デフォルトの名無しさん
2007/04/23(月) 17:34:440223デフォルトの名無しさん
2007/04/23(月) 17:37:49# 不正アクセスはあるけど
0224デフォルトの名無しさん
2007/04/23(月) 17:38:280225デフォルトの名無しさん
2007/04/23(月) 17:44:050226デフォルトの名無しさん
2007/04/23(月) 18:10:40それがスタートアップルーチン用の何かの情報を壊して
その影響で再帰呼び出しか巨大なスタック領域の確保が
行われたりとか?
0227デフォルトの名無しさん
2007/04/23(月) 18:32:52if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) > 0)
の文の場合、socket(PF_INET, SOCK_STREAM, 0)が評価され、
次にsockfd = socket()の代入文が評価されるのは理解しています。
その次にif((代入文) > 0)の評価なのですが、どのように評価されるのでしょうか?
代入文で代入された値と0が評価されるのでしょうか?
また別の質問なのですが、
if((int_a = funcA()) > (int_b = funcB()))
の文は何から評価されるのでしょうか?
funcAかfuncBのどちらが先に評価されるのでしょうか?
0228デフォルトの名無しさん
2007/04/23(月) 18:33:060229デフォルトの名無しさん
2007/04/23(月) 18:37:27socket() の戻り値が0を超えるかという評価
0230デフォルトの名無しさん
2007/04/23(月) 18:40:02http://www.kouno.jp/home/c_faq/c3.html
0231210
2007/04/23(月) 18:46:58慌てて見直さずカキコしちゃいました(汗
mallocを書き忘れましたけど、
*をつけて左辺に置いてはいけない例を
お願いします
0232210
2007/04/23(月) 18:50:370233デフォルトの名無しさん
2007/04/23(月) 18:52:12何を知りたいのかよく判らんから、具体的な質問にしてくれ。
0234デフォルトの名無しさん
2007/04/23(月) 19:23:12この数字の意味が分からないのです。いやなんとなく分かるんですが、バシっと分かりません。
しかも[]の中の数字なんて無くても良いと思うのですが。
どんな時に使うのですか?
すいません、基本的なことで。
お願いします。
0235232
2007/04/23(月) 19:24:18>>213さんに、一概には言えない、と言われたから、どんなときに
戻り値がint*型の関数を代入式の左辺に
*をつけて使ってはいけないのか
教えてください(--;)
0236デフォルトの名無しさん
2007/04/23(月) 19:25:410237デフォルトの名無しさん
2007/04/23(月) 19:30:00確保する領域の大きさを自分で決めたいときにつかいますよー
scanfで文字列を読み込んだり
文字列をstrcatで繋げたり
sprintfで文字列を作るときに
領域が用意されてないと大変になります(--;)
0238デフォルトの名無しさん
2007/04/23(月) 19:31:48char を20個確保
int a[15] なら int を15個確保
0239デフォルトの名無しさん
2007/04/23(月) 19:37:30宣言するときに
char a[]="text";
のように初期化する文字列があれば
括弧のなかには数字は無くても
文字数+1の領域が用意されます。
char a[];
だけだと領域の大きさが分からないからダメです。
関数の引数で
char a[]
と書かれてるときはポインタとして扱われて
char *a
となります。
多分こんなかんじだと思う(--;)
0240デフォルトの名無しさん
2007/04/23(月) 19:37:59関数がNULLを返すとき。
関数が無効なポインタを返すとき。
変更不能なオブジェクトを指しているポインタを返すとき。
0241227
2007/04/23(月) 19:41:51参考になるページを貼っていただいて助かりました。
なんとか理解できそうです。
0242デフォルトの名無しさん
2007/04/23(月) 19:43:29条件分岐文ってのが何を意味してるのか今ひとつわからんが、
一般的には左から右に評価されるわけじゃないぞ
0243デフォルトの名無しさん
2007/04/23(月) 19:44:24ありがとうございます!
バッチリ理解できました。
調べても答えが見つからなくて困ってました。
本当に助かりました。ありがとうございます。
これで先に進めます♪
0244デフォルトの名無しさん
2007/04/23(月) 19:45:25char a[16]="0123456789abcdef";
printf("%1s\n",a[i])
みたいに文字数ぴったりで宣言することもある
(--;)と思う
0245235
2007/04/23(月) 19:49:56つまり普通にポインタを扱うときと同じ注意をすればいいんですね。(--;)
あと関数内の静的じゃない変数のポインタもダメですね
ありがとうございました
0246デフォルトの名無しさん
2007/04/23(月) 19:50:42ここの一番下14-5を見るといい
http://www9.plala.or.jp/sgwr-t/c/sec14.html
0247デフォルトの名無しさん
2007/04/23(月) 19:53:03演算子の優先順位とオペランドの評価順序は別物
0248デフォルトの名無しさん
2007/04/23(月) 19:53:570249デフォルトの名無しさん
2007/04/23(月) 19:57:05質問者はオペランドの評価順は聞いていないと思うけど
質問の内容からも ( )、=、>、< の評価順位を聞いていると思うんだけど違うの?
0250デフォルトの名無しさん
2007/04/23(月) 19:59:570251デフォルトの名無しさん
2007/04/23(月) 20:02:25お前さん、評価順序と優先順位を混同してるんじゃない?
0252デフォルトの名無しさん
2007/04/23(月) 20:06:40ごめん funcAかfuncBかだったね
逝ってきます
■ このスレッドは過去ログ倉庫に格納されています