2013-04-03 2 views
0

Я пишу код в C для задания.Ошибка: конфликтующие типы

Это соответствующий код:

//operation: text(elem) 
xml_list *text(xml_list *elem){ 
    if(isEmpty(elem)){ 
    return Nil(); 
    } 
    return append(text1(head(elem)),text(tail(elem))); 
} 

//operation: text1(elem) 
xml_list *text1(xml_list *elem){ 
    if(isText(elem)){ 
    return Cons(elem,Nil()); 
    } 
    else{ 
    return text(childeren(elem)); 
    } 
} 

Это дает мне ошибку: error: conflicting types for 'text1' xml_list *text1(xml_list *elem){

Я не могу понять источник проблемы. Я работаю над этим в течение 8 часов прямо сейчас, и я отчасти теряю рассудок по этому поводу. Пожалуйста, кто-нибудь помочь мне

+0

Вы пробовали, что «прибегая к помощи конфликтные ситуации» означает для вашего компилятора? –

ответ

2

к тому времени он достигает

return append(text1(head(elem)),text(tail(elem))); 

компилятор не знает тип возвращаемого text1. Поэтому он принимает int и запоминает его. И позже, когда он достигнет определения text1, он будет противоречить друг другу.

Чтобы решить эту проблему вперед объявить text1 как

xml_list *text1(xml_list *); // <---- Here 

xml_list *text(xml_list *elem){ 
    if(isEmpty(elem)){ 
    return Nil(); 
    } 
    return append(text1(head(elem)),text(tail(elem))); 
} 

//operation: text1(elem) 
xml_list *text1(xml_list *elem){ 
    if(isText(elem)){ 
    return Cons(elem,Nil()); 
    } 
    else{ 
    return text(childeren(elem)); 
    } 
} 
3

используется text1

xml_list *text(xml_list *elem){ 
    if(isEmpty(elem)){ 
    return Nil(); 
    } 
    return append(text1(head(elem)),text(tail(elem))); 
} 

, прежде чем он объявлен, поэтому компилятор использует (к сожалению) старый «неявное int» правило, и предполагает, что text1 возвращает int.

Если определено, что оно возвращает xml_list*, это противоречит типу, полученному из неявного объявления int.

Объявите свои функции в заголовке и включите это в источник, чтобы все прототипы были известны при использовании функции.

+0

Можете ли вы написать свой собственный? Если нет, можете ли вы просто объявить функции с прототипом ('xml_list * text1 (xml_list * elem);', ditto для 'text') в верхней части файла? Если даже не это, что вы вообще делаете? –

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