大家!我在地图容器中维护一组通道数据,通过其通道名称可以从中访问单个通道数据.关于这一点,我写了一个简单的函数GetIRChannelData
(请参阅下面的代码).在compliing时,语句抛出了pusIRChannelData = cit->second();
一个错误,该错误在读取
error C2064: term does not evaluate to a function taking 0 arguments
Run Code Online (Sandbox Code Playgroud)
要做的所有功能只不过是在地图容器中搜索给定的通道名称/ ID,并且如果找到则将数据指针分配给时间指针.你能告诉我什么是错的吗?
const Array2D<unsigned short>* GetIRChannelData(std::string sChannelName) const
{
const Array2D<unsigned short>* pusIRChannelData = NULL;
for (std::map<std::string, Array2D<unsigned short>* >::const_iterator cit = m_usIRDataPool.begin(); cit != m_usIRDataPool.end(); ++cit)
{
std::string sKey = cit->first;
if (sKey == sChannelName)
{
pusIRChannelData = cit->second(); // Error occurred on this line
break;
}
}
return pusIRChannelData;
}
Run Code Online (Sandbox Code Playgroud) 我一直在研究关于遥感图像处理和图像序列循环的项目.每个生成的图像(JPEG或PNG格式)大约有8000*4000像素.我们的用户通常希望一次基于感兴趣的区域循环图像序列(超过50个图像).因此,我必须根据用户的可视化客户端大小从每个图像中提取所需的查看区域.例如,如果用户当前的客户端视图是640*480,我将必须根据当前的x(列)和y(行)坐标从每个原始图像中找到640*480数据块的大小,并重新映射到客户端视图.当用户通过鼠标拖动平移到另一个查看区域时,我们的程序必须尽快从每个原始图像中重新加载区域数据.
我知道JPEG库和PNG库都没有一些内置的数据块读取例程,例如长的ReadRectangle(长x0,长y0,长x1,长y1,char*RectData); long ReadInaRectangle(long x0,long y0,short width,short height,char*RectData);
内置的JPEG解压缩器缺乏这种功能.我知道JPEG2000格式有解压缩图像特定区域的规定.我对JEPG并不完全确定.
有人建议我使用CreateFileMapping,MapViewOfFile和CreateDIBSection来提交映射到视图的文件映射的字节数.与简单的平面二进制图像格式(如*.raw,*.img和*.bmp)不同,JPEG的Blob不仅包含图像数据,还包含复杂的JPG标题.因此,从JPEG文件中映射数据视图块并不容易.
有人建议我使用图像平铺或图像金字塔技术来生成子图像,就像流行的,图像可视化(谷歌地球等)和GIS应用程序(WebGIS等)一样.
我怎么解决这个问题?
谢谢你的帮助.
金李
我创建了一个HDF5文件打开功能,如下所示:
int OpenHDF5(string sFileName)
{
// Check for valid HDF5 file
if (!H5File::isHdf5(sFileName.c_str()))
{
// Invalid HDF5 file
return -1
}
// Try block to detect exceptions raised by any of the calls inside it
try
{
// Turn off the auto-printing when failure occurs so that we can handle the errors appropriately
Exception::dontPrint();
// Now Open the file
H5File file( sFileName.c_str(), H5F_ACC_RDONLY );
}
// Catch failure caused by the H5File operations
catch( FileIException error )
{
error.printError();
return …
Run Code Online (Sandbox Code Playgroud) 在应用 OpenMP 并行化之前,以下代码运行起来就像一个魅力。事实上,下面的代码处于死循环状态!我确信这是由于我对 OpenMP 指令的错误使用造成的。你能告诉我正确的方法吗?非常感谢。
#pragma omp parallel for
for (int nY = nYTop; nY <= nYBottom; nY++)
{
for (int nX = nXLeft; nX <= nXRight; nX++)
{
// Use look-up table for performance
dLon = theApp.m_LonLatLUT.LonGrid()[nY][nX] + m_FavoriteSVISSRParams.m_dNadirLon;
dLat = theApp.m_LonLatLUT.LatGrid()[nY][nX];
// If you don't want to use longitude/latitude look-up table, uncomment the following line
//NOMGeoLocate.XYToGEO(dLon, dLat, nX, nY);
if (dLon > 180 || dLat > 180)
{
continue;
}
if (Navigation.GeoToXY(dX, dY, dLon, dLat, 0) > 0) …
Run Code Online (Sandbox Code Playgroud) 我想计算10增加到功率减去m
.除了使用数学函数之外pow(10, -m)
,有没有快速有效的方法呢?
我从SO那里向c ++专家提出这样一个简单的问题是,正如你所知,就像基数2,10一样,它也是一个特殊的基础.如果某个值n
乘以10的幂减去m
,则相当于将n的小数点向左移动m次.我认为它必须是一种快速有效的应对方式.
每个人!我有一个充满无符号字符的二维向量。现在我想将其内容保存到二进制文件中:
std::vector<std::vector<unsigned char> > v2D(1920, std::vector<unsigned char>(1080));
// Populate the 2D vector here
.....
FILE* fpOut;
// Open for write
if ( (err = fopen_s( &fpOut, "e:\\test.dat", "wb")) !=0 )
{
return;
}
// Write the composite file
size_t nCount = 1920 * 1080 * sizeof(unsigned char);
int nWritten = fwrite((char *)&v2D[0][0], sizeof(unsigned char), nCount, fpOut);
// Close file
fclose(fpOut);
Run Code Online (Sandbox Code Playgroud)
但是,当我读取 test.dat 时,填写一个新的二维向量,并将其条目与旧的条目进行比较。我发现写的内容和原文不一样。为什么?我写的语句有什么问题吗?您能告诉我如何以正确的方式将二维向量写入二进制文件吗?非常感谢!
#define LON_DATA_ROWS 1920
#define LON_DATA_COLS 1080
std::vector<std::vector<float> > m_fLon2DArray(LON_DATA_ROWS, std::vector<float>(LON_DATA_COLS));
std::ifstream InputFile;
int nSizeOfLonData = TOTAL_LON_ELEMENTS * …
Run Code Online (Sandbox Code Playgroud) 我曾经使用以下函数在32位Windows平台(如Window XP和Windows 7)上注册我的32位COM/DLL组件.它工作正常.但是在64位Windows 7上运行时,该功能无法成功注册.结果如预期!
int RegisterComponent(LPCTSTR lpszDllName)
{
// Load the library
HINSTANCE hLib = LoadLibrary(lpszDllName);
if (hLib == NULL)
{
return -2;
}
typedef HRESULT (CALLBACK *HCRET)(void);
HCRET lpfnDllRegisterServer;
// Find the entry point
lpfnDllRegisterServer = (HCRET)GetProcAddress(hLib, "DllRegisterServer");
if (lpfnDllRegisterServer == NULL)
{
return -3;
}
// Call the function by function pointer..
if (FAILED((*lpfnDllRegisterServer)()))
{
//DLL Registration failed..
return -4;
}
FreeLibrary(hLib);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用以下命令手动注册32位COM组件:C:\ Windows\SysWOW64> regsvr32
如何在不同的目标平台(例如,X86和X64)上以编程方式智能地注册32位COM/DLL组件?
int RegisterComponent(LPCTSTR lpszDllName)
{
if ( IsWow64() )
{ …
Run Code Online (Sandbox Code Playgroud) 我使用行连续字符"\"定义了一个多行宏函数,如下所示:
#define SHOWMSG( msg ) \
{ \
std::ostringstream os; \
os << msg; \
throw CMyException( os.str(), __LINE__, __FILE__ ); \
}
Run Code Online (Sandbox Code Playgroud)
但它无法通过编译.顺便说一下,我正在使用VS2008编译器.你能告诉我上述宏功能有什么问题吗?