真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語言如何封裝函數(shù) c語言封裝函數(shù)指針

使用C語言封裝一個(gè)函數(shù)?

您好,對于你的遇到的問題,我很高興能為你提供幫助,我之前也遇到過喲,以下是我的個(gè)人看法,希望能幫助到你,若有錯(cuò)誤,還望見諒!。展開全部

網(wǎng)站的建設(shè)成都創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為格柵板等企業(yè)提供專業(yè)服務(wù)。

用C語言的時(shí)候,您是否還在使用printf函數(shù)來輸出日志呢?您是否考慮過將printf函數(shù)打印的內(nèi)容存到文件中去呢?您是否想擁有一個(gè)可選擇的既支持輸出到屏幕又支持存儲(chǔ)到文件中的日志函數(shù)呢?很高興的告訴您,如果您愿意的話,歡迎使

一、定義宏變量BUF_SIZE

view plaincopy to clipboardprint?

#define BUF_SIZE 1024

二、定義log_st結(jié)構(gòu)體

view plaincopy to clipboardprint?

typedef struct _log_st log_st;

struct _log_st

{

char path[128];

int fd;

int size; 非常感謝您的耐心觀看,如有幫助請采納,祝生活愉快!謝謝!

C語言怎么封裝自己寫的函數(shù)

用C語言的時(shí)候,您是否還在使用printf函數(shù)來輸出日志呢?您是否考慮過將printf函數(shù)打印的內(nèi)容存到文件中去呢?您是否想擁有一個(gè)可選擇的既支持輸出到屏幕又支持存儲(chǔ)到文件中的日志函數(shù)呢?很高興的告訴您,如果您愿意的話,歡迎使用本人編寫的一個(gè)一套日志函數(shù),該套函數(shù)由五部分組成,分別是宏變量BUF_SIZE、結(jié)構(gòu)體log_st、log_init函數(shù)、log_debug函數(shù)和log_checksize函數(shù)。其中宏變量BUF_SIZE用來限制每次輸出的日志的最大長度;結(jié)構(gòu)體用來存儲(chǔ)用戶需求,包括文件路徑、文件描述符號(hào)、單個(gè)文件最大大小、輸出方式標(biāo)志、文件命名標(biāo)志等;log_init函數(shù)用來完成用戶需求錄入、文件創(chuàng)建等功能,在mian函數(shù)的開始調(diào)用一次即可;log_debug函數(shù)的功能跟printf很類似,是在printf基礎(chǔ)上進(jìn)行的擴(kuò)充,實(shí)現(xiàn)將日志輸出到屏幕或者寫入到文件,在需要打印日志的地方調(diào)用該函數(shù);log_checksize函數(shù)用來檢測日志文件大小是否超過最大大小限制,它需要您定時(shí)或者定點(diǎn)調(diào)用它,如果一直不調(diào)用,則日志文件將不受指定的最大大小限制。

一、定義宏變量BUF_SIZE

view plaincopy to clipboardprint?

#define?BUF_SIZE?1024

二、定義log_st結(jié)構(gòu)體

view plaincopy to clipboardprint?

typedef?struct?_log_st?log_st;

struct?_log_st

{

char?path[128];

int?fd;

int?size;

int?level;

int?num;

};

三、定義log_init函數(shù)

參數(shù)說明:path——您要存儲(chǔ)的文件路徑;size——單個(gè)文件的最大大小,如果超過該大小則新建新的文件用來存儲(chǔ);level——日志輸出方式,建議在上層限制其值的范圍為0到3,0表示日志既不輸出到屏幕也不創(chuàng)建文件和保存到文件,1表示日志保存到文件但不輸出到屏幕,2表示日志既輸出到屏幕也保存到文件,3表示日志只輸出到文件而不創(chuàng)建文件和存入文件;num——日志文件命名方式,非0表示以(int)time(NULL)作為文件名來保存文件,文件數(shù)量隨著日志量的遞增而遞增;0表示以“.new”和“.bak”為文件名來保存文件,文件數(shù)量不超過兩個(gè),隨著日志量的遞增,舊的日志文件將被新的覆蓋,更直觀的說就是說.new”和“.bak”文件只保存最近的日志。

view plaincopy to clipboardprint?

log_st?*log_init(char?*path,?int?size,?int?level,?int?num)

{

char?new_path[128]?=?{0};

if?(NULL?==?path?||?0?==?level)?return?NULL;

log_st?*log?=?(log_st?*)malloc(sizeof(log_st));

memset(log,?0,?sizeof(log_st));

if?(level?!=?3)

{

//the?num?use?to?control?file?naming

log-num?=?num;

if(num)

snprintf(new_path,?128,?"%s%d",?path,?(int)time(NULL));

else

snprintf(new_path,?128,?"%s.new",?path);

if(-1?==?(log-fd?=?open(new_path,?O_RDWR|O_APPEND|O_CREAT|O_SYNC,?S_IRUSR|S_IWUSR|S_IROTH)))

{

free(log);

log?=?NULL;

return?NULL;

}

}

strncpy(log-path,?path,?128);

log-size?=?(size??0???size:0);

log-level?=?(level??0???level:0);

return?log;

}

四、定義log_debug函數(shù)

view plaincopy to clipboardprint?

void?log_debug(log_st?*log,?const?char?*msg,?...)

{

va_list?ap;

time_t?now;

char?*pos;

char?_n?=?'\n';

char?message[BUF_SIZE]?=?{0};

int?nMessageLen?=?0;

int?sz;

if(NULL?==?log?||?0?==?log-level)?return;

now?=?time(NULL);

pos?=?ctime(now);

sz?=?strlen(pos);

pos[sz-1]=']';

snprintf(message,?BUF_SIZE,?"[%s?",?pos);

for?(pos?=?message;?*pos;?pos++);

sz?=?pos?-?message;

va_start(ap,?msg);

nMessageLen?=?vsnprintf(pos,?BUF_SIZE?-?sz,?msg,?ap);

va_end(ap);

if?(nMessageLen?=?0)?return;

if?(3?==?log-level)

{

printf("%s\n",?message);

return;

}

if?(2?==?log-level)

printf("%s\n",?message);

write(log-fd,?message,?strlen(message));

write(log-fd,?_n,?1);

fsync(log-fd);

}

五、定義log_checksize函數(shù)

view plaincopy to clipboardprint?

void?log_checksize(log_st?*log)

{

struct?stat?stat_buf;

char?new_path[128]?=?{0};

char?bak_path[128]?=?{0};

if(NULL?==?log?||?3?==?log-level?||?'\0'?==?log-path[0])?return;

memset(stat_buf,?0,?sizeof(struct?stat));

fstat(log-fd,?stat_buf);

if(stat_buf.st_size??log-size)

{

close(log-fd);

if(log-num)

snprintf(new_path,?128,?"%s%d",?log-path,?(int)time(NULL));

else

{

snprintf(bak_path,?128,?"%s.bak",?log-path);

snprintf(new_path,?128,?"%s.new",?log-path);

remove(bak_path);?//delete?the?file?*.bak?first

rename(new_path,?bak_path);?//change?the?name?of?the?file?*.new?to?*.bak

}

//create?a?new?file

log-fd?=?open(new_path,?O_RDWR|O_APPEND|O_CREAT|O_SYNC,?S_IRUSR|S_IWUSR|S_IROTH);

}

}

如何用Python封裝C語言的字符串處理函數(shù)

在C語言中,字符串處理是每天都要面對的問題。我們都知道C語言中其實(shí)并沒有一種原生的字符串類型,‘字符串’在C語言里只是一種特殊的以''結(jié)尾的字符數(shù)組。因此,如何將C語言與更高層次的Python語言在‘字符串’處理這個(gè)問題上對接是一個(gè)有難度的問題。所幸有swig這種強(qiáng)大的工具。

如何封裝一個(gè)函數(shù),它修改參數(shù)字符串的內(nèi)容

假如有這樣一個(gè)C語言的函數(shù),

!-- lang: cpp --

void FillZero(char* pc,size_t * piLen)

{

size_t i=0;

while(i++*piLen/2 )

*pc++ = '0';

*pc = 0;

*piLen = i+1;

}

這個(gè)函數(shù)的功能是把字符串變成n個(gè)0。不過我們更關(guān)注函數(shù)的形式。這樣的函數(shù),表面上看char* pc是函數(shù)的參數(shù),可是實(shí)際上它才是函數(shù)的返回值和執(zhí)行的結(jié)果。piLen這個(gè)參數(shù)既是pc的最大長度,也是新的字符串的長度。我們直接用python封裝,看看運(yùn)行結(jié)果。

Type "help", "copyright", "credits" or "license" for more information.

import cchar

s='123456'

cchar.FillZero(s,6)

Traceback (most recent call last):

File "stdin", line 1, in module

TypeError: in method 'FillZero', argument 2 of type 'size_t *'

結(jié)果差強(qiáng)人意,不是我們想要得到的結(jié)果。函數(shù)的第二個(gè)參數(shù)為size_t* 我們很難用python來表示,而且python中也不存在既是輸入,也是輸出的參數(shù)。

swig有一個(gè)標(biāo)準(zhǔn)庫,其中有一個(gè)cstring.i文件就是用來解決C語言字符串類型的問題。

我們在.i文件中加入這樣幾行

!-- lang: cpp --

%include "cstring.i"

%cstring_output_withsize(char* pc,size_t* pi)

void FillZero(char* pc, size_t* pi);

然后運(yùn)行看結(jié)果

Type "help", "copyright", "credits" or "license" for more information.

import cchar

cchar.FillZero(10)

'00000\x00'

s=cchar.FillZero(10)

print s

00000

我們看函數(shù)的變化。首先在python里, FillZero變成了只有一個(gè)參數(shù)的函數(shù)。然后函數(shù)的返回值變成了一個(gè)字符串。其實(shí)cstring_output_size其實(shí)是一個(gè)宏,通過這個(gè)宏的定義改變了函數(shù)的形式,直接在Python中得到我們想要的結(jié)果。

其實(shí)類似cstring_output_size的宏還有好幾個(gè),我列舉一下:

cstring_output_allocate(char *s,free($1));

第一個(gè)參數(shù)是指向字符串地址的指針,第二個(gè)參數(shù)為釋放空間的方法。

大家考慮這一下這樣的函數(shù):

void foo(char* s)

{

s = (char*)malloc(10);

memcpy(s,"123456789",9);

}

s這個(gè)參數(shù)表面上看是輸入,實(shí)際上是函數(shù)真正的輸出。 函數(shù)中真正改變的東西是chars指向的字符串的值。而且char這個(gè)類型,

python或者其他腳本語言里應(yīng)該都沒有對應(yīng)的類型。那么我們用cstring_output_allocate將這個(gè)函數(shù)轉(zhuǎn)換成另外一個(gè)形式的python或者其他腳本語言的函數(shù)。轉(zhuǎn)換后的函數(shù)其實(shí)是這樣的,以python為例str

foo()。

!-- lang: cpp --

%module a

%include "cstring.i"

%{

void foo(char* s);

%}

%cstring_output_allocate(char *s, free(*$1));

void foo(char *s);

在python中的調(diào)用:

!-- lang: python --

import a

a.foo()

'123456789'

cstring_output_maxsize(char *path, int maxpath);

第一個(gè)參數(shù)也是可以改變的字符串首地址,第二個(gè)參數(shù)為字符串的最大長度。在Python中調(diào)用的時(shí)候,只有maxpath這個(gè)參數(shù),返回字符串。

cstring_output_allocate(char *s, free($1));

第一個(gè)參數(shù)為指向字符串首地址的指針,第二個(gè)參數(shù)為釋放指針的方法。這個(gè)宏主要是封裝一種直接在函數(shù)內(nèi)部malloc空間的函數(shù)。在Python中調(diào)用時(shí)沒有參數(shù),直接返回字符串。

cstring_output_allocate_size(char *s, int slen, free(*$1));

這個(gè)相當(dāng)于前面兩個(gè)函數(shù)的組合。在函數(shù)內(nèi)部malloc空間,然后將字符串長度通過slen返回。其實(shí)在調(diào)用的時(shí)候非常簡單,沒有參數(shù),直接返回字符串。

如何處理c++的std::string

std::string是C++標(biāo)準(zhǔn)類庫STL中常見的類。在平時(shí)工作中大家肯定是沒少用。在python中如何封裝std::string? swig提供了標(biāo)準(zhǔn)庫

例如函數(shù):

!-- lang: cpp --

string Repeat(const string s)

{

return s+s;

}

只要在swig中加入這樣幾行:

!-- lang: cpp --

%include "std_string.i"

using namespace std;

string Repeat(const string s);

運(yùn)行結(jié)果:

Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)

[GCC 4.4.5] on linux2

Type "help", "copyright", "credits" or "license" for more information.

import cchar

cchar.Repeat('123')

'123123'

使用起來很方便,但需要注意的是,假如函數(shù)的參數(shù)的內(nèi)容是可以被修改,就不能用這種方式封裝。

例如:

!-- lang: cpp --

void repeat(string s)

{

s+=s;

}

這樣的函數(shù)直接使用 'std_string.i' 就是無效的。遇到這種函數(shù),只能用C語言封裝成 void repeat(chars, int maxsize), 再用swig調(diào)用 'cstring_output_withsize' 這個(gè)宏再封裝一次了。

C語言中如何將自己常用的函數(shù)封裝到編譯器的庫函數(shù)中具體應(yīng)該怎么做呢?

用編譯器提供的庫管理工具。

C語言的編譯器都會(huì)提供一個(gè)命令行工具,可以把自己編譯后的.obj模塊加入指定的庫文件,以后使用時(shí)只需要連接該庫文件即可。這個(gè)命令行工具通常是lib.exe,用這個(gè)工具可以查看庫中的模塊,可以把模塊加入到庫中,可以從庫中刪除模塊。這個(gè)工具不僅僅是自己建立的庫文件的管理工具,可以管理所有的庫文件,包括C語言提供的標(biāo)準(zhǔn)庫。

c語言中要封裝一個(gè)函數(shù)( 比如什么printf之類的),肯定得用.c和.h文件,函數(shù)聲明在.h文件中.函數(shù)實(shí)現(xiàn)在c文

//mvector.h?--?聲明

#ifndef?MVECTOR_H_

#define?MVECTOR_H_??

typedef?struct?_mvect

{

int?x;

int?y;

}vect;

void?getvect(vect*?v);//聲明

void?showvect(vect?v);//聲明

#endif

//mvector.c?--?實(shí)現(xiàn)

#include?"mvector.h"

#include?stdio.h?

void?getvect(vect*?v)

{

scanf("%d,%d",(v-x),(v-y));??

}??

void?showvect(vect?v)

{

printf("%d,%d",v.x,v.y);??

}

//main.c?--?使用

#include?"mvector.h"

#include?stdio.h

int?main()

{

vect?a;

getvect(a);

showvect(a);

}

注意mvector.h必須位于當(dāng)前文件夾下,且必須把mvector.c和main.c放在一個(gè)工程里編譯。

輸入:2,3

輸出:2,3

C語言如何封裝printf函數(shù)

你輸入6后回車,程序先讀入6,不是回車,輸出6,然后讀入回車結(jié)束循環(huán),在輸出yes,所以結(jié)果是6yes。

注意:while循環(huán)就只有一個(gè)語句:printf("%c",c);

printf("yes");語句是在while循環(huán)外的,所以只要while循環(huán)結(jié)束就會(huì)輸出yes。


本文名稱:c語言如何封裝函數(shù) c語言封裝函數(shù)指針
URL分享:http://weahome.cn/article/hgjsed.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部