2014-01-16 9 views
0

C (코딩 경험이없는 프로그래머)에서 코딩하는 동안 문제가 발생했습니다. I는 주요 기능이인수가 호환되지 않는 형식의 오류를 제공하는 함수 호출

struct afreq 
{ 
    int freq; 
    unsigned char sym;  
    short int left,right,next;  
}; 

같은 구조 가지고

struct afreq data[50] ; 

INT 크기 = 조작 (데이터는 카운트);

dictionary(data,var,size); 

부분을 만드는 문제는 여기에 있습니다 : :

///////////////////////////// Definition of Dictionary function ///////////////////////////////////////// 


    dictionary(struct afreq data[] ,char *var,size_t dataSize)// function definition create problem in first argument when caled from the another recursive function call inside this function. 
dictionary(struct afreq data[] ,char *var,size_t dataSize) 
    { 
    int i; 
    printf("\n data: %d\n", dataSize); 
    for(i=2;i<dataSize;++i) 
    { 
    if(data[i].left=='\0') 
    { int correspondance[data[30]; 
     char temp[30]; 
     strcpy(temp, var); 
     strcat(temp, "0"); 
     printf("check1"); 
    dictionary(data[correspondance[data[i].left]], temp,dataSize); //error here 
    } 
    printf("\n"); 
     } 
    } 

은 내가 원하는 무엇 //이 함수는 내가 아래 함수 호출이 크기를 사용하는 일부 조작 및 INT의 type.And의 반환 크기를 할 이것을 사용하려면? 나는 유일한 인수로 주어진 파일에서 알파벳을 읽어야합니다. 파일은 "Input.txt"이고 내부에 'abcdef'(내 프로그램에서 주파수를 계산합니다)를 포함하고 [symbol Frequency LeftChild RightChild] 형식으로 배열에 저장합니다 (예 : [a 1 0 0] [ b 2 0 0] [c 3 ab] 등 (허프 먼 코드와 비슷 함)). 여기까지 모든 것을 제대로했습니다. 그러나 나는 (우리가 huffman (path in o and 1)에서와 같이) 사전을 인쇄하려고 할 때 ("c"는 부모이고 "a"는 "o"와 "b" "1"). 이 부분을 구현하려면 위의 코드를 작성 했으므로 함수 호출의 첫 번째 인수에 오류가 발생합니다. 여기 (그러나 "ABCDEF"를 포함 유일한 인수에서 "를 Input.txt"파일을 포함하는 것을 잊지 마십시오.

Here is the output: 



[email protected]:~/Desktop/Internship_Xav/Task2$ gcc ttask.c -o ttask 
improve.c: In function ‘dictionary’: 
improve.c:85:2: error: incompatible type for argument 1 of ‘dictionary’ 
improve.c:74:1: note: expected ‘struct afreq *’ but argument is of type ‘struct afreq’ 
+0

'데이터를 [ i] .left' 타입이'short int'입니다. – BLUEPIXY

+0

많은 문제가 있습니다 .. – Dipto

+0

@BLUEPIXY 내 문제에 대한 해결책이 있습니까 (포인터를 사용하지 않을 의무가 있습니다. 외.) 제발 나를 도울 수 있니? 감사. (아래 anser하려고하는 사람이 정확히 무엇을 할 개미 이해했다. 그러나 포인터를 (포인터가 아닌) 모든 조각 또는 지침 제발 그것을 만드는 방법?) – user3085082

답변

1

을 오류가 본질적으로, 컴파일러의 말씀이 있습니다. 당신을 전체 코드입니다 첫 번째 인수 인 data[i].left은 short int 유형이며, 반면에 struct afreq에 대한 포인터가 필요합니다. 어쨌든 컴파일하는 유일한 이유는 gcc가 기본적으로 int와 pointer 사이의 변환을 허용하기 때문입니다 (그러나 많은 이유는 없습니다 왜 그렇게하고 싶습니까?)

내가 무엇을하려고하는지 정확히 이해했다면, 당신이 재귀 적으로 "사전"기능을 호출하기를 원할 것입니다 ms는 나무가됩니다. 문제는 그 구조가 실제로 잘 정의되어 있지 않다는 것입니다. 당신은 "data[i].left"으로 이해할 수있는 그 값으로 트리의 노드를 "인덱스"하려고 시도하지만, 말하면, 'a'과 "struct afreq"사이에 "링크를 만드는"방법이 없습니다. 'a'은 다음과 같습니다. 상징. 당신이 중 하나는 어딘가 correspondance에 테이블을 만들고 여기에 전화를 걸 필요하거나 해당 구조에 대한 포인터로 구조 leftright을 변환해야합니다.

행운을 빕니다!

+0

예, 당신이 나를 이해했습니다. 하지만 포인터를 사용하지 않아야합니다. 아직도 달성 방법을 설명해 주시겠습니까? 어떤 코드가 도움이 되었습니까? – user3085082

+0

"테이블 만들기"로 이해할 수 없습니까? 이걸 코드로 만들어 주시겠습니까? (가능하다면, 고마워한다) – user3085082

+1

이것을 수행하는 한 가지 방법은 대응 테이블을 정의하는 것이다. 예를 들어 'int correspondance [26]'이다. 당신이 만나는 모든 심볼'sym'에 대해, 대응하는 afreq 요소의 인덱스를 대응 시켜서 (sym - a '), 당신은'dictionary (data [correspondance [data [i] .left] ]). 이상적은 아니지만 작동해야합니다. 당신은 인덱스로 [sym-'a']를 취할 수 있도록 데이터 배열을 관리 할 수 ​​있지만 유스 케이스의 옵션인지는 알 수 없습니다. 솔직히 말해 코드의 현재 상태가 너무 복잡하기 때문에 많은 코드를 제공 할 수 없습니다. – Balise