• 关于

    c语言 "

    的搜索结果

问题

国产编程语言"木兰"被质疑换皮,当事人为夸大行为致歉

游客pklijor6gytpx 2020-01-19 13:53:48 734 浏览量 回答数 1

问题

C语言执行popen("help","r")在Fedora和Ubuntu下的区别?报错

爱吃鱼的程序员 2020-06-07 16:33:53 0 浏览量 回答数 1

问题

c语言指针问题 char *p="abcdefg"+1; 为?报错

爱吃鱼的程序员 2020-06-24 14:05:33 0 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

这也是一个当你面临从Python 2 到 Python 3扩展代码的问题。 虽然Python提供了一个广泛的编程API,实际上有很多方法来处理C的代码。 相比试图给出对于每一个可能的工具或技术的详细参考, 我么采用的是是集中在一个小片段的C++代码,以及一些有代表性的例子来展示如何与代码交互。 这个目标是提供一系列的编程模板,有经验的程序员可以扩展自己的使用。 这里是我们将在大部分秘籍中工作的代码: /* sample.c */_method #include <math.h> /* Compute the greatest common divisor */ int gcd(int x, int y) { int g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; } /* Test if (x0,y0) is in the Mandelbrot set or not */ int in_mandel(double x0, double y0, int n) { double x=0,y=0,xtemp; while (n > 0) { xtemp = x*x - y*y + x0; y = 2*x*y + y0; x = xtemp; n -= 1; if (x*x + y*y > 4) return 0; } return 1; } /* Divide two numbers */ int divide(int a, int b, int *remainder) { int quot = a / b; *remainder = a % b; return quot; } /* Average values in an array */ double avg(double *a, int n) { int i; double total = 0.0; for (i = 0; i < n; i++) { total += a[i]; } return total / n; } /* A C data structure */ typedef struct Point { double x,y; } Point; /* Function involving a C data structure */ double distance(Point *p1, Point *p2) { return hypot(p1->x - p2->x, p1->y - p2->y); } 这段代码包含了多种不同的C语言编程特性。 首先,这里有很多函数比如 gcd() 和 is_mandel() 。 divide() 函数是一个返回多个值的C函数例子,其中有一个是通过指针参数的方式。 avg() 函数通过一个C数组执行数据聚集操作。Point 和 distance() 函数涉及到了C结构体。 对于接下来的所有小节,先假定上面的代码已经被写入了一个名叫“sample.c”的文件中, 然后它们的定义被写入一个名叫“sample.h”的头文件中, 并且被编译为一个库叫“libsample”,能被链接到其他C语言代码中。 编译和链接的细节依据系统的不同而不同,但是这个不是我们关注的。

景凌凯 2020-04-19 20:55:36 0 浏览量 回答数 0

回答

使用Cython构建一个扩展模块看上去很手写扩展有些类似, 因为你需要创建很多包装函数。不过,跟前面不同的是,你不需要在C语言中做这些——代码看上去更像是Python。 作为准备,假设本章介绍部分的示例代码已经被编译到某个叫 libsample 的C函数库中了。 首先创建一个名叫 csample.pxd 的文件,如下所示: # csample.pxd # # Declarations of "external" C functions and structures cdef extern from "sample.h": int gcd(int, int) bint in_mandel(double, double, int) int divide(int, int, int *) double avg(double *, int) nogil ctypedef struct Point: double x double y double distance(Point *, Point *) 这个文件在Cython中的作用就跟C的头文件一样。 初始声明 cdef extern from "sample.h" 指定了所学的C头文件。 接下来的声明都是来自于那个头文件。文件名是 csample.pxd ,而不是 sample.pxd ——这点很重要。 下一步,创建一个名为 sample.pyx 的问题。 该文件会定义包装器,用来桥接Python解释器到 csample.pxd 中声明的C代码。 # sample.pyx # Import the low-level C declarations cimport csample # Import some functionality from Python and the C stdlib from cpython.pycapsule cimport * from libc.stdlib cimport malloc, free # Wrappers def gcd(unsigned int x, unsigned int y): return csample.gcd(x, y) def in_mandel(x, y, unsigned int n): return csample.in_mandel(x, y, n) def divide(x, y): cdef int rem quot = csample.divide(x, y, &rem) return quot, rem def avg(double[:] a): cdef: int sz double result sz = a.size with nogil: result = csample.avg(<double *> &a[0], sz) return result # Destructor for cleaning up Point objects cdef del_Point(object obj): pt = <csample.Point *> PyCapsule_GetPointer(obj,"Point") free(<void *> pt) # Create a Point object and return as a capsule def Point(double x,double y): cdef csample.Point *p p = <csample.Point *> malloc(sizeof(csample.Point)) if p == NULL: raise MemoryError("No memory to make a Point") p.x = x p.y = y return PyCapsule_New(<void *>p,"Point",<PyCapsule_Destructor>del_Point) def distance(p1, p2): pt1 = <csample.Point *> PyCapsule_GetPointer(p1,"Point") pt2 = <csample.Point *> PyCapsule_GetPointer(p2,"Point") return csample.distance(pt1,pt2) 该文件更多的细节部分会在讨论部分详细展开。 最后,为了构建扩展模块,像下面这样创建一个 setup.py 文件: from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [ Extension('sample', ['sample.pyx'], libraries=['sample'], library_dirs=['.'])] setup( name = 'Sample extension module', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules ) 要构建我们测试的目标模块,像下面这样做: bash % python3 setup.py build_ext --inplace running build_ext cythoning sample.pyx to sample.c building 'sample' extension gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/include/python3.3m -c sample.c -o build/temp.macosx-10.6-x86_64-3.3/sample.o gcc -bundle -undefined dynamic_lookup build/temp.macosx-10.6-x86_64-3.3/sample.o -L. -lsample -o sample.so bash % 如果一切顺利的话,你应该有了一个扩展模块 sample.so ,可在下面例子中使用: >>> import sample >>> sample.gcd(42,10) 2 >>> sample.in_mandel(1,1,400) False >>> sample.in_mandel(0,0,400) True >>> sample.divide(42,10) (4, 2) >>> import array >>> a = array.array('d',[1,2,3]) >>> sample.avg(a) 2.0 >>> p1 = sample.Point(2,3) >>> p2 = sample.Point(4,5) >>> p1 <capsule object "Point" at 0x1005d1e70> >>> p2 <capsule object "Point" at 0x1005d1ea0> >>> sample.distance(p1,p2) 2.8284271247461903 >>>

哦哦喔 2020-04-17 18:14:00 0 浏览量 回答数 0

问题

printf("\033[7m more? \033[m");在Linux上输出反白的more?

a123456678 2019-12-01 19:53:10 2036 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板