「別ファイルの関数の使い方」の編集履歴(バックアップ)一覧はこちら
「別ファイルの関数の使い方」(2016/01/18 (月) 03:49:26) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
ある程度まとまった関数毎にファイルを分離して保存しておくと,後々利用するときに便利です.ここではファイル分離の方法と,分離したファイルをプロジェクトに読み込む方法について説明します.
**関数の分離
例として,次のようなプログラムから関数を分離することを考えます
#highlight(linenumber,c){{
void port_init(void)
{
DDRC=(1<<1)|(1<<0);
PORTC=(1<<2);
}
int main(void)
{
port_init();
while(1)
{
}
}
}}
まずは,関数部分を.cファイルとして保存します.SolutionExplorerのプロジェクトを右クリックして,add→New Itemを選択します.ウィンドウが表示され,どの種類のファイルを作成するかを選択できますので,Cファイルを選択します.ファイル名はtest.cとしておきます.
この新ファイルに先ほどの関数をコピーしますが,関数内でPORTを使っているためavr/io.hのインクルードも行います.よって,test.cの中身は次のようになります.
#highlight(linenumber,c){{
#include <avr/io.h>
void port_init(void)
{
DDRC=(1<<1)|(1<<0);
PORTC=(1<<2);
}
}}
次に,この関数の宣言部分をまとめたヘッダファイルを作成します.先ほどのと同様に新規ファイルの追加を行い,ファイルの種類としてIncludeFileを選択します.ファイル名はtest.hとしておきます.(.cと対応させておいた方が後々便利です)
すると,test.hが作成されますが,あらかじめいくつかおまじないが記述されていると思います.これはインクルードガードといって,複数の場所でヘッダが呼ばれた際の重複を回避する工夫です.
ですので,おまじないの部分は消さないようにして,関数の宣言を追加します.よって,test.hはこのようになります.
#highlight(linenumber,c){{
#ifndef TEST_H_
#define TEST_H_
void port_init(void);
#endif /* TEST_H_ */
}}
最後に,main文のあるプログラムでこれらの関数を呼び出します.これらの関数はtest.hをインクルードしておくことで使えるようになります.この際,
#highlight(c){{#include “test.h”}}
というように,ダブルクォーテーションで囲みます.
>※includeにおける<>と””の違い
>これらはファイルを探しに行く場所が異なります.
><>は標準のライブラリなどが格納されているフォルダを探しに行きます.
>“”は現在のプログラムのあるフォルダを探しに行きます.
よって,mainプログラムは次のようになります.
#highlight(linenumber,c){{
#include<avr/io.h>
#include”test.h”
int main(void)
{
port_init();
while(1)
{
}
}
}}
このような感じで,他ファイルの関数を使うことができるようになります.
**関数の読み込み
一度分離した関数ファイルはプロジェクトに取り込むと使えるようになります.やり方としてはSolutionExplorerのプロジェクトを右クリックして,add→Existing Itemを選択し,作成したCファイルとヘッダファイルを両方とも追加します.
ある程度まとまった関数毎にファイルを分離して保存しておくと,後々利用するときに便利です.ここではファイル分離の方法と,分離したファイルをプロジェクトに読み込む方法について説明します.
**関数の分離
例として,次のようなプログラムから関数を分離することを考えます
#highlight(linenumber,c){{
void port_init(void)
{
DDRC=(1<<1)|(1<<0);
PORTC=(1<<2);
}
int main(void)
{
port_init();
while(1)
{
}
}
}}
まずは,関数部分を.cファイルとして保存します.SolutionExplorerのプロジェクトを右クリックして,add→New Itemを選択します.ウィンドウが表示され,どの種類のファイルを作成するかを選択できますので,Cファイルを選択します.ファイル名はtest.cとしておきます.
この新ファイルに先ほどの関数をコピーしますが,関数内でPORTを使っているためavr/io.hのインクルードも行います.よって,test.cの中身は次のようになります.
#highlight(linenumber,c){{
#include <avr/io.h>
void port_init(void)
{
DDRC=(1<<1)|(1<<0);
PORTC=(1<<2);
}
}}
次に,この関数の宣言部分をまとめたヘッダファイルを作成します.先ほどのと同様に新規ファイルの追加を行い,ファイルの種類としてIncludeFileを選択します.ファイル名はtest.hとしておきます.(.cと対応させておいた方が後々便利です)
すると,test.hが作成されますが,あらかじめいくつかおまじないが記述されていると思います.これはインクルードガードといって,複数の場所でヘッダが呼ばれた際の重複を回避する工夫です.
ですので,おまじないの部分は消さないようにして,関数の宣言を追加します.よって,test.hはこのようになります.
#highlight(linenumber,c){{
#ifndef TEST_H_
#define TEST_H_
void port_init(void);
#endif /* TEST_H_ */
}}
最後に,main文のあるプログラムでこれらの関数を呼び出します.これらの関数はtest.hをインクルードしておくことで使えるようになります.この際,
#highlight(c){{#include “test.h”}}
というように,ダブルクォーテーションで囲みます.
>※includeにおける<>と””の違い
>これらはファイルを探しに行く場所が異なります.
><>は標準のライブラリなどが格納されているフォルダを探しに行きます.
>“”は現在のプログラムのあるフォルダを探しに行きます.
よって,mainプログラムは次のようになります.
#highlight(linenumber,c){{
#include<avr/io.h>
#include”test.h”
int main(void)
{
port_init();
while(1)
{
}
}
}}
このような感じで,他ファイルの関数を使うことができるようになります.
**関数の読み込み
一度分離した関数ファイルはプロジェクトに取り込むと使えるようになります.やり方としてはSolutionExplorerのプロジェクトを右クリックして,add→Existing Itemを選択し,作成したCファイルとヘッダファイルを両方とも追加します.