2014-11-05 75 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