3.1 泛型函数swap()
#define C99_OR_UP
void swap(void *vp1, void *vp2, uint8_t size)
{
#ifdef C99_OR_UP
uint8_t buffer[size];
memcpy(buffer, vp1, size);
memcpy(vp1, vp2, size);
memcpy(vp2, buffer, size);
#else
void *buffer;
buffer = malloc(size * sizeof(char));
memcpy(buffer, vp1, size);
memcpy(vp1, vp2, size);
memcpy(vp2, buffer, size);
free(buffer);
#endif
}
3.2 测试
3.2.1 对整型测试
int main(int argc, char *argv[])
{
int i1 = 5;
int i2 = 6;
printf(">>> Test: int data type...\r\n");
printf("i1 = %d, i2 = %d, \r\n", i1, i2);
swap(&i, &j, sizeof(int));
printf("After swap: i1 = %d, i2 = %d, \r\n", i1, i2);
return 0;
}
3.2.2 对字串(指针定义)测试
int main(int argc, char *argv[])
{
char *pStr1 = "abcdefg";
char *pStr2 = "1233456";
printf(">>> Test: string defined by char pointer...\r\n");
printf("pStr1 = %s, pStr2 = %s, \r\n", pStr1, pStr2);
swap(&pStr1, &pStr2, sizeof(pStr1));
printf("After swap: pStr1 = %s, pStr2 = %s, \r\n", pStr1, pStr2);
return 0;
}
3.2.3 对字串(数组定义)测试
int main(int argc, char *argv[])
{
char str1[] = "xxxxxxx";
char str2[] = "8888888";
printf(">>> Test: string defined by char array...\r\n");
printf("str1 = %s, str2 = %s, \r\n", str1, str2);
swap(str1, str2, sizeof(str1));
printf("After swap: str1 = %s, str2 = %s, \r\n", str1, str2);
return 0;
}
3.2.4 对指针数组数据测试
void print_nodes(void *nodes, uint8_t len, uint8_t elemSize)
{
uint8_t i;
void *strAddr;
for(i = 0; i < len; i++) {
strAddr= (char *)nodes + i * elemSize;
printf("|%s", *(char **)strAddr);
}
printf("|\r\n");
}
int main(int argc, char *argv[])
{
char *nodes1[] = {"Ab", "F#", "B", "Gb", "D"};
char *nodes2[] = {"Eb", "Eb", "Eb", "Eb", "Eb"};
printf(">>> Test: pointer array...\r\n");
printf("nodes1: ");
print_nodes(nodes1, sizeof(nodes1)/sizeof(char *), sizeof(char *));
printf("nodes2: ");
print_nodes(nodes2, sizeof(nodes2)/sizeof(char *), sizeof(char *));
swap(nodes1, nodes2, sizeof(nodes2));
printf("nodes1: ");
print_nodes(nodes1, sizeof(nodes1)/sizeof(char *), sizeof(char *));
printf("nodes2: ");
print_nodes(nodes2, sizeof(nodes2)/sizeof(char *), sizeof(char *));
return 0;
}