none
char* 會出現:指標何固定大小緩衝區只能用於unsafes內容中?? RRS feed

  • 問題

  • 個位前輩:

    下面有我宣告的東西

    [DllImport("SunComm.dll", EntryPoint = "CommTagIDGet")]
    public static extern int CommTagIDGet(int index, char* tag_id, int second);

    private void button2_Click(object sender, EventArgs e)
    {
    char[] tag_id=new char[20];
    CommTagIDGet(0, tag_id, 1);
    MessageBox.Show(bbb.ToString());
    }

    char* 會出現:指標何固定大小緩衝區只能用於unsafes內容中,我該怎麼做才能Run過呢??請指導。
    請指導。
    2009年9月15日 上午 08:26

解答

  • 如果tag_id是要取得字串的話
    請宣告成StringBuilder tag_id
    呼叫時傳入StringBuilder的實體
    即可得到字串

    [DllImport("SunComm.dll", EntryPoint = "CommTagIDGet")]
    public static extern int CommTagIDGet(int index, StringBuilder tag_id, int second);

    private void button2_Click(object sender, EventArgs e)
    {
    StringBuilder sb = new StringBuilder(20);
    CommTagIDGet(0, sb, 1);
    MessageBox.Show(sb.ToString());
    }

    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    • 已標示為解答 害羞 2009年9月16日 上午 01:39
    2009年9月15日 上午 10:59

所有回覆

  • 試試看

    private void button2_Click(object sender, EventArgs e)
    {
    unsafe{
    char[] tag_id=new char[20];
    CommTagIDGet(0, tag_id, 1);
    MessageBox.Show(bbb.ToString());
    }
    }


    private unsafe void button2_Click(object sender, EventArgs e)
    {
    char[] tag_id=new char[20];
    CommTagIDGet(0, tag_id, 1);
    MessageBox.Show(bbb.ToString());
    }
    2009年9月15日 上午 09:34
  • 使用第一個結果還是出現......"指標何固定大小緩衝區只能用於unsafes內容中",

    使用第二個結果出現............"指標和大小緩衝區只能使用於unsafes內容中"和"若程式中有unsafes程式碼,編譯時必須使用/unsafes選項"。
    2009年9月15日 上午 09:54
  • 如果你只是要宣告 DLL 的使用,將 char* 用 byte[] 來替換看看。

    在預設的情況下,C# 不能使用指標,若要用指標的話,要在編譯器設定中啟用 unsafe 模式才行。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    2009年9月15日 上午 10:35
    版主
  • 如果tag_id是要取得字串的話
    請宣告成StringBuilder tag_id
    呼叫時傳入StringBuilder的實體
    即可得到字串

    [DllImport("SunComm.dll", EntryPoint = "CommTagIDGet")]
    public static extern int CommTagIDGet(int index, StringBuilder tag_id, int second);

    private void button2_Click(object sender, EventArgs e)
    {
    StringBuilder sb = new StringBuilder(20);
    CommTagIDGet(0, sb, 1);
    MessageBox.Show(sb.ToString());
    }

    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    • 已標示為解答 害羞 2009年9月16日 上午 01:39
    2009年9月15日 上午 10:59
  • 補充

    出現 [程式中若有 unsafe 程式碼,編譯時必須使用 /unsafe 選項 ] 可參考這邊的設定

    http://www.dotblogs.com.tw/chou/archive/2009/04/12/7986.aspx#P040


    .NET菜鳥自救會 http://www.dotblogs.com.tw/chou/
    2009年9月15日 上午 11:43
    版主
  • 試試看把 public static extern int CommTagIDGet(int index, char* tag_id, int second); 這個宣告
    改為
    public static extern int CommTagIDGet(int index, [In] string tag_id, int second);

    學而不思則罔, 思而不學則殆. 寫程式無他, 唯勤而已.
    2009年9月15日 下午 01:22
    版主
  • 感謝各位前輩指教,

    我會繼續努力,就像小朱說的"初學不是問題,但用不正確的態度來問問題,那就是很大的問題",
    還有Bill Chung說的"學而不思則罔, 思而不學則殆. 寫程式無他, 唯勤而已",

    我會繼續加油。

    2009年9月16日 上午 01:42
  • 1. 我和小朱那兩句話只是我們的簽名檔
    2. 我想問一下, 用StringBuilder真的傳的進去嗎? 因為char* 我都是用string傳, 沒用過StringBuilder.

    學而不思則罔, 思而不學則殆. 寫程式無他, 唯勤而已.
    2009年9月16日 上午 03:28
    版主
  • 你還是要看 char* 實際上代表的是什麼吧?

    有些 API 的 char* 是 byte[],有些是 string。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    2009年9月16日 上午 04:26
    版主
  • 依照MSDN上的範例
    如果參數上char*的目的是要回傳字串
    則用StringBuilder
    CLI會自動幫你把StringBuilder的Buffer指標傳進去 最為字串接收
    所以在new StringBuilder時要設定capacity的大寫, 如果capacity太小造成存到buffer之外, 結果會不明確
    更可以在Attribute加上CharSet來設置是ANSI字串還是Unicode字串
    絕對不會有亂碼的問題

    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    2009年9月16日 上午 06:52