2013-06-24 2 views
1

Кто-нибудь успешно вызвал функцию, возвращающую double с помощью libtcc TCC?TCC вызывает функцию, возвращающую double

Я определил функцию, чтобы вернуть double в мой код и через tcc_add_symbol добавил его в libtcc. Когда я вызывал эту функцию в сценариях tcc и получил возвращаемое значение, значение было 0.000, чего я не ожидал.

Код:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include "libtcc.h" 

double get_double() 
{ 
return 80.333; 
} 

int get_int() 
{ 
return 333; 
} 

char my_program[] = 
"int foo()\n" 
"{\n" 
" printf(\"Hello World!\\n\");\n" 
" printf(\"double: %.4f\\n\", get_double()); \n" 
" printf(\"int: %d\\n\", get_int()); \n" 
" return 0;\n" 
"}\n"; 

int main(int argc, char **argv) 
{ 
TCCState *s; 
typedef int (*func_type)(); 
func_type func; 

s = tcc_new(); 
if (!s) { 
    fprintf(stderr, "Could not create tcc state\n"); 
    exit(1); 
} 

tcc_set_lib_path(s, "TCC"); 

tcc_set_output_type(s, TCC_OUTPUT_MEMORY); 

if (tcc_compile_string(s, my_program) == -1) 
    return 1; 
tcc_add_symbol(s, "get_double", get_double); 
tcc_add_symbol(s, "get_int", get_int); 

if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0) 
    return 1; 

func = (func_type)tcc_get_symbol(s, "foo"); 
if (!func) 
    return 1; 

func(); 
tcc_delete(s); 
getchar(); 
return 0; 
} 

Результат выполнения кода:

Hello World! 

double: 0.0000 

int: 333 

Почему get_double() функция возвращает 0,0000, но get_int() успешно?

ответ

1

Взгляните на ваш фрагмент int foo(). Вы должны помнить, что эта строка является всей единицей компиляции, как если бы вы сохранили ее в файле C. Внутри этой единицы компиляции get_int() и get_double() фактически не определены. Версия int работает из-за удачи, поскольку все необъявленные переменные и функции имеют тип int. И это также причина, почему get_double не работает, потому что одно и то же правило предполагает, что оно находится в функции int.

Решение прост. Просто объявите свои функции в своем скрипте. Используйте файл заголовка или что-то вроде:

char my_program[] = 
"double get_double();\n" 
"int get_int();\n" 
"int foo()\n" 
"{\n" 
" printf(\"Hello World!\\n\");\n" 
" printf(\"double: %.4f\\n\", get_double()); \n" 
" printf(\"int: %d\\n\", get_int()); \n" 
" return 0;\n" 
"}\n"; 

Я настоятельно рекомендую вам использовать tcc_set_error_func(), чтобы захватить все предупреждения и ошибки.

+0

Большое спасибо! Поскольку пример TCC не объявляет функцию. – user1531899

+0

Добро пожаловать. Могу ли я с уважением спросить, что вам нравится/принимать ответ, если ответ решил вашу проблему. – mikijov