2013年11月26日 星期二

[觀點][C語言]用指標寫bubble sort

#include <stdio.h>

#define SIZE 5

void bubbleSort(int *array_a, int array_size);
void swap(int *sw1, int * sw2);

int main()
{
    int a[SIZE]={3, 6, 1, 9, 2};
    int i;
    printf("original array:\n");
    for (i=0; i < SIZE; i++)
    {
        printf(" %d", a[i]);
    }
    printf("\n");

    bubbleSort(a, SIZE);

    printf("bubble sort array:\n");
    for (i=0; i < SIZE; i++)
    {
        printf(" %d", a[i]);
    }
    printf("\n");
    return 0;
}

void bubbleSort(int *array_a, int array_size)
{
    int j, k;
    for (j=0; j < SIZE-1; j++)
    {
        for (k=0; k < SIZE-1; k++)
        {
            if (array_a[k] > array_a[k+1])
            {
                swap(&array_a[k], &array_a[k+1]);
            }
        }
    }
}

void swap(int *sw1, int * sw2)
{
    int temp;
    temp = *sw1;
    *sw1 = *sw2;
    *sw2 = temp;
}
[Answer]
original array:
 3 6 1 9 2
bubble sort array:
 1 2 3 6 9

[觀點][C語言]switch case裡面沒有break的話,就會一直選到下面的case

#include <stdio.h>

int main()
{
    int id = 3; 
    int value;
    switch(id)
    {
        case 1:
            value = 1;
            break;

        case 2:
            value = 2;
            break;

        case 3:
            value = 3;

        default:
            value = 4;
    }

    printf("value = %d\n", value);   
    return 0;
}
[Answer] value = 4

2013年11月21日 星期四

[觀點][C語言]字串是不能比較的

#include <stdio.h>

int compare_string(char* a, char* b)
{
    if (a == b)
        return 0;
    else
        return 1;
}
int main()
{
    char str1[] = "abc";
    char str2[] = "abc";
    int answer;

    answer = compare_string(str1, str2);
    printf("%d\n", answer);

    return 0;
}
[Answer] 1

[觀點][C語言]在while(負數)判斷是TRUE,在if(負數)判斷也是TRUE

#include <stdio.h>

int foo(int x, int y)
{
    while(x)
    {
        ++x;
        ++y;
    }
    if(y)
    {
        --y;
    }
    return x+y;
}

int main()
{
    int answer;

    answer = foo(-1, -1);
    printf("%d\n", answer);

    answer = foo(0, -1);
    printf("%d\n", answer);

    return 0;
}

[answer]
0
-2

[觀點][C語言](0x7700 && 0x8800) || 0xff00 用%d印出來是1

#include <stdio.h>

int main()
{
    int a = 0x7700;
    int b = 0x8800;
    int c = 0xff00;
    int d, e;

    d = (a && b) || c;
    e = (a | b) & c;

    printf("d = %d\n", d);
    printf("e = %d\n", e);

    return 0;
}

[Answer]
1
65280

[觀點][C語言]sizeof各類型別,struct > union == array > char*

#include <stdio.h>

union
{
    char chVals[16];
}uu;

struct
{
    char chVals[16];
    int a;
}ss;

int main()
{
    char chVals[16];
    char* pVals = chVals;

    printf("%lu\n", sizeof(ss));
    printf("%lu\n", sizeof(uu));
    printf("%lu\n", sizeof(chVals));
    printf("%lu\n", sizeof(pVals));

    return 0;
}
[answer]
20
16
16
4

[觀點][C語言]即使函式內的變數和local變數名稱一樣,但跳出函式後就無關 

#include <stdio.h>
#include <stdlib.h>

void foo(int* x)
{
    x = (int*)malloc(sizeof(int));
    *x = 12;
}

int main()
{
    int x = 10;
    foo(&x);
    printf("x = %d\n", x);
    return 0;
}
[answer]
x = 10

[觀點][C語言]重新定義一樣的變數名稱,觀察其值的改變

#include <stdio.h>
#include <stdlib.h>

void foo(int* x)
{
    x = (int*)malloc(sizeof(int));
    *x = 12;
}

int main()
{
    int x = 10;
    foo(&x);
    printf("x = %d\n", x);
    return 0;
}
[Answer]
a = 7 b = 13
a = 7

[觀點][C語言]x變數在做完logic判斷後,它的值會變成1

#include <stdio.h>

int main()
{
    int x = 2;
    int y = 2;
    int z;

    if (x = 2 || y == 2) //x = 1
        z = x + y;
    else
        z = x - y;

    printf("z = %d\n", z); 
    return 0;
}
[Answer]
z = 3

[觀點][C語言]變數沒有initialize,則會有run-time error,硬是要印出來的話,會印出其位址

#include <stdio.h>

int main()
{
    int x;
    while(x < 100)
        printf("x = %d\n", x);
    return 0;
}
[Answer]
run-time error
x = -858993460

[觀點][C語言]n會先--之後才去做<=的比較

#include <stdio.h>

void Test(int n)
{
    int i;
    for (i = 1; i<= --n; i++)
    printf("i = %d n = %d\n", i, n);
}

int main()
{
    int x;
    Test(5);

    return 0;
}
[Answer]
i = 1 n = 4
i = 2 n = 3

[觀點][C語言]multi array

#include <stdio.h>

int main()
{
    int sum = 0;
    int i, j;
    int ary[][4] = {1, 3, 5, 7, 9, 11};

    for (i = 0; i <=6; i++)
        for (j = 0; j <=6; j++)
        printf("ary[%d][%d] = %d\n", i, j, ary[i][j]);

    int (*ptr)[4] = ary;
    sum = (*ptr)[1] + ary [0][3] + ary[1][2];
    printf("sum = %d", sum);

    return 0;
}
[Answer]
ary[0][0] = 1
ary[0][1] = 3
ary[0][2] = 5
ary[0][3] = 7
ary[0][4] = 9
ary[0][5] = 11
ary[0][6] = 0
ary[1][0] = 9
ary[1][1] = 11
ary[1][2] = 0
ary[1][3] = 0
ary[1][4] = 15773951
ary[1][5] = 0
ary[1][6] = 4195824
ary[2][0] = 15773951
ary[2][1] = 0
ary[2][2] = 4195824
ary[2][3] = 0
ary[2][4] = 0
ary[2][5] = 5
ary[2][6] = 2
ary[3][0] = 0
ary[3][1] = 1
ary[3][2] = 3
ary[3][3] = 0
ary[3][4] = -2050383040
ary[3][5] = 32767
ary[3][6] = 0
ary[4][0] = -2050383040
ary[4][1] = 32767
ary[4][2] = 0
ary[4][3] = 0
ary[4][4] = 0
ary[4][5] = 0
ary[4][6] = -662104211
ary[5][0] = 0
ary[5][1] = 0
ary[5][2] = -662104211
ary[5][3] = 32702
ary[5][4] = 0
ary[5][5] = 0
ary[5][6] = -2050383032
ary[6][0] = 0
ary[6][1] = 0
ary[6][2] = -2050383032
ary[6][3] = 32767
ary[6][4] = 0
ary[6][5] = 1
ary[6][6] = 4195572
sum = 10

[觀點][C語言]#define之後代入的數要小心

#include <stdio.h>

#define S(z) (z*z)

void foo(int x, int *py)
{
    int n = S(x+1);
    x = *py;
    *py = n;
}

int main()
{
    int a = 2;
    int b = 10;
    foo(a, &b);
    ++b;
    printf("a = %d b= %d\n", a, b);
    return 0;
}
[Answer]
a = 2 b= 6

a = 2代入S(2+1)則2+1*2+1=5,不是3*3=9

[觀點][C語言]array搭配強制型別轉換的pointer, 當轉換小型別轉成大型別的時候, 位址會跟著變, 還有int的加減法和char不同, 單位會是4

#include <stdio.h>

char ary[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
char *p1 = ary;
char *p2;
int *pn;

void test()
{
    p1+=2;                  //p1[0] = 2     
    pn = (int*)&p1[2];     //p1[2] = 4, char->int之後,pn[0] = 7
    pn+=1;                  //加完之後pn[0] = 8
    p1 = (char*)pn;        //pn從int->char,還是維持在原位,所以p1[0]=8
    --pn;                   //因為pn是int型別,做加減法會位移4個byte而不是1個byte,所以pn[0]=4
    p2 = (char*)pn;        //int->char不會縮減,所以p2[0]=4
    --p2;                   //p2是char,所以只會減1個byte,p2[0]=3
}

int main()
{
    test();
    printf("*p1 = %d *p2= %d\n", *p1, *p2);
    return 0;
}
[answer]
*p1 = 8 *p2= 3

2013年11月20日 星期三

[觀點]證件被盜用該做什麼動作

[身份證遺失]
馬上去戶政事務所補辦一張
不用向警察局備案遺失
不用開立遺失三聯單(因為只有刑案才開立報案三連單, 沒有遺失三連單這種東西)
不用向金融聯合徵信中心登錄遺失記錄

[被冒名申請大哥大門號]
若電信業者向法院申請支付命令,你只要向法院提起抗告﹝寄一封書函過去即可﹞,或將存証信函影本提交法院即可,不必跑法院。
不要笨到請一天假,去替銀行、電信業者,做一些他們應該做的徵信工作。

[
信用卡遺失、被盜刷]
一定要在第一時間,向原發卡銀行申報遺失。在你掛失後的盜刷行為,銀行會自行吸收
你可以向發卡銀行要求檢視簽帳單,若簽帳單上的簽名,與你在信用卡背面簽名不同或相差甚遠,這筆錢你就省了
你可以要求檢視刷卡時的監視影帶

reference:
證件被冒用了 不要笨笨的跑去找警察

[觀點][C語言]enum如果有指定值的話, 其值的變化

1.
enum {
    x1,
    x2,
    x3,
    x4 = 6,
    x5,
    x6
};

[Answer]
x1 = 0
x2 = 1
x3 = 2
x4 = 6
x5 = 7
x6 = 8


2.
enum { 
    x1, 
    x2, 
    x3 = 0, 
    x4, 
    x5, 
    x6 
}; 
  
[Answer] 
x1 = 0 
x2 = 1 
x3 = 0 
x4 = 1 
x5 = 2 
x6 = 3 


3.
enum { 
    x1, 
    x2, 
    x3 = -1, 
    x4, 
    x5, 
    x6 
}; 
  
[Answer] 
x1 = 0 
x2 = 1 
x3 = -1 
x4 = 0 
x5 = 1 
x6 = 2 

[觀點]HDMI整理

HDCP,High-Bandwidth Digital Content Protection,中文名稱是高頻寬數位內容保護。

目前共有兩種數位介面採用HDCP保護標準,其中一個是HDMI,另一個是DVI(Digital Visual Interface)。

[測試HDMI的儀器]
Astro HDMI protocol analyzer VA-1831, VA-1838
Agilent U1998A


[EDID]
延伸顯示能力識別Extended display identification data
EDID 是 依據 video output 的解析度,自動調整顯示的解析度品質。
也就是說,使用者不必特別麻煩地調整輸出設備的解析度去配合想
要介接的個人電腦,機器將會自動地將兩者不同解析度的品質設定
成相同的解析度。
更平民化的說法,EDID都是放在顯示器裡面,裡面記載了我這台顯示器
所能支援的最高顯示解析度與掃描頻率,因為很多播放器(DVD或機上
盒)所能輸出的解析度往往高於LCD TV所能承擔的上限,於是當你連上
去LCD TV時,播放器透過一條I2C訊號線跟LCD TV溝通,從EDID ROM
裡面得到顯示器最佳解析度為何,再依據這個數值輸出適當的畫面給
LCD TV播放...

[深色技術]
就是色彩取樣精度的提升,HDTV全部採用8bit取樣精度,及24位色彩系統,即16.7M色。可以使HDTV和其他顯示設備由16.7M種色彩發展到數億色彩,色彩之間的漸變更細微,增加對比度,在黑色和白色之間展現更多倍的灰色陰影,獲得空前逼真和精確的畫面。HDMI v1.3以後才有support,是optional
HDMI Deep Color – Deep Color is an OPTION for some TVs or projectors that feature HDMI 
v1.3 inputs. Normally, each pixel of the video image is transmitted using 24-bit data (8-bit per 
channel for R, G, B or Y, Cb, Cr). If Deep Color is supported, each pixel of the video image can 
be transmitted using 30-bit (10-bit per channel) or 36-bit (12-bit per channel) data. The 
increased bit depth should result in smoother color transitions and better gradients. The 
available options are: 
• 30 Bits – Use the 30-bit per pixel Deep Color mode. 
• 36 Bits – Use the 36-bit per pixel Deep Color mode. 
• Off (default) – Do not use Deep Color.
NOTE 
Since the Deep Color feature is OPTIONAL and may not be supported by all TVs, enabling 
Deep Color while connected to a TV without this feature may result in no effect or no video. 

[觀點]HDCP整理

HDCP的認證透過HDMI的第15Pin與16Pin腳來進行確認的,當雙方認證完畢之後,這兩個腳位可還沒停止動作喔!它每隔兩秒還會再做一次確認!所以想偷機的人,可別以為有訊號之後就能換成可以燒錄(盜拷)的器材來破解認證的問題!
reference:
[知識]HDMI技術與HDCP工作原理 !-HD.Club 精研視務所 High Definition Vision Club - Powered by Discuz!


欲應用HDCP技術於產品上的廠商,皆須先成為DCP的會員(會費美金15,000)並取得授權,授權等級依產品的開發程度有不同分類。僅有取得全部授權的廠商能取得唯一的密鑰集(稱作KSV)以開發或販售產品,此授權密碼並會記錄於DCP,一旦授權廠商會員過期,則其KSV會在DCP的資料庫標示為撤銷密鑰。
reference:
數位內容保護 HDCP相容測試大揭祕


HDCP 是用來保護內容串流通道的保護機制,也就是從「內容來源」到「顯示裝置」之間的加密。它是由內容輸出後,才經過硬體(HDCP 晶片)加密的。
這次流出的 HDCP 主密鑰和過去以大量破解以取得 HDCP 私密鑰的方式不同,私密鑰有可能會被取消,讓你的 HDCP 破解裝置無法再運作,不過主密鑰卻沒辦法取消,除非 Intel 想將目前採用 HDCP 加密的機器統統砍掉重練,所以主密鑰的流出就代表了完全破解 HDCP 的第一步。
HDCP 主密鑰破解後,只要將這個密鑰寫入 HDCP 晶片,你就可以避開 HDCP 的限制,像是可以利用 DVR 來完整錄下藍光播放器所播出的高解析內容,而不會損害解析度;同時也可以讓不支援 HDCP 的顯示裝置完整顯示高解析內容,如此一來,就算使用 HDMI 將 PS3 連接不支援 HDCP 的電視也可以正常玩遊戲了。
因此這次主密鑰的流出對於有更好擷取方式的藍光光碟播放器衝擊較小,不過別忘了,具有 HDCP 加密的可不只有藍光光碟。HDCP 破解後,不論高解析影片是經由網路線、同軸電纜還是衛星傳輸,都可以直接經由 HDMI 等數位介面直接將影片錄制到你的電腦中,不用再痴痴地等待廠商推出具有錄影功能的機上盒,更不用被收取200元額外費用才能開啟錄影功能。
reference:

[觀點]WAPI整理

WAPI(WLAN Authentication and Privacy Infrastructure,無線鑒別和保密基礎結構)是一個關於無線區域網路的中華人民共和國國家標準(GB 15629.11-2003),一般讀作「WAIPI」。雖然它被設計為基於WiFi執行,但其與802.11無線網路標準所用安全協定的相容性存疑。


中國政府為保護自主智慧財產權,在WAPI標準的實施無限期推延後,由工業化訊息化部宣布所有在中國大陸發售的手機禁止安裝WiFi。後來迫於市場壓力,以及2009年WAPI通過ISO認證,2009年以後中國政府對WiFi開禁,但所有在中國大陸銷售的帶WLAN功能的手機必須相容WAPI。

reference:

[觀點]FM的RDS/RBDS整理


台灣RDS列表
104.9MHz  RDSIOT11
106.5MHz  VOH01/V.H.B.N
103.3MHz  BCC
92.7  MHz  ASIA--FM www.asiafm.com.tw (03)220-9207

RBDS規範

RDS相關的名詞解釋
ftp://ftp.rds.org.uk/pub/acrobat/ps_clauses.pdf
http://www.radio-electronics.com/info/broadcast/rds/radio-data-system-acronyms.php

RDS問運研所的Q&A
http://61.57.40.123/EIntegration_new/RDS/Q&A.htm

Block1 為節目識別碼(Program Identification code:PI code)由16
位元所組成,位元1~4 是國家/區域符號碼,字碼5~16由相關的國
家或區域分配使用,例如位元 5~8 用於描述節目型態,位元 9~16
節目參考數目。故基本上節目識別碼是一個電台專用碼,如果 RDS
解碼器發現節目識別碼改變時就代表已換台。而節目識別碼亦是解譯
出Data Group的關鍵數值

Block 2 是RDS資訊傳送的關鍵位元,block 2 的前5 個bit 為群
型態碼(Group Type code),bit 1~4為功能選擇,4個位元可定義出16
種服務項目,但在第 10 至 13 項未定義,故實際的 RDS 之服務項出
只有12 種。bit 5為version A或B選擇。所有的RDS所能提供之服
務都由群型態碼所定義。經由群型態碼的定義延伸出各種不同的資料 - 14 -
格式,其中之影響包括了Group bit 6~16,接在後面的block 3,block
4 與接下來之 Group 有關係。因此要了解 RDS 之功能,首先要從群
型態碼著手

reference:
http://www.ee.ncut.edu.tw/project/ResultFile/98123.pdf

[觀點]各國FM頻率列表(50kHz調頻間隔主要是歐洲使用)

在開發的時候,遇到有的chip有support 50kHz的調頻間隔
但是台灣都是100kHz的
所以找了一下
原來主要是歐洲在使用的

收音機
• 調諧範圍:
• 歐洲/俄羅斯/中國:FM 87.5-108
MHz (50 kHz)
• 亞太地區/拉丁美洲:FM 87.5-108
MHz (50/100 kHz)


reference: 

[觀點]香港FM頻率範圍87~108MHz

由圖知是87~108MHz

reference: http://tel_archives.ofca.gov.hk/zh/freq-spec/FreqTable.pdf  (第41頁)