1. 程式人生 > >這些沒躲過的坑

這些沒躲過的坑

2018.05.05

本次需要統計4096個畫素的平均值,使用瞭如下程式碼

double CtuMean=temp/height*width;
錯誤的原因是沒有考慮到運算子的優先順序,以後這種情況要注意。儘量加個括號。

2018.05.07

vs2005以上,使用strcat()函式時,會提示“建議使用strcat_s()”函式,如果不想使用這個函式,關閉預編譯提醒,

在專案->屬性->C/C++–>前處理器->前處理器定義中新增“_CRT_SECURE_NO_WARNINGS”,即可關閉“_CRT_SECURE_NO_WARNINGS”的警告。

2018.05.25

寫了一個程式,對監控類視訊進行運動檢測,主函式是這麼寫的。

#include "interface.h"
#include<iostream>
#include <time.h>

//#define FRAME_SIZE 3110400 //1920*1080解析度
#define FRAME_SIZE 1382400   //1280*720解析度
char yuvData[FRAME_SIZE];
char resultMatrix[128][128];//檢測區域最大128x128
bool alarmResult;
int main()
{
...
//讀取檔案到記憶體
fread(yuvData, sizeof(char), sizeof(yuvData), InputFile);
...
}

出現的問題:
1.”0xC0000005: 寫入位置 0x00000000 時發生訪問衝突的解決辦法”
原因:第一次試驗用的1920*1080解析度視訊,後來換了1280*720解析度,但是巨集定義的大小沒有變,還是原來1920*1080解析度的大小。導致讀取檔案出錯,引起後邊一系列出錯。
2.char yuvData[FRAME_SIZE];放在main函式中報錯,棧溢位。
全域性變數在靜態儲存區分配記憶體,區域性變數是在棧上分配記憶體空間的。(c++在執行時會動態建立一個堆疊段,裡面存放著呼叫棧,儲存著函式的呼叫關係和區域性變數。)如果陣列太大,可能會造成棧溢位。大陣列最好放在全域性變數區

2018.06.04

幾天不寫程式碼,就忘了VS操作中如何從函式定義的一個括號轉到結束處的另外半個括號的方法,記錄一下:

ctrl+]

2018.06.26

1.這兩天在學習FFMPEG,配置一直不成功,include和lib都弄好了,就是編譯的時候顯示無法引用,後來想起來我下載的是64位的,而vs2013選擇的是win32模式,切換到x64模式下後,立馬編譯成功了,發現原來ffmpeg的dev版本是對x64和win32敏感的,下載什麼版本的dev就用什麼版本的編譯器配置就對了
2.像Opencv、FFMPEG、SDL這些第三方庫,在vs配置中都需要在三個地方改東西:

  • c/c++->常規->附加包含目錄中讓包含庫目錄的include
  • 連結器->常規->附加庫目錄讓包含庫目錄的lib
  • 連結器->輸入->附加依賴項,輸入lib目錄下的*.lib的名稱全稱。