静的変数は、変更します
1修飾静的ブロック変数を使用して
- これは、静的記憶域期間、ブロックスコープとリンクせずにしています。
変数はプログラムの終了時に終了、プログラムがロードされるときに作成され、その範囲はブロックのみで、ブロックが外部に呼び出すことはできませんされています。 - これは、コンパイル時にのみ一度初期化。あなたが明示的に初期化されない場合は、0にデフォルトで初期化。
#include <stdio.h>
void trystat(void);
int main(void)
{
int count;
for (count = 1; count <= 3; count++)
{
printf("Here comes iteration %d:\n", count);
trystat();
}
return 0;
}
void trystat(void)
{
int fade = 1;
static int stay = 1;
printf("fade = %d and stay = %d\n", fade++, stay++);
}
程序执行结果:
:ここでは、反復1が来る
フェード= 1、= 1滞在
反復2が来るここで:
フェード= 1、= 2滞在
反復3は来てここで:
フェード= 1および= 3滞在します
(1)ここで、変数はstay
、そのプログラムが終了するまで、ある最初からロードされます。しかしながら、範囲はこれらに限定されているtrystat()
機能ブロック。この関数が実行された場合にのみ、プログラムを使用することができstay
、それ指定されたオブジェクトにアクセスします。
(2)変数がstay
再び開始するたびに、その値が1だけ増加覚え、しかし可変フェード。:これは、初期設定の違いを指摘しfade
てtrystat()
、各コールの再初期化、およびstay
変数は一度だけ初期化されます。
それはすでに適所になった後(3)プログラム内の静的変数がメモリにロードされます。声明static int stay = 1;
trystat()関数では、唯一可能にコンパイラ伝えtrystat()
関数は変数を参照してくださいすることを、それは文が実行時に実行されていません。
図2は、任意の関数の外部スタティック変数を使用して修正しました
- これは、静的記憶時間、ファイルスコープや内部リンクがあります。
現在のファイル内のその範囲は、(機能が同じファイルでのみを使用することができます)、他のファイルで呼び出すことはできません - これは、コンパイル時にのみ一度初期化。あなたが明示的に初期化されない場合は、0にデフォルトで初期化。
静的変更機能を使用します
- マルチファイル関数名の競合の可能性を回避するために、適用範囲は、現在定義されているファイルの使用を制限します。通常、インターフェースの機能としてファイルので、同じ関数名の競合を使用して別のファイルを避け、静的な変更を使用することは推奨されません。
static BOOL wavTaskCreated = FALSE;
static QueueHandle_t wav_msg_queue = NULL;
static WAV_PLAY_QUEUE_t wavPlayQueue;
static bool wav_get_version_flag = false;
static char wav_version[32];
static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type)
{
}
static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName)
{
}
static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo)
{
}
static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size)
{
}
static bool Wav_SendToDA(uint8_t *pFile, uint32_t size, uint32_t volume)
{
}
static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR)
{
}
static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType)
{
}
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type)
{
}
void Wav_Init(void)
{
DA_Init(16000);
if (!wavTaskCreated)
{
wavTaskCreated = TRUE;
xTaskCreate(wav_task, "WAV", STACK_SIZE_TASK_WAV, NULL, PRIORITY_TASK_WAV, NULL);
wav_msg_queue = xQueueCreate(WAV_MSG_QUEUE_LENGTH, sizeof(WAV_MESSAGE_t));
wavPlayQueue.pWavTypeTable = malloc(WAV_PALY_QUEUE_MAX * sizeof(WAV_TYPE_t));
}
wavPlayQueue.front = 0;
wavPlayQueue.end = 0;
wavPlayQueue.sizeNow = 0;
wavPlayQueue.totalSize = WAV_PALY_QUEUE_MAX;
}
bool Wav_Play(WAV_TYPE_t wav_type, bool force)
{
if (!wavTaskCreated)
{
return false;
}
if (force)
{
vPortEnterCritical();
watchdog_feed();
Wav_Play_Inernal(wav_type);
vPortExitCritical();
return true;
}
bool rv = Wav_Put_Queue(wav_type, false);
vTaskDelay(30);
return rv;
}
上記使用されるブロードキャストWAV DAプラットフォームプログラムの断片であり、
static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type);
static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName);
static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo);
static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size);
static bool Wav_SendToDA(uint8_t *pFile, uint32_t size, uint32_t volume);
static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR);
static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType);
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type);
内部使用の機能のために、上述した機能static
の改変。
void Wav_Init(void);
bool Wav_Play(WAV_TYPE_t wav_type, bool force);
これは、静的変形を使用することなく、外部コールのための2つの機能モジュールインタフェース(DA初期化機能とプレイWAV)、前記しました。