Этот вопрос основывается на нескольких других сообщениях. Я понимаю, если это не относится к большинству людей в Интернете, но на данный момент, как и все остальные, я застрял и не могу найти ошибку в логике. Этот вопрос требует проверки определенного кода помех для однобитовой ошибки и отчета/исправления ошибки. Вот программа, чтобы сделать так:Код Хэмминга - Обнаружение ошибок и исправление
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
/** Initializing the global variables */
int MaxLength;
int length;
int parity;
// Initialize the hamming string with a random or NULL memory address
char *HammingString=NULL;
/** Function to enter the values */
void EnterParameters(int *length, int *parity)
{
printf("Enter the maximum length: ");
/** %d reads an integer to be stored in an int. This integer can be signed */
scanf("%d", length);
printf("Enter the parity (0=even, 1=odd): ");
/** %d reads an integer to be stored in an int. This integer can be signed */
scanf("%d", parity);
}
void CheckHamming(char *HammingString, int parity)
{
// Initializing the local variables i, j, k, start, length, ParityNumber
int i, j, k, start, length, ParityNumber;
printf("Enter the Hamming code: ");
scanf("%s", HammingString);
int ErrorBit = 0; // Initialize the error bit
length = strlen(HammingString); // The strlen computes the length of a string up to, but not including the terminating null character
length--;
if (length > MaxLength)
{
printf("\n** Invalid Entry - Exceeds Maximum Code Length of %d\n\n", MaxLength);
return;
}
ParityNumber = ceil(log(length)/log(2)); // The ceil function returns the smallest integer that is greater than or equal to 'x'.
for(i = 0; i < ParityNumber; i++)
{
// pow returns x raised to the power y. In this case, 2 raised to the power i.
start = pow(2, i);
int ParityCheck = parity;
for(j = start; j < length; j=j+(2*start))
{
for(k = j; (k < ((2*j) - 1)) && (k < length); k++)
{
ParityCheck ^= (HammingString[length - k] - '0');
} // End the k for-loop
} // End the j for-loop
ErrorBit = ErrorBit + (ParityCheck * start);
} // End the i for-loop
if(ErrorBit == 0)
{
printf("No error \n");
}
else
{
printf("There is an error in bit: %d\n", ErrorBit);
if(HammingString[length - ErrorBit] == '0')
{
HammingString[length - ErrorBit] = '1';
}
else
{
HammingString[length - ErrorBit] = '0';
}
printf("The corrected Hamming code is: %s \n", HammingString);
}
} // End CheckHamming
int main()
{
int parity;
int choice = 0;
printf("Error detection/correction: \n");
printf("----------------------------\n");
printf("1) Enter parameters \n");
printf("2) Check Hamming code \n");
printf("3) Exit \n");
printf("\nEnter selection: ");
scanf("%d", &choice);
while (choice != 3)
{
if (choice == 1)
{
EnterParameters(&MaxLength, &parity);
HammingString = (char*) malloc (MaxLength * sizeof(char));
main();
}
else if (choice == 2)
{
CheckHamming(HammingString, parity);
main();
}
else
{
printf("Valid options are 1, 2, or 3. Quitting program. \n");
exit(0);
}
}//end while
exit(0);
}//end main
Если код Хэмминга: 1000110 вводятся ошибка вручную рассчитываются выходит за ошибки в 6, но с исправленным кодом является 1100110. Этого кода выводит сообщение об ошибке в бит 3 с исправленным кодом, равным 1000010. Любая помощь будет принята с благодарностью.
Я просто попытался другой рукописным код Хэмминга: 1000110, без битовой ошибки в то время как выше программа говорит мне, что есть немного ошибки в бит 2 с исправленным кодом 1000011. –
Умм, код в вопросе '1000110' и код в вашем комментарии' 1000110' точно такие же. Итак, шаг 1, похоже, должен найти пару примеров кодов, где вы действительно знаете правильный ответ. – user3386109
Это мое плохое, возможно, я не написал проблему правильно. Я только что запустил оригинальный код помех. Вход для проверки 1000110. Правильный ответ 1100110 с ошибкой в бит 6. Я получаю 1000010 с ошибкой в бит 3. Это то, о чем вы говорите? –