0

I am trying to loop through the elements of the array and for each of these elements I have to call a function pointed and passed the element address along with the address stored in the last parameter. And the function returns the number of elements for which the function pointed to returned true. This is the requirements which I have been trying to follow but I can't get my function to do exactly what is asked for to do..

------requirements & function------------

/* 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;

}

I hope you guys can show me and explain or at least what I am not doing in the proper way.. I will really appreciate it is the only way, I can learn.. :)

If need more explanation please let me know..

******ADDITION*******

/* 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;
  }
}

**********EXPECTED OUTPUT***********

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
Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335
valbu17
  • 4,034
  • 3
  • 30
  • 41

2 Answers2

2

If I have understood correctly the function will look as

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;
}

Here is an example of using the function

#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;
}

A sample output

4 7 2 9 2 8 6 1 9 9 
There are 4 elements less than 5
Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335
  • Thanks for taking the time and reply to my question... I just added the two other functions that are called through the function pointer and also added the description what they supposed to do.. I have use your answer to guide myself and modified a bit my program but I'm not getting the sum of the elements.. which I think it happens in the two bool functions.. I hope you can see what I am missing.. – valbu17 Mar 06 '14 at 01:01
-1
char* arr = (char*) x;

for(; s < (n-1); s++) 
{
    f((void*) &arr[s], z);
    // or
    f((void*) (arr + s * sizeof(char)), z);
}
Sebastian Hoffmann
  • 11,127
  • 7
  • 49
  • 77