ห่างหายจากการ post ลงเว็บบอร์ดไปซะนาน พอดีวันนี้ผมมีงานที่จำเป็นจะต้องใช้ Pointer to array of pointer ซึ่งตอนแรกก็ไม่คิดว่าจะต้องใช้มัน เลยอยากเอามาแชร์เผื่อมีใครจำเป็นต้องนำไปใช้หรือนึกไม่ออกว่าทำไมต้องใช้มัน
ตามปกติโดยทั่งไปแล้วหากเราต้องการอ่านค่าจาก array of pointer ก็สามารถทำได้ง่ายๆจาก code ด้านล่าง
const unsigned char *pTable1[] = {
&data4,
&data3,
&data2,
&data1,
};
const unsigned char *pTable2[] = {
&data10,
&data9,
&data8,
&data7,
&data6,
&data5,
};
TestRead = *pTable1[0];
TestRead = *pTable2[0];
แต่ปัญหาของผมก็คือผมจำเป็นที่จะต้องทำให้ code ในการอ่านค่าจาก array of pointer ของ pTable1 และ pTable2 นั้น common กันโดยเลือกจากตัวแปรว่าจะอ่านค่าจาก pTable1 หรือ pTable2
พยายามอยู่นานจึงนึกออกขึ้นว่าน่าจะต้องใช้ Pointer to array of pointer ซึง code สำหรับทดสอบก็ตามด้านล่างครับ
// Test pointer to array of pointer by firmware.c
#include <avr/io.h>
unsigned char data1 = 1;
unsigned char data2 = 2;
unsigned char data3 = 3;
unsigned char data4 = 4;
unsigned char data5 = 5;
unsigned char data6 = 6;
unsigned char data7 = 7;
unsigned char data8 = 8;
unsigned char data9 = 9;
unsigned char data10 = 10;
const unsigned char *pTable1[] = {
&data4,
&data3,
&data2,
&data1,
};
const unsigned char *pTable2[] = {
&data10,
&data9,
&data8,
&data7,
&data6,
&data5,
};
unsigned char SelectTable;
unsigned char TestRead;
unsigned char ReadCount;
unsigned char **LpSelectTable; // pointer to array of pointer
unsigned char Counter;
int main(void)
{
while(1)
{
if (SelectTable == 0) {
LpSelectTable = (unsigned char **)&pTable1;
ReadCount = sizeof(pTable1)/sizeof(pTable1[0]);
} else {
LpSelectTable = (unsigned char **)&pTable2;
ReadCount = sizeof(pTable2)/sizeof(pTable2[0]);
}
// common code area to read array of pointer pTable1 or pTable2
Counter = 0;
do {
TestRead = **(LpSelectTable+Counter);
PORTB = TestRead;
} while (++Counter < ReadCount);
}
}
The study has been made of this knowledge to study it failed to look elsewhere anymore.