c - 在 C 中添加 2 个 void 指针数组
问题描述
有以下挑战:用C 语言编写多态函数:
void *add(void *arr1, void *arr2);
该函数采用 2 个任意类型的数组并将它们的内容添加到第三个数组 arr3 中:
arr3[0]=arr1[0]+arr2[0];
arr3[1]=arr3[1]+arr2[1];
.....
arr3[n]=arr1[n]+arr2[n];
该函数必须返回 arr3 作为结果。
不允许取消引用 void 指针,我认为将 2 个数组(arr1 和 arr2)转换为 char* 不是一个好习惯,因为内容可能是 int、float、double 等。怎么可能实现这样的功能?
解决方案
这个函数声明
void *add(void *arr1, void *arr2);
不提供有关例如数组元素的实际类型和数组包含的元素数量的必需信息。
您还需要在某个地方提供一个代码,该代码将执行添加数组的两个元素的操作。
您应该更改函数声明,指定类似于标准 C 函数的参数的附加参数,qsort
或者将所需信息存储在函数可以访问的全局变量中的某个位置,
这是一个演示程序。.
#include <stdio.h>
#include <stdlib.h>
size_t nmemb;
size_t size;
void ( *operation )( void *, const void *, const void * );
void * add( const void *arr1, const void *arr2 )
{
void *result = malloc( nmemb * size );
if ( result )
{
for ( size_t i = 0; i < nmemb; i++ )
{
operation( ( char * )result + i * size,
( const char * )arr1 + i * size,
( const char * )arr2 + i * size );
}
}
return result;
}
void add_int( void * result, const void *operand1, const void *operand2 )
{
*( int * )result = *( const int * )operand1 + *( const int * )operand2;
}
void add_double( void * result, const void *operand1, const void *operand2 )
{
*( double * )result = *( const double * )operand1 + *( const double * )operand2;
}
int main(void)
{
int arr1[] = { 0, 1, 2, 3, 4 };
int arr2[] = { 5, 6, 7, 8, 9 };
nmemb = sizeof( arr1 ) / sizeof( *arr1 );
size = sizeof( int );
operation = add_int;
int *result1 = add( arr1, arr2 );
if ( result1 )
{
for ( size_t i = 0; i < nmemb; i++ )
{
printf( "%d ", result1[i] );
}
putchar( '\n' );
}
free( result1 );
double arr3[] = { 0.0, 1.1, 2.2, 3.3, 4.4 };
double arr4[] = { 5.5, 6.6, 7.7, 8.8, 9.9 };
nmemb = sizeof( arr3 ) / sizeof( *arr3 );
size = sizeof( double );
operation = add_double;
double *result2 = add( arr3, arr4 );
if ( result2 )
{
for ( size_t i = 0; i < nmemb; i++ )
{
printf( "%.1f ", result2[i] );
}
putchar( '\n' );
}
free( result2 );
return 0;
}
程序输出为
5 7 9 11 13
5.5 7.7 9.9 12.1 14.3
推荐阅读
- php - 返回一个微软图形事件php
- apache-spark-sql - hbase-default.xml 文件似乎是针对旧版本的 HBase (null),这个版本是
- powershell - 在 Jenkins 管道脚本中转义双引号和单引号
- snowflake-cloud-data-platform - 实验室中的雪花重新创建表不起作用
- powershell - 错误 - 使用“1”参数调用“Fill”的异常
- windows-services - 以本地系统权限运行的 Windows 服务,想要从以本地用户权限运行的 Windows 服务创建子进程
- git - Git推送功能在bitbucket中不起作用
- java - 使用 Selenium 突出显示网页中的文本
- git - 将 Jenkins Git 轮询限制在一个分支
- python - 将 XML 转换为用于 BigQuery 的 JSON 可加载结构