関数の分割ファイルです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
gyao

関数の分割ファイルです

#1

投稿記事 by gyao » 9年前

こんにちは
C言語初心者で教科書を見ながら作ったのですが
手詰まりになってしまいました。
よろしくお願いします。

コード:

static int factorial(int);

void main() {
  int n;
  for (n = 1; n <= 10; n++ ) {
    printf( "%2d! = %7d\n", n, factorial(n));
  }
}

static int factorial(int n){
  int r;
  if (n <= 1) r = 1;
  else r = n*factorial(n-1);
  return r;
}
このプログラムをファイル分割するのですが
試行錯誤の結果、このようになりました。

f.hファイル

コード:

extern int f11(int);
f.cppファイル

コード:

int factorial(int);
int f11(int x){
  int r;
  if (x <= 1) r = 1;
  else r = x*factorial(x-1);
  return r;
}
mainファイル

コード:

#include<stdio.h>
#include"f.h"
void main(){
	int n;
	for (n = 1; n <= 10; n++ ) {
	printf( "%2d! = %7d\n", n, f11(n));
	}
}
どなたか、よろしくお願いします。

初級者
記事: 200
登録日時: 9年前

Re: 関数の分割ファイルです

#2

投稿記事 by 初級者 » 9年前

試行錯誤の結果、「現在どういう問題が発生しているのか」を書いてほしいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 関数の分割ファイルです

#3

投稿記事 by softya(ソフト屋) » 9年前

codeタグを利用してくださいね。 付けておきました。

factorial関数を別ファイルに分けるだけでよいので、f11関数が出てくる必要はありません。
もしかして再帰呼び出しを理解されていないのではないですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

gyao

Re: 関数の分割ファイルです

#4

投稿記事 by gyao » 9年前

使い方わからなかったのですいません.。
ビルドをすると「外部参照1が未解決です」と出てしまいます。
f.cppファイルとmainファイルをいろいろ変えてみたのですが上手くいきません。
基礎が出来てないと思うのですが教科書で
足し算や引き算などはファイル分割出来るのですが
階乗の計算はどのようにすればよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 関数の分割ファイルです

#5

投稿記事 by softya(ソフト屋) » 9年前

factorialにおいての関数の再帰呼び出しがどう行われているか把握していれば、これは起きない問題ですね。
どうでしょうか?再帰呼び出しって説明できますか?

[追記]
教科書と言うがどういうものか分からないので、どういう順番でC言語を学ばれたかが分かりませんが関数については学ばれたんですよね?
※ このサイトに来ている人は大半教科書で学んでいない(サイトやC言語の入門書籍)と思われるので、教科書と言われてもピンと来ないひとが多いかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

gyao

Re: 関数の分割ファイルです

#6

投稿記事 by gyao » 9年前

ある関数の中から関数を呼び出すということなのですが
それがf11なのかという…。
f11の関数を作って呼び出すのかなと思ってます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 関数の分割ファイルです

#7

投稿記事 by softya(ソフト屋) » 9年前

関数から関数の自分自身を呼び出すのが再帰呼び出しです。
元のコードは再帰呼び出しとして記述されていますが、ご自身でファイル分割した段階のソースコードでは本来の意味が失われています。

[追記]f11と言う名前の関数が登場すると再帰呼び出しとして破綻するという意味です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 9年前

Re: 関数の分割ファイルです

#8

投稿記事 by non » 9年前

よろしければ、ファイル分割をしている理由も、教えてください。
教科書に載っているのもめずらしいと思いまして。
non

box
記事: 1751
登録日時: 9年前

Re: 関数の分割ファイルです

#9

投稿記事 by box » 9年前

単純に、こうするだけでいいんじゃないでしょうか。

コード:

void main() {
  int n;
  for (n = 1; n <= 10; n++ ) {
    printf( "%2d! = %7d\n", n, factorial(n));
  }
}
----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 ----- >8 -----

コード:

int factorial(int n){
  int r;
  if (n <= 1) r = 1;
  else r = n*factorial(n-1);
  return r;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

gyao

Re: 関数の分割ファイルです

#10

投稿記事 by gyao » 9年前

boxさんありがとうございます。
出来ました。

ファイル分割の例題をやって
今回の宿題がでたのですが
例題は

f.cppファイル

コード:

int f11(int x, int y ) {
  return x+y;
}

int f22(int x, int y ) {
  return x-y;
}
f.hファイル

コード:

extern int f11(int, int);
extern int f22(int, int);
mainファイル

コード:

include<stdio.h>
#include "f.h"
void main() {
  int a, b;
  a = 7;
  b = 3;
  printf("f11(%d, %d)=%d\n", a, b, f11(a,b));
  printf("f22(%d, %d)=%d\n", a, b, f22(a,b));
}
です。
例題ではf.cppファイルとmainファイルの変数が違うのと
定義された関数factorialは使わないでf11みたいな関数を
自分で作らなくてはいけないのかと思ってました。
今でもプログラムは動きましたがちょっとよくわかりません。

基礎の基礎だと思うんですけど、授業が教科書のレベル超えてて苦戦してます。

non
記事: 1097
登録日時: 9年前

Re: 関数の分割ファイルです

#11

投稿記事 by non » 9年前

授業の課題でしたか。

一番最初のプログラムで
>static int factorial(int);
staticがついてますが、これについては、どのような説明を受けましたか。?
参考までに教えてください。
non

gyao

Re: 関数の分割ファイルです

#12

投稿記事 by gyao » 9年前

static変数はプログラムの開始時に静的記憶域ひ確保されて
ファイル内だけに限定される、と思います。
外部からみられると書き換えられる可能性があるから危険とか…記憶寿命が…
すいません、ちょっとあやふやです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 関数の分割ファイルです

#13

投稿記事 by softya(ソフト屋) » 9年前

とりあえず答えが分かっても理解しないと意味が無いと思うので再帰呼び出しは理解しておいてください。
それとファイル分割は関数化をちゃんと理解して、externやらリンカの働きを理解する必要があります。
分からないところがあったら聞いてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 9年前

Re: 関数の分割ファイルです

#14

投稿記事 by non » 9年前

staticの理解は私もその程度です。なぜ、最初のプログラムは単一ファイルなのにstaticがついているのかと
思ったので、質問させていただきました。
non

box
記事: 1751
登録日時: 9年前

Re: 関数の分割ファイルです

#15

投稿記事 by box » 9年前

gyao さんが書きました:static変数
えっと、最初に投稿されたコードでのfactorial関数のことを書かれたんだと思いますが、
変数ではなくて関数ですよね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
あたっしゅ
記事: 334
登録日時: 10年前
住所: 東京23区
連絡を取る:

Re: 関数の分割ファイルです

#16

投稿記事 by あたっしゅ » 9年前

gyao さんが書きました:static変数はプログラムの開始時に静的記憶域ひ確保されて
ファイル内だけに限定される、と思います。
外部からみられると書き換えられる可能性があるから危険とか…記憶寿命が…
すいません、ちょっとあやふやです。
「変数」と「関数」の区別がついていますか ? 「static変数」と「static関数」は、違いますよ。
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

gyao

Re: 関数の分割ファイルです

#17

投稿記事 by gyao » 9年前

softyaさん、nonさん、boxさん、あたっしゅさん
ありがとうございます。

プログラム何度も書いて覚えます。

つまづいたら、また、よろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る