C++ 如何辨識代碼是在 gcc 上面跑還是 vc 上跑
有些時候我們會需要能夠識別到底是在 gcc 上還是 visual Studio 上跑,畢竟兩者之間相容性還是有很大區別的,可以利用 Macro 來偵測。
如以下範例,把代碼打在裡面就自然會在正確的編譯器上運行了。
#if defined(_MSC_VER)
/* VC */
#endif
#if defined(__GNUC__)
/* gcc */
#endif
本站建議搭配 Hover Zoom+ chrome 擴充套件,可自動放大圖片
( 站內文介紹: https://goo.gl/BnBSGa )
網站搜索不是很好用建議使用google底下括號內是範例,整串打進google搜索內;
[ site:https://charlottehong.blogspot.tw/ 你要搜索的內容 ]
#if defined(_MSC_VER)
/* VC */
#endif
#if defined(__GNUC__)
/* gcc */
#endif
可以從官方下載免費版的,可以用只是會限制上傳大小
可以從板子上的網址連過去下載
可以直接從uVision5內更新或下載
可以從板子上的網址連過去下載
到這邊環境已經架設好可以跑瞜~
STM32Cube_FW_F4_V1.16.0\Projects\STM32469I-Discovery\Examples
GPIO\GPIO_EXTI\MDK-ARM
MDK-ARM是寫給我們剛剛安裝的軟體用的範例代碼。如果想直接讓他跑到底直接看結束,可以翻板子後面reset按一下就會自動跑完了,不過跑完就不能重來了,要除錯再按 ctrl+f5 重跑一次就好了。
如果需要臨時開到別的硬碟,去BIOS開啟F12選單,可以選硬碟
已經裝了沒事就好了,開機慢一點還是可以用。
關於 Visual Studio 2017 如何安裝可以參考 https://charlottehong.blogspot.com/2018/09/c-visual-studio-2017.html
建議直接解壓縮到C槽,本文範例即直接解壓縮到C
C:\opencv\build\x64\vc15\bin
LNK1104 無法開啟檔案 'opencv_worldXXXd.lib'
/**********************************************************
Name :
Date : 2016/05/29
By : CharlotteHonG
Final: 2016/05/29
**********************************************************/
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char const *argv[]) {
/* 畫布 */
Mat img(270, 720, CV_8UC3, Scalar(56, 50, 38));
/* 直線 */
line(img, Point(20, 40), Point(120, 140), Scalar(255, 0, 0), 3);
/* 實心方塊 */
rectangle(img, Point(150, 40), Point(250, 140), Scalar(0, 0, 255), -1);
/* 實心圓 */
circle(img, Point(330, 90), 50, Scalar(0, 255, 0), -1);
/* 空心橢圓 */
ellipse(img, Point(460, 90), Size(60, 40), 45, 0, 360, Scalar(255, 255, 0), 2);
/* 不規則圖形 */
Point points[1][5];
int x = 40, y = 540;
points[0][0] = Point(0 + y, 50 + x);
points[0][1] = Point(40 + y, 0 + x);
points[0][2] = Point(110 + y, 35 + x);
points[0][3] = Point(74 + y, 76 + x);
points[0][4] = Point(28 + y, 96 + x);
const Point* ppt[1] = { points[0] };
int npt[] = { 5 };
polylines(img, ppt, npt, 1, 1, Scalar(0, 255, 255), 3);
/* 繪出文字 */
putText(img, "Test Passed !!", Point(10, 230), 0, 3, Scalar(255, 170, 130), 3);
/* 開啟畫布 */
namedWindow("OpenCV Test By:Charlotte.HonG", WINDOW_AUTOSIZE);
imshow("OpenCV Test By:Charlotte.HonG", img);
waitKey(0);
return 0;
}
如果做到這邊才發現跟我一樣選錯了,要退回去include路徑那步重作
設定裡面 x86->x64 改了全部會歸零…
出現找不到 dll 檔案,重新啟動一下 Visual Studio 2017 。
00 FF 01 0A
那你要反著讀變成 0A 01 FF 00
而不是直接讀取。(注意看細微變化 01 不會變成 10)有興趣的可以查查這個詞 Endianness:https://goo.gl/xu9uYB
struct BmpFileHeader{
uint16_t bfTybe = 0x424D;
uint32_t bfSize;
uint16_t bfReserved1 = 0;
uint16_t bfReserved2 = 0;
uint32_t bfOffBits = 54;
};
unsigned char type[2]= {'B', 'M'};
,他就是固定的識別代碼,標準規定。類內初始化:C++11標準才可以使用
使用 g++ 加上-std=c++11
參數即可,如g++ -std=c++11 source.cpp
Visual Studio 2017 以上就直接是 C++11 了,不需要設置。
struct BmpInfoHeader{
uint32_t biSize = 40;
uint32_t biWidth;
uint32_t biHeight;
uint16_t biPlanes = 1; // 1=defeaul, 0=custom
uint16_t biBitCount;
uint32_t biCompression = 0;
uint32_t biSizeImage = 0;
uint32_t biXPelsPerMeter = 0; // 72dpi=2835, 96dpi=3780
uint32_t biYPelsPerMeter = 0; // 120dpi=4724, 300dpi=11811
uint32_t biClrUsed = 0;
uint32_t biClrImportant = 0;
};
8*3=24
,灰階圖設8
*3
實測有些軟體存出來的bmp的biSizeImage會是0,建議用長x寬自己算像素值。
00
),直接就是沒有才是正確的。00 00 00 00~ FF FF FF 00
而已,這是因為灰階圖只需用一個byte表示,但是整張BMP需要用 RGB 表示,所以調色盤的功用就是把看到的RAW檔,就比如看到 00
變成 00 00 00
看到 FF
變成 FF FF FF
。總的來說意思是自訂規則從 “單一通道” 解析出 “RGB三通道”。
for(unsigned i = 0; i < 256; ++i)
img << uch(i) << uch(i) << uch(i) << uch(0);
size_t RealWidth = Width * bits/8;
size_t alig = (RealWidth*3)%4;
char(0)
就是 0x0000char(0)
就是 0x000000值得注意的是公式要針對不同的位元的圖片做不同的處理
圖的實際位元寬度*3 % 4
這樣。FileHeader 的 size +1024
FileHeader 的 headSize +1024
InfoHeader 的 size +1024
InfoHeader 的 ncolours =256
size_t alig = ((width*bits/8)*3) % 4;