如何将包含交错浮点数的设备数组转换为推力矢量运算的CUDA推力元组.
目的:我使用CUDA上的Marching Cubes生成一个粗略的顶点列表.输出是顶点列表,具有冗余且无连接.我希望得到一个唯一顶点的列表,然后得到这些独特顶点的索引缓冲区,所以我可以执行一些操作,如网格简化等...
float *devPtr; //this is device pointer that holds an array of floats
//6 floats represent a vertex, array size is vertsCount*6*sizeof(float).
//format is [v0x, v0y, v0z, n0x, n0y, n0z, v1x, v1y, v1z, n1x, ...]
typedef thrust::tuple<float, float, float, float, float, float> MCVertex;
thrust::device_vector<MCVertex> inputVertices(vertsCount);
//copy from *devPtr to inputVertices.
//use something like unique to get rid of redundancies.
thrust::unique(inputVertices.begin(), inputVertices.end());
Run Code Online (Sandbox Code Playgroud)
我如何实现副本,还是有其他更好的方法来做到这一点?
我有一个"数据提供者",它将其输出存储在某种类型的结构中
struct DATA_TYPE1{
std::string data_string;
};
Run Code Online (Sandbox Code Playgroud)
那么这个结构必须被转换成一般的数据类型,我想到了void*或char*,因为将它复制并存储在二叉树中的"中间"对象应该能够存储许多不同类型的这种结构数据.
struct BINARY_TREE_ENTRY{
void * DATA;
struct BINARY_TREE_ENTRY * next;
};
Run Code Online (Sandbox Code Playgroud)
然后,此void*由另一个将void*转换回(struct DATA_TYPE1*)以获取原始数据的对象获取.所以发件人和收件人都知道数据类型DATA_TYPE1,而不知道中间的复制对象.
但是,当不知道数据类型时,中间对象如何深层复制不同结构的内容,只有void*并且它没有复制真实内容的方法; dynamic_cast不适用于void*;
"中间"对象应该做的事情如下:
void store_data(void * CASTED_DATA_STRUCT){
void * DATA_COPY = create_a_deepcopy_of(CASTED_DATA_STRUCT);
push_into_bintree(DATA_COPY);
}
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方案是发送对象不会删除发送的数据结构,直到接收对象获得它,但是在接收者从中间对象获取数据之前动态创建和删除发送对象,以进行异步通信,因此我想复制它.
而不是将其转换为void*我也尝试转换为中间复制对象知道的超类指针,并且由结构的所有不同数据类型继承:
struct DATA_BASE_OBJECT{
public:
DATA_BASE_OBJECT(){}
DATA_BASE_OBJECT(DATA_BASE_OBJECT * old_ptr){
std::cout << "this should be automatically overridden!" << std::endl;
}
virtual ~DATA_BASE_OBJECT(){}
};
struct DATA_TYPE1 : public DATA_BASE_OBJECT {
public:
string str;
DATA_TYPE1(){}
~DATA_TYPE1(){}
DATA_TYPE1(DATA_TYPE1 * old_ptr){
str = old_ptr->str;
}
};
Run Code Online (Sandbox Code Playgroud)
然后相应的二进制树条目将是:
struct BINARY_TREE_ENTRY{
struct DATA_BASE_OBJECT * …Run Code Online (Sandbox Code Playgroud) 当我遇到数据运算符时,我只是在阅读有关向量的内容.在下面的示例中,正在使用数据运算符.
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (5);
int* p = myvector.data();
*p = 10;
++p;
*p = 20;
p[2] = 100;
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size(); ++i)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
myvector contains: 10 20 0 100 0
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么0在100和100的位置向后移动一个位置.如:
p是等值的myvector[0],给定值10.++p;现在p指向给myvector[1]定的价值2020,100应该来,为什么会这样0.像许多使用 Boost ASIO 库的人一样,我收到了“WinSock.h 已经包含在内”的错误消息。在其他帖子中,通过将 #include 行移到 #include 上方来回答问题
就我而言,我正在处理一个使用 Wx Widgets 的项目,并且似乎与 MFC 没有任何连接,也没有与 Win32 的直接连接。我找不到任何对 windows.h 的调用,也找不到任何相关的调用。我也试过使用 WIN32_LEAN_AND_MEAN 和 BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN 声明。
我想知道是否有人在编写 Wx Widgets 项目时遇到了与 Boost ASIO 类似的问题?如果是这样,您是否能够解决 Winsock 错误?
这是一个简单的游戏,我正在尝试学习如何在现有项目中应用C++(这就是我学习的最佳方式),我有使用C#和其他高级语言编程的经验,所以这对我来说还是很新的.所以我有这个比赛列表:
const char* Races[] = {
"Demon",
"Human",
"Elf",
"Orc",
"Aliens"
};
Run Code Online (Sandbox Code Playgroud)
有一次,我收到了用户的注册,并选择了比赛.我将用户的所有信息保存到结构中,我也希望将比赛的全名保存到此结构中.
struct User_t {
unsigned int RaceID;
char Race[16];
};
Run Code Online (Sandbox Code Playgroud)
以下代码是我将结构中的值放入的代码:
User_t User;
User.RaceID = 3;
strcpy(User.Race, Races[User.RaceID]);
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.这是游戏的一部分,异常处理非常糟糕(它基本上会在没有任何错误可见的情况下崩溃游戏).我想弄清楚我做错了什么.有什么建议,也许是对其他事情的建议吗?
我发现了std :: wstring的一些非常奇怪的行为.
#include "stdafx.h"
#include <string>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
std::wstring someString = L"Some dummy string";
std::wstring base1 = L"Base1 ";
std::wstring base2 = L"Base2 ";
std::wstring second = L"Second";
base1 += second.at(0) + L" ";
base2 += second.at(0);
base2 += L" ";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
base1和base2输出应该相同,但没有.Base1实际上不起作用.
有任何想法吗?
以下程序输出是正确的,但是当我使用它代替*this时会出现错误.任何人都可以告诉我这是什么和*这意味着什么
#include<iostream>
using namespace std;
class Test
{
private:
static int count;
public:
Test& fun(); // fun() is non-static now
};
int Test::count = 0;
Test& Test::fun()
{
Test::count++;
cout<<Test::count<<" ";
return *this;
}
int main()
{
Test t;
t.fun().fun().fun().fun();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1 2 3 4
Run Code Online (Sandbox Code Playgroud)
当我使用它代替*这个错误来:
In member function 'Test& Test::fun()':
invalid initialization of non-const reference of type 'Test&' from an rvalue of type 'Test*'
return this;
Run Code Online (Sandbox Code Playgroud)
有人能告诉我这和*之间的区别是什么?
我有一个体素结构:
struct voxel
{
unsigned char R, G, B;
voxel()
{
R = G = B = 0;
}
//parameteric contructor with parameters
voxel(unsigned char pR, unsigned char pG, unsigned char pB)
{
R = pR; G = pG; B = pB;
}
};
Run Code Online (Sandbox Code Playgroud)
对于体素的数量,我有一个非常大的n.
int n = 300 * 300 * 300;
Run Code Online (Sandbox Code Playgroud)
现在,当我用向量初始化体素时,RAM大约需要79 MB.
std::vector< voxel > vi(n);
Run Code Online (Sandbox Code Playgroud)
但是当我使用shared_ptr和堆栈溢出以这种方式初始化时,它需要超过2 GB.
std::vector< std::shared_ptr<voxel> > vi(n);
for (size_t i = 0; i < n; i++)
{
vi.push_back(std::shared_ptr<voxel>(new voxel()));
}
Run Code Online (Sandbox Code Playgroud)
这种行为可能是什么原因,我该如何避免呢?
补充说明: …
我的学校作业有问题,如下所示:
"编写一个程序,重复询问用户输入一个数字,如果用户的输入为0,并且循环结束,则打印数组中的最后5个数字.如果扫描的数字少于5个,则未使用的值必须为0"
它应该看起来像这样:

这是我的代码:
int main()
{
int i, array[4] = {};
while(1)
{
printf("Next number: <0 = quit>: ");
scanf("%i", &i);
if(i!=0)
{
array[0] = array[1];
array[1] = array[2];
array[2] = array[3];
array[3] = array[4];
array[4] = i;
}
else
break;
}
for(i=0; i<=4; i++)
{
printf("Number %i is: %i\n", i+1, array[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我打印数字时,最后一个数字(数组[4])是0.
我究竟做错了什么?
我正在开发一个简单的iOS 9应用程序(使用Swift和Xcode 7.01),它使用Timehop样式界面显示与当天相对应的数据,可以追溯到X年.
我想在第一个运行时播种我的CoreData模型,在第一个运行时(或稍后在用户首选项中更改)基于用户选择的选项使用特定数据填充它.但是,我希望导入整个数据源,以便在更改用户首选项时可以使用不同的数据
我要迁移到CoreData的当前数据源目前是CSV格式.我的问题是,用于导入/播种到CoreData的最简单的文件格式是什么,执行这样的任务时是否有任何最佳实践,并且是否有正确的方向我可以进行实施?