黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

首頁考試吧論壇Exam8視線考試商城網絡課程模擬考試考友錄實用文檔求職招聘論文下載
2013中考
法律碩士
2013高考
MBA考試
2013考研
MPA考試
在職研
中科院
考研培訓 自學考試 成人高考
四 六 級
GRE考試
攻碩英語
零起點日語
職稱英語
口譯筆譯
申碩英語
零起點韓語
商務英語
日語等級
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點英語
托福考試
托業考試
零起點法語
雅思考試
成人英語三級
零起點德語
等級考試
華為認證
水平考試
Java認證
職稱計算機 微軟認證 思科認證 Oracle認證 Linux認證
公 務 員
導游考試
物 流 師
出版資格
單 證 員
報 關 員
外 銷 員
價格鑒證
網絡編輯
駕 駛 員
報檢員
法律顧問
管理咨詢
企業培訓
社會工作者
銀行從業
教師資格
營養師
保險從業
普 通 話
證券從業
跟 單 員
秘書資格
電子商務
期貨考試
國際商務
心理咨詢
營 銷 師
司法考試
國際貨運代理人
人力資源管理師
廣告師職業水平
衛生資格 執業醫師 執業藥師 執業護士
會計從業資格
基金從業資格
統計從業資格
經濟師
精算師
統計師
會計職稱
法律顧問
ACCA考試
注冊會計師
資產評估師
審計師考試
高級會計師
注冊稅務師
國際內審師
理財規劃師
美國注冊會計師
一級建造師
安全工程師
設備監理師
公路監理師
公路造價師
二級建造師
招標師考試
物業管理師
電氣工程師
建筑師考試
造價工程師
注冊測繪師
質量工程師
巖土工程師
造價員考試
注冊計量師
環保工程師
化工工程師
咨詢工程師
結構工程師
城市規劃師
材料員考試
監理工程師
房地產估價
土地估價師
安全評價師
房地產經紀人
投資項目管理師
環境影響評價師
土地登記代理人
繽紛校園 實用文檔 英語學習 作文大全 求職招聘 論文下載 訪談|游戲
軟件水平考試
軟件水平考試資訊
軟件水平考試試題
軟件水平考試專項輔導
軟件水平考試交流互動
軟件水平考試交流互動
您現在的位置: 考試吧 > 軟件水平考試 > 復習資料 > 程序員資料 > 正文

2012年軟考程序員輔導:C語言封送結構體數組

  在使用第三方的非托管API時,我們經常會遇到參數為指針或指針的指針這種情況,

  一般我們會用IntPtr指向我們需要傳遞的參數地址;

  但是當遇到這種一個導出函數時,我們如何正確的使用IntPtr呢,

  extern “C” __declspec(dllexport) int GetClass(Class pClass[50]) ;

  由于這種情況也經常可能遇到,所以我制作了2個示例程序來演示下如何處理這種非托管函數的調用!

  首先創建一個C++ 的DLL 設置一個如上的導出函數

  #include #include typedef struct Student { char name[20];int age;double scores[32];}Student;typedef struct Class { int number;Student students[126];}Class;extern “C” __declspec(dllexport) int GetClass(Class pClass[50])

  { for(int i=0;i<50;i++)

  { pClass[i].number=i;for(int j=0;j<126;j++)

  { memset(pClass[i].students[j].name,0,20);sprintf(pClass[i].students[j].name,“name_%d_%d”,i,j);pClass[i].students[j].age=j%2==0?15:20;} return 0;}上面DLL 的導出函數要求傳遞的參數為它自定義的Class結構體數組, 那么我們在C#調用它時也要自定義對應的結構體了,

  我們可以定義為如下:

  [StructLayout(LayoutKind.Sequential)] struct Student { [MarshalAs(UnmanagedType.ByValTStr,SizeConst=20)] public string name;public int age;[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)] public double[] scores;} [StructLayout(LayoutKind.Sequential)] struct Class { public int number;[MarshalAs(UnmanagedType.ByValArray,SizeConst=126)] public Student[] students;}需要注意的是,這2個結構體中的數組大小一定要跟C++中的限定一樣大小哦,接下來如何使用這個API來正確的獲取數據呢,大多數人可能想到像這樣的處理方式

  Class myclass = new Class();IntPtr ptr=Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Class)));GetClass(ptr);Marshal.FreeHGlobal(ptr);沒錯,這樣的處理是沒問題的,但是我們的API的參數是Class數組,這種處理方式只是傳遞一個Class結構體參數,所以這種方式在這里就不太合適了,!

  那大家就想到先Class[] myclass = new Class[MaxClass]; 然后在用Marshal.AllocHGlobal 來獲取myclass 數據的指針,

  其實這樣也是錯的, 因為 Class結構中包含了,不能直接封送的Student結構,所以無論如何上面的想法是錯誤的!

  那要怎么辦呢,其實很簡單,就是先分配一段非托管內存,并調用API后,再將非托管內容數據讀取到托管結構體數據中!

  示例C語言封送結構體數組演示代碼如下

  1 static void Main(string[] args)

  2 {

  3 int size = Marshal.SizeOf(typeof(Class)) * 50;

  4 byte[] bytes = new byte[size];

  5 IntPtr pBuff = Marshal.AllocHGlobal(size);

  6 Class[] pClass = new Class[50];

  7 GetClass(pBuff);

  8 for (int i = 0; i < 50; i++)

  9 {

  10 IntPtr pPonitor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(Class)) * i);

  11 pClass[i] = (Class)Marshal.PtrToStructure(pPonitor, typeof(Class));

  12 }

  13 Marshal.FreeHGlobal(pBuff);

  14 Console.ReadLine();

  15 }有興趣的不妨自己測試一下C語言封送結構體數組,看看輸出結果是否正確

文章搜索
軟件水平考試欄目導航
版權聲明:如果軟件水平考試網所轉載內容不慎侵犯了您的權益,請與我們聯系800@exam8.com,我們將會及時處理。如轉載本軟件水平考試網內容,請注明出處。
主站蜘蛛池模板: 日韩欧美综合在线 | 特级按摩一级毛片 | 国产精品午夜免费观看网站 | 日日草天天干 | 邪恶亚洲 | 色网在线视频 | 一级片视频在线观看 | 99精品视频在线免费观看 | 不卡视频一区 | 成人免费午间影院在线观看 | 99精品全国免费7观看视频 | 亚洲一区二区中文字幕 | 国产一区2区3区 | 天天干天天摸 | 亚洲精品人成网在线播放影院 | 日韩经典视频 | 久久曹| 欧美一区二区高清 | 午夜影院0606 | 天天摸天天看天天做天天爽 | 久青草视频在线 | 亚洲日本va中文字幕久久 | 男人天堂v | 快播怡红院 | 三级不卡| a毛片免费全部播放毛 | 国内日本精品视频在线观看 | 日日夜夜网站 | 欧美一级鲁丝片 | 免费亚洲一区 | 一级高清毛片免费a级高清毛片 | 99ri精品视频在线观看播放 | 高清一级做a爱过程不卡视频 | 欧美在线 | 欧美 | 九九亚洲精品自拍 | 日韩欧美在线综合网高清 | 麻豆日韩国产精品欧美在线 | 欧美久在线观看在线观看 | 国产区精品高清在线观看 | 人人人人爽 | 欧美乱大交黑人 |