none
有關多唯陣列的問題 RRS feed

  • 問題


  • 想請問一下
    我想弄一個陣列他是三唯的(我自己想的)

    他是byte [] x = new byte[,]
    但x裡面每個元素又是另一個一唯的陣列(所以我想應該是三唯的吧)

    但我不知道如何建立~應該用指標嗎

    而且陣列一定要初始化嗎
    但如果我想臨時更改陣列大小可以嗎
    順便一問~陣列可以使用static嗎
    我想把它變成全域的變數~因為在main()以外我還不能確定我的陣列要多大
    所以只好在function裡面宣告
    但是就變成區域的變數了
    所以想用static但是失敗了
    不知道這幾個問題該如何解決
    謝謝
    2008年7月24日 上午 08:30

解答

  • Code Snippet

    class a
    {

    private byte[,][] All_histogram; // 這裡不宣告實體

    public a()
    {}
    public process(bitmap image)
    {
    pfunc(image)
    }
    public void pfunc(Bitmpa image)
    {
    All_histogram = new byte[image.height ,image.width][]; // 這裡才宣告實體,就會取代參照
    histogram[0,0] = new byte[256];
    // 做histogram的統計
    }


    }

     

     

    2008年7月25日 下午 01:37

所有回覆

  •  

    Hi anzojds,

     

    依據您的描述,這仍是一個二維陣列.陣列可先宣告其長度, 再指定資料. 不一定要在宣告時便指定資料。

    動態改變陣列大小, VB.NET 裏有 redim 語法, C#應該只能用array.copy的方式複製到一個較大的陣列.

     

    Static 宣告請參考以下sample:

     

    Code Snippet

    Program.cs

     

     static class Program
        {
            public static string[] x = new string[5];
            /// <summary>
            /// 應用程式的主要進入點。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

     

    Form1.cs

     public partial class Form1 : Form
        {
          

            public Form1()
            {
                InitializeComponent();
                Program.x[0] = "Hello";
                MessageBox.Show(Program.x[0]);
            }
        }

     

     

     

     

    林泰宏 Terry Lin 
    技術支援工程師 Support Engineer
    Developer Support Team
    Global Technical Support Center - Taiwan

    技術支援服務首頁: http://support.microsoft.com

    技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

     

    2008年7月24日 上午 08:57


  • 可是我連他的長度也不能確定
    要等資料進來才知道~那該怎麼辦呢
    謝謝
    2008年7月24日 上午 10:03
  • 在線上手冊搜尋不規則陣列:

    ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_csref/html/537c65a6-0e0a-4a00-a2b8-086f38519c70.htm

     

    Code Snippet

     

    不規則陣列是指這種陣列的元素也是陣列。不規則陣列的元素可以有不同維度及大小。不規則陣列有時稱為「陣列中的陣列」。下列範例會示範如何宣告、初始化和存取不規則陣列

    以下是一個一維陣列的宣告,其中有三個元素,而每個元素都是一維的整數陣列:

     

    ... 略

     

     

    重新宣告陣列大小可用:

    Array.ReSize

    2008年7月24日 上午 10:21


  • http://msdn.microsoft.com/zh-tw/library/1ffy6686(VS.80).aspx

    不好意思

    我只有找到一唯的更改大小的涵式

    不知道有沒有二維的resize的方法

    如果是不規則陣列
    那所以我在宣告完以後
    是不是還要用一個迴圈去一個一個指定裡面的陣列

    byte[,] tmp= new byte[2,2];

    for(int x = 0 ; x <= h ; x++)
    {
        for(int y = 0 ; y <= w ; y++)
        {
    tmp[x,y] = new byte[20];
        }
    }

    不知道有沒有辦法讓我這tmp陣列型態是byte,但理面所指到的陣列是int的型態
    ex.

    tmp[0,0] = new int[20];

    謝謝
    2008年7月25日 上午 07:28
  • 不規則陣列在 VS2005 微軟翻譯定名前,也有人稱為樹狀陣列,在每個元素內利用 pointer 指向遠端實體陣列,每次改一個維度,一樣可用 Array.ReSize 改變。

     

     

    分清楚你是要隨時改陣列大小還是使用時只改一次?使用時只改一次,是先宣告維度,不宣告上下標,使用時宣告大小。若要已經存入資料的陣列改變大小,就受到 Array.ReSize 的限制,只能改陣列最後一維的大小,三維都要動態就會用三層的不規則陣列,不會用 1+2 維的這種方式配置。

     

    .Net 內並未公開共用記憶體的宣告方式,所以不行,從類別反組譯來看應該是可以,然後再修改參照數,但是因為沒有明確穩定的方式,所以不建議嘗試。你的需求過去常用在點陣圖檔的處理,在 .Net 並無對應的方法處理。

     

     

    2008年7月25日 上午 09:58


  • 嗯嗯
    private byte[,][] All_histogram = new byte[2,2][];  <- 這個
    Array.Resize(ref All_histogram, dataH * dataW);  <- 這個在FUNCTION裡面

    他會給我錯誤:
    錯誤    2    方法 'System.Array.Resize<T>(ref T[], int)' 的型別引數不能從使用方式推斷。請明確指定型別引數。

    如果我把All_histogram改成一唯的陣列他就可以過~但是我需要三微的
    目前也沒想到有啥更好的方法

    我也不太確定我的影像大小會是幾乘幾的(也希望可以寫有彈性一點)

    所以應該是
    All_histogram[y,x][256]這樣吧
    Y是影像的高
    X是影像的寬
    256是我要對pixel做histogram用的
    for(xy)
    {
    All_histogram[y,x] = new byte[256] ;
    }

    其實我是想要寫個Kmean演算法
    我想對進來的影像每個pixel做histogram
    所以我想先累積大概300張左右的影像
    所以All_histogram必須是要全域的變數~但又必須等要影像進來才知道大小~所以才會這樣
    然後各別對每個pixel做kmean演算法
    大概是這樣

    謝謝




    2008年7月25日 上午 10:36
  • 你這種需求直接宣告一個新陣列參照回去就可以了,因為你沒有要保存既有值,就不需要重新宣告大小。

    2008年7月25日 上午 10:40
  • 不好意思~可能是我表達不太清楚
    我的是

    class a
    {
    private byte[,][] All_histogram = new byte[2,2][];

    public a()
    {}
    public process(bitmap image)
    {
    pfunc(image)
    }
    public void pfunc(Bitmpa image)
    {
    Array.Resize(All_histogram, image.height * image.width)   <---當影像進來時才知道大小
    histogram[0,0] = new byte[256];
    // 做histogram的統計
    }

    }

    所以基本上無法參照回去
    因為它可能這class會用到而已
    但不一定main需要用道
    因為很好像耗記憶體所以也不太好

    我這樣應該算要保存既有值吧
    而且要保存300個frame左右吧

    2008年7月25日 下午 01:28
  • Code Snippet

    class a
    {

    private byte[,][] All_histogram; // 這裡不宣告實體

    public a()
    {}
    public process(bitmap image)
    {
    pfunc(image)
    }
    public void pfunc(Bitmpa image)
    {
    All_histogram = new byte[image.height ,image.width][]; // 這裡才宣告實體,就會取代參照
    histogram[0,0] = new byte[256];
    // 做histogram的統計
    }


    }

     

     

    2008年7月25日 下午 01:37



  • 謝謝你不願其煩的為我解答
    跟的沒有想到還有這招
    真是太謝謝你了

    2008年7月25日 下午 04:11