请教大神一个问题!望不吝赐教

时间:2022-09-16 16:58:26
c++ vb c
#include <windows.h>
#include <iostream.h>
#include <crtdbg.h>
#include <stdio.h>
#include <windef.h>

void MemGet(HDC IDSource,int XBegin,int YBegin,int XEnd,int YEnd)
{
BITMAPINFO bi24BItInfo;
HBITMAP iBitMap;
int i,j,k,L,X,Y,W,H,AlignedW;
int InPutWid = XEnd - XBegin;
int InPutHei = YEnd - YBegin;
W = InPutWid + 1;
H = InPutHei + 1;
AlignedW = ((H * 3 + 3) && (!3) );
int *** ColOut;
ColOut = new int **[InPutWid];
for (i=0;i<InPutWid;i++)
{
ColOut[i]=new int *[InPutHei];
}
for (i=0;i<InPutWid;i++)
{
for (j=0;j<InPutHei;j++)
{
ColOut[i][j]=new int[2];
}
}
for (i=0;i<InPutWid;i++)
{
for (j=0;j<InPutHei;j++)
{
for (k=0;k<2;k++)
{
ColOut[i][j][k]=rand();
}
}
}
long * MapData;
MapData=new long[AlignedW * W - 1];
for (i=0;i<AlignedW * W - 1;i++)
{
MapData[i]=rand();
}
bi24BItInfo.bmiHeader.biBitCount = 24;
bi24BItInfo.bmiHeader.biCompression=0;
bi24BItInfo.bmiHeader.biPlanes=1;
bi24BItInfo.bmiHeader.biSize=sizeof(bi24BItInfo.bmiHeader);
bi24BItInfo.bmiHeader.biWidth=W;
bi24BItInfo.bmiHeader.biHeight=-H;
iBitMap=(HBITMAP)GetCurrentObject(IDSource,7);
GetDIBits(IDSource,iBitMap,0,H,MapData,&bi24BItInfo,0);
for (X=0;X<InPutWid;X++)
{
L=X * AlignedW;
for (Y=0;Y<InPutHei;Y++)
{
ColOut[X][Y][2]=MapData[L];
ColOut[X][Y][1]=MapData[L + 1];
ColOut[X][Y][0]=MapData[L + 2];
L = L + 3;
}
}

DeleteObject(iBitMap);
}


void main()
{
HDC dc;
dc=GetDC(0);
MemGet(dc,0,0,799,599);
ReleaseDC(0,dc);
}


上述代码是我原先用VB写的,改成C++的,编译通过,但是运行的时候就提示Debug error!Invalid allocation size:4294967295 bytes.
通过断点跟踪,一会在ColOut = new int **[InPutWid];处出现该错误,一会在MapData=new long[AlignedW * W - 1];处出现该错误!
MemGet就是截屏一个指定大小的图片加载到内存当中,然后把该图片所有坐标的像素写进一个三维数组里!
望大神指教出错在哪里?或者有没有什么更好的办法可以达到毫秒级把一整张图的所有像素信息放进一个数组里,单独的存放像素的一维数组或者有X,Y坐标+RGB分量的三维数组都可以!
主要是VB太慢了,800X600的图片,写进那ColOut三维数组倒是很快,但是把480000个像素点的RGB分量获取出来要几秒钟,所以想用C看看能否提速,望大神不吝赐教

9 个解决方案

#1


new的[ ]里的都是通过计算得来的,按道理是不会出现-1的吖,为什么还是会出现new到-1的情况造成分配内存过大呢?

#2


存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

#3


引用 2 楼 lianshaohua 的回复:
存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

#4


引用 2 楼 lianshaohua 的回复:
存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

#5


引用 2 楼 lianshaohua 的回复:
存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

#6


在断言失败时,点重试,看调用栈。

#7


在断言失败时,点重试,看调用栈。

#8


引用 7 楼 sinservice 的回复:
在断言失败时,点重试,看调用栈。

004016D5   int         3

话说你也2连了,估计也和我一样,回复的时候500错误吧? 请教大神一个问题!望不吝赐教

#9


引用 5 楼 wokaoniubi1 的回复:
Quote: 引用 2 楼 lianshaohua 的回复:

存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

可以打日志出来看看有没有-1的情况

#1


new的[ ]里的都是通过计算得来的,按道理是不会出现-1的吖,为什么还是会出现new到-1的情况造成分配内存过大呢?

#2


存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

#3


引用 2 楼 lianshaohua 的回复:
存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

#4


引用 2 楼 lianshaohua 的回复:
存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

#5


引用 2 楼 lianshaohua 的回复:
存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

#6


在断言失败时,点重试,看调用栈。

#7


在断言失败时,点重试,看调用栈。

#8


引用 7 楼 sinservice 的回复:
在断言失败时,点重试,看调用栈。

004016D5   int         3

话说你也2连了,估计也和我一样,回复的时候500错误吧? 请教大神一个问题!望不吝赐教

#9


引用 5 楼 wokaoniubi1 的回复:
Quote: 引用 2 楼 lianshaohua 的回复:

存在-1的情况,和你的截图是不是有关系?你可以多测试测试,程序没细看

new的[ ]里的是传参进去的799,599通过计算得来的,按道理不会出现-1的情况吖

可以打日志出来看看有没有-1的情况