小编Gri*_*ios的帖子

在 C# 中,如何将 byte[] 重新解释为 T[],其中 T 是一个结构体?

我正在使用 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 …

c# arrays reinterpret-cast

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

在 C# 中,为什么不能使用局部变量的地址填充该变量,然后再使用该变量?

考虑以下代码:

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先轻松复制到另一个局部变量)。

c# lambda local-variables memory-address

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

为什么我的GLSL着色器无法编译而没有错误消息?

我正在使用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)

c++ opengl shader glsl glfw

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