array^ 转化成char*问题

aaa2742 2017-04-25 09:19:17
想把array<char>^数据拷贝到char t[]里面,
void ManClass::SendData(array<char>^ sendBuff,unsigned char len)
{
//***手动循环复制,比较笨的方法
char* t = (char*)malloc(sizeof(char)*len);
for (int i= 0;i<len;i++)
{
t[i] = sendBuff[0];
}

p_Unman->SendData(t,len);


}
除了循环复制为有其他省事的办法吗?
使用Marshal.Copy好像也不行,
请问有别的方式吗?
...全文
1315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stherix 2017-04-25
  • 打赏
  • 举报
回复
#pragma unmanaged

#include<stdio.h>
#include<stdlib.h>

void print(unsigned char* t)
{
    printf((char *)t);
}

#pragma managed

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    array<unsigned char>^ sendBuff = gcnew array<unsigned char>(5);
    sendBuff[0]=65;   
    sendBuff[1]=66;
    sendBuff[2]=67;
    sendBuff[3]=68;
    sendBuff[4]=0;
    unsigned char* t = (unsigned char*)malloc(sizeof(unsigned char)*5);
    IntPtr ptr(t);
    Marshal::Copy(sendBuff,0,ptr,5);
    print(t);
    Console::ReadKey();
}
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
CopyMemory 给你一个样例,复制到 std::vector 的。
__inline static std::vector< BYTE > Assign(array< System::Byte > ^ar)
{
	if (ar != nullptr && ar->Length > 0)
	{
		std::vector<BYTE> vt(ar->Length);
		pin_ptr<BYTE> ptr = &ar[0];
		CopyMemory(&vt[0], ptr, vt.size() * sizeof (vt[0]));
		return std::move(vt);
	}
	else
	{
		return std::vector< BYTE >();
	}
}
复制到char*里面怎么搞?
Saleayas 2017-04-25
  • 打赏
  • 举报
回复
CopyMemory 给你一个样例,复制到 std::vector 的。
__inline static std::vector< BYTE > Assign(array< System::Byte > ^ar)
{
	if (ar != nullptr && ar->Length > 0)
	{
		std::vector<BYTE> vt(ar->Length);
		pin_ptr<BYTE> ptr = &ar[0];
		CopyMemory(&vt[0], ptr, vt.size() * sizeof (vt[0]));
		return std::move(vt);
	}
	else
	{
		return std::vector< BYTE >();
	}
}
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
循环也不费事 而且Marshal.Copy应该是可以的啊 无论是托管数组还是非托管数组,在内存中都是连续的
我试着不行,您可以试试,也许我用的不对
stherix 2017-04-25
  • 打赏
  • 举报
回复
循环也不费事 而且Marshal.Copy应该是可以的啊 无论是托管数组还是非托管数组,在内存中都是连续的
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
多谢各位,看来我某些地方用起来不太变通呀,向你们学习。
stherix 2017-04-25
  • 打赏
  • 举报
回复
引用 8 楼 aaa2742 的回复:
你试试这样行吗 array<char>^ test = gcnew array<char>(5); test[0] = 1; test[1] = 2; test[2] = 3; test[3] = 4; test[4] = 5; char* p = (char*)malloc(sizeof(char)*5); IntPtr Pptr(p); Marshal::Copy(test,0,Pptr,5);
Marshal.Copy不支持signed char 估计是因为源码里c#只有byte,而byte是无符号,没有对sbyte重载这个方法了
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
你试试这样行吗 array<char>^ test = gcnew array<char>(5); test[0] = 1; test[1] = 2; test[2] = 3; test[3] = 4; test[4] = 5; char* p = (char*)malloc(sizeof(char)*5); IntPtr Pptr(p); Marshal::Copy(test,0,Pptr,5);
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 6 楼 aaa2742 的回复:
[quote=引用 5 楼 stherix 的回复:]
#pragma unmanaged

#include<stdio.h>
#include<stdlib.h>

void print(unsigned char* t)
{
    printf((char *)t);
}

#pragma managed

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    array<unsigned char>^ sendBuff = gcnew array<unsigned char>(5);
    sendBuff[0]=65;   
    sendBuff[1]=66;
    sendBuff[2]=67;
    sendBuff[3]=68;
    sendBuff[4]=0;
    unsigned char* t = (unsigned char*)malloc(sizeof(unsigned char)*5);
    IntPtr ptr(t);
    Marshal::Copy(sendBuff,0,ptr,5);
    print(t);
    Console::ReadKey();
}
我这个提示报错 错误 1 error C2665: “System::Runtime::InteropServices::Marshal::Copy”: 16 个重载中没有一个可以转换所有参数类型 F:\temp\MyUsb\MyUsb\MyUsb.cpp 145 1 MyUsb [/quote] 我知道了,我用的libusb,发送的数据一直是char型,换成unsigned char型就能复制了
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
#pragma unmanaged

#include<stdio.h>
#include<stdlib.h>

void print(unsigned char* t)
{
    printf((char *)t);
}

#pragma managed

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    array<unsigned char>^ sendBuff = gcnew array<unsigned char>(5);
    sendBuff[0]=65;   
    sendBuff[1]=66;
    sendBuff[2]=67;
    sendBuff[3]=68;
    sendBuff[4]=0;
    unsigned char* t = (unsigned char*)malloc(sizeof(unsigned char)*5);
    IntPtr ptr(t);
    Marshal::Copy(sendBuff,0,ptr,5);
    print(t);
    Console::ReadKey();
}
我这个提示报错 错误 1 error C2665: “System::Runtime::InteropServices::Marshal::Copy”: 16 个重载中没有一个可以转换所有参数类型 F:\temp\MyUsb\MyUsb\MyUsb.cpp 145 1 MyUsb
内容概要:本文提出了一种基于概率调控的风光联合出力极端场景生成方法,旨在有效应对风能与太阳能发电固有的强不确定性问题。该方法融合概率统计理论与优化控制策略,通过对历史风光出力数据进行建模,采用概率分布调控技术生成具有高代表性的极端场景集,从而为电力系统在极端天气条件下的运行分析提供可靠的数据支撑。文中详细阐述了模型的构建原理、核心算法设计及完整的场景生成流程,并利用实际案例验证了所提方法在提升场景多样性和极端性方面的有效性与实用性,显著增强了电力系统在高比例可再生能源接入背景下的风险评估与决策能力。; 适合人群:具备一定电力系统基础知识和Python编程能力,从事新能源发电、电力系统规划与运行、不确定性建模、场景生成及风险评估等相关领域的研究人员和工程技术人员。; 使用场景及目标:①用于电力系统中风光出力不确定性建模与极端场景的高效模拟;②支撑含高比例可再生能源电网的可靠性评估、安全校核、调度优化与风险防控研究;③为电力系统规划、应急管理和极端事件应对提供科学依据和技术工具。; 阅读建议:建议读者结合文中提供的Python代码进行动手实践,深入理解概率调控机制与场景生成算法的实现细节,掌握参数调整对场景特性的影响规律,并可进一步将该方法拓展应用于其他不确定性电源或多能源耦合系统的场景分析中。

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧