Ynt: c# unsafe kullanımında sorun

Başlatan Gökhan BEKEN, 13 Nisan 2015, 18:10:29

Gökhan BEKEN

c dili ile bir dll oluşturdum
c# ile yaptığım programa dll'i import ediyorum
her şey güzel tek bir sorunum var, pointerler işe yaramıyor.


c de bazı fonksiyonlarım pointer adresi alarak, dizinin verilerini değiştirmesi gerekiyor.

basite indirgersek şöyle:
    __declspec(dllexport) char gosterici(char * dizici){
        
        *dizici = 'a'; dizici++;
        *dizici = 'b'; dizici++;
        *dizici = 'c'; dizici++;
        *dizici = 'd'; dizici++;
        *dizici = 'e'; dizici++;
        *dizici = 'f'; dizici++;
        *dizici = 'g'; dizici++;
        *dizici = 'h'; dizici++;        
        return 0;
    }


c# da şu şekilde dll'i import ediyorum
[DllImport("..\\meftun.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe char gosterici(char* dizici);


kullanımım da şöyle:

önce dizinin ilk 8 elemanını rakam karakterleri olarak veriyorum, fonksiyonu çağırınca, alfabedeki karakterler ile değişmesini beklerken, alakasız değerler geliyor. Hem de char değişkenin boyutu max 127 olması gerekirken, çok alakasız değerler geliyor, ilginç tarafı da bütün hepsi değil sadece ilk 4 veri değişiyor, sanki 2byte'lık bir pointer gibi davranıyor.

            char[] dizim = new char[15];


            dizim[0] = '1';
            dizim[1] = '2';
            dizim[2] = '3';
            dizim[3] = '4';
            dizim[4] = '5';
            dizim[5] = '6';
            dizim[6] = '7';
            dizim[7] = '8';

            unsafe
            {
                fixed (char* pointasda = &dizim[0])
                {
                    gosterici(pointasda);
                }
            }

            listBox1.Items.Add(dizim[0]);
            listBox1.Items.Add(dizim[1]);
            listBox1.Items.Add(dizim[2]);
            listBox1.Items.Add(dizim[3]);
            listBox1.Items.Add(dizim[4]);
            listBox1.Items.Add(dizim[5]);
            listBox1.Items.Add(dizim[6]);
            listBox1.Items.Add(dizim[7]);


mesaj birleştirme:: 13 Nisan 2015, 18:50:05

Sorun çözüldü, ilgilenen olabilir diye açıklıyorum:

char dizilerde kullanmak için char değil aşağıdaki gibi tanımlamak gerekiyormuş, böyle yapınca düzeldi
StringBuilder dizim = new StringBuilder("12345678");


aslında bana char değil unsigned char lazımdı, c#'ın anladığı dile göre byte lazımdı, ben denemerlerimi char yapıyordum.
diziyi şöyle tanımlayınca, istediğim gibi çalıştı, en baştan byte yapsaymışım, hiç uğraşmama gerek kalmayacakmış:
byte[] dizim = new byte[15];
Özel mesaj okumuyorum, lütfen göndermeyin.