Tag: visual studio

为什么_mm256_load_pd编译为MOVUPD而不是MOVAPD?

为什么以下代码会产生未对齐的AVX指令(MOVUPD而不是MOVAPD)? 我在Visual Studio 2015上编译了这个。如何告诉编译器我的数据确实是对齐的? const size_t ALIGN_SIZE = 64; const size_t ARRAY_SIZE = 1024; double __declspec(align(ALIGN_SIZE)) a[ARRAY_SIZE]; double __declspec(align(ALIGN_SIZE)) b[ARRAY_SIZE]; //Calculate the dotproduct __m256d ymm0 = _mm256_set1_pd(0.0); for (int i = 0; i < ARRAY_SIZE; i += 8) { __m256d ymm1 = _mm256_load_pd(a + i); __m256d ymm2 = _mm256_load_pd(b + i); __m256d ymm3 = _mm256_mul_pd(ymm1, […]

更改const对象 – 没有警告? 还有,在哪种情况下它是UB?

为什么以下代码中没有警告? int deserialize_students(const Student *dest, const int destCapacityMax) { FILE *ptr_file; int i=0; ptr_file =fopen(“output.txt”,”r”); if (!ptr_file) return -1; if(destCapacityMax==0) return -2; while (!feof (ptr_file)) { fscanf (ptr_file, “%d”, &dest[i].id); // UB? fscanf (ptr_file, “%s”, dest[i].name); fscanf (ptr_file, “%d”, &dest[i].gender); i++; if(i==destCapacityMax) return 0; } fclose(ptr_file); return 0; } 这就是我所说的: Student students[5]; deserialize_students(students,5); 另外我有以下问题:我做了什么未定义的行为? 注意: […]

为基于对话框的应用程序实现回调函数

我正在阅读一篇关于如何在Visual C ++中创建基于对话框的GUI应用程序的非常古老的教程( 源代码 – 葡萄牙语)。 基于我对WinAPI编程的薄弱知识,我决定修改建议的代码主要是为了实现两件事: 1)与Unicode编程标准的一致性(例如使用wWinMain和MessageBoxW而不是WinMain和MessageBox/MessageBoxA )。 这样的“标准”似乎全面实施。 示例: 这个问题(评论) 2)在创建非空Win32项目时,Visual Studio提供的模型的一致性。 我这样做并注意到: “关于”对话框的回调函数是INT_PTR类型而不是BOOL ; WndProc函数返回0,而不是TRUE(这是1),如教程中所示; msg变量的switch语句默认返回DefWindowProc()而不是FALSE; 没有指定WM_CLOSE处理(我猜对话框对某些事件有默认处理)。 _ 因此,有一个奇怪的行为,其中名为Confirm的MessageBox失焦 – 即我无法单击“确定”和“取消”按钮。 问题:我是否正确地假设Visual Studio生成的模板代码比教程中的代码更正确,这对我来说似乎不值得信任? 如果是的话,我忘了什么吗? 我的代码出了什么问题,为什么我不能单击Messagebox按钮? 我的最终代码如下: #define WIN32_LEAN_AND_MEAN #include #include “resource.h” INT_PTR CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_DESTROY: PostQuitMessage(0); […]

重新启动Windows进程,保留进程ID和句柄

我创建了一个Windows可执行文件,作为某些嵌入式设备的模拟器(所有业务逻辑与原始设备完全相同,只有硬件相关的东西是存根的)。 此模拟需要不时重置,在“正常”用例中,它会执行以下操作: //some global environment … int main(int argc, char* argv[]) { __debugbreak(); //… do some stuff //if( restart needed ){ printf(“before _execv”); _execv(argv[0], argv); //”reset” simulated device //} //… do some other testing stuff return 0; } 注意:上面的代码仅用于说明主要思想,在实际应用中, execv调用实际上位于HW_Reset()存根中,即从原始代码中的多个位置调用。 问题是Windows上的_execv在Linux上的行为与execv完全不同:当我在Visual Studio中调试此应用程序时, _execv不会用“重新启动”的图像替换当前的过程映像。 相反,它只是创建一个带有新ID的新进程并终止当前进程,导致将其从Visual Studio中分离出来,因此,要保留我需要一次又一次地重新连接到该新进程的所有断点(在单个调试会话中有几十次重新启动) )。 目前我使用__debugbreak()作为解决方法。 其他选项是通过重新初始化全局环境并使用setjmp / longjmp的某种组合来重置模拟 – 但是全局环境和相应的初始化程序通过原始文件的thousends传播,并且大多数是静态的,因此无法手动处理此类重置(我也不允许编辑原始文件)。 所以问题是:是否有一些Windows API /通用解决方法通过重置所有全局(和静态)变量导致当前进程“就地”重新启动,例如,如果可以在同一地址内重新加载相同的进程映像空间,保留向外可观察的进程ID,进程句柄和与visual […]

arduino和visual studio c ++,2路串行通信

我正在使用Arduino和Visual studio c ++并尝试构建双向实时串行通信。 我正在使用的是win 10(在VMware Fusion中),32位系统,visual studio 2013,Arduino IDE 1.8.0和Arduino板Uno。 我使用了http://playground.arduino.cc/Interfacing/CPPWindows中的库文件,它们是两个文件: SerialClass.h和Serial.cpp。 我在我的主要使用readData()和WriteData()函数。 我想再运行几次,用户可以在控制台中输入,Arduino会相应地生成输出。 但是当我添加while循环时,它无法正常工作。 下面是我的main.cpp :(在注释行中使用while循环) int main() { Serial* port = new Serial(“COM3”); if (port->IsConnected()) cout << "Connected!" << endl; char data[4] = ""; char command[2] = ""; int datalength = 4; //length of the data, int readResult = 0; int n; […]

如何将Visual Studio中的结构打包到包含uint32_t的24位?

我试图将现有的应用程序从32位ARM微控制器移植到桌面平台,如Microsoft Windows。 GCC用在ARM上,我能够使用32位MinGW编译器在Windows上成功编译应用程序,但是我没有成功使用Microsoft的Visual Studio编译器,这就是我在这里寻求帮助的原因。 这是我的应用程序正在做的事情: 我有一些帧缓冲区,每个像素包含三个字节,所以我的内存看起来像RGBRGBRGB等等。 我在ARM上使用DMA通道将像素推出到显示器,我的显示器直接理解这种内存布局。 我还想节省一些CPU周期,所以我想使用ARM的饱和ADD __UQADD8来绘制我的帧缓冲区,使用单个操作在所有三个通道上执行饱和加法。 为此,我需要在一个整数中使用所有三个通道作为__UQADD8参数。 这就是我为帧缓冲区的一个像素使用联合的原因是通过提供一个包含R,G,B作为uint8_t的结构并提供与24位宽整数标记数据相同的内存来访问单独的通道: union Rgb { struct { uint8_t r; uint8_t g; uint8_t b; } ch; unsigned int data : 24 __attribute__((__packed__)); } 将24位宽度和打包属性添加到数据整数中,以将整数的宽度限制为三个字节。 然后我可以像这样使用像素中的数据: Rgb Rgb::operator+(const Rgb & op) { __UQADD8(data, op.data); return Rgb(data); } 请注意, __UQADD8神奇地只写入我的整数的四个字节中的三个,并且不会改变我的帧缓冲区中下一个RGB的R通道。 以下测试程序certificate我的RGB在使用GCC时都紧凑: #include #include union Rgb { struct { uint8_t […]

什么是TCHAR字符串和Win32 API函数的“A”或“W”版本?

什么是TCHAR字符串,例如LPTSTR和LPCTSTR以及如何使用这些字符串? 当我在Visual Studio中创建一个新项目时,它为我创建了这个代码: #include int _tmain(int argc, _TCHAR* argv[]) { return 0; } 例如,我如何连接所有命令行参数? 如果我想打开第一个命令行参数给出的名称的文件,我该怎么做? Windows API定义了许多函数的“A”和“W”版本,例如CreateFile , CreateFileA和CreateFileW ; 那么这些如何彼此不同以及我应该使用哪一个?

visual studio c链接器包装选项?

本文使用C中的模拟对象进行unit testing 这是通过使用–wrap链接器选项来完成的,该选项将包装函数的名称作为参数。 如果测试是使用gcc编译的,则调用可能如下所示: $ gcc -g -Wl,–wrap=chef_cook waiter_test.c chef.c 在visual studio中编译ac项目时如何做到这一点?

关于使用#pragma region在Visual Studio中折叠代码块

在VisualStudio中,当你编写一个函数时,它可以折叠成轮廓,每个人都知道它。 您还可以使用#pragma region和#pragma endregion手动指定代码区域,以便它可以折叠。 但是我发现了一个问题,如果任何折叠的代码块都在#pragma region ,它们就不能再崩溃了。 有什么办法可以解决吗? <img src="http://sofzh.miximages.com/c%2B%2B/933Ba.png" alt=" funcA(), funcB(), funcC()可以折叠”> <img src="http://sofzh.miximages.com/c%2B%2B/I8mFO.png" alt="添加 #pragma region 后,它们无法独立折叠。”>

为什么必须在运算符重载中提供关键字const

只是好奇为什么一个param必须是一个const操作重载 CVector& CVector::operator= (const CVector& param) { x=param.x; y=param.y; return *this; } 难道你不能轻易做到这样的事吗? CVector& CVector::operator= (CVector& param) //no const { x=param.x; y=param.y; return *this; } 当某些东西变成const时,它对于应用程序生命的其余部分是不可改变的? 这在操作重载方面有何不同?