2010-12-05 7 views
3

永続変数は広く使用されていませんか?私はオンラインまたは私のCの教科書の索引にそれらについて多くの情報を見つけることができなかった - C.cの永続ローカル変数

の芸術と科学を

あなたがそれらについて共有することができます何かを、特にその範囲と例宣言が参考になります。私はキーワードとして「永続的」を使用すると宣言していると思いますか?

static void foo(void) { 
    persistent unsigned int width = 5; 
} 

これは私が見つけることができる唯一の他の有用なリファレンスです: ボードがオフになっているときとで、メインが実行されると、システムリセットが発生したときに「永続変数は、その状態を保ちます。ファイルをロードまたはアンロードした結果としてコードがダウンロードされると、永続変数は状態を失います。」 http://www.newtonlabs.com/ic/ic_5.html#SEC9

ありがとう!

答えて

3

ローカル(グローバルではない)コンテキストではstaticです。

コンテキスト事が重要です。

ここ static
#include <stdio.h> 

static int foo; 

int main(int argc, char **argv){ 
    //... 
} 

fooがファイル有効範囲を持つことを意味する(すなわちexternではありません)。

char *strtok(char *str, char *sep){ 
    static char *last; 
    //... 
} 

last

一方はstrtokへの呼び出しの間で永続的です。

これらは、まれには有用ではなく、マルチスレッドのコンテキスト(実行待ちの競合状態)ではまったく受け入れられないため、ほとんど使用されていません。

+0

私は最初のクラスを取ったときにこのスレッドに戻ります。私は何が「永続的」であるのか分からなかった。もう一度お返事ありがとうございます。 – tarabyte

+0

この回答は多少忘れる。 'static'キーワードは可変スコープと関係があり、C標準の一部です。 'persistent'キーワードは、起動時に変数メモリがどのように初期化されるかを制御し、標準Cではありません。より完全な答えはhttps://stackoverflow.com/a/4357304/973624を参照してください。 – mrtumnus

+0

@mrtumnus Uhhh ...ええ。私はそれを削除すべきですが、それが受け入れられている間、私はそれを行うことはできません。なぜ私はタラバイトがそれを受け入れたのか疑問に思っています。 – dmckee

8

対話型C(提供したリンク)はpersistentキーワードを提供しますが、は標準ではありませんC。特に、 ""のような保証は、ボードの電源が切られたとき、メインが実行されたとき、そしてシステムリセットが発生したときにその状態を維持するので、 "。

persistentは、インタラクティブCコンパイラで提供されており、この場合はモトローラの専用ハードウェアで動作し、変数値を不揮発性メモリに格納して再起動時の永続性を実現します。

インタラクティブCは、多くのMotorola 6811ベースのロボットと組み込みシステムのCコンパイル環境です。もともとMIT LEGO Robot Design Contest(6.270)用に開発されたInteractive Cは、広く普及し、使用されていました。インタラクティブなCの主張は、インタラクティブ性です。ユーザーは、長時間のコンパイルとダウンロードのサイクルを待つのではなく、式を入力して即座にコンパイルしてすぐに実行できます。現在、ICは6.270、HandyBoard、RugWarrior、RugWarrior Proをサポートしています。 source

ローカルスコープ(たとえば、関数)で可変持続性を達成するには、staticキーワードを使用します。

+0

'persistent'はマイクロチップの8ビットコンパイラのキーワードでもあります。同様に、指定された変数がランタイムスタートアップコードによってクリアされてはならないことを示します。 – mrtumnus

0

jkerianが言及したように、永続変数は、ボードの電源を切って入れ直すと状態を維持します...これに使用できるメモリはEEPROMだけなので、Cスタートアップコード(コンパイラに依存)によって除外されます。

他の変数と同様に、揮発性メモリに格納された永続変数は、電源が失われたときにコンテンツを失います。しかし、この種の変数は、FRAMを備えたデバイス上で有用です。 FRAMは、強誘電体RAMの略語であり、電源オフ後もデータを保持できる不揮発性メモリです。 注:COFFモードのCCSでは、初期化されていない変数は0(起動時間を節約するため)に設定されていないため、常に永続的でした。

関連する問題