我正在使用 C# (.NET 5)。想象一下,我有一个存储结构数组(例如浮点数)的类:
public class StoresArray
{
private float[] floats;
}
Run Code Online (Sandbox Code Playgroud)
此类的数据是从序列化的二进制文件加载的。为了分配floats数组,我使用辅助函数从序列化文件中读取字节。重要的是,此函数然后尝试直接将加载的字节重新解释为而不是复制到新数组。float[]
public static class Deserializer
{
public static float[] Load(string file)
{
byte[] bytes = LoadBytesFromFile(file);
// This is a compiler error, of course.
return (float[])bytes;
}
}
Run Code Online (Sandbox Code Playgroud)
预期用途如下:
// Within the StoresArray class...
floats = Deserializer.Load("MyFile.file");
Run Code Online (Sandbox Code Playgroud)
这里值得注意的是,我试图将存储float[]为成员变量,而不仅仅是在byte[]本地迭代。因此,通过Span<T>( Span<float> floatSpan = MemoryMarshal.Cast<byte, float>(bytes.AsSpan())) 进行投射是不够的。Memory<T>与、Marshal、 和相关的功能MemoryMarshal也同样失败。当然,我可以使用跨度(以及其他方法,如或不安全的指针)从BitConverter …
考虑以下代码:
private unsafe void Function()
{
int length;
// This line raises error CS1686, "Local 'length' or its members cannot have their address taken and be used inside an anonymous method or lambda expression".
glGetProgramiv(1, GL_PROGRAM_BINARY_LENGTH, &length);
FunctionWithLambda(() => Console.WriteLine(length));
}
private void FunctionWithLambda(Action callback)
{
callback();
}
Run Code Online (Sandbox Code Playgroud)
length请注意,我获取(局部变量)的地址,然后在 lambda 中使用该变量本身(而不是其地址)。我理解为什么局部变量地址不能直接在 lambda 中使用(参见为什么不能将变量的地址传递给匿名函数?等示例),但是为什么我不能使用一次分配的值length(即使该赋值碰巧使用了&运算符)?错误 CS1686 的官方文档(https://learn.microsoft.com/bs-latn-ba/dotnet/csharp/misc/cs1686)尚未澄清这种混乱。
我的假设是,这只是一种语言限制,但我很好奇是否有我遗漏的潜在技术原因。另请注意,我不是问如何解决这个问题(我知道我可以length先轻松复制到另一个局部变量)。
我正在使用OpenGL和C++构建游戏.我正在使用GLFW和GLAD.我目前正在设置简单的着色器,但我完全被编译问题阻碍了.简而言之,着色器编译失败,没有错误消息.
这是我的顶点着色器(它用于绘制2D图像和文本):
#version 330 core
layout (location = 0) in vec2 vPosition;
layout (location = 1) in vec2 vTexCoords;
layout (location = 2) in vec4 vColor;
out vec4 fColor;
out vec2 fTexCoords;
uniform mat4 mvp;
void main()
{
vec4 position = mvp * vec4(vPosition, 0, 1);
position.y *= -1;
gl_Position = position;
fColor = vColor;
fTexCoords = vTexCoords;
}
Run Code Online (Sandbox Code Playgroud)
这是创建着色器,加载着色器源,编译着色器以及检查错误的相关代码.
GLuint shaderId = glCreateShader(GL_VERTEX_SHADER);
std::string source = FileUtilities::ReadAllText(Paths::Shaders + filename);
GLchar const* file = source.c_str();
GLint length = …Run Code Online (Sandbox Code Playgroud)