我正在使用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指针取消引用.
我完全感到困惑:我的功能中没有指针.为什么我会收到此错误?
我试过调查一下:
我检查了字符串my_string是否为空.
我使用"我的文本"创建了一个对象,以确保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函数.
我在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,因为它更容易绘制).
对于一般配置,Grails提供了两个文件:
- 的grails-app/CONF/BuildConfig.groovy
- 的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.groovy
和grails-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
.如果我删除了工作空间,它再次运行良好.
我有一个设备向我发送类型为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.此外,当我尝试从文件中读取数据(我的设备生成的数据)时,我得到了奇怪的结果,而不是手册中描述的格式.当然,有比我预期更多的数据.
我究竟做错了什么?
我正在编写一个程序来控制Labview中的两个类似设备.为了避免复制代码,我使用了子VI.但我有一段代码,我在一个while循环中更新GUI上的一些值.我想知道是否有可能以某种方式在我的子VI中有这个循环并让子VI在每次迭代后发送一个输出参数.
我知道当我想将一个数组传递给一个函数时,它会衰减成指针,所以它的大小不会被知道,这两个声明是等价的:
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上发现了类似的问题,但它没有回答我的问题 - 它没有解释为什么编译器知道数组的大小,只有一些关于如何将数组传递给函数的信息.
我有一些数据要显示为等高线图,其中包含值的对数刻度(矩阵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)
现在看起来不错——你可以看到我的数据是如何变化的。然而,标签是错误的。我现在可以将它们设置为您喜欢的任何向量:
理想情况下,我希望能够像这样:
[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log');
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
并在底部获取带有标签 10、10^5、10^10 等的图片。
总而言之,我需要执行以下操作之一:
找到一种以编程方式设置对数刻度的方法,让 matlab 担心等值线。
能够在不移动它们的情况下手动更改等值线上的标签(new_label = …
我在Labview中编写了一段相当复杂的代码(包含许多循环和其他序列).因此,我想创建许多子VI以使我的代码更清晰.
当我想要在子VI中的代码中有一个循环时,新创建的子VI的图标显示在远离我原始代码段的位置,导致我的块图扩展.
为什么会发生这种情况,我该如何避免呢?
我有两段代码:
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引用的函数?
有人问我以下代码的输出是什么:
floor((0.7+0.6)*10);
Run Code Online (Sandbox Code Playgroud)
它返回 12。
我知道浮点表示不允许以无限精度表示所有数字,我应该期待一些差异。
我的问题是:
我怎么知道这段代码返回的是 12,而不是 13?为什么 (0.7+0.6)*10比 13少一点,而不是多一点?
我什么时候可以预期地板功能不能正常工作,什么时候可以正常工作?
注意:我不是在问浮动表示的样子或为什么输出不完全是 13。我想知道我应该如何推断 (0.7+0.6)*10 有点小于13。
我一直在读,数组应该在编译时具有已知的大小.这是一段代码示例:
int temp = 5;
const int size = temp;
int array[size];
Run Code Online (Sandbox Code Playgroud)
但是,我编译并运行代码,没有错误.
作者是否正确,在上面的代码中,数组的大小在运行时是已知的?如果他是,为什么我能编译并运行代码?
在我看来,这个大小在编译时是已知的.有什么我不明白的东西吗?
编辑.我使用了g ++编译器而没有额外的选项:g ++ main.C -o main
我知道我不能写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)
但这与你所说的相矛盾.