Всем привет, возникла тут непонятная ситуация, и, может быть, кто-нибудь поможет разобраться, буду очень признателен. Проблема связана с указателем на 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++;
}
}