Для класса я пишу простую функцию шифрования. Все работает как положено:
int crypt(char *key, int (*callback)(int, char*, int, int))
{
int c, i = 0, n = strlen(key);
while((c = fgetc(stdin)) != EOF)
{
// only change the char if it's printable
if(c >= 32 && c <= 126)
c = callback(c, key, n, i);
fputc(c, stdout);
i++;
}
}
int encryptCallback(int c, char *key, int n, int i)
{
return (c - 32 + key[i % n]) % 95 + 32;
}
int decryptCallback(int c, char *key, int n, int i)
{
return (c - 32 - key[i % n] + 3 * 95) % 95 + 32;
}
Используя тестовый набор профессора, все работает. Но когда я изначально написал обратные вызовы, я пропустил возврат. Они были закодированы как:
int encryptCallback(int c, char *key, int n, int i)
{
c = (c - 32 + key[i % n]) % 95 + 32; // no return
}
int decryptCallback(int c, char *key, int n, int i)
{
c = (c - 32 - key[i % n] + 3 * 95) % 95 + 32; // no return
}
Когда я запускал код с невозвратными обратными вызовами, вывод был все еще верным, когда я применил тестовый пример (и да, я перекомпилировал, я не работал старый код). Я заметил «ошибку» только когда скомпилировал с -Wall.
Так что я в замешательстве. Почему c
(в crypt()
) получает правильное значение после того, как ему присвоено возвращаемое значение callback
(когда обратный вызов ничего не возвращает)? c
это не указатель, это просто обычный int.
P.S. Назначение не имеет ничего общего с указателями функций.