小编Tib*_*ibi的帖子

为什么SDL定义主宏?

在设置SDL时遇到一些问题后,我发现SDL定义了一个替换main的宏:

#define main SDL_main

// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);
Run Code Online (Sandbox Code Playgroud)

如果main函数没有定义argcargv参数,这也会产生编译错误.

当我看到它时,这个宏让我很头疼...为什么SDL需要重新定义主要?经过一番搜索,我找到了一些人#undef main,并以正常的方式使用它.

所以这就是问题: 为什么SDL需要重新定义main,它做什么?取消定义是否有任何副作用?

我注意到的一件事是SDL将标准输出和错误重定向到文件(我不想要这种行为),如果我取消定义主要行为,这种行为就会停止.

c++ program-entry-point sdl

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

如何使用MS SQL 2008获取数据库中的表列表?

我想验证一个表是否存在于数据库中,如果它不存在,则创建它.如何获取当前数据库中所有表的列表?

我可以用这样的SELECT获取数据库列表:

SELECT * FROM sys.databases
Run Code Online (Sandbox Code Playgroud)

剩下的就是创建表,如果它不存在.

我也尝试用这样的数据库同时创建表:

if not exists(select * from sys.databases where name = 'db')
begin 
    create database [db]
    use [db];
    create table [test] (
         Time datetime,
         Message varchar(1024) )
    end
Run Code Online (Sandbox Code Playgroud)

但它在'使用'行上给我错误,说'db'不存在.这一次,我将尝试在两个不同的命令中执行此操作.

sql select sql-server-2008

30
推荐指数
3
解决办法
12万
查看次数

是否可以在c ++中的命名空间中放置一个宏?

我的应用程序使用比标准输出日志信息,这就是为什么我写我自己的另一个输出Log(),Error(),Panic()Assert()功能.为了很好地组织事情,我将所有调试内容放在Debug命名空间中.

对于该Assert()函数来说,提供源文件和行号更有意义,这只能使用__LINE____FILE__宏来实现.然而,总是必须指定这两个参数,这是非常不愉快,低效等等.

所以这就是我的代码的样子:

namespace Debug {
   void Assert (int condition, std::string message, std::string file, int line);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以在Debug命名空间中放置一个包含这两个参数的宏?像这样:

namespace Debug {
   void Assert_ (int condition, std::string message, std::string file, int line);
   #define Assert(a,b) Assert_(a, b, __FILE__, __LINE__)
}

// .... Somewhere where I call the function ....
Debug::Assert (some_condition, "Some_condition should be true");

// Output: Assertion failed on line 10 in file …
Run Code Online (Sandbox Code Playgroud)

c++ macros namespaces

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

Internet Explorer使用彩色边框显示图像链接

我有以下链接的CSS代码:

a {
    text-decoration: none;
    color: #248AC9;
}

a:hover {
    color: #8DCFF7;
}
Run Code Online (Sandbox Code Playgroud)

问题是在Internet Explorer中,图像具有与"颜色"颜色相同的奇怪边框.我该如何解决这个问题,并正确地绘制图像.HTML代码很简单: <a href="calculator-operators.htm"><img src="img/link.png" /></a>

截图: 那么,我该如何解决这个问题呢?

html css internet-explorer image

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

Diamond-inheritance场景在G ++中编译很好,但在VC++/Eclipse中产生警告/错误

我有一个基类'Base',这是一个纯虚拟类:

class Base {

public:
    virtual void A() = 0;
    virtual void B() = 0;

    virtual ~Base() { } // Eclipse complains that a class with virtual members must have virtual destructor
};
Run Code Online (Sandbox Code Playgroud)

我还有另外两个类,其中一个实现了A(),另一个实现了B():

class DerivedA : public virtual Base
{
public:
    virtual void A() {
        printf("Hello from A");
    }
};

class DerivedB : public virtual Base
{
public:
    virtual void B() {
        printf("Hello from B");
    }
};
Run Code Online (Sandbox Code Playgroud)

声明中的虚拟关键字应解决钻石问题.

现在我想将这两个类组合成另一个类,以便实现A()和B(),如下所示:

class DerivedC: public DerivedA, public DerivedB {
     // Now DerivedA …
Run Code Online (Sandbox Code Playgroud)

c++ oop class multiple-inheritance virtual-inheritance

14
推荐指数
2
解决办法
1606
查看次数

如何在c ++类中使用模板专业化,以及为什么不编译?

我正在研究一个XmlWriter类,我希望能够以大多数标准数据格式(字符串,整数,浮点数等)输出属性或文本.为此,我使用的是文件流.

对于bool数据类型,我想指定模板的特化,以便输出truefalse不是10.

但是,以下代码似乎没有编译:

class XmlWriter {

private: /* ... */

public: /* ... */

    template <typename T>
    void writeText(T text)  {
        /* ... */
    }

    template <>  // <-- error: explicit specialization in non-namespace scope 'class Strategy::IO::XmlWriter'
    void writeText<bool> (bool text) {  // <-- error: template-id 'writeText<>' in declaration of primary template
        /* ... */
    }

    template <typename T> 
    void writeAttribute(std::string key, T value) { // <-- error: …
Run Code Online (Sandbox Code Playgroud)

c++ templates class template-specialization

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

将天数转换为年数(包括闰年)的高效算法

问题

我正在编写一个用c ++保存日期的类,我发现了以下问题:

N自参考日期(在我的情况下将是公元0001年1月1 日)以来有多天,包括自参考日以来经过的闰日.我怎么能转换这个数字到一年Y,月M和日D有效

我想尽可能高效地完成这项工作,因此最佳实现显然会具有O(1)复杂性.

接下来的部分将解释我已经学到的一些东西.

闰年

要确定一年是否跳跃,有一些规则:

  1. 可被4整除的年份是飞跃
  2. 规则1的例外:可以被100整除的年份不是跳跃
  3. 规则2的例外:可以被400整除的年份是飞跃

这将转换为这样的代码:

bool IsLeapYear(int year)
{
    // Corrected after Henrick's suggestion
    if (year % 400 == 0) return true;
    if ((year % 4 == 0) && (year % 100 != 0)) return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

计算一年前飞跃多少年的有效方法是:

int LeapDaysBefore(int year)
{
    // Years divisible by 4, not divisible by 100, but divisible by 400
    return ((year-1)/4 - (year-1)/100 + …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm time

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

如何以编程方式隐藏桌面图标?

如何使用C#以编程方式显示/隐藏桌面图标?

我正在尝试创建一个使用小部件的替代桌面,我需要隐藏旧图标.

.net c# desktop icons show-hide

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

C#中的相当重要的名字(表格)

我有一个由Keys枚举(winforms)填充的组合框.

问题是对于没有经验的用户来说,关键名称不是很明确.例如,普通用户可能不知道"OemPipe"或"HanjaMode"的含义.那么,我该如何解决这个问题,并拥有一些更好的密钥名称?

我正在考虑用键和它们的名字制作一本字典,但是自己填写字典非常耗时.

c# forms keyboard winforms

6
推荐指数
2
解决办法
4540
查看次数

如何在3D空间中正确移动相机?

我想做的事:

我试图弄清楚如何使相机像这样工作:

  • 鼠标移动:相机旋转
  • 上/下键:相机向前/向后移动; 向前表示相机朝向的方向
  • 左/右键:摄像机侧向移动
  • Q/E键:相机上下移动

由于我有很多代码,我会尽力解释我是如何做到的,没有太多代码.我正在研究的项目非常庞大,并且有一个非常大的库,其中包含许多类和类型,这使得它很难理解.

问题

我已经成功地完成了这项工作,但是在稍微移动一点之后,在某些角度,事情开始失败:当按下Up时,相机会侧向移动,依此类推.

我想到的算法将在下面详细解释.

问题是,我做错了吗?什么可能使它失败?我整天都试着调试这台相机,但还没弄清楚是什么让它失败了.

澄清

  • 这就是我理解旋转的方式:一个3D矢量(可能不正确地称为矢量),其中每个组件表示对象围绕其旋转的轴.例如,X值将是对象围绕X轴旋转的程度.因为我在OpenGL中工作,所以旋转值将以(不是弧度)为单位.

  • 渲染相机时,我只是翻译相机位置,但符号相反.

同样适用于轮换:

glRotatef(-currentCamera->Rotation().X, 1.0f, 0, 0);
glRotatef(-currentCamera->Rotation().Y, 0, 1.0f, 0);
glRotatef(-currentCamera->Rotation().Z, 0, 0, 1.0f);
glTranslatef(-currentCamera->Position().X, -currentCamera->Position().Y, -currentCamera->Position().Z);
Run Code Online (Sandbox Code Playgroud)

我尝试了什么(并没有奏效):

我尝试使用简单的几何和数学,使用毕达哥拉斯定理和简单的三角函数,但它失败了,所以我不再试图让它工作.(例如,如果任何旋转坐标为0,则为NaN结果).

我尝试了什么(并且做得很好......差不多):

使用转换矩阵.

当用户按下任何键时,会生成一个3d矢量:

+X = right; -X = left
+Y = top; -Y = bottom
+Z = backward (towards camera); -Z = forward (away from camera)
Run Code Online (Sandbox Code Playgroud)

接下来,我生成一个变换矩阵:对于3个坐标中的每一个(X然后是Y,然后是Z),将身份(4×4矩阵)乘以旋转矩阵3次.接下来,我将矩阵应用于我创建的矢量,然后将结果添加到摄像机的旧位置.

但是,这种方法似乎存在问题.起初它工作得很好,但过了一会儿,当我按下它时,它会侧身而不是应该的方式.

实际代码

如上所述,我尝试使用尽可能少的代码.但是,如果这不够有用,这里有一些实际的代码.我尽力选择最相关的代码.

// ... Many headers

// 'Camera' is a class, which, among other things, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl math 3d sdl

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