真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語言函數(shù)實驗遇到的問題 c語言實驗遇到的問題及解決方法

c語言中,函數(shù)調用應該注意哪些問題?

如果一個函數(shù)要使用參數(shù),它就必須定義接受參數(shù)值的變量。

10多年的義馬網(wǎng)站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調整義馬建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“義馬網(wǎng)站設計”,“義馬網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

形式參數(shù)與實際參數(shù)

函數(shù)定義時填入的參數(shù)我們稱之為形式參數(shù),簡稱形參,它們同函數(shù)內部的局部變量作用相同。形參的定義是在函數(shù)名之后和函數(shù)開始的花括號之前。

調用時填入的參數(shù),我們稱之為實際參數(shù),簡稱實參。

必須確認所定義的形參與調用函數(shù)的實際參數(shù)類型一致,同時還要保證在調用時形參與實參的個數(shù)出現(xiàn)的次序也要一一對應。如果不一致,將產生意料不到的結果。與許多其它高級語言不同,(是健壯的,它總要做一些甚至你不希望的事情,幾乎沒有運行時錯誤檢查,完

全沒有范圍檢測。作為程序員,必須小心行事以保證不發(fā)生錯誤,安全運行。

賦值調用與引用調用

一般說來,有兩種方法可以把參數(shù)傳遞給函數(shù)。第一種叫做“賦值調用”(call

by

value),這種方法是把參數(shù)的值復制到函數(shù)的形式參數(shù)中。這樣,函數(shù)中的形式參數(shù)的任何變化不會影響到調用時所使用的變量。

把參數(shù)傳遞給函數(shù)的第二種方法是“引用調用”(call

by

reference)。這種方法是把參數(shù)的地址復制給形式參數(shù),在函數(shù)中,這個地址用來訪問調用中所使用的實際參數(shù)。這意味著,形式參數(shù)的變化會影響調用時所使用的那個變量

c語言實驗報告心得

c語言實驗心得:

1、只有頻繁用到或對運算速度要求很高的變量才放到data區(qū)內,如for循環(huán)中的計數(shù)值。

2、其他不頻繁調用到和對運算速度要求不高的變量都放到xdata區(qū)。

3、常量放到code區(qū),如字庫、修正系數(shù)。

4、邏輯標志變量可以定義到bdata中。

在51系列芯片中有16個字節(jié)位尋址區(qū)bdata,其中可以定義8*16=128個邏輯變量。這樣可以大大降低內存占用空間。定義方法是: bdata bit LedState;但位類型不能用在數(shù)組和結構體中。

5、data區(qū)內最好放局部變量。

因為局部變量的空間是可以覆蓋的(某個函數(shù)的局部變量空間在退出該函數(shù)是就釋放,由別的函數(shù)的局部變量覆蓋),可以提高內存利用率。當然靜態(tài)局部變量除外,其內存使用方式與全局變量相同;

6、確保程序中沒有未調用的函數(shù)。

在Keil C里遇到未調用函數(shù),編譯器就將其認為可能是中斷函數(shù)。函數(shù)里用的局部變量的空間是不釋放,也就是同全局變量一樣處理。這一點Keil做得很愚蠢,但也沒辦法。

7、如果想節(jié)省data空間就必須用large模式。

將未定義內存位置的變量全放到xdata區(qū)。當然最好對所有變量都要指定內存類型。

8、使用指針時,要指定指針指向的內存類型。

在C51中未定義指向內存類型的通用指針占用3個字節(jié);而指定指向data區(qū)的指針只占1個字節(jié);指定指向xdata區(qū)的指針占2個字節(jié)。如指針p是指向data區(qū),則應定義為: char data *p;。還可指定指針本身的存放內存類型,如:char data * xdata p;。其含義是指針p指向data區(qū)變量,而其本身存放在xdata區(qū)。

以前沒搞過C51,大學時代跟單片機老師的時候也是搗鼓下匯編,現(xiàn)在重新搞單片機,因為手頭資料不多,找到一些C51的程序,發(fā)現(xiàn)里面有這些關鍵字,不甚明了,沒辦法只好找了下,發(fā)現(xiàn)如下描述:

從數(shù)據(jù)存儲類型來說,8051系列有片內、片外程序存儲器,片內、片外數(shù)據(jù)存儲器,片內程序存儲器還分直接尋址區(qū)和間接尋址類型,分別對應code、data、xdata、idata以及根據(jù)51系列特點而設定的pdata類型,使用不同的存儲器,將使程序執(zhí)行效率不同,在編寫C51程序時,最好指定變量的存儲類型,這樣將有利于提高程序執(zhí)行效率(此問題將在后面專門講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對應不同的實際硬件系統(tǒng),也將有不同的編譯結果。

在51系列中data,idata,xdata,pdata的區(qū)別

data:固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。

idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補充:c中idata做指針式的訪問效果很好)

xdata:外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。

pdata:外部擴展RAM的低256個字節(jié),地址出現(xiàn)在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG,建議少用。但也有他的優(yōu)點,具體用法屬于中級問題,這里不提。

三、有關單片機ALE引腳的問題

"單片機不訪問外部鎖存器時ALE端有正脈沖信號輸出,此頻率約為時鐘振蕩頻率的1/6.每當訪問

外部數(shù)據(jù)存儲器是,在兩個機器周期中ALE只出現(xiàn)一次,即丟失一個ALE脈沖."這句話是不是有毛

病.我覺得按這種說法,應該丟失3個ALE脈沖才對,我一直想不通是怎么回事,希望大蝦們幫幫我.

小弟感激涕零.

答:

其他所有指令每6個機器周期發(fā)出一個ALE,而MOVX指令占用12個機器周期只發(fā)出一個ALE

四、如何將一個INT型數(shù)據(jù)轉換成2個CHAR型數(shù)據(jù)?

經keil優(yōu)化后,char1=int1/256,char2=int1%256或char1=int18,char2=int10x00ff效率是一樣的。

五、在KEIL C51上仿真完了,怎樣生成HEX文件去燒寫??

右鍵點項目中Target 1,選第二個,在OUTPUT中選中CREAT HEX

六、typedef 和 #define 有何不同??

typedef 和 #define 有何不同》》》 如

typedef unsigned char UCHAR ;

#define unsigned char UCHAR ;

typedef命名一個新的數(shù)據(jù)類型,但實際上這個新的數(shù)據(jù)類型是已經存在的,只不過是定義了

一個新的名字.

#define只是一個標號的定義.

你舉的例子兩者沒有區(qū)別,但是#define還可以這樣用

#define MAX 100

#define FUN(x) 100-(x)

#define LABEL

等等,這些情況下是不能用typedef定義的

七、請問如何設定KELC51的仿真工作頻(時鐘)

用右鍵點擊左邊的的target 1,然后在xtal一欄輸入

八、不同模塊怎樣共享sbit變量,extern不行?

把SBIT定義單獨放到一個.H中,每個模塊都包含這個.h文件

九、C51中對于Px.x的訪問必須自己定義嗎?

是的。

如sbit P17 = 0x97;即可定義對P1.7的訪問

十、SWITCH( )語句中表達式不可以是位變量對嗎?

可以用位變量:

#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ù)聲明占不占內存???

const 只是用來定義“常量”,所占用空間與你的定義有關,如:

const code cstStr[] = {"abc"};

占用代碼空間;而如:

const char data cstStr[] = {"abc"};

當然占用內存空間。

另外,#define 之定義似乎不占用空間。

十二、philips的單片機P89C51RD+的擴展RAM在C51中如何使用?

試一試將auxr.1清0,然后在c語言中直接聲明xdata類型的變量

十三、BUG of Keil C51

程序中用如下語句:

const unsigned char strArr[] = {"數(shù)學"};

結果發(fā)現(xiàn)strArr[] 內容為 {0xCA,0xD1,0xA7},真奇怪!

凡是有0xfd,則會通通不見了,所以只能手工輸入內碼了,例如 uchar strArr[]=

{0xCA,0xfd,0xd1,0xa7}(用Ultraedit會很方便)。

十四、Keil C51中如何實現(xiàn)代碼優(yōu)化?

菜單Project下Option for target "Simulator"的C51.

看到Code optimization了嗎?

十五、請教c的!和 ~ 符號有甚區(qū)別??

!是邏輯取反,~是按位取反。

十六、c51編程,讀端口,還要不要先輸出1?

我怎么看到有的要,有的不要,請高手給講講,到底咋回事?謝了

要輸出1的,除非你能保證之前已經是1,而中間沒有輸出過其他值。

十七、當定時器1(T1)用于產生波特率時,P3^5還是否可以用作正常的I/O口呢?

p3.5完全可以當普通的io使用

十八、C51中 INT 轉換為 2個CHAR?

各位高手:

C51中 INT 轉換為 CHAR 如何轉換諸如:

X = LOW(Z);

Y = HIGH(Z);

答:

x=(char)z;

y=(char)(z8);

十九、如果我想使2EH的第7位置1的話,用位操作可以嗎?

現(xiàn)在對位操作指令我一些不太明白請各位多多指教:

如 SETB 07H 表示的是20H.7置1,對嗎?(我在一本書上是這么看到的)

那么如果我想使2EH的第7位置1的話,象我舉的這個例子怎么表示呢?謝謝!

SETB 77H

setb (2eh-20h)*8+7

20h-2fh每字節(jié)有8個可位操作(00h-7fh),其它RAM不可位直接操作

二十、char *addr=0xc000 和char xdata *addr=0xc000有何區(qū)別?

char *addr=0xc000;

char xdata *addr=0xc000;

除了在內存中占用的字節(jié)不同外,還有別的區(qū)別嗎?

char *addr=0xc000; 是通用定義,指針變量 addr 可指向任何內存空間的值;

char xdata *addr=0xc000; 指定該指針變量只能指向 xdata 中的值;

后一種定義中該指針變量(addr)將少占用一個存儲字節(jié)。

uchar xdata *addr=0xc000;指針指向外ram;

如果:data uchar xdata *addr=0xc000;指針指向外ram但指針本身存在于內ram(data)

以此類推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;

data uchar idata *addr=0xa0;.........

二十一、while(p1_0)的執(zhí)行時間?

假設,P1_0為單片機P1口的第一腳,請問,

while(P1_0)

{

P1_0=0;

}

while(!P1_0)

{

P1_0=1;

}

以上代碼,在KEIL C中,需要多長時間,執(zhí)行完。能具體說明while(P1_0)的執(zhí)行時間嗎?

仿真運行看看就知道了,

我仿真了試了一下,約14個周期

二十二、怎樣編寫C51的watchdog程序?

各位大蝦,我用KEIL C51 編寫了一個帶外部開門狗的程序,可程序無法運行起來,經過查

找,發(fā)現(xiàn)程序在經過C51編譯后,在MAIN()函數(shù)的前部增加了一端初始化程序,等到進入

主程序設置開門狗時,開門狗已經時間到,將我的程序復位了,請問我怎樣才能修改這一端

初始花程序,使他一運行,就設置開門狗?

可以在startup.a51中加入看門狗刷新指令,當然用匯編,然后重新編譯startup.a51

,將他和你的程序連接即可。新的startup.a51會自動代替系統(tǒng)默認的啟動模塊。

二十三、keil C51 怎樣把修改的startup.a51 加到工程文件中

直接加入即可

注意不要改動?STACK,?C_START,?C_STARTUP等符號。startup.a51直接加入項目,不用修改也可。可在內面自己修改匯編的一些限制或堆棧指針。

二十四、關于波特率的設置

我在設定串口波特率時發(fā)現(xiàn)一個問題:在晶體震蕩器為11.0592MHz時,若設9600BPS的話,

TH1=0XFD,TL1=0XFD,而要設19200BPS的話,TH1、TL1有否變化,如果沒變,為什么?

如果變了,又為什么?(因為我看書上倆個是一樣的),希望大家點撥。

答:

當電源控制寄存器(PCON)第BIT7(SMOD)為1時波特率加倍。

TH1和TL1的值不變.

二十五、如何在C中聲明保留這部分RAM區(qū)不被C使用?

我不知道在C源程序中怎么控制這個,但在匯編程序中加入下面一段就行:

DSEG AT 20H

AA: DS 10

這樣C51就不會占用20H--29H了

或者在c51里這樣定義:

uchar data asm_buff[10] _at_ 0x20;

二十六、問浮點運算問題

我在用C51時發(fā)現(xiàn)它對傳遞浮點參數(shù)的個數(shù)有限制,請問:

1)參數(shù)是以全局變量的形式傳遞的,請問以全局變量的形式傳遞的參數(shù)也有限制嗎?

2)這種傳遞浮點參數(shù)的限制有多少呢?

3)float*float的結果是float類型還是double類型?能否直接賦值給float類型的變量?

答:

由于KEIL C51的參數(shù)傳遞是通過R0-R7來傳遞的,所以會有限制。

不過KEIL提供了一個編譯參數(shù),可以支持更多參數(shù)的傳遞。具體

的內容見KEIL的PDF文檔。

我建議你把多個要傳遞的參數(shù)定義到指針或結構體中去,傳遞參

數(shù)通過指針或結構進行,這樣好一些。

第3個問題回答是YES,你自己試試不就知道了。

二十七、如何在某一個地址定義ram

用_at_ 命令,這樣可以定位靈活一點的地址

uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM

將dis_buff[16]定位在0x6020開始的16個字節(jié)

二十八、keil c中,用什么函數(shù)可以得到奇偶校驗位?

例如32位數(shù)據(jù),將四個字節(jié)相互異或后檢查P即可,若耽心P被改變,可用內嵌匯編。

#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);

}

C語言函數(shù)問題(有挑戰(zhàn)性難題)

先看下我的運行結果吧,會自動判斷輸入的m、n是否合法哦!

上代碼,注釋只寫了部分有助理解的。

#include stdio.h

int Found(int m, int n, int a[])

{

int i = 0;

int Count = 0;

int offset = 0;?//數(shù)組a的下標

int qian, bai, shi, ge;?//千位、百位、十位、個位的值

for(i=m; i=n; i++)

{

//取出千位、百位、十位、個位的值

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))?//找到一個符合條件的數(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ù)不合法,請重新輸入\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);?//?寫入學號

fwrite(szInfo, 1, strlen(szInfo), pFile);???//寫入部分信息

}

for(i=0; iCount; i++)

{

printf("%d? ", nResult[i]);

sprintf(szInfo, "%d? ", nResult[i]);

if(NULL != pFile)??//輸出到屏幕的同時,順便把該值寫進文件

fwrite(szInfo, 1, strlen(szInfo), pFile);

}

printf("\n");

if(NULL != pFile)

fclose(pFile);

return 0;

}

自從工作以來,兩年沒上過百度知道了,當初上大學的時候天天在百度知道問問題,今偶爾閑娛,幫忙解答,想不到這里還是這么熱鬧,不禁想起了當年為一個鏈表、一個函數(shù)挑燈夜戰(zhàn)的場景。只能嘆時間太快,想不到都過去好幾年了。做程序最需要毅力,小師弟,好好努力吧,嘿嘿,下班回家咯!

初學C語言 定義新函數(shù) 遇到了問題...輸出最大的數(shù)

首先回答你的第三個問題:

可憐的娃娃,你的函數(shù)聲明和函數(shù)定義里面不完全配對啊。仔細看看,你是int max(int a,int b,int c);

下邊函數(shù)定義的時候呢?你寫的是int max(int x,int y,int z){...},這樣子編譯器會發(fā)現(xiàn)你的聲明和定義不符,所以報錯。這里要記得,聲明和函數(shù)定義的東西必須是完全一致的,這個等到你知道接口的概念會好理解很多。

下邊回答第一個問題:

變量,在聲明的時候同時分配內存地址,所以在你定義了函數(shù) int max(int x,int y,int z){..}的時候,內存里面已經給了x,y,z一個地方。

而且前邊main()之前的這個函數(shù)只是告訴編譯器:我有這樣一個函數(shù),接下來要調用它,并不是定義,所以聲明這部分的時候 x y z是并沒有分配內存的,等到你定義了max函數(shù)體的時候,xyz自然有地址了。

對于你的第二個問題:

在函數(shù)內部定義的變量只對本函數(shù)有效,也就是說,你在定義max()的時候把變量定義成max(int t,int p,int happy)也是沒關系的,因為系統(tǒng)調用函數(shù)的時候,都是值傳遞的,所以你只要傳遞了3個int型的值就是正確的,和你寫成什么樣子無關。

----------------------------

不知道我說的夠明白不?

ps:補充一下,你確實是第一個聲明的時候,逗號打錯地方了,放到正確地方就行了。

C語言中函數(shù)的調用出現(xiàn)了問題

你總得先描述下出了什么問題別人才好幫你。

還有,你的main函數(shù)返回值不是應該是個double類型的嗎?返回值呢?


網(wǎng)站題目:c語言函數(shù)實驗遇到的問題 c語言實驗遇到的問題及解決方法
瀏覽地址:http://weahome.cn/article/dooodhp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部