'char (*RtlpNumberOf(T (&)[N]))[N]':无法从"char *"

'char (*RtlpNumberOf(T (&)[N]))[N]': could not deduce template argument for 'T (&)[N]' from 'char *'

本文关键字:quot char RtlpNumberOf      更新时间:2023-10-16

我最初写了这段代码,它将 10 个const char[]组合成一个大char[]。它工作正常。

char total[1000000];
memcpy(total, myData0, ARRAYSIZE(myData0));
memcpy(&total[ARRAYSIZE(myData0)], myData1, ARRAYSIZE(myData1));
memcpy(&total[ARRAYSIZE(myData0) + ARRAYSIZE(myData1)], myData2, ARRAYSIZE(myData2));
memcpy(&total[ARRAYSIZE(myData0) + ARRAYSIZE(myData1) + ARRAYSIZE(myData2)], myData3, ARRAYSIZE(myData3));
memcpy(&total[ARRAYSIZE(myData0) + ARRAYSIZE(myData1) + ARRAYSIZE(myData2) + ARRAYSIZE(myData3)], myData4, ARRAYSIZE(myData4));
memcpy(&total[ARRAYSIZE(myData0) + ARRAYSIZE(myData1) + ARRAYSIZE(myData2) + ARRAYSIZE(myData3) + ARRAYSIZE(myData4)], myData5, ARRAYSIZE(myData5));
memcpy(&total[ARRAYSIZE(myData0) + ARRAYSIZE(myData1) + ARRAYSIZE(myData2) + ARRAYSIZE(myData3) + ARRAYSIZE(myData4) + ARRAYSIZE(myData5)], myData6, ARRAYSIZE(myData6));
memcpy(&total[ARRAYSIZE(myData0) + ARRAYSIZE(myData1) + ARRAYSIZE(myData2) + ARRAYSIZE(myData3) + ARRAYSIZE(myData4) + ARRAYSIZE(myData5) + ARRAYSIZE(myData6)], myData7, ARRAYSIZE(myData7));
memcpy(&total[ARRAYSIZE(myData0) + ARRAYSIZE(myData1) + ARRAYSIZE(myData2) + ARRAYSIZE(myData3) + ARRAYSIZE(myData4) + ARRAYSIZE(myData5) + ARRAYSIZE(myData6) + ARRAYSIZE(myData7)], myData8, ARRAYSIZE(myData8));

但我想我可以使用数组和循环来显着清理它。

char total[1000000];
char* myarray[10] = { myData0, myData1, myData2, myData3, myData4, myData5, myData6, myData7, myData8, myData9 };
for (int i = 0; i < ARRAYSIZE(myarray); i++)
{
memcpy(total, &myarray[i], ARRAYSIZE(myarray[i]));
}

我以为我做得很好,但这段代码无法编译。我在ARRAYSIZE(myarray[i])下收到一个错误,上面写着'char (*RtlpNumberOf(T (&)[N]))[N]': could not deduce template argument for 'T (&)[N]' from 'char *'.我不明白这里的问题是什么。我尝试使用sizeof,但它没有正确复制。为什么在这种情况下我无法使用 ARRAYSIZE?

在第一段代码中,您将在实际数组上调用ARRAYSIZE。 在第二个中,您将传递一个char *给它。 此宏(实际上是作为其基础的RtlpNumberOf宏(需要一个数组。 数组和指针不是一回事,这是一个完美的例证。

创建具有其他数组大小的第二个数组,并在调用memcpy时使用它:

char total[1000000];
char* myarray[10] = { myData0, myData1, myData2, myData3, myData4, 
myData5, myData6, myData7, myData8, myData9 };
size_t myarray_sizes[10] = { ARRAYSIZE(myData0), ARRAYSIZE(myData1), ARRAYSIZE(myData2), 
ARRAYSIZE(myData3), ARRAYSIZE(myData4), ARRAYSIZE(myData5), 
ARRAYSIZE(myData6), ARRAYSIZE(myData7), ARRAYSIZE(myData8), 
ARRAYSIZE(myData9) };

for (int i = 0; i < ARRAYSIZE(myarray); i++)
{
memcpy(total, &myarray[i], myarray_sizes[i]);
}

或者这个怎么样:

#include <iostream>
int main () {
char total[1000000];
char * myData0 = "this ";
char * myData1 = "is ";
char * myData2 = "a ";
char * myData3 = "test1 ";
char * myData4 = "test2 ";
char * myData5 = "test3 ";
char * myData6 = "test4 ";
char * myData7 = "test5 ";
char * myData8 = "test6 ";
char * myData9 = "test7 ";
char* myarray[10] = { myData0, myData1, myData2, myData3, myData4, myData5, myData6, myData7, myData8, myData9 };
for (int i = 0; i < 10; i++)
{
strcat(total, myarray[i]);
}
std::cout << total << std::endl;
}