RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [資訊電機] [求助]C語法看不懂?   字型大小:||| 
mis617
鐵驢友〔高級〕
等級: 6等級: 6


今日心情

 . 積分: 63
 . 文章: 512
 . 收花: 218 支
 . 送花: 11194 支
 . 比例: 51.35
 . 在線: 585 小時
 . 瀏覽: 15522 頁
 . 註冊: 7999
 . 失蹤: 678
 . 無時不刻覺得自己很忙
#1 : 2007-10-17 05:54 PM     只看本作者 引言回覆

小弟學寫程式,目前正在看前輩的程式

typedef struct
{
        TaskData                        task;
        BatteryState                        state;
}aioTask;

static void aio_handler(Task task, MessageId id, Message message)
{
        uint32        reading;
       
        /* This function receives messages from the battery library */
        aioTask* this_task = (aioTask*) task;
        battery_reading_source source = this_task->state.source;
   
        power_state state = ((headsetTaskData *)getAppTask())->headset_power_state;
        printf(("BAT: state:%d\n",state));
        state = state;
        switch(id)
        {
                case BATTERY_READING_MESSAGE :               
                        /* New reading, extract reading in mV and handle accordingly */
                        reading = (*((uint32*)message));
               
                        switch(source)
                        {
                case AIO0:
                                case BATTERY_INTERNAL:
                    printf(("BAT: Reading in mV from AIO:%ld\n",reading));
                    if (IsBatteryDead(reading))
                    {                        
                        MessageSend(getAppTask(), APP_BATTERY_DEAD_IND, 0);
                    }
                    else if (IsBatteryLow(reading))
                    {                        
                        MessageSend(getAppTask(), APP_BATTERY_LOW_IND, 0);
                    }
                    else if (IsBatteryFull(reading))
                    {
                        MessageSend(getAppTask(), APP_BATTERY_FULL_IND, 0);
                    }
                    
                    break;
                                case VDD:
                case AIO1:
                                case AIO2:
                case AIO3:
                    
                                default:
                                        break;
                        }       
                        break;
                default:
            printf(("BAT: Unhandled Battery task; message id:0x%x\n",id));
                        break;
        }
}

請問
1. "aioTask*" 與 "(aioTask*)" 的差異在哪?
2. "power_state state = ((headsetTaskData *)getAppTask())->headset_power_state;"是啥意思


小弟是電子硬體的人員,基本上您可以當作我完全不會來幫我解釋
非常感謝各位大大的協助

[mis617 在  2007-10-17 06:00 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
bonta
銅驢友〔初級〕
等級: 8等級: 8


今日心情

 . 積分: 124
 . 文章: 156
 . 收花: 1012 支
 . 送花: 735 支
 . 比例: 0.73
 . 在線: 4410 小時
 . 瀏覽: 13975 頁
 . 註冊: 7027
 . 失蹤: 0
 . 陣代高中
#2 : 2007-10-17 06:07 PM     只看本作者 引言回覆

aioTask* this_task = (aioTask*) task;
可分開寫
aioTask* this_task;  //宣告變數
this_task = (aioTask*) task;  // task 應該是指標, 而 (aioTask*) 是強迫轉型, 所以這行是將 task 強迫轉型為 aioTask* 給 this_task;

第二個問題也分開寫
headsetTaskData* ptr;
ptr = (headsetTaskData *)getAppTask(); // getAppTask()應該是一個能傳回指標的函數,將傳回值強迫轉型;
power_state state = ptr->headset_power_state;

應該只是這樣而已

如果是寫 32bit 的程式, 指標應該 4byte, 對 c 而言,指標如 int 般僅是個 4byte 大小的變數, 它可以隨便你運算,或指定
只是不同資料型別的指標在傳遞時, compiler 會去檢查資料型別是否相等, 而強迫轉型只是告知 compiler 不用檢查。

[bonta 在  2007-10-17 06:14 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
mis617
鐵驢友〔高級〕
等級: 6等級: 6


今日心情

 . 積分: 63
 . 文章: 512
 . 收花: 218 支
 . 送花: 11194 支
 . 比例: 51.35
 . 在線: 585 小時
 . 瀏覽: 15522 頁
 . 註冊: 7999
 . 失蹤: 678
 . 無時不刻覺得自己很忙
#3 : 2007-10-17 11:02 PM     只看本作者 引言回覆

感謝 我已經找到我程式不會動的原因是
沒有這行 "#include <stdio.h>"  



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記

   



 



所在時區為 GMT+8, 現在時間是 2024-4-28 12:07 AM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.031119 second(s), 8 queries , Qzip disabled