精华内容
下载资源
问答
  • C程序调用python程序

    千次阅读 2018-05-21 16:29:44
    由于要用到python下的算法库,因此学习了在c程序中如何调用python程序。由于后台的环境用到了多线程,因此需要考虑多线程环境下的c调用python。在多线程环境下调用python库,需要按照如下步骤:在主线程中:1、初始...

    最近跟同学一起做后台的项目,用的c语言。由于要用到python下的算法库,因此学习了在c程序中如何调用python程序。

    由于后台的环境用到了多线程,因此需要考虑多线程环境下的c调用python。

    在多线程环境下调用python库,需要按照如下步骤:

    在主线程中:

    1、初始化python,允许支持多线程。

    2、python扩展初始化

    3、释放线程全局锁

    在子线程中:

    4、设置GIL(python特有的全局解释锁)的状态,确保为当前线程控制GIL

    5、调用ython代码

    6、释放GIL,将GIL的控制权交还给系统

    功能描述:我们需要在c代码中调用python函数,并且,要将c的参数传到python中,并解析python的返回值存入c的变量中。

    示例:

    #include<Python.h>

    PyObject * pFunc = NULL;    //全局变量,可使process.c文件访问该变量

    int pythonInit()    //自定义python初始化,包括python初始化以及相关模块参数的导入。
    {
    Py_Initialize();    //python初始化,库函数
    if (!Py_IsInitialized())
    {

        printf("Python init failed!\n");

                PyErr_Print();//打印错误信息,库函数

        return -1;
    }

    PyObject *pDict = NULL;           //python模块字典
    PyObject *pModule = NULL;    //python模块


    PyRun_SimpleString("import sys");    //调用python代码
    PyRun_SimpleString("sys.path.append('./')");    //将当前目录添加到python路径


            //导入模块,模块名为query_python。在query_python.py文件中。

    pModule = PyImport_Import(PyString_FromString("query_python"));    

    if(!pModule)
    {
    printf("Load query_python.py failed!\n");
    PyErr_Print();
    return -1;
    }
    pDict = PyModule_GetDict(pModule);    //调用库函数获取模块字典,模块字典包含该模块下的所有函数
            if(!pDict)
    {
    printf("Can't find dict in query_python!\n");
                    PyErr_Print();
    return -1;
    }

           pFunc = PyDict_GetItemString(pDict, "query_k");//获取模块字典中query_k函数

           if(!pFunc || !PyCallable_Check(pFunc))    //检查函数的有效性
           {
               printf("Can't find function!\n");
               PyErr_Print();
               return -1;
           }
           if(pModule)    //释放模块申请的内存
    {
    Py_DECREF(pModule);
    }
    if(pDict)     //释放模块字典申请的内存
    {
    Py_DECREF(pDict);
    }
    return 0;

    }

    //主调函数

    void serverStart()

    {

            PyEval_InitThreads();//初始化多线程,使python支持多线程

            int res;

    res = pythonInit(); //python扩展初始化

            if(res==-1)
    {
    PyErr_Print();
    return;

    }

            //开启多线程之前,必须先释放锁,才能获得线程全局锁
             PyEval_ReleaseLock();

            ... //此处开启了多线程

            process();//process函数会调用process.c中的get_query_result函数

            PyGILState_Ensure();    //主线程结束,释放GIL
    Py_Finalize();                //对应于python初始化的释放

    }


    process.c:

    extern PyObject *pFunc;    //获取另一个文件中的全局变量

    ///下面的函数功能是获取query_python.py文件中的query_k函数的返回值,并传给c程序的query_res指向的内存。

    int get_query_result(const char *buf, const char *query, int k, char *query_res)
    {
        PyGILState_STATE gstate = PyGILState_Ensure();//确保当前线程获得GIL的控制权

        if (!PyCallable_Check(pFunc))
        {
            PyErr_Print();
            return -1;
        }

        PyObject *pArgs = NULL;     //传给PyObject_Call函数的第二个参数
        PyObject *pkwargs = NULL; //传给PyObject_Call函数的第三个参数

        pArgs = PyTuple_New(3);    //函数参数以元组形式传入,参数个数为3

        PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", query));    //传给python的参数,s代表字符串,i代表整数
        PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", buf));
        PyTuple_SetItem(pArgs, 2, Py_BuildValue("i", k));

        PyObject *pyValue = PyObject_Call(pFunc, pArgs, pkwargs);//传入pFunc指向的函数,参数。返回值存入pyValue中。

        if (pyValue == NULL)
        {
            printf("PyObject_CallObject error!\n");
            PyErr_Print();
            PyGILState_Release(gstate);    //返回值为NULL,需要释放GIL
            return -1;
        }
        char *ret_str;    //无需申请内存
        int len;

        PyArg_ParseTuple(pyValue, "si", &ret_str, &len);    //解析返回值,将返回值存入ret_str字符数组和len变量中。
        strncpy(query_res, ret_str, len);    //执行字符串拷贝。
        if(pArgs)
        {
            Py_DECREF(pArgs);    //释放参数内存
        }
        if(pkwargs)                    //释放参数内存
        {
            Py_XDECREF(pkwargs);
        }
        PyGILState_Release(gstate);    //释放GIL
        return 0;

    }

    总结:

    第一次学习c调用python,查阅了大量资料,花了不少时间,收获还是不少。

    调试过程中遇到了很多问题,暴露了c语言的一些不足,同时,尽管python学了一段时间了,但对pyhton的GIL理解不深。


    展开全文
  • linux下编译C程序执行C程序 printf没有输出


    #gcc test.c -o test

    #./test

    linux环境下对c语言程序编译后执行该程序要在命令行中加./

    用 ./ 强制执行当前目录下的程序就是避免系统环境变量指定路径中已经存在的同名程序[假设指定目录下没有查到才执行当前目录下的程序]

    vi ~/.bash_profile
    修改PATH行,把[新的指定路径]添加

    这一点需要参考编译时是否用到系统相关环境变量


    展开全文
  • VC++编写C程序

    千次阅读 2018-10-12 22:39:41
    VC++ 6.0编写C程序 1. 打开程序 2.新建C源程序 点击“文件”菜单,选择“新建”子菜单 选择“文件”标签,选中文件类型如下图: 注意三个问题:一是选择C++ Source File;二是确定目录;三是输入文件名。点击确定...

    VC++ 6.0编写C程序

    1. 打开程序

    2.新建C源程序

    点击“文件”菜单,选择“新建”子菜单
    在这里插入图片描述
    选择“文件”标签,选中文件类型如下图:
    在这里插入图片描述
    注意三个问题:一是选择C++ Source File;二是确定目录;三是输入文件名。点击确定。

    3.编辑C源程序

    编写程序如下:
    题目:求两个整数的和并输出。
    1)程序,写给计算机,用来执行
    2)注释,写给人,增加程序易读性
    (a)段注释 /开始,/结束,中间无论多少行,全为注释
    (b)行注释 //开始,后面的本行内容为注释

    4.编译并执行C程序

    1)编译 Compile源程序,生成obj目标文件
    点击工具栏,Compile(Ctrl+F7)工具,在这里插入图片描述(第一个)
    在这里插入图片描述
    弹出对话框,询问是否建立工程,选择“是”。又弹出对话框询问是否保存,点击“是”,最后编译并生成01-01.obj目标文件。下方提示是否有错误和警告。
    在这里插入图片描述
    注意:如果出现错误,Error不为0,需要排查错误。可以滚动“编译”信息提示栏右侧滚动条,查看提示。双击error提示行,会定位到源程序相关内容中。

    在这里插入图片描述
    修改错误,需要读上下文,做出合适的修改。例如本题目中,在上方添加y的定义。

    2、建立 Build
    点击工具栏,Build(F7)按钮,在这里插入图片描述(第二个)
    在这里插入图片描述
    生成01-01.exe文件。并提醒有Error个数和警告个数。
    3、执行程序
    点击工具栏,BuildExecute(Ctrl+F5)按钮,在这里插入图片描述(第四个)
    在这里插入图片描述

    展开全文
  • Eclipse运行C程序

    万次阅读 2017-10-14 21:59:26
    这篇文章是关于Eclipse中书写C程序代码的文章.

    一、安装Eclipse

    下载地址:

    http://www.eclipse.org/downloads/packages/release/Oxygen/R

    解压运行exe文件即可。


    二、下载MinGW编译器

    下载地址:

    https://sourceforge.net/projects/mingw/files/latest/download?source=files

         1、双击运行exe文件,选择要下载到电脑的地方,等待一段时间;

    2、开始安装,右击一个个选择mark for installation

    3、选择installation下的apply changes,然后等待安装即可,需要一段时间;

    4、安装好之后,需要配置MinGW;

    我的电脑->属性->高级系统设置->环境变量->Path中:添加你安装目录下的bin文件夹

    (如果没有表格显示,则要在后面加上分号,然后写入你的文件夹下面的bin目录)

    测试:进入DOS目录,输入gcc;

    出现上面的显示表示安装成功.

    可以书写一个helloworld.c文件,然后进行编译gcc helloworld.c -o helloworld,将会生成一个helloworld.exe文件,dos输入helloworld将会打印出helloworld.c中编写的内容。


    三、安装CDT插件

     1、进入http://www.eclipse.org/cdt/downloads.php 。选择和自己安装的 Eclipse 匹配的 CDT 插件版本,这里以Oxygen版本为例,

    将下面的连接,复制粘贴到Eclipse->help->Install New SoftWare...,键盘敲击Enter,然后勾选全部选项,点击Next进行插件下载即可。


    2、点击右上角的小图标,出现C/C++视图表示插件安装成功.



    四、运行C程序

    步骤一:创建一个C项目

    步骤二:这里其实选择VC++和下面的MinGW GCC均可

    步骤三:

    单击工程名,右键新建SourceFile添加一个C语言文件,编写一个简单的HelloWorld程序。

    步骤四:右击项目,选择Build Project

    步骤五:右击项目,选择Run as->Local C/C++ Application(其实右击文件,选择Run as->Local C/C++ Application也可以运行单个文件)

    运行结果:


    注:比较遗憾的是Eclipse中书写C/C++代码只有.、->、::的提示,并没有字母的提示,提示功能并没有VS那么强大。


    展开全文
  • VScode中编写运行C程序

    千次阅读 2020-05-31 17:15:51
    VScode运行C程序的所需配置 VScode只是一个编辑器,并不自带C编译器,所以需要 下载mingw 下载安装版本或者压缩文件,解压缩后,配置系统的环境变量。 path中添加mingw/bin的路径 新建include变量,添加mingw/...
  • matlab 调用C程序进行simulink仿真

    千次阅读 2020-02-06 10:52:59
    文章目录simulink仿真创建C程序编译C程序运行结果 simulink仿真 simulink仿真中需要使用S-Function模块,可以实现调用C程序进行仿真,下面先建立一个简单的仿真; 具体如下图所示; 创建C程序 需要在S-Function模块...
  • 如何在linux下编译运行c程序

    万次阅读 多人点赞 2018-10-17 18:32:58
    1.在终端下打开一个编辑器(我用的gedit),建立一个hello.c文件并保存, 2.关闭编辑器,在终端上输入 gcc -o hello hello.c编译c程序 3.输入./hello运行c程序
  • 运行C程序的步骤

    千次阅读 2017-03-24 13:09:18
    提纲:这篇文章介绍了一个编辑好的C程序是如何在集成开发环境中运行的,其中简介了编译、链接、执行等步骤一、背景知识 C语言编写的程序是源程序,计算机不能直接识别和执行高级语言所写的指令,必须用编译器把C源...
  • Code Blocks编写一个C程序

    千次阅读 2018-10-09 21:59:47
    Code Blocks编写一个C程序Code Blocks编写一个C程序1. 下载Code Blocks2. 解压缩文件3. 执行Code Blocks程序4. 新建C程序5. 编写C程序6. 编译源程序7. 执行程序 Code Blocks编写一个C程序 Code Blocks兼容性好,可...
  • C程序设计第五版 谭浩强 清华大学出版社 课后答案 习题解析 微信扫描小程序二维码查看答案 第一章 程序设计和C语言 第二章 算法—程序的灵魂 第三章 最简单的C程序设计—顺序程序设计 第四章 选择结构程序设计 第...
  • 如何使用Visual Studio 2019创建C程序

    万次阅读 2019-04-21 17:48:00
    那么如何利用VS创建C程序并编译运行呢?VS那么强大,自然是很容易的。 第一步:创建C++程序,空项目类型。 第二步:源文件,添加新项,修改后缀为.c 第三步:编写代码,编译执行。 源文件,添加新项 ...
  • 用Mac终端编写、编译C程序

    万次阅读 2017-12-19 10:24:24
    步骤:创建C文件、用Vim编写C程序、编译C程序文件、执行编译后生成的.out文件。 $:touch Hello.c //创建一个Hello.c文件(本目录下) $:vim Hello.c //用vim编辑Hello.c文件 输入 i //打开vi...
  • vscode调试嵌入式c程序

    千次阅读 2018-07-02 14:28:05
    在ubuntu上用过vscode之后,就觉得用vscode调嵌入式c程序应该不错,花了一些时间尝试了一下,果真不是很复杂。 原理上主要使用了gdb的远程调试,远程gdb调试时,使用了gdb的mi(machine interface)接口,...
  • 在android的设计中,谷歌设计了一套专门为嵌入式设备使用的bionic C库,以替换原有的GUN Libc,这个精简的bionic库据说只有200多K,所以如果只想使用这个精简的C库像在linux下一样 开发C程序,基本是不可能的。...
  • 第3章 最简单的C程序设计-顺序程序设计例3.1 顺序程序设计举例例3.2 计算存款利息。有1000元,想存一年。有3种方法可选:(1)活期,年利润为r1;(2)一年期定期,年利润为r2;(3)存两半年定期,年利率为r3。请...
  • C语言入门(一):初识C程序

    千次阅读 多人点赞 2019-04-29 09:57:42
    C语言入门(一):初始C程序 网址:C语言入门 1-2 C程序结构 简单来说,一个C程序就是由若干头文件和函数组成。 #include <stdio.h> // 包含头文件,预处理 int main() // 在最新的C标准中,main函数前的...
  • 编译一个最简单的C程序

    千次阅读 2017-03-01 12:07:09
    编译一个最简单的C程序创建一个目录cstudy, 创建文件 hello.c:/** * hello.c */ #include int main () { printf("Hello C\n"); return 0; } $ cd cstudy1 二阶段编译:1) 源文件(hello.c)编译(-c)成目标文件...
  • 编写一个简单的C程序

    千次阅读 2018-12-15 23:24:48
     其实与其他语言编写的程序相比,C程序较少要求“形式化的东西”,一个完整的c程序可以只有几行代码,下面写一个最简单的代码打印Hello World。如果刚开始不会用虚拟机的话,自己看我的上一篇博客,然后安装好环境...
  • C程序设计 (第三版) 谭浩强 习题1.6 个人设计习题 1.6 编写一个C程序,输入a, b, c 3个值,输出其中最大者。代码块方法1:#include <stdio.h>main() { int a, b, c; scanf("%d %d %d", &a, &b, &c); if (a > ...
  • C程序设计 第五版 第5章课后习题答案

    万次阅读 多人点赞 2019-05-18 20:51:25
    第3章 最简单的C程序设计——顺序程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 利用数组处理批量数据 第7章 用函数实现模块化程序设计 第8章 善于利用指针 第9章 用户自己建立数据类型 第10...
  • c程序设计:编写一个程序,输入一个大写字母,输出其小写字母 #include <stdio.h> int main() { char c1,c2; //c1为大写字母,ASCII:65;c2为小写字母,ASCII:97 printf("please enter a capital letter:"); ...
  • linux下c程序调试

    千次阅读 2013-12-29 22:29:20
    使用GCC编译器对c程序进行编译。 先用vim写一个简单的c程序 命名为a.c(此次的后缀名如果不是.c的话还需要另一个处理参数,后边会说) 打开终端进入a.c所在目录 1. 首先将代码编译成可执行的文件: gcc a.c 2. ...
  • 用matlab调用c程序 带实例

    千次阅读 2017-12-18 15:23:45
    自用打包分享大家,正在学习的可以下载参考看看下载地址:...第一步:要先在matlab中安装c程序编译器,步骤如下: 键入命令:mex -setup; 选择c/c++编译器; 选择c/c++编译器版本; 确认。 第二步:键入:mex *.c
  • C程序崩溃的常见原因

    千次阅读 2017-08-07 21:42:58
    写完的C程序在运行时,若弹出系统的异常提示框,则显示程序崩掉了,常见的原因有如下2点: 1)内存越界 具体的代码形式可为数组下标越界和指针移动越界,在操作一个数组或是指针之前,要明确其边界范围,不应访问...
  • 据说有统计数据表明,代码的缺陷率是一定的,与所使用的语言无关。Linux提供了很多的实用工具和脚本,在程序中调用工具和脚本,无疑可以简化程序,从而降低代码的缺陷数目...那么在 Linux 编程中,C 程序如何调用 shel
  • c程序运行原理简介

    千次阅读 2013-12-29 13:25:10
    本文从一个最简单C程序(hello)是如何被编译和链接讲起,描述了一个程序运行的原理。 一、程序运行之前 使用IDE(集成开发环境)的朋友们经常会有这样的疑问:代码是怎么从一个文本文件变成可执行程序的呢?代码...
  • 之前都是在编译器运行的,刚开始学c时老师讲了怎么在cmd运行c程序,当时没听懂,最近学了linux对c语言下运行c程序,对于c语言的编译运行过程有了更深的了解,所以尝试了windows cmd下运行c程序,其实原理都是一样的...
  • [C编译器]在VS中编译调试C程序

    千次阅读 2015-04-27 20:33:01
    在VS中编译调试C程序
  • 到底该如何看待谭浩强的“C程序设计”

    万次阅读 多人点赞 2016-01-15 06:10:55
    谭浩强老师的《C程序设计》据说已经累计发行超过1000万册,然而网上的批评和质疑之声却似乎跟这个销量数字很不相称。到底该如何看待谭浩强的“C程序设计”,我想表表我的看法,也欢迎各位网友参与讨论
  • windows环境下C程序生成可执行文件

    千次阅读 2019-07-05 15:22:24
    windows环境下,编写C程序,生成.exe,用于操作某个文件。 1、搭建程序编写和编译环境 在windows下安装Git Bash(下载页面)。 安装完成后,可以在windows的任意文件夹下,空白处点击右键,选择“Git Bash here”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431,314
精华内容 172,525
关键字:

c程序