VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())

2023-11-12

原文出处:点击打开链接

#############################################################

不要在.cpp文件声明核函数,否则会报错,具体可以参考下面两个链接:

http://blog.csdn.net/lingerlanlan/article/details/25063331?utm_source=tuicool

https://stackoverflow.com/questions/16550031/cuda-device-and-global-error-expected-constructor-destructor-or-type

############################################################


在做项目集成的时候需要用到cpp和cuda文件联调,自己摸索了两种方式实现cpp和cu文件混合编译。

本文环境:

  • windows7 64位
  • VS2010
  • CUDA5.5
  • 英伟达显卡Tesla C1060

前言

装好CUDA 5.5 sdk后,默认会自动添加好系统环境变量。
因此不需要额外配置,不过为了保险起见,可以选择性地添加以下环境变量:
CUDA_BIN_PATH  %CUDA_PATH%\bin
CUDA_LIB_PATH  %CUDA_PATH%\lib\Win32
CUDA_SDK_BIN  %CUDA_SDK_PATH%\bin\Win32
CUDA_SDK_LIB  %CUDA_SDK_PATH%\common\lib\Win32
CUDA_SDK_PATH  C:\cuda\cudasdk\common
这时可以打开CUDA自带的sample运行一下,运行能通过才可以继续下面的内容————cpp和cuda联调。

方法一:先建立cuda工程,再添加cpp文件

1.打开vs2010,新建一个cuda项目,名称CudaCpp。




2.cuda默认建立的工程是如下,实现了两个一维向量的并行相加。kernel函数和执行函数还有main函数全都写在了一个cu文件里。




3.接下来在工程里添加一个空的cpp文件。将原来cu文件里main函数里的内容剪切到cpp文件main函数里。

为了让cpp能够调用cu文件里面的函数,在addWithCuda函数前加上extern "C" 关键字  (注意C大写,为什么addKernel不用加呢?因为cpp里面直接调用的是addWithCuda)




4.在cpp里也要加上addWithCuda函数的完整前向声明。下图就是工程的完整结构




5.可以在cpp里的main函数return之间加入getchar()防止运行后一闪就退出,加上system("pause")或者直接ctrl+F5也行。

运行结果:




下面贴出CudaCpp项目代码。

kernel.cu

[plain]  view plain  copy  print ?
  1. #include "cuda_runtime.h"  
  2. #include "device_launch_parameters.h"  
  3.   
  4. #include <stdio.h>  
  5.   
  6. __global__ void addKernel(int *c, const int *a, const int *b)  
  7. {  
  8.     int i = threadIdx.x;  
  9.     c[i] = a[i] + b[i];  
  10. }  
  11. // Helper function for using CUDA to add vectors in parallel.  
  12. extern "C"  
  13. cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)  
  14. {  
  15.     int *dev_a = 0;  
  16.     int *dev_b = 0;  
  17.     int *dev_c = 0;  
  18.     cudaError_t cudaStatus;  
  19.   
  20.     // Choose which GPU to run on, change this on a multi-GPU system.  
  21.     cudaStatus = cudaSetDevice(0);  
  22.     if (cudaStatus != cudaSuccess) {  
  23.         fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");  
  24.         goto Error;  
  25.     }  
  26.   
  27.     // Allocate GPU buffers for three vectors (two input, one output)    .  
  28.     cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));  
  29.     if (cudaStatus != cudaSuccess) {  
  30.         fprintf(stderr, "cudaMalloc failed!");  
  31.         goto Error;  
  32.     }  
  33.   
  34.     cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));  
  35.     if (cudaStatus != cudaSuccess) {  
  36.         fprintf(stderr, "cudaMalloc failed!");  
  37.         goto Error;  
  38.     }  
  39.   
  40.     cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));  
  41.     if (cudaStatus != cudaSuccess) {  
  42.         fprintf(stderr, "cudaMalloc failed!");  
  43.         goto Error;  
  44.     }  
  45.   
  46.     // Copy input vectors from host memory to GPU buffers.  
  47.     cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);  
  48.     if (cudaStatus != cudaSuccess) {  
  49.         fprintf(stderr, "cudaMemcpy failed!");  
  50.         goto Error;  
  51.     }  
  52.   
  53.     cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);  
  54.     if (cudaStatus != cudaSuccess) {  
  55.         fprintf(stderr, "cudaMemcpy failed!");  
  56.         goto Error;  
  57.     }  
  58.   
  59.     // Launch a kernel on the GPU with one thread for each element.  
  60.     addKernel<<<1, size>>>(dev_c, dev_a, dev_b);  
  61.   
  62.     // Check for any errors launching the kernel  
  63.     cudaStatus = cudaGetLastError();  
  64.     if (cudaStatus != cudaSuccess) {  
  65.         fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));  
  66.         goto Error;  
  67.     }  
  68.       
  69.     // cudaDeviceSynchronize waits for the kernel to finish, and returns  
  70.     // any errors encountered during the launch.  
  71.     cudaStatus = cudaDeviceSynchronize();  
  72.     if (cudaStatus != cudaSuccess) {  
  73.         fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);  
  74.         goto Error;  
  75.     }  
  76.   
  77.     // Copy output vector from GPU buffer to host memory.  
  78.     cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);  
  79.     if (cudaStatus != cudaSuccess) {  
  80.         fprintf(stderr, "cudaMemcpy failed!");  
  81.         goto Error;  
  82.     }  
  83.   
  84. Error:  
  85.     cudaFree(dev_c);  
  86.     cudaFree(dev_a);  
  87.     cudaFree(dev_b);  
  88.       
  89.     return cudaStatus;  
  90. }  
main.cpp

[cpp]  view plain  copy  print ?
  1. #include <stdio.h>  
  2. #include "cuda_runtime.h"  
  3. #include "device_launch_parameters.h"  
  4.   
  5. extern "C"  
  6.     cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);  
  7. int main()  
  8. {  
  9.     const int arraySize = 5;  
  10.     const int a[arraySize] = { 1, 2, 3, 4, 5 };  
  11.     const int b[arraySize] = { 10, 20, 30, 40, 50 };  
  12.     int c[arraySize] = { 0 };  
  13.   
  14.     // Add vectors in parallel.  
  15.     cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);  
  16.     if (cudaStatus != cudaSuccess) {  
  17.         fprintf(stderr, "addWithCuda failed!");  
  18.         return 1;  
  19.     }  
  20.   
  21.     printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",  
  22.         c[0], c[1], c[2], c[3], c[4]);  
  23.     printf("cuda工程中调用cpp成功!\n");  
  24.   
  25.     // cudaDeviceReset must be called before exiting in order for profiling and  
  26.     // tracing tools such as Nsight and Visual Profiler to show complete traces.  
  27.     cudaStatus = cudaDeviceReset();  
  28.     if (cudaStatus != cudaSuccess) {  
  29.         fprintf(stderr, "cudaDeviceReset failed!");  
  30.         return 1;  
  31.     }  
  32.     getchar(); //here we want the console to hold for a while  
  33.     return 0;  
  34. }  

方法二:先建立cpp工程,再添加cu文件

方法一由于是cuda工程是自动建立的,所以比较简单,不需要多少额外的配置。而在cpp工程里面添加cu就要复杂一些。为了简单起见,这里采用console程序讲解,至于MFC或者Direct3D程序同理。


1.建立一个空的win32控制台工程,名称CppCuda。



2.然后右键工程-->添加一个cu文件




3.将方法一中cu和cpp文件的代码分别拷贝到这个工程里来(做了少许修改,extern "C"关键字和某些头文件不要忘了加),工程结构如图:




这个时候编译是通不过的,需要作一些配置。


4.关键的一步,右键工程-->生成自定义 ,将对话框中CUDA5.5前面的勾打上。




这时点击 工程-->属性,会发现多了CUDA链接器这一项。




5.关键的一步,右键kernel.cu文件-->属性,在 常规-->项类型 里面选择CUDA C/C++(由于cu文件是由nvcc编译的,这里要修改编译链接属性)




6.工程-->属性-->链接器-->附加依赖项,加入cudart.lib




7.工具-->选项-->文本编辑器-->文件扩展名 添加cu \cuh两个文件扩展名




8.至此配置成功。运行一下:




9.为了更加确信cuda中的函数确实被调用,在main.cpp里面调用cuda函数的地方加入了一个断点。




单步执行一下。




可以看到程序跳到了cu文件里去执行了,说明cpp调用cuda函数成功。




贴上代码(其实跟方式一基本一样,没怎么改),工程CppCuda

kernel.cu

[plain]  view plain  copy  print ?
  1. #include "cuda_runtime.h"  
  2. #include "device_launch_parameters.h"  
  3.   
  4. #include <stdio.h>  
  5.   
  6. //cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);  
  7. __global__ void addKernel(int *c, const int *a, const int *b)  
  8. {  
  9.     int i = threadIdx.x;  
  10.     c[i] = a[i] + b[i];  
  11. }  
  12. // Helper function for using CUDA to add vectors in parallel.  
  13. extern "C"  
  14. cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)  
  15. {  
  16.     int *dev_a = 0;  
  17.     int *dev_b = 0;  
  18.     int *dev_c = 0;  
  19.     cudaError_t cudaStatus;  
  20.   
  21.     // Choose which GPU to run on, change this on a multi-GPU system.  
  22.     cudaStatus = cudaSetDevice(0);  
  23.     if (cudaStatus != cudaSuccess) {  
  24.         fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");  
  25.         goto Error;  
  26.     }  
  27.   
  28.     // Allocate GPU buffers for three vectors (two input, one output)    .  
  29.     cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));  
  30.     if (cudaStatus != cudaSuccess) {  
  31.         fprintf(stderr, "cudaMalloc failed!");  
  32.         goto Error;  
  33.     }  
  34.   
  35.     cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));  
  36.     if (cudaStatus != cudaSuccess) {  
  37.         fprintf(stderr, "cudaMalloc failed!");  
  38.         goto Error;  
  39.     }  
  40.   
  41.     cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));  
  42.     if (cudaStatus != cudaSuccess) {  
  43.         fprintf(stderr, "cudaMalloc failed!");  
  44.         goto Error;  
  45.     }  
  46.   
  47.     // Copy input vectors from host memory to GPU buffers.  
  48.     cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);  
  49.     if (cudaStatus != cudaSuccess) {  
  50.         fprintf(stderr, "cudaMemcpy failed!");  
  51.         goto Error;  
  52.     }  
  53.   
  54.     cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);  
  55.     if (cudaStatus != cudaSuccess) {  
  56.         fprintf(stderr, "cudaMemcpy failed!");  
  57.         goto Error;  
  58.     }  
  59.   
  60.     // Launch a kernel on the GPU with one thread for each element.  
  61.     addKernel<<<1, size>>>(dev_c, dev_a, dev_b);  
  62.   
  63.     // Check for any errors launching the kernel  
  64.     cudaStatus = cudaGetLastError();  
  65.     if (cudaStatus != cudaSuccess) {  
  66.         fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));  
  67.         goto Error;  
  68.     }  
  69.       
  70.     // cudaDeviceSynchronize waits for the kernel to finish, and returns  
  71.     // any errors encountered during the launch.  
  72.     cudaStatus = cudaDeviceSynchronize();  
  73.     if (cudaStatus != cudaSuccess) {  
  74.         fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);  
  75.         goto Error;  
  76.     }  
  77.   
  78.     // Copy output vector from GPU buffer to host memory.  
  79.     cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);  
  80.     if (cudaStatus != cudaSuccess) {  
  81.         fprintf(stderr, "cudaMemcpy failed!");  
  82.         goto Error;  
  83.     }  
  84.   
  85. Error:  
  86.     cudaFree(dev_c);  
  87.     cudaFree(dev_a);  
  88.     cudaFree(dev_b);  
  89.       
  90.     return cudaStatus;  
  91. }  
main.cpp

[cpp]  view plain  copy  print ?
  1. #include <iostream>  
  2. #include "cuda_runtime.h"  
  3. #include "device_launch_parameters.h"  
  4. using namespace std;  
  5.   
  6. extern "C"  
  7.     cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);  
  8. int main(int argc,char **argv)  
  9. {  
  10.     const int arraySize = 5;  
  11.     const int a[arraySize] = { 1, 2, 3, 4, 5 };  
  12.     const int b[arraySize] = { 10, 20, 30, 40, 50 };  
  13.     int c[arraySize] = { 0 };  
  14.   
  15.     // Add vectors in parallel.  
  16.     cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);  
  17.     if (cudaStatus != cudaSuccess) {  
  18.         fprintf(stderr, "addWithCuda failed!");  
  19.         return 1;  
  20.     }  
  21.   
  22.     cout<<"{1,2,3,4,5} + {10,20,30,40,50} = {"<<c[0]<<','<<c[1]<<','<<c[2]<<','<<c[3]<<'}'<<endl;  
  23.     printf("cpp工程中调用cu成功!\n");  
  24.   
  25.     // cudaDeviceReset must be called before exiting in order for profiling and  
  26.     // tracing tools such as Nsight and Visual Profiler to show complete traces.  
  27.     cudaStatus = cudaDeviceReset();  
  28.     if (cudaStatus != cudaSuccess) {  
  29.         fprintf(stderr, "cudaDeviceReset failed!");  
  30.         return 1;  
  31.     }  
  32.     system("pause"); //here we want the console to hold for a while  
  33.     return 0;  
  34. }  
注意有时候编译出问题,把   "device_launch_parameters.h"  这个头文件去掉就好了(去掉之后就不能调里面的函数或变量了),至于为什么,还不是很清楚。

以后将cu文件加入到任何MFC,qt,D3D或者OpenGL等C++工程中步骤都是类似的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__()) 的相关文章

  • springboot线程池ThreadPoolTaskExecutor使用

    https mp weixin qq com s 3DRBX9Wb OA NIfPXZjcw 前言 程池ThreadPoolExecutor 而用的是Spring Boot项目 可以用Spring提供的对ThreadPoolExecutor
  • Github搭建个人博客(2019最新版,亲测)

    版权声明 本文为徐代龙原创文章 未经徐代龙允许不得转载 https blog csdn net xudailong blog article details 78762262 敲黑板 如何写一个自己的小程序并上线 一 前言 建议 慢慢看 也
  • Windows Java环境变量设置 & Maven环境变量设置 & 常用环境问题设置

    Windows Java环境变量设置 Maven环境变量设置 常用环境问题设置 1 Java环境变量设置 Java8环境变量设置 1 进入环境变量设置界面 我的电脑 gt 属性 gt 高级系统设置 gt 环境变量 2 创建系统变量JAVA
  • 强化学习原理与python实现原理pdf_深度强化学习笔记——DQN原理与实现(pytorch+gym)...

    概要 本文主要总结深度强化学习中无模型基于值方法的DQN算法 说明其算法原理并用该算法在gym提供的cartpole上进行实现 有任何不准确或错误的地方望指正 1 DQN Deep Q Network 基本原理 DQN算法相当于对传统Q l
  • Python爬取的BOSS直聘的数据

    临近年末 互联网寒冬 的来临让大家倍感压力 大家纷纷感叹寒冬将至 但是 越是这个时候 越要明确自己的奋斗目标 不断的充实自己 提高自己的能力 为找工作打下坚实的基础 本次我们爬取了招聘网站上关于计算机视觉方向的招聘信息 并对于招聘信息进行分
  • 如何免费使用ChatGPT

    前段时间想使用一下CahtGPT产品说明文档 找了一大圈国内基本都收费或者需要开通会员的 需要使用所谓的算力 其实相对于所谓的算力和会员也可以理解 做一款产品是需要营利的 只是这个费用太贵了 可以对比一下官方报价 国外 国内 ChatGPT
  • 高级软件工程课程总结

    1 初识软件工程 1 1软件无处不在 软件定义世界 成为社会发展的潮流 软件在人类生活中扮演者越来越重要的角色 软件已经成为一个极其重要的产业形态 软件是软件工程的研究对象 也是软件工程的产品形态与客观存在 工程是将理论和知识应用于实践的科
  • PS制作表情包

    表情包制作 素材 效果图
  • Elastic学习:ES安装以及head插件安装

    这里首先先安装ELK三剑客 ElasticSearch LogStash Kibana 里面的ElasticSearch在widnows上的安装 如果官网下载慢或打不开的的话 可以尝试搜一下国内的镜像或者网盘什么的 1 下载解压安装包 2
  • python整数类型bcdoxx_appium+python搭建自动化测试框架_Tools安装(一) - 为你开出一树春天 - 博客园...

    appium python搭建自动化测试框架 Tools安装 一 作者的配置环境和版本 win10 python3 6 Appium v1 4 16 1 下载node https nodejs org en download 下载node
  • 【GIT】git 错误记录

    目录 error Your local changes to the following files would be overwritten by merge xxx git error the following untracked w
  • php是一种基于,一种基于Java技术的PHP编译器的设计与开发

    收稿日期 2003 06 03 作者简介 朱 1976 男 江苏南京人 江苏广播电视大学现代教育技术中心助理工程师 一种基于Java 技术的 PHP 编译器的设计与开发 朱 江苏广播电视大学 江苏 南京 210036 摘 要 为提高 PHP
  • 幸亏四年前,离职了

    从一个前同事了解 以前的组长去年10月份也跳槽了 在该公司时 只让我做界面和业务逻辑 以及GDAL 那时候就想 如果五年合同满了 就得指望组长吃饭了 没竞争力了 现在想想 如果不走 组长走了 只懂皮毛的我 该怎么混呢 看来谁也指望不上 就得
  • <a_range-picker>组件选择时间段的使用

    仅供学习 不可转载 研究了好长时间终于把选择时间段存到数据库和从数据库里面拿出来做到回显给弄明白了 在这里做一个非常详细的笔记 从前端的vue到后端整个的实现过程 效果图 思路 1 gt 首先这个组件的使用比较简单 直接拿过来用就可以了
  • 状态机修改C++风格注释为C风格注释

    include
  • 正大期货新闻:印度调高了棕榈油以及豆油的进口基础价格

    外媒2月15日消息 周二印度政府发布的声明称 印度调高了棕榈油和豆油的进口基础价格 因为海外价格大幅上涨 毛棕榈油的进口基础价格从1346美元 吨调高到1359美元 吨 33度精炼棕榈油从1368美元调高到1376美元 24度精炼这样从13
  • 5.44 综合案例2.0-矩阵键盘信息输入上传-OLED屏幕

    综合案例2 0 矩阵键盘信息输入上传 OLED屏幕 案例说明 1 应用场景 2 M320矩阵引脚说明 3 接线说明 搭建云平台环境 1 添加设备 2 创建设备类型 3 功能定义 创建物模型 代码 1 更改MQTT信息 测试 案例说明 矩阵键
  • 金九银十如何抱佛脚?2023最新大厂 Java 面试真题合集(附完整答案解析)

    2023 秋招眼看着就要来了 但是离谱的是 很多同学最近才想起来还有秋招这回事 所以纷纷临时抱佛脚 问我有没有什么快速磨枪的方法 我的回答是 有 说起来 临阵磨枪没有比背八股文更靠谱的了 很多人对这个很不屑 呵 背题家罢了 但国内大环境如此
  • QT项目超详细打包教程

    一 将QT项目调成为release模式并运行程序 二 在QT中点击项目 三 复制项目的构建目录 四 进入项目的构建目录 找到release文件并进入 五 在release文件夹下新建一个文件夹 任意起名 六 将release文件夹下生成的可

随机推荐

  • Golang 切片删除指定元素的几种方法

    文章目录 1 截取法 修改原切片 2 拷贝法 不改原切片 3 移位法 修改原切片 3 1 方式一 3 2 方式二 4 性能对比 5 小结 参考文献 Go 并没有提供删除切片元素专用的语法或函数 需要使用切片本身的特性来删除元素 删除切片指定
  • C++中两个栈实现一个队列

    引言 首先看这个标题的时候 需要联想到栈和队列的特点 栈是先进后出 队列是先进先出 假如三个元素1 2 3 将这三个元素依次入栈1后 再将栈1中元素依次出栈放入到栈2中 栈1中只留下最后一个元素1 此时栈2中由两个元素 接下来获取栈1中的栈
  • QT-子线程访问主界面UI控件的有效方法

    引言 当软件需要导入大量数据文本时 若显示控件操作放在主界面UI线程中 会导致在导入数据的过程中存在界面卡死的现象 这种现象在工业控制工况中中是致命的 因此本文章旨在实现非UI子线程对UI主线程的操作 这里举一个简单的Demo 大文本数据通
  • 三款很酷很骚气的底部导航

    早上好 骚年 我是小菜 我的公众号 菜鸟翻身 会推荐 GitHub 上好玩的项目 一分钟 get 一个优秀的开源项目 挖掘开源的价值 欢迎关注我 底部导航栏是 APP 最常用的功能之一 想最初都是自己自定义 ViewGroup 实现 后来
  • PMBOK(第六版) PMP笔记——《第六章 项目进度管理》

    第 6 6 章 项目进度管理 项目进度管理包括为管理项目按时完成所需的各个过程 项目进度计划 Schedule 说明了项目如何以及何时交付项目范围中定义的产品 服务 和成果 创建 WBS 最底层得到的是工作包 但是为了更好的估算活动持续时间
  • SpringAOP学习--SpringAOP简介及原理

    前文对AOP做了介绍 实际项目中 一般不会直接上手手动实现aop 而是使用一些高级封装的aop实现 如SpringAOP Spring是一个广泛应用的框架 SpringAOP则是Spring提供的一个标准易用的aop框架 依托Spring的
  • vue props传Array/Object类型值,子组件报错解决办法(已解决)

    问题 Props with type Object Array must use a factory function to return the default value 1 在vue中如果当在父组件通过props传Array Obje
  • IPv6地址格式简介以及常见的IP地址

    toc 文章目录 1 IPv6地址格式 1 1首选格式 1 2 压缩格式 1 3 内嵌IPv4地址的IPv6 2 常见的IP地址 2 1 128 2 2 1 128 2 3 A B C D 2 4 FFFF A B C D 2 5 fe80
  • ElasticSearch入门学习笔记(2)--------Kibana语法学习

    ElasticSearch的ResultFul风格 基于Rest命令说明 原文链接 基础测试 创建一个索引 put 索引名 类型名 文档id 请求体 可以再head里面看到里面多了一个test1 从下面的图中可以看到本质上就是往里面put了
  • 如何在两个相关泛型类之间创建类似子类型的关系

    本文正在参加 金石计划 瓜分6万现金大奖 哈喽大家好 我是阿Q 事情是这个样子的 对话中的截图如下 看了阿Q的解释 你是否也和 马小跳 一样存在疑问呢 请往 看 我们都知道在java中 只要是类型兼容 就可以将一种类型的对象分配给另一种类型
  • vmware启动报错0xc000007b 解决方式

    1 官网下载vmwre 最新版后安装 2 运行vmwre报错结果如下 解决方法 安装最新版本C 运行库 VisualC2022 64 86 64位操作系统安装VisualC2022 64 86 32未操作系统安装VisualC2022 86
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • c++中的vector的用法

    参考博客 https blog csdn net msdnwolaile article details 52708144 基本用法 如下代码 include
  • Flutter Image图片显示

    目录 参数详解 代码示例 效果图 完整代码 使用资源图片前必做两个步骤 1 在根目录下创建子目录 子目录中创建2 0x和3 0x 也可以创建4 0x 5 0x 但是2 0和3 0是必须的 目录 在对应目录中添加对应分辨率图片 图1 2 打开
  • 2020笔记本性价比之王_2020十大笔记本电脑性价比排行(最新笔记本电脑推荐)...

    2020十大笔记本电脑性价比排行 最新笔记本电脑推荐 1 HP 惠普 战99 15 6英寸笔记本电脑 2 Acer 宏碁 墨舞P50 15 6英寸笔记本电脑 3 HONOR 荣耀 MagicBook Pro 16 1英寸笔记本电脑 4 AS
  • C++中的Unicode编码:wchar, UTF-8,UTF-16,UTF-32

    C 在C11标准中加入了对Unicode编码的支持 新增了wchar t char16 t char32 t内置数据类型 cout lt lt sizeof char lt lt endl cout lt lt sizeof wchar t
  • 上传新文件项目到svn上

    一 在之前有svn项目的文件夹中检出 这一步主要是为了获得svn的仓库地址 二 在一个之前有的svn项目里面右键tortoiseSvn gt 版本库浏览器 就会出现这样的界面 然后在这个界面里右键里选择加入文件夹 选择本地的文件夹就可以了
  • Python剪刀石头布

    这是以前刚刚开始学习python时自己编的第一个小游戏 很简单 分享给大家 import random 胜 0 负 0 平 0 while True 对方 str random randint 1 3 我方 input 请选择你的出拳 剪刀
  • [C]编译器对char数组声明的一个行为

    1 概述 如果使用char 来声明char数组 那么编译器会自动计算后面的字面量字符数 再加上一个空字符 作为它的长度 实际上这个数组最后一位被编译器强行加上了 0 include
  • VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())

    原文出处 点击打开链接 不要在 cpp文件声明核函数 否则会报错 具体可以参考下面两个链接 http blog csdn net lingerlanlan article details 25063331 utm source tuicoo