【问题标题】:Function return value can't be assigned to a const char value函数返回值不能分配给 const char 值
【发布时间】:2022-01-01 12:45:56
【问题描述】:

我正在使用 OpenGL,不用担心我的问题是 C 而不是与 OpenGL 相关的问题。在 OpenGL 中,我们有一个叫做着色器的东西。它是一个文本文件。我要做的就是读取该文本文件并将其传递给仅接受const char * const* 的函数。 (例如,func(&shaderSource)shaderSource 必须是 const char* shaderSource。)。我只想要这个带有多个文件的术语。我可以吗?我看到有人用 C++ 做这件事,但我在项目中选择了 C 而不是 C++。这是我的一些失败尝试。

char vertexShaderContent[1000] = readfile("Shader/default.frag.txt");
const char *vertexShaderSource;
strcpy(vertexShaderSource, vertexShaderContent);

在这里,我尝试获取一个新变量(顺便说一下,这是在main 函数中),它执行该函数并获取该函数的返回值。现在我确实复制了那个字符串(使用strcat)将vertexShaderContent 的值分配给vertexShaderSource。顺便说一下,这是我的readfile 代码:

char *readfile(const char* filename) {
    char *res = malloc(sizeof(char *) * 100);    
    char *word = malloc(sizeof(char *));
    FILE *file = fopen(filename, "r");

    while (fgets(word, sizeof(word), file) != NULL) {
        strcat(res, word);
    }

    strcat(res, "\n\0");

    fclose(file);

    return res;
}

总结

我所有的问题是我想将char* 传递给接受const char*s 的函数。如果我不能,有什么方法可以让这个“多个”文件工作吗?

谢谢。

【问题讨论】:

  • const char *vertexShaderSource = readfile(...);?
  • 代码为文字,请勿以图片形式发布
  • 您的代码中还有很多其他错误,从错误的分配大小开始(sizeof(char*) 而不是sizeof(char)),在未初始化的缓冲区上调用strcat 并尝试@ 987654338@变成一个未初始化的指针
  • 将指向 vertexShaderContent 的指针传递给 readFile 而不是使用 malloc。
  • @UnholySheep 这不会出错,而且工作正常。我知道这不是最佳做法。也许我可以稍后修复它。我也不会再发图片了

标签: c


【解决方案1】:

char vertexShaderContent[1000] = readfile("Shader/default.frag.txt"); 中,readfile 返回指向char 的指针,但vertexShaderContentchar 的数组。要初始化一个数组,需要为每个要初始化的元素提供值。指向 char 的指针不是初始化 char 值的正确类型。

这里可能有用的是char *vertexShaderContent = readfile("Shader/default.frag.txt");。这将vertexShaderContent 定义为指向readfile 返回的内存的指针。但是,不清楚您要做什么,因为它后面的代码令人困惑:

const char *vertexShaderSource;
strcpy(vertexShaderContent, vertexShaderSource);

这会用新数据覆盖vertexShaderContent 的数据,因此它会丢失readfile 返回的数据。它尝试从vertexShaderSource 复制,但vertexShaderSource 尚未设置为指向任何地方。它的价值是不确定的。这个strcpy 不能做任何有用的事情。由于我们不知道您在此处尝试做什么,因此我们无法推荐解决方案。

readfile 中的这些行不正确:

char *res = malloc(sizeof(char *) * 100);
char *word = malloc(sizeof(char *));

第一个为 100 char * 分配空间。要为 100 个char 分配空间,请使用char *res = malloc(100 * sizeof *res);

第二个为char * 分配空间。但看起来你想要一个“单词”的空间,这可能是一些不同数量的字符。也许您希望以至少 100 个字符的空格开头:

char *word = malloc(100 * sizeof *word);

虽然一个好的最终解决方案会确保分配的分隔符不会溢出,但这可能有助于让代码开始运行。

strcat(res, word)中,res指向的数据还没有被初始化。在使用strcat 之前,您必须在目的地中有一些字符串。这可以是空字符串,您可以通过在res 中放置一个空终止符来创建它:

*res = '\0';

我所有的问题是我想将char* 传递给接受const char*s 的函数。

除了上面提到的问题之外,问题中没有任何内容显示任何尝试为 const char * 参数传递 char * 的尝试都不起作用。

【讨论】:

  • 对不起。在strcpy。我的意思是strcpy(vertexShaderSource, vertexShaderContent)我会修复它
  • 是的,您能告诉我一种将char * 解析为const char * 的方法,只是让我将vertexShaderSource 传递给需要const char * const * 的函数。 (不是readFile)函数。
  • @TechTycho:要使用char *x; 调用需要const char * const * 的函数,请使用& (const char *) {x} 作为参数。这会创建一个临时的const char *,它指向与x 相同的位置,并将其地址传递给函数。
  • 谢谢埃里克!很酷
猜你喜欢
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多