关于这个警告有很多问题,但是我尝试过的这些警告似乎都没有让警告消失.
这就是我所拥有的:
typedef struct {
union {
float data[16];
float col_row[4][4];
};
} matrix44;
// ...
matrix44 result = {0};
Run Code Online (Sandbox Code Playgroud)
我正在尝试将结构初始化为零,但不能让它不给出错误.这是编译为C11.
我也试过其他的变化,有些荒谬:
matrix44 result = {{0}};
matrix44 result = { {0}, {0} };
matrix44 result = { {0}, { {0}, {0} } };
Run Code Online (Sandbox Code Playgroud)
但他们当然都会发出警告.
如果我将结构减少到只是一维data数组,那么我可以在{{0}}没有警告的情况下初始化它.但是将其减少到二维col_row阵列仍然会发出警告.
是否有正确的方法来避免警告?或者在这种情况下警告是否不正确?
我一直在对这种转换背后的数学进行大量搜索,到目前为止我能想到的最好的方法是:
x = sin(horizontal_angle) * cos(vertical_angle)
y = sin(horizontal_angle) * sin(vertical_angle)
z = cos(horizontal_angle)
Run Code Online (Sandbox Code Playgroud)
对于任意角度,这都很好。我遇到问题的地方是当其中一个旋转为 0 度时。在 0 度(或 180、或 360,或...)时,sin() 将为零,这意味着我从上述公式中得到的 x 和 y 坐标都将为零,无论其他角度如何被设置为。
有没有更好的公式,在某些角度不会混乱?到目前为止我的搜索还没有找到,但必须有一个解决方案来解决这个问题。
更新: 经过一些实验,我发现我的主要误解是我假设球坐标的极点是垂直的(就像行星上的纬度和经度),而它们实际上是水平的(投影到屏幕上)。这是因为我在屏幕空间(x/y 映射到屏幕,z 投影到屏幕)中工作,而不是传统的 3D 环境,但不知怎的,我并不认为这会成为一个影响因素。
最终的公式对我有用,使两极正确定向:
x = cos(horizontal_angle) * sin(vertical_angle)
y = cos(vertical_angle)
z = sin(horizontal_angle) * sin(vertical_angle)
Run Code Online (Sandbox Code Playgroud) 我有一个程序在VC++下工作正常,但在GCC下给我一个错误.
在log.h中:
namespace logType {
enum Enum {
None = 0,
Info,
Warning,
Error,
};
std::string Name[];
}
在log.cpp中:
std::string logType::Name[] = {
"None",
"Info",
"WARNING",
"ERROR"
};
这在编译log.cpp时工作正常.但是,如果任何其他文件包含log.h,则该文件出错:
error: storage size of ‘logType::Name’ isn't known
我已经尝试在一个或两个文件中为Name []指定数组大小,但这只是将错误更改为重新声明的错误.
我如何在GCC下进行合作?
在尝试编译库(flextGL)时,我遇到了一个奇怪的编译器错误(使用VC2010),这对我来说完全没有意义.
考虑以下最小C示例(test.c):
void a()
{
// ...
}
int b()
{
a();
int c;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试在VC2010下编译它,我会收到以下错误:
test.c(10) : error C2143: syntax error : missing ';' before 'type'
Run Code Online (Sandbox Code Playgroud)
错误是指该int c;行.
经过一些实验,我发现了以下内容:
int c;行,它编译得很好.a();行,它编译得很好.int c;线移到a();线上方,它编译得很好..cpp而不是.c)的文件,它编译得很好.为什么会发生这种奇怪的错误?
我唯一的猜测是这是C的古老特征之一,其中所有变量都必须在函数的顶部声明.但我会认为现代编译器比这更聪明.
假设这是针对32位应用程序的.我有两个ID值,它们一起唯一地标识特定对象.每个ID都是一个普通的32位int,因此为了识别任何特定的对象,我需要将两个ID值保持在一起.
想到的第一个解决方案是将它们存储为两个单独的值,并在结构中传递它们:
struct {
int id1;
int id2;
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我可以将它们作为单个值而不是结构对传递它,那将是很好的,就像我在仅存在一个32位ID值时所做的那样.
所以,另一个想法是将它们存储为uint64_t的上半部分和下半部分.
我的问题是,两种方法之间有什么真正的区别吗?无论哪种方式,传递相同数量的字节,但我不知道int64是否有任何特殊开销,因为CPU本身不处理64位值.
我知道 C++11 具有移动语义,这意味着您可以直接从函数返回结构体,而不用担心它被复制(假设是一个简单的结构体),而不是通过输出参数写入结构体。
C11有这样的东西吗?或者返回的结构每次仍然被复制?输出参数仍然是这里的“最佳实践”吗?
我正在尝试在 Dart (Flutter) 中创建文件缓存,其中文件仅下载一次,然后缓存以供将来的请求。(是的,我知道有这方面的现有软件包,但我的需求更具体。)
问题是,如果我在同一页面上有两个小部件尝试显示相同的图像,它们都会同时发出相同的请求,下载文件两次。
我尝试将缓存变成单例,分发其自身的单个实例,但这似乎没有效果:
class FileCache {
final _fileList = List<File>();
static FileCache _instance;
factory FileCache() {
if (_instance == null) {
_instance = FileCache._internal();
}
return _instance;
}
FileCache._internal();
bool add(File file) {
if (_fileList.contains(file)) {
return false;
}
_fileList.add(file);
return true;
}
void remove(File file) {
_fileList.remove(file);
}
}
Run Code Online (Sandbox Code Playgroud)
我确实看到了另一个执行同步的包(此处),但查看 Dart 代码我不知道它是如何强制同步访问的。
在 Dart 中,如何强制为此目的连续访问特定的类或成员变量?
假设您有一个游戏服务器(仅 UDP),在同时具有 IPv4 和 IPv6 地址的服务器上运行。服务器启动,调用 getaddrinfo() 循环访问可用地址,假设它获取 IPv6 地址。因此它在 IPv6 上创建套接字并等待来自客户端的数据包。
客户端尝试连接,但这次它使用用户输入的 IPv4 地址。它创建一个 IPv4 套接字,并尝试连接到服务器。差异实际上重要吗?或者 IPv4 套接字和 IPv6 套接字之间的差异是否仅限于本地计算机?
同样,如果客户端已经创建了一个可供使用的 IPv6 套接字(因为 getaddrinfo() 表示它是有效的),然后它调用 getaddrinfo() 来查找服务器的地址,那么如果它只获得 IPv4 结果怎么办?我知道我可以告诉 getaddrinfo() 仅提供 IPv6 结果,但如果服务器没有 IPv6 地址怎么办?UDP 客户端是否应该关闭并重新创建其套接字以匹配服务器地址格式?或者我能保证得到我要求的地址格式吗?
(我欢迎任何能够回答这些问题的文档参考。我已经研究了几个小时,但尚未找到这些问题的明确答案。)
鉴于Go字符串是unicode,有没有办法安全地确定字符(例如字符串中的第一个字母)是字母还是数字?在过去,我只会检查ASCII字符范围,但我怀疑使用unicode字符串会非常可靠.