gpt4 book ai didi

c# - 获取结构的地址

转载 作者:太空狗 更新时间:2023-10-30 00:48:26 26 4
gpt4 key购买 nike

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using System;
using System.IO;

public class CarMove : MonoBehaviour
{
public unsafe struct TrafficRoadSystem { };
public unsafe struct CarsSimulation { };
public unsafe struct CarPostion
{
double position_x;
double position_y;
double position_z;
};

// Use this for initialization
[DllImport("Assets/traffic.dll", CharSet = CharSet.Ansi)]
public unsafe static extern int traffic_import_osm([MarshalAs(UnmanagedType.LPStr)] string osm_pbf_path, TrafficRoadSystem** out_road_system);
[DllImport("Assets/traffic.dll")]
public unsafe static extern int create_simulation(TrafficRoadSystem* road_system, CarsSimulation** out_simulation, double speed, int cars_count);
[DllImport("Assets/traffic.dll")]
public static extern void update_simulation(ref CarsSimulation simulation, double time);
[DllImport("Assets/traffic.dll")]
public static extern CarPostion get_car_postion(ref CarsSimulation simulation, int car_number);
unsafe CarsSimulation* carSimulation;
unsafe TrafficRoadSystem* trafficRoadSystem;
void Start()
{
unsafe
{
string osmPath = "Assets/Resources/map.osm.pbf";
int results;
results = traffic_import_osm(osmPath, &trafficRoadSystem);
}
}

// Update is called once per frame
void Update()
{

}
}

这是来自 dll C 库。函数 int traffic_import_osm() 适用于 TrafficRoadSystem* trafficRoadSystem; 对象作为引用,我想访问 void Update() 中的对象。这在一个函数中运行良好,但我无法获取类变量的地址并且出现错误

错误 CS0212 您只能在固定语句初始值设定项中获取未固定表达式的地址

results = traffic_import_osm(osmPath, &trafficRoadSystem);

我尝试使用这个解决方案 https://msdn.microsoft.com/en-us/library/29ak9b70(v=vs.90).aspx

我是这样写的:

TrafficRoadSystem trafficRoadSystem;
void Start()
{
unsafe
{
string osmPath = "Assets/Resources/map.osm.pbf";
CarMove carMove = new CarMove();
int results;
fixed( TrafficRoadSystem* ptr = &carMove.trafficRoadSystem)
{
results = traffic_import_osm(osmPath, &ptr);
}
}
}

我收到错误 CS0459 Cannot take the address of a read-only local variable in lineresults = traffic_import_osm(osmPath, &ptr);

最佳答案

在 Unity 中制作 C 或 C++ 插件需要对这些语言有广泛的了解。这意味着您应该先花时间学习指针,然后再尝试在 Unity 中使用原始指针。因为即使你让它编译,你也可能遇到难以修复的崩溃。

你有:

unsafe TrafficRoadSystem* trafficRoadSystem;

并想把它传递给下面的函数:

public unsafe static extern int traffic_import_osm(..., TrafficRoadSystem** out_road_system);

1trafficRoadSystem 变量是一个指针,您需要创建另一个指向 trafficRoadSystem 的指针。这称为“指向指针的指针”

TrafficRoadSystem** addressOfTrafficRoadSystem = &trafficRoadSystem;

注意双“**”。

2。您必须使用 fixed 关键字来执行我在 #1 中提到的操作。

fixed (TrafficRoadSystem** addressOfTrafficRoadSystem = &trafficRoadSystem)
{

}

3。您可以将该指针传递给 traffic_import_osm 函数的指针地址。

全新的开始功能:

void Start()
{
unsafe
{
fixed (TrafficRoadSystem** addressOfTrafficRoadSystem = &trafficRoadSystem)
{
string osmPath = "Assets/Resources/map.osm.pbf";
int results;
results = traffic_import_osm(osmPath, addressOfTrafficRoadSystem);
}
}
}

不相关的 future 可能的问题:

1。我注意到您在更新后的问题中执行了 CarMove carMove = new CarMove();。不要在这里使用 new 关键字,因为 CarMove 继承自 MonoBehaviour。参见 this回答要做什么。

2。我还注意到您使用了 "Assets/Resources/map.osm.pbf";。当您构建项目时,此路径将无效。考虑使用 StreamingAssets 文件夹而不是仅适用于 Resources 的 Resources 文件夹应用程序接口(interface)。您将 Application.streamingAssetsPathStreamingAssets 文件夹一起使用。

关于c# - 获取结构的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46707234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com