c++ - 逐元素移动第一个元素指向的数组的函数

标签 c++ arrays

我正在尝试遍历数组的元素,对于这些元素中的每一个,我都必须调用一个函数指向并传递元素地址以及存储在最后一个参数中的地址。并且该函数返回函数指向返回 true 的元素数。这是我一直试图遵循的要求,但我无法让我的功能完全按照要求执行。

------需求&功能------------

/* Write an enumeration function named sum() with the following parameters:

    a generic pointer
    an int that holds the number of elements in the array pointed to
    an int that holds the size in bytes of a single element
    a pointer to a function that has two generic pointer parameters and returns a bool
    a generic pointer

Your function moves through the array pointed to by the first parameter element by element.  
For each element, your function calls the function pointed to and passes the element's address    along 
with the address stored in the last parameter.  Your function returns the number of elements for 
which the function pointed to returned true. 

Since your first function parameter is a generic pointer and your function can handle any type, 
you will need to cast the address of the input array to the address of a chars in order to move 
from one element to the next.  */

int sum(void* x, int n, int s, bool(f)(void, void*), void* z){

  char *arr = static_cast<char*>(x);

  int count = 0;
  for (; s < n-2; s++){
      arr += s;
      count += f(arr, z);     
  }
  if (n / 1 == n)
      return count;
  else if (n % 2 == 0)
      return count;
  else
      return 0;

}

我希望你们能向我展示并解释,或者至少我没有以正确的方式做些什么。我真的很感激这是唯一的方法,我可以学习.. :)

如果需要更多解释,请告诉我..

******添加*******

/* Write a callback function named isEven() with the following parameters:

a generic pointer to an input value
a generic pointer to an output value

Your function works with ints and returns true if the input value is even, false otherwise.
Moreover, if the value is even, your function adds the value to that pointed to by the second
parameter. */

bool isEven(void* x, void* z){
  int a = *static_cast<int*>(x);
  int b = *static_cast<int*>(z);

  if (a % 2 == 0){ // finding even numbers
      b += a;
      return true;
  }
  else {
      return false;
  }
}

/* Write another callback function named isPrime() with the following parameters:

a generic pointer to an input value
a generic pointer to an output value

Your function works with ints and returns true if the input value is a prime number, false otherwise.
Moreover, if the value is prime, your function adds the value to that pointed to by the second
parameter. */

bool isPrime(void* x, void* z){
  int a = *static_cast<int*>(x);
  int b = *static_cast<int*>(z);

  if ((a / 1 == a) && (a / a == 1)){ // finding prime numbers
      b += a;
      return true;
  } 
  else {
      return false;
  }
}

**********预期输出***********

5 evens found in {1,2,3,4,5,6,7,8,9,10,11} sum is 30
5 primes found in {1,2,3,4,5,6,7,8,9,10,11} sum is 28

最佳答案

如果我没理解错的话,这个函数应该是

int sum( const void* x, int n, int s, bool(*f)( const void*, const void* ), const void* z )
{
   const char *p = reinterpret_cast<const char *>( x );

   int count = 0;
   for ( int i = 0; i < n; i++ )
   {
      count += f( p, z );
      p += s;
   }

   return count;
}

这是一个使用函数的例子

#include <iostream>
#include <cstdlib>
#include <ctime>

int sum( const void* x, int n, int s, bool(*f)( const void*, const void* ), const void* z )
{
   const char *p = reinterpret_cast<const char *>( x );

   int count = 0;
   for ( int i = 0; i < n; i++ )
   {
      count += f( p, z );
      p += s;
   }

   return count;
}

bool lt( const void *p1, const void *p2 )
{
    return ( *reinterpret_cast<const int *>( p1 ) <
             *reinterpret_cast<const int *>( p2 ) );
}

int main() 
{
    std::srand( ( unsigned int )std::time( 0 ) );

    const int N = 10;
    int a[N];

    for ( int &x : a ) x = std::rand() % N;

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;

    int x = 5;

    int n = sum( a, N, sizeof( int ), lt, &x );

    std::cout << "There are " << n << " elements less than " << x << std::endl;

    return 0;
}

示例输出

4 7 2 9 2 8 6 1 9 9 
There are 4 elements less than 5

关于c++ - 逐元素移动第一个元素指向的数组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22209251/

相关文章:

java - 如何将java类型转换为java string[]?

c - 不使用 [ 或 ] 查找数组中元素的总和

java - 如何正确插入排序?

c++ - QTreeView、QTableView,显示不同层级的项目

c++ - c/c++ XML库问题

c++ - getline() 无法进行第二次调用

c++ - 用于测试 Poco HTTPServer handleRequest 未编译的包装器。

mysql - SQL 检索多维数组

c++ - 在没有用户输入的情况下中断 cin while 循环

arrays - golang : convert uint32 (or any built-in type) to []byte (to be written in a file)