2015-11-06 7 views
0

Этот вопрос основывается на нескольких других сообщениях. Я понимаю, если это не относится к большинству людей в Интернете, но на данный момент, как и все остальные, я застрял и не могу найти ошибку в логике. Этот вопрос требует проверки определенного кода помех для однобитовой ошибки и отчета/исправления ошибки. Вот программа, чтобы сделать так:Код Хэмминга - Обнаружение ошибок и исправление

#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. Любая помощь будет принята с благодарностью.

+0

Я просто попытался другой рукописным код Хэмминга: 1000110, без битовой ошибки в то время как выше программа говорит мне, что есть немного ошибки в бит 2 с исправленным кодом 1000011. –

+0

Умм, код в вопросе '1000110' и код в вашем комментарии' 1000110' точно такие же. Итак, шаг 1, похоже, должен найти пару примеров кодов, где вы действительно знаете правильный ответ. – user3386109

+0

Это мое плохое, возможно, я не написал проблему правильно. Я только что запустил оригинальный код помех. Вход для проверки 1000110. Правильный ответ 1100110 с ошибкой в ​​бит 6. Я получаю 1000010 с ошибкой в ​​бит 3. Это то, о чем вы говорите? –

ответ

0

Я не могу полностью следить за тем, как ваш код должен работать. Итак, вот простая реализация, которая вычисляет синдром для кода 1000110. Выход из программы 6, то есть ошибка в бите 6.

#include <stdio.h> 

int main(void) 
{    // 7654321 
    char input[] = "1000110"; 
    int parity = 0; 
    for (int mask = 4; mask; mask >>= 1) 
    { 
     for (int bit = 1; bit <= 7; bit++) 
      if (bit & mask) 
       if (input[7-bit] == '1') 
        parity ^= mask; 
    } 
    printf("%d\n", parity); 
} 
+0

Спасибо за пример. Мой код должен читать в строке любой произвольной длины и вычислять код помех на нем. Если нет ошибки, он должен сообщить, что если есть ошибка, он должен сообщить о значении бита, где он есть, и исправить его. Я пытаюсь понять, как приложить рабочий пример, поскольку у меня есть его как точка отсчета. –

+0

Что-то вроде этого: Введите максимальную длину: 12 Введите четность (0 = четный, 1 = нечетный): 0 Введите выбор: 2 Введите код Хэмминга: 100011001010010 \t *** Неверная запись - Превышает Максимальный код Длина 12 Введите выбор: 2 Введите код Хэмминга: 1000110 \t *** Там ошибка в бите: 6 *** Скорректированный код Хэмминга: 1100110 –

Смежные вопросы