小编Sza*_*lcs的帖子

将函数转换为 void 返回类型后调用该函数是否安全?

我有一个返回值的函数。将其转换为不返回任何内容 ( void) 的函数指针类型然后调用它是否安全?C 标准是否提供了足够的保证,使其在任何平台上都是安全的,并且相当于正常调用该函数而忽略返回值?

额外问题:是否存在在某些平台上实际使用的符合标准的调用约定,但这样做并不安全?


示例代码:

#include <stdio.h>

// simple function with a a side-effect;
// it is useful to call even when ignoring the return value
int f(int x) {
    return printf("%d\n", x);
}

typedef void (*fun_t)(int);

int main() {
    fun_t g = &f; // cast to void return type, issues a warning
    g(123);       // <-- is this safe, and equivalent to calling f(123) instead?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 这个问题只涉及在转换过程中更改返回类型,而不是更改任何函数参数的类型。
  • 我知道这在我使用的 x86 和 x64 平台上是安全的(假设默认调用约定),但我想知道它通常是否安全。
  • 我知道在必要时通过编写包装器可以很容易地解决这个问题void …

c standards casting calling-convention

3
推荐指数
1
解决办法
95
查看次数

从C访问MATLAB的unicode字符串

如何通过MATLAB Engine或MEX C接口访问MATLAB字符串的基础unicode数据?

这是一个例子.我们将unicode字符放在UTF-8编码文件test.txt中,然后将其读作

fid=fopen('test.txt','r','l','UTF-8');
s=fscanf(fid, '%s')
Run Code Online (Sandbox Code Playgroud)

在MATLAB中.

现在,如果我第一次feature('DefaultCharacterSet', 'UTF-8'),然后从C engEvalString(ep, "s"),然后作为输出我从文件返回UTF-8的文本.这证明MATLAB在内部将其存储为unicode.但是,如果我这样做mxArrayToString(engGetVariable(ep, "s")),我得到的东西unicode2native(s, 'Latin-1')将在MATLAB中给我:所有非拉丁字符1字符替换为字符代码26.我需要的是以任何unicode格式(UTF-8)访问基础unicode数据作为C字符串,UTF-16等),并保留非Latin-1字符.这可能吗?

我的平台是OS X,MATLAB R2012b.

附录:文档明确声明"[mxArrayToString()]支持多字节编码字符",但它仍然只给出了原始数据的Latin-1近似值.

unicode matlab encoding mex matlab-engine

2
推荐指数
1
解决办法
1739
查看次数

是否可以"包装"R函数来修改其功能?

是否可以包装R函数来修改其功能?

这是一个解释我的意思的玩具示例.考虑这个功能sum2:

 sum2 <- function (x) if (length(x) == 1) { cat(x); sum(x) } else sum(x)
Run Code Online (Sandbox Code Playgroud)

sum通过微小的修改,它做了什么.假设我想重新定义sum自己sum2这里做的事情.我怎么能以一般的方式做到这一点,却不知道我正在包装的函数的内部结构?

我想这样做暂时"修复"一个包函数,而不必修改和重新安装包.我想检查它的输入并返回一个特殊值,以防输入满足某些条件.

(对于那些对Mathematica非常熟悉的人,我正在寻找类似于Gayley-Villegas技巧的东西.)

r metaprogramming

2
推荐指数
1
解决办法
108
查看次数

如何在使用MATLAB Engine时获得matlab的PID?

使用MATLAB Engine界面时,如何获取启动的matlab进程的进程ID?或者我如何以允许我获得PID的方式启动matlab过程?

我需要这个的原因是当它们花费太长时间时能够中断计算.在*nix系统上,这似乎可以通过向MATLAB发送SIGINT信号来实现.这不会杀死MATLAB,但它会中断当前的计算.

unix matlab pid matlab-engine

2
推荐指数
1
解决办法
455
查看次数

Doxygen 不会解析对命名空间中 typedef 的引用

Doxygen 可以在以下简短示例中正常工作:

/** \file */

/// This is an integer
typedef int myInteger;

/// This is the same as \ref myInteger
typedef myInteger myOtherInteger;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但是myInteger如果我将它放入命名空间,它不会解析对的引用。

/** \file */

namespace bar {

/// This is an integer
typedef int myInteger;

/// This is the same as \ref myInteger
typedef myInteger myOtherInteger;

}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

请注意,myInteger现在提到的两个都不是链接。它还抱怨:

警告:无法为 \ref 命令解析对 `myInteger' 的引用

写作\ref bar::myInteger没有帮助。

我怎样才能解决这个问题?

我有 doxygen 1.8.13。

c++ typedef doxygen

2
推荐指数
1
解决办法
2829
查看次数

为什么在Mathematica中更改集成顺序会产生不同的结果?

以下是我的Mathematica计划的两个陈述.

Print[ExpandAll[Chop[Integrate[Resi*Cos[7*1*\[Theta]]*Sin[(1*Pi*x)/L], {\[Theta],    
     0,2*Pi},{x,0, L}], 10^-6]]];
Run Code Online (Sandbox Code Playgroud)

这条线给了我输出

1043.84 A[1,7][t]-115072. A[1,0][t] A[1,7][t]+112.933 A[1,0][t]^2 A[1,7][t]+12415.3 A[1,7][t]^3-1327.67 A[1,7][t] A[1,14][t]+387.315 A[1,0][t] A[1,7][t] A[1,14][t]+50249.8 A[1,7][t] A[1,14][t]^2+12415.3 A[1,7][t] B[1,7][t]^2-1327.67 B[1,7][t] B[1,14][t]+387.315 A[1,0][t] B[1,7][t] B[1,14][t]+50249.8 A[1,7][t] B[1,14][t]^2+0.000108481 (A[1,7]^\[Prime]\[Prime])[t]
Run Code Online (Sandbox Code Playgroud)

而当我颠倒整合的顺序

Print[ExpandAll[Chop[Integrate[Resi*Cos[7*1*\[Theta]]*Sin[(1*Pi*x)/L], {x, 0, L}, {\[Theta], 0, 2*Pi}], 10^-6]]];
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

 2087.69 A[1,7][t]-230144. A[1,0][t] A[1,7][t]+225.866 A[1,0][t]^2 A[1,7][t]+24830.6 A[1,7][t]^3-2655.34 A[1,7][t] A[1,14][t]+774.631 A[1,0][t] A[1,7][t] A[1,14][t]+100500. A[1,7][t] A[1,14][t]^2+24830.6 A[1,7][t] B[1,7][t]^2-2655.34 B[1,7][t] B[1,14][t]+774.631 A[1,0][t] B[1,7][t] B[1,14][t]+100500. A[1,7][t] B[1,14][t]^2+0.000216962 (A[1,7]^\[Prime]\[Prime])[t]
Run Code Online (Sandbox Code Playgroud)

整合的顺序无关紧要.那为什么输出不同?请注意,第一个错误输出只是第二个(正确)输出的一半.我问这个是因为给我正确答案的顺序花了很多时间.我的程序中有很多这样的积分.

表达式Resi是一个巨大的术语,但让我给你一小部分

  1754.2 Sin[(\[Pi] x)/200] A[1, 0][t] + 
  6.64531 Cos[7 \[Theta]] Sin[(\[Pi] x)/200] …
Run Code Online (Sandbox Code Playgroud)

integration wolfram-mathematica

1
推荐指数
1
解决办法
210
查看次数

生成严格对角占优矩阵

有没有办法在Mathematica中生成一个n 严格对角占优的随机n ?我使用以下代码生成随机方阵:

A = RandomReal[{-100, 100}, {1000, 1000}]
Run Code Online (Sandbox Code Playgroud)

编辑:我只需要一种方法来生成一个严格的对角占优矩阵,行随机性并不重要.

wolfram-mathematica matrix

1
推荐指数
1
解决办法
1885
查看次数

使用哪个与基于符号的测试

我有问题使用Which.其中的一个参数(我在做数学的函数arg2)应该是一个Symbol(或NoneFull).我希望函数的输出依赖于arg2这样,但它不起作用:

testFunction[arg1_,arg2_:None]:=Which[arg2==None,arg1*2,arg2==Full,arg1*3]
Run Code Online (Sandbox Code Playgroud)

如果arg2None似乎没有什么问题,但对于arg2Full,testFunction刚刚返回本身.当使用实数或整数,而不是符号NoneFull,testFunction功能正常.

我在测试中使用符号时犯了错误吗?或者在使用Which和符号时我应该注意其他任何"规则" 吗?

我已经搜索了这个和其他网站的答案,但找不到任何答案.Mathematica帮助文件也没有为我提供答案.到处都是我看过哪个不是巫婆符号.

wolfram-mathematica

1
推荐指数
1
解决办法
74
查看次数

用双精度数替换所有整数有哪些缺点?

即使在索引到数组时,一致使用浮点类型来表示整数有哪些潜在的缺点?假设一个面向性能的 C 库的上下文。可以在 64 位整数和 64 位浮点数之间进行选择。

我对做这样的事情感到不舒服,因为doubles 不是用于索引的,并且使用工具来完成其设计目的之外的事情通常会带来风险。但我想了解是否有合理的理由避免这样做。

为了解决显而易见的问题:

  • 当然,某些强制转换可能需要double[ ]运算符一起使用。
  • 当然,IEEE 754double无法表示与 64 位整数类型一样多的不同整数,但在可预见的将来,53 位可能足以用于索引数组。

事实上,浮点类型的这种用法在野外随处可见。例如,R 没有 64 位整数,并且通过使用doubles 进行索引来支持大型数组。在编写必须与 R 互操作的代码时,必须考虑是否也这样做。

c floating-point performance

1
推荐指数
1
解决办法
189
查看次数

简单的操作在Matlab中做了什么

简单的操作A ^(1/2),其中A是正定矩阵,在Matlab中做什么?谢谢!

matlab matrix linear-algebra

0
推荐指数
1
解决办法
132
查看次数

setlocale() 对 macOS 没有影响

I am using the example program for setlocale() from cppreference.com on a macOS 10.14.6 system, however, the output is not localized. I checked that the return value from setlocale() is not NULL and tried a variety of locale specifications in an attempt to get a decimal comma, such as de, de_DE, de_DE.utf8.

Why does this not work?

How can I find out why the output isn't affected, and whether it is because of incorrect locale names?

On …

c macos locale

0
推荐指数
1
解决办法
478
查看次数