0

問題がありますが、それについて理解できません。問題の根本原因がわかりません。私は小さなプログラムを持っており、それを win 7 (64 ビット) で実行すると、アクセス違反の例外が発生します。この例外は、winXP (32 ビット) では発生しません。その後、いくつかのコードを変更し、アクセス違反の例外は発生しません (win 7 と winxp の両方で)。私は例外の根本原因ではありません。次のようにコードします。前のコード (win 7 でアクセス違反例外が発生)。

[StructLayout(LayoutKind.Sequential)]
public struct gpc_vertex
{
public float x;
public float y;
};

private ArrayList DoPolygonOperation()
{
IntPtr currentVertex = vertexList.vertexes;

gpc_vertex oVertext = new gpc_vertex();

for (int j = 0; j < vertexList.num_vertices; j++)
{
    PositionF pos = new PositionF();
    oVertext = (gpc_vertex)Marshal.PtrToStructure(currentVertex, typeof(gpc_vertex));
    //Access violation exception
    pos.X = oVertext.x;
    pos.Y = oVertext.y;
    Marshal.DestroyStructure(currentVertex, typeof(gpc_vertex));
    currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));

    posList.Add(pos);
}
}

修正後のコード(アクセス違反例外は発生しません):

private ArrayList DoPolygonOperation()
{
 IntPtr currentVertex = vertexList.vertexes;

gpc_vertex oVertext = new gpc_vertex();
int currentOffset = 0; 
for (int j = 0; j < vertexList.num_vertices; j++)
{
 PositionF pos = new PositionF();
 oVertext = (gpc_vertex)Marshal.PtrToStructure((IntPtr)(currentVertex.ToInt64() + currentOffset), typeof(gpc_vertex));
 pos.X = oVertext.x;
 pos.Y = oVertext.y;
 Marshal.DestroyStructure(currentVertex, typeof(gpc_vertex));
 currentOffset += Marshal.SizeOf(oVertext);

 posList.Add(pos);
}
}

コードの前にアクセス違反例外の根本原因を見つけるのを手伝ってください。

4

1 に答える 1

0

あなたの問題は次の行にあると思います:

currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));

64 ビット オペレーティング システムでは、64 ビット値を 32 ビット int にキャストすると、オーバーフローが発生する可能性があります。

これが当てはまるかどうかを判断するには、それを配置checkedしてテストし、オーバーフロー例外がスローされるかどうかを確認します。

checked
{
    currentVertex = (IntPtr)((int)currentVertex.ToInt64() + Marshal.SizeOf(oVertext));
}
于 2013-06-06T08:24:08.033 に答える