Всем привет, возникла тут непонятная ситуация, и, может быть, кто-нибудь поможет разобраться, буду очень признателен. Проблема связана с указателем на void, преобразованием и указателем на функцию, основные моменты:
void add_num(void *, void *);
void add_str(char *a, char *b);
void (*p)(void*,void*);
if (number) {
    p = &add_num;
} else {
    p = &add_str;
}
Ну и, соответственно, проблема в том, что в 'p = &add_num;' все нормально, потому что указатели на void, сама функция:
void add_num(void *a, void *b) {
    int one, two, result;
    char *c = a;
    char *d = b;
    
    
    printf("Test2, %s:%s\n", c, d);
    one = atoi(c);
    two = atoi(d);
    result = one+two;
    printf("Result = %d\n", result);
    
    itoa(result, r);
}
А вот в случае с 'p = &add_str;' Я получаю вот это:
'main.c:38:11: warning: assignment from incompatible pointer type [enabled by default]'
Ну и собственно мой вопрос - программа-то работает, но как избавиться от этого сообщения и что вообще не так? Можно, конечно, сделать так же как и с 'p = &add_num;', но должен же быть и другой путь? Ну и весь код программы:
#include <stdio.h>
#include <stdlib.h>
void add_num(void *, void *);
void add_str(char *a, char *b);
void itoa(int i, char f[]);
void reverse(char rline[]);
char r[200];
int main(int argc, char **argv) {
    char c, number;
    void (*p)(void*,void*);
    number = 0;
    printf("Testing\n");
    printf("%s and %d\n", argv[1], argc);
    
    while ( --argc > 0 && ( **++argv == '-') ) {
        while ( (c = *++argv[0]) ) {
            printf("Test c=%c\n", c);
            switch(c) {
            case 'n':
                number=1;
                break;
            default:
                printf("Please enter valid key\n");
            }
            
        }
    }
    
    /* argv[2] argv[3] */
    printf("Number = %d\n", number);
    
    if (number) {
        p = &add_num;
    } else {
        p = &add_str;
    }
    
    
    
    (*p)((void *)argv[0], (void*)argv[1]);
    printf("test1: %s:%s\n", argv[0], argv[1]);
    /* add_num(argv[0], argv[1]); */
    
    printf("Finally result = %s\n", r);
    
    
    return 0;
}
void add_num(void *a, void *b) {
    int one, two, result;
    char *c = a;
    char *d = b;
    
    
    printf("Test2, %s:%s\n", c, d);
    one = atoi(c);
    two = atoi(d);
    result = one+two;
    printf("Result = %d\n", result);
    
    itoa(result, r);
}
void itoa(int n, char s[]) {
    int i = 0;
    int sign;
    //for (i = 0; i < 5;s[i++] = 5 + '0')
    //sign = ( n < 0) ? -1: 1;
    if ( ( sign = n )  < 0)
        n = -n;
    //printf("%d\n", sign);
    
    if ( sign < 0 )
        i++;
    //printf("%d\n", i);
    do {
        //s[i++] = n % 10 - '0';
        //n /= 10;
        s[i++] = n%10 +'0';
        //n /= 10;
        //printf("%d\n", s[i - 1]);
        
    //} while ( n > 0);
    } while ( ( n/=10 ) > 0 );
    
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    
    
    
    //printf("%d\n", sign);
};
void reverse(char rline[])
{
  int i,j;
  char temp;
  for(i=0;rline[i]!='\0';++i)
    ;
  --i;
  if(rline[i]=='\n')
  --i;
  j = 0;
  while(j < i)
  {
    temp = rline[j];
    rline[j] = rline[i];
    rline[i] = temp;
    --i;
    ++j;
  }
}
void add_str(char *a, char *b) {
    int i;
    i = 0;
    
    while ( *a != '\0' ) {
        r[i++] = *a;
        a++;
    }
    
    /* if ( *a == '\0')
        i++; */
    while (*b != '\0') {
        printf("Test5: %s\n", b);
        r[i++] = *b;
        b++;
    }
    
}


