...

PDFファイル

by user

on
Category: Documents
16

views

Report

Comments

Transcript

PDFファイル
読者への
読者への注意
への注意
mikroCとこのマニュアルはマイクロエレクトロニカの所有するものであり、著作権法と国際著作権条約によ
り保護されている。
それ故に、著作権で保護されたその他の全ての資料(書籍など)同様にこのマニュアルを取り扱うべきである。
このマニュアルとコンパイラは、マイクロテクニカからの承諾書無しには部分または全体をコピーしてはならない。
マニュアルのPDF版は個人的または局所的(ローカル)な使用のためなら印刷可能である。
マニュアルまたはコンパイラを変更することは断じて禁止する。
HIGH RISK ACTIVE(ハイリスク
ACTIVE(ハイリスクな
ハイリスクな運用)
運用)
mikroCコンパイラは、核施設での操作、航空機のナビゲーションや通信システム、航空交通管制、直接生命
を維持する装置、兵器システムのようなフェールセーフ性能を要求される危険な環境において使用するオンライン制
御装置としては、フォールトトレラント(誤り耐性のあるもの)ではなく、設計も製造も、また使用、転売しようと
することもできない。
人的違法行為、または重大な肉体的または環境的な損傷(
“High Risk Active”
)により、ソフトウ
ェアの欠陥が直接に死をもたらす可能性があるだろう。
マイクロエレクトロニカとその提供者らは、高度に危険な運用に対し、
いかなる表現も暗示的な適合性の保証にも、
明確に責任を放棄する。
LICENSE AGREEMENT(ライセンス
AGREEMENT(ライセンス契約
ライセンス契約)
契約)
mikroCコンパイラを使用することにより、使用者はこの契約条件に同意したものとする。
一度に一人のみがライセンスを許可したmikroCコンパイラのバージョンを使用できる。
このマニュアルはmikroCバージョン6.2.0.1と関連トピックスをカバーする。
より新しいバージョンは、断り無く変更される可能性有り。
COMPILER BUG REPORT(コンパイラ
REPORT(コンパイラの
バグ報告)
コンパイラのバグ報告
報告)
コンパイラは注意深く検査とデバッグをしてきている。
しかしながら、100%エラー無しの製品を保証することは不可能である。
もしバグを報告したいなら、アドレス [email protected].
ヘ連絡を取ってほしい。
バグレポートには次の情報を含めて欲しい。
-あなたの OS
-mikroCのバージョン
-コードのサンプル
-バグの内容説明
PIC、PICmicro 及び MPLAB はマイクロチップ社の登録商標である。ウィンドウズはマイクロソフト社の登録
商標である。あらゆる他の商標、サービスマークは個々の所有者の所有物である。
1
2
目
次
第1章 mikroC IDE.................................................................................................................................
6
IDE
簡単な
6
簡単な概要..................................................................................................................................................
概要
コードエディタ..........................................................................................................................................
8
コードエディタ
コードエクスプローラ.............................................................................................................................
11
コードエクスプローラ
デバッガ....................................................................................................................................................12
デバッガ
エラーウィンドウ ....................................................................................................................................16
統計情報....................................................................................................................................................17
統計情報
統合的ツール
統合的ツール............................................................................................................................................20
ツール
キーボード ショートカット.................................................................................................................23
ショートカット
第2章 Building Applications(アプリケーションの構築)
............................................................26
Applications
Project(
) ........................................................................................................................27
Project(プロジェクト)
SOURCE FILES(
) ...............................................................................................29
FILES(ソースファイル)
COMPILATION(
)...........................................................................................................32
COMPILATION(コンパイル)
ERROR MESSEGES(
)....................................................................................33
MESSEGES(エラーメッセージ)
第3章 miKroC 言語 レファレンス......................................................................................................36
レファレンス
PIC 仕様 ...................................................................................................................................................37
PIC16 仕様...............................................................................................................................................38
仕様
mikroC 仕様.............................................................................................................................................39
仕様
Lexical Elements(字句要素)...........................................................................................................45
Elements
mikroC ICD(インサーキットデバッガ).........................................................................................47
ICD
Tokens(トークン)................................................................................................................................58
Tokens
Constants(定数)..................................................................................................................................59
Constants
Keywords(キーワード).......................................................................................................................66
Keywords
Identifiers(識別子)..............................................................................................................................67
Identifiers
Punctuators(区切り子)......................................................................................................................68
Punctuators
Objects and Lvalues(オブジェクトと
Lvalues)........................................................................72
Lvalues
Scope AND Visibility(スコープとビジビリティ)
......................................................................74
Visibility
Name Spaces(名前空間).................................................................................................................76
Spaces
Duration(持続期間)............................................................................................................................77
Duration
Types(型).............................................................................................................................................79
Types
Fundamental Types(基本的な型)..................................................................................................80
Types
DERIVED TYPES(派生型)............................................................................................................85
TYPES
POINTERS(ポインタ).......................................................................................................................88
POINTERS
3
TYPES CONVERSIONS(型変換)
..............................................................................................104
CONVERSIONS
DECLARATIONS(宣言).................................................................................................................107
DECLARATIONS
FUNCTIONS(関数).........................................................................................................................118
FUNCTIONS
OPERATORS(演算子).....................................................................................................................124
OPERATORS
EXPRESSIONS(式)
........................................................................................................................137
EXPRESSIONS
STATEMENTS(文)..........................................................................................................................139
STATEMENTS
PREPROCESSOR(プリプロセッサ).............................................................................................149
PREPROCESSOR
第4章 mikroC libraries(mikroC
ライブラリ) ............................................................................160
libraries
BUILTBUILT-IN ROUTINES(組込み型ルーチン)...............................................................................161
ROUTINES
LIBRARY ROUTINES(ライブラリルーチン)...........................................................................165
ROUTINES
ADC Library(アナログ-デジタル変換コンバータライブラリ)...............................................167
Library
CAN Library(CAN
ライブラリ)..................................................................................................169
Library
CANSPI Library(CANSPI
ライブラリ).....................................................................................181
Library
Compact Flash Library(コンパクトフラッシュライブラリ).................................................190
Library
Compact Flash FAT Library v2.xx .........................................................................................200
EEPROM Library(EEPROM
ライブラリ)................................................................................203
Library
Ethernet Library(イーサネットライブラリ)..............................................................................205
Library
SPI Ethernet Library(SPIイーサネットライブラリ)........................................................217
Library
Flash Memory Library(フラッシュメモリライブラリ)
.........................................................229
Library
I2C Library(I2C
ライブラリ).......................................................................................................232
Library
Keypad Library(キーパッドライブラリ)....................................................................................237
Library
Lcd Library(
(LCD ライブラリ)..............................................241
Library(4 ビット インターフェース)
インターフェース)
Lcd Custom Library(LCD
カスタムライブラリ)....................................................................247
Library
Lcd8 Library(
(LCD8 ライブラリ).........................................253
Library(8ビット インターフェース)
インターフェース)
GLCD Library(GLCD
ライブラリ).............................................................................................257
Library
T6963c Graphic Lcd Library(T6963C
GLCD ライブラリ).............................................268
Library
Manchester Code Library(マンチェスターコードライブラリ).............................................284
Library
Multimedia Card Library (マルチメディアカードライブラリ)...........................................290
PWM Library(PWMライブラリ)...............................................................................................308
Library
RS485 Library(RS485
ライブラリ) ............................................................................................312
Library
Software I2C Library(I2Cソフトウェアライブラリ)........................................................318
Library
Software SPI Library(SPI
ソフトウェアライブラリ)............................................................322
Library
Software UART Library(UART
ソフトウェアライブラリ)..................................................325
Library
Sound Library(サウンドライブラリ)..........................................................................................328
Library
SPI Library(SPI
ライブラリ).......................................................................................................330
Library
USART Library(USARTライブラリ)....................................................................................334
Library
USB HID Library(USB
HID ライブラリ).........................................................................338
Library
Util Library(ユーティリティライブラリ)...................................................................................343
Library
4
ANSI C Ctype Library.................................................................................................................344
Library
ANSI C Math Library .................................................................................................................348
ANSI C Stdlib Library.................................................................................................................354
Library
ANSI C String Library................................................................................................................358
Library
Conversion Library............................................................................................................................364
Library
Trigonometry Library(三角法)
....................................................................................................368
Library
Sprint Library
Library ....................................................................................................................................369
SPI Graphic Lcd Library.............................................................................................................374
Library
Port Expander Library...................................................................................................................385
Library
SPI Lcd Library(4Bit interface) .................................................................................................393
SPI Lcd8(8Bit interface) Library ...............................................................................................398
SPI t6963c Graphic Lcd Library.............................................................................................403
Library
Setjmp Library...................................................................................................................................419
Library
Time Library.......................................................................................................................................421
Library
5
第1章 mikroC IDE
簡単な
簡単な概要
mikroCはPICmicrosのためのパワフルで特徴的で内容豊富な開発ツールである。
それは、性能または制御に妥協する事無く、埋込み式システムのためのアプリケーションを開発するため、最も容易
に解決の可能性を顧客に提供するために設計されている。
PIC と C は互いに良く適合する。つまり、PIC は世界で最も有名な8bitチップであり、広く多様なアプリケー
ションに使われ、また、その効率の良さを重視したCに適合することは、埋め込みシステムを開発するための自然な
選択といえる。
mikroCは、高度に進歩したIDE、ANSI準拠のコンパイラ、広範なハードウェアのライブラリ・セット、
判りやすいドキュメント及び多くのすぐ実行できるサンプルを特徴とする上出来の組み合わせを提供する。
page
1
6
mikroCは、素早い開発と複雑なアプリケーションの展開を可能にする。
- 高度に進歩したコードエディタを使用してあなたのCソースコードを書こう。
- データ収集、メモリ、ディスプレイ、変換、通信など・・・開発を劇的に早めるため、中に含まれたmikro
Cライブラリを使用しよう。
- コードエクスプローラであなたのプログラムの構造、変数、関数をモニターしよう。
すべてのプログラマに注釈付きで、人間的な信頼性のあるアセンブリ及び標準的なHEX互換を生成する。
- プログラムの流れを点検し、統合的なデバッガで実行可能なロジックをデバッグしよう。
コードの統計上の詳細レポートとグラフ、アセンブルリスト、等を手に入れよう。
- われわれは、あなたのプロジェクト内で建築中のレンガのごとく、拡張し、開発し、使用するための多くのサン
プルを用意した。
page
2
7
コードエディタ
コードエディタはプロの要求を満足するために仕上げられた、先進的なテキストエディタである。
一般的なコードの編集は、ウィンドウズ環境と共通の、良く知られたCopy(コピー)
、Paste(貼付け)及び
Undo(元に戻す)動作を含む、全ての標準的なテキストエディタでの作業と同じである。
先進的なエディタに含まれる特徴は、
-最適なシンタックスを明るく表示
-コード・アシスタント
-パラメータ・アシスタント
-コード・テンプレート(自動完結)
-よくある誤字脱字の自動誤り訂正
-ブックマークとGoto Line
あなたはエディタ セッテング ダイアログからこれらのオプションをカスタマイズできる。
設定をアクセスするには、ドロップダウンメニューから Tools>Option を選択するか、ツール・ア
イコンをクリックする。
page
3
8
コード アシスタント [CTRL+SPACE]
もしあなたが単語の最初の幾つかの文字を打ち、それからCTRL+SPACEを押すと、あなたが打った文字に
一致する全ての有効な名称がフローティングパネルに表示される。
(イメージ参照)
今やあなたは文字を絞り込んで(選択の巾を狭くして)タイプを続けることが可能であり、さもなくば、キーボー
ドの矢印やエンターを使用して一覧表から1つを選択することが可能である。
パラメータ
パラメータ アシスタント[CTRL+SHIFT+SPACE]
アシスタント[CTRL+SHIFT+SPACE]
パラメータアシスタントは、あなたが丸括弧“
(”を開くか、CTRL+SHIFT+SPACEを押すと、自動的
に引き合いに出す。
もし有効な関数名が丸括弧に先行すれば、期待する変数がフローティングパネルに引き合いに出されるだろう。
あなたが現実にあるパラメータを打つと、次に期待される変数がボールド(太文字)で出るだろう。
コード テンプレート[CTRL+J]
テンプレート[CTRL+J]
あなたがテンプレート(例えば、whileb)の名前をタイプすることでコードテンプレートを挿入でき、それからC
TRL+Jを押すと、コードエディタは自動的にコードを生成するだろう。
さもなくば、あなたはコードツールバーからボタンをクリックしたり、一覧表からテンプレートを選択することが可
能である。
あなたは一覧表へあなた自身のテンプレートを追加することができる。
正にプルダウンメメニューから Tools>Options を選択するか、設定用ツールバーからツールアイコ
ンをクリックし、それから Auto Complete Tab を選択する。
ここであなたは最適なキーワード、説明及びあなたのテンプレートのコードを入力することが可能である。
page
4
9
オ―ト コレクト
オートコレクトの特徴はよくあるタイピングミスの誤りを正すことである。
認識されたタイピングミスのリストへアクセスするには、ドロップダウンメニューから Tools>Option
を選択するか、さもなくば Tool Iconをクリックして、Auto Correct Tabを選択する。
リストへあなた自身の好みをも追加することが可能だ。
コメント/
コメント/非コメント
コードエディタは、コードツールバーからコメント/非コメント化アイコンを使用することで、マ
ウスの1クリックで選択したコードブロックをコメントまたは非コメント化することが可能である。
Bookmarks(ブックマーク)
Bookmarks
ブックマークは大きなコードの中のナビゲーションをより容易にしてくれる。
CTRL+<number>:ブックマークの場所へジャンプする。
CTRL+SHIFT+<number>:ブックマークを設定する。
Goto Line
ゴートゥーラインオプションは、大きなコードの中をより簡単にナビゲートする。
ドロップダウンメニューから Search>Goto Line を選択するか、ショートカット CTRL+G
を使用する。
page
5
10
コードエクスプローラ
コードエクスプローラはデフォルトでメインウィンドウの左側に置かれており、ソースコード内で宣言されたすべ
ての項目を明確に見せてくれる。
あなたがそれをクリックするか、Find Decralation iconをクリックすることによって、い
かなる項目の宣言へもジャンプできる。
Code Exploler内でツリー表示を展開したり、折りたたんで小さくしたりするた
めには、Collaps/Expand ALL アイコンを使う。
2つ以上のタブもまた、コードエキスパンダ内で有効である。
QHelp Tabは、クイック レファレンスのために、全ての有効な埋め込み及びライブラリ関数を一覧表示す
る。
QHelp Tad内のルーチンをダブルクリックすると、関連のあるヘルプ トピックをオープンする。
キーボードタブはmikroC内の全ての有効なキーボード ショートカットを一覧表示する。
page
6
11
デバッガ
ソースレベルデバッガは、mikroC開発環境の統合的なコンポーネントである。
マイクロチップテクノロジー社のPICmicrosの動作をシミュレートするため、またそれらのデ
バイス用に書かれたソフトウェアのデバッグ時にユーザーを補助するために設計されている。
デバッガはプログラムの流れと命令行の実行をシミュレートするが、PICデバイスの動作を十分に
エミュレート(模倣)するものではない。つまり、タイマー、割り込みフラグ等を最新にしない。
あなたのプロジェクトのコンパイルに成功した後、ドロップダウンメニューから Run>Deb
ug を選択するか、デバッグアイコンをクリックすることで、デバッガを実行することが可能だ。
デバッガをスタートすると、更なるオプションが有効になる。つまり、Step Into、Ste
p Over、Run to Cursolなど。実行されるべき行は色付きで特に明るく表示され
る。
Debug[F9
Debug[F9]
デバッガーをスタートする。
Run/Pause Debugger[F6
Debugger[F6]
デバッガーを実行または停止する。
Step Into[F7
Into[F7]
現在のC(シングル-又はマルチ-サイクル)の命令を実行してホールト(停止)する。
もし、命令がルーチン呼び出しならば、ルーチンに入り、呼び出しの次の最初の命令でホールト(停止)
する。
Step Over[F8
Over[F8]
現在のC(シングル-又はマルチ-サイクル)の命令を実行してホールト(停止)する。
もし、命令がルーチン呼び出しならば、スキップし、呼び出しの次の最初の命令でホールト(停止)す
る。
Step Out[Ctrl+F8
Out[Ctrl+F8]
現在のC(シングル-又はマルチ-サイクル)の命令を実行してホールト(停止)する。
もし、命令がルーチン内であれば、命令を実行し、呼び出しの次の最初の命令でホールト(停止)する。
Run to cursol[F4
cursol[F4]
現在の命令とカーソルの位置の間の全ての命令を実行する。
page
7
12
Toggle Breakpoint[F5
Breakpoint[F5]
現在のカーソル位置でブレークポイントの状態を切り替える。
全てのブレークポイントを見るには、ドロップダウンメニューから Run>View Breakpo
ints を選択する。
ウィンドウリスト内の項目をダブルクリックすると、ブレークポイントの位置を一覧表示する。
Watch Window(ウォッチウィンドウ
Window(ウォッチウィンドウ)
ウォッチウィンドウ)
Variables(変数
Variables(変数)
変数)
Watch Windowは、あなたのプログラムを実行している間、あなたのプログラムの項目をモニタするこ
とを可能にする。
それはPIC MCUの変数や特殊機能レジスタ、それらのアドレスや値を表示する。
値はシミュレーションを実行している間に更新される。
項目の1つをダブルクリックすると、選択した変数またはレジスタに新たな値を割当てることができ、且つ数値のフ
ォーマットを変えことが可能なウィンドウが開く。
page
8
13
Stop Watch Window(ストップウォッチ
Window(ストップウォッチ ウインドウ)
ウインドウ)
ストップウォッチウィンドウは、最後のデバッガの動作から現在のサイクル/時間までのカウント値を表示する。
ストップウォッチは、デバッガがスタートした瞬間からの実行時間(サイクル数)を測定し、いつでもリセットする
ことができる。
Deltaは、以前の命令行(デバッガが実行した行)とアクティブな命令行(デバッガが停止した場所)の間のサ
イクル数を意味する。
注)あなたはストップウォッチウィンドウ内のクロックを変更できる。つまり、これは新たに指定された周波数に対
する値を再計算するであろう。ストップウォッチ ウィンドウ内でクロックを変更することは、現在のプロジェクト
の設定へ影響を及ぼすものではない。-それはシミュレーションに与えるだけである。
page
9
14
View RAM Window
デバッガ・ビュー・RAM・ウィンドウは、ドロップダウンメニュー、View
View>Debug
View Debug Window>
Window
View RAM から利用する。
View RAM Window は、赤文字で最新の変化した項目と共にPICのRAMのマップを表示する。
あなたはそれをダブルクリックすることで、どの領域の値でも変更可能である。
page
10
15
エラーウィンドウ
コンパイル中、エラーに遭遇した場合、コンパイラはそれらを報告し、HEXファイルを生成しようとしない。
エラーウィンドウが、デフォルトでメインウィンドウの下端に表示されるだろう。
エラーウィンドウは、メッセージタブの下に配置され、コンパイラが遭遇したエラーの位置とタイプを表示する。
コンパイラは警告も報告するが、それらは出力に影響しない、つまり、エラーのみがHEXファイルの生成を妨げる。
エラーが発生した行を明るく表示するには、エラーウィンドウ内のメッセージ行をダブルクリックする。
コンパイラによって認識されたエラーに関する更なる情報を得るためにエラーメッセージを調べよう。
page
11
16
統計情報
首尾よくコンパイルした後に、あなたはコードの統計情報を調べることができる。
ドロップダウンメニューから Project>Statistics を選択、または Stat
istics Iconをクリックしよう。6個のタブ ウィンドウがある。
Memory Usage Window
ヒストグラムの形式で、RAMとROMのメモリ利用状況の概要を提供する。
Procedures(
Procedures(Graph)
Graph) Windows
それらのメモリの割り当てにしたがって、ヒストグラムの形式で関数を表示する。
page
12
17
Procedures(
Procedures(Locations)
Locations) Windows
関数がどのようにマイクロコントローラのメモリに配置されているのか、を表示する。
Procedures(
Procedures(Details)
Details) Windows
各関数の詳細にしたがって、完全な呼び出しのツリー構造を表示する。
大きさ、開始と終了アドレス、呼び出し周波数、戻りのタイプ、等。
page
13
18
RAM Window
全てのGPRとSFRレジスタとそれらのアドレスを一括表示する。
変数のシンボルネームとそれらのアドレスも表示する。
ROM Window
人が読めるHEXコード形式でオペコードとそれらのアドレスを一覧表示する。
page
14
19
統合的ツール
統合的ツール
USART ターミナル
mikroCはRS232C通信のための通信端末USART(ユニバーサル非同期/同期 受信/送信器)を含
む。あなたはドロップダウンメニュー Tools>Ternimal から、または Terminal Ico
n をクリックすることで開始できる。
ASCII表
ASCII表
ASCII表は使いやすいツールで、特にLCD表示器を扱う場合に有用である。
あなたはドロップダウンメニュー Tools>ASCII Chart からそれを開始できる。
page
15
20
7セグ ディスプレイ デコーダ
7セグディスプレイデコーダは、ユーザーが7セグに表示したい、全ての実行可能な組み合わせに対応する10進
/16進の値を返す、便利で視覚的なパネルである。
エディットボックス内の希望する値を得るため、7セグメントのイメージの部分をクリックする。
あなたはドロップダウンメニュー Tools>7 Segment Display から開始できる。
EEPROM エディタ
EEPROMエディタは、PICマイクロコントローラのEEPROMを容易に管理することを可能にする。
page
16
21
mikroブートローダー
mikroブートローダー
マイクロブートローダーはフラッシュ書き込みをサポートするPICmicrosでのみ使用できる。
1.従来のプログラミング技術(例えば、PIC16F877Aにp16f877a.hexを使用するといった)
を使用して、適切なHEXファイルをPICにロードする。
2.ドロップダウンメニュー Tool>Bootloader からマイクロブートローダーを始める。
3.セットアップポートをクリックし、使用する予定のCOMポートを選択する。BAUD は9600bpsに設定す
る。
4.Open Fileをクリックし、アップロードしたいHEXファイルを選択する。
5.PIC内のブートコードのみがコンピュータに接続するため4~5秒を与えるので、あなたはPICをリセット
すべきであり、それから4~5秒以内にConnectボタンをクリックしなければならない。
6.それからヒストリウィンドウ内の最後の行に、
“Connected”
(接続された)と示されるはずである。
7.アップロードを始めるには、まさしくStart Bootloaderボタンをクリックするのみである。
8.あなたのプログラムはPICフラッシュメモリへ書き込まれるだろう。ブートローダーはエラーが発生すると報
告するであろう。
9.あなたのPICをリセットして実行しよう。
ブートコードがコンピュータにそれに接続するための5秒を与える。
もしだめなら、存在するユーザーコードの実行を開始する。
もしダウンロードされるべき新しいユーザーコードがあるならば、ブートコードは、受信してプログラムメモリにデ
ータを書く。
ブートローダーが有する更なる共通の特徴を以下に一覧表示する。
-リセット位置のコード
-メモリの小さな領域内の他の場所のコード
-もしユーザーがロードされるべき新しいユーザーコードを必要とするならば、見て確認する。
-もし新しいユーザーコードがロードされないならば、ユーザーコードの実行を開始する。
-もしコードがロードされるべきならば、通信チャンネル経由で新しいユーザーコードを受信する。
-メモリに新しいユーザーコードをプログラムする。
Integrating User Code and Boot Code
(ユーザーコードとブートコードの統合)
ブートコードは、リセット配置とある追加的なプログラムメモリをほぼ常に使用する。
それは割り込みを使用する必要の無いコードの簡単な一片である。それ故に、ユーザーコードは通常の割り込みベク
ターアドレス0x0004を使用可能である。
ブートコードは割り込みベクターの使用を避けねばならない。それゆえ、アドレス範囲0x0000から0x000
3内でプログラム分岐を有すべきである。
ブートコードは、従来のプログラミング技術を使用してメモリにプログラムされねばならない。そして、コンフィグ
レーションビットがこのときにプログラムされねばならない。
それらがプログラムメモリ空間へ対応付けられない限り、ブートコードはコンフィグレーションビットをアクセスで
きない。
page
17
22
キーボード ショートカット
以下はmikroC IDEで有効なキーボード ショートカットの完全な一覧表である。
あなたはコードエクスプローラウィンドウ、タブキーボード内でもキーボード ショートカットを見ることができる。
IDE ショートカット
F1
ヘルプ
CTRL+N
新規ユニット
CTRL+O
オープン
CTRL+F9
コンパイル
CTRL+F11
コードエクスプローラ オン/オフ
CTRL+SHIFT+F5
ブレークポイントを見る
ベーシック エディタ ショートカット
F3
検索、次検索
VTRL+A
全て選択
VTRL+C
コピー
VTRL+F
検索
VTRL+P
印刷
VTRL+R
置き換え
VTRL+S
ユニットを保存
VTRL+SHIFT+S
~として保存
VTRL+V
貼付け
VTRL+X
切り取り
VTRL+Y
次に進む
VTRL+Z
前に戻す
アドバンスト エディタ ショートカット
VTRL+SPACE
全て選択
VTRL+ SHIFT+SPACE
パラメータ アシスタント
VTRL+D
宣言の検索
VTRL+G
Goto 行
VTRL+J
コードテンプレートを挿入
VTRL+<number>
ブックマークへ飛ぶ
VTRL+SHIFT+<number> ブックマークの設定
VTRL+SHIFT+I
貼付け
VTRL+SHIFT+U
切り取り
VTRL+ALT+SELECT
列の選択
page
18
23
デバッガ ショートカット
F4
カーソルまで実行
F5
ブレークポイントのトグル操作
F6
デバッガを実行/停止
F7
ステップ動作に入る
F8
ステップ オーバー
F9
デバッグ開始
CTRL+F2
リセット
page
19
24
page
20
25
第2章 Building Applications(アプリケーションの構築)
mikroCでアプリケーションを作ることは容易で直感的である。プロジェクトウィザードが、ほんの数クリッ
クするだけであなたのプロジェクトをセットアップすることを可能にする。つまり、あなたのアプリケーションに名
称をつけ、チップを選択し、フラグを設定し、開始するということである。
mikroCは、あなたができる限り多くのファイルを正確に見出せるように、あなたのプロジェクトを配置する
ことを可能にする。
それから、あなたはソースコードを公開せずに、他の開発者とmikroCompiled libraries
(.mclファイル)を共有することができる。
最高の点は、mikroPascalやmikroBasic!によって作られた.mclのバンドルをあなたが
使用できるということである。
page
21
26
Project(
(プロジェクト)
mikroCは、アプリケーションを1つのプロジェクトファイル(拡張子 .ppc)及び1つかそれ以上のソ
ースファイル(拡張子 .c)から成り立つプロジェクトに組織的に組み込む。
もしソースファイルがプロジェクトの一部分である場合のみ、あなたはソースファイルをコンパイルできる。
プロジェクトファイルは次の情報をもたらす。
-プロジェクト名とオプションの解説
-ターゲットデバイス
-デバイスフラグ(コンフィグ ワード)とデバイスクロック
-パス付きのプロジェクトソースファイルの一覧
プロジェクトの
プロジェクトの新規作成
プロジェクトを生成するための最も容易な方法は、New Project Wizard、ドロ
ップダウンメニュー menu Project>New Project によることである。
希望する値(プロジェクト名、記述、配置、デバイス、クロック、コンフィグ ワード)でダイヤロ
グをまさに満たし、mikroCは適切なプロジェクトファイルを生成する。
プロジェクトの後で名前をつける空のソースファイルもデフォルトとして生成されるだろう。
プロジェクトの
プロジェクトの編集
後に、あなたはドロップダウンメニューの Project>Edit Project からプ
ロジェクトの設定を変更できる。
あなたはプロジェクトを命名し直したり、その記述内容を変更したり、チップやクロックやコンフィ
グ ワード等を変更することができる。プロジェクトを削除するには、プロジェクトファイルが保
存されているフォルダを単純に削除する。
プロジェクトからの
プロジェクトからのファイル
からのファイルの
ファイルの追加/
追加/削除
プロジェクトは多くのソースファイル(拡張子.c)を含むことができる。
関連のあるソースファイルの一覧がプロジェクトファイル(拡張子.ppc)内に保存される。
あなたのプロジェクトにソースファイルを追加するには、ドロップダウンメニューから Proje
ct>Add to Project を選択する。
各々追加されたソースファイルは自己充足していなければならない、つまり、処理を行った後、それ
は全ての必要な定義を保有しなければならない。
あなたのプロジェクトからファイルを消すには、ドロップダウンメニューから Project>R
emove from Project を選択する。
注)ヘッダーファイルの組込みのためには、プロセッサ命令 #include を使用する。
page
22
27
プロジェクトファイルタブの
プロジェクトファイルタブの拡張された
拡張された機能性
された機能性
プロジェクトファイルの新たな特徴を使用することにより、あなたは1回のクリックで全ての出力ファイル(.li
st,.asm)を手に入れることができる。
あなた自身のライブラリも、コンパイラのデフォルトライブラリもプロジェクト固有のライブラリなので、あなたは
プロジェクトにライブラリファイル(.mcl)を含むこともできる。
mikroC バージョン2と比べると、今やライブラリ(.mcl)は異なった、より圧縮されたフォーマット
になっている。
しかしながら、これはライブラリ フォーマットがもはや互換性を持たないということを意味する。
バージョン2から5へ移行しているユーザーは、新しいバージョンでそれらを使用するためには、以前に書かれたそ
れらのライブラリを再構築しなければならない。
以前のバージョンで書かれ、試験された全てのソースコードは、ヘルプのasmセクションで注釈されているasm
{ }ブロックを除いて、バージョン5.0で正しくコンパイルすべきである。
page
23
28
SOURCE FILES(
(ソースファイル)
Cコードを含むソースファイルは、拡張子 .c を持つべきである。
アプリケーションに関連のあるソースファイルの一覧が、拡張子 .ppcを持ったプロジェクトファイル内に他の
プロジェクト情報と共に保存される。
ソースファイルがプロジェクトの一部である限りにおいて、あなたはソースファイルをコンパイルすることができる。
ヘッダーを含めるため、プリプロセッサ命令 #include を使用すること。
他のソースファイルを含めるためにプリプロセッサーを当てにしてはならない。- 更なる情報は Project
sを参照すること。
Search Path(パス
Path(パスを
検索)
パスを検索)
ソースファイル(.c)
ソースファイル(.c)のための
(.c)のためのパス
のためのパス
ユーザーはユーザー自身のカスタム サーチ パスを指定することができる。
これは、ドロップダウンメニューから Tools>Option それから、Tab Window Advan
ced を選択することにより設定することができる。
プロジェクトの設定において、あなたはソースファイルへの絶対または相対パスのいづれも指定できる。
もしユーザーが相対パスを指定すると、mikroCは、この特殊な命令で次の場所でファイルを捜索する。
1.プロジェクト フォルダ(プロジェクトファイル .ppcを含むフォルダ)
2.あなたのカスタム サーチ パス
3.mikroC インストールフォルダ>“uses”フォルダ
page
24
29
ヘッダーファイル(.h)
ヘッダーファイル(.h)のための
(.h)のためのパス
のためのパス
ヘッダーファイルはプリプロセッサ命令 #include によってインクルードされる。
もし、あなたがプリプロセッサ命令でヘッダーファイルへの明示的なパスを配置すると、その場所のみが検索される
であろう。
あなたは自身のカスタム サーチ パスを指定できる。つまり、ドロップダウンメニューから Tools>Op
tions を選択し、更にSearch Path を選択する。
プロジェクトの設定において、あなたはヘッダーへの絶対または相対パスのいずれもを指定できる。
もしあなたが相対パスを指定すると、mikroCはこの特別な命令で次の場所でファイルを探すだろう。
1.プロジェクト フォルダ(プロジェクトファイル .ppcを含むフォルダ)
2.mikroC インストールフォルダ>”include”フォルダ
3.あなたのカスタム サーチ パス
ソースファイルの
ソースファイルの管理
新しいソースファイル
しいソースファイルの
ソースファイルの生成
新しいソースファイルを生成するためには、以下の内容を実行すること。
ドロップダウンメニューから File>New を選択するか、Ctrl+N を押すか、New Fileア
イコンをクリックする。新しいタブが開き、
“Untitled1”と命名される。
これはあなたの新しいソースファイルである。
あなたが望むがままの名前をつけるため、ドロップダウンメニューから File>Save as を選択する。
もしあなたが New Project Wizard を使用した場合は、プロジェクトの後に拡張子 .c と
共に命名される空のソースファイルが自動的に生成される。
mikroCはプロジェクトと同じに命名されたソースファイルを有することをあなたに要求しない。それは正に利
便性の問題であるからだ。
page
25
30
既存の
既存のファイルを
ファイルを開く
ドロップダウンメニューから File>Open を選択、又は Ctrl+O を押す、又は O
pen Fileアイコンをクリックする。Select Input File ダイアログが開
く。ダイアログにおいて、あなたが開いて選択したいファイルの場所を閲覧すること。
Openボタンをクリックする。選択したファイルがそれ自身のタブに表示される。
もし選択されたファイルが既に開いていたら、現在のエディタ タブが有効になるだろう。
開いたファイル
いたファイルの
ファイルの印刷
あなたが印刷したいファイルを含むウィンドウが有効なウィンドウであるということを確かめよう。
ドロップダウンメニューから File>Print を選択、または Ctrl+P を押す、ま
たは Printアイコンをクリックする。Print Preview Window において、
文書の希望のレイアウトを設定して、OKボタンをクリックする。ファイルが選択したプリンタに印
刷されるだろう。
ファイルの
ファイルの保存
あなた保存したいファイルを含むウィンドウが有効なウィンドウであることを確認しよう。
ドロップダウンメニューから File>Save を選択、又はCtrl+sを押すか、Save
アイコンをクリックする。ファイルがそのウィンドウ上の名前で保存されるだろう。
異なった名前
なった名前で
ファイルを保存
名前でファイルを
あなたが保存したいファイルを含むウィンドウが有効なウィンドウであることを確認しよう。
ドロップダウンメニューから File>Save を選択、又は SHIFT+Ctrl+s を
押す。新しいファイル名のダイアログが表示されるだろう。
ダイアログにおいて、あなたがそのファイルを保存したいフォルダを閲覧する。
ファイル名フィールドにおいて、あなたが保存したいファイル名を変更する。
Saveボタンをクリックする。
ファイルを
ファイルを閉じる
あなたが閉じたいファイルを含むタブが有効なタブであることを確認しよう。
ドロップダウンメニューから File>Close を選択、またはユーザーがコードエディタ
内で閉じたいファイルのタブを右クリックする。もしファイルが最後に保存したその後に変更されて
いたら、あなたは自分の変更内容を保存するよう促されるだろう。
page
26
31
COMPILATION(
(コンパイル)
あなたがプロジェクトを生成しソースコードを書いたなら、それをコンパイルしたいだろう。
ドロップダウンメニューから Project>Buildを選択、または Build アイコン
をクリック、又は単純に Ctrl+f9 をたたく。
プログレスバーが、コンパイル時のステータスをあなたに知らせるために現れる。
もしエラーがあるならば、あなたはエラーウィンドウ内で知らされる。
もしエラーが無ければ、mikroC は出力ファイルを生成する。
ファイルの
ファイルの出力
首尾よくコンパイルしたと同時に、mikroCはプロジェクト フォルダ(プロジェクトファイ
ル .ppc を含むフォルダ)内に出力ファイルを生成するだろう。
出力ファイルは下記の通り集約される。
・インテル HEX ファイル(.hex)
ファイル(.hex)
インテル形式の 16 進レコード。PIC MCUをプログラムするためにこのファイルを使用する。
・ライブラリを
ライブラリをコンパイルした
コンパイルしたバイナリマクロ
したバイナリマクロ(.mcl)
バイナリマクロ(.mcl)
他のプロジェクトに含むことが可能なアプリケーションのバイナリ配布。
・リストファイル
PICメモリ配置の概要。命令アドレス、レジスタ、ルーチンなど
・アセンブラファイル
リストファイルから抽出したシンボルネームの付きの判読可能なアセンブリ。
アセンブリ ビュー
mikroCであなたのプログラムをコンパイルした後、あなたは、新しいタブ ウィンドウにお
いて生成したアセンブリコード(.asm ファイル)を調べるため、View Assembly
Iconをクリック、またはドロップダウンメニューから Project>View Assem
bly を選択することが可能である。
アセンブリはシンボリックネームを有する判読可能なものである。
全ての物理アドレスと他の情報は Statistics またはリストファイル(.list)内
で見つけることが可能である。
もしプログラムがコンパイルされず、アッセンブリファイルが無い場合は、このオプションを開始す
ることが、あなたのコードをコンパイルし、それからアセンブリを表示することになるであろう。
page
27
32
ERROR MESSEGES(
(エラーメッセージ)
エラーメッセージ
-Specifier needed(指定子が必要)
-Invalid declarator(無効な宣言子)
-Integer const expected(期待される‘
(’または識別子)
-Integer const expected(期待される整数の定数)
-Array dimension must be grater than 0(配列の次元は0以上でなければならない)
-Local objects cannot be extern(ローカルオブジェクトは extern ではありえない)
-Declarator error (宣言子エラー)
-Bad storage class(間違ったストレージクラス)
-Arguments cannot be of void type(引数はvoid形式ではない)
-Specifier/qualifier list expected(期待される指定子/修飾子のリスト)
-Address must be greater than 0(アドレスは0以上でなければならない)
-Identifier redefined(識別子が再定義されている)
-case out of switch(switch の無い case 文)
-default label out of switch(switch の無い デフォルト ラベル)
-switch exp. must evaluate to integral type(switch exp.は整数型でなければならない)
-continue outside of loop(ループの外へ続く)
-break outside of loop or switch(ループまたは switch の外でブレイク)
-void func cannot return valus(void 関数は値を返さない)
-unreachable code(到達不可能なコード)
-Illegal expresson with void(void に伴う違法な表現)
-Left operand must be pointer(左オペランドはポインタでなければならない)
-Function required(要求された関数)
-Too many chars(char が多すぎる)
-Undefined struct(未定義の構造体)
-Nonexistent field(存在しない領域)
-Aggregate init error(Aggregate init エラー)
-Incompatible type(互換性の無いタイプ)
-Identifier redefined(識別子が再定義されている)
-Function definition not found(関数定義が見つからない)
-Signature does not match(署名情報が一致しない)
-Can not genarate code for expression(式のためのコードを生成できない)
-Too many initializers of subaggregate(subaggregate の初期化演算子が多すぎる)
-Nonexistent subaggregate(存在しない subaggregate)
-Stack Overflow:func call in complex expression(スタックオーバーフロー:入り組んだ表現の関数呼び出し)
-Syntax Error:expected %s but %s found(構文の誤り:期待される%s ではない%sが見つかった)
-Array element cannot be function(配列要素は関数でありえない)
-Function cannot return array(関数は配列を返すことはできない)
page
28
33
-Inconsistent storage class(矛盾したストレージクラス)
-Inconsistent type(矛盾した型)
-%s tag redefined(%s タグが再定義されている)
-Illegal typexast(違法な typecast)
-%s is not a valid identifier(%sは有効な識別子ではない)
-Invalid statement(無効なステートメント)
-Constant expression required(定数表現が要求される)
-Internal error %s(%sの内部エラー)
-To many arguments(引数が多すぎる)
-Not enough parameters(引数の数が不十分)
-Invalid expression(無効な表現)
-Identifier expected, but %s found(期待される識別子ではなく、%s が見つかった)
-Operator [%s] not applicable to this operand [%s](演算子[%s]はこのオぺランド[%s]に適切ではない)
-Assigning to non-lvalue [%s](lvalue[%s]で無いものに割当てている)
-Cannot cast [%s] to [%s]([%s]に[%s]を割当てることはできない)
-Cannot assign [%s] to [%s]([%s]に[%s]を割当てることはできない)
-lvalue required(lvalue が要求される)
-pointer required(ポインタが要求される)
-Argument is out of range(引数が範囲外である)
-undeclared identifier [%s] in expression)
(表現内の識別子[%s]が宣言されていない)
-Too many initializers(初期化演算子が多すぎる)
-Cannot establish this baud rate at %s MHz clock(%sMHzのクロックでこのボーレートを設定できない)
コンパイラ 警告メッセージ
警告メッセージ
-非常に無効なコード:入り組んだ表現の関数呼び出し
-無効なコード:入り組んだ表現の関数呼び出し
page
29
34
page
30
35
第3章 miKroC 言語 レファレンス
Cはマイクロコントローラのプログラミングにおいて無比なるパワーと柔軟性を提供する。
mikroCはPIC HWモジュールや通信のために特化されたライブラリの集合で更なるパワーをも追加する。
この章は、PICマイクロコントローラをプログラミングするための特効薬であると共に、Cの文法を学習、または
思い出すための手助けとなるに違いない。
もしあなたがCプログラミングの経験を積んでいるなら、おそらくmikroC スペシフィックスを最初に調べ
たくなるだろう。
page
31
36
PIC 仕様
mikroCコンパイラからもっと多くを得るためには、PIC MCUのある側面に精通しなければならない。
この知識は、非常に重要というわけではないが、PICの能力や限界、そしてコードを書く上でのそれらの影響につ
いてよりよい理解を提供する。
Types Efficiency(効果的な
効果的な型)
第一に、論理演算を実行するPICのALUがバイトで動作するために最適化されているということ知るべきであ
る。mikroCは非常に複雑なデータ形式を取り扱う能力があるとはいえ、もしも、あなたが特にいくつかのより
古い型のPICで作業をしているならば、PICは作業を行き詰まらせるかもしれない。これは、簡単な命令でさえ
も、実行に要する時間を劇的に増加させる可能性があるということである。一般的な助言としては、いかなる場合で
もできる限り小さな型を使用するべきであるということだ。
それは、一般的に全てのプログラミングに当てはまり、そして、マイクロコントローラにニ倍の処理時間をかけさせ
ることにもなる。
演算する場合、結局すべてのPICmicrosが同等の性能を持っているわけではないということである。
例えば、PIC16ファミリは2バイト乗算のためのハードウェア資源を欠くが、ソフトウェア アルゴリスムによ
りそれを補っている。その一方で、PIC18ファミリはハードウェア乗算器を有し、結果として相当早く乗算をこ
なす。
Nested calls Limitation(入れ子の呼出しの
呼出しの制限
しの制限)
制限)
入れ子の呼出しは、それ自身(再帰的な呼出し)へも、また別の関数へも、関数の本体内の関数呼び出しを意味す
る。
再帰関数呼び出しは、制限付きであるが、mikroCによりサポートされている。
再帰関数呼び出しは、PICのスタックやメモリの制限により、いかなる関数パラメータやローカル変数も含むこと
はできない。
mikroCは呼び出すために非再帰的な入れ子の関数の数を以下のように制限する。
-PIC12ファイミでは8コール
-PIC16ファミリでは8コール
-PIC18ファミリでは31コール
もしあなたがコード内で次の演算子*、/、%のいずれかを使用すれば、認められた入れ子の呼出しの数は、1つ
減ぜられる。もしあなたがプログラムの中で割り込みを使用する場合、それは更に多く減ぜられる。
減少数は割り込みから呼び出された入れ子の関数の数で特定される。関数リエントラント性(再入可能性)をチェッ
クすること。入れ子の呼出しの数が制限値をオーバーした場合、コンパイラはスタックオーバーフローエラーを報告
するだろう。
page
32
37
PIC16 仕様
Breaking Throuth Pages(
Pages(ページを
ページを突破する
突破する)
する)
PIC16をターゲットとしたアプリケーションにおいて、1ページ(2000命令)を超えるような単一ルーチ
ンがあってはならない。もしルーチンが1ページ内に収まらない場合は、リンカーがエラーを報告するであろう。
この問題に直面する場合は、おそらくあなたは、アプリケーションの設計を再考するべき-幾つかの小さな塊か何か
の中に個々のルーチンを分割しようと試みる-である。
FSRを
FSRを通じたインダイレクトア
じたインダイレクトアプローチ
インダイレクトアプローチの
プローチの限界
PIC16のポインターは“near”である。つまり、それらはアドレスの下位8ビットのみ移動する。
コンパイラは自動的に始まりから9ビットまでをクリアし、それ故にポインタはバンク0と1を参照するだろう。
ポインタ経由でバンク3,4内のオブジェクトをアクセスするためには、ユーザーは手動でIRPを設定し、操作後
にゼロに戻すべきである。
前述した決まりはいかなるインダイレクトアプローチにも適用される。つまり、アレイや構造体やユニオンアサイン
など。
注:もしこのアプローチに従う計画があるならば、当然、IRPに注意することは重要である。
もしあなたが、この考えが余りに変数が多すぎて不適当であることに気が付けば、PIC18へのグレードアップを
考えるにちがいない。
注)もしあなたがコード内に多くの変数を有するならば、リンカー命令 absolute を再編集しよう。
直接的にアプローチされる変数は、効率を上げるため、バンク3,4へ移動すべきである。
page
33
38
mikroC 仕様
ANSI 標準仕様
ANSI C 標準との
標準との相違点
との相違点
mikroCはANSI C標準とはほんの少し距離があるだけである。
これらの相違のいくつかは、PICプログラミングを容易にするための改善点であり、その他はPICmicroの
ハードウェアの制限の結果である。
簡便なスタックがなく、また制限されたメモリのため、再帰関数は制限付きでサポートされている。
PIC仕様(Specifics)を参照せよ。
変数を指すポインタや定数を指すポインタには互換性がない。例えば、両ポインタ間で、配置(アサイン)又は比
較は不可能である。
mikroCは“真の定数”
(C++)のような const修飾子で宣言された識別子を取り扱う。
これはANSI Cが定数表現を期待するはずの場所において const オブジェクトを使用することを可能にす
る。
もし使いやすさを求めるならば、定数を定義した伝統的なプロセッサーを使用すること。
Type Quarifier and constants(修飾子や定数の型)を参照せよ。
mikroCはC++スタイルの1行コメントに2つの隣り合ったスラッシュ(//)の使用を可能にする。
構造下の特徴。無名のstructureとunionである。
処理系定義 Behavior
ANSI標準のある章は、処理系定義Behavior を載せている。
これは、あるCコードの正確な動作はコンパイラからコンパイラへ変化可能である、ということを意味する。
ヘルプの至る所の章で、どのようにmikroCコンパイラがそのような状況で動作するのか、を記述している。
最も注目すべき仕様は、浮動小数点型、ストレージクラス及びビットフィールドを含む、という点である。
page
34
39
定義済Globals
定義済Globalsと
GlobalsとConstants
PICプログラミングを容易にするため、mikroCは多くの定義済globalsやconstantsを実
行する。
全てのPIC SFRレジスタは暗示的にvolatile unsigned shortのglobal変数
として定義される。
これらの識別子は外部リンクを有し、全プロジェクトにおいて可視的である。
プロジェクトを生成するとき、mikroCは有効なSFRと定数(T0IE、INTF などのような)を含んだ適切な
.defファイルを含むであろう。
識別子は全て大文字であり、マイクロチップのデータシートの命名法と同一である。
定義済globalsやConstantsの完全な設定のため、あなたのmikroC命令フォルダ内の“Def
s”を探すか、指定の文字(エディタのCtrl+Space)に対してコードアシスタントを調査する。
個別の
個別のビットの
ビットの操作
mikroCは8ビット変数、char型、unsigned shortの個々のビット操作を可能にする。
識別子F0、F1、
・・・、F7の内の1つに続く変数とダイレクト メンバ セレクタ(.
)を単純に使用してみよ
う。
例えば、
// If RB0 is set, set RC0:
if
(PORTB.F0)
PORTC.F0 = 1;
いかなる特別な宣言に対しても必要ない。つまり、このような選択的操作の類はmikroCに本来備わっている
特徴であり、コード内のどこでも使用可能である。
識別子F0-F7は敏感になるような事例ではなく、明確なネーム空間をもつ。
あなたが提供された個々のチップに精通しているなら、あなたは名前によりビットをアクセスすることも可能だ。
INTCON.TMR0F= 0; //Clear TMR0F
レジスタ/ビット名に関する更なる情報については「定義済 Globals と Constants」を参照せよ。
注)ポータブル性(簡便性)を求めるなら、個々のビットを操作するこの形式を避け、代わりにビットフィールドを
使用すること。
page
35
40
Interrupts(割
Interrupts(割り込み)
割り込みは、予約済のワード割り込みにより容易に取り扱うことが可能である。
mikroCは再度宣言することができない割り込み関数を暗黙に宣言する。
そのプロトタイプ(原型)は次の通り。
Void interrupt (void);
あなたのアプリケーションにおける割り込みを取り扱うために、あなた自身の定義(関数本体)を記述しよう。
割り込みに入るときとリターン時に急に戻る場合、milroCはスタック上の次のSFRをセーブする。
PIC12とPIC16:W,STATUS,FSR,PCLATH
PIC18ファミリ:FSR(素早い文脈がWREG、STATUS、BSRを保存しようとする。
)
注意)mikroCは低優先度の割り込みをサポートしていない。つまり、PIC18ファミリのため、割り込みは
高優先度であるべきである。
割り込みからの関数呼
みからの関数呼び
関数呼び出し
interrupt( ) ルーチン内部から関数を呼び出すことは、今や可能である。
コンパイラは、”interrupt”と”main”スレッド両方の中で使われているレジスタについて注意し、2つの
スレッド内で使用されてきたレジスタをセーブしつつ、2者間で”smart”コンテクスト スイッチング(
“機敏な”
前後関係の切替)を実行する。
Functions reentrancy(関数の再入可能性)を確認すること。
reentrancy
ここではTMR0から割り込みを遂行する簡単なサンプルを示す。
(もし他の割り込みが許されない場合)
void interrupt(){
counter++;
TMR0 = 96;
INTCON = $20;
} //
多重割り込みが許容される場合、あなたは発生した割り込みを判定する必要があり、それから最適なコード(割り
込みの取扱い)を続行する。
page
36
41
リンカの
リンカの擬似命令
mikroCはメモリ内にオブジェクトを分配するために内部的なアルゴリスムを使用する。
もしユーザーが特定の定義済のアドレスで変数またはルーチンを有する必要があるならば、リンカー擬似命令 ab
solute と org を用いよう。
Direcrive absolute
擬似命令 absolute は、有効なRAMにおける開始アドレスを指定する。もし変数が複数バイトである
ならば、上位のバイトは連続する場所に保存される。擬似命令 absolute は変数の宣言に追加される。
int foo absolute 0x23;
// 変数はアドレス 0x23 と 0x24 で 2 バイトを占めるであろう。
あなたが誤って2つの変数を重複する可能性があるように、absolute 命令を使用するときは注意すべき
である。
char I absolute 0x33;
// 変数 i はアドレス 0x33 で1バイトを占有するであろう。
Long jjjj absolute 0x33;
// 変数は 0x30,0x31,0x32,0x33 で4バイトを占有し、
// 変化する i が同時に最上位バイトを jjjj に変える。
擬似命令 org
擬似命令 org はROMにおける開始アドレスを明言する。
擬似命令 org は関数定義に付加される。未定義の宣言に適用された命令は、リンカによって発せられた適切
な警告を伴い、無視される。
擬似命令 org は割り込みルーチンへは適用できない。
ここに簡単なサンプルがある。
Void func(char par) org 0x200{
// 関数はアドレス 0x200 でスタートするであろう。
nop;
}
page
37
42
Code Optimization(
Optimization(コード最適化
コード最適化)
最適化)
オプティマイザーは、生成された多くのコードを縮小し、その実行を高速化するというコンパイラの利便性をずっ
と増大してきた。
主な特徴は次の通り。
Constant folding(一定
folding(一定の
一定の折り畳み)
コンパイル時間(言い換えれば、一定である)中に評価されうる全ての式は、それらの結果により再配置される。
(3+5->8)
Constant propagation
定数値がある変数に割当てられた場合、コンパイラはこれを認識し、変数の値が不変のままである限り、定数の次
に来るコード内の変数の用途を置き換える。
Copy propagation
コンパイラが2つの変数が同じ値を有することを認識し、もっと先のコード内のそれらのうちの1つを取り除く。
Value numbering
もし2つの式が同一の結果をもたらすならば、コンパイラは“認識”し、それ故にそれらの内の1つに対し全計算
結果を除去できる。
“Dead code”
code” elimination(無用
elimination(無用な
無用なコードの
コードの除去)
除去)
プログラム内で他のどこにも使われていないコードの断片は、アプリケーションの最終結果に影響しない。
それらは自動的に削除される。
Stack allocation(スタック
allocation(スタック割当
スタック割当て
割当て)
複雑な式に対し最小のスタック消費で評価することができるよう、テンポラリ レジスタ(”Stack”)は、よ
り合理的に使われる。
Local var optimization(ローカル
optimization(ローカル変数
ローカル変数の
変数の最適化)
最適化)
もし、それらの結果がいくつかのglobal又はvolatile変数に影響を与えないならば、使用されるロ
ーカル変数はない。
Better
Better code generation and local optimization
(より良
より良いコード生成
コード生成と
生成とローカルな
ローカルな最適化)
最適化)
コード生成はより論理的で、多大な処理で出力コードの大きさを更にまた縮小するコード”building br
icks”(積み木)のための明確な解決策を実行してきた。
page
38
43
Indirect Function Calls(間接的
Calls(間接的な
間接的な関数呼び
関数呼び出し)
もし、リンカが(関数へのポインタによる)間接的な関数呼び出しに遭遇した場合、どの関数も、またプログラム
内のどこかへ飛ばされるアドレスでも、その地点で呼び出される可能性がある、と思うのは当然である。
関数が現在の関数から間接的に呼び出される可能性のあるリンカを指示するための #pragma funcal
l 命令を使おう。
#pragma funcall<func_name><called_func>[ , <called_func>, … ]
対応する pragma は、関数 func_name が実行されるソースモジュール内に配置されねばならな
い。このモジュールは、called_func 表の中に載せられた全ての関数の宣言をも含まねばならない。
もし関数 func_name がそれらの内の1つでも呼び出されようとそうでなかろうとも、コード内で呼び出
されるならば、called_func 表の中に載せられた全ての関数はリンクされるだろう。
注)#pragma 関数呼出し命令は、コンパイルされたスタック内の関数フレームの割当てを最適化するためにリ
ンカを手助けすることが可能である。
page
39
44
Lexical Elements(字句要素)
これらのトピックスはmikroCの字句要素の形式的な定義を提供する。
それらは言語により認識される言葉に似た単位(トークン)という異なった範疇を記述する。
コンパイルのトークン化段階において、ソースコードファイルはトークン(認識可能な単位となる語、変数名や演
算子など)とホワイトスペース(余白、空白)に構文解析される(つまり、バラバラにされる)
。
mikroCにおけるトークンは、コンパイラとその埋め込みプリプロセッサによりあなたのプログラムを実行させ
る一連の演算子に由来する。
mikroC プログラムは、
(mikroCエディタのような)最適なテキストエディタを使用したキー入力によ
り作られたソースコードを意味するASCII文字の連続として開始する。
mikroCの基本的なプログラム単位はファイルである。これは、RAM内又はディスク上で配置され、そして
拡張子 .cを有する、命名されたファイルに常に一致する。
Whitespace(余白
Whitespace(余白)
余白)
余白とは、た空白(blanks)
、水平及び垂直タブ、新しい行の文字及びコメントに与えられた集合的な名前で
ある。 余白は、トークンの始まりと終わりの場所を示すのに役立つが、この機能以上に、いかなる余りの余白も捨
てられる。例えば、次の2つのシーケンスである。
Int I,;float f;
と
int I;
float f;
は語彙的に同等であり、6つのトークンを与えることと同等に構文解析する。
余白を意味するASCII文字は、それらが通常の構文解析過程から保護される(それらが文字列の一部として残
る)場合に、リテラル文字列の中で発生し得る。
page
40
45
Comments
コメントはプログラムに注釈をつけるために使われるテキストの一節であり、技術的な余白の別の形式である。
コメントはプログラマの利用目的のためだけにある。つまり、それらは、構文解析の前にソース本文から外されると
いうことである。
コメントを叙述するためには2つの方法がある。つまり、C方式とC++方式である。
どちらもmikroCによりサポートされている。
C comments
Cのコメントは、一対のシンボル /* の後に置かれたある一連の文字である。
コメントは頭文字 /* に続く */ の対という最初の出現で終わる。
四つのコメント区切り文字を含むすべてのシーケンスが、マクロ展開の後に1つの空白により再配置される。
mikroc内の
int /* type */ i /* identifier */ ;
は、以下のように構文解析される。
int i;
mikroCは、/* */を使用する面倒なトークン貼付方法をサポートしてはいないことに注意すること。
更なるトークン貼付けについては、プロセッサ トピックスを参照せよ。
C++コメント
C++コメント
mikroCでは、2つの隣接したスラッシュ(//)を使用する1行のコメントが可能である。
コメントはどの場所でも始めることができ、次の新しい行まで拡張できる。
次にようなコード、
int
i; // this is a comment
int
j;
は以下の通りに構文解析される。
int i;
int j;
page
41
46
mikroC ICD(インサーキットデバッガ)
mikro ICDはハードウェアレベルのリアルタイムデバッグに非常に効果的なツールである。
ICDデバッガはホストPICマイクロコントローラ上でmikroCプログラムを実行し、プログラムが実行して
いるように、変数の値、スペシャルファンクションレジスタ(SFR)
、メモリ及びEEPROMを見ることをあなた
に可能にする。
もし、あなたが mikro ICD を使用するための適切なハードウェアとソフトウェアを有するなら、あな
たはリリース ビルド タイプまたはICDデバッグ ビルド タイプのいづれかを選択するために、あなたのプロ
グラムの書き込みを完了しなければならない。
あなたがICDデバッグ ビルド タイプを選択した後は、いよいよあなたのプロジェクトをコンパイルする時で
ある。あなたが自分のプロジェクトを首尾よくコンパイルしたら、F11ショートカットを用いてPICをプログラ
ムしなければならない。首尾よくPICプログラミングした後は、ドロップダウンメニューから Debugger
>Select Debugger>mikro ICD Debuggerを選択することにより、mikro
ICD を選択しなければならない。
page
42
47
あなたはドロップダウンメニューから Run>Debug を選択するか、Debug アイコンをクリックす
ることで mikro ICD を実行できる。
デバッガを始めることは更なるオプションを有効にする。それは、 Step Into,Step Over,R
un to Cursol,など。
実行されるべき行はカラーの明るい表示色となる。
(デフォルトは青)
プログラムの実行に関しての告示もまたあり、Watch Window(黄色のステータスバー)上に見つけられ
る。プログラムの実行中には Watch Window が表示されるので、ある関数は実行に時間がかかること
に注意しよう。
page
43
48
mikro ICD Debegger Options
名前
解説
ファンクションキー
Debug
デバッガ スタート
F9
Run/Pause
デバッガ スタート又は一次停止
F6
Toggle
現在のカーソル位置のブレイクポイントを交互に切り替える。全ブレークポイ F5
Breakpoints
ントを見るには、ドロップダウンメニューから Run>View Breakpoints
を選択する。ウィンドウのリスト内の項目をダブルクリックすると、ブレイク
ポイントを置く。
Run to cursol 現在の命令とカーソル位置の間の全ての命令を実行する。
Step Into
F4
現在のC(シングル又はマルチサイクル)命令を実行し、それから一時停止す F7
る。もし命令がルーチン呼出しの場合は、ルーチンに入って呼出しの次の最初
の命令で一次停止する。
Step Over
現在のC(シングル又はマルチサイクル)の命令を実行し、一次停止する。も F8
し、命令がルーチン呼出しの場合は、それを飛ばし、呼出しの次の最初の命令
で一次停止する。
Flush RAM
現在のPIC RAMを書き出す。全ての変数値が watch Window から値に N/A
したがって書き換えられる。
page
44
49
mikroC ICD Debugger Examples
ここに mikro ICD デバッガのサンプルを段階的に示す。最初にあなたはプログラムを書かねばならな
い。われわれは mikro ICD がどのようにこのサンプルを用いて動作するのかを示そう。
首尾よくコンパイルしたら、mikro ICDを始めるためにPIC 書き込みのF9を押す。
mikro ICD初期化の後、青い有効な行が現れるはずである。
page
45
50
われわれは1行ごとにプログラムをデバッグして行こう。
F8を押すことで、われわれは1行ごとにコードを実行している。
ユーザーはディレイルーチンとディレイを含んだルーチンを通してStep Into[F7]とStep Ove
r[F8]を使用しないことを推奨する。
その代わり、Run to cursol[F4]とブレークポイント機能を使用する。
あらゆる変化はPICから読み込まれ、Watch Windowにロードされる。
TRISDが255から0へ値を変化したことに注意すること。
page
46
51
Step Into[F7]とStep Over[F8]は、ステッピング モードで使用される mikro I
CD デバッガの機能である。それらは mikro ICD によってサポートされたリアルタイムモードでもあ
る。
リアルタイムモードで使用される機能は、Run/Pause Debugger[F6]とRun to cur
sol[F4]である。
F4を押すと、ユーザーにより選択された行へ進む。ユーザーは正にカーソルで行を選択しなければならず、F4を
押し、選択された行に到達するまでコードが実行される。
Run(Pause) Debugger[F6]とToggle Breakpoints[F5]は、リアル
タイムモードで使用されるmikro ICD デバッガの機能である。
F5を押すとブレークポイントからユーザーにより選択された行に印をつける。
F6はブレークポイントに到着するまでコードを実行する。
ブレークポイントに到着した後、デバッガは一次停止する。
われわれのサンプルのここで、われわれは文字でLCDに”mikro Elektronika”を書くためにブレ
ークポイントを使用してみよう。
ブレークポイントはLcd_Chrに設定し、この関数に到達するといつでもプログラムが停止するであろう。
ブレークポイントに到着後、再びプログラムを継続するために、われわれはF6を押さねばならない。
page
47
52
ブレークポイントは二つのグループに分けられて来た。それらはハードウェアとソフトウェアのブレーク ポイント
である。ハードウェアのブレークポイントはPIC内に配置され、それらは最速のデバッグに備えるものである。
ハードウェア ブレークポイントの数には(P16では1、P18では1または3)制限がある。もし、ハードウェ
ア ブレークポイントが使用されれば、使用されるであろう次のブレークポイントは、ソフトウェア ブレークポイ
ントである。それらのブレークポイントは mikro ICD 内に配置され、それらはハードウェア ブレーク
ポイントをシミュレートする。ソフトウェア ブレークポイントはハードウェア ブレークポイントよりもずっとゆ
っくりである。ハードウェアとソフトウェアの相違点間の差は、mikro ICD ソフトウェア内で見ることは
できないが、それらの異なったタイミングは全く顕著である。それ故に2つのタイプのブレークポイントがあること
を知ることは重要である。
page
48
53
mikro ICD(In-Circuit Debugger) Overview
Watch Window
デバッガ ウォッチ ウィンドウは、あなたのプログラムを実行している間、プログラムの項目を監視することが
できる主なデバッガ ウィンドウである。
ウォッチ ウィンドウを画面に出すためには、ドロップダウンメニューから View>Debug Window
s>Watch Window を選択する。
ウォッチ ウィンドウは、それらのアドレス及び値と共に変数とPICのレジスタを表示する。あなたがシミュレー
ションを行う時、値は更新される。あなたが監視したい項目を追加及び削除するため、ドロップダウンメニューを使
うこと。最新の変化した項目は赤で色つけされる。
1つの項目をダブルクリックすると、選択した変数/レジスタに新しい値を割当てる事ができるEdit Val
ue Window が開く。また、選択した項目をバイナリ(2進)
、HEX(16進)
、char(文字)
、デシマ
ル(10進)にビュー変更することも可能である。
page
49
54
View EEPROM Window
mikro ICD EEPROM ウィンドウはドロップダウンメニュー、View>Debug Windo
ws>View EEPROM から有効にできる。
EEPROMウィンドウはPIC内部のEEPROMメモリに書き込まれた現在の値を表示する。
EEPROMウォッチ ウィンドウ-Flush(フラッシュ) EEPROMとRead EEPROM-に関連
している二つの操作ボタンがある。FLASH EEPROMはPIC内部のEEPROMメモリ内のEEPROM
ウィンドウからデータを書く。Read EEPROMはPIC内部のEEPROMメモリからデータを読み、EE
PROMウィンドウ内にそれを入れる。
page
50
55
View Code Window
mikro ICD View Code Windowはドロップダウンメニュー View>Debug
View>Debug W
indows>View Code から有効になる。
View Code WindowはPICに書かれたコード(16進コード)を表示する。
View Codeウォッチ ウィンドウ-Read
Read Code-に関係する動作ボタンがある。
Code
Read CodeはPICからコードを読み、View
Code Windowにそれを入れる。
Code
page
51
56
View RAM Window
デバッガ View RAM Windowはドロップダウンメニュー、View>Debug
View>Debug Windows
>View RAMから
AMから有効になる。
から
View RAM Windowは、最新の変化した項目を赤い色をつけて、PICのRAMのマップを表示する。
Common Errors(共通
Errors(共通の
共通のエラー)
エラー)
-mikro ICDが実行中に、PICをプログラムしようとしている
-プログラムのリリース ビルド タイプ バージョンをデバッグしようとしている
-コンパイルもされずPICにプログラムもされていない、変更したプログラムコードをデバッグしようとしている
-Run to cursol[F4]とToggle Breakpoints[F5]機能に対し、空の行を選
択しようとしている
page
52
57
Tokens(トークン)
トークンは、コンパイラにとって意味のある C プログラムの最小の要素である。
パーサー(構文解析プログラム)は、左から右へのスキャンで可能な限り入力文字を使用して最も長いトークンを生
成する事により、入力ストリームからトークンを分割する。
mikroC は次の種類のトークンを認識する。
-キーワード
-識別子
-定数
-オペレータ(演算子)
-パンクチュエイタ(区切り文字としても知られる)
トークン抽出
トークン抽出の
抽出の例
これはトークン抽出の例である。次のコードシーケンスをみてみよう。
inter=a+++B;
最初に、inter は、識別子 er に随伴するキーワード int というよりは、単一識別子として構文解
析されることに注意しよう。
コードを書いたプログラマーは次のように書こうとしたに違いない。
inter=a+(++b)
しかし、それはその通りに動かないだろう。コンパイラは次の7つのトークンとしてそれを構文解析しようとするだ
ろう。
inter
//identofier(識別子)
=
//assignment operator(代入演算子)
a
//identofier(識別子)
++
//postincrement operator(ポストインクリメント演算子)
+
//addition operator(加算演算子)
b
//identofier(識別子)
;
//semicolon separator(セミコロン区切り文字)
+++は、+に随伴する++(可能な最長のトークン)として構文解析されることに注意しよう。
page
53
58
Constants(定数)
定数またはリテラルは決まった数値または文字の値を表すトークンである。
mikroCは次をサポートする。
-整数定数
-浮動小数定数
-文字定数
-文字列定数(ストリング リテラル)
-列挙定数
定数のデータ型は、ソースコード内で使われる数値やフォーマットのような手がかりを用いて、コンパイラにより推
測される。
Integer constants
整数定数は、10進(10を基本)
、16進(16を基本)
、2進(2を基本)または8進(8を基本)がある。
主要な接尾辞が欠落した場合はすべて整数定数のデータ型はその値に由来する。
Long and Unsigned suffixes
どんな定数にも付けられる接尾辞 L(またはl)は、定数を強制的にlongとして意味付けする。
同様に接尾辞U(またはu)は定数を強制的にunsignedにする。
あなたは、いかなる順序や事例(ul、Lu、UL等)においても同じ定数にLとU2つの接尾辞を使用可能である。
どの接尾辞(U,u,Lまたはl)が欠落しても、定数は、その値(short,unsigned short,
int,unsigned int,long int,unsigned long int)を収容可能な、次
の”smallest”(最小の)型タイプを割当てられる。
page
54
59
Otherwise:
Otherwise:
もし、定数がUまたはu接尾辞を有するならば、そのデータ型はその値を収容可能な次のものを先頭とするであろ
う。つまり、unsigned short,unsigned int,unsigned long int で
ある。
もし、定数がLまたはl接尾辞を有するなら、そのデータ型はその数値を収容可能な次のものを先頭とするであろ
う。つまり、long int,unsigned long int である。
もし、定数がUまたはL接尾辞(ul、lu、Ul、lU、uL、Lu、LUまたはUL)を有するなら、そのデ
ータ型タイプは unsigned long int となるはずである。
Decimal Constants
-2147483648から4294967295までの10進定数が使用を許されている。
これらの範囲を超える定数は、
“out of range”
(範囲外)エラーを生ずるだろう。
10進定数は頭文字にゼロを使用すべきではない。
頭文字にゼロを有する整数定数は8進定数として解釈される。
主な接尾辞が欠落するとすべて10進定数のデータ型はその値を元に派生する。それは以下の通り。
Hexadecimal Constants
0x(0X)で始まる全ての定数は16進数と受け取られる。
主な接尾辞を欠落するとすべて、上に示した規則に従って、16進定数のデータ型はその値を元に派生する。
例えば、0xC367は unsigned int として取り扱われるであろう。
page
55
60
Binary constants
0b(または0B)で始まる全ての定数は2進数と受け取られる。
主な接尾辞を欠落すると、すべて上に示した規則に従い、2進定数のデータ型はその値を元に派生する。
例えば、0b11101は short として扱われるであろう。
Octal constants
頭文字がゼロの定数はすべて8進数と受け取られる。
もし8進定数が無効な数字8または9を含む場合、エラーが報告される。
主な接尾辞を欠落すると、すべて上に示した規則に従い、8進定数のデータ型はその値を元に派生する。
例えば、0777は int として取り扱われるであろう。
Floarting
Floarting Point Constants(不動小数点定数
Constants(不動小数点定数)
不動小数点定数)
浮動小数点定数は以下の型から成る。
-10進整数
-10進小数点
-10進小数
-e または E 及び a 極性有り整数指数(自由選択)
-型接尾辞:fまたはFまたはlまたはL(自由選択)
あなたは10進整数または10進小数(両方同時ではないが)のいづれかを省略できる。
あなたは10進小数点または文字 e(または E)のいづれか、また極性有り整数指数(両方同時ではないが)を
省略できる。
これらの規則は慣習的および科学的(べき指数)表記法に対し許される。
負の不動小数点定数は、単項演算子マイナス(-)接尾辞を伴う正の定数として扱われる。
mikroCは不動小数点定数を次の範囲に制限する。
±1.17549435082E38
.
. ±6.80564774407E38
mikroC浮動小数点定数は double型 である。
ANSI標準のmikroCの実行において,float と double(long double の変形型
と共に)は同一型と見なされる点に注意しよう。
page
56
61
Character Constants
文字定数は、
‘A’
、
‘+’または‘\n’のように単一引用符で囲まれる一つまたはそれ以上の文字である。
Cにおいて単一文字定数はデータ型 int となる。多数の文字定数は文字列定数又は文字列リテラルとして参照
される。更なる情報については String Constants(文字列定数)を参照すること。
Escape sequences
バックスラッシュ文字は、ある非グラフィク文字の視覚的表現を許容するエスケープシーケンスを始めるのによく
使われる。最も知られたエスケープ定数の一つは改行文字(\n)である。
バックスラッシュは、その値に一致するASCIIシンボルまたは制御コードを表現するため8進又は16進数と
共に使われる。例えば、クエスチョンマークに対応する‘\x3F’
。
あなたは、その値がデータ型 char の正しい範囲(mikroCでは0~0xFF)内であることを規定され
たエスケープシーケンスで、最大3桁の8進数の文字列または16進数ならいくつでも使用可能である。
より大きな数は、コンパイラ エラー“数値定数が大きすぎる”を発生することになる。
例えば、8進数 \777 は許容される最大値(\377)よりも大きく、エラーが発生することになる。
8進または16進数エスケープシーケンスにおいて遭遇した最初の非8進または非16進文字は、シーケンスの終わ
りを示す。
注)あなたは、オペレーティングシステムのパスに使用するように、ASCIIバックスラッシュを表すため\\ を
使用しなければならない。
page
57
62
次の表はmikroCにおける有効なエスケープシーケンスを示す。
page
58
63
String Constants
文字列リテラルとしても知られる文字列定数は、固定した連続文字を保存する特別なタイプの定数である。
文字列リテラルは2つの引用符で囲った多数の連続文字である。
“This is a string.
”
ヌル文字列または空の文字列は“ ”のように書かれる。リテラル文字列は、与えられた連続文字+最後のヌル文字と
して内部的に記憶される。ヌル文字列は単一ヌル文字として記憶される。
2つの引用符内の文字はエスケープシークンスを含むことが可能である。例えば、
“\t\”Name\”\\\tAddress\n\n”
フェーズの構文解析をしている間、余白によってのみ分離された隣接する文字列リテラルは連結させる。
例えば、
“This is ”
“just”
“ an example.”
は、次に等しい。
“This is just an example.”
Line continuation with backslash
あなたは、行の境界をまたいだ文字列定数を拡張するための継続文字としてバックスラッシュ(\)を使用するこ
とも可能である。
“This is realy \
a one-line string.”
page
59
64
Enumerarion constants
列挙定数は enum 型宣言で定義される識別子である。この識別子は、読みやすさを補助するためのニーモニッ
クスとしてよく選択される。列挙定数は int 型である。それらは整数定数が有効な表現ならどこでも使用可能であ
る。
例えば、
enum weekdays {SUN = 0, MON, TUE, WED, THU, FRI, SAT};
使われた識別子(列挙型)は、enum宣言の範囲内にただ一つでなければならない。負の初期化子が許容されて
いる。enum宣言の詳細は Enumerations 見よ。
Ponter Constants
Constants
ポインタまたは指示したオブジェクトは const 修飾子で宣言することが可能である。constとして宣
言されたものは全て、変化する値を持つことができない。定数オブジェクトの非譲渡性に間違いなく背くようなポイ
ンタを作ることもまた無効である。
Constant Expressions
定数の表現は、常に定数を評価し、且つ定数(リテラル)または記号定数でのみ成り立つ表現である。それはコン
パイル時間を評価され、またその型に対する表現可能な値の範囲内にある定数を評価しなければならない。定数表現
は正に規則通りの表現であるかどうかを評価される。
定数表現は次の、リテラル、列挙定数、単純定数(定数配列または構造体ではない)
、sizeof 演算子のみで構
成され得る。演算子が sizeof 演算子のオペランド内に含まれない限り、定数表現は次の演算子のいづれも
含むことができない。それはAssignment, comma, decrement, Function ca
ll, incrementである。
あなたは、定数が文法的に有効な場所ならどこでも定数表現を使用可能である。
page
60
65
Keywords(キーワード)
キーワードは特別な目的のために予約された単語であり、通常の識別子名として使用してはならない。
標準的な C キーワードに比べると、全てに関連のあるSFRは、再定義されえない(例えば、TMR0、PCL、
など)グローバル変数や予約語の表現として定義される。
特定の字句(エディタにおける Ctrl+Space)についてはCode Assistantを綿密に調べ
るか、Predefined Globals及びConstants(定義済グローバルと定数)を参照せよ。
これはCにおけるキーワードのアルファベット順のリストである。
また、mikroCはライブラリで使用される多くの定義済識別子をも含む。もしあなたが自身のライブラリを開
発するつもりならば、それらをあなた自身の定義により再配置できるだろう。
page
61
66
Identifiers(識別子)
識別子は、関数、変数、記号定数、ユーザー定義のデータ型及びラベルに与えられた任意の名前の長さである。
全てのこれらのプログラム要素はヘルプの至る所でオブジェクトとして参照されるだろう。
(オブジェクト指向のプロ
グラミングにおけるオブジェクトの意味と混同すべきではない)
識別子は文字aからz、アンダースコア文字“_”
、数字0から9までを含むことができる。
最初の文字だけは、文字又はアンダースコアでなければならないという制限がある。
Case Senstivity(大文字小文字の区別)
Senstivity(
Sum、sumおよびsuMは同じ識別子を意味するので、mikroCの識別子は現在は大文字小文字を区別し
ない。しかしながら将来のmikroCのバージョンでは、大文字小文字の区別を活性中/停止中とするオプション
を提供するだろう。現在の例外は、
小文字で書かれねばならない予約語 mainとinterruptのみである。
Uniqueness and Scope(唯一性と有効範囲)
Scope
識別子名は(明言された規則内では)任意であるけれども、もし同じ名前が、同じ有効範囲(Scope)内で、
且つ同じ名前の空間内で一つの識別子よりも多く使用されると、結果としてエラーが発生する。重複した名前は、有
効範囲(Scope)の規則に関わらず、異なった名前の空間に対し有効である。
有効範囲(Scope)に関する更なる情報は、Scope and Visibilityを参照せよ。
page
62
67
Punctuators(区切り子)
mikroC 区切り子(区切り文字としても知られている)は、角括弧、丸括弧、大括弧、コンマ、セミコロン、
コロン、アスタリスク、イコール記号、ポンド記号を含む。これらの区切り子のほとんどは演算子としても機能する。
Brackets
ブラケット(角括弧)
[ ]は、一次または多次元配列の添え字をあらわす。
char ch, str[ ]
=
“mikro”;
int mat[3][4]; /* 3 x 4 matrix*/
ch = str[3];
/* 4 th elements */
Parenthes
パレンシス( )は式を集団にまとめ、条件付式を分け、関数呼出しや関数パラメータを表示するのに使用される。
パレンシスは、展開の最中、潜在的な優先権の問題を避けるため、マクロ定義内で推奨される。
更なる情報は、Expressions and Operators Precedence(式と演算子の優先
権)を参照せよ。
page
63
68
Braces
ブレイス(中括弧)は複合文の始りと終わりを示す。
閉じているブレイス(中括弧)は複合文用の終端記号として役立つ、故に、構造体宣言内を除き、セミコロンは }
の後に要求されない。良くあることだが、次の文中のようなセミコロンは無効である。
更なる情報は、Compound Statements(複合文) を参照すること。
Comma
コンマ(,
)は関数の引数リストの要素を分離する。
コンマはコンマ式における演算子としても使用される。
2つのコンマを混ぜて使うのは無効あるが、あなたはそれらを区別するためにパレンシスを使用しなければならない。
(exp1,exp2)は双方を評価するが、二番目と同等であることに注意すること。
page
64
69
Semicolon
セミコロン(;)は文の終端記号である。セミコロンに続くいかなる有効なCの表現(空の表現を含んだ)も式文
として知られる文として解釈される。式は評価され、その値は捨てられる。もし式文が副作用をもたないならば、m
ikroCはそれを無視するにちがいない。
セミコロンは空の文を生成するためにときどき使用される。
for ( i = 0 ; i < n ; i++ ) ;
更なる情報はStatementsを見よ。
Colon
ラベル付き文を表示するためにコロン(:)を使おう。例えば、
start: x = 0 ;
…..
goto strat ;
ラベルはLabeled Statements(ラベル付き文)で議論する。
Asterisk(ポインタ
Asterisk(ポインタ宣言
ポインタ宣言)
宣言)
宣言内のアスタリスク(*)は、型を指すポインタの生成を意味する。
char *char_ptr;/* a pointer to char is declared */
あなたはアスタリスクをポインタ参照先の値の取得するための演算子として、また、乗算演算子として使用すること
も可能である。
i = *char_ptr ;
更なる情報はPointers(ポインタ)を参照せよ。
page
65
70
Equal Sign
等号記号(=)は初期化リストから有効な宣言を分離する。
int test[5] = { 1,2,3,4,5} ;
int x = 5 ;
等号記号は式内の代入演算子としても使用される。
int a, b, c ;
a=b+c;
更なる情報はAssignment Operators(代入演算子)を参照のこと。
Pound Sign(プリプロセッサ
Sign(プリプロセッサ命令
プリプロセッサ命令)
命令)
1つの行で最初の非余白文字としてあらわれた場合、ポンド記号(#)はプリプロセッサ命令をあらわす。それは
コンパイラの実行を意味し、必ずしもコード生成を伴うわけではない。
更なる情報はPreprocessor Directives(プリプロセッサ命令)を参照せよ。
#、##は、プリプロセッサがフェーズをスキャンしている間にトークンの再配置や連結を実行するための演算子と
しても使われる。Preprocessor Operators(プリプロセッサ演算子)を参照せよ。
page
66
71
Objects and Lvalues(オブジェクトと Lvalues)
Object(
Object(オブジェクト)
オブジェクト)
オブジェクトは固定値または変数値(またはひとまとめの数値)を保持することが可能なメモリの特別な領域であ
る。混乱を避けるために述べると、このワードオブジェクトの利用は、オブジェクト指向の言語で使用されるより一
般的な目的とは異なる。この言葉に関するわれわれの定義は、関数、変数、記号定数、ユーザー定義データ型とラベ
ルを含むであろう。
各々の値は、関連づけられた名前と型(データ型としても知られる)を有する。名前はオブジェクトをアクセスす
るために使用される。この名前は単一識別子であるか、さもなくば、個々にオブジェクトを参照する複雑な式である。
Object and Declarations(オブジェクト
Declarations(オブジェクトと
オブジェクトと宣言)
宣言)
宣言は識別子とオブジェクトの間のマッピングを行う必要性から成りたつ。各宣言はデータ型を伴う識別子を関連
付ける。
オブジェクトを伴う識別子を関連付けることは、少なくとも2つの属性を有することを各識別子に要求する。つま
り、ストレージクラスや型(ときどきデータ型として参照される)である。mikroC コンパイラは、ソースコ
ード内の暗示的又は明示的宣言からこれらの属性を推測する。
通例、型は明示的に指定され、ストレージクラス指示子は自動数値autoを仮定する。
一般的には、その宣言がソースコード内で指し示す前に、識別子がプログラム内で効果的に使われることは不可能
である。この規則(前方参照として知られる)の有効な例外は、未定義関数及び構造体またはユニオン タグと呼ば
れるラベルである。
宣言され得るオブジェクトの範囲は次のものを含む。
変数;関数;型;他の型の配列;構造体、ユニオン、列挙型タグ;構造体のメンバー;ユニオンのメンバー;列挙型
定数;ステートメント ラベル;プリプロセッサ マクロ
宣言子の構文の再帰的な性質は複雑な宣言子を許容する。もし複雑なオブジェクトを作成したいなら、あなたはお
そらく判読性改善のため、typedefs の使用を望むだろう。
page
67
72
Lvalues
lvalue はオブジェクト ロケータである。つまりオブジェクトを指定する式である。
lvalue式の例は、*Pであり、Pは非ヌルポインタを評価するためのある式である。
変更可能なlvalueは、メモリ内でアクセスしたり、有効に変更することが可能なオブジェクトに関係する識別
子または式である。
定数を指すconstポインタは、例えば、変更可能なlvalueではない。
定数を指すポインタは変更可能である。
(が、参照先から取得した値は不可。
)
歴史的には、lは、lvalueが合法的に代入文の左(受信の終了)に位置することを意味する“left”の
先頭である。今や、変更可能なlvalueのみが合法的に代入演算子の左に位置することが可能である。
例えば、もしaとbが、外付けのメモリに正確に配置された非定数型整数識別子であるならば、それらは変更可能な
lvalueであり、且つa=1やb=a+bが有効であるような割当てでもある。
Rvalue
式 a+b はlvalueではない。というのは、a+b=a は無効である、なぜなら、左の式はオブジェク
トに関連付けられていないからだ。
そのような式は時折rvalue(right valuesの略)と呼ばれる。
page
68
73
Scope AND Visibility(スコープとビジビリティ)
Scope
識別子のスコープは、識別子がそのオブジェクトをアクセスするために使用される可能性のあるプログラムの一部
分である。それらはスコープの異なったカテゴリである。つまり、ブロック(またはローカル)関数、関数プロトタ
イプ及びファイルである。これらは、どのように且つどこで識別子が宣言されるのかに依存する。
Block Scope
ブロック(またはローカル)スコープに伴う識別子のスコープは、宣言の位置に始り、宣言を含む(ブロックが取
り囲むブロックとして知られているように)ブロックの終わりで終了する。
関数定義に伴うパラメータ宣言もまた、関数本体のスコープに制限されるブロックスコープを有する。
File Scope
グローバルとしても知られるファイルスコープ識別子は、全てのブロックの外で宣言される。つまり、それらのス
コープは、宣言のポイントからソースファイルの終了までである、ということである。
Function Scope
関数スコープを有する識別子のみが、ステートメント ラベルである。
ラベル名はgotoステートメントと共に、ラベルが宣言される関数内ならどこでも使用されうる。
ラベルは、ステートメントに続けられるlabel_name を書くことにより暗示的に宣言される。つまり、ラ
ベル名は関数内にただ一つでなければならない。
Function Prototype Scope
関数プロトタイプ(関数定義の一部ではない)内のパラメータ宣言の一覧で宣言される識別子は、関数プロトタイ
プ スコープを有する。このスコープは関数プロトタイプの終わりで終了する。
page
69
74
Visibility
識別子のビジビリティ(可視性)は、有効なアクセスからのプログラムソースコードのリージョン(領域)が識別
子の、関連付けられたオブジェクトになりうる、ということである。
スコープ(有効範囲)とビジビリティは一般に同時に起きるけれども、オブジェクトが重複した識別子の出現によ
り一時的に隠される、という事情がある。
オブジェクトはまだ存在するが、重複した識別子のスコープ(有効範囲)が終了となるまで、独自の識別子はそれ
をアクセスするために使うことができない。
技術的には、可視性はスコープ以上ではないが、スコープは可視性以上でありうる。
次のサンプルを注意して見よう。
page
70
75
Name Spaces(名前空間)
名前空間は、識別子が唯一でなければならないスコープである。
Cは4つの異なった識別子のカテゴリを利用する。
Goto label names
これらは、宣言されている関数内で単独であらねばならない。
構造体、
構造体、ユニオン及
ユニオン及び列挙タグ
列挙タグ
これらは定義されているブロック内で唯一でなければならない。
関数の外部で宣言されたタグはすべて唯一でなければならない。
構造体、
構造体、ユニオンメンバー名
ユニオンメンバー名
これらは定義された構造体またはユニオン内で唯一でなればならない
異なった構造体内で同一のメンバー名を持つメンバーのタイプまたはオフセットに制約は無い。
変数、typedefs、
変数、typedefs、関
、typedefs、関数、列挙型メンバー
列挙型メンバー
これらは定義されたスコープ内で唯一でなければならない。
外部で宣言された識別子は、外部で宣言された変数の中にあって、唯一でなければならない。
重複した名前は、スコープの規則に関わらず、異なった名前空間に対し有効である。
例)
page
71
76
Duration(持続期間)
密接に記憶クラスに関連付けられた持続期間(デュレーション)は、宣言された識別子がメモリに配置された実際
の、物理的オブジェクトを有する間の期間で定義される。
われわれはまた、コンパイル時間とランタイムオブジェクトの間の違いをはっきり区別する。
例えば、typedefsとtypes とは似ていない変数は、
実行時間の間に配置された実際のメモリを有する。
それらは2種類の持続期間、staticとlocalである。
Static Duration
メモリには、実行が進むとすぐ、静的持続期間(Static duration)にオブジェクトが配置される。
つまり、この記憶域割当てはプログラムが終了するまでの期間だけ続く。
静的持続期間オブジェクトは、強制的にメモリモデルにしたがって配置される固定したデータセグメント内に、通常
は常駐する。globals はすべて静的持続期間である。どこで定義された関数も全て静的持続期間のオブジェ
クトである。他の変数は、明示的な static や extern 記憶クラス識別子を使用することで、静的
持続期間に与えられる可能性がある。
mikroCでは、静的持続期間オブジェクトは明示的な初期化子を欠いており、ゼロ(またはヌル)に初期化さ
れない。
オブジェクトは静的持続期間とローカル有効範囲を持つことが可能である。-次のページの例を参照せよ
Local duration
ローカル持続期間オブジェクトは自動オブジェクトとしても知られている。
囲まれたブロックまたは関数が入力される時に、それらはスタック上(またはレジスタ内)に生成される。
プログラムがそのブロックや関数を抜けるとき、それらは割付けを取り消される。
ローカル持続期間オブジェクトは明示的に初期化されねばならない。その一方で、それらの内容は予測できない。
記憶クラス識別子 auto はローカル持続期間変数を宣言する時、使用することが可能である。が、通常は余分
であり、何故なら auto は一つのブロック内で宣言された変数のデフォルトであるからである。
ローカル持続期間のオブジェクトもまたローカル有効範囲を有する。なぜなら、それは囲まれたブロックの外には存
在しないからである。逆は真ではない。ローカル有効範囲オブジェクトは静的持続期間を有することが可能である。
page
72
77
ここにローカル有効範囲だが異なった持続期間の2つのオブジェクトの例を示す。
page
73
78
Types(型)
Cは厳密には、コンパイル時に認識されるあらゆるオブジェクト、関数、式が厳密に定義された型をもつ必要があ
る言語で打ち込まれたものである。Cは数値の型と排他的に作用することに注意しよう。
type は以下のように役立つ。
-最初に要求された正しいメモリ配置を決定すること
-次に発生するアクセスの間にオブジェクト内で発見したビットパターンを解釈すること
-多くのtype確認の状況において、無効な割当てが引っかけられることを保証すること
mikroCは、さまざまなサイズの符号付き及び符合無しの整数、さまざまな精度の浮動小数、配列、構造体及
びユニオンを含んだ、多くの標準の(定義済の)
、及びユーザー定義のデータ型をサポートする。
加えて、これらのオブジェクトのほとんどを指すポインタをメモリ内に設定し、且つ操作することが可能である。
typeは、いかに多くのメモリがオブジェクトに割当てられ、またいかにプログラムがオブジェクトの記憶装置
割当ての中で発見したビットパターンを解釈するか、を決定する。
与えられたデータ型は、それらの値を許容する命令セットと共に、そのtype識別子が推測可能な値の一組(しば
しば処理系依存)として見られうる。
コンパイルタイム演算子、sizeof は、あなたにすべての標準的、またはユーザー定義の型のバイトサイズを
決定させるだろう。
mikroCは、一貫して、アクセス、割り込み、及びあなたのプログラム内の各活性オブジェクトに応じた、メ
モリ内のビットパターンの(可能な)変更を行うことができるので、mikroC標準ライブラリとあなた自身のプ
ログラムとヘッダーファイルは、あいまいな識別子(またはそれらに起因する式)や型に備えなければならない。
Tpye Cathegories
fundamental型は、これ以上小さな部分に分割されえない型意味する。それらはときどき非構造化型と
して参照される。
fundamental型は、これらのあるものとは異なったshort、long、signed及びunsig
nedと共にvoid、char、int、floatとdoubleである。
derived 型(構造型)は構造化された型としても知られる。構造型は他の型、他の型の配列、関数型、構造
体、ユニオンを指すポインタを含む。
page
74
79
P75
Fundamental Types(基本的な型)
Arithmetic type
算術型識別子は次のキーワードから作られる。それは接頭辞short、long、signed、unsign
edと共にviod、char、int、float、doubleである。これらのキーワードからあなたは整数
および浮動小数型を作ることができる。次のページに型のあらましを示す
Integral type
それらの変異型と共にcharとint型は整数データ型を考慮されている。
変異型は、接頭修飾子 short、long、signed及びunsignedの1つを使用することにより作
られる。
以下の表は整数型-丸括弧内のキーワードは省略される可能性がある
(且つしばしば省略される)
-の概要である。
修飾子 signedとunsignedはcharとintの両方に適用される。unsigned接頭辞がな
いばあいは、signedが自動的に当然整数型として決定される。唯一の例外は、デフォルトとして符号なしとさ
れるcharである。キーワードsignedとunsignedは、それら自身使用されるとき、符号付きint
及びunsigned intをそれぞれ意味する。
修飾子short及びlongはintにのみ適用され得る。それら自身で使用されるキーワードshort及び
longは、short int及びlong intをそれぞれ意味する。
Floating-point
Floating-point Types
long double変異型と共にfloat及びdouble型は浮動小数点型を考慮されている。
ANSI標準のmikroCの実行では、3つとも全て同一型であるよう考慮されている。
mikroCにおける浮動小数点は、マイクロチップ AN575 32ビットフォーマット(IEEE754準拠)
を使用することで実行される。
page
75
80
P76
以下は算術型の概要である。
page
76
81
Enumerations
列挙型データタイプは抽象的で離散的な、適切な記号名を伴う値の一式、を示すために使用される。
Enumeration Declaration
列挙型はこのように宣言する。
enum tag { enumeration-list } ;
ここで tag は列挙型の任意の名前である。enumeration-list は離散的な値、列挙子のリ
ストである。 中括弧内に表した列挙子は列挙型定数としても知られる。
それぞれは固定した整数値を割当てられる。
明示的な初期化子が無い場合、最初の列挙子がゼロに設定され、次に続く各列挙子は先行するものから1に設定され
る。
enum型の変数は全ての他の型の変数と同様に宣言される。
例えば、次の宣言
enum colors { black, red, green, blue, violet, white } ;
は、唯一の整数型 colors 、この型の変数 c及び定数整数値(black=0、red=1、
・・・)に伴
う列挙子一式で成り立つ。Cでは、列挙された型の変数にはすべてint型-それが強制されるまでチェックされる
型はない-の値を割当てることができる。
即ち、
c = red ; // OK
c=1;
// Also OK, means the same
明示的な整数初期化子と共に、あなたは一つまたはそれ以上の列挙子を特殊な値に設定可能である。
初期化子は、正又は負の整数値を結果的にもたらす全ての式になりうる。
(可能な整数の格上げの後)
初期化子無しの次に続く名前は、すべて1つずつ増加するであろう。
これらの値は通常唯一であるが、重複も有効である。
page
77
82
定数の順序は明示的に再配列させることが可能である。
例えば
初期化子の式は前もって宣言された列挙子を含むことが可能である。
例えば、
nibbleは、数値4、バイト値8、キロバイト値 8192 を取得するはずである。
Anonymous Enum Type
われわれのこれまでの宣言で、識別子 colors は colors型の列挙型変数の次に続く宣言で使用さ
れうる任意の列挙型タグである。
もしこのenum型の変数が更に多く要求されることがないならば、struct及びunion宣言のように、
あなたはタグを省略できる
enumeration Scope
列挙型タグは、構造体及びユニオン タグのような同じ名前空間(name space)を分割する。
enumeratorsは普通の変数識別子のように同一名のスペースを分割する。
更なる情報は名前空間を調べよ。
page
78
83
Void Type
voidは全ての値も無いことを示す特別な型である。voidにオブジェクトはない。というより、voidは
より複雑な型を得るために使用される。
Void Functions
関数が値を返さないならば、関数戻り値型として void キーワードを使おう。
例えば、
もし、関数が何もパラメータを持たないならば、関数の見出しとしてvoidを使おう。或いは、正にあなたは空の
丸括弧を書くことが可能である。
Generic pointers
ポインタを、それらがいかなる型も指すことができるという意味のvoidとして宣言することができる。
これらのポインタはときどき generic と呼ばれる。
page
79
84
DERIVED TYPES(派生型)
派生型は構造型としても知られる。これらの型は、
より複雑なユーザー定義の型を作り出す要素として使用される。
Arrays
配列は最も簡単且つ通常使用される構造型である。
配列型の変数は実際同じ型のオブジェクトの配列である。
これらのオブジェクトは配列の要素を示し、配列内のそれらの位置により確認される。
配列は、その要素全てを保持するのに十分な、確実な大きさの記憶領域の隣接した領域から成り立つ。
Array Declaration
配列の宣言は、識別子の後に追加された角括弧に伴う変数の宣言に似ている。
これは、type の要素を構成する array-name として命名された配列を宣言する。
その type は、voidを除いたスカラー型、ユーザー定義型、ポインタ、列挙型もしくは他の配列であるこ
とが可能である。
角括弧内部の constant-expression(定数式)の結果は、配列内の要素の数で決まる。
もし式が配列宣言子内に与えられると、それは正の定数整数として評価されねばならない。
その値は配列内の要素の数である。
配列の各要素は、要素数-1で( )に番号付けされる。
もし、数が n ならば、配列の要素を、変数配列名 array_name[0]
・・array_name[n-
1]型として等しくすることが可能である。
これが配列宣言の数例である。
page
80
85
Array Initialization
配列は、
角括弧内でコンマで分離された連続する値を配置することにより、
宣言内で初期化することが可能である。
宣言内で配列を初期化する場合、あなたは要素の数-それは配置される要素の数にしたがって自動的に決定されるだ
ろう-を省略できる。
例)
もしあなたが長さと開始値の両方を指定すれば、開始値の数は指定された長さを決して超えることはない。
ぶら下がっている“余分の“ 要素が、メモリからある遭遇した実行時間値を割当てられるとき、逆もまた同様であ
りうる。
char 配列の場合、あなたはより短い文字列リテラル記号を使用できる。
例)
(上の2つの宣言は同一である。
)
文字列リテラルの更なる情報は、String Constantsを参照せよ。
Array in Expressions
配列名が、
(演算子& と sizeof を除き、
)式の評価時に発生する場合、それは暗示的に配列の最初の要
素を指すためのポインタを逆転させる。更なる情報は、配列とポインタを見よ。
page
81
86
Multi-dimensional Arrays
もし配列がスカラ型ならば、1次元である。1次元配列はときどき ベクトルとして参照される。
多次元配列は、配列型の配列を宣言することにより構成される。これらの配列は、すなわち、配列が“列をなして”
記憶されるように、右の添え字が最速で変化するような方法でメモリに記憶される。
ここに2次元配列の例がある。
変数mは、同様に20の浮動小数の配列である50の要素からなる配列である。かくして、われわれは50x20
の要素の行列を有する。最初の要素はm[0]
[0]であり、最後の要素はは[49]
[19]である。5列目の最初
の要素はm[0]
[5]のはずである。
もしあなたが宣言内で配列を初期化しないならば、多次元配列の最初の次元を省略できる。その場合、配列は他の
場所、例えば別のファイル内に配置される。関数パラメータとして配列をパスするときに、これは良く使われるテク
ニックである。
あなたは中括弧内の適切な値一式で多次元配列を初期化可能である。
例)
page
82
87
POINTERS(ポインタ)
ポインタはメモリアドレスを保持する(または指し示す)特別なオブジェクトである。
Cでは、メモリ内のオブジェクトのアドレスは単項演算子“&”によって手に入れることができる。
指し示したオブジェクトへ到達するには、われわれはポインタに間接演算子“*”を用いる。
“オブジェクトタイプを指すポインタ“というポインタ型は、オブジェクトタイプ(即ち、指し示すところの)のア
ドレスを保持する。ポインタがオブジェクトとなったときから、あなたはポインタ(など)を指し示すポインタを手
にすることが可能である。他のオブジェクトは通常包含する配列、構造体及びユニオンを指していた。
関数を指すポインタは、通常その関数の実行可能なコードが記憶される場所、即ち、その関数が呼び出されるとき、
コントロールが転送されるアドレス、であるコードセグメント内のアドレスとして最高の考え方である。
ポインタは符号無し整数の特徴のほとんどを持った数を含んでいるが、それらはそれ自身の規則と宣言、配置、変換
および算術のための制約を有する。次の幾つかの章の例は、これらの規則と制限を示す。
注意)現在、mikroCは関数へのポインタをサポートしていないが、この特徴は将来のバージョンで実装される
であろう。
Pointer Declarations
ポインタは他のすべての変数と同様だが、識別子の前に * をつけて宣言される。宣言の最初における型が指し
示されたオブジェクトの型を明記する。
例えその型が、
実際何かを指すポインタを意味する void であっても、
ポインタはある特別な型を指し示すものとして宣言されねばならない。void を指すポインタは、しばしばジェ
ネリックポインタと呼ばれ、mikroCでは charへのポインタとして取り扱われる。
もし型が、voidを含んだ定義済またはユーザー定義の型のいづれであろうとも、宣言
type *p;
/** Uninitialized pointer/
が、
“type を指すポインタ”の型であるべき p を宣言する。
全てのスコーピング、デユレーション、及び視認可能な規則は正に宣言されたpオブジェクトに適用される。
あなたはこの方法宣言を見ることができる。もし *p がオブジェクトタイプであるなら、pはそのようなオブジ
ェクトをさすポインタであるべきである。
page
83
88
注意)あなたはポインタを使用する前に、ポインタを初期化しなければならない。われわれが以前に宣言したポイン
タ *p は初期化されていない、
(すなわち、値を配置した)
、故に、それはまだ使用可能ではない。
注意)多重ポインタ宣言の場合、各識別子は間接演算子を必要とする。
例)
しかしながら、一旦宣言されたポインタは、それが他の型のオブジェクトを指すので通常再配置可能である。
mikroCは、あなたにタイプキャストすること無しにポインタを再度割当てさせてくれるが、もしポインタが独
自に void を指し示すべく宣言されるのでないならば、コンパイラはあなたに警告するであろう。
あなたは非voidポインタを指す void を配置可能である。詳細はVoid Typeを参照せよ。
Null pointers
ヌルポインタは、プログラム内での使用時、いかなる有効なポインタとも異なることを保証するアドレスである。
ポインタに整数定数 0 を割当てることは、それに空のポインタ値を割当てることである。
ゼロの代わりに、ニーモニックNULL(stdio.hのように標準ライブラリのヘッダファイル内で定義される)
を判読性のために使用することが可能である。
全てのポインタはNULLに等しいか又は等しくないものとして首尾よく試験される。
例)
page
84
89
P85
Function Pointers
関数ポインタは関数のアドレスを指し示すポインタ即ち変数である。
注意)このような、呼出規約(引数の順序、引数の型または戻り型が異なる)とは異なる関数及び関数ポインタは、
互いに互換性が無い。Indirect Function Call(間接関数コール)を確認せよ。
Assign an address to a Function Pointers
関数ポインタを指す関数のアドレスを割当てることは全く容易である。
あなたは簡単に最適で既知の関数またはメンバー関数の名前を付けられる。
関数名の前にアドレス演算子 & を使用することは任意である。
page
85
90
例)
page
86
91
Pointer Arithmetic
Cにおけるポインタ演算には以下の制限がある。
-別のものを指すには一つのポインタを割当てる
-二つのポインタを比較する
-ゼロ(NULL)を指すポインタを比較する
-ポインタと整数値を加算/減算する
-二つのポインタを減算する
ポインタで実行される内部演算は既に有効となっているメモリモデルと全ての主要なポインタ修飾子の存在に依存す
る。ポインタで演算を実行するとき、当然ポインタは配列オブジェクトを指し示すと仮定される。
Arrays and Pointers
配列とポインタはCでは完全に独立した型ではない。
配列名が式の評価(演算子&とsizeofを除く)で上へあがるとき、配列の最初の要素を指し示すポインタに暗
示的に変換される。この事実により、配列はlvalueを変更不能である。
大括弧 [ ] は配列の添え字を示す。式
id[exp]
は、以下のように定義される。
* (
(id)+(exp)
)
idはポインタで、 expは整数である、さもなくば
idは整数で、expがポインタである。
次は真である。
&a[i]=a+i
a[i]=*(a+i)
page
87
92
これらのガイドラインに従い、次のように書くことができる。
また、あなたは演算子の優先性に注意する必要がある。
次の例もまた有効である、が、実に判読しがたいコードとなるようなこの構文は避けたほうがよい。
Assignment and Comparison
もし2つのポインタが同じ型であるならば、
あなたはあるポインタの値を他に割当てるため、
簡単な代入演算子
(=)
を使用可能である。もしそれらが異なったタイプのポインタであるならば、あなたはタイプキャスト演算子を使用し
なければならない。もし一方のポインタが generic(void 型の)ならば、明確な型の変換は必要ない。
ポインタを指す整数定数 0 を割り付けることは、それにNULLポインタ値を割り付けることである。
ニーモニック NULL は(stdio.h のような、標準ライブラリヘッダファイル内で定義された)
、判読性において使用さ
れる可能性がある。
同じ配列内を指す2つのポインタを、関係演算子= =,!=,<,<=,>,>=を使用することで、比較してもよい。
これらの演算の結果は、それらが疑問の中の配列要素の添え字の値に使用されたと仮定した場合、と同じである。
page
88
93
あなたは値ゼロ-ポインタが実際に何かを指しているのかというこの検査-を指すポインタをも比較可能である。
全てのポインタはNULLと等価または非等価であるか首尾よく試験することができる。
注意)異なったオブジェクト/配列を指すポインタを比較することは、プログラマの責任で実行すべきである-デー
タの物理的な記憶領域の正確な概要が要求される。
Pointer Addition(ポインタ
Addition(ポインタ加算
ポインタ加算)
加算)
あなたは整数値とポインタを加算するため、演算子 +, ++ 及び += を使用可能である。
加算の結果は、ポインタが配列の要素を指すのかどうか、そして結果が同じ配列(またはそれを超える1要素)内部
を指すポインタなのかどうかだけで、定義される。
もしポインタが type を指すように宣言される場合、ポインタに整数値を加算することはそのオブジェクト
型の数によってポインタを前に進める。
ポインタが有効な範囲内(最初の要素から最後の要素の次の1つまで)を保持するかぎり、非公式であなたはポイン
タ P を( n * sizeof (type) )バイトだけ前に進めるよう P+n を考えることができる。
もし type が10バイトの大きさならば、type を指すポインタに5を加えると、メモリ内で50バイトポ
インタを進めることになる。
viod 型の場合は、ステップの大きさは1バイトである。
例:
//10個の整数型要素をもつ配列
//paは a[0]を指す整数型のポインタ
//pa+3 はa[3]を指すポインタ
//故にa[3]は今6に等しい
//paは今、配列 a[1]の次の要素を指す
“one past the last element(最後の要素を通過した要素)
”のような要素はない。当然だが、ポインタはそのような
値を仮定することを許されている。
配列を通り過ぎて一つの要素を指す場合でさえ、加算の結果が定義されることをCは“保証する”
。
もし P が最後の配列要素を指す場合は、P+1 は有効だが、P+2 は未定義となる。
page
89
94
これによりあなたは、増加するポインタにより続けて配列要素をアクセスするというループを書くことが可能にな
る。-最後の反復で、あなたは有効な配列を通過して1要素を指すポインタを有するだろう。しかしながら、
“最後の
要素を通過して1要素を指すポインタ”を指す間接演算子(*)を適用することは、未定義の動作を誘発する。
例:
/* 関数fは配列aの要素を処理する */
/* 配列aは some_type のn個の要素を有する */
/* .
.ここでわれわれは*pで何かを行う */
/* .
.そして最後の反復でpは配列aの最後の要素を超え
る */
/* この位置で、*pは未定義となる! */
Pointer Substaruction(ポインタ
Substaruction(ポインタ減算
ポインタ減算)
減算)
加算同様に、あなたは演算子 -, ― ― 及び -= をポインタから整数値を引くために使用できる。
またあなたは二つのポインタを引き算しても良い。差は2つの指示されたアドレス間の距離(バイト値)に等しいだ
ろう。
例:
//iは8に等しい
//pi2=pi2-4:pi2は今a[0]を指す
page
90
95
Structuires(構造体
Structuires(構造体)
構造体)
構造体は通常、ユーザー定義の、命名されたメンバー(又はコンポーネント)の集まりをあらわすことに由来する
型である。メンバーは、任意の順で、いかなる型、基本的または派生的な(後に注意するべき幾つかの制限をもった)
ものであってもよい。加えて、構造体のメンバは他の場所では許可されないビットフィールド型が可能である。
配列とは異なり、構造体は単一のオブジェクトを考慮されている。
mikroCの構造体の型は、あなたに複雑なデータ構造体を単一変数のように全く容易に処理させてくれる。
注意)mikroCはアノニマス(無名の)構造体(ANSI divergence)をサポートしない。
Structure Declaration and Initialization
構造体は、キーワード struct: を使用することにより宣言される。
ここで tag は構造体の名前である。つまり、member-declarator-list は構造体メ
ンバーのリストであり、実際の変数の宣言のリストである。構造化された型の変数は他の全ての型の変数と同様に宣
言される。
メンバーの型は、現在宣言されている構造体の型と同じではありえない。
しかしながら、メンバーは次の例のように、宣言されている構造体を指すポインタであることが可能である。
/* 無効! */
/* OK */
宣言された構造体の実例を例に挙げると、構造体はまた前に定義済の構造体の型を含むこともできる。
例:
/* Dotを定義する構造体 */
/* Circleを定義する構造体 */
/* Circle型の変数o1,o2を宣言 */
page
91
96
P92
あなたは構造体タグを省略できるが、このタイプの付加的なオブジェクトをどこでも宣言できるわけではない。
更なる情報は、
“Untagged Structures ”以下を参照せよ。
構造体は、配列同様に、中括弧内のコンマで区切られた値の連続を配置することにより初期化される。
前例の宣言を参照せよ。
Incomplete Declartions
不完全な宣言は前方宣言としても知られている。
構造体型 A を指すポインタは、A が宣言される前に、別の構造体 B の宣言に現れても有効である。
その時点でそのための定義が無いため、Aの最初の出現で A は不完全に呼び出される。
Bの定義はAのサイズを必要としないので、不完全な宣言はここで許容される。
Untagged Structures and Typedefs
もしあなたが構造体タグを省略するならば、Untagged(タグ無し)構造体を得る。
あなたは、与えられた構造体型(または、それから由来する)であるべき、コンマで区切った struct-ID
-list 内の識別子を宣言するため、untagged(タグ無し)構造体を使用できるが、あなたは付加的なこ
の型のオブジェクトを他のどこでも宣言できるわけではない。
構造体を宣言する間、タグの有る無しに関わらず、typdefを生成することが可能である。
page
92
97
Structure Assignmnet
同じ構造体型の変数は、簡単な代入演算子(=)により、次から次へ割付することが可能である。
これは、与えられた構造体の内部的な複雑さとは関係なく、相手先へ変数の全内容をコピーするであろう。
もしそれらが同じ命令により定義されているか、同じ型の識別子を使用して定義されている場合のみ、二つの変数
は同じ構造体型となることに注意すること。
Size of Structure
あなたは演算子 sizeof によりメモリ内の構造体の大きさを得ることができる。構造体の大きさは、必ず
しもそのメンバーの大きさの総数に等しい必要はない。記憶領域のある限界が原因で、まれにそれがより大きいこと
がある。
Structures and Functions
関数は構造体型または構造体型を指すポインタを返すことができる。
// func1()は構造体を返す
// func2()は構造体を指すポインタを返す
構造体は次の方法で関数への引数としてパスさせることが可能である。
// 直接に
// ポインタ経由で
page
93
98
Structure Member Access
構造体とユニオンのメンバは次の2つの選択演算子を使用することでアクセスされる。
演算子 .は直接メンバ選択子と呼ばれ、構造体のメンバの1つを直接アクセスするために使われる。
オブジェクト s が構造型 S であるとしたらどうだろう。そのとき、もし m が s で宣言されたM型の
メンバ識別子であるなら、式
は M 型であり、s 内のメンバオブジェクト m を意味する。
演算子 -> は間接(又はポインタ)メンバ選択子と呼ばれる。ps が s を指すポインタであるとしたら
どうだろう。そのとき m が、s内で宣言されたM型のメンバ識別子であるなら、式
はM型であり、s 内のメンバオブジェクト m を意味する。式 ps->m は (*ps)
.m の便利な省略記
号である。
例:
式 s.m は、sが lvalue であり、mが配列型ではないということを規定した、lvalue である。
式sptr->mは、mが配列型でないならば、lvalue である。
page
94
99
Accessing Nested Structures
もし構造体 B が、型が構造体 A である領域を含む場合、A のメンバはメンバ選択子の2つの応用によりアクセス可
能である。
Structure Uniqueness
各構造体の宣言は独自の構造体型をもたらす。
オブジェクトaa と aaaは両方とも構造型Aであるが、
オブジェクト aa と bbは異なった構造体型である。
構造体は、ソース(元)とデスティネーション(相手先)が同じ型を有する場合のみ割付可能である。
page
95
100
Unions
ユニオン型は、文法上及び構造体型の基本的な特徴の多くを共有する型に由来する。
そのカギとなる相違点は、ユニオンが、ある時点、最も直近で変化したメンバに対し、
“活性”となることをそのメン
バの一つだけに許可することである。
注意)microCは無名のユニオン(ANSI divergence)をサポートしない。
Union Declaration
ユニオンは、structの代わりに使用されるキーワード union で構造体と同様に宣言される。
構造体のメンバとは異なり、ユニオンのメンバの一つだけの値がいつでも記憶される。簡単な例を挙げよう。
myunion というユニオン型の識別子 mu は、int 2バイト、4バイト double、または1バイト char を、
常にこれらの内の1つだけだが、保持するために使用可能である。
Size of union
ユニオンの大きさは最大のメンバの大きさである。前の例で、sizeof(union myunion)とsi
zeof(mu)の両者は4を返すが、mu が int オブジェクトを保持するとき2バイトは使用されず、また mu が
char を保持するとき、3バイトが使用されない。
Union Member Access
ユニオンメンバは構造体メンバ選択子(.と ->)でアクセスすることが可能であるが、注意が必要である。
次のページの例を確認すること。
page
96
101
前の例から宣言を参照すると、
mu.i が整数型であるかぎり、二番目の LCD_Out_Cp は有効である。
しかしながら、mu.i のビットパターンは前に割付けた double の部分と一致する。
そのように、おそらくそれは有用な整数の解釈を備えてはいないのだろう。
適切に変換されると、ユニオンを指すポインタはそのメンバの個々を指し示し、また逆も同様である。
Bit Fields
ビットフィールドは、おそらく関連付けられたかさもなくば関連付けされていない、指定されたメンバのビットで
ある。
ビットフィールドは、ユーザー定義された大きさの命名済部分内の構造体の細分化の1方法を提供する。
構造体とユニオンはビットフィールドを含むことが可能である。ビットフィールドは16ビットまでである。
ユーザーはビットフィールドのアドレスを得ることはできない。
注意:もしあなたが8ビット変数(charとunsigned short)またはレジスタの指定ビットを処理
する必要があるならば、ビットフィールドを宣言する必要は無い。
最大級の優雅な解決法は個々のビットアクセスのためのmikroCの本来の機能を使用することである。-更なる
情報は Accessing Individual Bits を見よ。
Bits Fields Declaration
ビットフィールドは構造体内でのみ宣言可能である。構造体を普通に宣言し、この(フィールドはunsigne
dの必要あり)ように個々のフィールドを割り付けること。
page
97
102
ここで tag は構造体の任意の名前である。bitfield-declarator-list はビット
フィールドのリストである。各コンポーネントの識別子はコロンと明示的に指定されるべきビットの巾を要求する。
全コンポーネントの総合巾は2バイト(16ビット)を超えることはできない。
オブジェクトのように、ビットフィールド構造体は2バイトを要する。
個々のフィールドは右から左へ2バイト内に詰め込まれる。
bitfield-declarator-list において、あなたは、無意味なビットを飛ばすような、巧み
な“詰め物“を作るため、識別子を省略可能である。
例えば、われわれが1ブロックとして1レジスタの2-4ビットのみを操作する必要があるばあい、構造体を作るこ
とが可能である。
//ビット0,1を飛ばす、ここに識別子はない
//関連のあるビットは2,3、4
//ビット5,6,7は暗示的に無視する
ここに例がある。
これは3つのコンポーネントを含んだ mybitfield という構造化された型を宣言している。
3つのコンポーネントとは、 prescaaler(ビット0と1)、timeronoff(ビット2),postsc
aler(3,4,5ビット)である。
Bit Fields Access
ビットフィールドは構造体メンバと同じ方法でアクセスすることが可能である。
直接および間接メンバ選択子(.と->)を使用すること。
例えば、われわれは以前に宣言した mybitfield で、このように操作できるはずである。
page
98
103
TYPES CONVERSIONS(型変換)
Cは、各演算子、ステートメント、正確にタイプされたオペランド/引数を要求する関数とともに厳密に打ち込ま
れる。しかしながら、われわれはしばしば式の中で“不適正な組み合わせ”のタイプのオブジェクトを使用しなけれ
ばならないことがある。このような場合、型変換が必要とされる。1つの型のオブジェクト変換は他の型の同じオブ
ジェクトへそれを変換する。
(即ち、与えられたオブジェクトに他の型を適用する。
)
Cは、必要なときにコンパイラによって準備されるビルトイン(組込み)型のための標準変換一式を定義する。
変換には次の条件が要求される。
-ステートメントが特殊な型の式を要求(言語の定義に従って)し、且つわれわれが異なった型の表現を使用する場
合
-演算子が特殊な型のオペランドを要求し、且つわれわれが異なった型のオペランドを使用する場合
-関数が特殊な型の仮パラメータを要求し、且つわれわれが異なった型のオブジェクトをパスする場合
-キーワードの戻り値に続く式が宣言された関数の戻り値の型と一致しない場合
-異なったタイプのオブジェクトと共にオブジェクト(宣言内部で)を初期化する場合
このような場合、コンパイラは、いかなるユーザーからも干渉されること無く、型を自動的に暗黙の内に変換する
準備をするだろう。
また、ユーザーは typecast 演算子によって、明示的に変換を要求することが可能である。
更なる情報は、Explicit Typecasting を参照せよ。
Standard Conversion
標準変換は C に組み込まれている。これらの変換はプログラム内で必要とされるときはいつでも自動的に実行され
る。それらは明示的にtypecast演算子によって要求される可能性もある。
(Explicit Typeca
stingを参照せよ。
)
自動(暗黙)変換の基本的な規則は、より簡単な型のオペランドがより複雑なオペランドの型へ変換される(昇格
される)ということである。それから結果として型はより複雑なオペランドの型になる。
page
99
104
Arithmetic Conversions
あなたが、aとbが異なった算術型であるa+bのような演算式を使用する場合、mikroCは、表現が評価さ
れる前に、暗示的型変換を実行する。これらの標準変換は、正確さと整合性のために、
“lower”
(より低い)型を“higher”
(より高い)型へ昇格することを含む。
符号付文字オブジェクト(変数のような)を整数オブジェクトへ割り付けることは、結果的に自動符号拡張を行う
こととなる。signed char型のオブジェクトは常に符号拡張を使用する。つまり、unsigned c
har型のオブジェクトは、int へ変換する場合、常に上位バイトをゼロに設定する。
長い整数型を短い型へ変換することは高位のビットを切り捨て、変更されなかった低位のビットを残すことになる。
短い整数型を長い型へ変換することは、
短い型がそれぞれ符号有りまたは符号無しかどうかにより、
符号拡張するか、
新しい値の余分なビットをゼロで満たすことになる。
注意)もし、float値が相手の整数型スコープ(有効範囲)を超えない場合に限り、整数値(割り付け内で、ま
たは明示的なtypecast経由で)への浮動小数点データの変換は誤った結果を生じる。
まず、いかなる小さな整数型も次の規則に従って変換される。
1.char は int に変換する
2.signed char は同じ値で int に変換する。
3.short は符号拡張された同じ値で int に変換する。
4.unsigned short は余分なビットをゼロで満たした同じ値で unsigned int に変換する。
5.enum は同じ値で int に変換する
この後、演算子で関連づけられた2つの値は、int(long と unsigned 修飾子を含んだ)でも、それらが不動小
数(mikroCにおける double や long double と同等)であってもよい。
1.もしどちらかのオペランドが float であるならば、他のオペランドは float に変換される
2.その他、もしどちらかのオペランドが unsigned long ならば、他のオペランドは unsigned long に変換される
3.その他、どちらかのオペランドが long ならば、他のオペランドは long に変換される
4.その他、どちらかのオペランドが unsigned ならば他のオペランドは unsigned に変換される
5.その他、両オペランドは int である。
page
100
105
式の結果は2つのオペランドの型と同じ型となる。
ここに暗示的な変換のいくつかの例がある。
Pointer Conversions
ポインタ型はtypecastの仕組みを使用することで他のポインタへと変換することが可能である。
より一般的には、cast(type*)は“typeを指すポインタ”型を指すポインタに変換されるだろう。
Explicit Type Conversions(Typecasting)
多くの場合、コンパイラはいかなるユーザーからも干渉を受けることなく、必要な所で型の自動暗示変換を準備す
るであろう。また、あなたは明示的に、接頭単項typecast演算子を使用して、他の型へオペランドを変換す
ることもできる。
例:
page
101
106
DECLARATIONS(宣言)
Introduction to Declarations
宣言は一つ又はさまざまな名前をプログラムに引き合わせる-それはコンパイラに、名前が意味すること、その型
が何か、それに伴う演算子に許されるものがなにか、等を知らせる。
このセクションは宣言に関連した概念を再吟味する。つまり宣言、定義、宣言指定子及び初期化である。
宣言される可能性のあるオブジェクトの大きさは次のものを含む
-変数
-定数
-関数
-型
-構造体、ユニオン及び列挙型タグ
-構造体メンバ
-ユニオン メンバ
-他のタイプの配列
-ステートメントラベル(文のラベル)
-プリプロセッサ マクロ
Declarations and Definitions
definitions としても知られる宣言を定義することは、オブジェクトの名前を紹介することに加え、オ
ブジェクトの生成(どこで、いつか)を確定することでもある。即ち、物理的なメモリの配置と可能な初期化である。
宣言を参照すること、さもなくば、まさに宣言が、単純にそれらの識別子やタイプをコンパイラに知らせるのである。
ここに概観がある。宣言は定義でもある。次のようでなければ。
-その本体を指定することなく、関数を宣言する
-extern 指示子を有し、初期化子または本体(func の場合)を持たない
-typedef 宣言である
これらは、特に多数ファイルのプログラムでは、同じ識別子に対する多くの参照中の宣言である可能性がある、が
識別子に対し、定義中の宣言はただ1つのみが許される。
page
102
107
例をみてみよう。
/* ここは関数maxの非定義宣言である */
/* maxが関数であることを単にコンパイラに知らせるに過ぎない */
/* ここは関数maxの宣言である */
/* 変数iの宣言 */
/* エラー:iが既に定義されている! */
Declarations and Declarators(
Declarators(宣言と
宣言と宣言子)
宣言子)
宣言は名前のリストである。名前は宣言子または識別子としてときどき参照される。宣言は任意の記憶クラス指示
子、型指示子および他の修飾子で始まる。識別子はコンマにより分離され、リストはセミコロンで終わる。
変数識別子の宣言は次のパターンを有する。
var1,var2,
・・・の場所は、任意の初期化子に伴う、ある個別の識別子の連続である。
各々の変数は、type であるべく宣言される。もし省略されると、type はデフォルトで int になる。
指定子 storage-class は extern,static,resister,またはデフォルトの a
utoの値をとりうる。任意のtype-qualifierはconstまたはvolatileの値をとりうる。
更なる詳細は、Storage Classes and Type Quarifiers を参照のこと。
ここに変数宣言の例を示す。
/* x、y及びzと呼称される3整数変数を生成し、xとyを各々1と2に初期化する */
/* zは非初期化のままである */
これらは全て定義中の宣言である。記憶領域は配置され、すべての任意の初期化子が適用される。
page
103
108
Linkage
実行可能なプログラムは、通常、いくつかの独立した翻訳単位をコンパイルし、それから既存のライブラリととも
に生成出力されるオブジェクトファイルをリンクすることによって作られる。
用語の翻訳単位は、いくつかのインクルードファイルと共にソースコードファイルを参照するが、どのソース行も条
件付のプリプロセッサ命令により省略されることはほとんどない。
同じ識別子が異なったスコープ内で(例えば、異なったファイル内で)宣言されるとき、あるいは、同じスコープ内
で1回以上宣言される場合、問題が発生する。
Linkage(リンク)は、一つの特殊なオブジェクトまたは関数に誤って関連づけられた識別子の個々のイン
スタンス(事例)を許容するという過程である。全ての識別子は、それらのスコープ(有効範囲)に厳密に関連付け
された2つのリンケージ属性のうちの1つを有する。つまり、外部リンケージまたは内部リンケージである。
これらの属性は、記憶クラス指定子 static または extern の明示的な(またはデフォルトでは暗示的な)使用とと
もに、あなたの宣言の配置と形式で決定される。
外部リンクに伴う個々の識別子の各インスタンス(事例)は、プログラムを作るファイルとライブラリの一式全部
を通じて、同じオブジェクトまたは関数を意味する。内部リンクに伴う個々の識別子の各インスタンス(事例)は、
1ファイル内のみの同一オブジェクトまた関数を意味する。
Linkage
Linkage Rules
ローカル名は内部リンクを有する。つまり識別子は、異なったファイル内で、異なったオブジェクトを意味するた
めに使用される。 グローバル名は外部リンクを有する。つまり、識別子は全プログラムファイルを通じて同一オブ
ジェクトを意味する。
もし同一識別子が同一ファイル内で内部および外部リンク両方に現れた場合、識別子は内部リンクを有するだろう。
内部リンクの規則:
1.明示的にstaticとして宣言されたファイルスコープを有する名前は内部リンクを有す
2.明示的にconstとして宣言された、または明示的ではなくexternとして宣言されたファイルスコープ
を有する名前は内部リンクを有す
3.typedef名は内部リンクを有する
4.enum定数は内部リンクを有する
page
104
109
外部リンケージ
外部リンケージの
リンケージのルール
1.既に記述したいかなる内部リンケージのルールも遵守しないファイルスコープを有する名前は、外部リンケージ
を有する
記憶クラス指示子 auto と register は外部宣言に現れることはできない。
内部リンケージで宣言された翻訳ユニット内の個々の識別子のために、一つ以上の外部定義が与えられることはない。
外部定義はオブジェクトまたは関数をも定義する外部宣言である。すなわち、それはまた記憶領域をも配置する。
もし外部リンクで宣言された識別子が式の内部で使用されるならば、
( オペランド sizeof の一部のようなものは別
として)その識別子の正確な1つの外部定義は、全プログラム内のどこかにあらねばならない。
mikroCは、もっと後の配列、構造体及びユニオンのような外部名の宣言を、より早めの宣言へ情報を追加する
よう許容する。
ここに例がある。
page
105
110
Strage Classes
オブジェクトに識別子を関連付けることは、少なくとも2つの属性を持つことを各識別子に要求する。つまり、記
憶クラスとタイプである。
(ときどきデータタイプとして参照される)
mikroCコンパイラは、ソースコード内の暗示的または明示的な宣言からこれらの属性を推測する。
記憶クラスは、オブジェクトの配置(データセグメント、レジスタ、ヒープまたはスタック)及び持続期間(duration)
または寿命(プログラムの全実行時間、またはいくつかのコードブロックの実行の期間)を規定する。
記憶クラスは、宣言文により、またソースコード内のその配置によるか、これらの要素の両方により成立することが
可能である。
mikroCの記憶クラス指定子は次の通り。
Auto
ローカルデュレーション(ローカルな持続期間)を有するように、ローカル変数を定義するために auto 修飾子を
使おう。これはローカル変数のためのデフォルトであり、まれに使われる。
あなたは globals と一緒に auto を使用することはできない。
Functions も参照せよ。
Register
デフォルトでは、mikroCは内部のマイクロコントローラのメモリに変数を蓄える。
このように、register 修飾子は技術的には全く特別な意味をもたない。mikroCコンパイラは単純にレジスタ割
付けの要求を無視する。
page
106
111
Static
Static 指示子で宣言された Global(グローバル)名は、それが与えられたファイルに対しローカルであることを
意味する内部リンクを有する。更なる情報は Linkage を参照せよ。
Static 指示子で宣言されたローカル名はスタティックデュレーション(静的な持続期間)を有する。
首尾よくその関数を呼び出す間、最後の値を保持するためローカル変数とともに static を使おう。
更なる情報は Duration を参照のこと。
Extern
内部リンクを有するよう前に宣言されていないかぎり、Extern 指示子で宣言された名前は外部リンクである。
もしそれが extern 指定子を有し、且つ初期化されないならば、宣言は定義にはならない。キーワード extern は関
数プロトタイプにとって任意である。
現在の記憶領域と変数の初期値または関数の本体が分離されたソースコードモジュール内で定義されるということ
を示すために Extern 修飾子を使おう。あなたが static として関数を再定義しないかぎり、extern で定義された関数
はプログラム内の全てのソースファイルを通じてみることができる。
更なる情報は Linkage を参照せよ。
page
107
112
Type Qualifiers
型修飾子 const と volatile は宣言において任意であり、宣言されたオブジェクトの型に実際影響を与えない。
Qualifier const
Const 修飾子は、宣言されたオブジェクトがプログラムの実行中にその値を変えないであろうということを暗黙の
内に定義する。Const 修飾子での宣言では、あなたは宣言内のすべてのオブジェクトを初期化する必要がある。
mikroCは、リテラルまたはプリプロセッサ定数と同様に const 修飾子で宣言されたオブジェクトを効果的
に取り扱う。もし const 修飾子で宣言したオブジェクトを変更しようとするなら、コンパイラはエラーを報告する。
例:
Qualifier volatile
Volatole 修飾子は、プログラムから独立して実行している間に、変数がその値を変えるかもしれないということを
暗黙の内に定義する。変数がバックグランドルーチン、割り込みルーチンまたはI/Oポートにより変更されうるこ
とを示すために Volatile 修飾子を使おう。Volatile であるべきオブジェクトを宣言することは、コンパイラに、値が
いつでも変えられるという理由で、それが発生するであろう式の評価をする間に、オブジェクトの値に関係する仮定
をしないように警告する。
page
108
113
Typedef Specifier
typedef 指示子は指定された型の同意語を導く。あなたは、既に言語により定義された型に対し、またはあなたが
宣言した型に対し、より短いかより意味深い名前を作成するため typedef 宣言を使用できる。
あなたは関数定義内部で typedef 指示子を使用することはできない。
typedef 指定子は宣言内で最初に配置する。
キーワード Typedef は、<type-definition>に synonym を割当てる。 synonym は有効な識別子である必要がある。
typedef 識別子で始まる宣言は、与えられた型のオブジェクトまたは関数、というよりむしろ与えられた型のための
新しい名前を導きはしない。即ち、typedef 宣言は “普通の”宣言と同じなのであるが、オブジェクトの代わりにそ
れは型を宣言する。
大文字で始まる慣例的な識別子の型に名前を付けることは常識である。-これは C により要求されない。
例:
typedef 宣言内で、またいかなる宣言内でも同様にあなたは即座に様々な型を宣言可能である。
例:
ここで、
Pti は
“pointer to int”
(int を指すポインタ)
型と同義であり、
また Array は
“array of 10 int elements”
(10個の整数要素の配列)型と同義である。
page
109
114
Asm Declaration
C は asm 宣言によりソースコード内の埋め込みアサンブラを許容する。
_asm と _asm 宣言はmicroCではともに許容されており、同じ意味をもつ。あなたはアセンブラ命令におい
てSFRやGPR変数に対し絶対アドレスとして数字を使用できないことに注意すること。あなたはその代わりシン
ボル名を使用してよい。
(一覧表はアドレス同様にこれらの名前を表示するだろう。
)
あなたはキーワード asm(または _asm または _asm)によりアセンブラ命令をグループ化できる。
C のコメント(1行も複数行も)は埋め込みアセンブラコード内で許容されている。セミコロンで始まるアセンブラ
形式のコメントは許容されていない。
もしあなたが埋め込みアセンブラのみの中で、ある C 変数を使用したいと考えるなら、少なくとも C コード内で必ず
それを初期化するべきである。さもなくば、リンカがエラーを出すだろう。これは PORTB のように定義済のグロー
バルには適用されない。
例えば、次のコードは、リンカが変数 mivar を認識できないのでコンパイルされないだろう。
asm ブロック上に次の行(または類似の)を追加すれば、変数が使われていることをリンカに知らせるだろう。
注意)もしバンクがあなたの変数用に適切に設定されていれば、mikroCは確認しないだろう。あなたはアセン
ブラコード内でバンクを手作業で設定する必要がある。
page
110
115
Migration from older version of mikroC(mikroC
の旧バージョンからの移行)
mikroC
asm ブロック内で使用されている構文はバージョン 2 で使用されてきたものとは幾分異なる。
違いは次の通り。
細切れの変数は変更され、且つもはやCの常識(C の方法)を超える。例えば、命名された変数に対し、
-_myVar, グローバルの場合
-FARG_++XX, ローカルの場合(これはローカル関数フレーム内の myVal の実際の位置である。
)
-_myVar_L0(++XX), ローカル静的変数の場合(遠くの独立したバイトをアクセスするための+XX)
C内にあるのと同様に asm 内で名前が同一で存続する名前の型のみが定数、つまりINTCON、PORTB、W
REG、GIEなどである。
個々のバイトをアクセスすることは更に異なる。例えば、もしあなたが long 型であるグローバル変数“g_var”
(つ
まり4バイト)を有するならば、このようにアクセスすべきである。
オブジェクトのアドレスを探し出すための構文は異なる。フラッシュROM内に配置されたオブジェクトに対して、
RAM内に配置されたオブジェクトに対して、
page
111
116
Initialization
宣言に当り、あなたは宣言したオブジェクトの初期値を設定できる。つまり、それを初期化する。初期化を指定す
る宣言部分は初期化子と呼ばれる。
Global や static 用の初期化子は定数あるいは定数式でなければならない。
自動オブジェクトのための初期化子は、関係する変数の型のための代入互換可能な値を評価する、すべて有効な式で
なければならない。
スカラー型は任意の方法で大括弧{ }で囲われる簡単な式で初期化される。
オブジェクトの初期値は式のそれである、つまり、型と変換のための同じ制約が簡単な代入に対するのと同様に適用
される。
例:
自動記憶領域デユレーションを伴う構造体又はユニオンに対し、初期化子は次のうちの1つでなければならない。
-初期化子の一覧表
-互換性のあるユニオンまたは構造体型を伴う簡単な式。この場合、オブジェクトの初期値が式のそれである。
更なる情報は構造体とユニオンを参照せよ。
また、ユーザーは、任意に大括弧{ }で囲まれたリテラルストリングの文字列タイプの配列を初期化できる。
NULL終端文字を含んだストリング内の各文字は、配列内の連続した要素を初期化する
更なる情報は、Arraysを参照のこと。
Automatic Idnitialization
mikroCはオブジェクトに対する自動初期設定を備えていない。
Static duration(静的持続期間)とともに初期化されないグローバルとオブジェクトは、メモリからランダムな値
を取得するであろう。
page
112
117
FUNCTIONS(関数)
関数は C プログラミングの中核をなす。
関数は通常、入力パラメータの数を基本にした値を返すサブプログラムとして定義される。
関数の戻り値は式の中で使用することが可能である。-技術的には関数呼出しは他の演算子同様に考慮されている。
C は、side-effect (副作用)として参照されるその戻り値以外、関数が結果を生成することを可能にする。
まれにも、関数の戻り値が side-effect(副作用)に依存して使用されることは全くない。
これらの関数は、パスカルのような他のプログラミング言語のプロシージャ(手続き)と同等である。
C はプロシージャ(手続き)と関数との区別をしない。-関数は二つの役を演ずるのである。
各プログラムはプログラムのエントリポイント(入り口点)を示す main と命名された1つの外部関数を持たねば
ならない。
関数は通常、標準またはユーザーが提示するヘッダーファイルまたはプログラムファイルの中でプロトタイプとして
宣言される。
関数はデフォルトでは外部リンクを有し、普通はプログラム内のどのファイルからもアクセス可能である。
これは関数宣言における静的記憶領域クラス指示子を使用することで制限することが可能である。
(Strage Classes and Linkage を見よ)
注意)PIC mikros における関数の制限の更なる情報については PIC Specifics を確認せよ。
Function Declaration
関数はあなたのソースファイル内で宣言されるか、またはコンパイル済のライブラリをリンクすることにより有効
となる。
関数の宣言シンタックスは次の通りである。
function_name は有効な識別子でなければならない。
この名前は関数を呼び出すために使用される。
;更なる情報は Function Calls を見よ。
type は関数の結果の型を意味し、すべて標準またはユーザー定義の型でありうる。
値を返さない関数に対しては、あなたは viod 型を使用すべきである。
type はグローバル関数宣言内では省略することが可能であり、関数はデフォルトとして int 型と仮定される。
関数のtypeはポインタでもありうる。
例えば、float* は関数の結果が float を指すポインタであることを意味する。
ジェネリック ポインタ、viod* も許される。
関数は配列または他の関数を持って戻ることはできない。
page
113
118
丸括弧内の parameter-declarator-list は関数が持つ正式な引数のリストである。
これらの宣言子は各関数のパラメータの型を指定する。
コンパイラは関数呼出の妥当性を確認するためにこの情報を使用する。
もしリストが空ならば、関数はいかなる引数も持たないことになる。
またリストが void ならば、関数はいかなる引数も持たない。
void は引数型として使用されうるただ一つの場合であることに注意すること。
変数の宣言とは異なり、リスト内の各引数はそれ自身の型指定子と可能な修飾子 const または volatile を必要とす
る。
Function Prototypes
与えられた関数はプログラム内で一回のみ定義することが可能であるが、宣言が互換性を備えていれば、何回か定
義することが可能である。
もしあなたが未意義の関数宣言を書く場合、つまり、関数の本体無しで、あなたは正式な引数を指定すべきではない。
通例、関数プロトタイプとして知られるこの種の宣言は、引数の数と型の確認と型の変換以上に、より良い制御をす
ることを可能にする。
関数プロトタイプにおける-パラメータ名はプロトタイプを制限するそのスコープ(有効範囲)を有する。
これは同じ関数に対する異なった宣言内において異なったパラメータ名を許容するものである。
関数プロトタイプはコードを記述するに当り大いに助けになる。
例えば、関数 Cf_Init は2つの変数を持つ。つまりコントロールポートとデータポートである。
これは、どちらがどちらか?という問題である。
関数プロトタイプ
はそれを明らかにする。
もしヘッダーファイルが関数プロトタイプを含むならば、あなたはこれらの関数を呼び出すプログラムを書くために
必要とする情報を入手するため、そのファイルを得る事が可能である。
もしあなたがプロトタイプのパラメータ内に識別子を含めるならば、少し後でそのパラメータに関わるエラーメッセ
ージに対してのみ使われる。つまり、それは他に何の効果もないのである。
page
114
119
Function Definitions
関数定義はその宣言と関数本体から成り立つ。関数本体は技術的には一つのブロック-{ }で囲まれた一連のロ
ーカル定義とステートメント(記述)-である。関数本体内で宣言された全ての変数は関数に対しローカルである、
即ちそれらは関数スコープ(有効範囲)を有する。
関数それ自身はファイルスコープ内でのみ定義され得る。これは関数の宣言がネストして使用できないことを意味す
る。
関数の結果を返すためには return 文を使用する。
viod 型の関数内の return 文は変数を持つことができない。-事実、それが関数本体の最後の文であるならば、あ
なたは return 文を全く省略可能である。
ここに関数定義の例がある。
ここに戻り値よりも side effect(副作用)によって決まる関数の例がある。
Function Reentrancy
関数のための制限付きリエントランシーは許されている。それ自身の関数フレーム(引数やローカル変数ではない)
を持たない関数は、割り込みと“main”スレッドから共に呼び出すことが可能である。入力引数 and/or ロ
ーカル変数を持つ関数は、前に述べたプログラムのスレッドからのみ呼び出され得る。
Indirect Function Calls を確認せよ。
page
115
120
Function Calls
関数は、それらに合った正式なパラメータとして同じシーケンス内に置かれた実際の引数とともに呼び出される。
関数呼出の演算子には( )を使おう。
関数呼出内の各式は実際の引数である。実際の引数の数と型はこれらの正式な関数のパラメータと一致すべきである。
もし型が一致しない場合、暗黙の内に決められた型変換規則が適用される。実際の引数はどんな複雑なものにもなり
うるが、それらの評価順序に依存すべきではない。何故ならそれは指定することができないからである。
関数呼出において、正式なパラメーターが実際の引数値によりローカルオブジェクトとして生成される。関数から
の戻りにおいて、一時的なオブジェクトが呼出の位置に生成され、そしてそれは return 文の式により初期化される。
これは複雑な表現でのオペランドとしての関数呼出が関数の結果として扱われることを意味する。
もし関数が、結果(void タイプ)がないか、あなたが結果を必要としない場合は、あなたは自己充足した式として
関数呼出を書くことを可能にする。
C において、スカラー パラメータは常に値により関数を通過させる。
関数は正式なパラメータの値を変更することができるが、これは呼出しているルーチン内の実際の引数に何の影響も
しない。あなたは、ポインタであるべき正式なパラメータを宣言することにより、アドレスによってスカラー オブ
ジェクトを通過可能である。そのとき、指し示したオブジェクトをアクセスするため、間接演算子 * を使おう。
Argument Conversions
関数プロトタイプが以前に宣言されていなかった場合、mikroCは標準変換で記述された拡張整数規則に従っ
て、関数呼出のため整数引数を変換する。関数プロトタイプがスコープ内にある場合、mikroCは与えられた引
数を、まるで代入によるかのように、宣言された変数の型に変換する。
page
116
121
もしプロトタイプが現れたら、引数の数が一致しなければならない。型は、配置が有効にそれらを変換することが
可能である領域(一種のメモリ領域)に対してのみ互換性を持つ必要がある。
あなたは、関数プロトタイプを受け入れ易い型に引数を変換するため、明示的なキャストを常に使用できる。
注意)もしあなたの関数プロトタイプが実際の関数定義と一致しない場合は、もしその定義がプロトタイプとして同
じコンパイルユニット内にある場合のみ、mikroCがこれを検出する。
もしあなたが一致するプロトタイプのヘッダーファイルと共にルーチンのライブラリを作るなら、あなたがライブ
ラリをコンパイルする時に、プロトタイプと実際の定義の間のいかなる不一致をも見つけることができるよう、その
ヘッダーファイルを含めることを考慮すること。
コンパイラは強制的に引数を適切な型にすることも可能である。仮にあなたが次のコードを有するとする。
それが func に対し関数プロトタイプを有するので、func への呼出のためスタック上にそれらを配置する前に、
このプログラムは引数の標準規約を用いて limit と ch を long に変換する。
関数プロトタイプ無しでは、lilmit と ch は、整数と文字としてそれぞれスタック上にずっと配置されていただ
ろう。その場合、func を通過したスタックは、 func が期待し、問題につながる大きさと内容に一致しないはず
である。
page
117
122
Ellipsis(
‘.
.
.
’
) Operator
エリプシス(省略記号)は、介在する余白の無い3つの連続するピリオドから成り立つ。
あなたは、引数の可変数または変化する型の引数を示すため、関数プロトタイプの引数の正式な引数リスト内で省略
記号を使用できる。
例:
この宣言は、
関数は少なくともint とchar の2つの引数を持たねばならない呼出による方法で定義されるであろうが、
付加的な引数をいくつでも持つことも可能である、ということを示す。
例:
page
118
123
OPERATORS(演算子)
演算子は、式における変数と他のオブジェクトに適用されるとき、ある計算を引き金(トリガ)とするトークンで
ある。
mikroCは次の演算子を認識する。
-算術演算子
-代入演算子
-ビット演算子
-論理演算子
-参照/間接演算子
(Pointer Arithmetic を参照)
-関係演算子
-構造体メンバ選択子
(Structure Member Access を参照)
-コンマ演算子 、
(Comma Expressions を参照)
-条件演算子 ? :
-配列の添え字演算子[ ] (Arrays を参照)
-関数呼出演算子( )
(Function Call を参照)
-sizeof 演算子
-プリプロセッサ演算子 # と ## (Preprosessor Operators を参照)
Operators Precedence and Associativity
(演算子の優先性と結合規則)
15の優先度のカテゴリ(種類)があり、そのうちのいくつかは一つの演算子のみを含む。同じカテゴリの演算子
はお互いに同等の優先度を有する。
次のページのテーブルは、全てのmikroC演算子の要約である。
演算子の重複がテーブル内に現れる場合は、最初の出現が単項であり、第二がバイナリである。
各カテゴリは結合規則をもつ。つまり、左から右または右から左。
丸括弧が欠けると、これらの規則が同じ優先度の演算子を持つ式をグループ化して解決する。
page
119
124
左から右
右から左
から左
左から右
左から右
左から右
左から右
左から右
左から右
左から右
左から右
左から右
左から右
左から右
右から左
から左
左から右
page
120
125
Arithmetic Operators
算術演算子は数学上の計算を実行するために使用される。それらは、数値オペランドを有し、数値の結果を返す。
char 型は技術的には小さな整数を表す。故に char 変数は算術演算子内のオペランドとして使用される。
全ての算術演算子は左から右へ関連付けられる。
加算
減算
掛算
除算
整数除算の余りを返す。
(不動小数と一緒に使用不可)
単項加算はオペランドの影響しない。
単項減算はオペランドの極性を変える。
増加はオペランドの値に1を加える。
減少はオペランドの値から1を引く。
注意:演算子*は敏感な文脈であり、ポインタ参照演算子をもあらわす。更なる情報は Pointers を見よ。
page
121
126
Binary Arithmetic Operators
剰余が簡単に切り捨てられる間に、二つの整数の除算では整数を返す。
剰余オペランド%は整数でのみ動作する。結果の極性は最初のオペランドの極性に同じ。
われわれは文字の操作に算術演算子を使用できる。
Unary Arithmetic Operators(単項算術演算子)
Operators
単項演算子++と― ― は、C における接頭辞(例えば、++k,--k)または接尾辞(例えば、k++,k--)であるべき単な
る演算子である。
接頭辞として使用される場合、演算子++と― ―(加算済と減算済)は、評価の前にオペランドの値から1を加算
又は減算する。接尾辞として使われる場合、演算子++と― ―は、評価の後にオペランドの値から1加算または減算
する。
例:
page
122
127
Rational Operators(関係演算子)
Operators
式の等価または非等価を試験するために関係演算子を使用する。もし式が真であると評価されれば、1を返す、さ
もなくば、0を返す。
全ての関係演算子は、左から右に関連ずけられる。
Relational Operators Overview
等価
非等価
より大きい
より小さい
より大きいか等価
より小さいか等価
Relational Operators in Expressions
算術の優先度と関係演算子は、次のような意味を期待された丸括弧無しの複雑な式を許容するような方法で設計さ
れた。
関係演算子が0または1を返すことを常に覚えておこう。次の例をよく考えよう。
page
123
128
Bitwise Operators
数値オペランドの個々のビットを変更するにはビット演算子を使おう。
ビット演算子は左から右へ関連つけられる。唯一の例外は右から左に関連つけられるビット反転演算子 ~ である。
Bitwise Operators Overview
ビット単位AND;もし両ビットが1ならば1を返し、さもなけれ
ば0を返す。
ビット単位(包括的)OR;もし片方または両ビットが1ならば1
を返し、さもなければ0を返す。
ビット単位排他的OR;もしビットが相補的ならば1を返し、さも
なければ0を返す。
ビット単位補数(単項)
;各ビットを反転する。
ビット単位左シフト;ビットを左へシフトする。以下を参照。
ビット単位右シフト;ビットを右へシフトする。以下を参照。
注意)演算子 & はポインタ参照演算子でもある。さらなる情報は Pointers を参照せよ。
ビット演算子 &、| 及び ^ はそれらのオペランドのビットの適切なペアの論理演算を行う。
例:
page
124
129
Bitwise Shift Operators(ビットシフト演算子)
Operators
バイナリ演算子 << と >> は、右または左へ1ビットずつ、右オペランドにより指定された位置へ残りのオペ
ランドのビットを移動する。右オペランド整数でなければならない。
左シフト(<<)に伴い最も左のビットは捨てられ、右の“新しい”ビットにゼロが割当てられる。
かくして、
もし全ての捨てられたビットがゼロならば、符号なしのオペランドをnの位置だけ左へシフトすることは、
2nの掛け算をすることに等しい。もし、全ての捨てられたビットが符号ビットに等しいなら、これはまた符号付オ
ペランドに対しても真である。
右シフト(>>)に伴い、最も右のビットが捨てられ、左の“自由な”ビットにゼロ(符号なしオペランドの場合も)
または符号ビットの値が割当てられる。nの位置だけ右にオペランドをシフトすることは、2nでそれを割ることに
等しい。
Bitwise Logical(ビット毎の論理)
Logical
ビット及び論理演算子の作用の仕方の原則的な違いに気をつけること。
page
125
130
Logical Operator(論理演算子)
Operator
論理演算子のオペランドは真または偽(即ち、ゼロでないかゼロか)となるよう考慮されている。論理演算子は常
に1または0を返す。論理式のオペランドはスカラ型でなければならない。
論理演算子&&と||は左から右へ関連付けられている。論理否定演算子!は右から左へ関連付けられている。
Logical Operators Overview(論理演算子の概要)
Overview
論理的AND
論理的OR
論理的NOT
論理、関連及び算術演算子の優先度は、内容を期待される丸括弧なしで、複雑な式を許容するような方法で選択さ
れる。
論理 AND(&&)は、二つの式が非ゼロであると評価された場合のみ、1を返し、それ以外は0を返す。
もし最初の式が偽と評価するなら、第二の式は評価されない。
例:
論理 OR(||)は、式のいづれかが非ゼロと評価される場合、1を返し、他は0を返す。
もし、最初の式が真と評価されると、第二の式は評価されない。
例:
page
126
131
Logical Expressions and Side Effects(論理式と副作用)
Effects
複雑な論理式の一般的な規則は、引き続く論理オペランドの評価は、最後の結果が判った瞬間に停止する、という
ことである。
例えば、もしわれわれが次の式を有する場合、
aが偽(0)であると、オペランドb,cは評価されない。もしbとcが式の場合、それらの副作用が発生する可能
性がないので、これは非常に重要である。
Logical vs.
対 ビット)
vs. Bitwise(論理
Bitwise
ビットと論理演算子の作用の仕方の原理的な違いに注意すること。
例:
page
127
132
Conditional operator ?: (条件演算子)
条件演算子?:は C におけるたった3組の演算子である。条件演算子のシンタックスは次の通り。
expression1 が最初に評価される。もしその値が真ならば、次に expression2 が評価され、expression3 は無視され
る。もし expression1 が偽と評価されれば、次に expression3 が評価され、expression2 は無視される。
結果は、評価された方に依存する expression2 または expression3 のいづれかの値となるだろう。
もしあなたがそれらに副作用の発生を期待するならば、これら2つの式のうち1つだけが評価されるという事実が非
常に重要なのである。
条件演算子は右から左へ関連付けられる。
ここに2つの実例がある。
Conditional Operator Rules
Expression1 はスカラ表現でなければならない。つまり expression2 と expression3 は次の規則のうち一つに従わ
ねばならない。
1.両方が算術型
expression2 と expression3 は、通常の算術変換を目的とし、それは結果として生じる型を決定する。
2.両方が互換性のある構造体またはユニオン型。
結果として出てくる型は expression2 と Expression3 の構造体またはユニオン型である。
3.両方とも void 型
結果として生じる型は vioid である。
page
128
133
4.両方とも互換性のある型の修飾又は非修飾されたバージョンを指すポインタの型
結果として生じる型は、両オペランドにより指し示される全ての型の修飾子型で修飾された型を指すポインタであ
る。
5.一つのオペランドがポインタであり、他はヌルポインタ定数である。
結果として生じる型は、両オペランドにより指し示される全ての型の修飾子型で修飾された型を指すポインタであ
る。
6.一つのオペランドはオブジェクトまたは不完全な型を指すポインタであり、他は修飾又は非修飾された void のバ
ージョンを指すポインタである。
結果として生じる型は、void を指す非ポインタのオペランドのそれである。
Assignment Operators
多くの他のプログラミング言語とは異なり、C は命令よりも操作(演算子により示される)として値の代入を取り
扱う。
Simple Asignment Operator
普通の値の代入のため、われわれは簡単な代入演算子(=)を使用する。
expression1 はわれわれが expression2 の値を代入するためのオブジェクト(メモリ配置)である。
オペランド expression1 は lvalue であるべきで、expression2 はどんな表現であってもよい。
代入式自身は lvalue ではない。
もし expression1 と expression2 が異なった型であるならば、expression2 の結果は、もし必要ならば、expression1
の型に変換されるだろう。さらなる情報は Type Conversions を参照せよ。
Compound Assignment Operators
C は複合代入演算子により更に複雑な代入を可能にする。
複合代入演算子のシンタックスは次の通り。
Op の場所には、バイナリ演算子+,-,*,/、%、&、|、^、<<、>>の内の1つが入る。
page
129
134
かくして、われわれは10の異なった複合代入演算子を手にする。つまり、+=、-=、*=、/=、%=、&=、
|=、^=、<<=及び>>=。これらの全てが右から左へ関連ずけられる。
複合演算子(例えば、+ =)を分離する空白(スペース)はエラーを生成する。
複合代入は次のものと同じ効果を有する。
Lvalue expression1 以外は1度だけ評価される。
例えば、
は以下と同じ。
Assignment rules
単純および複合代入のどちらも、オペランド expression1 と expression2 は次の規則の一つに従わねばならない。
1.Expression1 は修飾又は非修飾された算術タイプであり、expression2 は算術型である。
2.Expression1 は、expression2 の型と互換性のある修飾又は非修飾された構造体またはユニオン型のバージョン
を有する。
3.Expression1 と expression2 は、修飾又は非修飾された互換性のある型のバージョンを指すポインタであり、左
に指し示される型は、右に指し示される型の全ての修飾子を有する。
4.Expression1 も expression2 もオブジェクト又は不完全な型を指すポインタであり、その他は修飾又は非修飾さ
れた void のバージョンを指すポインタである。左に指し示される型は、右に指し示される型の全ての修飾子を有する。
5.Expression1はポインタであり、expression2はヌルポインタ定数である。
page
130
135
Sizeof Operator
接頭単項演算子 sizeof は、どのくらい多くのメモリ空間がそのオペランド(ある例外と共にその型により決定され
る)により使用されているか、というバイトサイズを取得する整数定数を返す。
演算子 sizeof は、識別子型またはオペランドとしての単項式の両方を取り得る。
あなたは、関数型の式、不完全な型、丸括弧に入れた名前のような型と共に、またはビットフィールドオブジェクト
を指定する lvalue と共に sizeof を使用できない。
関数タイプの式。不完全なタイプ、括弧で閉じられたそのようなタイプの名前とともに、またはビットフィールドオ
ブジェクトを指示する lvalue とともに sizeof を使用できない。
Sizeof Applied Expression
もし式に適用されるならば、オペランドのサイズが式を評価すること無く決定される(そして、それ故に副作用も
ない)
。演算の結果は式の結果の型のサイズとなるであろう。
Sizeof Applied type
もし型識別子に適用されれば、sizeof は指定された型のサイズを返す。型のサイズの単位は1バイトと等価な sizeof
(char)である。演算 sizeof(char)は、char が符号付きまたは符号無しのどちらでも、結果1を与える。
オペランドが配列型のパラメータでない場合、結果は配列内の全バイト数となる。
(言い換えると、配列名はポイン
タ型に変換されない)
もしオペランドが配列型または関数型として宣言されたパラメータならば、sizeof はポインタのサイズを与える。
構造体やユニオンに適用される場合、sizeof は、全ての内容物を含む全バイト数を与える。
演算子 sizeof は関数に適用することはできない。
page
131
136
EXPRESSIONS(式)
式は演算子、オペランド及び計算を指定する句読点のシーケンス(連続)である。形式的には式は再帰的に定義さ
れる。部分式は形式的な制限なしでネストすることが可能である。しかし、もし複雑すぎて式をコンパイルできない
場合、コンパイラはメモリ不足エラーを報告する。
ANSI C では、最初の式は:定数(リテラルとしても参照される)
、識別子、及び再帰的に定義された(式)である。
式は、確実な変換、グループ化、結合法則および使用されたオペランド、丸括弧の存在及びオペランドのデータ型
に依存した優先度規則に従って評価される。演算子の優先度と結合法則は、Operator
Precedence
と
Associativity に要約されている。オペランドと部分式がグループ化される方法だが、それらがmikroCによって
評価される実際の順番を指定する必要は無い。
式は lvalue、rvalue または no value を作り出す。式は、それらが値を生成しようとしなかろうと、副作用の原因を
もたらすに違いない。
Commma Expressions
C の仕様の一つに、よく呼び出されるカンマ式またはシーケンスを形成するためのシーケンス演算子としてカンマ
を使用することが可能である。
カンマ式は式のカンマ区切りのリストである。-式が期待される場所で使用される可能性があるので、それは形式的
には単一式として取り扱われる。
次のシーケンス
は、全ての式の結果を与える値と expression_2 の型と共に、各式の左から右への評価の結果である。
Expression_1 の結果は捨てられる。
page
132
137
バイナリ演算子カンマ(,
)は、優先度は最も低く左から右へ関連付けられる。そのため、a,b,cは(a,b)
,
cと同じである。これはわれわれに多くの式を連続で書くことを可能にする。
これは、全ての式の結果を与える値と expression_n 型に伴う各式の左から右への評価の結果である。他の式の結果
は捨てられるが、それらの(可能な)副作用はきっと発生する。
例:
注意)
関数の引数リストと初期化子のリスト内の要素を分離するカンマ句読点を伴うカンマ演算子(シーケンス演算子を
混同しないこと。カンマを2つ使用して混合することは有効であるが、あなたはそれらを区別するために丸括弧を使
用しなければならない。
関数の引数や初期化子内のカンマに伴うあいまいさ(両義性)を避けるため、丸括弧を使用する。
例:
は4つではない3つの引数(i,5,k)
、を伴った関数 func を呼ぶ。
page
133
138
STATEMENTS(文)
文はプログラムの実行しつつ制御の流れを指示する。特定のジャンプと選別文を欠落すると、文がソースコードに
書かれたとおりに命令を順番に実行される。
ステートメントは大雑把に内部で分割することが可能である。
-ラベル付き文
-式文
-選択文
-繰り返し文(ループ)
-ジャンプ文
-混合文(ブロック)
Labeled Statements
プログラム内の全ての文はラベルつけすることができる。ラベルはこのような文の前に追加される識別子である。
ラベルの特別な宣言はない。-それは正に文に“札を付ける”
。
Label_identifier は関数スコープ(有効範囲)を有し、ラベルは同じ関数内では再定義できない。
ラベルはそれら自身名前空間を有する。つまり、ラベル識別子はプログラム内の他のいかなる識別子ともよい相手
となることが可能である。
文は2つの理由からラベル付けすることが可能である。
1.ラベル識別子は無条件 goto 文のためのターゲットとして役立つ。
2.ラベル識別子は switch 文のためのターゲットとして役立つ。この目的のために、文にラベル付けした case と
default のみが使用される。
page
134
139
Expression Statements
セミコロンに続く式はすべて式文を構成する。
mikroC は expression を評価することにより式文を実行する。
この評価から来る全ての副作用は、次の文が実行される前に完了する。
たいていの式文は代入文または関数呼び出しである。
空文は一つのセミコロン(;)からなる特殊な場合である。
空文は何も行わず、またそれ故に、あなたのプログラムはそれを必要としなくとも、mikroC シンタックスが文に期
待する状況においては有用である。
Selection Statements
選択またはフロー制御文はある値をテストすることにより、二者択一的過程から選択する。
Cでは選択文には2つの型がある。それはifとswitchである。
If Statement
条件分を実行するためにif文を使おう。if文のシンタックスはつぎの通り。
expression が真のとき、statement1 が実行される。もし expression が偽ならば、statement2 が実行される。
expression は整数値に対して評価されねばならない。さもなければ条件は文法的に正しくない。expression を囲
む丸括弧は必須である。
キーワード else は任意であるが、ifとelseの間に来る文は無い。
page
135
140
Nested if statements
入れ子になったif文は追加の注意を必要とする。
一般的な規則は、入れ子になった条件は、その左の直近の有効なifに結びついた個々のelseと共に、最も深い
部分の条件から開始して構文解析される。
注意:#ifと#elseプリプロセッサ文(命令)はifとelseに似ているが、まったく異なった効果を有す
る。それらはどのソースファイルの行をコンパイルし、どれを無視するのかを制御する。
Switch Statement
ある条件を基本にした指定のプログラム分岐へ制御を渡すためにswitch文を使おう。
switch文のシンタックスは次の通り。
最初に expression (条件)が評価される。それから switch 文は、キーワード case に続く全ての有効な constant
-expressions とそれを比較する。もしが一致が見出されると、switch は、一致した文字列の評価に続く statement
を指し示す、一致する case へ制御を渡す。
constant-expressions は整数に対し評価されねばならない。同じ値を評価するために2つの同じ constant-
expressions があってなならない。
expression を囲む丸括弧は必須である。
page
136
141
一致を発見すると、プログラムの流れは通常の状態で継続する。次の命令が、可能な case ラベルに関係なく、自然な
順序で実行される。もし条件を満足する case が無いならば、defalt case が評価される。
(defalt ラベルが指令され
る場合)
例えば、もし変数iが1と3の間の値の場合、次の switch は常に4としてiを返すであろう。
他の全ての cases を評価することを避けるため、switch から制御を放棄し、break の付いた case で終了する。
条件付の switch 文は入れ子にすることができる。-そのとき、case と defalt ラベルが switch 文を囲む最深部に割り
当てられる。
ここに switch の簡単な例がある。
われわれは3つだけの異なった状態(0,1,2)とこれらの状態のそれぞれと一致する関数(イベント)有すると
仮定しよう。これは、われわれが適切なルーチンへコードを切り替えることを可能にする方法である。
page
137
142
Iteration Statements
繰り返し文はひとまとめの文をループさせる。Cにおける繰り返し文には3つの形式がある。While、do、及びf
orである。
while statement
文を条件付きで繰り返すにはキーワード while を使おう。While 文のシンタックスは次の通り。
statement は、式の値が偽となるまで、繰り返し実行される。statement が実行される前にテストが行われる。かく
して、もし expression が最初のパスで偽と評価されると、ループは実行されない。
expression を囲む丸括弧は必須である。
ここに、while 文を使用した二つのベクトルのスカラ乗積(内積)の計算がある。
ループの本体には空文が可能であることに注意しよう。
例:
page
138
143
Do Statement
Do 文は、条件が偽となるまで実行される。Do 文のシンタックスは次の通り。
statement は expression の値が非ゼロである限り、繰り返し実行される。expression は個々の繰り返しの後に評価さ
れ、故にループは少なくとも一回は statement を実行するだろう。
Expression を囲む丸括弧は必須である。
Do は明示的にセミコロン(;)で終わる、C における単なる制御構造である。
他の制御構造は、それらが暗示的にセミコロンまたは右中括弧を含むということを意味する文で終わる。
ここに、do 文を使用した2つのベクトルの内積を計算する例がある。
For Statement
for 文は反復ループを実行する。for 文のシンタックスは次の通り。
ループの最初の反復の前に、式 init-exp がループのための開始時の変数を設定する。あなたは init-exp の宣言をパス
することはできない。
式 condition-exp は、ブロックへの最初のエントリ前に調査される。Condition-exp の値が偽となるまで、statement
が繰り返し実行される。ループの個々の繰り返しの後、increment-exp が loop-counter を増やす。
したがって、i++は機能上は++I と同じである。
page
139
144
全ての式は任意である。もし condition-exp が除外されると、常に真であると仮定される。
かくして、
“empty(空の)
”for 文は通常 C では無限ループを生み出すことになる。
このループから脱出する唯一の方法は、break 文による。
ここに for 文を使用した2つのベクトルの内積を計算する例がある。
あなたはこのようにそれを実行することができる。
しかし、これは悪いプログラミングのやり方と考えられる。
有効ではあるが、総量を計算方法は増分式の一部であるべきではない、なぜならそれは反復ルーチンのサービスでは
ないからである。われわれがループ本体に空文(;)を使用したことに注意しよう。
page
140
145
Jump Statements
ジャンプ文は、実行時には無条件で制御を渡す。MikroC にはそのような文が4つある。Break、continue、goto 及
び return である。
Break Statement
時には、あなたはその本体内からループを止めたいことがあるだろう。
最深部の switch、for、while 及び do ブロックに続く最初の文へ制御をパスするためループ内に break 文を使おう。
break は通常、最初の明確な一致のあった所でその実行を止めるため switch 文内に使われる。
例:
Continue Statement
あなたは“skip the cycle(サイクルを跳ばす)
“ためにループ(while、do、for)内で continue 文を使用できる。
それは、ループする構造体に属する終了中括弧で閉じた最深部の終わりへ制御をパスする。その時点でループ継続条
件は再評価される。これは、もしループ継続条件が真ならば、次の繰り返しの要求を継続する、という意味である。
Goto Statement
Statement
無条件にローカルラベルへジャンプするには Goto 文を使おう。
-ラベルに関する更なる情報は labeled Statements
を参照せよ。Goto 文のシンタックスは次の通り。
これは label_identifier で指定されるローカルラベルの位置へ制御を移すことになる。
label_identifier は goto 文がある同じ関数内のラベル名でなければならない。
Goto 行はラベルの前または後に来ることが可能である。
page
141
146
あなたは、入れ子になった制御構造の如何なるレベルからも脱出するために goto を使用できる。
しかし、そのブロックの初期化を跳ばしている間-例えばループ本体内でのジャンプなどのように、goto はブロック
内でジャンプするために使用できない。
読みやすい構造化されたプログラムの結果、現実的な多くのアルゴリズムは Goto 文無しで実行されるので、Goto 文
の使用は一般的には思いとどまることになる。
考えられる1つの Goto 文のアプリケーションは深い入れ子となった制御構造からの脱出である。
Return Statement
任意に値を返す呼出ルーチンへ戻り、現在の関数ブロックから出るために return 文を使おう。
シンタックスは次の通り。
これは expression を評価し、結果を返す。もし必要なら、戻り値は自動的に期待される関数型に変換されるだろう。
expression は任意である。もし省略されれば、関数はメモリからランダムな値を返すだろう。
注意:void 型の関数内の return 文は expression を有することができない-事実、もしそれが関数本体内の最後の文
であるならば、あなたは return 文を完全に省略可能である。
page
142
147
Compound Statement(Blocks)
Statement(Blocks)
複合文またはブロックは、そろいの中括弧{ }で囲まれた文のリスト(可能なら空)である。
構文的には、ブロックは単純な文であると考えることができるが、識別子の有効範囲でも役を果たす。
ブロック内で宣言された識別子は、宣言に始まり、右中括弧で終わる有効範囲を有する。
ブロックはメモリの限界までならどんな深さにも入れ子にすることができる。
例えば、for ループはその本体内の1文に期待し、故にわれわれはそれを複合文にパスすることができる。
他の文とは異なり、複合文はセミコロン(;)で終了しないことに注意しよう。
つまり、右中括弧に続くセミコロンは決してないのである。
page
143
148
PREPROCESSOR(プリプロセッサ)
プリプロセッサはコンパイルするためのソースコードを備えた統合的なテキストプロセッサである。
-指定したファイルからコード内のある点へテキストを挿入する
-他のシンボルと共に明確な字句シンボルを再配置する
-条件によりコードの構成要素を含めたり省略したりする条件付コンパイル
プリプロセッサはトークンレベルでテキストを解析するのであり、個々の文字レベルではないことに注意しよう。
プリプロセッサはプリプロセッサ命令やプリプロセッサ演算子により制御される。
Preprocessor Directives
#がストリングリテラル内か、文字定数内か、コメントに組み込まれたものでない限り、先頭が#のソースコード
内の行は全てプリプロセッシング命令(または制御行)として受け取られる。
最初の#は空白(新しい行を除いて)に先行するか、次に続けることが可能である。
プリプロセッサ命令は通常ソースコードの始まりに配置されるが、それらはプログラム内のどこにでも合法的に出
現可能である。MikroC プリプロセッサはプロセッサ命令を検出し、それらの中に組み込まれたトークンを構文解析
する。命令はその宣言からプログラムファイルの終わりまで有効である。
MikroC は標準的なプリプロセッサ命令をサポートする。
注意:#pragma 命令は構造の下にある。
page
144
149
Line Continuation with Backslash
もしあなたが複数行内で命令を止めたいときは、バックスラッシュ(\)で行を終了することによりそれを実行で
きる。
Macros
マクロは、形式的で関数形式のパラメータの一式のある無しに関わらず、コンパイルの前に、トークン再配置のた
めの仕組みを備えている。
Defining Macros and Macro Expansions
#define 命令は次のように macro を定義する。
この制御行に続くソースコード内の macro_identifier の各生成は、おそらく空の token_sequence と共に元の場所
に再配置されるであろう。
(後に注意すべきいくつかの例外処理もある。
)そのような再配置はマクロ展開として知ら
れている。Token_sequence はマクロの本体と呼ばれることがある。空のトークンシーケンスは、結果としてソース
コードから個々に影響を受けたマクロ識別子を取り除く。
セミコロン(;)はプリプロセッサ命令を終了するために必要とされるわけではない。
セミコロンを含んだトークンシーケンス内で見つかるどのキャラクタも全て、マクロ展開内に現れるだろう。
Token-sequence は遭遇した最初のバックスラッシュの無い新しい行で終了する。
トークンシーケンス内のコメントを含む余白の連続は全て1つの空白文字と共に再配置される。
それぞれ独立したマクロ展開の後、さらに進んだスキャンが新たに展開されるテキストを作成する。
これは入れ子となったマクロの発展の可能性を許す。展開されるテキストは、再配置のための目的であるマクロ識別
子を含むことが可能である。しかしながら、もしマクロがプリプロセッシング命令に良く似たものに展開されるなら
ば、そのような命令はプリプロセッサにより認識されないだろう。
リテラルストリング、文字定数、またはソースコード内のコメント内に見つかるマクロ識別子の出現はすべて展開さ
れない。
page
145
150
マクロは、それ自身の展開中には、展開されないだろう。
(#define MACRO MACRO が漠然と展開されない
ように)
。
例をとってみよう
新しい定義が、正確に、現存するそれと同じトークン毎の定義でないかぎりは、既に定義されたマクロ識別子を再
定義しようとすることは、結果として警告を招くだろう。
定義が他のヘッダーファイルに存在するであろう場合の好ましい手順は次の通りである。
もし if BLOCK_SIZE が現在定義されているならば、真中の行は飛ばされる。もし BLOCK_SIZE が現在定義
されていなければ、真中の行はそれを定義するために呼び出される。
page
146
151
Macros with Parameters
次のシンタックスはパラメータを伴うマクロを定義するために使われる。
macro_identifier と“
(”の間には余白は不要であることに注意しよう。
任意の arg_list は、C 関数の引数リストとは違った、カンマで分けられた一連の識別子である。
各カンマで区切られた識別子は、正式な引数または代替物の役を果たす。
そのようなマクロは、サブシーケンスのソースコード内で次のように書くことで呼び出される。
シンタックスは関数呼出のそれと同じである。実際、多くの標準ライブラリ C“関数”はマクロとして実行される。
しかしながら、いくつかの重要な意味の相違点がある。
任意の actual_arg_list は、#define 行の正式な arg_list に見られるものと同じ、実際の引数として知られるカ
ンマで区切られたトークンシーケンスを含まねばならない。-それらは個々の正式な引数に対する実際の引数でなけ
ればならない。
もし2つのリスト内の引数の数が異なる場合、エラーが報告されるだろう。
マクロ呼出は結果として2セットの再配置となる。第一は、マクロ識別子と丸括弧で囲まれた引数は、トークンシ
ーケンスにより再配置される。次は、トークンシーケンス内で発生する正式な引数は全て、actual_arg_list に現れ
る一致した真の引数によって再配置される。
簡単なマクロ定義のように、再スキャンは、展開に望ましい埋め込み式のマクロ識別子の全てを検出するために発生
する。
page
147
152
ここに簡単な例がある。
マクロ本体内の各引数を、周囲を取り巻く丸括弧に入れることは大いに推奨される。
これは演算子の優先度に伴い起こり得る問題を回避するであろう。
Undefining Macros
あなたは#undef 命令を使用してマクロを未定義にすることができる。
#undef 命令は macro_identifier から全ての以前のトークンシーケンスを取り外す。つまり、マクロ定義は無視され
たままで、macro_identifier は未定義となる。マクロ展開が#undef 行内に起こらない。
実際の定義に関わらず、定義済または未定義の状態が識別子の重要な特質である。
いかなる識別子が現在定義されていようといまいと、試験に使われる#ifdef と#ifndef の条件命令は、コンパイルの多
くの局面を制御するための汎用性のある仕組みを提供する。
マクロ識別子が未定義とされ続けた後、それは、同じかまたは異なったトークンシーケンスを使用して、#define
で再定義することが可能である。
page
148
153
File Inclusion
プリプロセッサ命令 #include はソースコードにヘッダーファイル(拡張子.h)を呼び込む。
ソースファイル(拡張子.c)を含めることをプリプロセッサに依存してはいけない。-更なる情報は Projects を参照
せよ。
#include 命令のシンタックスには2つの形式がある。
プリプロセッサは #include 行を取り除き、ソースコード内のその位置にヘッダファイルの全テキストをそれに置
き換える。それゆえに、#include の配置は、含まれるファイル内のすべての識別子のスコープ(有効範囲)とデュレ
ーション(持続期間)に影響する。
2つのフォーマットの違いは、インクルードファイルを配置しようと尽力するアルゴリスムを探すことに起因する。
もし #include 命令が<header name>バージョンで用いられた場合、捜索が、この特別な順序で、個々の次の
位置で首尾よく行われる。
1.mikroCのインストールフォルダ>“include”フォルダ
2.あなたのカスタムサーチパス
“header name”バージョンは、ユーザーが提供するインクルードファイルを指定する。
mikroCは、この特別な命令で、次の場所でヘッダーファイルを捜す。
1.プロジェクトフォルダ(プロジェクトファイル.ppc を含むフォルダ)
2.MikroC インストールフォルダ>“include”フォルダ
3.あなたの独自のサーチパス
Explicit Path
もしあなたが<header_name>に明示的なパスを置けば、そのディレクトリのみが検索されるだろう。
例:
page
149
154
注意:めったに使用されない#include 命令の第三のバージョンもあり、それは #include に続く最初の非余白文字で
ある<も“ も現れない。
<header_name >
及び “header_name” 形式のいづれでも、有効に区切られたヘッダー名にマクロ識別子を展
開するであろうということが、マクロ定義の存在を仮定している。
Preprosessor Operators
1行に最初の非余白文字列として存在する場合、#(ポンド記号)はプリプロセッサ命令である。
また、プリプロセッサ スキャニング フェーズ(検査段階)の間、#と##は演算子の再配置と連結を実行する。
Operators #
C プリプロセッサにおいて、引用符で囲まれた文字列の連続はトークンと考えられ、その内容は分析されない。こ
れは引用符内のマクロ名が展開されないことを意味する。
もし、あなたが、プリプロセッシングの結果としての実際の引数(引用符内の文字列の正確な順序)を必要とする
なら、マクロ本体内で#演算子を使用可能である。
それは、再配置後に実際の引数をストリングに変換するため、定義における正式なマクロ引数の前に配置することが
可能である。
例えば、LCDに変数名と値を表示するために、マクロ LCD_PRINT を使ってみよう。
(行継続のシンボルとしてのバックスラッシュに注意)
page
150
155
では、次のコード
はこのように前処理するはずである。
Operator##
演算子 ## はトークン(字句)を貼り付けるのに使用される。あなたは、それら(両側に任意の余白を加える)
の間に ## を置くことで二つのトークンを貼り付け(又は連結)ることができる。
一つの新しいトークン内で分割したトークンを連結して、プリプロセッサは余白と##を取り除く。
これは識別子を構成するために通常使用される。
例えば、われわれは1つの識別子内に二つのトークンを貼り付けるためのマクロ SPLITE を定義できるはずである。
今、呼出し SPLITE(cnt,2) は識別子 cnt_2 に展開される。
注意)mikroCはトークン貼り付け用法( l/**/r )といったより古いポータブルでない方法はサポートしていない。
Conditional Comparison
条件付きコンパイル命令は一般的に、異なった実行環境においてソースプログラムを容易に変更し、かつ容易にコ
ンパイルするために使用される。mikroC は、適切なソースコード行と空白行を置き換えることで条件付きコンパイ
ルをサポートしている。
全ての条件付きコンパイル命令は、それらが開始されるソースまたはインクルードファイル内で完成されていなけ
ればならない。
page
151
156
Directive #if,
#if,#elif.,
#elif.,#else,
#else,and #endif
#endif
条件付き命令 #if, #elif, #else, #endif は共通の C 条件付き分によく似た作用をする。もしあなたが #if の後
に書く式が非ゼロ値ならば、#if 命令の直後に続く行グループは、翻訳ユニット内に記憶される。
シンタックスは以下の通り。
ソースファイル内の各#if 命令は、閉じるための #endif 命令によりつり合いをとらねばならない。
多くの #elif 命令を、#if と #endif 命令の間に表わすことが可能であるが、少なくとも1つの #else 命令は許さ
れる。#else 命令は、もしあらわれたら、#endif の前の最後の命令でなければならない。
この section(セクション)は、コンパイラまたはプリプロセッサに対し意味のある、あらゆるプログラム・テキス
トでありうる。プリプロセッサは、それが真(非ゼロ)の汎定数整数式を見つけるまで、
、各#if または#elif 命令に続
く constant_expressions を評価することで1つの section(セクション)を選択する。
Constant_expressions はマクロ展開のための目的である。
もし、すべての汎定数整数式の実現値が偽ならば、または、#elif 命令が出現しないならば、プリプロセッサは #else
節の後、テキストブロックを選択する。もし、#else 節が省略され、#if ブロック内の全ての constant_expressions
の事例が偽である場合、セクションは更に先の処理のために選択されることはない。
page
152
157
処理された section は、いかなる深さで入れ子となった、更に先の条件節を含むことが可能である。
#else,#elif、または #endif 命令で入れ子となった各々は、直近で優先される #if 命令に帰属する。
先行するシナリオの最終結果は、1つのコード section(おそらく空の)だけがコンパイルされるであろう、とい
うことである。
#Directives #ifdef and #ifndef
あなたは #if が使用されうるところならどこでも #ifdef と #ifndef 命令を使用できる。#ifdef と#ifndef 条件付
き命令は、識別子が現在定義されているか否か、試験する。
行
は、確かに、もし identifier が現在定義されているならば、#if 1 と同じ効果があり、もし identifier が現在未定
義ならば、#if 0 と同じ効果がある。その他の命令、#ifndef は、反対の結果を生み出す“未定義の”条件に対し真で
あるか試験する。
その後、シンタックスは #if、#elif、#else、#endif のそれに続く。
NULL として定義された識別子は定義されたものとみなされる。
page
153
158
page
154
159
Fly UP