读书人

OpenFileDialog生解决方案

发布时间: 2013-07-20 11:07:48 作者: rapoo

OpenFileDialog生
小弟完全不知道生了什事,各位大大忙!
小弟宣告了一struct如下:
[Serializable]
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DataType
{
public float Parameter;
public float Setting;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public float[] Temp;
}
private static DataType MyData;
再宣告一float[]如下:
private static float[] MyDataFloat = new float[4];
程式成按一Button一OpenFileDialog使用者一TXT,
程式TXT中的float[],
再用以下的程式成struct,
IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(MyData) / 4);
Marshal.Copy(MyDataFloat, 0, buffer, Marshal.SizeOf(MyData) / 4);
MyData = (DataType)Marshal.PtrToStructure(buffer, MyData.GetType());
Marshal.FreeHGlobal(buffer);
整作就只有,
奇怪的生了,
按按第一次事,
第二次偶事,
第三次是出
"取或入受保的。通常表示其他已。"
且停在行:
if (opendlg.ShowDialog() != DialogResult.OK) { return; }
小弟完全不知道什?

以下出整Button的程式,各位高手忙,怎才?
private void button5_Click(object sender, EventArgs e)
{
string FilePathName,str;
OpenFileDialog opendlg = new OpenFileDialog();
opendlg.Filter = "TXT(*.txt)|*.txt|所有案(*.*)|*.*";
if (opendlg.ShowDialog() != DialogResult.OK) { return; }

// Read TXT File
StreamReader file = new StreamReader(FilePathName);
str=file.ReadLine();
file.Close();

// 假已拿到TXT的料了
MyDataFloat[0] = 0.111F;
MyDataFloat[1] = 0.222F;
MyDataFloat[2] = 0.333F;
MyDataFloat[3] = 0.444F;

IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(MyData) / 4);
Marshal.Copy(MyDataFloat, 0, buffer, Marshal.SizeOf(MyData) / 4);
MyData = (DataType)Marshal.PtrToStructure(buffer, MyData.GetType());
Marshal.FreeHGlobal(buffer);
}

P.S.
IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(MyData) / 4);
Marshal.Copy(MyDataFloat, 0, buffer, Marshal.SizeOf(MyData) / 4);
MyData = (DataType)Marshal.PtrToStructure(buffer, MyData.GetType());


Marshal.FreeHGlobal(buffer);
以上程式掉就,
可是小弟,
float[]可以完整地料struct。


[解决办法]
感觉是大小错了,不要 /4
[解决办法]


static DataType Data; //全局的
//第一次修改值
static void TestDataType1()
{
fixed (DataType* pd = &Data)
{
pd->Parameter = 0.1f;
pd->Setting = 0.2f;
pd->Temp[0] = 0.3f;
pd->Temp[1] = 0.4f;
}

}
//第二次,访问值
static void TestDataType2()
{
fixed (DataType* pd = &Data)
{
Console.WriteLine(pd->Temp[0]);
}
}

[解决办法]
你原来的写法也是可以的,只是这里有些错误
IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(MyData) / 4);这个是分配的字节数,Marshal.SizeOf返回的也是字节数,不能除以4
Marshal.Copy(MyDataFloat, 0, buffer, Marshal.SizeOf(MyData) / 4);这个是复制的长度,第一个参数的类型的数量,第一个参数是float[],长度就是float的个数,所以要字节数除以4。
至于你那一会成功一会报错,那就是因为恰好访问越界内存的时候,那地方被别人用没用着的原因。

读书人网 >C#

热点推荐