請注意新詐騙集團-掀開法拍代標業者的黑幕

其實很多仲介業者,本身也經營法拍業。我有認識很多朋友(約20多家吧!)都是相關業者。他們的經營策略(教戰守則)就是:

ㄧ、洗新人加入:
拱一些講師或專家,有些還上過電視或專訪呢!他們會拍成影帶,隨時播放,以達到自我炫耀或達到用氣勢壓制你!
再來就是拼命的自吹自擂(讓你信任啦)、裝闊(讓你羨慕啦),什麼成功案例分享,說什麼哪一筆賺數仟萬、哪一筆又賺數佰萬等事蹟,其實大都是別人的事蹟或過往彩霞(民國89年前的啦居多),讓你哈的不得了,以為人生計將改觀。(是否很像部分直銷天王天後ㄧ樣,熟悉吧!)(哈!都那麼好賺還會想教人嗎?一般人應該沒這樣的度量吧!都那麼好賺也不需要上課收費了,賺那一點小錢了!),再配合公司內場員工熱情、崇拜的歡呼聲,或群體的遊說,以便撩起(洗)一些沒經驗、或好高騖遠的新鮮人(包刮二度就業的媽媽)入場從業(可能免費或低收費),什麼兩小時或三天速成等都是。

二、廣告洗客戶:
用最聳動不合理的價差吸引客戶的好奇心,例如用小廣告單、email、網頁等工具,一切只是要引誘客戶打電話進來或留msn、email,待客戶上鉤後,再用三吋不爛之舌,無論如何邀約客戶來店或拜訪。約見面時,通常由資深同事帶領新人,以便教導新人如何偷、坑、拐、騙、摸,什麼胡扯懶旦,有時還一個資深帶數個新人呢!

三、見面:騙取客戶的信任簽約
了解客戶的意向、喜好、收入、口袋的深淺等。用"不可思議"的價格,讓客戶覺得即使自己不是很想要,應該也可以賺錢吧!騙取客戶的信任簽約。

四、拱價:
絕招1:用社區最高成交價來報價。
(別人成交的物件有全新精緻裝潢,帶傢俱,格局方正,2~3面通風採光,良好view、樓層又好等條件,法拍代標業者會刻意不提,讓客戶誤信)。
絕招2:利用資訊不對性,欺騙客戶。
也就是利用市場上常用的表價、開價、委賣價、簽約價之差異性,欺模客戶。(例如城×城之建案每坪表價30萬、見面開價27.3萬、業者簽約委賣價22萬、成交價最後可能是21.3萬等(會被要求保密))。法拍代標業者通常會用表價30萬或見面開價27.3萬當作市價給客戶參考,再用鱷魚的笑容跟你說30×0.8=24萬,你24萬進場可以賺了6萬/坪,事實上你買的比市價貴了2.7萬。哈!還真的有一卡車的人相信。
絕招3:隱瞞成本。
對於利息成本(至少標價1.2%)、佣金成本(標價4%)、過戶費(包含代書費、契稅、規費、偶後的財產交易所得稅等約標價2%),法拍屋基本房屋修復,如復水電、開換鎖、室內油漆、清潔、室內遺棄物搬運等(約標價3%),其他不一定會發生部份(如要除璧癌、被惡意拆除破壞、磁磚爆破、漏水、搬遷費等),平均約攤提2%,總計至少要12.2%。也就是說你買法拍屋價差如沒有大於12.2%,你就賠定了,何況高於市價。
絕招4.不提風險。
資深業者甚至可達到4式合一,威力更大。

五、將養、套好的神豬,感神豬進場-殺豬
通常他們會說,如果不成交,他們公司絕對不收費,但事實上客戶一定成交,因為客戶買法拍還高於市價,會不成交嗎?可笑。

六、陪標:讓豬幫公司數鈔票,還要說謝謝
爲防止客戶標太高會有情緒反應,代標公司都會有所謂的"陪標",讓客戶誤以為物件其實很熱門,代標公司很厲害,估價精準,只贏別人點點,假的投標者會做一些失望、扼脕狀,並說:『阿,好可惜,我只差一點點,恭喜你』等話,讓客戶有嬴的感覺。
此時神豬很爽,業務更爽,尤其是讓神豬幫公司數鈔票,還要說謝謝。
這時代標公司通常會說,『這沒什麼啦!我們公司成立20多年,經驗豐富,以後只要幫他們介紹客戶就好----。』

七、殺豬後再拔毛。
依程序是免搬遷費的,卻謊稱要付數萬搬遷費?或以少報多,明明2~3萬卻報10萬。反正將來總是會被發現,也當不成朋友了,趁現在能撈就撈,能刮就刮。

八、ㄧ魚三吃:
賺黑心手續佣金、騙搬遷費之外,再以是配套服務為名,假好心介紹裝潢公司(可回佣3~5成)、搬家公司、傢俱公司、清潔公司、油漆師傅,其實都有拿佣拿回扣的。

九、落井再下石:
當客戶苦於錢不夠付以上雜銷時,他們會介紹客戶辦信貸(可向銀行作業績邀功或拿佣),一個人額度不夠時再找個愛她的家人或朋友一起辦;如不好意思向家人或朋友開口,那太好了,會免費介紹朋友幫你(通常就是地下錢莊,利息數十分,再跟錢莊拆佣)。

十、傷口上跳舞:
當有一天,客戶繳不出本息及地下錢莊的錢時,豬舍(房屋)須配合他們作業(假租約並公正租約就好ㄚ),再讓房屋被查封,再次變法拍屋,他們再以利害關係人占用,讓房屋變不點交,因不點交,所以房價低落,客戶就永遠背著高額貸款跑路。跑不了,或被找到,男終身為奴,女貌美者為妾,平庸者為娼。

十一、狡兔死,走狗烹。
當這ㄧ切如有爆發糾紛,被客戶找兄弟報復,或被客戶以詐欺、背信提告時,法拍代標業者就會說,『那是業代個人行為,我們不知情』、『他已離職,不清楚喔!』或『我們也是受害者,正在找他』等語搪篩,反正死的是新人,是別人的小孩,吃香、喝辣、開明車、抱妹妹的是我。呵呵呵。

十二、循環:
受害者及從業者,或因信用不好,或被逼迫打工,或因從業紀錄,轉行已難,既失落又絕望的情況下,只好將其所知所學繼續應用。通常他們會到外地再成立一家代標公司,繼續偷、坑、拐、騙、摸,而成為新的加害者。

如一定要買法拍屋,敬請對方提供有估價師簽認的估價報告書,再打折就可,並量力而為。只要知,就不會被騙,如果你希望讓台灣更好,敬請轉寄或轉貼,功德無量,謝謝大家!





一個法拍代標的工作心得


前份工作的心得與感言
雖然離開了~不過很多感想跟大家分享

這一行有太多不為人知的黑幕~
我可能踢爆這一行的黑幕
但是可以讓更多的人~
更保護珍惜辛苦賺的錢~能便宜買到他喜歡的房子
希望板上諸君的力量~能讓這個社會更美好

其實我到這一行來~其實也是因為~對方要我面試~我就去了
在去之前~我連法拍代標是甚麼都不知道

純粹以為~就是賣房子~與一般房仲業一樣
貼貼紅紙~派報
找客戶

進去之後
學長只教我~貼紅紙~發傳單
我一個人很賣力~很勤奮
開始時~每月電話量都保持在前10名以內
也很努力的去找客戶~

但是沒有仲介經驗~也一直被人看笑話
消遣~但是我還是一直堅持者
希望有天能出頭

因為去找客戶應對
需要所謂的"話術"

因為法拍屋與一般房子不一樣
大部分時候不可以看到室內狀況(如有其他關係例外)
所以有一定風險,所以有法拍代標業存在

但是
真的找代標公司~有用嘛?
很多的業務
為了簽約~不昔任何手段

法拍分一拍~二拍~三拍~應買~特拍

一般來說~一拍約為市價行情(當然也有例外~也有一拍超便宜的)
有些案子~二拍會拍定的價格
貼紅紙會貼出~3拍~特拍的價格去吸引客戶~用"不可思議"的價格
讓客戶上鉤打電話進來
再用三吋不爛之舌騙取客戶的信任簽約

一般來說
簽下約的時候~業務需要幫客戶做市場調查~評估標價~標到後做點交
很多的業務~其實~專業真的很差~很差~甚至比客戶還不懂
但是很會講話
有些房子要開標之前連哪一間都弄不清楚~

有的業務同一間要標的房子~一口氣簽了數10個合約回來
回到公司一個一個開始所謂的"拱價"
有一句至理名言"手中有行情~心中無行情"
"拱到最高點~摽下去就對了"

到法院開標~會有所謂的""專家""來跟你拱價
拱到最後~自己都覺得心裡很掙扎
有的假如說~一個熱門的案件市價一坪約10萬元
可以拱到一坪12~14萬元
如果是三房兩廳的房子(假設約30坪)~就足足比市價多了60萬~240萬元
(如果做過這一行的人都知道~這幾個月都在上演這種戲碼)
得標人心中在滴血,得標業務沾沾自喜~想說賺錢了,
說道:客戶願意加就好了~反正又不是我們自己的錢~標中我們才會賺錢

我是個虔誠人慈濟人心中想~難道~這樣不會有報應嘛

當然標的太過份~
代標公司都會有所謂的"護標"~~"作櫻花"
防止客戶標太高會有情緒反應
等所謂的專家拱價完~就打電話給一個假投標者
假投標者都是代標公司的員工
在客戶投標的價格~低個一點點~進場投標

等客戶如果要去閱卷甚麼的~就會看到
代標公司的護標~差客戶沒多少錢
假的投標者會做一些狀況~安輔客戶:我還差你幾萬塊~真可惜阿~我沒標到
但是認真查證~都是代標公司的人

等點交時
代標公司會巧立很多名目來跟客戶收費,其中最大一筆的就是"搬遷費"
法拍屋請對方原屋主搬家的時候
民間都會有所謂的搬遷費

當然有時候原屋主會獅子大開口要很多錢
但是更多更多的時後~是原屋主沒有要收取搬遷費
但是~卻向客戶收取數萬元的搬遷費~
最後跑去哪裡了呢?當然是.........
心中真的很掙扎~哪些收取不義之財的同事~痛心

我跟家人提出我要離職~家人都鼓勵我離開
很感謝有家人陪伴

等我離開之後
回想起來~只有騙~騙~騙~三個字
也有同事在開會說~本公司是全台灣最大詐騙集團

找代標公司真的有保證嘛?
請睜大眼睛~好好保護自己賺來的錢


最後~我慶幸的離開了這一行

freestyler 發表在 痞客邦 留言(3) 人氣()

http://www.mcuos.com/viewthread.php?tid=70

时间管理是操作系统的一项重要功能,硬件必须提供一个周期性的时钟或者定时器,以支持系统中与时间相关的功能部件。一般,大多数CPU都有一个或多个内置定时器,提供周期性的中断,即使没有内置定时器,也必须使用外部定时器或时钟。
    
ecos抽象了时间相关硬件的本质,提供了通用的时间管理机制。这些定时机制包括:计数器(Counter)、时钟(Clock)、告警器(Alarm)和定时器(Timer)。有了这些抽象概念,我们就不必做一些搭架子的重复性工作了,也不必在硬件细节上浪费时间,而是集中精力在功能实现上。针对抽象平台接口编程的好处是移植性好,以不变应万变。
    

  • 计数器---对指定事件进行单调递增计数
  • 时钟-----对具有一定周期性的时间滴答(tick)进行计数的计数器(对时间进行计数)
  • 告警器---在计数器的基础上增加一个提示功能的机制,或者基于计数器的值产生具有周期性的事件
  • 定时器---简单地附加在时钟上的告警器

    
这些时间相关API函数的定义都在<cyg/kernel/kapi.h>内,使用时必须包含该头文件。
    
==========
计数器 *
==========

创建:
void cyg_counter_create(cyg_handle_t *handle, cyg_handle_t *counter)

该函数创建一个性的计数器,新计数器的句柄通过handle返回。cyg_handle_t---cyg表示cygnus公司定义,handle是句柄,t是type的缩写(类型),合起来的意思是cygnus公司定义的句柄类型,很好理解吧。所有计数器函数都是cyg_counter开头的,只要看到有counter,就知道和计数器有关。counter是应用程序提供给该计数器所需的内存,从而减少了在内核中进行动态内存分配的需求。ecos里很多函数都是由应用程序提供目标对象所需内存,使用静态内存分配而不是动态分配符合嵌入式系统的特点。
    
删除:
void cyg_counter_delete(cyg_handle_t counter)

读指定计数器当前值
cyg_tick_count_t cyg_counter_current_value(cyg_handle_t counter)

设置指定计数器值
void cyg_counter_set_value(cyg_handle_t counter, cyg_tick_count_t new_value)

计数器加1
void cyg_counter_tick(cyg_handle_t counter)

创建一个新的计数器不会自动将事件源连接到该计数器上,无论相对应的时间何时发生,都需要调用cyg_counter_tick函数使计数器加1计数。一般在事件中断的DSR里调用此函数。

计数器值增加指定tick数
void cyg_counter_multi_tick(cyg_handle_t counter, cyg_tick_count_t ticks)
    
========
时钟 *
========

内核级的所有与时钟相关的操作包括延时、超时和告警等都是以时钟滴答为单位进行工作的,而不是以秒或微秒为单位。如果应用程序或其他软件需要使用秒或微秒这样的时间单位,则需要将这些时间单位转换为时钟滴答。这是因为只有时钟滴答才能精确地反映出硬件的支持条件。而且如果使用传统意义上的时间单位如纳秒(ns),则硬件有可能不能提供支持。另一个原因是在时钟滴答和传统意义上的时间单位之间的转换需要浪费很多代码和数据,采用时钟滴答为单位可以节省代码量和CPU时间。

时钟单位间的转换需要一个分辨率,如100Hz运行的时钟,1秒内产生100次tick,则分辨率为1000000000(ns) : 100(tick)。同样,60Hz的分辨率为1000000000 : 60。

将一个以纳秒为单位的延时除以分辨率就可以转换为对应的时钟滴答。如一个50ms的延时(50000000ns),时钟频率为100Hz(即分辨率1000000000 : 100),那么可以通过下面的计算转换为时钟滴答:50000000 ÷ (1000000000/100) = 5,即:50ms的延时在100Hz时钟分辨率下对应5个tick。
    
创建:
void cyg_clock_create(cyg_resolution_t resolution, cyg_handle_t *handle, cyg_clock *clock)
使用给定分辨率创建一个新的时钟,新时钟的句柄由handle带回。
    
删除:
void cyg_clock_delete(cyg_handle_t clock)
调用此函数前应确保系统中已经没有使用该时钟的组件。  
  
将时钟转换为计数器
void cyg_clock_to_counter(cyg_handle_t clock, cyg_handle_t *counter)    

设置时钟分辨率
void cyg_clock_set_resolution(cyg_handle_t clock, cyg_resolution_t resolution)

获取时钟分辨率
cyg_resolution_t cyg_clock_get_resolution(cyg_handle_t clock)

获取系统的实时时钟(RTC,不是外部RTC,是内核抽象的clock)
cyg_handle_t cyg_real_time_clock(void)

获取当前的系统时间,单位为时钟滴答。系统时间用64位的数字表示。
cyg_tick_count_t cyg_current_time(void)
    
==========
告警器 *
==========

内核告警器与计数器一起使用,使得当某种时间发生了一定的次数时采取响应的动作。如果与计数器一起使用的是时钟,那么当时间滴答的个数达到适当的值也就是在一定的时间周期后将发生告警行为。
    
创建:

复制内容到剪贴板
代码:
    void cyg_alarm_create
    (
        cyg_handle_t counter,  //和告警器一起使用的计数器
        cyg_alarm_t *alarmfn,  //告警时的回调函数
        cyg_addrword_t data,   //传给回调函数的参数
        cyg_handle_t *handle,  //返回的告警器句柄
        cyg_alarm *alarm       //告警器对象
    )

其中alarmfn对应的回调函数格式如下:

复制内容到剪贴板
代码:
    void alarm_fun(cyg_handle_t alarm, cyg_addrword_t data)
    {
        ......
    }


    
删除:
void cyg_alarm_delete(cyg_handle_t alarm)

初始化并启动一个告警器

复制内容到剪贴板
代码:
    void cyg_alarm_initialize
    (
        cyg_handle_t alarm,         //告警器句柄
        cyg_tick_count_t trigger,   //绝对触发时间
        cyg_tick_count_t interval   //触发间隔
     )
返回告警器的下一次触发的绝对时间和它的触发间隔
复制内容到剪贴板
代码:
    void cyg_alarm_get_times
    (
        cyg_handle_t alarm,         //待查询的告警器的句柄
        cyg_tick_count_t trigger,   //下一次触发时的绝对时间
        cyg_tick_count_t interval   //当前触发间隔
     )

    使能告警器
    void cyg_alarm_enable(cyg_handle_t alarm)

    禁止告警器
    void cyg_alarm_disable(cyg_handle_t alarm)

下面用一个具体实验来说明时间相关API函数的用法。

使用时钟函数统计程序执行时间,在程序开始执行前和执行完毕后分别调用cyg_current_time获得开始时间和结束时间,将tick单位转换为毫秒单位,计算单位时间内执行循环次数和单个循环执行时间。使用告警器,以2秒为周期,让蜂鸣器交替发声和静音。

注意:cyg_current_time得到的时间是64位的,printf显示64位整数时使用“%lld”格式;另外不要在告警器回调函数里使用printf函数。

测试SmartARM2200的结果为(循环0x80000次):每秒执行195527.8次循环,每循环执行时间为5us。蜂鸣器响2秒,停2秒,周而复始。
复制内容到剪贴板
代码:
//测试程序
#include 
#include 
#include 
#define STACK_SIZE 4096
#define ALARM_INTERVAL 200  //2秒
#define BEEPCON 0x0000080
#define LOOPNUM 0x80000

char stack[STACK_SIZE];
static cyg_thread thread_data;
static cyg_handle_t thread_handle;

cyg_handle_t counter_handle;
cyg_handle_t alarm_handle;
cyg_alarm    alarm_object;

void alarm_func(cyg_handle_t alarm_handle, cyg_addrword_t data)
{
    int i;
        
    HAL_READ_UINT32(LPC2XXX_GPIO_IO0SET,i);
   
    if((i&BEEPCON) == 0 )
        {
        HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0SET,BEEPCON);
        }
    else
        {
        HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0CLR,BEEPCON);
        }
}

void
alarm(cyg_addrword_t data)
{
    cyg_tick_count_t t1, t2, t;
    int i, sum;
   
    printf("\n\n\n");
    printf("\t    *******************************\n");
    printf("\t    *     Hello! Alarm test.      *\n");
    printf("\t    *******************************\n\n\n");
   
    printf("Test speed:\n");
    sum = 0;
    t1 = cyg_current_time();
    for(i = 0; i < LOOPNUM; i++)
        {
        sum = sum + i;
        }
    t2 = cyg_current_time();
    t = abs(t2-t1) * 10;
    printf("start=%lld\nend=%lld\n", t1, t2);
    printf("Total time = %lldms\n",t);
    printf("Total loop = %lld\n", LOOPNUM);
    if(t == 0)
        {
        t = 1;
        }
    printf("%lf(loop/sec) , %lf(sec/loop)\n", LOOPNUM * 1000.0 / t, t / 1000.0 / LOOPNUM);
    //设置输出到BEEP
    HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0DIR,BEEPCON);
    //禁止刚一开始就BEEP,上电缺省输出是低电平,导致一开始就鸣叫。
    HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0SET,BEEPCON);
    //将时钟转换为计数器。cyg_real_time_clock()函数获取系统实时时钟(RTC)。实时时钟用于系统的延时、阻塞等待等操作。
    cyg_clock_to_counter(cyg_real_time_clock(), &counter_handle);
    //创建警告器
    cyg_alarm_create(counter_handle, alarm_func, 0, &alarm_handle, &alarm_object);
    //初始化警告器
    cyg_alarm_initialize(alarm_handle, cyg_current_time() + ALARM_INTERVAL, ALARM_INTERVAL);
    //使能警告器
    cyg_alarm_enable(alarm_handle);
    while(1)
        {
        cyg_thread_delay(2000);
        }
}
void
cyg_start(void)
{
    // Create a main thread, so we can run the scheduler and have time 'pass'
    cyg_thread_create(10,                // Priority - just a number
                      alarm,              // entry
                      0,                 // entry parameter
                      "alarm",            // Name
                      &stack,         // Stack
                      STACK_SIZE,        // Size
                      &thread_handle, // Handle
                      &thread_data    // Thread data structure
            );
    cyg_thread_resume(thread_handle); // Start it
    cyg_scheduler_start();
}

 

freestyler 發表在 痞客邦 留言(0) 人氣()

每個使用者的profile中 都會有一個暫存的目錄 我們可以放暫存檔在裡面
暫存檔的目錄除了可以在系統登錄(registry)中找到 也可用GetTempPath()來取得
window系統也提供GetTempFileName() 來簡單的取得暫存檔名字
以下為使用範例
CString tpath;
CString fname;
GetTempPath(128,tpath.GetBuffer(128));
tpath.ReleaseBuffer();
GetTempFileName(tpath,"tmp",0,fname.GetBuffer(128));
fname.ReleaseBuffer();
// 取得檔名放在fname 之後可開啟此檔案
GetTempPath()可傳入兩個參數第一個為字串buffer大小 第二個為buffer的位置
之後暫存區的目錄便會放在tpath中
GetTempFileName() 要傳入四個參數
第一個為暫存目錄位置 可由GetTempPath()取得
第二個為三個字元的識別碼 我們可以使用自己的識別碼來分別自己的暫存檔
第三個為暫存檔編號 這裡傳入0 系統便會自動幫我們編號 並且開啟檔案
第四個為取得暫存檔名的buffer 取得的暫存檔名包括了完整路徑


要注意的是 當GetTempFileName()執行完後 暫存檔便已經開啟了
我們可以使用CFile或其他方法去開啟fname所傳回的檔案
暫存檔系統並不會自動砍掉 若存放路徑為暫存路徑 則空間不夠時系統才會自動砍掉
若不是暫存路徑的話 該檔案需要自行刪除

freestyler 發表在 痞客邦 留言(0) 人氣()

Char 轉成 TCHAR的辦法
// ANSI(char) to Unicode(TCHAR)
char* temp = "測試";
int nIndex = MultiByteToWideChar(CP_ACP, 0, temp , -1, NULL, 0);
TCHAR *pUnicode = new TCHAR[nIndex + 1];
MultiByteToWideChar(CP_ACP, 0, temp , -1, pUnicode, nIndex);


// Unicode(WCHAR) to ANSI(char)
TCHAR *pUnicode = _T("你好");
int nIndex = WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, NULL, 0, NULL, NULL);
char *temp = new char[nIndex + 1];
WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, temp , nIndex, NULL, NULL);
delete pAnsi;

freestyler 發表在 痞客邦 留言(0) 人氣()

轉錄來自 http://bbs.eeworld.com.cn/thread-68460-1-1.html

 

1:   C语言类:
(1)C/C++ 编码规范
http://bbs.eeworld.com.cn/thread-68459-1-1.html
(2)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
http://bbs.eeworld.com.cn/thread-68453-1-1.html
  (3)C语言进阶 (东南大学 凌明 非常不错)
http://bbs.eeworld.com.cn/thread-67996-1-1.html
(4)C-51语言程序设计基础
http://bbs.eeworld.com.cn/thread-68379-1-1.html
(5)C语言嵌入式系统编程(收集大发送) 
http://bbs.eeworld.com.cn/thread-55233-1-2.html
(6)C语言嵌入式系统编程修炼之道
http://bbs.eeworld.com.cn/thread-67662-1-2.html
(7)嵌入式系统C语言编程
http://bbs.eeworld.com.cn/thread-63986-1-2.html
(8)嵌入式C精华
http://bbs.eeworld.com.cn/thread-54905-1-2.html
(9)嵌入式C C++语言精华
http://bbs.eeworld.com.cn/thread-62349-1-9.html
(10)C语言嵌入式系统编程(收集大发送之3——嵌入式系统的C程序设计)
http://bbs.eeworld.com.cn/thread-60594-1-10.html
2:   系统类:
(1)时间触发和状态机思想的嵌入式系统 分析都给大家传上去了!
http://bbs.eeworld.com.cn/thread-67442-1-1.html
(2)嵌入式系统可靠性设计
http://bbs.eeworld.com.cn/thread-68457-1-1.html
(3)中断驱动多任务--- 单片机(MCU) 下的一种软件设计结构
http://bbs.eeworld.com.cn/thread-68452-1-1.html
(4)单片机及嵌入式系统应用-常用输入/输出电路设计 
http://bbs.eeworld.com.cn/thread-68239-1-1.html
(5)实时多任务系统内核分析 & OSII_CHM
http://bbs.eeworld.com.cn/thread-64937-1-6.html
(6)嵌入式构架206页
http://bbs.eeworld.com.cn/thread-15774-1-2.html
(7)uCOS2精华快速掌握
http://bbs.eeworld.com.cn/thread-65272-1-2.html
(8)uCOS-II 实时操作系统在嵌入式平台进行移植的一般方法和技巧
http://bbs.eeworld.com.cn/thread-55238-1-2.html
(9)VxWorks操作系统及实时多任务程序设计
http://bbs.eeworld.com.cn/thread-66298-1-2.html
(10)Linux V0.11 源程序
http://bbs.eeworld.com.cn/thread-66798-1-2.html
(11)补充: linux设备驱动程序(中文第三版) 2.6内核(完整版)
http://bbs.eeworld.com.cn/thread-53022-1-2.html
(12)实时嵌入式系统设计综述
http://bbs.eeworld.com.cn/thread-67447-1-3.html
(13)ARM嵌入式系统开发:软件设计与优化》PDF 690页
http://bbs.eeworld.com.cn/thread-66826-1-3.html
(14)嵌入式LINUX开发入门V1.5
http://bbs.eeworld.com.cn/thread-64978-1-6.html
(15)一步一步教你开发嵌入式Linux 应用程序
http://bbs.eeworld.com.cn/thread-64746-1-6.html
(16)Linux实用培训学习教程1.0
http://bbs.eeworld.com.cn/thread-63066-1-6.html
3:arm入门与提高
(1)轻松入门开发ARM 程序
http://bbs.eeworld.com.cn/thread-68380-1-1.html
(2)arm体系结构与应用系统设计
http://bbs.eeworld.com.cn/thread-68327-1-1.html
(3)轻松入门开发ARM 程序
http://bbs.eeworld.com.cn/thread-63991-1-7.html
4:嵌入式微处理器系统教程
(1)北大:嵌入式微处理器系统教程 PDF
http://bbs.eeworld.com.cn/thread-68320-1-1.html
(2)北京大学嵌入式开发讲义
http://bbs.eeworld.com.cn/thread-53903-1-2.html
(3)Keil环境下Wiggler和H-JTAG使用简明教程(一)
http://bbs.eeworld.com.cn/thread-68118-1-2.html
(4)英倍特uCOS-II 的教学课件
http://bbs.eeworld.com.cn/thread-64749-1-4.html
5:WinCE
(1):Microsoft内部关于WinCE培训资料
http://bbs.eeworld.com.cn/thread-50692-1-1.html
(2)4篇最新的硕博论文下载(WinCE相关)
http://bbs.eeworld.com.cn/thread-52539-1-3.html
(3)一个入门的windowsCE开发资料
http://bbs.eeworld.com.cn/thread-51145-1-10.html
6:硬件
(1)硬件工程师面试试题
http://bbs.eeworld.com.cn/thread-66778-1-2.html
(2)硬件工程师必读攻略
http://bbs.eeworld.com.cn/thread-63512-1-2.html

7:stm32
(1)如何使用 STM32F101xx 和 STM32F103xx 微控制器的链路系统实现32位定时器的分辨率
http://bbs.eeworld.com.cn/thread-67575-1-3.html
(2)STM32 中断与嵌套NVIC 快速入门
http://bbs.eeworld.com.cn/thread-67574-1-3.html
(3)STM32F10使用USART的应用中编程
http://bbs.eeworld.com.cn/thread-63990-1-5.html
(4)ucosii在STM32中的移植
http://bbs.eeworld.com.cn/thread-64794-1-5.html
(5)[原创]STM32学习笔记之—ADC
http://bbs.eeworld.com.cn/thread-63692-1-7.html
(6)STM32学习体会-STM32F单纯的TIM2定时器溢出中断试验程序
http://bbs.eeworld.com.cn/thread-63988-1-7.html
(7)STM32学习笔记之—RTC
http://bbs.eeworld.com.cn/thread-63918-1-8.html
(8)STM32 中断与嵌套NVIC 快速入门。
http://bbs.eeworld.com.cn/thread-63690-1-8.html
为STM32移植FATFS,读取SD卡上FAT12_16_32文件系统
http://bbs.eeworld.com.cn/viewthread.php?tid=69121&pid=127579&page=1&extra=page%3D1#pid127579
8:ARM嵌入式开发视频教程
    http://bbs.eeworld.com.cn/thread-68592-1-1.html
9:嵌入式系统或者单片机的开发规范化问题
   http://bbs.eeworld.com.cn/thread-69755-1-1.html
10:44B0X中文资料
   http://bbs.eeworld.com.cn/thread-69584-1-1.html
11:ARM入门调试笔记
    http://bbs.eeworld.com.cn/thread-69583-1-1.html
12:uCOS-II 实时操作系统在嵌入式平台进行移植的一般方法和技巧
   http://bbs.eeworld.com.cn/thread-55238-1-1.html
13:S3C44B0X全套培训资料及源代码
    http://bbs.eeworld.com.cn/thread-69123-1-1.html

STM32资料集锦
  http://bbs.eeworld.com.cn/thread-75235-1-1.html

freestyler 發表在 痞客邦 留言(0) 人氣()

●為什麼要用不定參數寫Log API ?
每次在寫 Log 之前就要宣告一個字串,再用 sprintf 或 Format 來處理,實在不方便,還要去控制字串的宣告位置、次數,多次寫Log的位置都有相同的宣告,程式碼也變得難閱讀。
不如直接將 Format 參數帶入 API,再由 Log API 來處理字串,是更好的方法。

●做法說明
// 以下為資料來源與參考資料文章(Copy & Paste)
http://blog.yam.com/csylvia/article/17973254

先講解一下什麼是不定參數,
最知名的例子就是 printf(),
你可以這樣使用

printf( "Hello." );

也可以這樣使用

printf( "Hello %s", szName );
printf( "Hello %s, you have drunk %d cups of coffee", szName, iNumber );

函式中可以只有一條字串,
也可以字串後夾帶許多參數,
這樣的函式的定義當然不可能是這樣:

printf( char* string, char* param1 );
printf( char* string, char* param1, int param2 );
printf( char* string, int param1 );
...

這樣有幾百、幾千種組合啊?!=口=|||b

這就是「不定參數」發揮的地方了。

可以看到 printf 的 prototype:

int printf(const char *format [,argument]...);

那三個點就是表示不定參數(參數的個數、型態不限定)。

用法大家非常清楚,
那假如今天想寫一個接受不定參數的函式要怎麼做?

這就要應用到 va_arg()、va_end()、va_start() 三個 macro 來完成,
根據手邊的《C/C++》內的說明如下:
va_arg():它可以讓函數後面所接的引數不必維持固定的個數。第一次呼叫時,會傳回引數列最前面的第一個引數,接下來每次呼叫會自動傳回下一個引數內容。
va_end():當使用 va_arg() 完成取得所有引數內容後呼叫此 macro,通常是為了執行 return 動作。
va_start():在使用 va_arg() 前必須先呼叫此 macro,如此才能順利找到「不定引數列」的最前面內容。

此外還有幾個相關函式:
vfprintf():將 argument list 的內容輸出到資料流。
vprintf():將 argument list 的值寫到標準輸出(standard output)。
vsprintf():將 argument list 的值輸出到字串緩衝區(string buffer)。

--------------------------------------------------------------------------------------------------

/*
NAME:
    WriteLog(LPCTSTR sFormat, ...)
PARAMETER:
    sFormat : 傳入的 Format 字串
    ...     : Format 字串的參數
RETURN:
COMMENT:
*/
void CTekKLine::WriteLog(LPCTSTR sFormat, ...)
{
    va_list     pArgList;
    TCHAR       sBuffer[2048];
    FILE       *pFile;
    CString     sPath;
    CString     sTemp;
    CTime       tNow = CTime::GetCurrentTime();

    // 取出傳入的 Format
    va_start(pArgList, sFormat);
    _vsnwprintf(sBuffer, sizeof(sBuffer) / sizeof(TCHAR), sFormat, pArgList);
    va_end(pArgList);

    // 建立資料夾
    sPath = _T(".\\log");
    CreateDirectory(sPath, NULL);
   
    // 組成路徑
    sTemp.Format(_T("%s\\kline.log"), sPath);
    pFile = _tfopen(sTemp, _T("a+t"));
   
    // 寫入檔案
    sTemp.Format(_T("[%04d%02d%02d %02d:%02d:%02d] %s\n"),
                tNow.GetYear(), tNow.GetMonth(), tNow.GetDay(), tNow.GetHour(), tNow.GetMinute(), tNow.GetSecond(),
                sBuffer);
    _fputts(sTemp, pFile);
   
    fclose(pFile);
}

freestyler 發表在 痞客邦 留言(0) 人氣()

C/C++ 的volatile
C/C++中的volatile使用時機?

.不知各位對volatile(揮發性的)這個字陌不陌生? 我相信大家在一些程式或多或少都看
 過這個字眼, 但是究竟要在何種場合用它呢?
.當然一定是有需要, C/C++才會有這個保留字, 否則只是增加programmer的困擾而已
.有2兩個場合(I/O & multithread program), 供各位參考!
.請大家check自己的程式中(尤其是第2個場合), 若有的話請記得加上volatile

1. I/O, 假設有一程式片斷如下

       U8   *pPort;
       U8   i, j, k;
      
       pPort = (U8 *)0x800000;
   
       i = *pPort;     
       j = *pPort;     
       k = *pPort;     

    以上的i, j, k很有可能被compiler最佳化而導致產生
       i = j = k = *pPort;
    的code, 也就是說只從pPort讀取一次, 而產生 i = j = k 的結果, 但是原本的程式的目
    的是要從同一個I/O port讀取3次的值給不同的變數, i, j, k的值很可能不同(例如從此
    I/O port 讀取溫度), 因此i = j = k的結果不是我們所要的

    怎麼辦 => 用volatile, 將
       U8   *pPort;
    改為
       volatile U8   *pPort;

    告訴compiler, pPort變數具有揮發性的特性, 所以與它有關的程式碼請不要作最佳化動作. 因而  
       i = *pPort;     
       j = *pPort;     
       k = *pPort;     
    此三列程式所產生的code, 會真正地從pPort讀取三次, 從而產生正確的結果

2. Global variables in Multithread program
    => 這是在撰寫multithread program時最容易被忽略的一部份
    => 此原因所造成的bug通常相當難解決(因為不穩定)

    假設有以下程式片斷, thread 1 & thread 2共用一個global var: gData
        thread 1:                                thread 2:                               
                                                                                         
            ...                                      ....                                
            int  gData;                              extern int gData;                   
                                                                                         
            while (1)                                int  i, j, k;                       
            {                                                                            
                ....                                 for (i = 0; i < 1000; i++)
                gData = rand();                      {                                   
                .....                                    /* A */
            }                                            j = gData;                      
                                                         ....                            
            ....                                     }                                   

    在thread 2的for loop中, 聰明的compiler看到gData的值, 每次都重新從memory load到register,
    實在沒效率, 因此會產生如下的code(注意,tmp也可以更進一步的用register取代):
       tmp = gData;
       for (i = 0; i < 1000; i++           
       {                                   
           /* A */
           j = tmp;                      
           ....                            
       }                                   
    也就是gData只讀取一次, 這下子問題來了, 說明如下:
    .thread 2在執行for loop到j = gData的前一列(A)的時候(假設此時gData=tmp=5), 被切換到thread 1執行
    .在thread 1的while loop中透過gData = rand(), 對gData做了修改(假設改為1), 再切換回thread 2執行
    .繼續執行 j = gData, 產生j = 5的結果
    .但是正確的結果應該是 j = 1
    怎麼辦 => 也是用volatile,

    在thread 1中, 將
        int  gData;  
    改為
        volatile int  gData;  
   
    在thread 2中, 將
        extern int  gData;  
    改為
        extern volatile int  gData;  

freestyler 發表在 痞客邦 留言(19) 人氣()

[轉錄] "開機" 萬言書
作者:吳翠鳳 (Linda Wu)
http://www.msservermag.com.tw/technicwords/020919.aspx
http://www.msservermag.com.tw/technicwords/020926.aspx
http://www.msservermag.com.tw/technicwords/021003.aspx
http://www.msservermag.com.tw/technicwords/021010.aspx

freestyler 發表在 痞客邦 留言(0) 人氣()

簡單的說,如果你使用了某個function,那麼你就是call了一個function。如果系統或是函式是要求你給一個function pointer,這個function pointer指到一個實際的函式(多半這個函式是你自己寫的)。然後它會在適當的時間呼叫此function,則此function就是所謂的 callback function。因為這個function是被callback了。

freestyler 發表在 痞客邦 留言(0) 人氣()

sqlite官網

在VC++上的使用方法:
1.下載http://www.sqlite.org/sqlitedll-3_6_12.zip
2.壓縮檔內有sqlite3.dll和sqlite3.def,在命命列下利用LIB生成用於連結(LINK)的lib文件:sqlite3.lib和sqlite3.exp

PATH = D:\Program Files\Microsoft Visual Studio 9.0\VC\bin;%PATH%
PATH = D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;%PATH%
LIB /DEF:sqlite3.def /machine:IX86

3.下載http://www.sqlite.org/sqlite-source-3_6_12.zip
4.從source code裡得到sqlite3.h

wrapper的使用:
1..CppSQLite3
2. CppSQLite3U (unicode版本)

可以查閱更改sqlite DB的軟體: SQLite Administrator


freestyler 發表在 痞客邦 留言(0) 人氣()

MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和 DispatchMessage处理(进入WindowProc);
如果用SendMessage, 则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理。

freestyler 發表在 痞客邦 留言(0) 人氣()

(1) 如何建立自动增长字段?

简短回答:声明为 INTEGER PRIMARY KEY 的列将会自动增长。

长一点的答案: 如果你声明表的一列为 INTEGER PRIMARY KEY,那么, 每当你在该列上插入一NULL值时, NULL自动被转换为一个比该列中最大值大1的一个整数,如果表是空的, 将会是1。 (如果是最大可能的主键 9223372036854775807,那个,将键值将是随机未使用的数。) 如,有下列表:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b INTEGER
);

在该表上,下列语句

INSERT INTO t1 VALUES(NULL,123);

在逻辑上等价于:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

有一个新的API叫做 sqlite3_last_insert_rowid(), 它将返回最近插入的整数值。

注意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。如果最大可能的整数值在数据表中曾经存在过,INSERT将会失败, 并返回SQLITE_FULL错误代码。


--------------------------------------------------------------------------------

(2)SQLite3支持何种数据类型?

NULL
INTEGER
REAL
TEXT
BLOB
但实际上,sqlite3也接受如下的数据类型:
smallint  16 位元的整数。
interger  32 位元的整数。
decimal(p,s)  p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值    ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float   32位元的实数。
double   64位元的实数。
char(n)   n 长度的字串,n不能超过 254。
varchar(n)  长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)  和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。   这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)  可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date   包含了 年份、月份、日期。
time   包含了 小时、分钟、秒。
timestamp  包含了 年、月、日、时、分、秒、千分之一秒。

参见 http://www.sqlite.org/datatype3.html.
--------------------------------------------------------------------------------

(3)SQLite允许向一个integer型字段中插入字符串!

这是一个特性,而不是一个bug。SQLite不强制数据类型约束。 任何数据都可以插入任何列。你可以向一个整型列中插入任意长度的字符串,向布尔型列中插入浮点数,或者向字符型列中插入日期型值。 在 CREATE TABLE 中所指定的数据类型不会限制在该列中插入任何数据。任何列均可接受任意长度的字符串(只有一种情况除外: 标志为INTEGER PRIMARY KEY的列只能存储64位整数,当向这种列中插数据除整数以外的数据时,将会产生错误。

但SQLite确实使用声明的列类型来指示你所期望的格式。所以,例如你向一个整型列中插入字符串时,SQLite会试图将该字符串转换成一个整数。 如果可以转换,它将插入该整数;否则,将插入字符串。这种特性有时被称为 类型或列亲和性(type or column affinity).


--------------------------------------------------------------------------------

(4)为什么SQLite不允许在同一个表不同的两行上使用0和0.0作主键?

主键必须是数值类型,将主键改为TEXT型将不起作用。

每一行必须有一个唯一的主键。对于一个数值型列, SQLite认为 '0' 和 '0.0' 是相同的, 因为他们在作为整数比较时是相等的(参见上一问题)。 所以,这样值就不唯一了。


--------------------------------------------------------------------------------

(5)多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗?

多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT 操作,但在任一时刻,只能有一个进程对数据库进行更改。

SQLite 使用读、写锁控制对数据库的访问。(在Win95/98/ME等不支持读、 写锁的系统下,使用一个概率性的模拟来代替。)但使用时要注意:如果数据库文件存放于一个NFS文件系统上,这种锁机制可能不能正常工作。 这是因为 fcntl() 文件锁在很多NFS上没有正确的实现。在可能有多个进程同时访问数据库的时候,应该避免将数据库文件放到NFS上。 在Windows上,Microsoft的文档中说:如果使用 FAT 文件系统而没有运行 share.exe 守护进程,那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我:对于网络文件,文件锁的实现有好多Bug,是靠不住的。如果他们说的是对的,那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。

我们意识到,没有其它嵌入式的 SQL 数据库引擎能象 SQLite 这样处理如此多的并发。SQLite允许多个进程同时打开一个数据库,同时读一个数据库。当有任何进程想要写时,它必须在更新过程中锁住数据库文件。 但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地,其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。

但是,Client/Server数据库引擎(如 PostgreSQL, MySQL, 或 Oracle) 通常支持更高级别的并发,并且允许多个进程同时写同一个数据库。这种机制在Client/Server结构的数据库上是可能的, 因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。如果你的应用程序需要很多的并发,那么你应该考虑使用一个Client/Server 结构的数据库。但经验表明,很多应用程序需要的并发,往往比其设计者所想象的少得多。

当SQLite试图访问一个被其它进程锁住的文件时,缺省的行为是返回 SQLITE_BUSY。 可以在C代码中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函数调整这一行为。
---------------------------------------------------------------------------

(6)SQLite线程安全吗?

线程是魔鬼(Threads are evil)。 避免使用它们。

SQLite 是线程安全的。由于很多用户会忽略我们在上一段中给出的建议, 我们做出了这种让步。但是,为了达到线程安全,SQLite在编译时必须将 SQLITE_THREADSAFE 预处理宏置为1。在Windows和Linux上, 已编译的好的二进制发行版中都是这样设置的。如果不确定你所使用的库是否是线程安全的,可以调用 sqlite3_threadsafe() 接口找出。

在 3.3.1 版本之前,一个 sqlite3 结构只能被用于调用 sqlite3_open 创建的同一线程。你不能在一个线程中打开数据库,然后将数据库句柄传递给另外一个进程使用。 这主要是由于在好多通用的线程实现(如RedHat9)中的限制引起的(是Bug吗?)。特别的,在有问题的系统上,一个进程创建的 fcntl() 锁无法被其它线程清除或修改。 所以,由于 SQLite 大量使用 fcntl() 锁做并发控制, 如果你在不同的线程间移动数据库连接,就可能会出现严重的问题。

在3.3.1版本上,关于在线程间移动数据库连接的限制变得宽松了。 在它及以后的版本中,只要连接没有持有 fcntl() 锁,在线程间移动句柄是安全的。 如果没有未决的事务,并且所有的语句都已执行完毕, 你就可以安全的假定不再持有任何锁。

在UNIX中,在执行 fork() 系统调用时不应携带已打开的数据库进入子进程。 那样做将会有问题。


--------------------------------------------------------------------------------

(7)在SQLite数据库中如何列出所有的表和索引?

如果你运行 sqlite3 命令行来访问你的数据库,可以键入 “.tables”来获得所有表的列表。或者,你可以输入 “.schema” 来看整个数据库模式,包括所有的表的索引。 输入这些命令,后面跟一个LIKE模式匹配可以限制显示的表。

在一个 C/C++ 程序中(或者脚本语言使用 Tcl/Ruby/Perl/Python 等) 你可以在一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有 表的索引。每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表,它定义数据库的模式。 SQLITE_MASTER 表看起来如下:

CREATE TABLE sqlite_master (
  type TEXT,
  name TEXT,
  tbl_name TEXT,
  rootpage INTEGER,
  sql TEXT
);

对于表来说,type 字段永远是 'table',name 字段永远是表的名字。所以,要获得数据库中所有表的列表, 使用下列SELECT语句:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

对于索引,type 等于 'index', name 则是索引的名字,tbl_name 是该索引所属的表的名字。 不管是表还是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 语句创建它们时的命令文本。对于自动创建的索引(用来实现 PRIMARY KEY 或 UNIQUE 约束),sql字段为NULL。

SQLITE_MASTER 表是只读的。不能对它使用 UPDATE、INSERT 或 DELETE。 它会被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自动更新。

临时表不会出现在 SQLITE_MASTER 表中。临时表及其索引和触发器存放在另外一个叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多,但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表, 不管是永久的还是临时的,可以使用类似下面的命令:

SELECT name FROM
   (SELECT * FROM sqlite_master UNION ALL
    SELECT * FROM sqlite_temp_master)
WHERE type='table'
ORDER BY name


--------------------------------------------------------------------------------

(8) SQLite数据库有已知的大小限制吗?

在 Windows 和 Unix 下,版本 2.7.4的 SQLite 可以达到 2的41次方字节 (2T 字节)。老版本的为 2的31 次方字节(2G 字节)。
SQLite 版本 2.8 限制一个记录的容量为 1M。SQLite 版本 3.0 则对单个记录容量没有限制。
表名、索引表名、视图名、触发器名和字段名没有长度限制。但 SQL 函数的名称 (由 sqlite3_create_function() API 函数创建) 不得超过 255 个字符。

对有关SQLite限制的详细讨论,见 limits.html 。


--------------------------------------------------------------------------------

(9) 在SQLite中,VARCHAR字段最长是多少?

SQLite 不强制 VARCHAR 的长度。 你可以在 SQLITE 中声明一个 VARCHAR(10),SQLite还是可以很高兴地允许你放入500个字符。 并且这500个字符是原封不动的,它永远不会被截断。


--------------------------------------------------------------------------------

(10) SQLite支持二进制大对象吗?

SQLite 3.0 及以后版本允许你在任何列中存储 BLOB 数据。 即使该列被声明为其它类型也可以。


--------------------------------------------------------------------------------

(11) 在SQLite中,如何在一个表上添加或删除一列?

SQLite 有有限地 ALTER TABLE 支持。你可以使用它来在表的末尾增加一列,可更改表的名称。 如果需要对表结构做更复杂的改变,则必须重新建表。 重建时可以先将已存在的数据放到一个临时表中,删除原表, 创建新表,然后将数据从临时表中复制回来。

如,假设有一个 t1 表,其中有 "a", "b", "c" 三列, 如果要删除列 c ,以下过程描述如何做:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;


--------------------------------------------------------------------------------

(12) 我在数据库中删除了很多数据,但数据库文件没有变小,是Bug吗?

不是。当你从SQLite数据库中删除数据时, 未用的磁盘空间将会加入一个内部的“自由列表”中。 当你下次插入数据时,这部分空间可以重用。磁盘空间不会丢失, 但也不会返还给操作系统。

如果删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令。 VACUUM 将会从头重新组织数据库。这将会使用数据库有一个空的“自由链表”, 数据库文件也会最小。但要注意的是,VACUUM 的执行会需要一些时间(在SQLite开发时,在Linux上,大约每M字节需要半秒种),并且, 执行过程中需要原数据库文件至多两倍的临时磁盘空间。

对于 SQLite 3.1版本,一个 auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打开。


--------------------------------------------------------------------------------

(13) 我可以在商业产品中使用SQLite而不需支付许可费用吗?

是的。SQLite 在 public domain。 对代码的任何部分没有任何所有权声明。你可以使用它做任何事。


--------------------------------------------------------------------------------

(14) 如何在字符串中使用单引号(')?

SQL 标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号。在这方面 SQL 用起来类似 Pascal 语言。 SQLite 尊循标准。如:

    INSERT INTO xyz VALUES('5 O''clock');
 

--------------------------------------------------------------------------------

(15) SQLITE_SCHEMA error是什么错误?为什么会出现该错误?

当一个准备好的(prepared)SQL语句不再有效或者无法执行时, 将返回一个 SQLITE_SCHEMA 错误。发生该错误时,SQL语句必须使用 sqlite3_prepare() API来重新编译. 在 SQLite 3 中, 一个 SQLITE_SCHEMA 错误只会发生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 执行 SQL 时。而不会发生在使用 sqlite3_exec()时。 在版本2中不是这样。

准备好的语句失效的最通常原因是:在语句准备好后, 数据库的模式又被修改了。另外的原因会发生在:

数据库离线:DETACHed.
数据库被 VACUUMed
一个用户存储过程定义被删除或改变。
一个 collation 序列定义被删除或改变。
认证函数被改变。
在所有情况下,解决方法是重新编译并执行该SQL语句。 因为一个已准备好的语句可以由于其它进程改变数据库模式而失效, 所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代码都应准备处理 SQLITE_SCHEMA 错误。下面给出一个例子:

    int rc;
    sqlite3_stmt *pStmt;
    char zSql[] = "SELECT .....";

    do {
      /* Compile the statement from SQL. Assume success. */
      sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);

      while( SQLITE_ROW==sqlite3_step(pStmt) ){
        /* Do something with the row of available data */
      }

      /* Finalize the statement. If an SQLITE_SCHEMA error has
      ** occured, then the above call to sqlite3_step() will have
      ** returned SQLITE_ERROR. sqlite3_finalize() will return
      ** SQLITE_SCHEMA. In this case the loop will execute again.
      */
      rc = sqlite3_finalize(pStmt);
    } while( rc==SQLITE_SCHEMA );
   
 

--------------------------------------------------------------------------------

(16) 为什么 ROUND(9.95,1) 返回 9.9 而不是 10.0? 9.95不应该圆整 (四舍五入)吗?

SQLite 使用二进制算术,在二进制中, 无法用有限的二进制位数表示 9.95 。使用 64-bit IEEE 浮点 (SQLite就是使用这个)最接近 9.95 的二进制表示是 9.949999999999999289457264239899814128875732421875。所在,当你输入 9.95 时,SQLite实际上以为是上面的数字, 在四舍五入时会舍去。

这种问题在使用二进制浮点数的任何时候都会出现。 通常的规则是记住很多有限的十进制小数都没有一个对应的二进制表示。 所以,它们只能使用最接近的二进制数。它们通常非常接近, 但也会有些微小的不同,有些时候也会导致你所期望的不同的结果。

freestyler 發表在 痞客邦 留言(0) 人氣()

//------------------------------------------

bool RssTreeView::LoadXmlToTree(LPCWSTR xmlFileName)
{
 if(PathFileExists(xmlFileName) == TRUE)
 {
  if ( SUCCEEDED(CoInitialize(NULL)) )
  {
   MSXML2::IXMLDOMDocument *pDoc;
   if ( SUCCEEDED (CoCreateInstance(MSXML2::CLSID_DOMDocument,
              NULL,
              CLSCTX_INPROC_SERVER,
              MSXML2::IID_IXMLDOMDocument,
              reinterpret_cast<void**>(&pDoc))))
   {
    //
    // Tell the "doc" that we're not going to load asynchronously.
    //
    if ( SUCCEEDED(pDoc->put_async(VARIANT_FALSE)) )
    {
     CComVariant vFile(RssDefaultNewsPath);
     VARIANT_BOOL vBool;
     pDoc->load(vFile,&vBool);
     if ( vBool == VARIANT_TRUE )
     {
      MSXML2::IXMLDOMNodePtr pRootNode;
      pDoc->selectSingleNode(_T("root"), &pRootNode); //取得根節點
      if(pRootNode == NULL)
       return  false;

      BSTR sRoot;
      pRootNode->get_nodeName(&sRoot);
      HTREEITEM root = GetTreeCtrl().InsertItem(sRoot, GetTreeCtrl().GetRootItem()); //加入根節點
 
      XmlNodeToTreeNode(root, pRootNode);

      pRootNode = NULL;
     }
     else
      ManageDB::CheckLoad(pDoc);
    }
    pDoc->Release();
    pDoc = NULL;
   }
   CoUninitialize();
  }
  return true;
 }
 else
  return false;
}

void RssTreeView::XmlNodeToTreeNode(HTREEITEM parentItem, MSXML2::IXMLDOMNodePtr pXmlNode)
{
 BSTR nodeType;
 MSXML2::IXMLDOMNodeListPtr pXMLNodeList;
 long count;
 BSTR sNode;

 pXmlNode->get_nodeTypeString(&nodeType);
 
 if(!wcscmp(nodeType, _T("text")))   //NODE類型涵義請查MSDN
  return;
 
 pXmlNode->get_childNodes(&pXMLNodeList);
 
 pXMLNodeList->get_length(&count); //子節點個數

 if(count==0)
 {
  //沒有子節點,則設置父節點名
  pXmlNode->get_nodeName(&sNode);
  GetTreeCtrl().SetItemText(parentItem, sNode);
  return;
 }

 
 for(int i=0; i<count; i++)
 {
  MSXML2::IXMLDOMNodePtr childNode;
  pXMLNodeList->get_item(i, &childNode);
  HTREEITEM subItem;

  childNode->get_nodeTypeString(&nodeType);
  if(!wcscmp(nodeType, _T("text")))
  {
   //是text,加節點值
   childNode->get_text(&sNode);
   subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
  }
  else
  {
   //非text,加節點名
   childNode->get_nodeName(&sNode);
   subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
   
   //若是沒有值的非葉子節點,就加一個空子值
   VARIANT_BOOL hasChild;
   childNode->hasChildNodes(&hasChild);
   if(sNode && wcslen(sNode) && !hasChild)
    GetTreeCtrl().InsertItem(_T(""), subItem);
  }
  XmlNodeToTreeNode(subItem, childNode); //遞迴子節點
 }
}

bool RssTreeView::SaveTreeToXml(LPCWSTR xmlFileName)
{
 CoInitialize(NULL);
 MSXML2::IXMLDOMDocument2Ptr pXMLDom;
 HRESULT hr = pXMLDom.CreateInstance(__uuidof(DOMDocument40));
 if(FAILED(hr))
 {
  return FALSE;
 }
 pXMLDom->put_async(VARIANT_FALSE);   // default-true
 
 //加入頭訊息
 MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
 pXMLDom->createProcessingInstruction(_T("xml"), _T("version='1.0'   encoding='unicode'"), &pPI);
 _variant_t vNullVal;
 vNullVal.vt = VT_NULL;
 MSXML2::IXMLDOMNodePtr tmpNode;
 pXMLDom->insertBefore(pPI, vNullVal, &tmpNode);
 
 HTREEITEM rootItem = GetTreeCtrl().GetRootItem();
 
 //將樹的根加入dom
 MSXML2::IXMLDOMNodePtr pRootNode;
 pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT),
 _bstr_t(GetTreeCtrl().GetItemText(rootItem)),
 _bstr_t(_T("")),
 &pRootNode);

 pXMLDom->appendChild(pRootNode, &tmpNode);
 
 TreeNodeToXmlNode(rootItem, pXMLDom, pRootNode);
 
 pXMLDom->save(_variant_t(xmlFileName));

 CoUninitialize();
 
 return TRUE;
}

void RssTreeView::TreeNodeToXmlNode(HTREEITEM parentItem, MSXML2::IXMLDOMDocument2Ptr pXMLDom, MSXML2::IXMLDOMNodePtr pXmlNode)
{
 if(!GetTreeCtrl().ItemHasChildren(parentItem))
 {
  return;
 }
 
 MSXML2::IXMLDOMNodePtr pChildNode;
 HTREEITEM hChildItem = GetTreeCtrl().GetChildItem(parentItem);//得到parentItem下所有子節點
 
 while (hChildItem != NULL)
 {
  CString szText = GetTreeCtrl().GetItemText(hChildItem);
  if(!GetTreeCtrl().ItemHasChildren(hChildItem))   //子為葉子
  {
   MSXML2::IXMLDOMTextPtr pText;
   pXMLDom->createTextNode(_bstr_t(szText), &pText);
   pXmlNode->appendChild(pText, &pChildNode);   //puttext
  }
  else //子又有子
  {
   pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT), _bstr_t(_bstr_t(szText)), _bstr_t(_T("")), &pChildNode); 
   
   MSXML2::IXMLDOMNodePtr tmpNode;
   pXmlNode->appendChild(pChildNode, &tmpNode);
   TreeNodeToXmlNode(hChildItem, pXMLDom, pChildNode);   //遞迴
  }
  hChildItem = GetTreeCtrl().GetNextItem(hChildItem, TVGN_NEXT);
 }

   

 

freestyler 發表在 痞客邦 留言(0) 人氣()

 

Generic SBCS UNICODE
TCHAR char wchar_t
_TEOF EOF WEOF
_TINT int wint_t
_TSCHAR signed char wchar_t
_TUCHAR unsigned char wchar_t
_TXCHAR char wchar_t
__T(x) x L
__targv __argv __wargv
__tcserror _strerror __wcserror
__tcserror_s _strerror_s __wcserror_s
_cgetts _cgets _cgetws
_cgetts_s _cgets_s _cgetws_s
_cputts _cputs _cputws
_fgettc fgetc fgetwc
_fgettc_nolock _fgetc_nolock _fgetwc_nolock
_fgettchar _fgetchar _fgetwchar
_fgetts fgets fgetws
_fputtc fputc fputwc
_fputtc_nolock _fputc_nolock _fputwc_nolock
_fputtchar _fputchar _fputwchar
_fputts fputs fputws
_ftprintf fprintf fwprintf
_ftprintf_l _fprintf_l _fwprintf_l
_ftprintf_p _fprintf_p _fwprintf_p
_ftprintf_p_l _fprintf_p_l _fwprintf_p_l
_ftprintf_s fprintf_s fwprintf_s
_ftprintf_s_l _fprintf_s_l _fwprintf_s_l
_ftscanf fscanf fwscanf
_ftscanf_l _fscanf_l _fwscanf_l
_ftscanf_s fscanf_s fwscanf_s
_ftscanf_s_l _fscanf_s_l _fwscanf_s_l
_get_tpgmptr _get_pgmptr _get_wpgmptr
_gettc getc getwc
_gettc_nolock _getc_nolock _getwc_nolock
_gettch _getch _getwch
_gettch_nolock _getch_nolock _getwch_nolock
_gettchar getchar getwchar
_gettchar_nolock _getchar_nolock _getwchar_nolock
_gettche _getche _getwche
_gettche_nolock _getche_nolock _getwche_nolock
_getts gets _getws
_getts_s gets_s _getws_s
_i64tot _i64toa _i64tow
_i64tot_s _i64toa_s _i64tow_s
_istalnum isalnum iswalnum
_istalnum_l _isalnum_l _iswalnum_l
_istalpha isalpha iswalpha
_istalpha_l _isalpha_l _iswalpha_l
_istascii __isascii iswascii
_istcntrl iscntrl iswcntrl
_istcntrl_l _iscntrl_l _iswcntrl_l
_istdigit isdigit iswdigit
_istdigit_l _isdigit_l _iswdigit_l
_istgraph isgraph iswgraph
_istgraph_l _isgraph_l _iswgraph_l
_istlower islower iswlower
_istlower_l _islower_l _iswlower_l
_istprint isprint iswprint
_istprint_l _isprint_l _iswprint_l
_istpunct ispunct iswpunct
_istpunct_l _ispunct_l _iswpunct_l
_istspace isspace iswspace
_istspace_l _isspace_l _iswspace_l
_istupper isupper iswupper
_istupper_l _isupper_l _iswupper_l
_istxdigit isxdigit iswxdigit
_istxdigit_l _isxdigit_l _iswxdigit_l
_itot _itoa _itow
_itot_s _itoa_s _itow_s
_ltot _ltoa _ltow
_ltot_s _ltoa_s _ltow_s
_puttc putc putwc
_puttc_nolock _putc_nolock _putwc_nolock
_puttch _putch _putwch
_puttch_nolock _putch_nolock _putwch_nolock
_puttchar putchar putwchar
_puttchar_nolock _putchar_nolock _putwchar_nolock
_putts puts _putws
_sctprintf _scprintf _scwprintf
_sctprintf_l _scprintf_l _scwprintf_l
_sctprintf_p _scprintf_p _scwprintf_p
_sctprintf_p_l _scprintf_p_l _scwprintf_p_l
_sntprintf _snprintf _snwprintf
_sntprintf_l _snprintf_l _snwprintf_l
_sntprintf_s _snprintf_s _snwprintf_s
_sntprintf_s_l _snprintf_s_l _snwprintf_s_l
_sntscanf _snscanf _snwscanf
_sntscanf_l _snscanf_l _snwscanf_l
_sntscanf_s _snscanf_s _snwscanf_s
_sntscanf_s_l _snscanf_s_l _snwscanf_s_l
_stprintf sprintf _swprintf
_stprintf_l _sprintf_l __swprintf_l
_stprintf_p _sprintf_p _swprintf_p
_stprintf_p_l _sprintf_p_l _swprintf_p_l
_stprintf_s sprintf_s swprintf_s
_stprintf_s_l _sprintf_s_l _swprintf_s_l
_stscanf sscanf swscanf
_stscanf_l _sscanf_l _swscanf_l
_stscanf_s sscanf_s swscanf_s
_stscanf_s_l _sscanf_s_l _swscanf_s_l
_tWinMain WinMain wWinMain
_taccess _access _waccess
_taccess_s _access_s _waccess_s
_tasctime asctime _wasctime
_tasctime_s asctime_s _wasctime_s
_tchdir _chdir _wchdir
_tchmod _chmod _wchmod
_tcprintf _cprintf _cwprintf
_tcprintf_l _cprintf_l _cwprintf_l
_tcprintf_p _cprintf_p _cwprintf_p
_tcprintf_p_l _cprintf_p_l _cwprintf_p_l
_tcprintf_s _cprintf_s _cwprintf_s
_tcprintf_s_l _cprintf_s_l _cwprintf_s_l
_tcreat _creat _wcreat
_tcscanf _cscanf _cwscanf
_tcscanf_l _cscanf_l _cwscanf_l
_tcscanf_s _cscanf_s _cwscanf_s
_tcscanf_s_l _cscanf_s_l _cwscanf_s_l
_tcscat strcat wcscat
_tcscat_s strcat_s wcscat_s
_tcschr strchr wcschr
_tcsclen strlen wcslen
_tcscmp strcmp wcscmp
_tcscnlen strnlen wcsnlen
_tcscoll strcoll wcscoll
_tcscoll_l _strcoll_l _wcscoll_l
_tcscpy strcpy wcscpy
_tcscpy_s strcpy_s wcscpy_s
_tcscspn strcspn wcscspn
_tcsdec _strdec _wcsdec
_tcsdup _strdup _wcsdup
_tcsdup_dbg _strdup_dbg  
_tcserror strerror _wcserror
_tcserror_s strerror_s _wcserror_s
_tcsftime strftime wcsftime
_tcsftime_l _strftime_l _wcsftime_l
_tcsicmp _stricmp _wcsicmp
_tcsicmp_l _stricmp_l _wcsicmp_l
_tcsicoll _stricoll _wcsicoll
_tcsicoll_l _stricoll_l _wcsicoll_l
_tcsinc _strinc _wcsinc
_tcslen strlen wcslen
_tcslwr _strlwr _wcslwr
_tcslwr_l _strlwr_l _wcslwr_l
_tcslwr_s _strlwr_s _wcslwr_s
_tcslwr_s_l _strlwr_s_l _wcslwr_s_l
_tcsnbcnt _strncnt _wcsncnt
_tcsncat strncat wcsncat
_tcsncat_l _strncat_l _wcsncat_l
_tcsncat_s strncat_s wcsncat_s
_tcsncat_s_l _strncat_s_l _wcsncat_s_l
_tcsnccat strncat wcsncat
_tcsnccat_l _strncat_l _wcsncat_l
_tcsnccat_s strncat_s wcsncat_s
_tcsnccat_s_l _strncat_s_l _wcsncat_s_l
_tcsnccmp strncmp wcsncmp
_tcsnccnt _strncnt _wcsncnt
_tcsnccoll _strncoll _wcsncoll
_tcsnccoll_l _strncoll_l _wcsncoll_l
_tcsnccpy strncpy wcsncpy
_tcsnccpy_l _strncpy_l _wcsncpy_l
_tcsnccpy_s strncpy_s wcsncpy_s
_tcsnccpy_s_l _strncpy_s_l _wcsncpy_s_l
_tcsncicmp _strnicmp _wcsnicmp
_tcsncicmp_l _strnicmp_l _wcsnicmp_l
_tcsncicoll _strnicoll _wcsnicoll
_tcsncicoll_l _strnicoll_l _wcsnicoll_l
_tcsncmp strncmp wcsncmp
_tcsncoll _strncoll _wcsncoll
_tcsncoll_l _strncoll_l _wcsncoll_l
_tcsncpy strncpy wcsncpy
_tcsncpy_l _strncpy_l _wcsncpy_l
_tcsncpy_s strncpy_s wcsncpy_s
_tcsncpy_s_l _strncpy_s_l _wcsncpy_s_l
_tcsncset _strnset _wcsnset
_tcsnextc _strnextc _wcsnextc
_tcsnicmp _strnicmp _wcsnicmp
_tcsnicmp_l _strnicmp_l _wcsnicmp_l
_tcsnicoll _strnicoll _wcsnicoll
_tcsnicoll_l _strnicoll_l _wcsnicoll_l
_tcsninc _strninc _wcsninc
_tcsnlen strnlen wcsnlen
_tcsnset _strnset _wcsnset
_tcsnset_l _strnset_l _wcsnset_l
_tcsnset_s _strnset_s _wcsnset_s
_tcsnset_s_l _strnset_s_l _wcsnset_s_l
_tcspbrk strpbrk wcspbrk
_tcsrchr strrchr wcsrchr
_tcsrev _strrev _wcsrev
_tcsset _strset _wcsset
_tcsset_l   _wcsset_l
_tcsset_s _strset_s _wcsset_s
_tcsset_s_l _strset_s_l _wcsset_s_l
_tcsspn strspn wcsspn
_tcsspnp _strspnp _wcsspnp
_tcsstr strstr wcsstr
_tcstod strtod wcstod
_tcstod_l _strtod_l _wcstod_l
_tcstoi64 _strtoi64 _wcstoi64
_tcstoi64_l _strtoi64_l _wcstoi64_l
_tcstok strtok wcstok
_tcstok_l _strtok_l _wcstok_l
_tcstok_s strtok_s wcstok_s
_tcstok_s_l _strtok_s_l _wcstok_s_l
_tcstol strtol wcstol
_tcstol_l _strtol_l _wcstol_l
_tcstoui64 _strtoui64 _wcstoui64
_tcstoui64_l _strtoui64_l _wcstoui64_l
_tcstoul strtoul wcstoul
_tcstoul_l _strtoul_l _wcstoul_l
_tcsupr _strupr _wcsupr
_tcsupr_l _strupr_l _wcsupr_l
_tcsupr_s _strupr_s _wcsupr_s
_tcsupr_s_l _strupr_s_l _wcsupr_s_l
_tcsxfrm strxfrm wcsxfrm
_tcsxfrm_l _strxfrm_l _wcsxfrm_l
_tctime ctime _wctime
_tctime32 _ctime32 _wctime32
_tctime32_s _ctime32_s _wctime32_s
_tctime64 _ctime64 _wctime64
_tctime64_s _ctime64_s _wctime64_s
_tctime_s ctime_s _wctime_s
_tdupenv_s _dupenv_s _wdupenv_s
_tdupenv_s_dbg _dupenv_s_dbg _wdupenv_s_dbg
_tenviron _environ _wenviron
_texecl _execl _wexecl
_texecle _execle _wexecle
_texeclp _execlp _wexeclp
_texeclpe _execlpe _wexeclpe
_texecv _execv _wexecv
_texecve _execve _wexecve
_texecvp _execvp _wexecvp
_texecvpe _execvpe _wexecvpe
_tfdopen _fdopen _wfdopen
_tfinddata32_t _finddata32_t _wfinddata32_t
_tfinddata32i64_t _finddata32i64_t _wfinddata32i64_t
_tfinddata64_t __finddata64_t _wfinddata64_t
_tfinddata64i32_t _finddata64i32_t _wfinddata64i32_t
_tfinddata_t _finddata_t _wfinddata_t
_tfinddatai64_t _finddatai64_t _wfinddatai64_t
_tfindfirst _findfirst _wfindfirst
_tfindfirst32 _findfirst32 _wfindfirst32
_tfindfirst32i64 _findfirst32i64 _wfindfirst32i64
_tfindfirst64 _findfirst64 _wfindfirst64
_tfindfirst64i32 _findfirst64i32 _wfindfirst64i32
_tfindfirsti64 _findfirsti64 _wfindfirsti64
_tfindnext _findnext _wfindnext
_tfindnext32 _findnext32 _wfindnext32
_tfindnext32i64 _findnext32i64 _wfindnext32i64
_tfindnext64 _findnext64 _wfindnext64
_tfindnext64i32 _findnext64i32 _wfindnext64i32
_tfindnexti64 _findnexti64 _wfindnexti64
_tfopen fopen _wfopen
_tfopen_s fopen_s _wfopen_s
_tfreopen freopen _wfreopen
_tfreopen_s freopen_s _wfreopen_s
_tfsopen _fsopen _wfsopen
_tfullpath _fullpath _wfullpath
_tfullpath_dbg _fullpath_dbg _wfullpath_dbg
_tgetcwd _getcwd _wgetcwd
_tgetcwd_dbg _getcwd_dbg _wgetcwd_dbg
_tgetdcwd _getdcwd _wgetdcwd
_tgetdcwd_dbg _getdcwd_dbg _wgetdcwd_dbg
_tgetdcwd_lk_dbg _getdcwd_lk_dbg _wgetdcwd_lk_dbg
_tgetdcwd_nolock _getdcwd_nolock _wgetdcwd_nolock
_tgetenv getenv _wgetenv
_tgetenv_s getenv_s _wgetenv_s
_tmain main wmain
_tmakepath _makepath _wmakepath
_tmakepath_s _makepath_s _wmakepath_s
_tmkdir _mkdir _wmkdir
_tmktemp _mktemp _wmktemp
_tmktemp_s _mktemp_s _wmktemp_s
_topen _open _wopen
_totlower tolower towlower
_totlower_l _tolower_l _towlower_l
_totupper toupper towupper
_totupper_l _toupper_l _towupper_l
_tperror perror _wperror
_tpgmptr _pgmptr _wpgmptr
_tpopen _popen _wpopen
_tprintf printf wprintf
_tprintf_l _printf_l _wprintf_l
_tprintf_p _printf_p _wprintf_p
_tprintf_p_l _printf_p_l _wprintf_p_l
_tprintf_s printf_s wprintf_s
_tprintf_s_l _printf_s_l _wprintf_s_l
_tputenv _putenv _wputenv
_tputenv_s _putenv_s _wputenv_s
_tremove remove _wremove
_trename rename _wrename
_trmdir _rmdir _wrmdir
_tscanf scanf wscanf
_tscanf_l _scanf_l _wscanf_l
_tscanf_s scanf_s wscanf_s
_tscanf_s_l _scanf_s_l _wscanf_s_l
_tsearchenv _searchenv _wsearchenv
_tsearchenv_s _searchenv_s _wsearchenv_s
_tsetlocale setlocale _wsetlocale
_tsopen _sopen _wsopen
_tsopen_s _sopen_s _wsopen_s
_tspawnl _spawnl _wspawnl
_tspawnle _spawnle _wspawnle
_tspawnlp _spawnlp _wspawnlp
_tspawnlpe _spawnlpe _wspawnlpe
_tspawnv _spawnv _wspawnv
_tspawnve _spawnve _wspawnve
_tspawnvp _spawnvp _wspawnvp
_tspawnvpe _spawnvpe _wspawnvpe
_tsplitpath _splitpath _wsplitpath
_tsplitpath_s _splitpath_s _wsplitpath_s
_tstat _stat _wstat
_tstat32 _stat32 _wstat32
_tstat32i64 _stat32i64 _wstat32i64
_tstat64 _stat64 _wstat64
_tstat64i32 _stat64i32 _wstat64i32
_tstati64 _stati64 _wstati64
_tstof atof _wtof
_tstof_l _atof_l _wtof_l
_tstoi atoi _wtoi
_tstoi64 _atoi64 _wtoi64
_tstoi64_l _atoi64_l _wtoi64_l
_tstoi_l _atoi_l _wtoi_l
_tstol atol _wtol
_tstol_l _atol_l _wtol_l
_tstrdate _strdate _wstrdate
_tstrdate_s _strdate_s _wstrdate_s
_tstrtime _strtime _wstrtime
_tstrtime_s _strtime_s _wstrtime_s
_tsystem system _wsystem
_ttempnam _tempnam _wtempnam
_ttempnam_dbg _tempnam_dbg _wtempnam_dbg
_ttmpnam tmpnam _wtmpnam
_ttmpnam_s tmpnam_s _wtmpnam_s
_ttoi atoi _wtoi
_ttoi64 _atoi64 _wtoi64
_ttol atol _wtol
_tunlink _unlink _wunlink
_tutime _utime _wutime
_tutime32 _utime32 _wutime32
_tutime64 _utime64 _wutime64
_ui64tot _ui64toa _ui64tow
_ui64tot_s _ui64toa_s _ui64tow_s
_ultot _ultoa _ultow
_ultot_s _ultoa_s _ultow_s
_ungettc ungetc ungetwc
_ungettc_nolock _ungetc_nolock _ungetwc_nolock
_ungettch _ungetch _ungetwch
_ungettch_nolock _ungetch_nolock _ungetwch_nolock
_vftprintf vfprintf vfwprintf
_vftprintf_l _vfprintf_l _vfwprintf_l
_vftprintf_p _vfprintf_p _vfwprintf_p
_vftprintf_p_l _vfprintf_p_l _vfwprintf_p_l
_vftprintf_s vfprintf_s vfwprintf_s
_vftprintf_s_l _vfprintf_s_l _vfwprintf_s_l
_vsctprintf _vscprintf _vscwprintf
_vsctprintf_l _vscprintf_l _vscwprintf_l
_vsctprintf_p _vscprintf_p _vscwprintf_p
_vsctprintf_p_l _vscprintf_p_l _vscwprintf_p_l
_vsntprintf _vsnprintf _vsnwprintf
_vsntprintf_l _vsnprintf_l _vsnwprintf_l
_vsntprintf_s _vsnprintf_s _vsnwprintf_s
_vsntprintf_s_l _vsnprintf_s_l _vsnwprintf_s_l
_vstprintf vsprintf _vswprintf
_vstprintf_l _vsprintf_l _vswprintf_l
_vstprintf_p _vsprintf_p _vswprintf_p
_vstprintf_p_l _vsprintf_p_l _vswprintf_p_l
_vstprintf_s vsprintf_s vswprintf_s
_vstprintf_s_l _vsprintf_s_l _vswprintf_s_l
_vtcprintf _vcprintf _vcwprintf
_vtcprintf_l _vcprintf_l _vcwprintf_l
_vtcprintf_p _vcprintf_p _vcwprintf_p
_vtcprintf_p_l _vcprintf_p_l _vcwprintf_p_l
_vtcprintf_s _vcprintf_s _vcwprintf_s
_vtcprintf_s_l _vcprintf_s_l _vcwprintf_s_l
_vtprintf vprintf vwprintf
_vtprintf_l _vprintf_l _vwprintf_l
_vtprintf_p _vprintf_p _vwprintf_p
_vtprintf_p_l _vprintf_p_l _vwprintf_p_l
_vtprintf_s vprintf_s vwprintf_s
_vtprintf_s_l _vprintf_s_l _vwprintf_s_l
vtprintf_s_l _vprintf_s_l _vwprintf_s_l

 

freestyler 發表在 痞客邦 留言(0) 人氣()