><>< Variable แบบ Pointer นี่ เราจะชี้ไปที่ตำแหน่ง 0x.... ได้เลยเปล่าครับ

  • 6 Replies
  • 3106 Views
*

Offline TaoTao

  • ***
  • 239
    • View Profile
ไปเจอหลายๆ โค้ด เห็นมี Pointer อยู่เยอะเลย
เล่นเอา มึนมา 2 วันแว้วววว
เลยต้อง มาศึกษามันซะหน่อยน่ะครับ เพื่อนำมาใช้งาน

เท่าที่อ่านมา เห็นว่ามันประกาศได้อย่างนี้

char A;

char *pa;
    pa = &A; //แบบที่ 1 ระบุถึง Add A
  *pa = A; // แบบที่ 2 ระบุชื่อ A โดยตรง (หรือเปล่า O_o!)

  แล้วหาก ให้มัน ชี้ ไปยังตำแหน่งที่เจตนาเลย
เช่น 0x1000 ต้องกำหนดอย่างไรน่ะครับ

ใช่อย่างนี้อ๊ะเปล่า

char *pa;
pa = (char*) 0x1000;

ตอนนี้ ยังคอมไพล์ไม่ผ่านน่ะครับ
บางวิธีผ่าน แต่ก้ยัง งงงง อยู่น่ะครับ ยังไม่รู้รุปแบบที่ถูกต้องเป๊ะๆ

อ่านข้อมูลทางเน็ตมาบ้าง แต่เวลาคอมไพล์ ก็ผ่านบ้างไม่ผ่านบ้าง

สรุปแล้ว มันสามารถ กำหนดอ้างอิง ให้เจ้า pointer ได้กี่แบบอ่ะครับ

ขอบคุณล่วงหน้านะครับ

char* pt;
pt = 0x1000;

ถ้าคอมไฟล์ไม่ผ่านก็ต้องดูว่าตำแหน่งนั่นมันสงวนไว้หรือเปล่าไม่ทราบว่าเขียนใน PIC ?? หรือเขียนบนคอมธรรมดาครับ
รับเขียนโปรแกรม ออกแบบวงจร ไปจนถึง PCB
ไมโคร : 8/16/32 bit  ทุกตระกูล
สนใจติดต่อ
saintentex@gmail.com
หรือ 081-1846590

*

Offline TaoTao

  • ***
  • 239
    • View Profile
เขียนบน Softtune ของ Fujitsu
และก็ ใช้คู่กันกับ MPLABX ครับ

จุดที่ งงอยู่นะครับ
โค้ด การใช้งาน DualOpFlash หรือประมาณ EEPROMP ของ Microchip
ตย. จากที่เขาให้มา มันมี Var Pointer เยอะเลยครับ

อย่างเช่น โค้ดนี้ :


//======================= S t a r t ===================================//
unsigned int FindSpaceAddress(unsigned int start_addr , unsigned int end_addr)
{
   unsigned int i;
   unsigned char* adr;
   
   i = start_addr;
   while(1)
   {
      adr = (unsigned char*)i;
      if(*adr == 0xff)
         return i;
      else
      {
         if(++i > end_addr)
            return 0xffff;
      }      
   }
}

//-------------------------------------------------- end -----------------------------------------------------------//




//-------------------- ที่ งงงง 2 บรรทัดนี้น่ะครับ คือ
 
unsigned char* adr;

//-------------------- อันนี้เข้าใจว่า ประกาศ pointer ชื่อว่า adr





//---------------------------สำหรับบรรทัดนี้

adr = (unsigned char*)i;

//---------------------------งง ที่ว่า
สมมติว่า i=0x1000;
อันนี้ ให้ adr ไปชี้ ที่ตำแหน่ง 0x1000; เลยใช่เปล่าครับ
แล้วต่างกันกับ adr = 0x1000; ยังไงอ่ะครับ

Quote
//---------------------------งง ที่ว่า
สมมติว่า i=0x1000;
อันนี้ ให้ adr ไปชี้ ที่ตำแหน่ง 0x1000; เลยใช่เปล่าครับ
แล้วต่างกันกับ adr = 0x1000; ยังไงอ่ะครับ

i = 0x1000; มันคือค่าที่เก็บใน memory ครับ ส่วนตำแหน่งที่เก็บนั้นมันจะไม่เป็น 0x1000 นะครับดูตามข้างล่างนะ

           หลัก
 แถว  /  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0010   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.......
......
1000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
รับเขียนโปรแกรม ออกแบบวงจร ไปจนถึง PCB
ไมโคร : 8/16/32 bit  ทุกตระกูล
สนใจติดต่อ
saintentex@gmail.com
หรือ 081-1846590

i=0x1000;
adr = (unsigned char*)i;

adr ยัง catch type เป็น (unsigned char*) แล้วถ้าตรงๆไม่เป็นแบบนี้หรือครับ

adr = (unsigned char*)0x1000;

ยังไม่ได้ลองแค่เดาๆ
เว็บบล็อกคนพันธุ์ตรรกะ เพราะชีวิตมีมากกว่า 0 และ 1
http://www.10logic.com

*

Offline TaoTao

  • ***
  • 239
    • View Profile
Quote
//---------------------------งง ที่ว่า
สมมติว่า i=0x1000;
อันนี้ ให้ adr ไปชี้ ที่ตำแหน่ง 0x1000; เลยใช่เปล่าครับ
แล้วต่างกันกับ adr = 0x1000; ยังไงอ่ะครับ

i = 0x1000; มันคือค่าที่เก็บใน memory ครับ ส่วนตำแหน่งที่เก็บนั้นมันจะไม่เป็น 0x1000 นะครับดูตามข้างล่างนะ

           หลัก
 แถว  /  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0010   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.......
......
1000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

คือ ไม่ได้หมายถึงว่า พิม i=0x1000; ตามหลังน่ะครับ
แต่ผมสื่อถึงว่า i มีค่า 0x1000; มาก่อน
แล้วเจอคำสั่ง
adr=(int*)i; ตามมา

ตอนนี้ เริ่มเข้าใจขึ้นละครับ
ขอบคุณมากนะครับ

มันเป็นที่ softtune ด้วย
คือ หาก ขณะที่มันเป็น pointer var
หากสั่ง เพิ่ม Address แล้ว กำหนดค่า
ค่าจะไม่เปลี่ยนตาม

Address ต้องเปลี่ยน ตอนที่เป็น type อื่นก่อน
ที่ไม่ใช่ pointer
และผ่านการแปลง type สู่ pointer จากนั้น ถึงค่อยกำหนด Value
Value มันถึงจะยอมเปลี่ยน

แต่ เป็นกับ softtune น่ะครับ
ไม่รู้ XC เป็นเหมือนกันหรือเปล่า
เดี๋ยวว่าจะลองซักหน่อย

ถ้า i มีค่า 0x1000 มาแล้ว
adr=(int*)i; เป็นการสั่งให้ adr ที่เป็น pointer ชี้ไปยังตำแหน่ง 0x1000
แล้วถ้าจะเอาค่าที่ 0x1000 จะใช้คำสั่ง
int ans = *adr
รับเขียนโปรแกรม ออกแบบวงจร ไปจนถึง PCB
ไมโคร : 8/16/32 bit  ทุกตระกูล
สนใจติดต่อ
saintentex@gmail.com
หรือ 081-1846590