将 char 数组传递给方法时,数组会丢失其值
When char array is passed to a method, the array looses its value
我有接受“constant char*”作为参数的方法。但是当我将下面的数组传递给方法“*SendUartMessage(int uartFd, const char dataToSend)**”时,只有前两个十六进制值显示在参数的方法中。准确地说,因为第三个值是零 0x00,它会阻止在方法内部传递的其他值。任何人都可以提供解决方案以在方法内传递所有数组值。
const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData);
这是方法
static void SendUartMessage(int uartFd, const char* dataToSend)
{
size_t totalBytesSent = 0;
size_t totalBytesToSend = strlen(dataToSend);
int sendIterations = 0;
close(r1PinFd);
r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_High);
while (totalBytesSent < totalBytesToSend) {
sendIterations++;
// Send as much of the remaining data as possible
size_t bytesLeftToSend = totalBytesToSend - totalBytesSent;
const char* remainingMessageToSend = dataToSend + totalBytesSent;
ssize_t bytesSent = write(uartFd, remainingMessageToSend, bytesLeftToSend);
if (bytesSent == -1) {
Log_Debug("ERROR: Could not write to UART: %s (%d).\n", strerror(errno), errno);
exitCode = ExitCode_SendMessage_Write;
return;
}
totalBytesSent += (size_t)bytesSent;
}
int c, d;
sleep(5);
close(r1PinFd);
r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_Low);
Log_Debug("Sent %zu bytes over UART in %d calls.\n", totalBytesSent, sendIterations);
}
您在非字符串的字符数组上使用 strlen
。
C 中的字符串以 null 结尾,这意味着值为 0 的字节结束字符串。您没有字符串,而是有效值包括 0 的字节数组。
您需要将数组的大小作为单独的参数传递给函数。
该数组在索引 2 处有一个 0 字节。strlen
计算 C 字符串的长度,即一个空终止(0 字节终止)数组。将您的数组视为字符串,长度为 2。如果您想知道数组的实际长度,则必须将其作为参数传递:
const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData, sizeof(updateAllChannelData));
static void SendUartMessage(int uartFd, const char* dataToSend, size_t totalBytesToSend)
{
...
}
Can any one provide solution to pass all the array value inside the method.
在C中,当一个数组被传递给一个函数时,数组首先被转换为第一个元素的类型和地址。
const char updateAllChannelData[] = {
0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData);
SendUartMessage()
接收到指向 updateAllChannelData[0]
的指针, 而不是 数组。
为了SendUartMessage()
知道要使用多少数组,还要传递数组元素计数并重新写入SendUartMessage()
以接受计数。
static void SendUartMessage(int uartFd, size_t count, const char* dataToSend);
const char updateAllChannelData[] = {
0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
size_t count = sizeof updateAllChannelData / sizeof updateAllChannelData[0];
SendUartMessage(uartFd, count, updateAllChannelData);
我有接受“constant char*”作为参数的方法。但是当我将下面的数组传递给方法“*SendUartMessage(int uartFd, const char dataToSend)**”时,只有前两个十六进制值显示在参数的方法中。准确地说,因为第三个值是零 0x00,它会阻止在方法内部传递的其他值。任何人都可以提供解决方案以在方法内传递所有数组值。
const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData);
这是方法
static void SendUartMessage(int uartFd, const char* dataToSend)
{
size_t totalBytesSent = 0;
size_t totalBytesToSend = strlen(dataToSend);
int sendIterations = 0;
close(r1PinFd);
r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_High);
while (totalBytesSent < totalBytesToSend) {
sendIterations++;
// Send as much of the remaining data as possible
size_t bytesLeftToSend = totalBytesToSend - totalBytesSent;
const char* remainingMessageToSend = dataToSend + totalBytesSent;
ssize_t bytesSent = write(uartFd, remainingMessageToSend, bytesLeftToSend);
if (bytesSent == -1) {
Log_Debug("ERROR: Could not write to UART: %s (%d).\n", strerror(errno), errno);
exitCode = ExitCode_SendMessage_Write;
return;
}
totalBytesSent += (size_t)bytesSent;
}
int c, d;
sleep(5);
close(r1PinFd);
r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_Low);
Log_Debug("Sent %zu bytes over UART in %d calls.\n", totalBytesSent, sendIterations);
}
您在非字符串的字符数组上使用 strlen
。
C 中的字符串以 null 结尾,这意味着值为 0 的字节结束字符串。您没有字符串,而是有效值包括 0 的字节数组。
您需要将数组的大小作为单独的参数传递给函数。
该数组在索引 2 处有一个 0 字节。strlen
计算 C 字符串的长度,即一个空终止(0 字节终止)数组。将您的数组视为字符串,长度为 2。如果您想知道数组的实际长度,则必须将其作为参数传递:
const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData, sizeof(updateAllChannelData));
static void SendUartMessage(int uartFd, const char* dataToSend, size_t totalBytesToSend)
{
...
}
Can any one provide solution to pass all the array value inside the method.
在C中,当一个数组被传递给一个函数时,数组首先被转换为第一个元素的类型和地址。
const char updateAllChannelData[] = {
0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData);
SendUartMessage()
接收到指向 updateAllChannelData[0]
的指针, 而不是 数组。
为了SendUartMessage()
知道要使用多少数组,还要传递数组元素计数并重新写入SendUartMessage()
以接受计数。
static void SendUartMessage(int uartFd, size_t count, const char* dataToSend);
const char updateAllChannelData[] = {
0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
size_t count = sizeof updateAllChannelData / sizeof updateAllChannelData[0];
SendUartMessage(uartFd, count, updateAllChannelData);