如果一個(gè)函數(shù)要使用參數(shù),它就必須定義接受參數(shù)值的變量。
10多年的義馬網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整義馬建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“義馬網(wǎng)站設(shè)計(jì)”,“義馬網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
形式參數(shù)與實(shí)際參數(shù)
函數(shù)定義時(shí)填入的參數(shù)我們稱之為形式參數(shù),簡(jiǎn)稱形參,它們同函數(shù)內(nèi)部的局部變量作用相同。形參的定義是在函數(shù)名之后和函數(shù)開始的花括號(hào)之前。
調(diào)用時(shí)填入的參數(shù),我們稱之為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參。
必須確認(rèn)所定義的形參與調(diào)用函數(shù)的實(shí)際參數(shù)類型一致,同時(shí)還要保證在調(diào)用時(shí)形參與實(shí)參的個(gè)數(shù)出現(xiàn)的次序也要一一對(duì)應(yīng)。如果不一致,將產(chǎn)生意料不到的結(jié)果。與許多其它高級(jí)語言不同,(是健壯的,它總要做一些甚至你不希望的事情,幾乎沒有運(yùn)行時(shí)錯(cuò)誤檢查,完
全沒有范圍檢測(cè)。作為程序員,必須小心行事以保證不發(fā)生錯(cuò)誤,安全運(yùn)行。
賦值調(diào)用與引用調(diào)用
一般說來,有兩種方法可以把參數(shù)傳遞給函數(shù)。第一種叫做“賦值調(diào)用”(call
by
value),這種方法是把參數(shù)的值復(fù)制到函數(shù)的形式參數(shù)中。這樣,函數(shù)中的形式參數(shù)的任何變化不會(huì)影響到調(diào)用時(shí)所使用的變量。
把參數(shù)傳遞給函數(shù)的第二種方法是“引用調(diào)用”(call
by
reference)。這種方法是把參數(shù)的地址復(fù)制給形式參數(shù),在函數(shù)中,這個(gè)地址用來訪問調(diào)用中所使用的實(shí)際參數(shù)。這意味著,形式參數(shù)的變化會(huì)影響調(diào)用時(shí)所使用的那個(gè)變量
c語言實(shí)驗(yàn)心得:
1、只有頻繁用到或?qū)\(yùn)算速度要求很高的變量才放到data區(qū)內(nèi),如for循環(huán)中的計(jì)數(shù)值。
2、其他不頻繁調(diào)用到和對(duì)運(yùn)算速度要求不高的變量都放到xdata區(qū)。
3、常量放到code區(qū),如字庫(kù)、修正系數(shù)。
4、邏輯標(biāo)志變量可以定義到bdata中。
在51系列芯片中有16個(gè)字節(jié)位尋址區(qū)bdata,其中可以定義8*16=128個(gè)邏輯變量。這樣可以大大降低內(nèi)存占用空間。定義方法是: bdata bit LedState;但位類型不能用在數(shù)組和結(jié)構(gòu)體中。
5、data區(qū)內(nèi)最好放局部變量。
因?yàn)榫植孔兞康目臻g是可以覆蓋的(某個(gè)函數(shù)的局部變量空間在退出該函數(shù)是就釋放,由別的函數(shù)的局部變量覆蓋),可以提高內(nèi)存利用率。當(dāng)然靜態(tài)局部變量除外,其內(nèi)存使用方式與全局變量相同;
6、確保程序中沒有未調(diào)用的函數(shù)。
在Keil C里遇到未調(diào)用函數(shù),編譯器就將其認(rèn)為可能是中斷函數(shù)。函數(shù)里用的局部變量的空間是不釋放,也就是同全局變量一樣處理。這一點(diǎn)Keil做得很愚蠢,但也沒辦法。
7、如果想節(jié)省data空間就必須用large模式。
將未定義內(nèi)存位置的變量全放到xdata區(qū)。當(dāng)然最好對(duì)所有變量都要指定內(nèi)存類型。
8、使用指針時(shí),要指定指針指向的內(nèi)存類型。
在C51中未定義指向內(nèi)存類型的通用指針占用3個(gè)字節(jié);而指定指向data區(qū)的指針只占1個(gè)字節(jié);指定指向xdata區(qū)的指針占2個(gè)字節(jié)。如指針p是指向data區(qū),則應(yīng)定義為: char data *p;。還可指定指針本身的存放內(nèi)存類型,如:char data * xdata p;。其含義是指針p指向data區(qū)變量,而其本身存放在xdata區(qū)。
以前沒搞過C51,大學(xué)時(shí)代跟單片機(jī)老師的時(shí)候也是搗鼓下匯編,現(xiàn)在重新搞單片機(jī),因?yàn)槭诸^資料不多,找到一些C51的程序,發(fā)現(xiàn)里面有這些關(guān)鍵字,不甚明了,沒辦法只好找了下,發(fā)現(xiàn)如下描述:
從數(shù)據(jù)存儲(chǔ)類型來說,8051系列有片內(nèi)、片外程序存儲(chǔ)器,片內(nèi)、片外數(shù)據(jù)存儲(chǔ)器,片內(nèi)程序存儲(chǔ)器還分直接尋址區(qū)和間接尋址類型,分別對(duì)應(yīng)code、data、xdata、idata以及根據(jù)51系列特點(diǎn)而設(shè)定的pdata類型,使用不同的存儲(chǔ)器,將使程序執(zhí)行效率不同,在編寫C51程序時(shí),最好指定變量的存儲(chǔ)類型,這樣將有利于提高程序執(zhí)行效率(此問題將在后面專門講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對(duì)應(yīng)不同的實(shí)際硬件系統(tǒng),也將有不同的編譯結(jié)果。
在51系列中data,idata,xdata,pdata的區(qū)別
data:固定指前面0x00-0x7f的128個(gè)RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
idata:固定指前面0x00-0xff的256個(gè)RAM,其中前128和data的128完全相同,只是因?yàn)樵L問的方式不同。idata是用類似C中的指針方式訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補(bǔ)充:c中idata做指針式的訪問效果很好)
xdata:外部擴(kuò)展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
pdata:外部擴(kuò)展RAM的低256個(gè)字節(jié),地址出現(xiàn)在A0-A7的上時(shí)讀寫,用movx ACC,@Rx讀寫。這個(gè)比較特殊,而且C51好象有對(duì)此BUG,建議少用。但也有他的優(yōu)點(diǎn),具體用法屬于中級(jí)問題,這里不提。
三、有關(guān)單片機(jī)ALE引腳的問題
"單片機(jī)不訪問外部鎖存器時(shí)ALE端有正脈沖信號(hào)輸出,此頻率約為時(shí)鐘振蕩頻率的1/6.每當(dāng)訪問
外部數(shù)據(jù)存儲(chǔ)器是,在兩個(gè)機(jī)器周期中ALE只出現(xiàn)一次,即丟失一個(gè)ALE脈沖."這句話是不是有毛
病.我覺得按這種說法,應(yīng)該丟失3個(gè)ALE脈沖才對(duì),我一直想不通是怎么回事,希望大蝦們幫幫我.
小弟感激涕零.
答:
其他所有指令每6個(gè)機(jī)器周期發(fā)出一個(gè)ALE,而MOVX指令占用12個(gè)機(jī)器周期只發(fā)出一個(gè)ALE
四、如何將一個(gè)INT型數(shù)據(jù)轉(zhuǎn)換成2個(gè)CHAR型數(shù)據(jù)?
經(jīng)keil優(yōu)化后,char1=int1/256,char2=int1%256或char1=int18,char2=int10x00ff效率是一樣的。
五、在KEIL C51上仿真完了,怎樣生成HEX文件去燒寫??
右鍵點(diǎn)項(xiàng)目中Target 1,選第二個(gè),在OUTPUT中選中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一個(gè)新的數(shù)據(jù)類型,但實(shí)際上這個(gè)新的數(shù)據(jù)類型是已經(jīng)存在的,只不過是定義了
一個(gè)新的名字.
#define只是一個(gè)標(biāo)號(hào)的定義.
你舉的例子兩者沒有區(qū)別,但是#define還可以這樣用
#define MAX 100
#define FUN(x) 100-(x)
#define LABEL
等等,這些情況下是不能用typedef定義的
七、請(qǐng)問如何設(shè)定KELC51的仿真工作頻(時(shí)鐘)
用右鍵點(diǎn)擊左邊的的target 1,然后在xtal一欄輸入
八、不同模塊怎樣共享sbit變量,extern不行?
把SBIT定義單獨(dú)放到一個(gè).H中,每個(gè)模塊都包含這個(gè).h文件
九、C51中對(duì)于Px.x的訪問必須自己定義嗎?
是的。
如sbit P17 = 0x97;即可定義對(duì)P1.7的訪問
十、SWITCH( )語句中表達(dá)式不可以是位變量對(duì)嗎?
可以用位變量:
#include
#include
void main()
{
bit flag;
flag=0;
switch(flag)
{
case '0':{printf("0\n");break;}
case '1':{printf("1\n");break;}
default:break;
}
}
bit 變量只有兩種狀態(tài),if 語句足夠啦,!!!
十一、const常數(shù)聲明占不占內(nèi)存???
const 只是用來定義“常量”,所占用空間與你的定義有關(guān),如:
const code cstStr[] = {"abc"};
占用代碼空間;而如:
const char data cstStr[] = {"abc"};
當(dāng)然占用內(nèi)存空間。
另外,#define 之定義似乎不占用空間。
十二、philips的單片機(jī)P89C51RD+的擴(kuò)展RAM在C51中如何使用?
試一試將auxr.1清0,然后在c語言中直接聲明xdata類型的變量
十三、BUG of Keil C51
程序中用如下語句:
const unsigned char strArr[] = {"數(shù)學(xué)"};
結(jié)果發(fā)現(xiàn)strArr[] 內(nèi)容為 {0xCA,0xD1,0xA7},真奇怪!
凡是有0xfd,則會(huì)通通不見了,所以只能手工輸入內(nèi)碼了,例如 uchar strArr[]=
{0xCA,0xfd,0xd1,0xa7}(用Ultraedit會(huì)很方便)。
十四、Keil C51中如何實(shí)現(xiàn)代碼優(yōu)化?
菜單Project下Option for target "Simulator"的C51.
看到Code optimization了嗎?
十五、請(qǐng)教c的!和 ~ 符號(hào)有甚區(qū)別??
!是邏輯取反,~是按位取反。
十六、c51編程,讀端口,還要不要先輸出1?
我怎么看到有的要,有的不要,請(qǐng)高手給講講,到底咋回事?謝了
要輸出1的,除非你能保證之前已經(jīng)是1,而中間沒有輸出過其他值。
十七、當(dāng)定時(shí)器1(T1)用于產(chǎn)生波特率時(shí),P3^5還是否可以用作正常的I/O口呢?
p3.5完全可以當(dāng)普通的io使用
十八、C51中 INT 轉(zhuǎn)換為 2個(gè)CHAR?
各位高手:
C51中 INT 轉(zhuǎn)換為 CHAR 如何轉(zhuǎn)換諸如:
X = LOW(Z);
Y = HIGH(Z);
答:
x=(char)z;
y=(char)(z8);
十九、如果我想使2EH的第7位置1的話,用位操作可以嗎?
現(xiàn)在對(duì)位操作指令我一些不太明白請(qǐng)各位多多指教:
如 SETB 07H 表示的是20H.7置1,對(duì)嗎?(我在一本書上是這么看到的)
那么如果我想使2EH的第7位置1的話,象我舉的這個(gè)例子怎么表示呢?謝謝!
SETB 77H
setb (2eh-20h)*8+7
20h-2fh每字節(jié)有8個(gè)可位操作(00h-7fh),其它RAM不可位直接操作
二十、char *addr=0xc000 和char xdata *addr=0xc000有何區(qū)別?
char *addr=0xc000;
char xdata *addr=0xc000;
除了在內(nèi)存中占用的字節(jié)不同外,還有別的區(qū)別嗎?
char *addr=0xc000; 是通用定義,指針變量 addr 可指向任何內(nèi)存空間的值;
char xdata *addr=0xc000; 指定該指針變量只能指向 xdata 中的值;
后一種定義中該指針變量(addr)將少占用一個(gè)存儲(chǔ)字節(jié)。
uchar xdata *addr=0xc000;指針指向外ram;
如果:data uchar xdata *addr=0xc000;指針指向外ram但指針本身存在于內(nèi)ram(data)
中
以此類推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;
data uchar idata *addr=0xa0;.........
二十一、while(p1_0)的執(zhí)行時(shí)間?
假設(shè),P1_0為單片機(jī)P1口的第一腳,請(qǐng)問,
while(P1_0)
{
P1_0=0;
}
while(!P1_0)
{
P1_0=1;
}
以上代碼,在KEIL C中,需要多長(zhǎng)時(shí)間,執(zhí)行完。能具體說明while(P1_0)的執(zhí)行時(shí)間嗎?
仿真運(yùn)行看看就知道了,
我仿真了試了一下,約14個(gè)周期
二十二、怎樣編寫C51的watchdog程序?
各位大蝦,我用KEIL C51 編寫了一個(gè)帶外部開門狗的程序,可程序無法運(yùn)行起來,經(jīng)過查
找,發(fā)現(xiàn)程序在經(jīng)過C51編譯后,在MAIN()函數(shù)的前部增加了一端初始化程序,等到進(jìn)入
主程序設(shè)置開門狗時(shí),開門狗已經(jīng)時(shí)間到,將我的程序復(fù)位了,請(qǐng)問我怎樣才能修改這一端
初始花程序,使他一運(yùn)行,就設(shè)置開門狗?
可以在startup.a51中加入看門狗刷新指令,當(dāng)然用匯編,然后重新編譯startup.a51
,將他和你的程序連接即可。新的startup.a51會(huì)自動(dòng)代替系統(tǒng)默認(rèn)的啟動(dòng)模塊。
二十三、keil C51 怎樣把修改的startup.a51 加到工程文件中
直接加入即可
注意不要改動(dòng)?STACK,?C_START,?C_STARTUP等符號(hào)。startup.a51直接加入項(xiàng)目,不用修改也可。可在內(nèi)面自己修改匯編的一些限制或堆棧指針。
二十四、關(guān)于波特率的設(shè)置
我在設(shè)定串口波特率時(shí)發(fā)現(xiàn)一個(gè)問題:在晶體震蕩器為11.0592MHz時(shí),若設(shè)9600BPS的話,
TH1=0XFD,TL1=0XFD,而要設(shè)19200BPS的話,TH1、TL1有否變化,如果沒變,為什么?
如果變了,又為什么?(因?yàn)槲铱磿蟼z個(gè)是一樣的),希望大家點(diǎn)撥。
答:
當(dāng)電源控制寄存器(PCON)第BIT7(SMOD)為1時(shí)波特率加倍。
TH1和TL1的值不變.
二十五、如何在C中聲明保留這部分RAM區(qū)不被C使用?
我不知道在C源程序中怎么控制這個(gè),但在匯編程序中加入下面一段就行:
DSEG AT 20H
AA: DS 10
這樣C51就不會(huì)占用20H--29H了
或者在c51里這樣定義:
uchar data asm_buff[10] _at_ 0x20;
二十六、問浮點(diǎn)運(yùn)算問題
我在用C51時(shí)發(fā)現(xiàn)它對(duì)傳遞浮點(diǎn)參數(shù)的個(gè)數(shù)有限制,請(qǐng)問:
1)參數(shù)是以全局變量的形式傳遞的,請(qǐng)問以全局變量的形式傳遞的參數(shù)也有限制嗎?
2)這種傳遞浮點(diǎn)參數(shù)的限制有多少呢?
3)float*float的結(jié)果是float類型還是double類型?能否直接賦值給float類型的變量?
答:
由于KEIL C51的參數(shù)傳遞是通過R0-R7來傳遞的,所以會(huì)有限制。
不過KEIL提供了一個(gè)編譯參數(shù),可以支持更多參數(shù)的傳遞。具體
的內(nèi)容見KEIL的PDF文檔。
我建議你把多個(gè)要傳遞的參數(shù)定義到指針或結(jié)構(gòu)體中去,傳遞參
數(shù)通過指針或結(jié)構(gòu)進(jìn)行,這樣好一些。
第3個(gè)問題回答是YES,你自己試試不就知道了。
二十七、如何在某一個(gè)地址定義ram
用_at_ 命令,這樣可以定位靈活一點(diǎn)的地址
uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM
將dis_buff[16]定位在0x6020開始的16個(gè)字節(jié)
二十八、keil c中,用什么函數(shù)可以得到奇偶校驗(yàn)位?
例如32位數(shù)據(jù),將四個(gè)字節(jié)相互異或后檢查P即可,若耽心P被改變,可用內(nèi)嵌匯編。
#include
unsigned char parity(unsigned char x){
x^=x;
if(P)return(1);
else return(0);
}
unsigned char parity2(unsigned int x){
#pragma asm
mov a,r7
xrl ar6,a
#pragma endasm
if(P)return(1);
else return(0);
}
先看下我的運(yùn)行結(jié)果吧,會(huì)自動(dòng)判斷輸入的m、n是否合法哦!
上代碼,注釋只寫了部分有助理解的。
#include stdio.h
int Found(int m, int n, int a[])
{
int i = 0;
int Count = 0;
int offset = 0;?//數(shù)組a的下標(biāo)
int qian, bai, shi, ge;?//千位、百位、十位、個(gè)位的值
for(i=m; i=n; i++)
{
//取出千位、百位、十位、個(gè)位的值
qian = i/1000;
bai = (i%1000)/100;
shi = (i%100)/10;
ge = i%10;
if((qian= bai bai=shi shi=ge) (qian+ge == bai+shi))?//找到一個(gè)符合條件的數(shù)
{
Count++;
a[offset++] = i;
}
}
return Count;
}
int main()
{
int m = 0;
int n = 0;
int nResult[100] = {0};
int Count = 0;
int i = 0;
FILE* pFile = NULL;
char szInfo[100] = {0};
while(1)
{
printf("Please enter m and n:");
scanf("%d %d", m, n);
printf("\n");
if(m=1000 n=1200 mn)
break;
else
printf("輸入數(shù)據(jù)不合法,請(qǐng)重新輸入\n");
}
Count = Found(m, n, nResult);
pFile = fopen("104.out", "w");
if(NULL == pFile)
printf("打開文件失敗\n");
sprintf(szInfo, "found %d numbers in %d ~ %d:\n", Count, m, n);
printf("%s", szInfo);
if(NULL != pFile)
{
fwrite("No. 104\n", 1, strlen("No. 104\n"), pFile);?//?寫入學(xué)號(hào)
fwrite(szInfo, 1, strlen(szInfo), pFile);???//寫入部分信息
}
for(i=0; iCount; i++)
{
printf("%d? ", nResult[i]);
sprintf(szInfo, "%d? ", nResult[i]);
if(NULL != pFile)??//輸出到屏幕的同時(shí),順便把該值寫進(jìn)文件
fwrite(szInfo, 1, strlen(szInfo), pFile);
}
printf("\n");
if(NULL != pFile)
fclose(pFile);
return 0;
}
自從工作以來,兩年沒上過百度知道了,當(dāng)初上大學(xué)的時(shí)候天天在百度知道問問題,今偶爾閑娛,幫忙解答,想不到這里還是這么熱鬧,不禁想起了當(dāng)年為一個(gè)鏈表、一個(gè)函數(shù)挑燈夜戰(zhàn)的場(chǎng)景。只能嘆時(shí)間太快,想不到都過去好幾年了。做程序最需要毅力,小師弟,好好努力吧,嘿嘿,下班回家咯!
首先回答你的第三個(gè)問題:
可憐的娃娃,你的函數(shù)聲明和函數(shù)定義里面不完全配對(duì)啊。仔細(xì)看看,你是int max(int a,int b,int c);
下邊函數(shù)定義的時(shí)候呢?你寫的是int max(int x,int y,int z){...},這樣子編譯器會(huì)發(fā)現(xiàn)你的聲明和定義不符,所以報(bào)錯(cuò)。這里要記得,聲明和函數(shù)定義的東西必須是完全一致的,這個(gè)等到你知道接口的概念會(huì)好理解很多。
下邊回答第一個(gè)問題:
變量,在聲明的時(shí)候同時(shí)分配內(nèi)存地址,所以在你定義了函數(shù) int max(int x,int y,int z){..}的時(shí)候,內(nèi)存里面已經(jīng)給了x,y,z一個(gè)地方。
而且前邊main()之前的這個(gè)函數(shù)只是告訴編譯器:我有這樣一個(gè)函數(shù),接下來要調(diào)用它,并不是定義,所以聲明這部分的時(shí)候 x y z是并沒有分配內(nèi)存的,等到你定義了max函數(shù)體的時(shí)候,xyz自然有地址了。
對(duì)于你的第二個(gè)問題:
在函數(shù)內(nèi)部定義的變量只對(duì)本函數(shù)有效,也就是說,你在定義max()的時(shí)候把變量定義成max(int t,int p,int happy)也是沒關(guān)系的,因?yàn)橄到y(tǒng)調(diào)用函數(shù)的時(shí)候,都是值傳遞的,所以你只要傳遞了3個(gè)int型的值就是正確的,和你寫成什么樣子無關(guān)。
----------------------------
不知道我說的夠明白不?
ps:補(bǔ)充一下,你確實(shí)是第一個(gè)聲明的時(shí)候,逗號(hào)打錯(cuò)地方了,放到正確地方就行了。
你總得先描述下出了什么問題別人才好幫你。
還有,你的main函數(shù)返回值不是應(yīng)該是個(gè)double類型的嗎?返回值呢?
網(wǎng)站名稱:c語言函數(shù)實(shí)驗(yàn)遇到的問題 c語言實(shí)驗(yàn)遇到的問題及解決方法
標(biāo)題路徑:http://aaarwkj.com/article48/dooodhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站改版、定制網(wǎng)站、做網(wǎng)站、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)