小编use*_*748的帖子

我在CppCheck中发现了一个错误吗?为什么我在这里得到"空指针取消引用"错误?

我正在使用Cppcheck来管理我的代码.我有以下功能:

bool my_function(std::string my_string) const
{
 return 0 == my_string.compare("Some text");  // line 3
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我在第3行得到了Null指针取消引用.

我完全感到困惑:我的功能中没有指针.为什么我会收到此错误?

我试过调查一下:

  1. 我检查了字符串my_string是否为空.

  2. 我使用"我的文本"创建了一个对象,以确保Cppcheck不会抱怨使用临时对象:

    bool my_function(std::string my_string) const
    { 
     std::string str("Some text");
     return 0 == my_string.compare(str);  // line 3
    }
    
    Run Code Online (Sandbox Code Playgroud)

我还可以做些什么?是Cppcheck中的错误吗?比较功能本身有问题吗?如果是这种情况我会感到惊讶,因为cppcheck不会抱怨我的项目中使用的任何其他std函数.

注意:我不要求对可能的空指针引用错误,所以这不是任何的下列问题重复:1,23.

c++ pointers static-code-analysis cppcheck

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

获得属于凸包的点

我在Matlab中有一个颗粒的二进制图像.我可以通过以下功能找到颗粒的凸包:

[K, V] = convhull(granule);
Run Code Online (Sandbox Code Playgroud)

如何找到属于凸包的所有像素,但不属于原始图像中的颗粒?我的意思是我想做那样的事情:

granule2 = zeros(size(granule));
granule2(K == 1 & granule == 0) = 2;
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为K的大小为x乘3,其中x是凸包中的三角形数.

编辑:根据文档,凸包应该是一个数组,其中每个行的凸包构成点.那么如何找到由这些点确定的体积内的所有点.

编辑2:让我换句话说:我有一个3D点阵列的图像.它不是一个球体,它有一些凹痕(因此凸面船体不会放在我的图像表面).

我想找到凸包,然后找到凸包内部的所有点,但是在颗粒之外.这是它在2D中的样子(我想找到红色像素在此输入图像描述):

编辑3:NicolaSysnet,你的算法应该返回我图片中红色的所有像素(它们的索引)(图片是2D,因为它更容易绘制). 在此输入图像描述

matlab convex-hull

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

Grails:为什么在编译期间执行Config.groovy文件?

Grails文档这个问题:

对于一般配置,Grails提供了两个文件:

  1. 的grails-app/CONF/BuildConfig.groovy
  2. 的grails-app/CONF/Config.groovy中

它们都使用Groovy的ConfigSlurper语法.第一个是BuildConfig.groovy,用于运行Grails命令时使用的设置,例如compile,doc等.第二个文件Config.groovy用于运行应用程序时使用的设置.这意味着Config.groovy与您的应用程序一起打包,但BuildConfig.groovy不是.

这是关于log4j框架的摘录:

Grails使用其通用配置机制为底层Log4j日志系统提供设置,因此您所要做的就是将log4j设置添加到文件grails-app/conf/Config.groovy.

我有一个包含这两个文件的项目:grails-app/conf/BuildConfig.groovygrails-app/conf/Config.groovy.该项目使用该log4j实用程序,因此一些设置(包括函数)放在Config.groovy文件中.现在,根据我引用的文档,它是正确的文件,因为我想使用日志实用程序来运行应用程序,而不是编译它.

有趣的是,当我mvn package在项目上运行时会使用这些设置- log4j执行设置中的功能.

根据文件问题,情况并非如此.

我知道可以使用它grailsApplication来访问这些设置:

def recipient = grailsApplication.config.foo.bar.hello
Run Code Online (Sandbox Code Playgroud)

所以我搜索了我的项目并找到了一些用法grailsApplication,但没有与log4j设置有关.

使用在Config.groovy文件中放置log4j设置的其他可能原因是什么mvn package?我错过了什么?

更新:当我mvn package第一次使用构建项目时,提到的配置似乎有效.下次运行时mvn package,将使用文件中的log4j配置Config.groovy.如果我删除了工作空间,它再次运行良好.

configuration grails groovy log4j maven

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

用C++编写二进制文件

我有一个设备向我发送类型为uint32_t的二进制数据.我想将数据保存到二进制文件.这是我的代码:

#include<iostream>
#include<fstream>
#include <cstdlib>

using namespace std;

int main()
{
   ofstream myFile ("data2.bin", ios::out | ios::binary);

   bool buffer[32];

   for (int k = 0; k<100; k++)
   {
      for (int i = 0; i<32;i++) 
   {
     buffer[i] = (bool)rand()%2;
   }
   myFile.write ((char*)&buffer, 32);
  }
   myFile.close();
}
Run Code Online (Sandbox Code Playgroud)

它工作,但文件的大小是3.2 kB,而不是0.4 kB.此外,当我尝试从文件中读取数据(我的设备生成的数据)时,我得到了奇怪的结果,而不是手册中描述的格式.当然,有比我预期更多的数据.

我究竟做错了什么?

c++ binary

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

从子VI更新LabVIEW GUI

我正在编写一个程序来控制Labview中的两个类似设备.为了避免复制代码,我使用了子VI.但我有一段代码,我在一个while循环中更新GUI上的一些值.我想知道是否有可能以某种方式在我的子VI中有这个循环并让子VI在每次迭代后发送一个输出参数.

labview

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

为什么数组的大小通过C++编译器已知的引用传递给函数?

我知道当我想将一个数组传递给一个函数时,它会衰减成指针,所以它的大小不会被知道,这两个声明是等价的:

void funtion(int *tab, int size);
Run Code Online (Sandbox Code Playgroud)

void funtion(int tab[], int size);
Run Code Online (Sandbox Code Playgroud)

我理解为什么.但是,当我传递一个数组作为参考时,我检查过:

void funtion(int (&tab)[4]);
Run Code Online (Sandbox Code Playgroud)

编译器将知道数组的大小,并且不允许我传递不同大小的数组作为此函数的参数.

这是为什么?我知道当我按地址传递数组时,在计算数组中第i个元素的位置时不会考虑大小,所以即使我在函数声明中明确地包含它,它也会被丢弃:

void funtion(int tab[4], int size);
Run Code Online (Sandbox Code Playgroud)

但是当我通过引用传递数组时有什么不同?为什么编译器知道它的大小?

注意:我对编译时已知大小的数组感兴趣,所以我没有使用任何模板.

我在Stack Overflow上发现了类似的问题,但它没有回答我的问题 - 它没有解释为什么编译器知道数组的大小,只有一些关于如何将数组传递给函数的信息.

c++ arrays pass-by-reference

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

Matlab:如何在 coutour 图上设置对数刻度

我有一些数据要显示为等高线图,其中包含值的对数刻度(矩阵Z)和标记的计数。这就是我的做法:

[C, h1] = contourf(X, Y, log(Z)); 
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)

这是我的结果:

图片

我的问题是:如何在轮廓上获得正确的标签?我不想要这里描述的颜色条。

编辑:这是我的例子:

X = 1:1:20;
Y = X; 
Z = zeros(size(Y));
for i = 1:size(Y,2);
    Z(i, :) = 10^i;
end

[C, h1] = contourf(X, Y, Z); 
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)

我的真实数据如下所示: 真的

我可以设置我想要的任何计数线标签,但它们将不可见,因为我的数据是指数级的(顺便说一下,在这个图中可见的标签是真实的,我想在下一个情节)。

现在,由于我的数据是指数形式,我必须在显示值(矩阵 Z)上使用对数刻度来正确显示数据。这是我的方法(也许还有另一种更好的方法,我不知道,我还没有找到其他任何东西):

[C, h1] = contourf(X, Y, log(Z)); 
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)

这是我的照片的样子: 日志数据

现在看起来不错——你可以看到我的数据是如何变化的。然而,标签是错误的。我现在可以将它们设置为您喜欢的任何向量:

  1. 0:5:45 - 我会得到我现在所拥有的。
  2. 10^[0:5:45](我想要这些标签)。但是现在我绘制的数据范围是(0, 45)(因为我计算了它的对数)。因此,大多数标签将不会显示(它们超出数据范围),并且会放错位置的标签。

理想情况下,我希望能够像这样:

[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log'); 
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)

并在底部获取带有标签 10、10^5、10^10 等的图片。

总而言之,我需要执行以下操作之一:

  1. 找到一种以编程方式设置对数刻度的方法,让 matlab 担心等值线。

  2. 能够在不移动它们的情况下手动更改等值线上的标签(new_label = …

matlab plot label scale contourf

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

Labview:创建子VI可以扩展Block Diagram

我在Labview中编写了一段相当复杂的代码(包含许多循环和其他序列).因此,我想创建许多子VI以使我的代码更清晰.

当我想要在子VI中的代码中有一个循环时,新创建的子VI的图标显示在远离我原始代码段的位置,导致我的块图扩展.

为什么会发生这种情况,我该如何避免呢?

我想要变成子VI的代码片段: 我想把这段代码变成一个子VI

创建子VI后,我的Block Diagram的相同片段: 创建子VI后,我的Block Diagram的相同片段

这是我新创建的子VI - 与第一段代码相比,向右大约1米,向下1米处: 这是我新创建的子VI  - 与第一段代码相比,向右大约1米,向下1米.

labview

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

C++:在这种情况下引用的优点是什么?

我有两段代码:

int f1(int b)
{
   return b;
}

int & f2(int b)
{
   return b;
}
Run Code Online (Sandbox Code Playgroud)

这些功能有什么区别?我知道第二个返回一个引用,但由于我可以以相同的方式使用这两个函数,有什么区别?

编辑:这个功能更好吗?

int && f2(int b)
{
   return b;
}
Run Code Online (Sandbox Code Playgroud)

什么时候应该使用返回引用的函数?

Edit2:那我什么时候应该使用返回Rvalue引用的函数?

c++ reference function

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

在 C++ 中使用 floor 函数的舍入误差

有人问我以下代码的输出是什么:

floor((0.7+0.6)*10);
Run Code Online (Sandbox Code Playgroud)

它返回 12。

我知道浮点表示不允许以无限精度表示所有数字,我应该期待一些差异。

我的问题是:

  1. 我怎么知道这段代码返回的是 12,而不是 13?为什么 (0.7+0.6)*10比 13一点,而不是一点?

  2. 我什么时候可以预期地板功能不能正常工作,什么时候可以正常工作?

注意:我不是在问浮动表示的样子或为什么输出不完全是 13。我想知道我应该如何推断 (0.7+0.6)*10 有点小于13。

c++ floating-point precision rounding

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

C++中的编译时常量

我一直在读,数组应该在编译时具有已知的大小.这是一段代码示例:

int temp = 5;
const int size = temp;
int array[size];
Run Code Online (Sandbox Code Playgroud)

根据作者的说法,大小在运行时是已知的并且导致错误.

但是,我编译并运行代码,没有错误.

作者是否正确,在上面的代码中,数组的大小在运行时是已知的?如果他是,为什么我能编译并运行代码?

在我看来,这个大小在编译时是已知的.有什么我不明白的东西吗?

编辑.我使用了g ++编译器而没有额外的选项:g ++ main.C -o main

c++ arrays compilation

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

为什么C++中没有常量引用?

我知道我不能写long& const x.但为什么不呢?从理论上讲,我可以对x进行持续的引用.我只是无法将引用设置为另一个地址.

为什么在C++中禁止它?

编辑:我知道有些东西我不明白,但我可以指定另一个变量的引用.这段代码有效:

#include <iostream>

int main()
{
 int a = 1, b = 2;
 int & x = a;
 x = b;
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这与你所说的相矛盾.

c++ const reference

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