?? formula.h
字號:
/***************************************
Filename : formula.h
Version : Formula Language V1.1
Author : Shen Tu Hongnan
Modify :
Date : 2001/08/26
Remark :
***************************************/
#ifndef FORMULA
#define FORMULA
#define STRING 0 /* 字符串 */
#define NUMBER 1 /* 數字型 */
#define MAX_STRING_LEN 128 /* 最大串長 */
#define RULE_STR_SIZE 1024 /* 規則串長 */
#define RULE_ADDR_SIZE 32 /* 跳轉地址表長(<=256) */
#define Zarray_SIZE 32 /* 臨時變量組長(<=256) */
#define STACK_SIZE 64 /* 堆棧大小 */
/* 數據域 */
typedef struct {
int type; /* 數據類型 */
double num; /* 數字型值 */
char str[MAX_STRING_LEN]; /* 字符串值 */
} FIELD;
/* 運算規則 */
typedef struct {
unsigned char str[RULE_STR_SIZE]; /* 公式字符串 */
int addr[RULE_ADDR_SIZE]; /* 跳轉地址表 */
double num[256]; /* 常數值表 */
} RULE;
#endif
/*************************************************************************/
extern int ReadRuleFile(FILE *fp, RULE *rule);
/*************************************************************************
Function: ReadRuleFile()
Purpose : 從規則文件中讀入公式行到運算規則 rule 中。
Input : 規則文件指針 fp,規則指針 rule。
Return : 返回 0,出錯時返回非零的錯誤代碼。
Modify : 無
Remark : 對公式語言進行了預編譯
錯誤代碼:
1...函數名錯
2...if....goto 語句錯
3...goto 語句錯
4...賦值表達式錯
5...下標超出范圍
6...標號錯誤
7...無效字符
8...邏輯非對象缺少括號
9...配對符號錯誤
10...常數太多
11...規則文件超長
*************************************************************************/
extern int Formula(RULE *rule, FIELD *Xarray, FIELD *Yarray);
/*****************************************************************************
Function: int Formula(RULE *rule, FIELD *Xarray, FIELD *Yarray)
Purpose : 解釋執行規則。
規則由公式行構成,公式行以回車結尾,可以有空行。
公式行結構 I : [標號:] [公式 [,公式]...] [goto 標號] [#注釋]
公式行結構 II: [標號:] if 算術或邏輯公式 goto 標號 [#注釋]
[]表示是可選的,[]本身不須輸入。
標號形為 @0,@1,... 共 RULE_ADDR_SIZE 個。
公式是由變量、常量、函數和運算符組成算術表達式、邏輯表達式、
字符串表達式、賦值表達式。這種構造是可嵌套的。
賦值表達式:變量名 = 各種表達式 (包括字符串表達式、賦值表達式)
賦值表達式的值就是右側表達式的值。
任何一個函數和表達式的值在計算時都代替了它自己在公式中的原有位置。
多個用逗號分隔的并列公式的值為最后一個公式的值。
Input : 運算規則指針 rule,
數據域數組 Xarray, 用于存放輸入數據,與公式中的 x0, x1,... 對應。
數據域數組 Yarray, 用于存放各返回值,與公式中的 y0, y1,... 對應。
x 和 y 都必須小寫,變量下標值范圍由調用程序定義,但不得超過 255。
Return : 返回 0,出錯時返回非零的錯誤代碼。
Modify : 可能修改了 Xarray、Yarray 數組各成員的值。
Remark : 在公式中還可使用 z0, z1,... 共 Zarray_SIZE 個中間變量,z 必須小寫。
一、公式符號表
———————————————————————————————————————
級別 符號 說明
———————————————————————————————————————
1 函數名 ! 函數參數及邏輯非的對象須用()括起
———————————————————————————————————————
2 * / 算術乘除
———————————————————————————————————————
3 + - 算術加減
———————————————————————————————————————
4 < <= > >= == != 算術比較
———————————————————————————————————————
5 && 邏輯與
———————————————————————————————————————
6 || 邏輯或
———————————————————————————————————————
7 = 將等號右側表達式的值賦給左側的變量
———————————————————————————————————————
8 ? : 條件運算符,條件運算符須用[]括起
———————————————————————————————————————
8 , 函數參數分隔符,并列公式分隔符
———————————————————————————————————————
9 ( ) 園括號,括號中的內容為0級
———————————————————————————————————————
9 [ ] 方括號,用于括起條件運算符
———————————————————————————————————————
" 字符串常量界定符,串內不能有雙引號
———————————————————————————————————————
@ 標號,@0,@1,...
———————————————————————————————————————
二、數值常量由數字字符及小數點構成,不支持科學記數法。每一條規則中最多只能
有256個常數。
由于沒有單目運算符負號, 數值常量必須為正數,-1可寫為(0-1)。
三、條件運算符也適用于字符串。方括號與園括號可以相互包含但不能交叉。
四、已有通用函數(函數名須照樣書寫,包括大小寫):
算術函數:
Abs(x) 取絕對值
Ceil(x) 取大于等于該數的最小整數
Dec(x) 取小數部分
Floor(x) 取小于等于該數的最大整數
Gradin(x, a, b) x 位于區間(a,b)中的值(b為0表示無窮大)
Max(x, y) 取最大值
Min(x, y) 取最小值
Mod(x, y) 取整除 x/y 的余數
Pow(x, y) 計算 x 的 y 次方
Round(x, n) 四舍五入至 n 位小數
字符串函數:
Asc(S) 求字符串首字符的 ASCII 碼
Atol(S) 將字符串轉換成長整數
FindStr(S1, S2) 在串 S1 中查找子串 S2 的位置,未找到返回 0
Head(S, n) 取字符串頭部 n 個字符
IsNum(S) 是數字字符串
LtoStr(n, m) 將正整數 n 轉換成 m 位字符串,不足前面加 0
RepChar(S, n) 將字符 S 重復 n 次
Strcat(S1, S2) 連接兩個字符串
Strcmp(S1, S2) 比較兩個字符串
Strlen(S) 求字符串的長度
SubStr(S, n, m) 從字符串的第 n 個字符起取 m 個字符
Tail(S, n) 從字符串的尾部取 n 個字符
Upper(S) 將串中的小寫字母改為大寫
日期函數(日期串 D 的標準格式為 YYYY/MM/DD hh:mm:ss ):
ConvDate(S, P) 將按 P 所示格式的日期串 S 轉換成標準格式
Date() 當前系統的日期時間串
DateAdd(D, P, n) 按格式串 P 的要求在 D 的相應部份上加上 n
DateDiff(D1, D2, P) 按格式串 P 的要求返回 D2 與 D1 的差值
DatePart(D, P) 按格式串 P 的要求返回 D 相應部份的數值
StrToTime(D) 將 日期串 D 轉換為日期串time_t 格式
TimeToStr(t) 將 time_t 格式的 t 轉換為日期串
指明日期串相應部份的 P 格式串:
yy 年份
qq 季度
mm 月份
dd 月份中的日
dy 年份中的日
dw 星期幾
hh 小時
hf 帶小數的小時(僅用于 DateDiff)
mi 分鐘
mf 帶小數的分鐘(僅用于 DateDiff)
ss 秒數
地址函數:
AddrToStr(u) 將 UINT4 IP 地址轉換成園點地址串
StrToAddr(S) 將園點地址串轉換成 UINT4 IP 地址
五、新增函數時函數名須以大寫字母開頭,其后的字符可以是字母、數字及下劃線。
函數名的長度不得超過 15 個字符。
新增函數必須在數組 FUNCTION Fun[Total_of_Fun] 中按函數名的 ASCII 碼遞增
順序插入一行初始化其函數名及其函數地址,并將常量 Total_of_Fun 增加一。
六、錯誤代碼:
n...第 n 號函數執行錯誤
*****************************************************************************/
/* End of file */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -