static在C/C++中的做用?有初始化值的做用嗎?
1.先來介紹它的第一條也是最重要的一條:隱藏
當咱們同時編譯多個文件時,全部未加static前綴的全局變量和函數都具備全局可見性。若是加了static,就會對其它源文件隱藏。
2.static的第二個做用是保持變量內容的持久。
存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是惟一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static能夠控制變量的可見範圍,說到底static仍是用來隱藏的。
3.static的第三個做用是默認初始化爲0.其實全局變量也具有這一屬性,由於全局變量也存儲在靜態數據區。
在靜態數據區,內存中全部的字節默認值都是0x00,某些時候這一特色能夠減小程序員的工做量。好比初始化一個稀疏矩陣,咱們能夠一個一個地把全部元素都置0,而後把不是0的幾個元素賦值。若是定義成靜態的,就省去了一開始置0的操做。
產生疑問的例子:
static char str[10]; —— 這將建立一個容量爲10的字符數組。我猜static對你而言或者有些陌生,若是這樣就忽略它。這只不過會在建立數組的同時對其進行初始化。node
標誌在C++中的含義?ios
clear()函數?
清除併發隊列,銷燬全部當前已排入隊列的元素。 此方法不是併發安全方法。併發(在操做系統中,是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。
併發環境下,因爲程序的封閉性被打破,出現了新的特色:
①程序與計算再也不一一對應,一個程序副本能夠有多個計算
②併發程序之間有相互制約關係,直接制約體現爲一個程序須要另外一個程序的計算結果,間接制約體現爲多個程序競爭某一資源,如處理機、緩衝區等。
③併發程序在執行中是走走停停,斷續推動的。)c++
文件流句柄?
在文件I/O中,要從一個文件讀取數據,應用程序首先要調用操做系統函數並傳送文件名,並選一個到該文件的路徑來打開文件。該函數取回一個順序號,即文件句柄(file handle)。程序員
示例1:簡單的狀態檢測
// 實際應用中可將 FileStream替換成你相應在使用的文件流句柄
if(FileStream.rdstate() == ios::eofbit)
cout << "End of file!\n";
if(FileStream.rdstate() == ios::badbit)
cout << "Fatal I/O error!\n";
if(FileStream.rdstate() == ios::failbit)
cout << "Non-fatal I/O error!\n";
if(FileStream.rdstate() == ios::goodbit)
cout << "No errors!\n";算法
Test.clear(ios::goodbit); //將當前狀態重置爲ios::goodbitexpress
Test.clear(ios::eofbit); // 將狀態標誌設爲ios::eofbit. 無實際用途.
這裏都說了無實際用途,那爲何還要這樣弄呢?編程
形如gcount()之類的函數的頭文件及他們的用法?
gcount()之類的函數的頭文件是#include<iostream>,windows
形如 File.seekg(ios::beg);函數的頭文件及他們的用法?數組
error C2872: 「move」: 不明確的符號
1> 多是「e:\c++課設測試\c++課設測試\貪吃蛇.cpp(84) : move」
1> 或 「move」緩存
問題解決:
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h> //使用當前時間作種子;
using namespace std;
enum dir{up,down,left,right}; //枚舉類型enum dir;
//圍牆;
class Fence
{
public:
void InitFence();
void OutputF();
public:
char game[20][20];
}f; //定義對象;
//畫框框;
void Fence::InitFence()
{
for(int i=0; i<20; i++)
for(int j=0; j<20; j++){
if(i==0||i==19||j==0||j==19)
game[i][j]= '*';
else game[i][j]= ' ';
}
}
//顯示框框;
void Fence::OutputF(){
for(int i=0; i<20; i++){
for(int j=0; j<20; j++)
cout<<game[i][j]<<' ';
cout<<endl;
}
}
//蛇結點;
class SnakeNode
{
private:
int x,y;
SnakeNode *prior,*next;
public:
void add_head(int x,int y);
int get_x();
int get_y();
void delete_tail();
}*head=NULL, *tail =NULL;
//插入頭結點;
void SnakeNode::add_head(int x,int y)
{
SnakeNode *q=new SnakeNode;
q->x =x; q->y =y;
q->next =head;
q->prior =NULL;
if(head) head->prior =q;
head =q;
if(!tail) tail =head;
f.game[x][y]= '*'; //f對象能夠在定義Fence類時定義; 且Fence類在SnakeNode類前定義;
}
int SnakeNode::get_x()
{
return x;
}
int SnakeNode::get_y()
{
return y;
}
//刪除尾結點;
void SnakeNode::delete_tail()
{
SnakeNode *p =tail;
f.game[tail->get_x()][tail->get_y()]= ' ';//把尾結點的座標表示的'*'置爲空格;
if(tail==head)
tail= head= NULL;
else{
tail= tail->prior;
tail->next= NULL;
}
delete p;
}
//yidong移動;
class yidong
{
public:
dir point; //枚舉變量point: 控制方向;
int food_x;
int food_y;
public:
void moving();
void change_point(char); //改變方向;
void get_food();
};
void yidong::moving()
{
int a,b;
a= head->get_x(); //取得頭結點橫座標
b= head->get_y(); //頭結點縱座標
switch(point){
case dir::up: --a; break;
case dir::down: ++a; break;
case dir::left: --b; break;
case dir::right: ++b; break;
}
if(a==19||b==19||a==0||b==0)
{ //判斷是否撞牆;
cout<<"game over!!!"<<endl;
exit(0);
}
if(a==food_x && b==food_y)//吃food;
{
head->add_head(a,b);
get_food();
}
else{
head->add_head(a,b); //插入頭結點;
head->delete_tail(); //刪除尾結點;
}
}
void yidong::change_point(char keydown){
switch(keydown){
case 'w': point= dir::up; break;
case 's': point= dir::down; break;
case 'a': point= dir::left; break;
case 'd': point= dir::right; break;
}
}
void yidong::get_food(){
srand((unsigned int) time(NULL)); //作種子(程序運行時間);
food_x= rand()%18+1;
food_y= rand()%18+1;
f.game[food_x][food_y]= '*';
}
//main();
int main(){
cout<<"Using 'w,s,a,d'to control direction!!!\n\n\n";
//畫框框和小蛇;
yidong m;
f.InitFence();
head->add_head(4,3);
head->add_head(4,4);
head->add_head(4,5);
m.get_food();
f.OutputF();
while (true){
char keydown= getch(); //getch()返回鍵盤上讀取的字符;包含頭文件<conio.h>
m.change_point(keydown);
while(!kbhit()){ //判斷有沒有按鍵落下;
system("cls"); //清屏函數;
m.moving();
f.OutputF();
Sleep(200);
}
}
return 0;
}把上面這個程序中的move替換爲yidong後就行了,我想一想和或許是由於move是軟件的內部定義的,不能有程序員本身來定義。
error C3861: 「strcmp」: 找不到標識符的解決方法就是加頭文件:#include<string.h>
: error C3861: 「shijian」: 找不到標識符:說明這個函數在要調用它的函數的後面,而其沒有聲明;還有可能就是這個函數被調用了,可是在程序中根本就沒有這個函數。(注意:錯誤的是函數的形式,而不是變量的形式)
void shijian()//輸出銷售本產品是的時間
{
struct tm when;
time_t now;
time(&now);
when=*localtime(&now);
printf(" %s\n",asctime(&when));
}感受含神奇啊?
getchar();和 getch();的區別?還有他們的用法?做用?
fscanf與scanf的區別?
scanf從鍵盤輸入 fprintf(格式化輸出數據至文件)
fscanf從文件輸入 fscanf(格式化字符串輸入)
printf(格式化輸出數據) sacnf(格式化字符串輸入)
sprintf(格式化字符串複製) sscanf(格式化字符串輸入)
在個人ACM中有文件
dat和txt的區別?
goto語句的做用範圍?
變控制流,沒法經過自己返回。要用goto返回,能夠定義多個label,在不一樣位置配合不一樣label使用goto語句。
label在函數內定義,做用域就是整個函數,和其它名稱同樣沒法改變。因爲不是左值,它沒有生存期,僅在編譯期有意義。
C/C++語言中能夠放在賦值符號左邊的變量,即具備對應的能夠由用戶訪問的存儲單元,而且可以由用戶去改變其值的量。左值表示存儲在計算機內存的對象,而不是常量或計算的結果。或者說左值是表明一個內存地址值,而且經過這個內存地址,就能夠對內存進行讀而且寫(主要是能寫)操做;這也就是爲何左值能夠被賦值的緣由了。相對應的還有右值:當一個符號或者常量放在操做符右邊的時候,計算機就讀取他們的「右值」,也就是其表明的真實值。簡單來講就是,左值至關於地址值,右值至關於數據值。右值指的是引用了一個存儲在某個內存地址裏的數據。
內存地址,指系統 ram 中的特定位置,一般以十六進制的數字表示。
Run-Time Check Failure #3 - The variable 'hitkey' is being used without being initialized.?這句話的意思是使用了未被初始化的hitkey.當出現中斷時只要把此初始化便可。
continue;break;return的區別?
break 跳出總上一層循環,再也不執行循環(結束當前的循環體)
continue 跳出本次循環,繼續執行下次循環(結束正在執行的循環 進入下一個循環條件)
return 程序返回,再也不執行下面的代碼(結束當前的方法 直接返回)
strcat?注意string頭文件中幾種函數的用法?
fwrite(&library.count,sizeof(int),1,fp);的用法?
fflush(stdin);是什麼意思?它的做用和用法?頭文件?
用來清空輸入緩存,以便不影響後面輸入的東西
清除緩衝區。好比你逐個輸入字符,他幫你緩衝掉你每輸入一個字符後面所敲的回車鍵。不然回車也會被當成字符保存進去
error C3872: 「0x3000」: 此字符不容許在標識符中使用?
0x3000是漢語的空格,也就是全角空格,至關於一個漢字,但你又看不見它。
你知道的,像逗號,有半角(,)和全角(,)之分的,其實空格也有。
0x3000是全角的空格,0x20是半角的空格。
你最好把這個語句的後面空白部分,都刪除掉,省得有不可見的全角空格。
C2064: 項不會計算爲接受 0 個參數的函數?
例如:
temp3=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)(1-x1),錯誤就在這裏,應該是:
temp3 = 100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1),最後這個括號前少了個乘法符號
C++課設測試.exe 中的 0x00fb1ce2 處有未經處理的異常: 0xC0000005: 讀取位置 0x33622954 時發生訪問衝突?(這好像是內存分配的問題)
緣由解析:
關於0xC0000005問題:
0xC0000005: Access Violation錯誤調試- -
1》數據越界或是定義的指針未釋放.
2》空的指針的可能性最大。使用指針前最好能顯式的賦值!
應該是指針的問題
3》內存訪問錯誤,檢查指針,是否爲空,是否越界等
可能性 3 種
1:
char *p;
p = new char[number];
delete [] p;
....
// always using p....
p = xxx; // access violation
2:
char *p;
memcpy(p, xxx, number); // access violation
3:
char *p;
p = new char[number];
delete [] p;
.........
delete [] p; // access violation
錯誤處理:
數據越界,argv[0]中有漢字。其實問題就是如何解決wcout輸出漢字
修改以下:
#include "stdafx.h"//在stdafx.h添加#include <iostream> #include<locale>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"argc="<<argc<<endl;
wcout.imbue(locale("chs"));
for(int i=0;i<argc;i++)
{
wcout<<"argv[0]="<<argv[0]<<endl;
}
cin.get();
return 0;
}
辨別:
1.cout在設計時具備智能判斷功能,不管是char*類型,仍是string類型,都能獲得正確的結果。
2.wcout指定要輸出寬字符,每一個字符佔兩個字節,咱們所用的字符串如:"hello",要想讓其按寬字符處理,必須加L,即L"hello",中文也是這樣要求。
3.GCC編譯器不支持wcout關鍵字。
fwrite(&stud,sizeof(STUDENT),1,fp);和 fread(&stud,sizeof(STUDENT),1,fp);的用法?
1.函數功能
用來讀寫一個數據塊。
2.通常調用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
3.說明
(1)buffer:是一個指針,對fread來講,它是讀入數據的存放地址。對fwrite來講,是要輸出數據的地址。
(2)size:要讀寫的字節數;
(3)count:要進行讀寫多少個size字節的數據項;
(4)fp:文件型指針。
注意:1 完成次寫操(fwrite())做後必須關閉流(fclose());
2 完成一次讀操做(fread())後,若是沒有關閉流(fclose()),則指針(FILE * fp)自動向後移動前一次讀寫的長度,不關閉流繼續下一次讀操做則接着上次的輸出繼續輸出;
3 fprintf() : 按格式輸入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不過不是寫到控制檯,而是寫到流罷了。注意的是返回值爲這次操做寫入到文件的字節數。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10字節;str2: 10字節;a:2字節;b:8字節,c爲33,由於寫入時不一樣的數據間自動加入一個空格。
文件使用以後必定要關閉,不然將不能正確顯示內容.fwrite:讀入兩個學生信息而後用fwrite存入文件
fread:用fread從文件中讀出學生信息。
clrscr();的頭文件和用法?
清除文本模式窗口 清屏的意思 就是把以前顯示出的文字字符去掉 跟cmd裏面的清屏的功能是同樣的 其實是clear screen的簡寫
#include<conio.h>
strcmp的用法?做用?頭文件?還有和這類似的幾個函數的用法?
原型:int?strcmp(char?*str1,char?*str2)?
功能:把兩字符串str1與str2進行比較,當str1>str2,函數返回1,當str1==str2時,函數返回0,當str1<str2時函數返回-1;
在個人ACM中有文件
cprintf的用法?
函數名: cprintf
功 能: 送格式化輸出至屏幕
用 法: int cprintf(const char *format[, argument, ...]);
頭文件: conio.h
this指針的用法?
在個人ACM中有文件
內存的動態分配?
在個人ACM中有文件
gets函數的用法?
Run-Time Check Failure #3 - The variable 'stu_num' is being used without being initialized.?
在調試的時候顯示:Cannot find or open the PDB file 是怎麼回事?
工具?選項?調試?符號?windows符號服務器打鉤,就能夠了!
C語言經典代碼.vcxproj -> E:\C語言經典代碼\Debug\C語言經典代碼.exe 是什麼意思?
%運算符爲何不可以使用double型,只可以使用int型?
二分法?用法?做用?
正在建立「Debug\C語言經典代碼.unsuccessfulbuild」,由於已指定「AlwaysCreate」 是什麼意思?
Windows 已在 C語言經典代碼.exe 中觸發一個斷點。
其緣由多是堆被損壞,這說明 C語言經典代碼.exe 中或它所加載的任何 DLL 中有 Bug。
緣由也多是用戶在 C語言經典代碼.exe 具備焦點時按下了 F12。
輸出窗口可能提供了更多診斷信息。 這是怎麼了?
stricmp(p,"end")的做用?用法?頭文件?
「exit」: 沒有重載函數接受 0 個參數 是由於exit(); 應該改成exit(1); 或exit(0);
如今主要的是他們的區別是?
program files\microsoft sdks\windows\v7.0a\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800 ???
引用了標籤,可是爲對其進行定義???
window(2,2,79,24);
textbackground(LIGHTGREEN);
textcolor(YELLOW);
clrscr();
這些東西的頭文件是??做用??用法??
fatal error C1083: 沒法打開包括文件:「d3d8.h」: No such file or directory???
「this」: 只能在非靜態成員函數的內部引用???
「->next」的左邊必須指向類/結構/聯合/泛型類型???
scanf("%s",d); 和scanf("%s",&d);的區別??
scanf("%s",d); 和scanf_s("%s",d);的區別???爲何有的時候用scanf_s("%s",d);不報錯,可是就是不可以實現函數???
printf(">>產品號:%d\n",emp[i].no);
printf(">>產品名:%s\n",emp[i].name);
printf(">>**品牌:%s\n",emp[i].kind);
printf(">>**價格:%f\n",emp[i].price);
printf(">>**數量:%d\n",emp[i].num); 輸出的是一大串很奇怪的燙字???
答案:這個問題有多是少加了一個花括號。
C++課設測試.exe 中的 0x00a22338 處有未經處理的異常: 0xC0000005: 讀取位置 0x335c1930 時發生訪問衝突???
C++課設測試.exe 中的 0x002b2381 處有未經處理的異常: 0xC0000005: 讀取位置 0x33472114 時發生訪問衝突???
Windows 已在 C++課設測試.exe 中觸發一個斷點。
其緣由多是堆被損壞,這說明 C++課設測試.exe 中或它所加載的任何 DLL 中有 Bug。
緣由也多是用戶在 C++課設測試.exe 具備焦點時按下了 F12。
輸出窗口可能提供了更多診斷信息。???
error C2541: 「delete」: 不能刪除不是指針的對象???
C++課設測試.exe 中的 0x755a812f 處有未經處理的異常: Microsoft C++ 異常: 內存位置 0x0030e8fc 處的 std::bad_alloc。 這是爲何呢???
當程序中斷時出現
pvBlk = _heap_alloc_dbg_impl(nSize, nBlockUse, szFileName, nLine, errno_tmp
這是爲何???
break、return和c的區別和用法?他們的做用分別是什麼???
getche();的做用和用法???
不是全部的控件路徑都返回值???
一、簡介:vc編譯時報這個警告,雖然不是錯誤,但是這確實一個徹徹底底的bug。
二、產生緣由:帶返回值的函數在最後沒有return x。
三、後果:調用這個函數時獲得的返回值不必定是正確的。
四、實質:若是非void返回值的函數在結尾沒有return,運行時程序若是須要在最後return,則將距離函數尾部最近的return做爲該函數的結尾return。
五、臨牀表現:程序運行時有時候是正確的,有時候又是錯誤的,當某種條件符合時(就是確定運行到函數尾部),這種錯誤就一直出現。
typedef的用法???
例如:typedef int size;
此聲明定義了一個int的同義字,名字爲size。注意typedef並不建立新的類型。它僅僅爲現有類型添加一個同義字。你能夠在任何須要int的上下文中使用size:
其實typedef的主要做用就是爲了提升程序的可讀性和之後好維護程序。它的做用在不少方面都比宏定義要好。
VS2010沒法打開源文件<graphics.h> ??
嗯,這個是很是正常的,由於這個頭文件不是微軟的編譯器的,在tc下才有這個頭文件
找不到標示符???
只要加上相應的頭文件就能夠了
LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞????
終極解決方案:
VS2010在經歷一些更新後,創建Win32 Console Project時會出「error LNK1123」 錯誤,解決方案爲將 項目|項目屬性|配置屬性|清單工具|輸入和輸出|嵌入清單 「是」改成「否」便可,可是沒新建一個項目都要這樣設置一次。
在創建VS2010 Win32 Project項目時,按照上面解決方案依然發生了「error LNK1123」錯誤,通過上網查資料,解決方案爲:
第一步:與上相同。
第二步:將 項目|項目屬性|配置屬性|鏈接器|清單文件|嵌入清單 「是」改成「否」。
第三步:通常計算機通過上兩步設置就能解決問題了,可是若是還有問題,那就按一下方法解決:
計算機是否爲64bit操做系統,如是,繼續2。
查找是否有兩個cvtres.exe。一個是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe, 另外一個是C:\Windows\Microsoft.NET\Framework\v
4.0.30319\cvtres.exe。右鍵屬性|詳細信息 查看二者版本號,刪除/重命名較舊的版本,或者從新設置Path變量。
意外的是,治本的辦法是第三步,刪除舊版本的cvtres.exe後,就不須要每次都設置配置了。
不容許使用繼承成員???
在類的定義中增長該函數的定義,並在最前面加上virtual關鍵字。
「CreateList」: 不是全部的控件路徑都返回值???
應該指的是函數中有些分支語句沒有加return;
「!=」: 運算符不起任何做用;應輸入帶反作用的運算符???
若是表達式語句在表達式頂部有一個沒有任何反作用的運算符,則它多是錯誤。
若要重寫此警告,請將表達式置於圓括號中。
int scanf(const char *,...)」: 沒法將參數 1 從「ElemType *」轉換爲「const char *」???
在C++中建單鏈表時爲何通常都要用到(typedef int elemtype)???
無非就是爲了未來修改方便,如今是int,未來若是想變成long或者其餘的,直接修改typedef int elemtype;爲typedef long elemtype; 就能夠了。
cpp(4) : error C2447: 「{」: 缺乏函數標題(是不是老式的形式表?) vc2008???
前面多了分號。
error C2664: 「BOOL CDC::TextOutW(int,int,const CString &)」: 不能將參數 3 從「const char [18]」轉換爲「const CString &」???
1 在要輸出的字符串前面加上_T()測試宏,或者TEXT()宏,如:pDC->TextOut(10,10,_T("這是一個MFC程序!"));
如 L"個人字符串"表示將ANSI字符串轉換成unicode的字符串,就是每一個字符佔用兩個字節。
strlen("asd")=3;
strlen(L"asd")=6;
2、 _T宏能夠把一個引號引發來的字符串,根據你的環境設置,使得編譯器會根據編譯目標環境選擇合適的(Unicode仍是ANSI)字符處理方式
若是你定義了UNICODE,那麼_T宏會把字符串前面加一個L。這時 _T("ABCD") 至關於 L"ABCD" ,這是寬字符串。
若是沒有定義,那麼_T宏不會在字符串前面加那個L,_T("ABCD") 就等價於 "ABCD"
3、TEXT,_TEXT 和_T 同樣的
以下面三語句:
TCHAR szStr1[]=TEXT("str1");
char szStr2[]="str2";
WCHAR szStr3[]=L("str3");
那麼第一句話在定義了UNICODE時會解釋爲第三句話,沒有定義時就等於第二句話。
但二句話不管是否認義了UNICODE都是生成一個ANSI字符串,而第三句話老是生成UNICODE字符串。
爲了程序的可移植性,建議都用第一種表示方法。
但在某些狀況下,某個字符必須爲ANSI或UNICODE,那就用後兩種方法。
vc2010MFC對話框:IntelliSense: 沒有與這些操做數匹配的 "+" 運算符???
由於4nChar是UNIT類型的,而m_strline是CString類型的,不e同類型的不r能進行加減、賦值等操做。改爲m_strLine+=(char)nChar就好了j kw
vSQL="INSERT INTO jbxxinfo(YGid,YGname,Sex,Degree)VALUES(\'"+YGid+"\',\'"+YGname+"\',\'"+Sex+"\',\'"+Degree+"\')"; /////須要轉義標識符
沒法將參數 1 從「const char [10]」轉換爲「const wchar_t *」與指向的類型無關;轉換要求 reinterpret_cast、C 樣式轉換或函數樣式轉換
pure specifier can only be specified for functions???
出錯的代碼位於Priority.hh中,代碼爲:
static const int MESSAGE_SIZE = 8;
這個錯誤改起來很簡單,只要將這行代碼改成:
static const int MESSAGE_SIZE;
而後定位到Priority.cpp文件中,添加如下代碼:
const int Priority::MESSAGE_SIZE = 8;
主要是由於VC6.0不支持的緣由。
'CInput' : 'operator =' function is unavailable???
undefined???未被定義的
對,提示是變量定義問題,必須在同一個地方定義!
cannot access protected member declared in class ???
不能訪問受保護的成員在類聲明
see declaration of 'CStudent::CStudent'???
class Student
{
public:
int age;
Student(int a = 10);
};
Student::Student(int a = 10)
{
}
改法:
Student::Student(int a )
{
}
uses undefined class???
使用未定義的類
今天遇到了這樣的錯誤:error C2079: 'xxx' uses undefined class 'yyy'
不得不認可本身有土鱉的基因。原本是很普通的一件事情。
本身竟然不知道。
恰好碰到網上一個達人的分析文章,以爲很是經典的分析了這個經典的問題。固轉載以下:
好比說,咱們先定義一個b類再定義一個a類,a的一個成員就是b,以下:
class b{
int i;
};
class a {
b val ;
};
這顯然是能夠的。
若是這個時候,要把b的定義放到後面去,你們都知道在前面先聲明b,那麼:
class b;
class a {
b val ;
};
class b{
int i;
};
這段對不對呢?若是不編譯,直觀感受,我之前總覺得是能夠的。。
但實際上是經過不了編譯的。那麼再改,把val換成對b的指針,這樣:
class b;
class a {
b * val ;
};
class b{
int i;
};
而後就能夠了。
那麼,直接給出一條重要的結論:
超前引用不可以使用類名來定義變量和函數的變量參數,只可用來定義引用或者指針。
要解釋實際上是很簡單的,由於編譯器在處理類的時候,要爲他的成員分配空間。
若是咱們用指針,那麼直接分配4個字節就能夠了,就像:
class b;
class a;
class a {
b *val ;
};
class b{
a *val ;
};
可是,若是成員變量是類呢??
class b;
class a;
class a {
b val ;
};
class b{
a val ;
};
這種狀況下,就比如把兩面鏡子對着放置同樣。。
當處理到a的val的時候,發現是個b,那麼給b留出空間,
爲了知道給b留出多少空間,再看b,發現b的val是a,
那麼又須要再知道該給a多少空間。。。
這個道理實際上是很顯然的。
因此,VC編譯的時候說'xxx' uses undefined class 'yyy' 。
也許你以爲這些是很顯然的事情,本身寫的時候不會犯這種傻。
那麼要當心的就是STL了。好比說你list <myClass>。
而這個時候myClass是處於已定義狀態,則沒有問題。
若是這個時候myClass是處於聲明狀態,則會有很大的問題。
而VC6對STL報錯的囧況,想必用過的人都知道。
每每都是一大堆,要從中提取有用的信息很不容易。
唉。。也許是我入門看的資料太瓜了。。雖然超前聲明這個概念處處都提,
卻沒怎麼見有人專門指出這點。。看來有時間仍是要從頭學學國外名著了。。。
今天發現這個問題,也是由於咱們助教給的一堆接口及實現。
我如今真的是嚴重懷疑他究竟有沒有編譯經過。。。改了我半天。。
就算他經過了,也是儼然一不標準的用法。明顯是留有邏輯黑洞的隱患的。
衆所周知,VS能夠編譯好些VC不能編譯的東西。。
緣由是放寬了對標準的審覈
又衆所周知,DEV能夠編譯好些VC不能編譯的東西。。
緣由是VC對C++的有些標準實現上有問題
超前引用不可以使用類名來定義變量和函數的變量參數,只可用來定義引用或者指針。
要解釋實際上是很簡單的,由於編譯器在處理類的時候,要爲他的成員分配空間。
若是咱們用指針,那麼直接分配4個字節就能夠了,就像:
class b;
class a;
class a {
b *val ;
};
class b{
a *val ;
};
error C2660: 「strcpy_s」: 函數不接受 2 個參數???
代碼:
char data[256] = {0};
strcpy_s(data, "aaaaaa");
這個代碼在xp系統裏是正常的,我把代碼拷貝到wince下編譯出錯,信息以下:
error C2660: 「strcpy_s」: 函數不接受 2 個參數 wince
我看了一下,須要3個參數
改爲 strcpy_s(data, 255, "aaa"); 就編譯經過了,啥緣由?XP系統和Wince下不能一樣的寫??
rogerwu wrote:
strcpy_s((char *)deviceName, sizeof(deviceName), volumePath);???
redefinition; different basic types???發生了重定義
syntax error : 'bad suffix on number語法錯誤:「壞後綴的數字 頗有多是數字的格式出現了錯誤或者是多少了什麼東西。
A:strcpy函數爲何要返回char*?
B:若是不返回 char*,還能返回什麼呢?你想讓它返回什麼?
A:數組
B:C/C++ 語言的參數傳遞和返回值都不多是數組,由於在 C/C++ 中數組的內部表示就是指針,數組自己沒有長度信息,不可能做爲參數或返回值。
L"Buffer is too small"&&0 意思是緩衝區過小
strcpy_s函數的用法???
好比strcpy_s(str1,count,str2);爲了方便起見,這裏將數組大小定義爲常數count。strcpy_s函數的第一個參數是目標字符串,將源字符串向這個目標字符串複製給第三個參數。第二個參數是目標位置上可用的字節總數(包括\0等)。
看名字明白,它和strcpy()函數的功能應該同樣的。strcpy函數,就象gets函數同樣,它沒有方法來保證有效的緩衝區尺寸,因此它只能假定緩衝足夠大來容納要拷貝的字符串。在程序運行時,這將致使不可預料的行爲。用strcpy_s就能夠避免這些不可預料的行爲。
這個函數用兩個參數、三個參數均可以,只要能夠保證緩衝區大小。
三個參數時:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
兩個參數時:
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
); // C++ only
例子:
#include "stdafx.h"
#include<iostream>
#include<string.h>
using namespace std;
void Test(void)
{
char *str1=NULL;
str1=new char[20];
char str[7];
strcpy_s(str1,20,"hello world");//三個參數
strcpy_s(str,"hello");//兩個參數但若是:char *str=new char[7];會出錯:提示不支持兩個參數
cout<<"strlen(str1)"<<strlen(str1)<<"strlen(str)"<<strlen(str)<<endl;
printf(str1);printf("\n");
cout<<str<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Test();
return 0;
}
輸出爲:
strlen(str1): 11
strlen(str): 5
hello world
hello
char p_str[STR_LEN];
char* encrypt(char pw[],char key[],bool jiami,char pwout[STR_LEN])
{
ZeroMemory(pwout,STR_LEN);//返回值初始化
strcpy_s(p_str, tt);//這行不出錯,
strcpy_s(pwout, tt);//這行編譯能不過,說不能用2個參數
return p_str;//輸出的char實際上不是原來的字符,而是字符的16進制碼
}
void test()
{
char* p_str = new chae[256];
char* tt = new chae[256];
//循環給tt賦值
strcpy_s(p_str,strlen(tt), tt);//這個地方變換多種格試置換也不行
}
strcpy_s(destination, sizeof (destination) / sizeof (destination[0]), source);
debug assertion failed???
調試斷言失敗
按F5調試下,而後關掉,看看會停在哪裏,以後看看調用堆棧,就知道哪裏出問題了
這通常是堆棧空間分配的時候形成的
網上牛人的回答是:「你須要的不是進去,而是出來,由於format已是null了,你再繼續執行只能是繼續錯誤,沒有什麼意義 在你ide裏找一個叫call stack的窗口(沒有就在按鈕上找,有個同名按鈕,點一下就出來),找到後向調用層次上面走,看看你到底哪一個函數調用了這個函數,並傳遞錯誤的參數了」
簡單的講,就是程序出現了野指針或者是變量沒有初始化,出現內存泄露了。此時我按照上述牛人的方法去修改,發現問題出如今MFC自己提供的函數身上。通常而言,此時若是你是菜鳥,修改系統提供的函數是不明智的。可是信息沒有提示我編寫的代碼有問題,可是,能夠明確的說,不要懷疑編譯軟件,問題確定在你本身身上,除非你的編譯軟件連其它正確的程序也不能編譯。因而我去查對話框中的變量,一個一個去查,這才發現,單選框中定義了int型變量,這就有可能出現空指針,編譯就會報錯,通常來講你忽略這個錯誤還能運行,但咱們不能由於忽略錯誤還能運行而不去管它,這對你學VC++是沒有好處的。
解決此問題的辦法:將沒有用到的這幾個int型變量刪除,或者不在Debug環境下編譯,在Release環境下編譯。這是由於在MFC中,大量使用了ASSERT宏,這些宏一般能夠來糾正一些錯誤,如尚未初始化指針就使用等。在Release方法下,ASSERT宏不會執行,因此也沒有錯誤信息。
補充一下,MFC中的ASSERT宏有時管得有點寬,若是確認沒有錯誤,也能夠不理會它。
warning C4018: 「<」: 有符號/無符號不匹配
出錯代碼 for(int j=0;j<detector.size();j++)
錯誤改正 : 定義j爲unsigned 類型後就能夠了
即: for(unsigned int j=0;j<detector.size();j++)
問題出在函數fopen_s上,
原先用fopen帶兩個參數,可是不安全
我改成fopen_s後須要三個參數,
請問fopen_s的用法是怎麼樣的?我查不到
error C2440: 「=」: 沒法從「errno_t」轉換爲「FILE *」
1> 從整型轉換爲指針類型要求 reinterpret_cast、C 樣式轉換或函數樣式轉換
這裏的errno_t表示什麼錯誤?
errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
C/C++ code
if((fp=fopen_s(&fp,"filename","w"))==NULL)
-->
if(fopen_s(&fp,"filename","w") != 0)
fopen_s返回得是errno_t類型
不能賦值給FILE*類型
應該這樣
errno_t err;
if( (err = fopen_s( &fp, "filename", "w" )) !=0 )
LINK : fatal error LNK1168: cannot open Debug/EX_HelloWin.exe for writing???
打開任務管理器,找到EX_HelloWin.exe這個進程, 關閉它。 而後從新編譯鏈接。 通常這種狀況意味着你的程序上一次運行並無正常關閉。
missing storage-class or type specifiers???
失蹤的存儲類或類型說明符
致使你定義的對象無效missing storage-class or type specifiers
緣由多是
1.沒包含相應的頭文件
2.類名拼寫出錯
MainFrm.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CRightView::classCRightView" (?classCRightView@CRightView@@2UCRuntimeClass@@B)
????
把文件從新加入到工程中。工程-》添加到工程-》文件
‘initializing' : cannot convert from 'class CDocument *' to 'class CEx7_2_201300824129Doc *'???
CEx7_2_201300824129Doc* pDoc=GetDocument();改成CEx7_2_201300824129Doc* pDoc=(CEx7_2_201300824129Doc*)GetDocument();
which is being defined這是定義
以上代碼編譯提示錯誤,a' : uses 'A', which is being defined。
若是把a換成*a就能夠了。
undeclared identifier
沒有定義;未說明的標誌符
use of undeclared identifier 類型轉換失敗
Messagebox和AfxMessageBox的區別???
AfxMessageBox是MFC庫提供的全局函數,提供了多種重載形式,而MessageBox是標準的windows Api函數.
AfxMessageBox()函數在任何類裏邊均可以使用,而MessageBox()函數只能在CWnd類的繼承類中使用。另外,AfxMessageBox()函數的參數沒有MessageBox()函數的參數豐富,因此後者較前者靈活。
AfxMessageBox不能控制消息框標題,經常使用於調試程序時的內部數據輸出或警告;MessageBox比較正式,經常使用在要提交的應用程序版本中,能夠控制標題內容而沒必要採用含義不明的可執行文件名爲標題。
cannot convert parameter 1 from 'class CLine *' to 'class CObject *'???
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
指向的類型無關;轉換要求reinterpret_cast,C樣式轉換或函數樣式轉換
There is no context in which this conversion is possible???
沒有上下文,這種轉換是可能的
二進制「=」: 沒有找到接受「int」類型的右操做數的運算符(或沒有可接受的轉換)???
error C2601: 'OnPreparePrinting' : local function definitions are illegal???
是由於你某個地方少了一個}
誰能解釋數據結構中KMP算法的next函數?
好比一個待匹配的子串str[]="abaabc",給出每一個字符的next是幾,爲何?千萬別貼大段的東西,用本身的話說.
假如str的前j個字符是前i個字符的後綴(j<i),那麼next[i]就是全部這樣的j的最大值
形象地說,就是假如第i+1個字符匹配失敗以後,下一個可能匹配位置至少應該日後挪動多少
就"abaabc"而言
next[1]=0
next[2]=0
next[3]=1
next[4]=1
next[5]=2
next[6]=0
計算過程基本上抄自算法導論,假設str長度爲n
k=0;//k表示當前匹配了多少位
next[1]=0;
for (i=1;i<n;i++)
{
while (k && str[i]!=str[k]) k=next[k];
if (str[i]==str[k]) k++;
next[i+1]=k;
}
以後計算str和某個長度爲m的字符串text匹配的過程基本上是同樣的
k=0;//用於記錄str最長可以有前k位是text的前i+1個字符的後綴
for (i=0;i<m;i++)
{
while (k && text[i]!=str[k]) k=next[k];//發現不能匹配的時候就把str日後挪
if (text[i]==str[k]) k++;
if (k==n) printf("在位置%d處找到一個匹配\n",i+1-n);
}
data和next沒法讀取內存???
例如:
datatype linkqueue::dequeue()//出隊
//若隊列不空則刪除隊列頭部元素並用x返回其值
{
datatype x;
queuenode *p = front;//p指向隊列頭結點
if (queueempty())
{
cerr << "隊列已空" << endl;
exit(1);
}
x = p->data;//運行時有中斷,緣由是data和next沒法讀取內存
front = p->next;//front指向新的隊列頭結點
if (rear == p) rear ==NULL;
count--;//元素個數減一
delete p;//釋放原隊列頭結點
return x;//返回原隊列結點的data值
}
其中一種修改是:
datatype linkqueue::dequeue()//出隊
//若隊列不空則刪除隊列頭部元素並用x返回其值
{
datatype x;
queuenode *p = front;//p指向隊列頭結點
if (queueempty())
{
cerr << "隊列已空" << endl;
exit(1);
}
x = p->data;//運行時有中斷,緣由是data和next沒法讀取內存
front = p->next;//front指向新的隊列頭結點
if (rear == p) rear =NULL;
count--;//元素個數減一
delete p;//釋放原隊列頭結點
return x;//返回原隊列結點的data值
}
心得體會:在寫程序的時候要當心,否則一點小小的錯誤就能讓你的代碼完全崩潰。
爲何把if (rear == p) rear =NULL;寫成if (rear == p) rear ==NULL;後代碼在運行時會出現中斷???
如遞歸全部控件路徑,函數將致使運行時堆棧溢出???
MSP430程序在運行的過程當中,出現死機的現象,經過IAR編譯器觀察,死機的緣由是棧溢出。
由於定義的局部變量是在棧內的,因此分析多是局部變量致使棧溢出,最有可能致使編譯器不能事先判斷
使用了多少棧的(超出設定值會報警),就是程序中產生新的佔用棧的變量,由以前的經驗推測是數組越界,由於若是程序不顧數組的邊界,越界不斷的往裏填東西,越界的部分就會被當成局部變量,佔用棧的內存。
由於棧是從RAM的底部網上長(存數據)的,而其餘程序運行的數據是從頂部往下的,因此當棧越存越多,越積越高的時候,棧就會和程序運行時的數據碰頭,兩者佔滿整個RAM內存,此時棧再繼續消耗,棧再向上長,直接覆蓋掉程序運行時所需的變量,程序就要跑飛了。
下面就詳細介紹如何查看ram使用狀況:
1 固然是燒程序到目標板裏呀
2 選擇view/memory,打開memory窗口
3 從ram的起始地址0x1C00h開始,輸入0x3fff(16KB),再回車
4 選中0x1C00h~0x005BFFh區域,右鍵選擇memory fill……
5 在memory fill中的start寫入:0x1C00h,length寫:0x3fff,value填入FF(也可填入其餘值),被選中的區域全填充FF
6 運行程序,跑一遍設計的全部功能,再中止cspy,看看memory窗口
7 若是再填充的區域內已經沒有FF存在,就說明已經發生堆棧溢出或是會有溢出的危險(ram恰好夠用)。最好保留必定餘量的ram不被改變,以防發生溢出
'AfxMessageBox' : no overloaded function takes 0 parameters???
c++編程中出現no overloaded function takes 3 parameters是什麼意思???
意思就是說重載函數不能重載3個參數。
因此說,你就應該看看student的構造函數的參數是否帶默認的三個。
error C2374: 'i' : redefinition; multiple initialization 重定義
'HDC' : illegal use of this type as an expression
「xxxxx」: 將此類型用做表達式非法」
C++程序出現這樣的Debug Assertion Failed錯誤是什麼意思怎麼解決???
錯誤很顯然,vector下標超出範圍了了
調試一下,看哪一個vector變量的index超出其size了
若是是errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );的話,那麼
將
fp = fopen_s ("car.txt", "r");
修改成:
fopen_s (&fp, "car.txt", "r");便可。