鱼C论坛

 找回密码
 立即注册
查看: 8652|回复: 20

动态链接库

[复制链接]
发表于 2022-10-20 18:20:44 | 显示全部楼层
  1. $ ls
  2. main.c
  3. $ cat main.c
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdint.h>

  8. void and_gate(char a, char b, char *c) {
  9.     *c = a == '1' && b == '1' ? '1' : '0';
  10. }

  11. void or_gate(char a, char b, char *c) {
  12.     *c = a == '0' && b == '0' ? '0' : '1';
  13. }

  14. #if 0
  15. void xor_gate(char a, char b, char *c) {
  16.     *c = a != b ? '1' : '0';
  17. }
  18. #else
  19. void not_gate(char a, char *b) {
  20.     *b = a == '1' ? '0' : '1';
  21. }

  22. void xor_gate(char a, char b, char *c) {
  23.     char na, nb;
  24.     char r0, r1;
  25.     not_gate(a, &na);
  26.     not_gate(b, &nb);
  27.     and_gate(a, nb, &r0);
  28.     and_gate(b, na, &r1);
  29.     or_gate(r0, r1, c);
  30. }
  31. #endif

  32. void half_adder_1bit(char a, char b, char *s, char *c) {
  33.     xor_gate(a, b, s);
  34.     and_gate(a, b, c);
  35. }

  36. void full_adder_1bit(char a, char b, char ci, char *s, char *co) {
  37.     char temp_s, temp_c[2];
  38.     half_adder_1bit(a, b, &temp_s, &temp_c[0]);
  39.     half_adder_1bit(temp_s, ci, s, &temp_c[1]);
  40.     or_gate(temp_c[0], temp_c[1], co);
  41. }

  42. void full_adder_2bit(const char *a, const char *b, char ci, char *s, char *co) {
  43.     char temp_c;
  44.     full_adder_1bit(a[1], b[1], ci, &s[1], &temp_c);
  45.     full_adder_1bit(a[0], b[0], temp_c, &s[0], co);
  46. }

  47. void full_adder_4bit(const char *a, const char *b, char ci, char *s, char *co) {
  48.     char temp_c;
  49.     full_adder_2bit(&a[2], &b[2], ci, &s[2], &temp_c);
  50.     full_adder_2bit(&a[0], &b[0], temp_c, &s[0], co);
  51. }

  52. void full_adder_8bit(const char *a, const char *b, char ci, char *s, char *co) {
  53.     char temp_c;
  54.     full_adder_4bit(&a[4], &b[4], ci, &s[4], &temp_c);
  55.     full_adder_4bit(&a[0], &b[0], temp_c, &s[0], co);
  56. }

  57. void full_adder_16bit(const char *a, const char *b, char ci, char *s, char *co) {
  58.     char temp_c;
  59.     full_adder_8bit(&a[8], &b[8], ci, &s[8], &temp_c);
  60.     full_adder_8bit(&a[0], &b[0], temp_c, &s[0], co);
  61. }

  62. void full_adder_32bit(const char *a, const char *b, char ci, char *s, char *co) {
  63.     char temp_c;
  64.     full_adder_16bit(&a[16], &b[16], ci, &s[16], &temp_c);
  65.     full_adder_16bit(&a[0], &b[0], temp_c, &s[0], co);
  66. }

  67. void binary(char dest[const 32], const char *src) {
  68.     memset(dest, '0', 32);
  69.     size_t l = strlen(src);
  70.     strncpy(dest + (32 - l), src, l);
  71. }

  72. void format(char *dest, const char src[const 32]) {
  73.     const char *p = NULL;
  74.     for(size_t i = 0; i < 32; ++i) {
  75.         if(src[i] == '1') {p = &src[i]; break;}
  76.     }
  77.     if(!p) p = src + 31;
  78.     while(p != src + 32) *dest++ = *p++;
  79.     *dest = '\0';
  80. }

  81. char *add(const char *a, const char *b) {
  82.     char *a_ = malloc(32), *b_ = malloc(32);
  83.     char *c = malloc(33);
  84.     binary(a_, a); binary(b_, b);
  85.     char ci = '0', co;
  86.     full_adder_32bit(a_, b_, ci, c, &co);
  87.     //format(c, c);
  88.     c[32] = '\0';
  89.     free(a_); free(b_);
  90.     return c;
  91. }

  92. void neg(char num[const 32]) {
  93.     for(size_t i = 0; i < 32; ++i) {
  94.         xor_gate('1', num[i], &num[i]);
  95.     }
  96.     char ci = '0', co;
  97.     char one[32] = "00000000000000000000000000000001";
  98.     full_adder_32bit(num, one, ci, num, &co);
  99. }

  100. char *sub(const char *a, const char *b) {
  101.     char *a_ = malloc(32), *b_ = malloc(32);
  102.     char *c = malloc(33);
  103.     binary(a_, a); binary(b_, b);
  104.     neg(b_);
  105.     char ci = '0', co;
  106.     full_adder_32bit(a_, b_, ci, c, &co);
  107.     //format(c, c);
  108.     c[32] = '\0';
  109.     free(a_); free(b_);
  110.     return c;
  111. }

  112. uint32_t number(const char n[const 32]) {
  113.     uint32_t rv = 0;
  114.     const char *p = n;
  115.     for(uint32_t mask = 0x80000000; mask; mask >>= 1) {
  116.         if(*p++ == '1') rv |= mask;
  117.     }
  118.     return rv;
  119. }

  120. int main(void) {
  121.     char a[33];
  122.     char b[33];
  123.     scanf("%32s", a);
  124.     scanf("%32s", b);
  125.     char *c0 = add(a, b);
  126.     puts(c0);
  127.     uint32_t cu0 = number(c0);
  128.     printf("%u\n", cu0);
  129.     if((int32_t)cu0 > 1) printf("大于1\n");
  130.     free(c0);
  131.     char *c1 = sub(a, b);
  132.     puts(c1);
  133.     uint32_t cu1 = number(c1);
  134.     printf("%d\n", (int32_t)cu1);
  135.     if((int32_t)cu1 < -1) printf("小于-1\n");
  136.     free(c1);
  137.     return 0;
  138. }
  139. $ gcc -g -Wall -shared -o main.dll main.c
  140. $ ls
  141. main.c  main.dll
  142. $ file main.dll
  143. main.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
  144. $ python
  145. Python 3.8.12 (default, Nov 23 2021, 20:18:25)
  146. [GCC 11.2.0] on cygwin
  147. Type "help", "copyright", "credits" or "license" for more information.
  148. >>> import ctypes
  149. >>> dll = ctypes.cdll.LoadLibrary('main.dll')
  150. >>> dll
  151. <CDLL 'main.dll', handle 509660000 at 0x6fffffec79d0>
  152. >>> dll.main()
  153. 10110110
  154. 1001
  155. 00000000000000000000000010111111
  156. 191
  157. 大于1
  158. 00000000000000000000000010101101
  159. 173
  160. 0
  161. >>> dll.add(b'10011100', b'100101')
  162. 1633360
  163. >>> dll.add.restype = ctypes.c_char_p
  164. >>> dll.add(b'10011100', b'100101')
  165. b'00000000000000000000000011000001'
  166. >>>
  167. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-20 18:24:42 | 显示全部楼层
学会百度,百度上面啥都有
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-21 09:12:28 | 显示全部楼层
2wsx 发表于 2022-10-21 08:41
大佬你这个代码怎么用啊,我没看懂

代码都给你贴出来了,使用的指令也给你贴出来了
你哪里看不懂?
你得有基础才能玩这些东西呀


上面那个C代码是一个32位的全加器
用add函数包装了一下,让这个全加器更方便使用
上面的例子首先把这个C代码编译成dll
然后在python中调用
调用了C代码中的main函数和add函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-2 02:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表