小编Pil*_*pel的帖子

size_t总是unsigned int

是否存在任何已size_t定义为其他内容的实现unsigned int?在我工作的每个系统下,它被定义为unsigned int,所以我只是好奇.

c++ size-t

4
推荐指数
2
解决办法
1748
查看次数

多线程在C++中执行单个任务

假设我有这个big_task()功能,我可以在线程之间分配加速.

解决多线程问题的方法是调用_beginthread()函数的每个任务,然后等待所有线程完成,对吧?

我如何知道这是否有效并且实际上有利于最小化big_task()运行时间?

我还听说多线程效率取决于客户端的平台和硬件.这意味着我需要在程序开头查询...?

在Windows中进行编码时,还有一个问题是使用它CreateThread()而不是_beginthread()?我编写跨平台应用程序但是如果CreateThread()比我专用我的代码在Windows中使用它更有效.

c++ multithreading

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

何时使用机器epsilon何时不使用?

我正在读一本关于渲染3D图形的书,作者有时会使用epsilon,有时却不会.

图片

注意一if开始使用epsilon而另if一些则没有.

这背后的逻辑是什么?我可以看到他避免任何被零除的机会,但是当在函数中没有使用epsilon时,它仍然有可能返回一个值,使外码被除以零.

顺便提一下,Book是Real-Time Rendering 3rd Edition.

c++

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

我什么时候应该关闭一个SQLiteDatabase对象?

几个小时我一直在遇到这个烦人的运行时错误,这使我的应用程序崩溃了:

java.lang.RuntimeException:执行doInBackground()时发生错误.

引起:java.lang.IllegalStateException:尝试重新打开已经关闭的对象:SQLiteDatabase

经过一些调试后,我发现它发生了,因为我在onDestory()方法中关闭了我的SQLiteDatabse对象.它发生在我打电话的时候SQLiteOpenHelper.close().

@Override
protected void onDestroy() {
    super.onDestroy();
    _cursor.close(); //is fine
    _db.close(); //causes error
    _databaseHelper.close(); //causes error too (probably calls db.close() internally..?)
    SharedFunctions.d("closed!"); //ignore this ugly thing
}
Run Code Online (Sandbox Code Playgroud)

这提出了两个问题

  1. 我做得对吗?(可能不是)
  2. 需要关闭一个SQLiteDatabase对象,如果不能在onDestroy方法?

编辑:DB和Helper类是静态的:

public class MainActivity extends Activity {

    private Cursor _cursor = null;
    private MyCursorAdapter _myCursorAdapter = null;
    private ListView _listView = null;

    private static SalaryDatabaseHelper _databaseHelper = null;
    public static SQLiteDatabase db = null;

    ...
Run Code Online (Sandbox Code Playgroud)

我在onCreate()方法中初始化_databaseHelper:

//get database helper …
Run Code Online (Sandbox Code Playgroud)

android

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

Opengl统一行为

我注意到一些在opengl文档中没有很好解释的东西.如果我错了,请纠正我.

  1. 如果程序不是opengl当时正在使用的程序,则无法设置统一的值.那会产生错误.

  2. 如果在程序A中设置了统一的值,则切换到程序B,然后切换回程序A,该值保持不变.这可靠吗?

  3. 无法为当时未使用的程序设置统一值.有解决方法吗?

c++ opengl shader glsl

3
推荐指数
1
解决办法
105
查看次数

正常的映射非常错误

我试图在我的opengl应用程序中实现常规映射,但我无法让它工作.

是漫反射贴图(我添加了一个棕色),是法线贴图.

为了获得切线和bitangent(在其他地方称为binormals?)向量,我为网格中的每个三角形运行此函数:

void getTangent(const glm::vec3 &v0, const glm::vec3 &v1, const glm::vec3 &v2,
const glm::vec2 &uv0, const glm::vec2 &uv1, const glm::vec2 &uv2,
std::vector<glm::vec3> &vTangents, std::vector<glm::vec3> &vBiangents)
{
    // Edges of the triangle : postion delta
    glm::vec3 deltaPos1 = v1-v0;
    glm::vec3 deltaPos2 = v2-v0;

    // UV delta
    glm::vec2 deltaUV1 = uv1-uv0;
    glm::vec2 deltaUV2 = uv2-uv0;

    float r = 1.0f / (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x);
    glm::vec3 tangent = (deltaPos1 * deltaUV2.y   - deltaPos2 * deltaUV1.y)*r;
    glm::vec3 …
Run Code Online (Sandbox Code Playgroud)

c++ opengl lighting glsl glm-math

3
推荐指数
1
解决办法
2638
查看次数

在opengl的水翻译

我完全不知道如何渲染水源(海洋,湖泊等).这就像我遇到的每一个教程都假设我掌握了这个主题的基本知识,因此抽象地讲述了这个问题,但我没有.

我的目标是在我的地形中建立一个基于高度的水位.

我找不到任何可以帮助我入门的好文章.

opengl shader glsl

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

使用c ++登录时出错

我实现了一个非常简单(错误)的记录器类.它看起来像这样:

#pragma once

#include <string>

extern const char* LOG_DEFAULT_TEXT =  "<LOG>\n\n";

class Log
{
public:
    Log() : _logs(0), _log(LOG_DEFAULT_TEXT) {};

    void add(const char *str, bool nl=true);
    void clear();

    const char* get() const { return _log.c_str(); }
    int getNumLogs() const { return _logs; }


private:
    std::string _log;
    int _logs;
};
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我说这个Main类,包含我的程序可能包含的所有其他对象,以及这个Log类.显然我希望我的Main类中的这些"其他对象"能够在Main中使用Log对象,因此简单的解决方案是将指针传递给每个类的构造函数,以便它可以使用Log对象.

我在谈论这样的事情:

//Main.h
...

#include "Log.h"

class Main() {
public:
  ...

private:
  Log _log;
  ImportantObject1(&_log); //pass a pointer to _log
  ImportantObject2(&_log); //..same
};
Run Code Online (Sandbox Code Playgroud)

这个解决方案看起来太笨拙,所以我问是否有不同的方法可以实现我想要完成的任务,即错误记录.

c++

3
推荐指数
1
解决办法
3106
查看次数

将指针视为unsigned int for hash

我想为我的自定义类型AnimationSet重载std :: hash模板:

struct AnimationSet {
    const AnimationData *animationData;
    SceneNode *sceneNode;

    bool operator==(const AnimationSet &other) const {
        return ( this->animationData == other.animationData &&
                 this->sceneNode == other.sceneNode );
    }
};
Run Code Online (Sandbox Code Playgroud)

如您所见,它是一个只包含两个指针的结构.

将这些指针强制转换为unsigned int以计算AnimationSet的哈希值是否合法?

namespace std {
    template<>
    struct hash<AnimationSet> {
        size_t operator()(const AnimationSet &set) const {
            hash<unsigned int> h;

            return h((unsigned int)set.animationData) ^ h((unsigned int)set.sceneNode);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在哈希重载的上下文中问这个问题,但我想知道更一般的问题的答案:"将任何指针转换为unsigned int是否公平?"

c++

3
推荐指数
1
解决办法
342
查看次数

依靠布尔值来访问指针

我有一个名为MyClass包含指向对象的指针的类,如下所示:

class MyClass {
public:
    MyClass() : _blob(nullptr) {}
    ~MyClass() { free(); }

    void generate() {
        if(!_blob)
            _blob = new Blob;
    }

    void free() {
        if(_blob) {
            delete _blob;
            _blob = nullptr;
        }
    }

    Blob* getBlob() { return _blob; }

private:
    Blob *_blob;
};
Run Code Online (Sandbox Code Playgroud)

它保存指向堆分配对象的指针并且不在堆栈中包含它的原因是因为某些MyClass实例不为此对象分配数据,因此在访问它之前我需要检查它是否不是空指针:

if(myClass->getBlob())
    myClass->getBlob()->doSomething();
Run Code Online (Sandbox Code Playgroud)

现在我有了这个想法来存储一个被调用的bool变量_hasBlob,然后像这样使用它

if(myClass->hasBlob())
    myClass->getBlob()->doSomething();
Run Code Online (Sandbox Code Playgroud)

这被认为是更快和合法吗?或者它被认为是不好的做法,因为我可以看到以某种方式结束取消引用nullptr的潜在危险.

c++ pointers

3
推荐指数
1
解决办法
65
查看次数

标签 统计

c++ ×8

glsl ×3

opengl ×3

shader ×2

android ×1

glm-math ×1

lighting ×1

multithreading ×1

pointers ×1

size-t ×1