



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C++調用PHP出處:多特軟件站時間:2011-04-25人氣:1351我要提問我來說兩句核心提示:PHP是比較流行的腳本語言,WEB開發(fā)使用廣泛,如何在C++程序中不依賴任何WEBSERVER調用PHP,并取得執(zhí)行結果完成交互,這是本文代碼所要實現(xiàn)的功能。PHP是比較流行的腳本語言,WEB開發(fā)使用廣泛,如何在C++程序中不依賴任何WEBSERVER調用PHP,并取得執(zhí)行結果完成交互,這是本文代碼所要實現(xiàn)的功能。PHP安裝好后,在目錄下有?個php-cgi.exe,我們只要執(zhí)行這個CGI程序,并將數(shù)據(jù)通過命名管道傳遞給它,然后把執(zhí)行結果通過命名管道讀取出來即可,過程并不復雜!請看如下代碼:命名管道的創(chuàng)建:SECURITY_ATTRIBUTESsa={sizeof(SECURITY_ATTR1BUTES)};sa.blnheritHandle=1;sa.IpSecurityDescriptor=NULL;HANDLEhStdoutR,hStdoutW,hStdinR,hStdinW;CreatePipe(&hStdoutR,&hStdoutW,&sa,0);SetHandleInformation(hStdoutR,IIANDLE_FLAG_INHERIT,0);CreatePipe(fehStdinR,&hStdinW,&sa,0);Setllandlelnformation(hStdinW,HANDLE_FLAG_INHERIT,0);啟動php-cgi進程:STARTUPINFOsi={sizeof(STARTUPINFO)};PR0CESS_INF0RMATI0Npi;si.dwFlags=STARTF_USESTDHANDLES;si.hStdOutput=hStdoutW;si.hStdlnput=hStdinR;charenv[255]="REQUESTMETHOD=POST\0C0NTENTLENGTHS8\0C0NTENTTYPE二app1ication/x-www-form-urlencoded\OSCRIPTFILENAME=D:\\test.php";if(!CreateProcess(NULL,"d:\\php5\\php-cgi.exeD:\\test.php",NULL,NULL,1,NORMAL_PRIORITY_CLASS,env,NULL,&si,&pi))return0;CloseHandle(hStdoutW);Closellandle(hStdinR);傳遞數(shù)據(jù):if(!WriteFile(hStdinW,"var=HelloVCKBASE!",18,&dwWritten,NULL))return0;CloseHandle(hStdinW);讀取返回數(shù)據(jù):charbuf[1000]={0};DWORDdwRead=0;while(ReadFile(hStdoutR,buf,sizeof(buf),&dwRead,NULL)&&dwRead!=0){printf(buf);CloseHandle(hStdoutR);D盤的test.php<?echo$_REQUEST[*var*];?>執(zhí)行結果:X-Powered-By:PHP/5.3.1Content-type:text/htmlHelloVCKBASE!實際上,C++調用其他CGI程序,例如PERL,方法也大同小異,如果你打算做一個自己的WEB服務器,調用CGI程序是少不了的。處試用資料出處:多特軟件站時間:2011-04-25人氣:707我要提問我來說兩句核心提示:在如下情況下,需要在本地方法中應用java對象的引用,就會用到類型之間的轉換編譯HelloWorld類publicclassHelloWorld{publicnativevoiddisplayllelloWorld();publicnativevoidprintxx(Stringstr);static{System.loadLibrary("hello);//System,load("hello");}10publicstaticvoidmain(String[]args){HelloWorldhw=newHelloWorld();hw.displayHelloWorld();for(inti=0;;++i){hw.printxx("wokaowokaowokaowokaowokaowokaowokaowokaowokaowokaowokao");17if(i%1000==0){18try{19Thread,sleep(10);20}catch(InterruptedExceptione){21}}})對編譯完的class執(zhí)行javahHelloWorld/*DONOTEDITTHISFILE-itismachinegenerated*/#include<jni.h>/*HeaderforclassHelloWorld*/#ifndef_lncluded_HelloWorld#define_Included_HelloWorld#ifdef_cplusplusextern'C”{#endif/**Class:HelloWorld*Method:displayHelloWorld*Signature:()V*/JNIEXPORTvoidJNICALLJava_He11oWor1d_disp1ayHe11oWor1d(JNIEnv*,jobject);/**Class:HelloWorld*Method:printxx*Signature:(Ljava/lang/String;)V*/JNIEXPORTvoidJNICALLJava_He11oWor1d_printxx(JNIEnv*,jobject,jstring);25#ifdef_cplusplus}#endif#endif編譯cl-1%java_home%include-I%java_home%includewin32-LDHelloWorld.c-Fehello.dll1#include<jni.h>#include*HelloWorld.h*#include<stdio.h>JNIEXPORTvoidJNICALLJavaHelloWorlddisplayHelloWorld(JNIEnv*env,jobjectobj){printf("Helloworld!");return;)JNIEXPORTvoidJNICALLJava_HelloWorld_printxx(JNIEnv*env,jobjectobj,jstringprompt){constchar*str=(*env)->GetStringUTFChars(env,prompt,0);printf("%s",prompt);(*env)->ReleaseStringUTFChars(env,prompt,str);return;}3.Java類型和本地類型對應在如下情況ド,需要在本地方法中應用java對象的引用,就會用到類型之間的轉換:1)java方法里面將參數(shù)傳入本地方法;2)在本地方法里面創(chuàng)建java對象:3)在本地方法里面return結果給java程序。分為如下兩種情況:Java原始類型像booleans,integers,floats等從Java程序中傳到本地方法中的原始類型可以直接使用,下面是java中的原始類型和本地方法中的類型的對應:Java類型本地類型字節(jié)(bit)booleanjboolean8,unsignedbytejbyte8charjchar16,unsignedshortjshort16intjint32longjlong64floatjfloat32doublejdouble64void void n/a也就是說如果我在方法中傳進去了一個boolean的參數(shù)的話,那么我在本地方法中就有jboolean類型與之對應。同理,如果在本地方法中return一個jint的話,那么在java中就返回一個int類型。中國網管論壇Java對象Java對象做為引用被傳遞到本地方法中,所有這些Java対象的引用都有一個共同的父類型jobject(相當于java中的Object類是所有類的父類ー樣)。下面是JNI實現(xiàn)的ー些jobject的子類:4?本地方法中訪問java程序中的內容1)訪問String對象:從java程序中傳過去的String對象在本地方法中對應的是jstring類型,jstring類型和c中的char?不同,所以如果你直接當做char?使用的話,就會出錯。因此在使用之前需要將jstring轉換成為c/c++中的char*,這里使用JNIEnv的方法轉換。下面是ー個例子:代碼3:JNIEXPORTjstringJNICALLJavaPromptgetLine(JNIEnv*env,jobjectobj,jstringprompt)(charbuf[128];constchar*str=(*env)->GetStringUTFChars(env,prompt,0);printf("%s”,str);(*env)->ReleaseStringUTFChars(env,prompt,str);這里使用GetStringUTFChars方法將傳進來的prompt(jstring類型)轉換成為UTF—8的格式,就能夠在本地方法中使用了。注意:在使用完你所轉換之后的對象之后,需要顯示調用ReleaseStringUTFChars方法,讓JVM釋放轉換成UTF-8的string的對象的空間,如果不顯示的調用的話,JVM中會一直保存該對象,不會被垃圾回收器回收,因此就會導致內存溢出。下面是訪問String的ー些方法:GetStringUTFChars將jstring轉換成為UTF-8格式的char*GetStringChars將jstring轉換成為Unicode格式的char*Re1easeStringUTFChars釋放指向UTF-8格式的char?的指針ReleaseStringChars釋放指向Unicode格式的char?的指針NewStringUTF創(chuàng)建一個UTF-8格式的String對象NewString創(chuàng)建一個Unicode格式的String對象GetStringUTFLengt獲取UTF-8格式的char?的長度GetStringLength獲取Unicode格式的char?的長度2)訪問Array對象:和String對象一樣,在本地方法中不能直接訪問jarray對象,而是使用JNIEnv指針指向的一些方法來是用。訪問Java原始類型數(shù)組:1)獲取數(shù)組的長度:代碼4:JNIEXPORTjintJNICALLJava_IntArray_sumArray(JNIEnv*env,jobjectobj,jintArrayarr)inti,sum=0;jsizelen=(*env)->GetArrayLength(env,arr);如代碼4所示,這里獲取數(shù)組的長度和普通的c語言中的獲取數(shù)組長度不一樣,這里使用JNIEvn的?個函數(shù)GetArrayLength。bitsCNcom2)獲取ー個指向數(shù)組元素的指針:代碼4:jint*body=(*env)->GetIntArrayElements(env,arr,0);使用GetlntArrayElements方法獲取指向arr數(shù)組元素的指針,注意該函數(shù)的參數(shù),第一個是JNIEnv,第二個是數(shù)組,第三個是數(shù)組里面第三個是數(shù)組里面開始的元素3)使用指針取出Array中的元素代碼5:for(i=0;i<len;i++){sum+=body[i];)這里使用就和普通的c中的數(shù)組使用沒有什么不同了4)釋放數(shù)組元素的引用代碼6:(*env)->ReleaselntArrayE1ements(env,arr,body,0);和操作String中的釋放String的引用是ーー樣的,提醒JVM回收arr數(shù)組元素的引用。這里舉的例子是使用int數(shù)組的,同樣還有boolean、float等對應的數(shù)組。獲取數(shù)組元素指針的對應關系:函數(shù)GetBooleanArrayElementsGetByteArrayElementsGetCharArrayElementsGetShortArrayElementsGetlntArrayElementsGetLongArrayElementsGetFloatArrayElementsGetDoubleArrayElements數(shù)組類型booleanbytecharbitsCN.nET中國網管博客shortintlongfloatdouble釋放數(shù)組元素指針的對應關系:Function ArrayTypeRe1easeBoo1eanArrayElements boo1eanRe1easeByteArrayElements byteReleaseCharArrayElements charReleaseShortArrayElements shortRe1easelntArrayElements intReleaseLongArrayElements longReleaseFloatArrayElements floatRe1easeDoub1eArrayE1ements doub1e訪問自定義Java對象數(shù)組TheJNIprovidesaseparatesetoffunctionstoaccesselementsofobjectarrays.Youcanusethesefunctionstogetandsetindividualobjectarrayelements.Note:Youcannotgetalltheobjectarrayelementsatonce.GetObjectArrayE1ementreturnstheobjectelementatagivenindex.wwwbitscn_comSetObjectArrayE1ementupdatestheobjectelementatagivenindex.3)訪問Java對象的方法:在本地方法中調用Java對象的方法的步驟:①。獲取你需要訪問的Java對象的類:jclasscis=(*env)->GetObjectClass(env,obj);使用GetObjectClass方法獲取obj對應的jclass(.②。獲取MethodID:jmethodIDmid=(*env)->GetMethodID(env,cis,"callback","(I)V");使用GetMethdoID方法獲取你要使用的方法的MethdolD。其參數(shù)的意義:env??>JNIEnvcls??>第一步獲取的jclass"callback"??>要調用的方法名"(I)V"??>方法的Signature③。調用方法:(*env)->CallVoidMethod(env,obj,mid,depth);使用CallVoidMethod方法調用方法。參數(shù)的意義:env??>JNlEnvobj??>通過本地方法穿過來的jobjectmid??>要調用的MethodID(即第二步獲得的MethodID)depth??》方法需要的參數(shù)(對應方法的需求,添加相應的參數(shù))bitsCN.nET中國網管博客注:這里使用的是CallVoidMethod方法調用,因為沒有返回值,如果有返回值的話使用對應的方法,在后面會提到。方法的Signature方法的Signature是由方法的參數(shù)和返回值的類型共同構成的,下面是他們的結構:“(argument-types)return-type^其中Java程序中參數(shù)類型和其對應的值如下:SignatureJava中的類型ZbooleanBbyteCcharSshortIintJlongFfloatDdoubleLfully-qualified-class; fully-qualified-class[typetype[](arg-types)ret-typemethodtypeー個Java類的方法的Signature可以通過javap命令獲取:javap-s-pJava類名給調用的函數(shù)傳參數(shù):通常我們直接在methodID后面將要傳的參數(shù)添加在后面,但是還有其他的方法也可以傳參數(shù):CallVoidMethodV可以獲取ー個數(shù)量可變的列表作為參數(shù);www_bitscn_comCallVoidMethodA可以獲取ー個union?調用靜態(tài)方法:就是將第二步和第三步調用的方法改為對應的:GetStaticMethodID獲取對應的靜態(tài)方法的IDCalIStaticIntMethod調用靜態(tài)方法調用超類的方法:用的比較少,自己看啦。[二4)訪問Java對象的屬性:訪問Java對象的屬性和訪問Java對象的方法基本上一樣,只需要將函數(shù)里面的Method改為Field即可C++MFC窗體過程核心提示:窗口是通過查看句柄(HWND)來標識的。我們要對某個窗口進行操作,首先就得得到這個窗口的句柄。.窗口是通過査看句柄(HWND)來標識的。我們要對某個窗口進行操作,首先就得得到這個窗口的句柄(HANDLE)。.窗口的創(chuàng)建:(1)設計ー個窗口類;(2)注冊窗U類;(3)創(chuàng)建窗口.(4)顯示及更新窗口;C++讀取注冊表詳解核心提示:C++讀取注冊表詳解,以ド是相關代碼分享給大家!1.讀注冊表/Z讀取注冊表CStringReadRegisteTable(CStringroot,CStringpath,CStringkey)(HKEYhAppKey;LPCTSTRWINDS_SERVICE_REGISTRY_KEY=path;LPCTSTRDATAFILESUBKEY=key;charszDataFile[80];if(root=="HKEY_LOCALMACHINE*)(if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,WINDS_SERVICE_REGISTRY_KEY,〇,KEY_READ,&hAppKey))(ULONGcbSize=MAX_PATH*sizeof(TCHAR);DWORDdwFlag=RegQueryValueEx(hAppKey,DATA_FILE_SUB_KEY,NULL,NULL,(LPBYTE)szDataFile,&cbSize);RegCloseKey(hAppKey);if(ERROR_SUCCESS==dwFlag){CStringstrDate=szDataFile;//MessageBox(strDate);if(strDate.GetLength()>0)returnstrDate;elsereturn;return)if(rootニニ"HKEY_CURRENT_USER"){if(ERROR_SUCCESS==RegOpenKeyEx(HKEYCURRENTUSER,WINDS_SERVICE_REGISTRY_KEY,0,KEY_READ,fthAppKey))(ULONGcbSize=MAXPATH*sizeof(TCHAR);DWORDdwFlag二RegQueryValueEx(hAppKey,DATA_FILE_SUB_KEY,NULL,NULL,(LPBYTE)szDataFile,&cbSize);RegCloseKey(hAppKey);if(ERROR_SUCCESS==dwFlag){CStringstrDate二szDataFile;//MessageBox(strDate);if(strDate.GetLength()>0)returnstrDate;elsereturnz/";}return;)}return;}[nextqage]2.寫注冊表/Z修改注冊表BOOLModifyRegisteTable(CStringroot,CStringpath,CStringkey,CStringvalue)(HKEYhAppKey;DWORDdwDisposition二MAX_PATH*sizeof(TCHAR);LPCTSTRWINDS_SERVICE_REGISTRY_KEY=path;LPCTSTRDATA_FILE_SUB_KEY=key;charszDataFile[80];strcpy(szDataFile,value);if(root==z,HKEYLOCALMACHINE*)(if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_LOCAL_MACHINE,WINDSSERVICEREGISTRYKEY,0,NULL,REG_OPTION_NON_VOLATILE,KEYWRITE,NULL,&hAppKey,fidwDisposition)){returnfalse;)elseIif(ERROR_SUCCESS!=RegSetValueEx(hAppKey,DATA_FILE_SUB_KEY,0,REG_SZ,(LPBYTE)szDataFile,(Istrlen(szDataFile)+l)*sizeof(TCHAR)))(returnfalse;)RegCloseKey(hAppKey);}}if(root=="HKEY一CURRENTJJSER")(if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CURRENT_USER,WINDS_SERVICE_REGISTRY_KEY,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,fihAppKey,&dwDisposition))(returnfalse;)else{if(ERRORSUCCESS!=RegSetValueEx(hAppKey,DATA_FILE_SUB_KEY,0,REG_SZ,(LPBYTE)szDataFile,(Istrlen(szDataFile)+1)*sizeof(TCHAR)))Ireturnfalse;)RegCloseKey(hAppKey);returntrue;}C++拋出異常技巧講解C++語言與其他編程語言ー樣,其中也包含有關于異常的處理。我們在這里將會為大家詳細講解ード有關C++拋出異常的實現(xiàn)方法,及異常的應用方式。希望大家可以從中獲得些幫助,以提高對此的理解程度。C++拋出異常(也稱為拋棄異常)即檢測是否產生異常,在C++中,其采用throw語句來實現(xiàn),如果檢測到產生異常,則拋出異常。該語句的格式為:throw表達式;如果在try語句塊的程序段中(包括在其中調用的函數(shù))發(fā)現(xiàn)了異常,且拋棄了該異常,則這個異常就可以被try語句塊后的某個catch語句所捕獲并處理,捕獲和處理的條件是被拋棄的異常的類型與catch語句的異常類型相匹配。由于C++使用數(shù)據(jù)類型來區(qū)分不同的異常,因此在判斷異常時,throw語句中的表達式的值就沒有實際意義,而表達式的類型就特別重要。處理除數(shù)為0的異常。該范例將上述除數(shù)為〇的異??梢杂胻ry/catch語句來捕獲異常,并使用throw語句來實現(xiàn)C++拋出異常,從而實現(xiàn)異常處理,實現(xiàn)代碼如代碼清單所示。ttinclude<iostream.h>//包含頭文件tinclude<stdlib.h>doublefuc(doublex,doubley)〃定義函數(shù){if(y==O){throwy;〃除數(shù)為〇,拋出異常}returnx/y;〃否則返回兩個數(shù)的商}voidmain(){doubleres;try〃定義異常{res=fuc(2,3);coutくく"Theresultofx/yis:"<<res<<endl;res=fuc(4,0);〃出現(xiàn)異常}catch(double)〃捕獲并處理異常{cerr<<"errorofdividingzero.\n*;exit(1);〃異常退出程序})【運行結果】在VisualC++中新建一個【C++SourceFile)文件,輸入上述的代碼,編譯無誤后運行?!痉独馕觥可鲜龃a中,在主函數(shù)main。的第14?19行中使用了try語句定義異常,其中包含3條有可能出現(xiàn)異常的語句,它們?yōu)檎{用兩個數(shù)相除的函數(shù)。在代碼的第20?24行定義了異常處理,即捕獲異常后執(zhí)行該段代碼中的語句。此外,在函數(shù)fuc()的代碼5?8行通過throw語句實現(xiàn)C++拋出異常。C++strtok應用方式淺析在C++編程語言中,對于字符的處理,可以通過使用C++strtok來進行具體的操作。那么正確的應用方法我們將會在這篇文章中為大家詳細介紹,希望能對大家有所幫助,提高實際程序開發(fā)效率。C++strtok原形如F:char*strtok(char*strToken,constchar*strDelimit);//crtstrtok.c/**//?皿thisprogram,aloopusesstrtoktoprintallthetokens(separatedbycommasorblanks)inthestringnamed"string".*/ttinclude<string.h>#includeくstdio.h>charstring[]="Astring\tof,,tokens\nandsomemoretokens";charseps[]=",\t\n";char*token;intmain(void)printf("Tokens:\n");/**〃*Establishstringandgetthefirsttoken:*/token=strtok(string,seps);while(token!=NULL){/**//*Whiletherearetokensin"string"*/printf("%s\n^,token);/**//*Getnexttoken:*/token=strtok(NULL,seps);))C++strtok輸出:AstringoftokensandsomemoretokensNotes:Strtok(char*strToken,constchar*strDelimit)其中,strToken和strDelimit一定要用字符數(shù)組格式的,也就是說.入口只能是字符數(shù)組元素地址。C++自定義動態(tài)數(shù)組模板ttinclude"stdafx.h"#include<iostream>usingnamespacestd;template<classT>classMyArray(intlen;public:T*data;MyArray(){data=NULL;len=0;}"MyArray()deleteロdata;}T&operator[](intindex);voidpush(Td););template<classT>T&MyArray<T>::operator[](intindex){if(index<0||index>(lenT)){coutくくBadsubscript!*<<endl;exit⑴;)returndata[index];)template<classT>voidMyArray<T>::push(Td)(T*pdata=data;data=newT[len+1];if(pdata!=NULL)(for(inti=0;i<len;i++){data[i]=pdata[i];)delete[]pdata;}data[len]=d;len++;)〃測試代碼intmain(intargc,char*argv[])(MyArrayくint>a;a.push(11);a.push(22);a.push(33);a.push(55);a[0]=44;cout?a[0]?endl?a[l]?endl?a[2]?endl?a[3]?endl;return0;)C++編譯期間類中的常量核心提示:C++編譯期冋類中的常量。問題:在類中建立一個int類型的數(shù)組方法一:(錯誤)classTest(constintsize=100;intarray[size];//……);錯誤原因:1:因為在ー個類中,const恢復了它在c中的一部分意思,在每個類對象里分配存儲并代表一個值,這個值一旦被初始化以后就不能被改變。所以在類中使用了const的意思是:在這個對象的生命周期內,它是ー個常量。然而,每個對象可能包含不同的值。2:對const常量進行了初始化,C++中這個初始化必須由構造函數(shù)完成,如const常量在初始化列表中進行初始化。方法二:(正確,有缺陷)使用enum;classTest{enum{size=100};intarray[size];//……);使用enum不會占用對象中的存儲空間的,枚舉常量在編譯的時候被全部求值。缺點:假如定義ー個非整型的常量該如何?enum無法完成此項操作,同時喪失了枚舉本來的作用。方法三:(正確,最好)使用靜態(tài)常量;classTest(staticconstintsize;intarray[size];//……);constintTest::size=100;它既是常量,不能改變,又是靜態(tài),在類中只有一個定義點。所以能夠完成任務。同時,它可以定義任何與定義類型的常量。Cpp關于const和函數(shù)核心提示:cpp關于const和函數(shù)教程。<P>voidfun()const{}; ヽconstvoidfun(){}:和voidconstfun(){};的區(qū)別?</P><P>答:constvoidfun(){};和voidconstfun(){};兩個相同。</P><P> 如果采用〃按址傳遞方式〃的函數(shù)返回值加const修飾,那么函數(shù)返回值(即地址)的內容不能被修改,該返回值只能被賦給加const修飾的同類型指針。</P><P> 如果采用〃按值傳遞方式〃的函數(shù)返回值加const修飾,由于函數(shù)會把返回值復制到外部臨時的存儲單元中,加const修飾沒有任何價值。</P>P> 所以不要盡量不要把intfun2();寫成constintfun2()J因為沒意義。</P><P> 例:</P>P> #include<iostream></P>P> usingnamespacestd;</P>P> intnum=10; 〃全局變量く/P>P> constint*funl(){ 〃按址傳遞く/P><P> return# Snbsp; ftnbsp; 〃返回地址く/P>TOC\o"1-5"\h\z<P> }</P><P>constintfun2(){ 〃按值傳遞〃最好直接寫intfun2()</P><P> returnnum;</P><P> }</P><P> intmain()</P><P> {</P><P> constint*funl();</P><P> // ftnbsp;ftnbsp; ftnbsp;ftnbsp;int*tl=funl();〃錯誤,必須是const型く/P><P> constint*tl=funl();</P><P> // *tl=20; 〃按址傳遞,不能修改其指向變量或常量的值く/P〉<P>cout<<“constint*funl():\t"<<*tl<<endl;</P>P>constintfun2();〃最好直接聲明成intfun2()</P>P>intt2=fun2(); 〃非const變量可以更改函數(shù)返回值く/P>P>constintt3=fun2();</P>P>t2+=10; 〃按值傳遞,可以修改返回值く/P>P> cout<<*constintfun2():\t"<<t2<<endl;</P><P>return0;</P><P> }</P><P>voidfun()const{};</P><P>類的成員函數(shù)后面加const,表明這個函數(shù)不可以對這個類對象的數(shù)據(jù)成員(準確地說是非static數(shù)據(jù)成員)作任何改變。</P><P> 例:</P>P> #include<iostream></P>P> usingnamespacestd;</P>P> classR</P>TOC\o"1-5"\h\zP> {</P>P> public:</P>P> R():numl(l){}</P>P> intsuml(inta)const</P>P> {</P>P> 〃numl=10;〃錯誤,不可以修改非static數(shù)據(jù)成員く/P>P> returna+numl;</P>P> }</P>P> intsum2(inta)const</P>P> {</P>P> num2=2; 〃正確,修改static數(shù)據(jù)成員く/P>P> returna+num2;</P>P> }</P>P> intsum3(inta) 〃沒有const</P>P> {</P>P> numl=10;〃正確,修改非static數(shù)據(jù)成員く/P>P> num2=20;〃正確,修改static數(shù)據(jù)成員く/P>P> returna+num1+num2;</P>P> }</P>P> private:</P>P> intnuml;</P>P> staticintnum2;</P>P> };</P>P> intR::num2=0;</P>P> intmainO</P>P> {</P>P>cout<<"t.suml⑴:\t"<<t.suml(l)<<endl;</P>P>cout<<“t,sum2(l):\t"<<t.sum2(l)<<endl;</P>P>cout<<"t.sum3(l):\t"<<t.sum3(l)<<endl;</P>P> return0;</P>P> }</P>C++指針漂移問題解決方案核心提示:C++編程語言雖然功能強大,應用方式靈活,但是在實際編程中同樣會出現(xiàn)各種各樣的錯誤。C++編程語言雖然功能強大,應用方式靈活,但是在實際編程中同樣會出現(xiàn)各種各樣的錯誤。在這里我們將會為大家詳細介紹一下有關C++指針漂移的解決方法,希望本文介紹的內容可以幫助大家解決問題。最近我們在工作中碰到一個奇怪的問題,最后確定是多繼承引起的C++指針漂移,跟C++對象模型有關。示意如下:classA{...};classB{...};classAB:publicB,publicA{...}...AB*pab=newAB();A*pa=(A*)pab;B*pb=(B*)pab:這時候你發(fā)現(xiàn)pa和pb的值是不ー樣的!它們中有一個跟pab是相等的,而另外一個產生了偏移。如果把AB的聲明中A和B的順序調換ー下,則產生偏移的指針也會變?yōu)榱硗庖粋€。為了確定這是編譯器做了轉換的緣故,利用void指針愚弄編譯器:void*pv=(void*)pab;pa=(A*)pv:這時候pa的值倒是跟pab相等了,然而指向了錯誤的地方。從pab到pa的轉換,依賴于路徑的選擇,讓人不是很放心。還不知道把指針放入容器中再取出來,會不會出錯。當然,上面使用了強制類型轉換,在良好的程序中應該避免。如果只有隱式轉換,可以得到正確的結果:std::vector<A*>v;//implicittypeconversionv.insert(v.begin(),pab);void*pv=v[〇];pa=(A*)pv;以下程序使用Cygwin/g++b編譯通過:^include<stdio.h>稈include<vector>classA{public:inta;};classB{public:intb;};classAB:publicB,publicA{public:intab;};intmain(intargc,char**argv){AB*pab=newAB();pab->ab=1;pab->b=2;pab->a=3;A*pa=(A*)pab;B*pb=(B*)pab;printf("AB:%p\n”\"A:%p\n〃\"B:%p\n",pab,pa,pb);std::vector<A*>v;//implicittypeconversionv.insert(v.begin(),pab);void*pv=v[0];pa=(A*)pv;printf("pvis%p\npais%p\npab%spv\n",pv,pa,(pab-pv)?*==":*!=");printf("A.ais%d\n”,pa->a);//forcedtypeconversionpv=(void*)pab;pa=(A*)pv;printf("NowA.ais%d\n",pa->a);)運行結果:AB:0x6b01f0A:0x6b01f4B:0x6b01f0pvis0x6b01f4pais0x6b01f4pab!=pvA.ais3NowA.ais2C/C++中的指針的應用及注意問題核心提示:指針是C/C++學習ー個比較讓人頭痛的問題,在程序設計過程中,指針也往往是產生隱含bug的原因。下面就來指針是C/C++學習ー個比較讓人頭痛的問題,在程序設計過程中,指針也往往是產生隱含bug的原因。下面就來談談指針的應用以及需要注意的ー些問題,里面也許就有你平時沒有注意到的問題,希望能幫助各位讀者理解好指針。ー、我們先來回憶一下指針的概念吧,方便下面的介紹指針是存放地址值的變量或者常量。例如:inta=l;&a就表示指針常量(“&”表示取地址運算符,也即引用)。int*b,b表示的是指針變量(注意,是b表示指針變量而不是?b),?表示要說明的是指針變量。大家注意int*b[2]和int(*b)[2]是不同的,int*b表示一個指針數(shù)組,而int(*b)[2]表示含有兩個元素的int指針,這里要注意運算優(yōu)先級問題,有助于理解指針問題。在這里大概介紹基本概念就夠了,至于具體使用方法,如賦值等,很多書都有介紹,我就不多說了。二、應用以及注意的問題1,理解指針的關鍵所在——對指針類型和指針所指向的類型的理解①、指針類型:可以把指針名字去掉,剩下的就是這個指針例如:int*a;〃指針類型為int*int**a;〃指針類型為int**int*(*a)[8];〃指針類型為int*(*)[8]②、指針所指向的類型:是指編譯器將把那一片內存所看待成的類型。這里只要把指針聲明語句中的指針名字和名字右邊的“ボ’號去掉就可以了,剩下的就是指針所指向的類型。我之所以把他們放在第一位,是因為弄清楚他們是學C/C++指針的重點,正確理解他們才能使你打好C/C++的編程基礎。2、指針的應用傳遞參數(shù)。其實它可以相當于隱式的返回值,這就比return的方法更加靈活了,可以返回更多的值,看看下面的例子自然就明白了:#include,ziostream,hvoidexample(int*al,int&bl,intcl)(*al*=3;++bl;++cl;}voidmain()Iint*a;intb,c;*a=6;b=7;c=10;example(a,b,c);cout《〃*a=”《?aくcout《"b="くcout《c二く}輸出:*a=18b=8c=10注意到沒有,*a和b的值都改變了,而c沒有變。這是由于al是指向?a(=6)的指針,也即與a是指向同一個地址,所以當al指向的值改變了,*a的值也就改變了。在函數(shù)中的參數(shù)使用了引用(int&bl),bl是b的別名,也可以把它當作特殊的指針來理解,所以b的值會改變。函數(shù)中的參數(shù)intcl只是在函數(shù)中起作用,當函數(shù)結束時候便消失了,所以在main()中不起作用。3、關于全局變量和局部變量的ー個問題先不廢話了,先看看程序:#includeMiostream.hvinta=5;int*examplel(intb)(a+=b;return&a;)int*example2(intb)(intc=5;b+=c;return&b;}voidmain()(int*al=examplel(10);int*bl=example2(10);cout《"al=”《*alくcout《"bl二’’《*blく}輸出結果:al=15bl=4135*bl怎么會是4135,而不是15呢?是程序的問題?沒錯吧?由于a是全局變量,存放在全局變量的內存區(qū),它一直是存在的;而局部變量則是存在于函數(shù)的棧區(qū),當函數(shù)example2〇調用結束后便消失,是b指向了一個不確定的區(qū)域,產生指針懸掛。ド面是對exampl。1()和example2()的反匯編(用TC++3.0編譯):():pushbp;入棧movbp,spmovax,[bp+04];傳遞參數(shù)add[OOAA],ax;相加movax,OOAA;返回了結果所在的地址popbp;恢復棧,出棧ret:退出函數(shù)():pushbp;入棧movbp,spsubsp,02movwordptr[bp-02],0005movax,[bp-02];傳遞參數(shù)add[bp+04],ax;相加leaax,[bp+04];問題就出在這里movsp,bppopbp;恢復棧,出棧ret;退出函數(shù)對比之后看出來了吧?ax應該是存儲的是結果的地址。而在example2()中,返回的卻是[bp+04]的內容,因此指針指向了一個不確定的地方,由此產生的指針懸掛。example!〇中,ax返回了正確的結果的地址。4、內存問題:使用指針注意內存的分配和邊界。使用指針過程中應該給變量一個適當?shù)目臻g,以免產生不可見的錯誤。請看以下代碼:^include"iostream,h”voidmain()(char*al;char*a2;cin》al;cin》a2;cout《"al二”くcout《"a2二”く)輸入:abc123輸出:al=123a2=Nullpointerassignment指針指向了“空”。解決辦法就是分配適當?shù)膬却娼o這兩個字符串。修正后的代碼如下:^include"iostream,h”voidmain()(char*al;char*a2;al=newchar[10];a2=newchar[10];cin》al;cin》a2;cout《—く//cout《"a2二”くdelete(al);注意,別忘了要釋放內存空間delete(a2);}到此就能輸出正確的結果了。分配了適當?shù)膬却嬷笠⒁忉尫艃葏⒖臻g,同時還應該注意不要超出所分配的內存的大小,否則會有溢出現(xiàn)象產生,導致不可預料的結果。5、關于特殊的指針——引用引用有時候應用起來要比指針要靈活,用它做返回的時候是不產生任何變量的副本的這樣減小了內存的占用,提髙執(zhí)行的速度。引用使用起來要比指針好理解,比較直觀〇當引用作為參數(shù)時,不會改變參數(shù)的地址,因此可以作為左值。下面請看ー個例子:#include"iostream.hvcharch[5]="ABCD”;charftexample(intb)(returnch;}voidmain()(cout《"ch二”くexample(2)=“c”;cout《"ch二”く)ch=ABCDch=ABcD在實際編程過程中,可以靈活地引用或指針,盡量提高程序的可讀性和執(zhí)行效率。三、小結:指針是學習C/C++的重點難點,主要原因是指針較為抽象,不容易理解。使用指針千萬要明白讓指針指向什么地方,如何讓指針指向正確的地方。在深入系統(tǒng)底層之中需要應用到大量的指針,因此需要理解好指針的基本概念,例如:指針類型和指針所指向的類型。平時應該對留心觀察,了解程序的工作過程,必要時候可以對程序進行反匯編,加深對指針的理解,這種方法同樣適合學別的編程方面的知識。四、結束:指針的應用是很廣泛的,利用指針可以做很多事情,要成為ー個好的程序員,必須對指針有比較深刻的了解。寫本文的目的在于讓大家對指針有更深ー層的了解,提高指針的應用能力,內容大都是我在實際編程中遇到的問題。相信能給大家一定的幫助。C++kmp算法模板代碼解讀核心提示:C++編程語言雖然功能強大,應用方式靈活,但是在實際編程中同樣會出現(xiàn)各種各樣的錯誤。C++編程語言雖然功能強大,應用方式靈活,但是在實際編程中同樣會出現(xiàn)各種各樣的錯誤。在這里我們將會為大家詳細介紹一下有關C++指針漂移的解決方法,希望本文介紹的內容可以幫助大家解決問題。最近我們在工作中碰到?個奇怪的問題,最后確定是多繼承引起的C++指針漂移,跟C++對象模型有關。不意如卜:classA{...};classB{...};classAB:publicB,publicA{...}...AB*pab=newAB();A*pa=(A*)pab;B*pb=(B*)pab:這時候你發(fā)現(xiàn)pa和pb的值是不ー?樣的!它們中有一個跟pab是相等的,而另外一個產生了偏移。如果把AB的聲明中A和B的順序調換ー下,則產生偏移的指針也會變?yōu)榱硗庖粋€。為了確定這是編譯器做了轉換的緣故,利用void指針愚弄編譯器:void*pv=(void*)pab;pa=(A*)pv;這時候pa的值倒是跟pab相等了,然而指向了錯誤的地方。從pab到pa的轉換,依賴于路徑的選擇,讓人不是很放心。還不知道把指針放入容器中再取出來,會不會出錯。當然,上面使用了強制類型轉換,在良好的程序中應該避免。如果只有隱式轉換,可以得到正確的結果:std::vector<A*>v;//implicittypeconversionv.insert(v.begin(),pab);void*pv=v[0];pa=(A*)pv;以下程序使用Cygwin/g++b編譯通過:#include<stdio.h>#include<vector>classA{public:inta;};classB{public:intb;};classAB:publicB,publicA{public:intab;};intmain(intargc,char**argv){AB*pab=newAB();pab->ab=1;pab->b=2;pab->a=3;A*pa=(A*)pab;B*pb=(B*)pab;printf("AB:%p\n"\"A:%p\n"\"B:%p\n”,pab,pa,pb);std::vector<A*>v;//implicittypeconversionv.insert(v.begin(),pab);void*pv=v[0];pa=(A*)pv;printf("pvis%p\npais%p\npab%spv\n",pv,pa,(pab==pv)?"ニニ:!=");printf("A.ais%d\n”,pa->a);//forcedtypeconversionpv=(void*)pab;pa=(A*)pv;printf("NowA.ais%d\n",paー〉a);}運行結果:AB:0x6b01f0A:0x6b01f4B:0x6b01f0pvis0x6b01f4paC++編程語言中的模板應用是?個比較復雜的應用技術,我們今天就先從C++kmp算法模板的基本應用開始學習,從而加深我們對這方面知識的認識程度,方便將來的應用,提髙編程效率。在使用的時候加上這兩行代碼就行了#include<vector>usingnamespacestd;C++kmp算法模板參數(shù)說明constT*source待匹配的字符串TLsourceLen待匹配字符串的長度constT*pattern模式串TL模式串長度C++kmp算法模板代碼示例:template<classT,classTL>inlineintkmpmatch(constT*source,TLsourceLen,constT*pattern,TLpatternLen){vector<int>next;for(inti=0;i<patternLen;i++)next.push_back(0);next[0]=-1;for(inti=1;i<patternLen;i++){intj=next[i-1];while((pattern[i]!=pattern[i+1])&&(j>=0))TOC\o"1-5"\h\z{j=next[j]; }if(pattern[i]=pattern[j+1]){next[i]=j+1; }else{next[i]=-1; } }inti=0;intj=0;while((i<sourceLen)&&(j<patternLen)){if(source[i]==pattern[j]){ i++; j++; ) elseif(j=0){ i++; }else {j=next[j-1]+1; } }if(j>=patternLen){if(!next.empty())next,clear();returni-patternLen;)else{if(!next.empty())next,clear();returnT;} }is0x6b01f4pab!=pvA.ais3NowA.ais2C++簡單內存泄漏檢查機制實現(xiàn)核心提示:這里是ー個簡單的內存泄漏自動檢査機制。只適用于單線程情況下。工作原理就是將已經分配的內存用ー個雙向鏈表串聯(lián)起來,釋放內存時從鏈表里刪除。這里是一個簡單的內存泄漏自動檢查機制。只適用于單線程情況下。工作原理就是將一經分配的內存用ー個雙向鏈表串聯(lián)起來,釋放內存時從鏈表里刪除。在程序退出時,將鏈表中未釋放的內存打印出來。同時在內存塊中保存文件名和行號,用于定位內存分配地址。001//placement_new.cpp:Definestheentrypointfortheconsoleapplication.002//003004#include"stdafx.h"005ttinclude<iostream>006^include<cassert>007008#defineASSERTassert009charbuff[1024];010011usingnamespacestd;012013structMEMORY_TAG014(015intnSize;016constchar*szFile;017intnLine;018MEMORY_TAG*pPrev;019MEMORY_TAG*pNext;020);021022MEMORY_TAGg_header={0,0,0,0,0);023/Z打印出所有未釋放的內存024voidDumpUnAllocatedMem()025{026for(MEMORY_TAG*pEntry=g_header.pNext;pEntry:pEntry=pEntry->pNext)027(028printf(*%s(%d):leak%dbytes”,pEntry->szFile?pEntry->szFile:pEntry->nLine,pEntry->nSize);029)030)031//統(tǒng)計已經分配的內存塊數(shù)和字節(jié)數(shù)
032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065intCountOfAllocatedMem(void*pnSize=NULL)(intnCount=0;size_tallocated=0;for(MEMORYTAG*pEntry=gheader.pNext;pEntry;pEntry=pEntry->pNext){allocated+=pEntry->nSize;nCount++;}printfl%dcount,%dtotal,nCount,allocated);returnnCount;)/Z實現(xiàn)ー個全局operatornew可以有文件名和行號作為參數(shù)void*operatornew(size_tsize,constchar*pszFile,intline)(size_tnRealSize=size+sizeof(MEMORY_TAG);MEMORY_TAG*pTag=(MEM0RY_TAG*)malloc(nRealSize);pTag->nSize=nRealSize;pTag->szFile=pszFile;pTag->nLine=line;/Z插入隊列頭部if(gheader.pNext)(gheader.pNext->pPrev=pTag;}pTag->pNext=gheader.pNext;g_header.pNext=pTag;pTag->pPrev=&g_header;returnpTag+1;066void*operatornew(size_tsize)067(LINE_));068return(operatornew(size,—FILELINE_));069)
070071072voidoperatordelete(void*p,constchar*,intline)073(074deletep;075)076077voidoperatordelete(void*p)078(079MEMORY_TAG*pTag=(MEMORY_TAG*)(((char*)p)-sizeof(MEMORY_TAG));080/Z從隊列中刪除081pTag->pPrev->pNext=pTag->pNext;082if(pTag->pNext)083(084pTag->pNext->pPrev=pTag->pPrev;085)086free(pTag);087}088089classObject090(091public:092Object()093(094cout?”O(jiān)bject'scontructor."<<endl;095)096097"Object()098(099cout?,zObject'sdestructor.*<<endl;100)101102chardata[1024];103};104105ttdefineNEWnew(_FILE_,_LINE_)106107int_tmain(intargc,TCHAR*argv[])108(109ASSERT(CountOfAllocatedMem()==0);110Object*pObj=new(buff)Object;111112pObj->"Object();113114pObj=NEW(Object);115ASSERT(CountOfAllocatedMem()=1);116117deletepObj;118ASSERT(CountOfAllocatedMem()==0);119120pObj=NEWObject;121ASSERT(CountOfAllocatedMem()==1);122deletepObj;123ASSERT(CountOfAllocatedMem()==0);124125pObj=NEWObject;126127char*p=newchar[968];128ASSERT(CountOfAllocatedMem()==2);129130DumpUnAllocatedMem();131return0;132)電腦編程的基礎知識——編譯器和連接器核心提示:我從沒見過(不過應該有)任何一本C++教材有講過何謂編譯器(Compiler)及連接器(Linker)(倒是在很老的C教材中見過)我從沒見過(不過應該有)任何一本C++教材有講過何謂編譯器(Compiler)及連接器(Linker)(倒是在很老的C教材中見過),現(xiàn)在都通過ー個類似VC這樣的編程環(huán)境隱藏了大量東西,將這些封裝起來。在此,對它們的理解是非常重要的,本系列后面將大量運用到這兩個詞匯,其決定了能否理解如聲明、定義、外部變量、頭文件等非常荊要的關鍵。前面已經說明了電腦編程就是ー個“翻譯”過程,要把用戶的程序翻譯成CPU指令,其實也就是機器代碼。所謂的機器代碼就是用CPU指令書寫的程序,被稱作低級語言。而程序員的工作就是編寫出機器代碼。由于機器代碼完全是ー些數(shù)字組成(CPU感知的一切都是數(shù)字,即使是指令,也只是1代表加法、2代表減法這ー類的數(shù)字和工作的映射),人要記住1是代表加法、2是代表減法將比較困難,并且還要記住第3塊內存中放的是圓周率,而第4塊內存中放的是有效位數(shù)。所以發(fā)明了匯編語言,用ー些符號表示加法而不再用1了,如用ADD表示加法等。由于使用了匯編語言,人更容易記住了,但是電腦無法理解(其只知道1是加法,不知道ADD是加法,因為電腦只能看見數(shù)字),所以必須有個東西將匯編代碼翻譯成機器代碼,也就是所謂的編譯器。即編譯器是將一種語言翻譯成另?種語言的程序。即使使用了匯編語言,但由于其幾乎只是將CPU指令中的數(shù)字映射成符號以幫助記憶而己,還是使用的電腦的思考方式進行思考的,不夠接近人類的思考習慣,故而出現(xiàn)了紛繁復雜的各種電腦編程語言,如:PASCAL、BASIC、C等,其被稱作高級語言,因為比較接近人的思考模式(尤其C++的類的概念的推出),而匯編語言則被稱作低級語言(C曾被稱作髙級的低級語言),因為它們不是很符合人類的思考模式,人類書寫起來比較困難。由于CPU同樣不認識這些PASCAL、BASIC等語言定義的符號,所以也同樣必須有一個編譯器把這些語言編寫的代碼轉成機器代碼。對于這里將要講到的C++語言,則是C++語言編譯器(以后的編譯器均指C++語言編譯器)。因此,這里所謂的編譯器就是將我們書寫的C++源代碼轉換成機器代碼。由于編譯器執(zhí)行ー個轉換過程,所以其可以對我們編寫的代碼進行一些優(yōu)化,也就是說其相當于是ー個CPU指令程序員,將我們提供的程序翻譯成機器代碼,不過它的工作要簡單ー些了,因為從人類的思考方式轉成電腦的思考方式這ー過程已經由程序員完成了,而編譯器只是進行翻譯罷了(最多進行ー些優(yōu)化)。還有?種編譯器被稱作翻譯器(Translator),其和編譯器的區(qū)別就是其是動態(tài)的而編譯器是靜態(tài)的。如前面的BASIC的編譯器在早期版本就被稱為翻譯器,因為其是在運行時期即時進行翻譯工作的,而不像編譯器一次性將所有代碼翻成機器代碼。對于這里的“動態(tài)”ヽ“靜態(tài)”和“運行時期”等名詞,不用刻意去理解它,隨著后續(xù)文章的閱讀就會了解了。編譯器把編譯后(即翻譯好的)的代碼以一定格式(對于VC,就是COFF通用対象文件格式,擴展名為.obj)存放在文件中,然后再由連接器將編譯好的機器代碼按一定格式在Windows操作系統(tǒng)下就是PortableExecutableFileFormat—PE文件格式)存儲在文件中,以便以后操作系統(tǒng)執(zhí)行程序時能按照那個格式找到應該執(zhí)行的第一條指令或其他東西,如資源等。至于為什么中間還要加一個連接器以及其它細節(jié),在后續(xù)文章中將會進ー步說明。判斷圖形文件(GIFJPG,PNG)的圖片格式的方法心提示:通過文件的擴展名來判斷。這種方法比較簡單,但若是有人故意改下文件擴展名,這種方法就不起作用了。.通過文件的擴展名來判斷。這種方法比較簡單,但若是有人故意改下文件擴展名,這種方法就不起作用了。.通過C#自身提供的方法來進行判斷(判斷某種確定的圖片類型)。EX:bool
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 珠寶相關知識培訓課件
- 鉗工實訓的總結報告范文
- 浙江國企招聘2024溫州市現(xiàn)代服務業(yè)發(fā)展集團有限公司第二批招聘12人筆試參考題庫附帶答案詳解
- 二零二五年度珠寶店人力資源規(guī)劃聘用合同
- 二零二五年度信用貸款合同補充協(xié)議延期及風險控制
- 二零二五年度桉樹木材出口退稅與政策支持合同
- 2025年度生豬養(yǎng)殖技術研發(fā)與推廣合同
- 二零二五民間借貸合同范文:海洋資源開發(fā)項目資金借貸協(xié)議
- 二零二五年度住宅小區(qū)地下停車位租賃經營合作協(xié)議
- 2025年度智慧社區(qū)建設合作合同模板
- 中小學校2025年“學雷鋒月”系列活動方案:踐行雷鋒精神綻放時代光芒
- 2025年湖南司法警官職業(yè)學院單招職業(yè)技能測試題庫學生專用
- 2025年湖南工業(yè)職業(yè)技術學院單招職業(yè)技能測試題庫審定版
- 人教版高一下英語單詞表
- 如何做好實習生帶教
- 2025年中國游戲行業(yè)市場深度分析及發(fā)展前景預測報告
- 專項訓練:電磁感應中的電路、電荷量及圖像問題(10大題型)(原卷版)
- 汽車電腦故障解碼器項目可行性研究報告評審方案設計2025年發(fā)改委標準
- 安慰劑效應在臨床應用研究-深度研究
- 國家文化安全教育課件
- 2025年春新滬粵版物理八年級下冊課件 7.2 運動的快慢 速度
評論
0/150
提交評論