2014-10-11 1 views
-1

저는이 강의 중 하나에 대해이 프로그래밍 할당에 어려움을 겪고 있습니다. 나는 전기 공학 학생이기 때문에 프로그래밍이 결코 놀라운 것은 아닙니다. 나는 12 비트 숫자를 취하고 그 12 비트 숫자의 각각을 char 배열로 추출하는 c 프로그램을 작성해야한다. 나는 빠른 수학을했고 우리가 얻을 수있는 가장 큰 숫자는 십진수로 0xFFF 또는 4095라는 것을 깨달았다. 나는 꽤 잘 작동한다고 생각하는 알고리즘을 발견했지만, 어떤 이유로 내 코드는 내가 생각한대로하지 못하고있다. 이 문제를 해결하기 위해 계속 노력하고 있지만 Linux 터미널 창을 실행하는 유일한 방법은 프로그램을 단계별로 실행할 수있는 훌륭한 디버깅 유틸리티가 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 조금이라도 질문 할 수 있으면 최대한 열심히 노력해야합니다. 저는 유창한 프로그래머가 아니므로 염두에 두십시오. 또한 누군가가 정수 나누기를 설명 할 수 있다면 도움이 될 것입니다. 나는 8/10과 같은 어떤 것이 0의 결과를 리턴 할 것이라는 가정하에 있었지만 프로그램을 실행할 때 그 방법으로 작동하는지 모른다. 고맙습니다.C에서 문자열에 4 자리 정수 (십진수)를 수동으로 추출합니다.

나는 이것을 할 수있는 기능을 사용하지 않으며 수동으로해야합니다.

여기까지 제가 지금까지 가지고 있습니다.

을 시도 @ 솔루션 :

//12 bit value into string of decimal chars 
//EX: 129 -> a '1' a '2' and a '9' 

void main (void) { 

#include <stdlib.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <stddef.h> 
//Initialize an array with 5 spaces, each space 
//holds one character (accounts for largest number 4095) 
char OUT[5]; 
uint8_t length = sizeof(char); 

//Isolating each int value happens here 
//initialize i to act as a counter to loop through array 
uint8_t i=2; 
//Initialize an input value to test the code; 
uint16_t IN=549; 

while (IN/10 > 0) 
{ 
OUT[length-(i+1)] = '0' + (IN%10); 
IN=IN/10; 
if (IN <= 10) 
     { 
     if (IN = 10) 
      { 
      OUT[length-(i+1)] ='1'; 
      //fixes infinite loop issue    
      IN=0; 
      } 
     else 
      { 
      OUT[length-(i+1)] ='0' + IN; 
      //fixes infinite loop issue    
      IN=0; 
      } 

     } 
//Increment Counter to keep track of char array  
i++; 
} 
//add the new line at the end of the array of chars 
OUT[length-1]='\n'; 
printf("String is -> %s", OUT); 

}

노트의 커플 : 10 %에도 사용 소수점에서 멀리 오른쪽 숫자를 분리 알고리즘의 일부입니다. 배열을 올바르게 정렬하고 char 배열의 끝에 \ n을 설명하기 위해 카운터에 "fudge factors"를 추가해야했습니다. while 루프에 넣는 조건문은 (주로 IN이 10 이하가 될 때) 몇 가지 엣지 케이스를 잡는 것이 었습니다.

+0

'gdb'는 리눅스 터미널에서 훌륭하게 작동합니다. 그렇지 않으면, 당신은'printf()'로 코드를 측정 할 수있다. – mouviciel

답변

0

맨 왼쪽 문자를 먼저 인쇄해야한다는 사실을 처리하기 위해 뒤쪽으로 구부러진 것처럼 보입니다. 가장 오른쪽의 문자를 먼저 생성 한 다음 역순으로 만들면 논리가 훨씬 간단 해집니다.

uint8_t length = sizeof(char);

sizeof 함수는 괄호 사이 유형의 크기를 반환

#include <stdlib.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <stddef.h> 
#include <string.h> 

//12 bit value into string of decimal chars 
//EX: 129 -> a '1' a '2' and a '9' 
void main (void) { 

    char OUT[5]; 
    memset(OUT, 0, 5); 

    int i=0; 
    int j; 
    uint16_t IN=549; 

    // Generate the string in reverse order. 
    while (IN != 0) 
    { 
     OUT[i++] = '0' + (IN%10); 
     IN/=10; 
    } 

    // Reverse the string 
    for (j = 0; j < i/2; j++) { 
     char temp = OUT[j]; 
     OUT[j] = OUT[i-1-j]; 
     OUT[i-1-j] = temp; 
    } 

    printf("String is -> %s\n", OUT); 

} 
+0

당신은 역순으로 어레이를 뒤집어서 굽히고있는 것이 맞습니다. 나는 이런 식으로 생각조차하지 않았다. 도움을 많이 주셔서 감사합니다. – Dustin11h3

0

이 줄은 당신의 문제입니다. 이 경우 char은 1 바이트 변수이므로 1을 반환합니다. 그런 다음 배열 요소에 액세스하려고하면 length-(i+1)에서 음수를 얻습니다.

+0

나는 몇몇 가치를 검사하고 이것을 또한주의했다. 도와 주셔서 감사합니다! – Dustin11h3

0

궁금한 점이있을 경우 더 복잡한 방법을 사용하여 최종 해결책을 제시합니다. 나중에 문제가 발생합니다.

void main (void) { 

#include <stdlib.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <stddef.h> 
//Initialize an array with 5 spaces, each space holds one character (accounts for largest number 4095) 
char OUT[5]; 
OUT[0] = '0'; 
OUT[1] = '0'; 
OUT[2] = '0'; 
OUT[3] = '0'; 
OUT[4] = '0'; 
uint8_t length =5; //sizeof(char) was giving me an error and thus not used.; 

//Isolating each int value happens here 
//initialize i to act as a counter to loop through array 
uint8_t i=2; 
//Initialize an input value to test the code; 
uint16_t IN=4012; 
//Initialize variable for % operator value 
uint16_t mod=0; 
while (IN/10 > 0) 
{ 
mod=IN%10; 
OUT[length-i] = '0' + mod; 
IN=IN/10; 
if (IN <= 10) 
     { 
     if (IN == 10) 
      { 
      OUT[length-(i+2)] ='1'; 
      OUT[length-(i+1)] ='0'; 
      //fixes infinite loop issue    
      IN=0; 
      } 
     else 
      { 
      OUT[length-(i+1)] ='0' + IN; 
      //fixes infinite loop issue    
      IN=0; 
      } 
     } 
//Increment Counter to keep track of char array  
i++; 
} 
//add the new line at the end of the array of chars 
OUT[length-1]='\n'; 
printf("String is -> %s", OUT); 
} 
관련 문제