Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未处理的异常访问c++;_C++_Visual Studio - Fatal编程技术网

C++ 未处理的异常访问c++;

C++ 未处理的异常访问c++;,c++,visual-studio,C++,Visual Studio,我试图从一个向量中计算并添加一些值,然后将它们保存在一个新的向量中。我正在做一个循环。开始时代码运行良好,但后来我开始出现访问冲突错误。从我所读到的内容来看,在尝试使用未初始化指针时,通常会出现此错误。但是我使用的指针已经被统一化了。很抱歉代码太草率,因为我还在学习。任何可能导致错误的提示都将非常有用 代码如下: #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <ctime> #inc

我试图从一个向量中计算并添加一些值,然后将它们保存在一个新的向量中。我正在做一个循环。开始时代码运行良好,但后来我开始出现访问冲突错误。从我所读到的内容来看,在尝试使用未初始化指针时,通常会出现此错误。但是我使用的指针已经被统一化了。很抱歉代码太草率,因为我还在学习。任何可能导致错误的提示都将非常有用

代码如下:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <ctime>
#include <stdio.h>
#include <iostream>
#include <math.h>

using namespace std;


void MulCPU(int *c, const int *a, const int NDim, const int templateSize){
    for (int i = 0; i < NDim; i++){
        for (int k = 0; k < NDim; k++){
            c[i - 1 + (k - 1)*NDim] = a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] - a[i - 1 + (k)*NDim + k*(templateSize - 1)] - a[i + templateSize - 2 + (k - 2)*NDim] + a[i - 2 + (k - 2)*NDim];

        }
    }
}


int main()
{

    srand(time(NULL));
    int N = 500;
    int SIZE = N*N;

    int *h_b = new int[SIZE];
    int *h_e = new int[SIZE];
    int templateSize = 3;

// ...
// Code for defining h_b
// ...

    int StartTime = clock();
    MulCPU(h_e, h_b, N, templateSize);
    int StopTime = clock();

delete[] h_a, h_b, h_c, h_d, h_e;
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
#包括
#包括
使用名称空间std;
void MulCPU(int*c、const int*a、const int NDim、const int templateSize){
对于(int i=0;i
我想一定是循环把事情搞砸了。之前我也遇到了一个堆异常

调试器给了我:
SecondTest.exe中0x011B996B处未处理的异常:0xC0000005:访问冲突读取位置0x0199C0A4。

您有许多问题:

            c[i - 1 + (k - 1)*NDim] = 
                   a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] -
                   a[i - 1 + (k)*NDim + k*(templateSize - 1)] -
                   a[i + templateSize - 2 + (k - 2)*NDim] + 
                   a[i - 2 + (k - 2)*NDim];
i
k
都为0时,您将向c[-501]写入。这不太可能很好地结束。(特别是,您可能会覆盖堆内部的指针,并在释放内存时造成各种破坏。)

此外,当
i
k
都是
NDIM-1
时,
a
的第一个索引为

i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)
即:

NDim-1 + templateSize - 1 + (NDim-1)*NDim + (NDim-1)*(templateSize-1)
(NDim*NDim)-1 + NDim*(templateSize-1)
即:

NDim-1 + templateSize - 1 + (NDim-1)*NDim + (NDim-1)*(templateSize-1)
(NDim*NDim)-1 + NDim*(templateSize-1)
在阵列的末端运行良好

编辑:修复了偏移错误

for(int i=0;i
您的
i
k
都是从
0
开始的,因此在第一次迭代中,当
i=k=0
时,您试图访问
c[0-1+(0-1)*NDim
,即
c[-NDim-1]
。因此,基本上,在尝试计算要访问的元素的索引时,您正在执行一些无效的计算。您可以通过执行以下操作更正第一个错误:

c[i+k*NDim]=/*剩下的表达式*/


因为我不知道在此之后您希望实现什么索引,所以您需要了解自己。但这是困扰您的错误。

调试器告诉了您什么?调试代码时您观察到了什么。抱歉,伙计们,忘记发布实际问题:SecondTest.exe中0x011B996B的未处理异常:0xC0000005:Access viola正在读取位置0x0199C0A4。这不是调试器消息。实际上,调试代码可以让您看到源代码中有问题的指令,然后检查相关变量并找出问题的根本原因。什么是
h_a
h_c
h_d