我在visual c ++ 2010中运行代码时运行时出错。
void dct2(){
float** G = new float*[len];
for(int u = 0; u < len; u++){
G[u] = new float[len];
for(int v = 0; v < len; v++){
G[u][v] = 0;
for(int x = 0; x < len; x++){
for(int y = 0; y < len; y++){
G[u][v] += a(u) * a(v) * (float)mat[x][y] * cos((PI / 8) * u * (x + 0.5)) * cos((PI / 8) * v * (y + 0.5));
}
}
}
}
doublecpy(G);
}
void doublecpy(float** d){
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
if(d[i][j] >= 0)
mat[i][j] = (int)(d[i][j] + 0.5);
else
mat[i][j] = (int)(d[i][j] - 0.5);
}
}
for(int i = 0; i < len; i++)
delete[] d[i];
delete[] d;
}
错误出现在行中:delete [] d [i]; 如果这段代码或任何建议有任何问题,请告诉我。
答案 0 :(得分:1)
除了你不应该用这种方式编写C ++(这只是C with new而不是malloc)我看不到任何内存错误,但不知道mat是什么以及它是如何分配的。
答案 1 :(得分:1)
我修改了离散余弦变换和蝶形码以适合我的C编译器(不是C ++)。我为那些我没有的人插入了虚函数和常量。它工作(我测试了len = 1000)而没有破坏内存。我的版本工作的原因可能是 new float*[len]
,您可以将其重写为malloc(len*sizeof(float*))
以尝试是否存在问题。
(我没有c ++编译器方便自己尝试)
顺便说一句,我发现你在dct2()中new
但在doublecpy()中只有delete
。
反正。这是我改编的代码:
#include <stdio.h>
#include <stdlib.h>
#define len 1000
#define PI 3.14
float mat[len][len];
float a(int u) {
return 1.0;
}
void doublecpy(float** d){
int i;
for(i = 0; i < len; i++){
int j;
for(j = 0; j < len; j++){
if(d[i][j] >= 0)
mat[i][j] = (int)(d[i][j] + 0.5);
else
mat[i][j] = (int)(d[i][j] - 0.5);
}
}
for(i = 0; i < len; i++)
free(d[i]);
free(d);
}
void dct2(){
float** G = malloc(len*sizeof(float*));//new float* [len];
int u;
for(u = 0; u < len; u++){
G[u] = malloc(len*sizeof(float));
int v;
for(v = 0; v < len; v++){
G[u][v] = 0;
int x;
for(x = 0; x < len; x++){
int y;
for(y = 0; y < len; y++){
G[u][v] += a(u) * a(v) * (float)mat[x][y] * cos((PI / 8) * u * (x + 0.5)) * cos((PI / 8) * v * (y + 0.5));
}
}
}
}
doublecpy(G);
}
int main()
{
dct2();
getch();
}
答案 2 :(得分:0)
答案 3 :(得分:0)
我开始将所有数组转换为std :: vector,并在中途运行代码。这并没有解决我的问题,但我找到了错误的原因。它就在这个功能中:
void cpy(int** arr, int x, int y){
for(int i = x; i < x + len; i++){
for(int j = y; j < y + len; j++){
mat[i][j] = arr[i][j];
}
}
}
错误非常明显,我纠正了它:
void cpy(int** arr, int x, int y){
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
mat[i][j] = arr[i + x][j + y];
}
}
}
虽然这很奇怪。我预计在行中运行错误代码时会收到“数组索引超出范围”或“分段错误”:mat [i] [j] = arr [i] [j];
无论如何,谢谢大家的帮助。