Tag: C#的

发送3D数组到CUDA内核

我把给出的代码作为答案我怎样才能使用嵌套for循环加起来两个2d(pitched)数组? 并试图使用它的3D而不是2D和稍微改变其他部分,现在看起来如下: __global__ void doSmth(int*** a) { for(int i=0; i<2; i++) for(int j=0; j<2; j++) for(int k=0; k<2; k++) a[i][j][k]=i+j+k; } int main() { int*** h_c = (int***) malloc(2*sizeof(int**)); for(int i=0; i<2; i++) { h_c[i] = (int**) malloc(2*sizeof(int*)); for(int j=0; j<2; j++) GPUerrchk(cudaMalloc((void**)&h_c[i][j],2*sizeof(int))); } int*** d_c; GPUerrchk(cudaMalloc((void****)&d_c,2*sizeof(int**))); GPUerrchk(cudaMemcpy(d_c,h_c,2*sizeof(int**),cudaMemcpyHostToDevice)); doSmth<<<1,1>>>(d_c); GPUerrchk(cudaPeekAtLastError()); int res[2][2][2]; for(int i=0; i<2; […]

在C#中的std ::string?

我认为这个问题在我的C ++函数中,但是我尝试了这个 在C ++中的C ++函数dll: bool __declspec( dllexport ) OpenA(std::string file) { return true; } C#代码: [DllImport("pk2.dll")] public static extern bool OpenA(string path); if (OpenA(@"E:\asdasd\")) 我得到一个例外,内存是腐败的,为什么? 如果我删除std :: string参数,它工作得很好,但与std ::string不起作用。

SIMD使用无符号乘法对64位* 64位到128位进行签名

我创build了一个使用SIMD 64位* 64位到128位的函数。 目前我已经使用SSE2(强大的SSE4.1)来实现它。 这意味着它同时执行两个64b * 64b到128b的产品。 同样的想法可以扩展到AVX2或AVX512同时提供四个或八个64b * 64到128b产品。 我基于我的algorithm在http://www.hackersdelight.org/hdcodetxt/muldws.c.txt 该algorithm执行一个无符号乘法,一个有符号乘法和两个有符号*无符号乘法。 使用_mm_mul_epi32和_mm_mul_epu32可以很容易地执行带符号的*无符号*无符号操作。 但混合签名和未签名的产品给我带来了麻烦。 考虑一下例子。 int32_t x = 0x80000000; uint32_t y = 0x7fffffff; int64_t z = (int64_t)x*y; 双字产品应该是0xc000000080000000 。 但是如果你认为你的编译器知道如何处理混合types,你怎么能得到这个呢? 这就是我想到的: int64_t sign = x<0; sign*=-1; //get the sign and make it all ones uint32_t t = abs(x); //if x<0 take two's complement again uint64_t […]

为什么.NET将额外的斜杠添加到path中已有的斜线?

我注意到C#为path添加了额外的斜线( \ )。 考虑pathC:\Test 。 当我在文本可视化器中用这个path检查string时,实际的string是C:\\Test 。 为什么是这样? 它使我困惑,因为有时我可能想要分割path(使用string.Split() ),但不得不知道要使用哪个string(一个或两个斜杠)。

在C中存储和使用大数字

我需要帮助非常大的数字。 根据Windows calc,指数 174^55 = 1.6990597648061509725749329578093e+123 我将如何使用C(c99标准)存储这个? int main(){ long long int x = 174^55; //result is 153 printf("%lld\n", x); }

! c运算符,是两个NOT吗?

我阅读这个代码 ,并有此行 switch (!!up + !!left) { 什么是!! 操作员? 两个逻辑NOT?

C#本身正在四舍五入

当我在C#中进行分割时,它会自动向下舍入。 看到这个例子: double i; i = 200 / 3; Messagebox.Show(i.ToString()); 这给我看一个包含“66”的消息框。 200/3实际上是66.66666〜然而。 有没有办法我可以避免这个四舍五入和保持一个像66.6666667?

操作c = a +++ b是什么意思?

下面的代码让我感到困惑 int a=2,b=5,c; c=a+++b; printf("%d,%d,%d",a,b,c); 我预计输出为3,5,8,主要是因为a ++意味着2 + 1等于3,3 + 5等于8,所以我预期3,5,8。 结果是3,5,7。 有人可以解释为什么是这样吗?

atoi – 如何识别零和错误之间的区别?

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/ 返回值 成功时,该函数将转换的整数数字作为int值返回。 如果不能执行有效的转换,则返回零值。 如果正确的值超出了可表示值的范围,则返回INT_MAX或INT_MIN。 所以我如何区别atoi("poop")和atoi("0")和atoi("0000000") 是的,我可以循环和检查所有的零,以防万一我得到0的结果,但没有一个更好的办法? 注意:我使用ANSI C89

如果函数没有返回任何值,并且返回types有效,编译器是否可以扔垃圾?

如果一个函数的返回types不是void ,并且函数没有返回任何东西,那么我猜编译器会返回一个垃圾值(可能被看作未初始化的值)。 它发生在编译时,为什么不能抛出一个错误? 例如, int func1() { return; // error } int func2() { // does not return anything } 第二个func2应该会抛出一个错误,但是不会。 是有原因的吗? 我的想法是,它可以被看作是一个未初始化的值,所以如果我们需要在第二种情况下抛出错误,那么我们需要抛出错误,如果一个值未初始化,说 int i; // error int i = 6; // okay 任何想法,或者这是一个重复的问题? 我感谢您的帮助。