小编Kaa*_*Kaa的帖子

OpenGL glLinkProgram返回false但信息日志为空; 检查一切

我必须承认这是我第一次实现着色器,以前我只使用过固定功能管道; 但是,尽管我确信我所做的一切都是正确的 - 但一定有错误.

glLinkProgram(program)- GL_FALSE查询时返回GL_LINK_STATUS.此外,信息日志为空(当我查询日志长度 - 它是1,这是每个文档的空终止符,它检出).所以链接器错误,没有日志.另外,我刚刚发现链接器问题一旦我gl_Position在顶点着色器中使用变量,就会在赋值期间和我用它进行计算时出现.我尝试了各种各样的着色器变种,它出错了,但它无法生成日志 - 它似乎只是在GL_FALSE任何时候gl_Position被触及返回.有趣的是,片段着色器不会导致任何问题.

片段和顶点着色器都可以正常编译而没有错误.当我引入语法错误时,会检测,打印它们,并在程序创建之前中止该过程(因此它似乎工作正常).我调试并确保文件正确加载,源为空终止,大小正确,我在附件后检查附加程序的数量,它是2(正确的大声笑).为清楚起见,它被删除,我有checkForErrors()检查和打印opengl错误的方法 - 没有检测到.

我很难过,请有人帮忙!我已经失去了2天的睡眠时间......

这是加载着色器的代码:

FILE *file = fopen(fileName.c_str(), "rb");

if(file == NULL)
{
    Log::error("file does not exist: \"" + fileName + "\"");
    return NULL;
}

// Calculate file size
fseek(file , 0 , SEEK_END);
int size = ftell(file);
rewind(file);

// If file size is 0
if(size == 0)
{
    Log::error("file is empty: \"" + fileName + "\""); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl linker shader glsl

8
推荐指数
1
解决办法
8159
查看次数

C++摆脱了Singletons:替代了仿函数和静态方法

我的崇高任务是摆脱单身人士和静态阶级.

背景:
我有以下结构:

  • Cmd
    经常实例化对象,它拥有命令(string)的名称,以及任何类的静态方法作为指针的仿函数.
    它通常在诸如Input,Console,Render等主类中创建,并且引用类中创建它的方法,为这些方法提供运行时语言接口.
    Cmds还以字符串数组的形式解释参数,其中第一个参数是Cmd的名称,所有连续字符串是被调用的静态方法的直接参数.参数count和argument数组存储在Commander中,并在每次Cmd调用之前更改.
  • Commander
    Commander用于解释字符串命令(可以直接或通过控制台),它执行Cmd,它作为字符串存储在缓冲区中(通过调用它的仿函数).

问题:
问题是我试图摆脱所有的静态类(我现在变成了用于测试的单例),并且我使系统完全模块化并且松散耦合.这反过来阻止我进行Cmds可能指向的静态调用.

第一直觉是将函数从typedef更改为模板类,这将存储一个对象和方法,但它看起来非常混乱和复杂,我个人不舒服:

Cmd::create("toggleconsole", Console::toggle);
Run Code Online (Sandbox Code Playgroud)

至:

Cmd::create("toggleconsole", new FunctorObject<Console>(&Console::get(), &Console::toggle));
Run Code Online (Sandbox Code Playgroud)

最终的Cmd创建看起来非常模糊和误导谁负责Functor解除分配.

我也正在将Cmd创建从静态方法调用移动到Commander类中,所以它看起来像commander.createCmd("command_name",...); 而不是Cmd :: create("command_name",...); 这是因为Commander不再是静态的(或单例),因此它处理的所有命令都必须属于它.

但是,我完全不知道我的选项/替代方案是注册Cmds,并通过允许向Commander发出字符串命令来维持松散耦合.

我已经考虑过让每个主类派生自一个CmdListener类,它会在创建时用Commander注册该对象,然后在执行期间将命令传递给覆盖"onCmd(const Cmd&command)"的所有已注册对象.

这也留下了一些未解答的问题:Cmd将如何调用应该调用哪个类的方法?保持指针是没有意义的,并且会受到高度默默无闻的影响(如上所示).另外,我希望不为每个可以处理该cmd的类重新解释onCmd方法中的字符串.

这是很多信息,但有没有人对如何处理这个问题有任何想法?

此外,我的所有类都必须知道Commander和Console对象,它们不再是单例/静态.到目前为止,我已将它们放在Context对象中,并将它像一个小胶囊一样传递.关于如何解决这些后单例残留问题的任何想法?

这个项目是我个人的工作,我打算在我的简历上使用它 - 因此,我不希望我的潜在雇主看到任何单身人士(我也不想解释为什么,因为我可以证明他们自己并非真正必要).

万分感谢!

编辑:排版.

c++ singleton structure functor

4
推荐指数
1
解决办法
1224
查看次数

在Objective-C中初始化一组结构

我已经读了一段时间了,我不确定我找到了一个好的答案.

我正在尝试设置一个包含92个结构的数组.它是一个固定的长度,不会改变,因为它实际上是一个查找表.我认为最好的方法是首先分配内存,calloc然后加载数据.

但经过一些阅读后,我看到很多人直接分配内存而没有callocmalloc喜欢这样

 myStruct myData[92] = { {1,2}, {3,4}, ....};
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是动态分配内存是否更好?我的理解是这是一个更好的解决方案.特别是如果数据不一定会一直使用.

我的第二个问题是关于初始化数据.我曾经读过我可以初始化一个结构,... = {....};但编译器不接受它.

这是我到目前为止的代码:

typedef struct {
    int a;
    int b;
} myStruct;

@implementation MyClass

    static myStruct *myData;

    -(id) init {
         // ...

         myData = (myStruct *) calloc(92, sizeof(myStruct));
         myData[0] = {1,2}; // <=== Error ! Compiler says "Expected expression!"

         // ...
Run Code Online (Sandbox Code Playgroud)

arrays struct memory-management objective-c calloc

4
推荐指数
1
解决办法
3927
查看次数

在运行时检查继承是否只有其中一种类型和 void*

我需要一种方法来在运行时检查类型是否通过继承与匿名对象的类型(出于我的目的的 void 指针)相关。

假设我有两种类型:

class Base
{
public:
  virtual ~Base();
};

class Derived : public Base
{
public:
  ~Derived();
};

Base *base = new Derived();
Derived *derived = new Derived();
Run Code Online (Sandbox Code Playgroud)

我需要实现以下功能:

template <typename T>
T *isRelated(void *obj, void *tag)
{
  //If T is related to obj's real type (established based on tag value)
  //    return reinterpret_cast<T*>(obj);
  //else
  //    return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

目前,我可以通过在 typetag 中存储任何一个值(在编译时确定并作为值返回)并比较是否相等来检查 obj 是否与 T 类型相同

换句话说,当前的 typetag 实现类似于:

template <typename T>
void *getTypeTag();

template <>
void …
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
1
解决办法
926
查看次数