2014-11-05 74 views
-1

背景用C基本封裝

  • 寫庫兩種功能
    • 處理陣列
    • 處理陣列炭
  • 此數據結構由被訪問項目內環

形勢

我試圖封裝與它的初始化的一個步驟的數組聲明將相關代碼放在一起。

我知道我需要傳遞一個數組指針給每個函數,並想知道性能。

版本1:

#include <stdio.h> 

typedef struct char_array { 
    unsigned char uchar;     
    char   achar; 

} char_array; 

#define CA_SIZE 1000000 

char_array *ptr_array_one; 
char_array *ptr_array_two; 

main() { 
    char_array_init(ptr_array_one); 
    char_array_search(ptr_array_one); 

    char_array_init(ptr_array_two); 
    // etc. 
} 

char_array_init(struct char_array *ptr_array) { 
    static char_array ptr_array[CA_SIZE]; 

    ptr_array[0].uchar= 'a'; 
    ptr_array[5].uchar= 'b'; 

    printf("%c\n\n", ptr_array[0].uchar); 
} 

char_array_search(struct char_array *ptr_array){ 
    printf("%c\n\n", ptr_array[5].uchar); 
} 

我也試過第2版:

#include <stdio.h> 

    typedef union char_array { 
     unsigned char uchar;                 
     char  achar; 
    } char_array; 

    #define CA_SIZE 1000000 

    char_array *ptr_array_one; 

    main() { 

     ptr_array_one = char_array_init(ptr_array_one); 

    } 

    union * char_array_init(union char_array ptr_array) { 

      static char_array char_array[CA_SIZE]; 

       char_array[0].uchar= 'a'; 
       char_array[5].uchar= 'b'; 

       printf("%c\n\n", char_array[0].uchar); 
       return &char_array; 
    } 

我不能得到這個編譯任。

問題

我要尋找一個解決方案,實現這種編碼的嘗試,通過這個code

啓發我試圖動態聲明兩個或多個靜態數組,一個指針(ptr_array_one,ptr_array_two ,...)來引用它們。

char_array_init()

  • 聲明和每次調用
  • 到陣列地址放入ptr_array_one,ptr_array_two,時間初始化一個不同的數組...

char_array_search()有意訪問一個特定的數組,因此接收一個char_array結構指針作爲參數。

此代碼是我嘗試隔離尋求的功能,而不是實際的內部循環。

此代碼不能成功編譯。這是我能想到的最好的。

+3

我不明白你在問什麼,但也許這個鏈接將有所幫助:http:// stack overflow.com/questions/3965279/opaque-c-structs-how-should-they-be-declared – 2014-11-06 00:12:42

+5

這沒有任何意義。爲什麼你將一個未初始化的指針傳遞給'char_array_init()',然後聲明一個永遠不會再使用的同名靜態數組?你說的這個「內部循環」是什麼?爲什麼你的任何函數都沒有返回類型?這不再是20世紀80年代了。爲什麼要定義一個名爲'char_array'的struct,其中只有一個'unsigned char',並且沒有數組?這一切都很神祕,不可能告訴你要問什麼。 – 2014-11-06 00:14:03

+0

請注意,您從不爲'ptr_array_one'或'ptr_array_two'指定內存,因此任何嘗試使用它們都會導致未定義的行爲(通常是崩潰)。 – 2014-11-06 00:48:07

回答

1

從你的這個代碼開始(與功能reindented但其他不變):

#include <stdio.h> 

typedef union char_array { 
    unsigned char uchar;                 
    char  achar; 
} char_array; 

#define CA_SIZE 1000000 

char_array *ptr_array_one; 

main() { 

    ptr_array_one = char_array_init(ptr_array_one); 

} 

union * char_array_init(union char_array ptr_array) { 

    static char_array char_array[CA_SIZE]; 
    char_array[0].uchar= 'a'; 
    char_array[5].uchar= 'b'; 

    printf("%c\n\n", char_array[0].uchar); 
    return &char_array; 
} 

我會立刻把它寫這樣的:

#include <stdio.h> 

typedef union char_array 
{ 
    unsigned char uchar; 
    char achar; 
} char_array; 

#define CA_SIZE 1000000 

union char_array *char_array_init(union char_array **ptr_array); 

char_array *ptr_array_one; 
char_array *ptr_array_two; 

int main(void) 
{ 
    ptr_array_two = char_array_init(&ptr_array_one); 
    printf("one: %c (%p)\n", ptr_array_one->uchar, (void *)ptr_array_one); 
    printf("two: %c (%p)\n", ptr_array_two->uchar, (void *)ptr_array_two); 
    return 0; 
} 

union char_array *char_array_init(union char_array **ptr_array) 
{ 
    static char_array char_array[CA_SIZE]; 

    char_array[0].uchar = 'a'; 
    char_array[5].uchar = 'b'; 

    printf("%c\n\n", char_array[0].uchar); 
    *ptr_array = char_array; 
    return char_array; 
} 

這將編譯乾淨地使用:

gcc -g -O3 -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \ 
    -Werror tddoop.c -o tddoop 

和運行:

a 

one: a (0x104e9d040) 
two: a (0x104e9d040) 

由於兩個指針最終指向相同(巨大)的靜態數組,因此打印兩次打印相同的值對並不奇怪。

+0

這兩個指針是相同的是我放棄版本2的原因,因爲我認爲這將是預期的結果。 運行時靜態內存分配可以在gcc中完成嗎? 你的解決方案中的第二個副作用:數組是全局的,而我試圖達到某種程度的詞法範圍。 – OneArb 2014-11-06 05:09:02

+0

@OneArb:你有沒有遇到動態內存分配和'malloc()'和'free()'呢? – 2014-11-06 05:11:09

+0

數組大小在編譯時是已知的,它實際上意味着大於一兆字節。靜態似乎要走。 結構體/不透明指針鏈接 - 您在原始評論中提供的 - 實現封裝似乎是合適的解決方案。目前還不清楚爲什麼它沒有實現它。 – OneArb 2014-11-06 05:26:10

0

部分答案:

article提出了一個解決方案,封裝用C

  • 類型安全
  • 隱藏了API的用戶數據結構
  • 不需要對結構的typedef