亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現進制轉換函數的實例詳解

2020-01-26 13:58:12
字體:
來源:轉載
供稿:網友

C語言實現進制轉換函數的實例詳解

前言:

寫一個二進制,八進制,十六進制轉換為十進制的函數

要求:

  1. 函數有兩個參數,參數(1)是要轉換為十進制的進制數,參數(2)是標示參數(1)是什么進制(2,8,16標示二進制,八進制,十六進制)。
  2. 要有報錯信息,比如參數是1012,但參數(2)是2,顯然是進制數表示有錯誤。

系統表 pg_proc 存儲關于函數的信息

內部函數在編譯之前需要先定義在 pg_proc.h 中,src/include/catalog/pg_proc.h

CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO{ NameData proname; /* procedure name */ /* 函數名,sql 中 select 函數名(); */ Oid  pronamespace; /* OID of namespace containing this proc */  /* 模式OID */ Oid  proowner; /* procedure owner */ /* 用戶OID */ Oid  prolang; /* OID of pg_language entry */ float4 procost; /* estimated execution cost */  /* 估計執行成本 */ float4 prorows; /* estimated # of rows out (if proretset) */ /* 結果行估計數 */ Oid  provariadic; /* element type of variadic array, or 0 */ regproc protransform; /* transforms calls to it during planning */ bool proisagg; /* is it an aggregate? */ /* 是否為聚集函數 */ bool proiswindow; /* is it a window function? */  /* 是否為窗口函數 */ bool prosecdef; /* security definer */  /* 函數是一個安全定義器,也就是一個“setuid"函數 */ bool proleakproof; /* is it a leak-proof function? */  /* 有無其他影響 */ bool proisstrict; /* strict with respect to NULLs? */ /* 遇到 NULL 值是否直接返回 NULL */ bool proretset; /* returns a set? */ /* 函數返回一個集合 */ char provolatile; /* see PROVOLATILE_ categories below */ int16 pronargs; /* number of arguments */ /* 參數個數 */ int16 pronargdefaults; /* number of arguments with defaults */ /* 默認參數的個數 */ Oid  prorettype; /* OID of result type */ /* 返回參數類型OID */ /* * variable-length fields start here, but we allow direct access to * proargtypes */ oidvector proargtypes; /* parameter types (excludes OUT params) */ /* 存放函數參數類型的數組 */#ifdef CATALOG_VARLEN Oid  proallargtypes[1]; /* all param types (NULL if IN only) */ char proargmodes[1]; /* parameter modes (NULL if IN only) */ text proargnames[1]; /* parameter names (NULL if no names) */ pg_node_tree proargdefaults;/* list of expression trees for argument     * defaults (NULL if none) */ Oid  protrftypes[1]; /* types for which to apply transforms */ text prosrc BKI_FORCE_NOT_NULL; /* procedure source text */ /* 函數處理器如何調用函數,實現函數的函數名 */ text probin;  /* secondary procedure info (can be NULL) */ text proconfig[1]; /* procedure-local GUC settings */ aclitem proacl[1]; /* access permissions */#endif} FormData_pg_proc;

在 proc.h 添加函數定義:

/* myfunc */DATA(insert OID = 6663 ( x_to_dec PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "25 23" _null_ _null_ _null_ _null_ _null_ x_to_dec _null_ _null_ _null_ ));DESCR("x_to_dec.");OID = 6663  /* OID 唯一,不能與其他定義 OID 重復 */x_to_dec  /* sql 中 select x_to_dec(); */2 0 23 "25 23"  /* 傳遞兩個參數; 默認 0; 返回值類型 OID = 23; 參數1類型 OID = 25, 參數2類型 OID = 23 */x_to_dec  /* 自定義函數名 */

這里的傳遞參數類型和返回值類型都用的了 OID

系統表 pg_type 存儲數據類型的信息

postgres=# select oid,typname from pg_type where typname = 'text' or typname = 'int4'; oid | typname -----+--------- 23 | int4 25 | text(2 rows)

在 src/backend/utils/adt/myfuncs.c 實現自定義的函數

首先創建函數的整體部分:

Datum  /* Datum 類型是PG系統函數大量引用的類型,其定義為:typedef uintptr_c Datum */x_to_dec (PG_FUNCTION_ARGS)  /* 函數名; 參數 */{  /* 獲取參數 */ text *arg1 = PG_GETARG_TEXT_P(0); int32 arg2 = PG_GETARG_INT32(1);  /** 實現功能 **/  /* 返回 */ PG_RETURN_INT32(sum);}

這里的 PG_GETARG_XXXX() 和 PG_RETURN_XXXXX() 在 src/include/fmgr.h

知道了如何獲取參數以及返回返回值,接下來是具體的實現:

Datum x_to_dec (PG_FUNCTION_ARGS){ int n = 0, i = 0, sum = 0, t = 0; text *arg1 = PG_GETARG_TEXT_P(0); int32 arg2 = PG_GETARG_INT32(1); char *str = text_to_cstring(arg1); n = strlen(str); switch(arg2) { case 2:  for(i = n - 1; i >= 0; i--)  {  if((str[i] - '0') != 1 && (str[i] - '0') != 0)  {   ereport(ERROR,   (errcode(ERRCODE_INVALID_PARAMETER_VALUE),   errmsg("Please enter the correct binary number, such as '110011'.")));  }  sum += (str[i] - '0') * ((int)pow(2, n - 1 - i));  }  break; case 8:  for(i = n - 1; i >= 0; i--)  {  if(!(str[i] >= '0' && str[i] <= '7'))  {   ereport(ERROR,   (errcode(ERRCODE_INVALID_PARAMETER_VALUE),   errmsg("Please enter the correct octal number, for example '34567'.")));  }  sum += (str[i] - '0') * ((int)pow(8, n - 1 - i));  }  break; case 16:  for(i = n - 1; i >= 0; i--)  {  if( !(str[i] >= '0' && str[i] <= '9') )  {   if(str[i] >= 'A' && str[i] <= 'F')   {   // Uppercase to lowercase   str[i] = str[i] + 32;   } else if ( !(str[i] >= 'a' && str[i] <= 'f') ) {   ereport(ERROR,    (errcode(ERRCODE_INVALID_PARAMETER_VALUE),    errmsg("Please enter the correct hexadecimal number, for example '9f'.")));   }  }  if(str[i] <= '9')  {   t = str[i] - '0';  } else {   t = str[i] - 'a' + 10;  }  sum = sum * 16 + t;  }  break; default:  ereport(ERROR,  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),  errmsg("Out of range! The second parameter, please enter: 2, 4, 16."))); } PG_RETURN_INT32(sum);}

其中用到了text_to_cstring(arg1) ,類型轉換的相關函數定義在 src/backend/utils/adt/varlena.c

/* * text_to_cstring * * Create a palloc'd, null-terminated C string from a text value. * * We support being passed a compressed or toasted text value. * This is a bit bogus since such values shouldn't really be referred to as * "text *", but it seems useful for robustness. If we didn't handle that * case here, we'd need another routine that did, anyway. */char *text_to_cstring(const text *t){ /* must cast away the const, unfortunately */ text  *tunpacked = pg_detoast_datum_packed((struct varlena *) t); int  len = VARSIZE_ANY_EXHDR(tunpacked); char  *result; result = (char *) palloc(len + 1); memcpy(result, VARDATA_ANY(tunpacked), len); result[len] = '/0'; if (tunpacked != t) pfree(tunpacked); return result;}

結果:

postgres=# select x_to_dec('111',2); x_to_dec ----------    7(1 row)postgres=# select x_to_dec('aA',16); x_to_dec ----------   170(1 row)postgres=# select x_to_dec('aA',1);ERROR: Out of range! The second parameter, please enter: 2, 4, 16. 

以上就是進制轉換的實例,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品视频| 亚洲国产精彩中文乱码av| 欧美理论电影在线观看| 国产91精品网站| 精品一区二区电影| 久久久99免费视频| 亚洲欧美中文字幕在线一区| 欧美国产日本高清在线| 成人免费视频a| 日本亚洲欧洲色α| 国产精品久久中文| 91黑丝高跟在线| 久久亚洲欧美日韩精品专区| 国产午夜精品视频| 欧美成年人视频网站| 亚洲欧洲第一视频| 精品福利在线视频| 欧美极品在线播放| 国产精品久久久久av免费| 亚洲精品国产成人| 国产一区二区在线播放| 97精品免费视频| 欧美性猛xxx| 成人黄色大片在线免费观看| 黄色成人av在线| 91深夜福利视频| 欧美多人乱p欧美4p久久| 欧美最猛性xxxxx(亚洲精品)| 国产伦精品一区二区三区精品视频| 欧美在线视频观看| 欧美极品第一页| 综合136福利视频在线| 伊人男人综合视频网| 日韩在线一区二区三区免费视频| 欧美电影免费播放| 久久久久久久香蕉网| 亚洲第一网站免费视频| 国产精品成人免费电影| 国产va免费精品高清在线观看| 欧美性猛交xxxx富婆| 亚洲高清av在线| 国产亚洲精品91在线| 国产裸体写真av一区二区| 久久精品成人欧美大片古装| 欧洲午夜精品久久久| 亚洲网站在线看| 欧美特黄级在线| 5566成人精品视频免费| 狠狠躁夜夜躁人人爽天天天天97| 欧美中文在线观看| 色偷偷偷亚洲综合网另类| 国精产品一区一区三区有限在线| 日韩在线观看免费全| 精品一区电影国产| 欧美日韩视频在线| 午夜精品久久久久久久白皮肤| 日韩免费av在线| xxx一区二区| 97在线看免费观看视频在线观看| 欧美理论电影在线观看| 久久人人爽人人爽爽久久| 亚洲天堂成人在线| 国产成人亚洲综合91精品| 日韩在线观看免费高清| 亚洲最新在线视频| 亚洲精品视频在线观看视频| 国产精品久久久久免费a∨| 午夜精品美女自拍福到在线| 国产精品伦子伦免费视频| 色噜噜亚洲精品中文字幕| 国产精品观看在线亚洲人成网| 久久久久国产一区二区三区| 亚洲成人av片| 欧美激情亚洲另类| 中日韩美女免费视频网址在线观看| 97成人精品视频在线观看| 亚洲专区在线视频| 成人免费看片视频| 亚洲国产精品成人av| 一本大道亚洲视频| 久热精品视频在线免费观看| 精品久久久久久久久中文字幕| 日韩av影视综合网| 欧美电影第一页| 欧美日韩视频在线| 中文欧美在线视频| 欧美激情视频在线免费观看 欧美视频免费一| 欧美中文在线字幕| 欧美精品少妇videofree| 亚洲性生活视频| 黑丝美女久久久| 亚洲小视频在线| 国产精品久久久久99| 91沈先生在线观看| 亚洲free性xxxx护士hd| 国模精品系列视频| 欧美寡妇偷汉性猛交| 91国语精品自产拍在线观看性色| 久久成人在线视频| 国产精品wwww| 日韩美女免费观看| 热久久免费视频精品| 久久天天躁狠狠躁老女人| 国产精品99久久99久久久二8| 久久精品亚洲94久久精品| 欧美日韩国产丝袜另类| 美日韩精品视频免费看| 国产精品吴梦梦| 最新的欧美黄色| 亚洲综合成人婷婷小说| 色婷婷av一区二区三区在线观看| 成人妇女淫片aaaa视频| 欧美成人四级hd版| 草民午夜欧美限制a级福利片| 亚洲无亚洲人成网站77777| 国产91精品不卡视频| 欧美成人一区二区三区电影| 国产精品久久久久久久久久| 久久久久国色av免费观看性色| 亚洲香蕉伊综合在人在线视看| 精品女厕一区二区三区| 欧美综合在线第二页| 成人h视频在线观看播放| 日韩中文理论片| 欧美视频免费在线| 亚洲毛茸茸少妇高潮呻吟| 4p变态网欧美系列| 亚洲综合一区二区不卡| 亚洲国产精品高清久久久| 911国产网站尤物在线观看| 日韩三级影视基地| 国产69精品久久久久9| 成人午夜小视频| 91精品久久久久久久久久入口| 91干在线观看| 亚洲aⅴ男人的天堂在线观看| 日本久久中文字幕| 美日韩精品免费观看视频| 一本一本久久a久久精品牛牛影视| 国产香蕉精品视频一区二区三区| 欧美夫妻性生活视频| 国产精品日韩专区| 欧美精品亚州精品| 日韩精品久久久久久久玫瑰园| 久久好看免费视频| 亚洲福利视频二区| 日韩高清有码在线| 欧美最猛性xxxxx(亚洲精品)| 国产亚洲aⅴaaaaaa毛片| 欧美性猛交xxxx黑人| 精品亚洲aⅴ在线观看| 久久色免费在线视频| 日韩极品精品视频免费观看| 午夜精品在线观看| 91久久精品国产| 亚洲国产美女久久久久| 国产日韩av在线| 欧美日韩成人在线播放| 欧美日韩精品二区| 久久精品久久久久| 在线播放国产一区中文字幕剧情欧美| 欧美性受xxx| 欧美另类99xxxxx| 亚洲欧洲国产精品|