我正在尝试为我的项目添加网络;更具体地说,以整数数组([x, y, ...]
)的形式向服务器发送网格信息以进行处理。我使用TCP发现SDL2 Net的唯一综合指南发送字符串,并使用此代码将字符串转换为void *
:
void* ConvertStringToVoidPtr(const std::string &str)
{
const char* charPtr = str.c_str();
return const_cast<char*>(charPtr);
}
我了解到库要求数据采用void *
的形式,我理解转换应该非常简单。但是,我无法弄清楚如何将此示例代码转换为接受整数数组的函数:
void Send(std::string str)
{
// Cast our std::string to void* so that SDL_net can understand it properly
void *messageData = ConvertStringToVoidPtr(str);
int messageSize = static_cast<int> (str.length());
int bytesSent = SDLNet_TCP_Send(tcpSocket, messageData, messageSize);
std::cout << "Trying to send " << str << "\tsent : " << bytesSent << std::endl;
if (bytesSent < messageSize)
{
std::cout << "\tSend failed: " << SDLNet_GetError() << std::endl;
}
}
例如,使用函数:
void *ConvertIntArrayToVoidPtr(const int &numb[4])
{
const int *intPtr = &numb[];
return const_cast<int*>(intPtr);
}
给我:error: declaration of 'numb' as array of references
。我是否应该尝试将数组作为char *
进行类型转换,使用现有函数,然后将类型转换回int array[4]
?
感谢您的时间。
答案 0 :(得分:0)
你可以使用整数数组名称作为空指针通过&#39;数组衰减&#39;指针
int arr[4] = {1, 2, 3, 4};
void* intPtr = arr;
这是另一个问题,如何将数组作为参数传递给函数。您还需要使用sizeof
:
int len = sizeof arr;
答案 1 :(得分:0)
诸如void *之类的通用指针可以包含任何类型的内存,因此功能如下:
void ConvertIntArrayToVoidPtr(const int&amp; numb [4])
void ConvertStringToVoidPtr(const std :: string&amp; str)
它们不是必需的,现在在函数void Send(std::string str)
中它会是这样的:
void Send(const void *Data, const size_t Size)
{
int Bytes = SDLNet_TCP_Send(TcpSocket, Data, Size);
std::cout << "Trying to send " << str << "\tsent : " << Bytes << std::endl;
if (Bytes < Size)
{
std::cout << "\tSend failed: " << SDLNet_GetError() << std::endl;
}
}
您可以这样方式发送呼叫:
int n = 15;
Send(&n, sizeof(int));
string s = "Hello Word";
Send(s.data(), s.size());
int ar[5] = { 1, 2, 3, 4, 5 };
Send(ar, sizeof(ar));
vector<int> v{ 1, 2, 3, 4, 5 };
Send(v.data(), v.size() * sizeof(int));
等等。