小编Ben*_*igt的帖子

如何从C#调用C++类

我想我必须创建一个托管C++代码来包装本机C++.但是我在尝试包装函数参数中使用的数组时遇到了问题,该数组的类型是在本机C++中定义的.本机C++代码如下:

//unmanageCPP.h
class __declspec(dllexport) unmanageMoney
{
public:
    unmanageMoney(int a, int b) { rmb = a; dollar = b; }
    unmanageMoney() { rmb = 0; dollar = 0; }
    int rmb;
    int dollar;
};

class __declspec(dllexport) unmanageSum
{
public:
    //how to wrap this funciton?
    int addDollar(unmanageMoney a[], unmanageMoney b[]);
};

//unmanageCPP.cpp
#include "unmanaged.h"

int unmanageSum::adddollar(unmanageMoney a[], unmanageMoney b[])
{
    return a[0].dollar + b[0].dollar;
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何编写manageCPP.h?非常感谢!

更新

我按如下方式编写manageCPP.h,但我不知道如何编写addDollar()

//first, I wrap the class unmanageMoney for use in manageSum::addDollar()
public ref class manageMoney …
Run Code Online (Sandbox Code Playgroud)

c# c++ c++-cli

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

混合模式C++/CLI崩溃:atexit中的堆损坏(静态析构函数注册)

我正在部署一个程序,代码库是C++/CLI和C#的混合体.C++/CLI有各种风格:native,mixed(/clr)和safe(/clr:safe).在我的开发环境中,我创建了一个包含所有C++/CLI代码的DLL,并从C#代码(EXE)引用它.这种方法完美无瑕.

对于我的发行版,我想发布一个可执行文件(只是声明"为什么不只是将DLL和EXE分开?"是不可接受的).

到目前为止,我已经成功地用所有不同的来源编译EXE.但是,当我运行它时,我得到"XXXX已停止工作"对话框,其中包含检查在线,关闭和调试的选项.问题详情如下:

Problem Event Name:       APPCRASH
Fault Module Name:        StackHash_8d25
Fault Module Version:     6.1.7600.16559
Fault Module Timestamp:   4ba9b29c
Exception Code:           c0000374
Exception Offset:         000cdc9b
OS Version:               6.1.7600.2.0.0.256.48
Locale ID:                1033
Additional Information 1: 8d25
Additional Information 2: 8d25552d834e8c143c43cf1d7f83abb8
Additional Information 3: 7450
Additional Information 4: 74509ce510cd821216ce477edd86119c
Run Code Online (Sandbox Code Playgroud)

如果我调试并将其发送到Visual Studio,它会报告:

Unhandled exception at 0x77d2dc9b in XXX.exe: A heap has been corrupted
Run Code Online (Sandbox Code Playgroud)

选择中断会导致它停在ntdll.dll!77d2dc9b(),没有其他信息.如果我告诉Visual Studio继续,程序启动正常并且似乎没有发生任何事故,可能是因为现在附加了调试器.

你是怎么做到的?如何避免这种堆损坏?该程序似乎工作正常,除此之外.

我的删节编译脚本如下(为简洁起见,我省略了错误检查):

@set TARGET=x86
@set TARGETX=x86
@set OUT=%TARGETX%
@call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" %TARGET%

@set WIMGAPI=C:\Program Files\Windows …
Run Code Online (Sandbox Code Playgroud)

c# linker program-entry-point c++-cli atexit

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

在OpenGL中使用index作为坐标

我想实现一个时间序列查看器,允许用户缩放和平滑地平移.

我以前做过一些立即模式的opengl,但现在已经弃用了VBO.我可以找到的所有VBO示例都存储了每个点的XYZ坐标.

我怀疑我需要将所有数据保存在VRAM中以便在平移期间获得一个可以称为"平滑"的帧速率,但我只有Y数据(因变量).X是一个可以从索引计算的自变量,Z是常数.如果我必须存储X和Z,那么我的内存要求(缓冲区大小和CPU-> GPU块传输)都会增加三倍.我有数千万个用户可以通过其平移的数据点,因此内存使用量将是非常重要的.

是否有一些技术可用于绘制1-D顶点数组,其中索引用作另一个坐标,或存储1-D数组(可能在纹理中?)并使用着色器程序生成XYZ?我的印象是在新的固定无特征管道模型下我需要一个简单的着色器来实现缩放和平移,所以如果我可以组合X和Z坐标的生成以及Y的缩放/平移理想.

这甚至可能吗?你知道这样做的任何示例代码吗?或者你至少可以给我一些假代码来说明什么GL函数以什么顺序调用?

谢谢!

编辑:为了确保这一点清楚,这里是等效的立即模式代码和顶点数组代码:

// immediate
glBegin(GL_LINE_STRIP);
for( int i = 0; i < N; ++i )
    glVertex2(i, y[i]);
glEnd();

// vertex array
struct { float x, y; } v[N];
for( int i = 0; i < N; ++i ) {
    v[i].x = i;
    v[i].y = y[i];
}
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawArrays(GL_LINE_STRIP, 0, N);
Run Code Online (Sandbox Code Playgroud)

请注意,v[]它的大小是y[].

opengl plot shader vbo opengl-3

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

特定模板特化的重载成员函数

我有一个类tPoint,可以实现具有不同的基类型

template<typename T>class tPoint{
   T x;
   T y;
public:
   void Set(T ix, T iy){x=ix;y=iy;}
};
Run Code Online (Sandbox Code Playgroud)

当类型T是int时tPoint<int>,我想要一个特殊的Set(float,float),所以我可以在赋值之前舍入值.

我认为,通过专业化,我可以:

template<> void tPoint<int>::Set(float ix,float iy){x=ix+.5; y=iy+.5;}
Run Code Online (Sandbox Code Playgroud)

这样编译器就会抱怨类定义中没有匹配的函数.

但是如果我在类Set(float,float)中声明它然后它已经定义了(当它为T = float编译时)

我希望我明确表示,对此采取干净的做法或者我做错了什么?谢谢!

c++ templates specialization

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

任何cpu和x64之间的托管代码引用

我有一个混合模式C++/CLI项目,编译为x86和x64冻结dll.

我有一个需要使用这个项目的C#应用​​程序,编译为"任何CPU".如何从c#app正确引用正确的dll?如果我右键单击添加引用,我必须只选择2个dll中的一个.
我的"任何CPU"C#应用程序有时会运行为x64,有时运行为x86进程.

我听说你可以通过智能配置文件来做到这一点.

.net c# mixed-mode c++-cli

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

没有调用终结器

我在C#中有一个类,我想在我的课程处理时正确地关闭一些通信端口.但是,退出程序时永远不会调用终结器.这是为什么?难道我做错了什么?

我正在手动调用dispose,它会通过并关闭所有通信.这也没有解雇.

这是我正在使用的终结器:

~Power()
{
    Dispose(false);
}
Run Code Online (Sandbox Code Playgroud)

c# finalizer

5
推荐指数
3
解决办法
4936
查看次数

为什么VS2008 std :: string.erase()会移动它的缓冲区?

我想逐行读取文件并捕获一个特定的输入行.为了获得最大性能,我可以通过读取整个文件并使用指针迭代其内容以低级方式执行此操作,但此代码对性能不重要,因此我希望使用更具可读性和类型安全的标准库样式实现.

所以我拥有的是:

 std::string line;
 line.reserve(1024);
 std::ifstream file(filePath);
 while(file)
 {
    std::getline(file, line);
    if(line.substr(0, 8) == "Whatever")
    {
        // Do something ...
    }
 }
Run Code Online (Sandbox Code Playgroud)

虽然这不是性能关键代码,但我在解析操作之前调用了line.reserve(1024)来排除字符串的多次重新分配,因为读入较大的行.

在std :: getline里面,在添加每行的字符之前删除字符串.我逐步完成了这段代码,以满足自己每次迭代都没有重新分配内存,我发现这些内容让我的大脑充满了热情.

深入string :: erase而不是仅将其size变量重置为零实际上正在调用memmove_s,其指针值会覆盖缓冲区的使用部分,紧跟其后的缓冲区的未使用部分,除了memmove_s正在使用count参数调用零,即请求移动零字节.

问题:

为什么我想在我可爱的循环中调用库函数调用的开销,特别是那个被调用什么都没做的东西?

我自己还没有选择它,但在什么情况下,这个调用实际上什么都不做,但实际上会开始移动大块的缓冲区?

为什么这样做呢?

奖金问题:C++标准库标签是什么?

c++ visual-studio-2008 c++-standard-library

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

使用指向char的指针时访问冲突写入位置

我正在写一个非常简单的程序,从字符串中删除重复的字符.我运行了visual studio并得到了错误:

inteviews.exe中0x00d110d9处的未处理异常:0xC0000005:访问冲突写入位置0x00d27830.

我真的不明白这是什么问题.当前单元格获取下一个单元格的值.

void remove(char *str, char a) {
    while (*str != '\0') {
        if (*(str+1) == a) {
            remove(str + 1, a);
        }

        *str = *(str +1 );//HERE I GET THE ERROR
        ++str;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    char *str = "abcad";

    while (*str != '\0') {
        remove(str,*str);
        str++;
    }

    std::cout << str << std::endl;

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

编辑:

我已经尝试将其更改为char str[] = "abcad"但我仍然得到相同的错误.

c++ string c-strings

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

仿函数成员中的状态数据与全局函数

在比较函数和函子时,经常提到函数函数的一个优点是函数是有状态的.

但是,在这段代码中,在我看来,一个函数也可能是有状态的.那么我在做什么/理解错误?

struct Accumulator
{
  int counter = 0;
  int operator()(int i)
  { 
    counter += i; 
    return counter;
  }
};

int Accumulate(int i)
{
  static int counter = 0;
  counter += i;

  return counter;
};

int main()
{
  Accumulator acc;
  std::vector<int> vec{1,2,3,4};
  Accumulator acc2 = std::for_each(vec.begin(), vec.end(), acc);
  int d1 = acc(0); // 0, acc is passed by value
  int d2 = acc2(0); // 10

  std::for_each(vec.begin(), vec.end(), Accumulate);
  int d4 = Accumulate(0); // 10

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

c++ static functor

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

sizeof std :: array是否等于普通旧数组的大小?

它有保证sizeof (std::array<T, N>) == N * sizeof (T)吗?

请提供C++标准的支持.

还有一个相关的问题有关std::tr1::array.


为了帮助您入门:

std::array是一个聚合.如果TPOD,那也是std::array<T, N>.这使它也成为标准布局.

应该有一些标准参考连接到禁止填充(允许对齐填充,但数组长度已经是其对齐的倍数).

c++ arrays containers language-lawyer

5
推荐指数
0
解决办法
105
查看次数