C 函数中的全局变量和返回多个可变长度数组(指针)

2023-12-12

我有一些编程经验,但 C 语言不多。

我有一个相当大的 C 文件。其中有多个按顺序执行的函数 - 因此在这种特殊情况下,实际上没有函数被调用两次,为了便于阅读,它们被分解,因为每个函数仍然有单独的目的。

该程序对几个可变长度的 double 长数组进行了大量计算,因此它们都是指针。两个问题:

1)从一开始就计算一次然后作为许多后续函数的输入的变量 - 我应该将它们设置为该文件中的全局变量吗?根据我使用高级语言编程的经验,全局变量不好。 C 不是这样吗?为什么?

2)当我的函数1想要返回多个指针(例如,每个指针都指向长度为n的双精度数组)时,例如相关的double *p1,double *p2,double *p3,我可以将它们组合成一个结构:

struct pointers {
    double *p1, *p2, *p3;
} ptr;

foo1 将以 double *input 作为输入,并计算 ptr->p1、ptr->p2、ptr->p3,然后 ptr 将作为 foo2 的输入。我应该写吗

struct pointers *foo(double *input)

or

void foo1(double *input, struct pointers ptr)

or

void foo1(double *input, struct pointers *ptr)

为什么 C 函数通常是“void”函数,除非它只返回 int 或 double 变量?将输入和输出都作为参数 - 是否令人困惑?

我应该在 foo1 内部还是外部初始化 ptr->p1、ptr->p2、ptr->p3 ?

请注意,foo() 是主函数,它将依次调用 foo1、foo2。


回答问题

1)这实际上取决于size and scope您的数据。如果您的函数内有少量要用作计算的一部分,则在函数内对其进行初始化更有意义,从而将其范围限制在函数内。

如果数据大小只有几兆字节甚至超过几十千字节,那么使用 malloc 在堆上分配是有意义的。

您可以在文件中包含全局变量,但是您必须担心同步对它们的访问 - 谁正在修改它们以及按什么顺序修改它们 -

要回答问题 2),编写函数签名的更好方法是

struct  {
    double output1; 
    double output2; 
    double output3;
 } output_t;

函数签名为:

ReturnCode foo ( double input , struct output_t * output);  

其中 ReturnCode 可以是 int 值,指示操作是成功还是失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 函数中的全局变量和返回多个可变长度数组(指针) 的相关文章

随机推荐

  • exec() 通过命令行运行,但不通过网络运行

    我有一个 PHP 脚本涉及exec 它可以在命令行中正常运行 但不能在网络环境中运行 脚本很简单
  • 如果某个字段结果大于或等于另一个字段,我可以更改 背景吗?

    我正在 html 表中显示 mySQL 我想将 qty 的 TD 背景颜色更改为红色IF qty gt max or qty lt min 有没有一种简单的方法可以使用 jQuery 或 PHP 来做到这一点 我为示例简化了表格和 PHP
  • 错开或阶梯菜单

    我有一个菜单 是根据通常的无序列表创建的 我想使用 CSS 对其进行水平样式设置 以便每个菜单条目都略低于前一个条目 结果将是阶梯效应 Home News About Contact 上面的示例显示了每个菜单条目的全行位移 但我真正想要的是
  • 无符号右移函数不适用于负输入

    我正在寻找一种使用方法 gt gt gt 64 位版本 PHP 5 5 14 中 JavaScript 的函数 我发现这个功能在我的谷歌搜索中 function uRShift a b z hexdec 80000000 if z a a
  • jQuery .attr('value') 返回文本区域未定义

    我有一个页面 它通过 ajax 动态引入表单并将其显示在模态 div 中 位于覆盖整个页面的覆盖 div 之上 这是为了让他们在窗口关闭之前保存某些数据 除了一件事之外 一切都很好 save close form find name eac
  • 如何防止 iOS 14 Widget 打开应用程序并对回调做出反应

    因此 我已经阅读了几篇博客 帖子和苹果自己的人机界面指南 指出 iOS 14 小部件不是交互式的 但是 按下目标时可以传递到应用程序的短链接 苹果公司自己表示 小型小部件有一个单一的点击目标 中型和大型小部件有多个点击目标 好的 现在 当您
  • Java中如何获取当前时刻的年、月、日、时、分、秒、毫秒?

    如何在Java中获取当前时刻的年 月 日 时 分 秒和毫秒 我想让他们成为Strings 您可以使用以下的吸气剂java time LocalDateTime为了那个原因 LocalDateTime now LocalDateTime no
  • 获取 URL 的 Facebook 分享/点赞/评论计数

    今天之前 我使用以下 URL 来获取某个 URL 的 Facebook 分享 点赞 评论计数 https api facebook com method links getStats format json urls http stacko
  • Python——加速导入?

    我有 10000 个自定义 编译为 so 模块 我想在其中使用python 模块的使用是有后果的 模块是一个接一个地使用的 而不是同时使用的 通常 代码看起来像这样 list with all the paths to all module
  • load() 顺序执行,而不是与 jQuery 同时执行

    我正在开发一个网站 我想从导航栏中获取所有链接 并将链接页面中的 div 加载到一个大容器中 到目前为止我所拥有的是以下内容 nav a each function index var to load this attr href slid
  • 不要在循环内创建函数。 - jslint 错误

    我收到此 jslint 错误 不要在循环内创建函数 我无法更改导致此问题的 javascript 但是由于修改它的限制 我无法更改 因此 我想关闭此验证以检查特定 javascript 文件中是否存在此错误 对于这个js错误可以这样做吗 不
  • 如何重现特定的友好URL?

    我们正在尝试将 JSP XSLT 应用程序重构为 JSF 我们使用 CMS 进行内容管理 技术 使用 Mojarra PrimeFaces 2 2 1 和 Tomcat 6 29 的 JSF 2 0 数据结构的组织如下 有网站 站点包含频道
  • Node.js 中的延迟加载

    我想知道是否使用require 在node js中相当于延迟加载 例如 如果我有一个函数需要特定的 node js 包 而我的代码中其他任何地方都不需要这个包 那么我最好使用require 仅在调用该函数时才包含所需的包 由于我对 Node
  • Laravel 5.3 身份验证后重定向的自定义路径

    我有两种类型的用户 供应商 和 客户 我目前正在使用Laravel s built in Auth Controllers 来自make auth命令 来进行我的客户端用户身份验证 由于我有两种用户 所以我改变了 redirectTo财产在
  • Flutter post api发送具有相同名称参数的多个值

    如何在flutter中的post api中使用相同名称参数发送多个数据 在php中 我们使用parameter 然后我们可以发送多个数据 但我对flutter很陌生 所以我想知道它是如何完成的 谢谢 示例图片 https i stack i
  • 删除 gtk.button 的边框

    我想删除 gtk button 的边框 但我不知道该怎么做 我尝试过 button gtk Button button set style inner border 0 但我有一个错误 该属性不存在 我也尝试创建一个新的 gtk Style
  • 捕获 SYCL 异常:错误:[ComputeCpp:RT0101] 无法创建内核((内核名称:SYCL_class_multiply))

    我克隆了https github com codeplaysoftware computecpp sdk git并修改了computecpp sdk samples accessors accessors cpp file 我刚刚添加了st
  • 如何将android触摸坐标转换为OpenCV图像坐标?

    我正在尝试做类似的事情 但在 Android 上 http docs opencv org doc tutorials imgproc imgtrans warp affine warp affine html我有一个绘制到 ImageVi
  • HTML 5 文件系统访问类型错误

    我正在开发一个网络应用程序 并尝试使用文件系统 API 访问目录 在根据规范访问目录之前 我需要向用户请求配额 我应该做这样的事情 navigator webkitPersistentStorage requestQuota PERSIST
  • C 函数中的全局变量和返回多个可变长度数组(指针)

    我有一些编程经验 但 C 语言不多 我有一个相当大的 C 文件 其中有多个按顺序执行的函数 因此在这种特殊情况下 实际上没有函数被调用两次 为了便于阅读 它们被分解 因为每个函数仍然有单独的目的 该程序对几个可变长度的 double 长数组