วันเสาร์ที่ 1 พฤศจิกายน พ.ศ. 2557

ตัวแปร FLOAT




ตัวแปร FLOAT
INCLUDE ฟังชัน float
29/3/2557 SONGCHAI PRAPATRUNGSEE
INCLUDE ฟังชัน float
ในกรณีที่มีการประกาศตัวแปรจำนวนมาก
และอยากเก็บไว้ในINCLUDE ทำดังนี้
1 ให้COPY ตัวแปรที่จะเอาเข้ามาในINCLUDE
2 คลิกFILE/NEW
3 วาง(PASTE)ลงในไฟล์ที่สร้างขึ้น
4 คลิกFILE
5 คลิกSAVE AS
6 ที่ช่องFILE NAMEให้พิมพ์ชื่อตามด้วย.C หรือ.H
7 คลิกSAVE
8 INCLUDEไฟล์ที่เราสร้างเสร็จแล้วเป็นไฟล์.C หรือ.H เช่น
#include <DIV.C> ชื่อไฟล์ที่อยู่ในวงเล็บมุม
#include ” DIV.C”  ชื่อไฟล์ที่อยู่ในเครื่องหมายคำพูด
#include < DIV.H> ชื่อไฟล์ที่อยู่ในวงเล็บมุม
#include ” DIV.H”  ชื่อไฟล์ที่อยู่ในเครื่องหมายคำพูด
สามารถใช้ได้เหมือนกันทั้งวงเล็บมุมและเครื่องหมายคำพูด
ถ้าเก็บใน C:\Keil\C51\INC
หรือเก็บไว้ในFOLDERที่รวบรวมไฟล์โปรเจคนั้น
ไม่ต้องมีDIRECTORY
บอกเส้นทางเพราะคอมไพล์เลอร์จะรู้เอง
แต่ถ้าจะเก็บไว้ในที่ของเราเอง
ต้องบอกDIRECTORYหรือบอกเส้นทางให้คอมไพล์เลอร์รู้ เช่น
#include < F:\DIVFUNC.C >
#include ” F:\DIVFUNC.C ”
#include < F:\DIVFUNC.H >
#include ” F:\DIVFUNC.H”
=====================

การประกาศตัวแปรแบบGLOBAL
คือการประกาศตัวแปรนอกฟังชัน
และเป็นการจองตัวแปรแบบถาวร
ข้อดีคือสามารถใช้ได้ทั่วทั้งไฟล์(โปรแกรม)
ข้อเสียคือเปลืองRAMและROM เช่น

#include <REGX51.H>/*H FILE NOT HEX FILE*/
unsigned char i,j;//0-255
float k,l,m;
/*float -999999967 UPTO 4294967295*/

void main(){
 
  i=10,j=3;
  //k=i/j;/*NOT DISPLAY DOT*/
  k=(float)i/j;/*CAN DISPLAY DOT*/
  
  l=4294967295;//MAX4294967295
/* 4.294967e+009=4294967000 */
  
  m=-999999967;/*LEAST -999999967*/
/* -9999999e+008=999999900 */
}

/* GL0BAL
USE k=i/j; =DATA23,CODE140
IF USE k=(float)i/j; =DATA23,CODE402
*/
========================

การประกาศตัวแปรแบบLOCAL
คือการประกาศตัวแปรในฟังชัน
และเป็นการจองตัวแปรแบบชั่วคราว
ข้อดีคือประหยัดRAMและROM
เพราะสามารถใช้งานได้ภายในฟังชันเท่านั้น
เมื่อใช้งานเสร็จแล้วจะคืนพื้นที่ให้กับRAMและROM
    เมื่อคืนพื้นที่ให้กับแรมและรอมแล้วก็จะสามารถ
ใช้งานชื่อตัวแปรซ้ำกันได้ในฟังชันอื่น
    ยกเว้นฟังชันINTERRUPT
เพราะเมื่อเกิดการINTERRUPT
ก็จะกระโดดไปทำงานในฟังชันINTERRUPTก่อน
เมื่อเกิดการINTERRUPTหรือขัดจังหวะ
ฟังชันที่ใช้ชื่อซ้ำกันถ้ายังทำงานไม่เสร็จ
ก็จะยังไม่คืนพื้นที่ให้กับแรมและรอม
ดังนั้นค่าของตัวแปรที่ใช้ชื่อซ้ำกันนั้น
ก็จะไปทำงานในฟังชันINTERRUPT
ทำให้เกิดค่าที่ผิดพลาดได้
    ในทางกลับกันถ้าฟังชัน INTERRUPTทำงานเสร็จ
ก็จะกลับมาทำงานต่อจากบรรทัดที่ทำงานค้างไว้
ในฟังชันmain(ฟังชันหลัก)
ก็จะทำให้ค่าผิดเพื้ยนได้เช่นเดียวกัน
ข้อเสียคือ
1 ไม่สามารถใช้งานนอกฟังชันได้ เช่น

#include <REGX51.H>/*H FILE NOT HEX FILE*/

void main(){
  unsigned char i,j;//0-255
  float k,l,m;
  /*float 999999967 UPTO 4294967295*/
 
  i=10,j=3;
  //k=i/j;/*NOT DISPLAY DOT*/
  k=(float)i/j;/*CAN DISPLAY DOT*/
  
  l=4294967295;//MAX4294967295
/* 4.294967e+009=4294967000 */
  
  m=-999999967;/*LEAST -999999967*/
/* -9.999999e+008=999999900 */
}

/* LOCAL
USE k=i/j; =DATA21,CODE134
IF USE k=(float)i/j; =DATA22,CODE401
*/========================

การใช้ฟังชันFUNCTION

#include <REGX51.H>/*H FILE NOT HEX FILE*/

float k;
/*float -999999967 UPTO 4294967295*/

float DIV(unsigned char i,j){
  float l,m;
  l=4294967295;//MAX4294967295
/* 4.294967e+009=4294967000 */
  
  m=-999999967;/*LEAST -999999967*/
/* -9.999999+008=999999900 */
  
  //return i/j;/*NOT DISPLAY DOT*/
  return(float)i/j;/*CAN DISPLAY DOT*/
}

void main(){
 
  k=DIV(10,3);
 
}

/*IF USE FUNCTION
USE k=i/j; =DATA21,CODE290
IF USE k=(float)i/j; =DATA23,CODE413
*/
==========================

การใช้งานINCLUDE ฟังชัน

#include <REGX51.H>/*H FILE NOT HEX FILE*/
#include "DIVFUNC.C"

float DIV(unsigned char i,j);

float k;
/*float -999999967 UPTO 4294967295*/

void main(){
 
  k=DIV(10,3);
 
}

/*IF USE FUNCTION
USE k=i/j; =DATA21,CODE290
IF USE k=(float)i/j; =DATA23,CODE413
*/
============================

ฟังชันDIV

float DIV(unsigned char i,j){
  float l,m;
  l=4294967295;//MAX4294967295
/* 4.294967e+009=4294967000 */
  
  m=-999999967;/*LEAST -999999967*/
/* -9.999999+008=999999900 */
  
  //return i/j;/*NOT DISPLAY DOT*/
  return(float)i/j;/*CAN DISPLAY DOT*/
}

คำอธิบายโปรแกรม(ไฟล์)
    #include <REGX51.H>
# คือ เครื่องหมายSHARP เป็นพรีโปรเซสเซอร์ไดเรกทีฟ
    ( PREPROCESSOR  DIRECTIVE )
    หมายความว่าเป็นคำสั่งประมวลผลก่อน


include =เอาไฟล์ภายนอกเข้ามาร่วมในการคอมไพล์(แปล)
    หมายความว่าเวลากดBUILDหรือREBUILD
    ก็จะเข้าไปทำการคอมไพล์(แปล)ในไฟล์ include ก่อน
    จากนั้นจึงกลับมาคอมไพล์ต่อจากบรรทัดที่คอมไพล์ไปแล้ว
    ให้เป็นไฟล์.HEX หรือเลขฐาน16

<REGX51.H> = ชื่อที่ทางคอมไพล์เลอร์กำหนด
    แทนตำแหน่งแอดเดรสของไมโครคอนโทรลเลอร์
    เพื่อให้ง่ายต่อการจดจำและใช้งาน

.H คือไฟล์นามสกุล H FILE ไม่ใช่ HEX FILE


    unsigned char i,j;
, เครื่องหมายคอมมา หมายความว่า ยังมีอีก
; เครื่องหมายเซมิโคลอน หมายความว่าจบคำสั่ง
i,j คือตัวแปรที่ตั้งชื่อเองอยู่ในช่วงชนิดข้อมูลunsigned char
    อยู่ในช่วง0-255=256ค่า

float k,l,m;
k,l,m; คือตัวแปรที่ตั้งชื่อเองอยู่ในช่วงชนิดข้อมูลfloat
    อยู่ในช่วง -999999967 UPTO 4294967295
e+008 =เลื่อนจุดทศนิยมขึ้น8จุด(ค่าเพิ่มขึ้น)
e+009 =เลื่อนจุดทศนิยมขึ้น9จุด(ค่าเพิ่มขึ้น)

    void main( )
void =ไม่มี OUTPUT(RETURN TYPE)
main = FUNCTION NAME, main=ชื่อฟังค์ชันหลัก
( ) =วงเล็บเปล่า=ไม่มี INPUT(ARGUMENTS)
{….} =วงเล็บปีกกา เป็นLOOPหรือขอบเขตของการทำงาน

     i=10,j=3;
กำหนด i=10 และกำหนด j=3
และจบคำสั่งด้วย “ ; “ STATEMENT

    k=(float)i/j;
(float) คือการกำหนดให้ตัวแปร i เป็น floatแบบชั่วคราว
/ คือเครื่องหมายSLASH=เครื่องหมายหาร
k=(float)i/j; i/j เสร็จแล้วเอาผลลัพท์มาเก็บไว้ใน k

    l=4294967295;  
เอาค่าสูงสุดของfloat คือ 4294967295
มาเก็บไว้ใน l

    m=-999999967;
เอาค่าต่ำสุดของfloat คือค่าลบ -999999967
มาเก็บไว้ใน m
จบบรรทัดนี้เข้าสู่โหมดประหยัดพลังงาน

    float DIV(unsigned char i,j);
=FUNCTION PROTOTYPEหรือฟังชันต้นแบบ
ไฟล์หลักจะเรืยกใช้ INCLUDE
โดยการเรียกใช้ผ่าน FUNCTION PROTOTYPE
หรือฟังชันต้นแบบ
        
float =มีOUTPUT(RETURN TYPE)
    เป็นชนิดข้อมูลมีค่าอยู่ในช่วง
    -999999967 UPTO 4294967295
    สามารถเป็นจุดทศนิยมได้ 6หลัก

DIV = ชื่อฟังชันที่ตั้งขึ้นเอง

     ( unsigned char i , j ); 
หมายความว่ามี INPUT(ARGUMENTS)
เป็นการประกาศตัวแปรแบบLOCAL
i และ j คือตัวแปรที่ตั้งชื่อขื้นเอง
มีค่าอยู่ในช่วงชนิดข้อมูล unsigned char
คือ0-255=256ค่า

{…..} = ขอบเขตการทำงานของฟังชัน
float l,m;  เป็นการประกาศตัวแปรแบบLOCAL

    return (float)i/j;
หมายความว่า i/j แล้วเก็บผลลัพท์ไว้ใน i
ในรูปแบบfloatชั่วคราว
return คือคำสั่งย้อนกลับหมายถึงเอาผลลัพท์ของ i/j
ย้อนกลับไปให้ฟังชันDIV ซึ่งมีOUTPUT(RETURN TYPE)
อยู่ในช่วงชนิดข้อมูลfloat
หมายความว่าฟังชันDIV มีค่าเท่ากับผลลัพท์ของ i/j



ไม่มีความคิดเห็น: