質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

1786閲覧

C言語 ポインタ渡し 関数呼び出し

uv-

総合スコア26

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2016/12/16 00:27

解決していないのに、間違って解決済みにしてしまったので、もう一度質問させていただきます。

C言語初学者です。時間、分、秒を入力として、秒に換算し、換算結果を出力とする関数を作成せよ。入力の分と秒は共に0~60とはさそれ以外が入力された場合はエラーとして戻り値を-1で返す。正常終了の場合は戻り値を0とする。この関数を確認するためのmain関数も作成すること。。(scanfで読み込んで確認)
必ずポインタを使用

全く分からず、参考書を見ようみまねで下のように書きました。もちろん間違っています。ご指摘お願いします。

include <stdio.h>

define OK 0

define NG 1

int func(int h,int m,int s)
int main(void)
{

int a,b,c,d;
a=0;

printf("time,minute,second");
scanf("%d,%d,%d",b,c,d);
if func(b,c,d)==0
printf("%d秒\n",*byo);
else printf("error");
return 0;
}

int func(int h,int m,int s )
{
int byo
if(m>=0&&m<=60&&s>0&&s<=60){
return OK;
byo=h3600+m
60+s;
}
else{ return NG;}
}

見よう見まねで書いたので、

define OK 0

define NG 1

がどういうことなのかわかりません。
また、関数の返値は今まで習ったのだと、
int func(int x,inty)
{
int z;
z=x+y;
return(z);}

と、zが返値なのに対して、今回は0や-1で返すというのがわからないです。

この質問に関してご返答をいただき、まだわからないので、質問させていただきます。【】内はご指摘内容

【NGのデファイン値が違ってます】…-1にせよ、ということでしょうか。もしそうならやはり

「関数の返値は今まで習ったのだと、
int func(int x,inty)
{
int z;
z=x+y;
return(z);}

と、zが返値なのに対して、今回は0や-1で返すというのがわからないです。

【return文を実行したところで、関数の処理は抜けてしまいますので…(まずはここは直しましょう)。 】

なぜ抜けてしまうのですか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

#defineがわからないなど、変数を理解していないなど、基礎ができていなさすぎです。
基礎ができていないのに、教科書を丸写ししても深みにはまるだけです。
まずは基礎をしっかり勉強しましょう。

少しだけ苦言を言いますと、#defineなんかは検索すればその意味はすぐにわかるはずです。
まずは自分で調べましょう。
調べることで力もつきますし、新たな発見もあります。

投稿2016/12/16 01:31

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uv-

2016/12/16 07:20

きっぱりおしゃってくれて、ありがたい限りです。 調べ方を工夫しようと思います。
guest

0

まず、最低限コンパイルできる状態にして下さい(#define#や中括弧、ifの条件を包むカッコなどが不足しています)。コードは```だけの行で囲むときれいに表示できます。

さて、まず#define OK 0ですが、これは「ソースコードにOKという単語(トークン)が出てきたら0に置き換える」、という意味です。0や1だけ書くとマジックナンバーと呼ばれるように、何を意味しているのかわからなくなるので(特に、大規模なプログラムや、ライブラリなどで別な人が作ったプログラムを使う場合)、OKのように意味を持った文字列で書くことで、コードを理解しやすくできます。

今回は0や-1で返すというのがわからないです。

この関数はint func(略)となっているので、「int型の値」なら何を返しても構いません。もちろん、既存の変数を返してもいいですし、087といったリテラルの数値でも、a * b / 2のような、結果がintになる数式でも構いません。

なぜ抜けてしまうのですか。

return文は、関数を抜けるための命令です。C言語を使う以上は、「そういうもの」と理解して進める他ありません。

全般に思うことですが、何かしらの教科書を通読してみましょう。思い込みや誤解で基礎ができてしまうと、知らないこと以上に面倒となってしまいます。

投稿2016/12/16 00:46

maisumakun

総合スコア145123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uv-

2016/12/16 07:18

丁寧なご解答ありがとうございます。 調べ方が悪く、参考書をみても理解できないことが多いのですが、良く分かりました。 ありがとうございます。
guest

0

ベストアンサー

参考プログラムですが

c

1#include <stdio.h> 2#define OK 0 3#define NG 1 4 5int func(int h,int m,int s, int *a); 6int main(void) 7{ 8 int a,b,c,d; 9 a=0; 10 printf("time,minute,second\n"); 11 scanf("%d,%d,%d",&b,&c,&d); 12 if ( func(b,c,d,&a)==0 ) 13 printf("%d秒\n",a); 14 else printf("error"); 15 return 0; 16} 17 18int func(int h,int m,int s, int *byo) 19{ 20 if(m>=0&&m<=60&&s>=0&&s<=60){ 21 *byo=h*3600+m*60+s; 22 return OK; 23 } 24 else{ return NG; } 25}

投稿2016/12/16 01:42

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uv-

2016/12/16 08:00

丁寧な解答ありがとうございます。 自分で書いたものを元に書いていただき、比較しやすくて助かります。 分からないことがあるので、再び質問させていただきます。 最初に関数を宣言したら、呼び出される関数も同じ変数を使うものと考えていたのですが、異なっています。どうして良いのですか。 int func(int h,int m,int s, int *a); int func(int h,int m,int s, int *byo) の*aと*byoが異なるのが不思議だと言いたいです。
A.Ichi

2016/12/19 22:44

お答えが遅れましてすみません。*aでも構いません。funcのみを見た場合、分かり易いオリジナルの秒に名前を合わせました。
A.Ichi

2016/12/19 22:59

名前は異なっても構いません。タイプが一緒であれば、できれば同じ方が疑問がなくて良かったですね。 極端な定義 int func(int ,int ,int , int *); 
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問