小编Gay*_*yan的帖子

导出DLL中的静态数据

我有一个DLL,其中包含一个静态成员的类.我用__declspec(dllexport)它来使用这个类的方法.但是当我将它链接到另一个项目并尝试编译它时,我得到静态数据的"未解析的外部符号"错误.

例如,在DLL中,Test.h

class __declspec(dllexport) Test{
protected:
    static int d;
public:
    static void m(){int x = a;}
}
Run Code Online (Sandbox Code Playgroud)

在DLL中,Test.cpp

#include "Test.h"

int Test::d;
Run Code Online (Sandbox Code Playgroud)

在使用Test的应用程序中,我调用m().

我也尝试分别为每个方法使用__declspec(dllexport),但我仍然得到静态成员的相同链接错误.

如果我使用dumpbin检查DLL(.lib),我可以看到符号已导出.

例如,应用程序在链接时给出以下错误:

1>Main.obj : error LNK2001: unresolved external symbol "protected: static int CalcEngine::i_MatrixRow" (?i_MatrixRow@CalcEngine@@1HA)
Run Code Online (Sandbox Code Playgroud)

但是.lib的dumpbin包含:

Version      : 0
  Machine      : 14C (x86)
  TimeDateStamp: 4BA3611A Fri Mar 19 17:03:46 2010
  SizeOfData   : 0000002C
  DLL name     : CalcEngine.dll
  Symbol name  : ?i_MatrixRow@CalcEngine@@1HA (protected: static int CalcEngine::i_MatrixRow)
  Type         : data
  Name type    : …
Run Code Online (Sandbox Code Playgroud)

c++ windows linker-errors dllexport

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

生成球体的顶点

在DirectX移动照明示例中,以下列方式生成圆柱体:

for( DWORD i=0; i<50; i++ )
            {
                FLOAT theta = (2*D3DMX_PI*i)/(50-1);
                pVertices[2*i+0].position = D3DMXVECTOR3( (float)sin(theta),-1.0f, (float)cos(theta) );
                pVertices[2*i+0].normal   = D3DMXVECTOR3( (float)sin(theta), 0.0f, (float)cos(theta) );
                pVertices[2*i+1].position = D3DMXVECTOR3( (float)sin(theta), 1.0f, (float)cos(theta) );
                pVertices[2*i+1].normal   = D3DMXVECTOR3( (float)sin(theta), 0.0f, (float)cos(theta) );
            }
Run Code Online (Sandbox Code Playgroud)

是否有类似的方法在DirectX Mobile中生成球体的顶点(如三角形条带或其他方式)?(AFAIK没有D3DMXCreateSphere方法)


最后的解决方案.感谢四分之一的帮助.

void CreateSphere()
{
    const int iFactor = 20;
    int iPos = 0;

    arr_Vertices = new CUSTOMVERTEX[ui_VCount];
    ui_ShapeCount = iFactor *iFactor * 2; // use when rendering

    float arrV[iFactor* iFactor][3];

    for (DWORD j= 0; j < iFactor; j …
Run Code Online (Sandbox Code Playgroud)

c++ directx 3d

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

二维插值算法

我有两个形状,它们是一个通道的横截面.我想计算两个定义点之间的中间点的横截面.在这种情况下使用的最简单(相对简单?)算法是什么?

PS:我遇到了几个算法,比如自然邻居和泊松,这看起来很复杂.我正在寻找一个可以快速实施的简单解决方案.

编辑:我从标题中删除了"最简单"这个词,因为它可能会产生误导

algorithm geometry interpolation coordinates

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

覆盖关于调用者的"新"和记录数据

我正在尝试编写内存分析器,到目前为止我已经能够使我的自定义函数适用于malloc,free,new和delete.我尝试使用__FILE____LINE__在重载的新方法中记录发起者,但是(正如预期的那样)它只是给出了重载函数的详细信息.有没有办法在没有对正在测试的组件的现有代码进行任何更改的情况下(例如#malline for malloc)对重载函数获取有关创建者的详细信息?

我正在使用的功能是:

void* operator new (size_t size)
{
    if(b_MemProfStarted)
    {
        b_MemProfStarted = false;
        o_MemLogFile << "NEW: " << "| Caller: "<< __FILE__ << ":"
                << __LINE__ << endl;
        b_MemProfStarted = true;
    }

    void *p=malloc(size);
    if (p==0) // did malloc succeed?
    throw std::bad_alloc(); // ANSI/ISO compliant behavior

    return p;
}
Run Code Online (Sandbox Code Playgroud)

bool b_MemProfStarted用于避免对ofstream和map.insert的递归调用.

c++ malloc new-operator

5
推荐指数
1
解决办法
2440
查看次数

NULL指针与static_cast的兼容性

Q1.为什么使用带有static_cast的NULL指针会导致崩溃,而dynamic_cast和reinterpret_cast会返回一个NULL指针?

问题发生在类似于下面给出的方法中:

void A::SetEntity(B* pEntity, int iMyEntityType)
{   
    switch (iMyEntityType)
    {   
    case ENTITY1:
        {
            Set1(static_cast<C*>(pEntity));
            return;
        }
    case ENTITY2:
        {
            Set2(static_cast<D*>(pEntity));
            return;
        }
    case ENTITY3:
        {
            Set3(static_cast<E*>(pEntity));
            return;
        }   
    }
}

Inheritance:
  class X: public B
  class Y: public B
  class Z: public B

  class C: public X, public M
  class D: public Y, public M
  class E: public Z, public M
Run Code Online (Sandbox Code Playgroud)

Q2.从B到C/D/E的static_casting是否有效?(这个工作正常,直到输入变为NULL)

我正在使用gcc 3.4.3版

c++ casting

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

使用Precision的字符串到整数哈希函数

我想将一个char数组哈希到一个int或long.结果值必须符合给定的精度值.我一直在使用的功能如下:

int GetHash(const char* zKey, int iPrecision /*= 6*/)
{
        /////FROM : http://courses.cs.vt.edu/~cs2604/spring02/Projects/4/elfhash.cpp

        unsigned long h = 0;
        long M = pow(10, iPrecision);

        while(*zKey)
        {
                h = (h << 4) + *zKey++;
                unsigned long g = h & 0xF0000000L;
                if (g) h ^= g >> 24;
                h &= ~g;
        }            

        return (int) (h % M);
}
Run Code Online (Sandbox Code Playgroud)

要哈希的字符串类似于"SAEUI1210.00000010_1".

但是,在某些情况下,这会产生重复值.是否有任何好的替代方案不会为不同的字符串值复制相同的哈希值.

c++ hash

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

在Shell脚本中使用带有sed的变量

我正在编写一个shell脚本来编辑aegis的Change-Set属性.我正在使用的命令是:

aegis -Change_Attributes -Edit
Run Code Online (Sandbox Code Playgroud)

这打开了一个vi编辑器来执行更改.我想做一个搜索并替换:

s/brief_description \= \"none\"\;/brief_description \=
Run Code Online (Sandbox Code Playgroud)

\ "测试\"/克

我可以通过脚本将这些直接传递给open vi实例而无需输入任何内容吗?我想在编辑后保存文档(:wq).

PS该文件是执行命令时创建的临时文件,因此我不知道原始路径

编辑:在这种情况下我可以使用sed:

sed -e 's/brief_description\ \=\ \"none\"\;/brief_description\ \=\
Run Code Online (Sandbox Code Playgroud)

\ "测试\" \;/G"

解决方案(不优雅的黑客??)将"cat"来自aegis(setenv VISUAL cat)的输出,使用上述命令修改输出流并将其保存到临时文件,并使用:

aegis -change_attributes -file <temp file>
Run Code Online (Sandbox Code Playgroud)

编辑2:我几乎得到了它的工作.但是我使用的方式存在问题sed

我的脚本中有以下行:

sed -i 's/brief_description\ \=\ \"none\"\;/brief_description\ \=\ \"${DESC}\"\;/g' temp_next.txt
Run Code Online (Sandbox Code Playgroud)

但$ DESC变量不评估其值,输出值为:

brief_description ="$ {DESC}";

我怎样才能将DESC传递给sed,它会评估它的实际值?

EDIT3:

运用

sed -i 's%brief_description\ \=\ \"none\"\;%brief_description\ \=\ \"'"$DESC"'\"\;%g' temp_next.txt
Run Code Online (Sandbox Code Playgroud)

工作.我用%替换正常分隔符(/)并将环境变量放在双引号中.

shell sed

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

在csh Shell脚本中读取带有空格的用户输入

我有一个脚本,用户可以在其中输入带空格的字符串。到目前为止,我有:

#bin/csh

echo "TEST 1"
echo -n "Input : "
set TEST = $<

echo "Var | " $TEST

set TEST=`echo $TEST`

echo "Var after echo | " $TEST

set TEST=`echo $TEST | sed 's/ /_/g'`

echo "Var after change | " $TEST
Run Code Online (Sandbox Code Playgroud)

如果我在“输入”中输入字符串“ rr r”,则$ TEST仅取“ r”。我希望能够将$ TEST设置为“ rr r”。这可能吗?如果输入“ 1 1 1”之类的字符串,则会出现错误:

设置:变量名必须以字母开头。

这是什么原因?

shell csh

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

乘以定义的符号

如果我在头文件中声明一个全局变量并将其包含在两个.cpp文件中,则链接器会给出一个错误,指出该符号是多重定义的.我的问题是,为什么这只发生在某些类型的对象(例如int)而不是其他类型(例如enum)?

我使用的测试代码如下:

test.h

#ifndef TEST_HEADER
#define TEST_HEADER

namespace test
{           
        int i_Test1 = -1;
        int i_Test2 = -1;
};

#endif // TEST_HEADER
Run Code Online (Sandbox Code Playgroud)

class1.h

#ifndef CLASS_1_HEADER
#define CLASS_1_HEADER

class class1
{
public:
        void count();
};

#endif //CLASS_1_HEADER
Run Code Online (Sandbox Code Playgroud)

class1.cpp

#include <iostream>
#include "class1.h"
#include "test.h"

void class1::count()
{
        std::cout << test::i_Test1 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

class2.h

#ifndef CLASS_2_HEADER
#define CLASS_2_HEADER

class class2
{
public:
        void count();
};

#endif //CLASS_2_HEADER
Run Code Online (Sandbox Code Playgroud)

class2.cpp

#include "class2.h"
#include <iostream>
#include "test.h"

void class2::count()
{
        std::cout << test::i_Test2 << …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction

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

使用pthread条件在结构中等待

我之前询问过如何在不使用pthread_join的情况下同步两个线程,我可以使用pthread_cond_wait和pthread_cond_signal来解决它.我写了一个小结构来将这个功能捆绑到一个地方:

struct ConditionWait
{
    int                 i_ConditionPredicate;
    pthread_mutex_t     lock_Var;
    pthread_cond_t      cond_Var;
    int                 i_ValidResult;

    ConditionWait()
    {
        pthread_mutex_init(&lock_Var, NULL);
        pthread_cond_init(&cond_Var, NULL);
        i_ValidResult = 1;
        i_ConditionPredicate = 0;
    }

    void Signal()
    {
        pthread_mutex_lock(&lock_Var);
        i_ConditionPredicate = i_ValidResult;
        pthread_cond_signal(&cond_Var);
        pthread_mutex_unlock(&lock_Var);
    }

    void Wait()
    {
        pthread_mutex_lock(&lock_Var);

        while(i_ConditionPredicate != i_ValidResult)
        {
            pthread_cond_wait(&cond_Var, &lock_Var);
        }
        pthread_mutex_unlock(&lock_Var);
    }
};
Run Code Online (Sandbox Code Playgroud)

假设我从两个不同的线程调用Wait()和Signal(),这将是线程安全的.在同一个对象的两个函数中使用相同的锁会导致死锁或竞争条件吗?

编辑:我现在在我的程序中使用它,它工作正常.我不太确定这是不是运气

c++ pthreads

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

最小化后窗口不会显示(最大化)

我有一个Windows CE应用程序,它记录移动设备的击键.有一个初始化录制功能的按钮,通过调用强制主窗口最小化:

ShowWindow (hWnd, SW_MINIMIZE);
Run Code Online (Sandbox Code Playgroud)

在最小化窗口之前,我注册到触发按钮事件(通过自定义API).当应用程序最小化时,我执行一些按钮单击并按下触发按钮以结束会话.当我收到触发按钮事件时,我打电话给:

ShowWindow (hWnd, SW_MAXIMIZE);
Run Code Online (Sandbox Code Playgroud)

问题是窗口没有达到最大化.如果我调试应用程序,我可以看到调用ShowWindow函数.我可以通过切换到应用程序,通过TaskManager将它带到前台.

有人可以解释一下这个原因,并建议我可以采取任何解决方案吗?

编辑:解决方案:在调用ShowWindow之前调用"SetForegroundWindow"并使用SW_RESTORE而不是SW_MAXIMIZE.SW_MAXIMIZE不起作用.

SetForegroundWindow (g_hWndMain);
ShowWindow (g_hWndMain, SW_RESTORE);
Run Code Online (Sandbox Code Playgroud)

c++ winapi windows-ce

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

等待pthread_create完成而不使用pthread_join

我想暂停一个线程,直到另一个线程完成初始化而不使用pthread_join.我尝试使用连接,但由于我们拥有一些异步的线程间通信系统,它会导致死锁.现在,我正在使用(自定义)锁来实现这一目标.

在线程1中:

lock_OfflineWorker.Lock()
if (pthread_create(&tid0, NULL, RunOfflineWorker, NULL) != 0)
{
}

lock_OfflineWorker.TryLock();
lock_OfflineWorker.Unlock();
Run Code Online (Sandbox Code Playgroud)

在线程2中:

bool OfflineWorker::Initialize()
{
  lock_OfflineWorker.Unlock();
}
Run Code Online (Sandbox Code Playgroud)

但这是不优雅的,我不太确定副作用(另一种僵局的可能性).这个可以吗?如果没有,是否有另一种方法来实现这一点(使用锁或其他)

编辑:忘记包括"RunOfflineWorker"功能

void* RunOfflineWorker(void* pData)
{   
  g_OfflineWorker.Initialize();
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading

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