2012-02-05 4 views
-1

Я не могу избавиться от предупреждения компилятора «присваивание делает указатель из целое число без приведения» в следующем случае:C, сохранения/чтения NULL с текстовым файлом

int sql_user(char** mysql_user_name, char** mysql_password, char** mysql_server, char **mysql_serverport, char** mysql_socket) 
{ 
    int retval = -1; 
    char **sub; 
    char *contents; 
    if(g_file_get_contents("mysqlsrv.def", &contents, NULL, NULL)) 
    { 
     sub = g_strsplit(contents, "\n", -1); 
     //here compiler warning: assignment makes pointer from integer without a cast 

     *mysql_user_name = sub[0]; 
     *mysql_password = sub[1]; 
     *mysql_server  = sub[2]; 
     *mysql_serverport = sub[3]; 
     *mysql_socket  = sub[4]; 
     if (!strlen(sub[4])) *mysql_socket = NULL; 
     retval = 0; 
    } 
    return retval; 
} 

Additionaly, в суб [4] является пустая строка (""). Есть здесь способ сохранить NULL вместо того, чтобы текстовый файл, поэтому он может быть прочитанные позже как NULL без If (! StrLen ... состояние?

Любая помощь будет оценена.

не
+0

g_strsplit объявлен в и я использовать эту функцию allaround мой проект из нескольких файлов, так У меня нет проблем с возвратом данных. Вот вызов функции: sql_user (& mysql_user_name, & mysql_password, & mysql_server, & mysql_serverport, & mysql_socket); –

+0

Если вы используете это со всех сторон, у вас будет утечка памяти. Я не в курсе гномов, но быстрый google (http://developer.gnome.org/glib/2.30/glib-File-Utilities.html#g-file-get-contents) говорит, что вам нужно использовать g_free() на «содержании», когда вы закончите + g_strfreev() по результату g_strsplit(), когда закончите. Я бы предложил скопировать нужные вам значения и вызвать эти бесплатные методы внутри вашего метода выше. – John3136

ответ

5

Похоже, что g_strsplit() неизвестно (объявлено), поэтому компилятор принимает возвращаемый по умолчанию тип int. Я бы проверял ваши включенные файлы, чтобы убедиться, что включен g_strsplit().

+0

Да, вы правы, спасибо. Я забыл включить в этот файл, но в любом случае функция работает (разбивает строку на \ n). Как это возможно? –

+1

компоновщик все еще может найти определение функции, поэтому он все еще работает. – John3136

+1

@ user973238 очень хороший вопрос :) Тот факт, что он вообще работает, является странной исторической особенностью C - вы всегда должны пытаться скомпилировать с максимальными предупреждениями (-Wall -Werror), которые предупредили бы, что он не смог найти функцию Definiton. –

2

Нет, это не общий способ сохранить NULL в текстовый файл, вы должны решить, на какой-то способ кодирования его в файле конфигурации.

в данном конкретном случае было бы проще просто if(!strlen(sub[4])) как вы предлагаете.

Если вы хотите иметь формат файла конфигурации, который поддерживает NULL, я предлагаю использовать разметку langue или формат кодировки, такой как YAML, JSON, INI, или, может быть, Protocol Buffers, вы можете использовать существующую библиотеку и избегать необходимости изобретать колесо.

Поскольку вы уже являетесь Gnome lib, Gnome config library будет хорошей ставкой.

+0

ОК, Если это так, как вы говорите, проблем нет. Thanx. –

+0

Как читать/сохранять в двоичном файле? –

+1

@ user973238 вы * можете * сохранить конфигурацию в двоичном файле (протокольные буферы в основном двоичные), но я * действительно * рекомендую, чтобы вы этого не сделали. 1) Это затрудняет/невозможно настроить вручную, 2) Вы привязываетесь к какой-либо библиотеке, которую вы решили сделать (чтобы вы не могли использовать существующие инструменты для создания/обработки файлов), 3) По всем вышеперечисленным причинам и более UNIX-способом является использование текстовых файлов/потоков, где это практически возможно. –

1

g_strsplit Функция не объявлена ​​в исходном файле, и неявное объявление функции выполняется компилятором. Неявное объявление это одна:

/* function that takes an unspecified number of parameters and retuns an int */ 
extern int g_strsplit(); 

Чтобы исправить это, включить соответствующие заголовки для функции g_strsplit:

#include <glib.h> 
#include <glib/gprintf.h> 
+0

Thany ouah, уже исправлено. –

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