LINUX.ORG.RU

просьба пояснить в чем может быть проблема.


0

1

Вечер добрый.
Вопрос по Си в следующем.
есть программа подключающаяся к mysql.
структура примерно следующая

file: mysqlfunc.h

MYSQL *conn
...
..
bool mysqlInit();

file main.cpp
main..
mysqlInit();
mysql_query(conn,"...");

в main вызываю процедуру и инициализирую подключение.
после пробую записать данные в базу через mysql_query
в x32 все работает нормально. в x64 отваливается в момент попытки записи в базу. как выяснилось conn = (nil). Вырезал инициализацию из mysqlInit и вставил просто в main - все работает. почему аллокация глобальной переменной в отдельной процедуре в x64 может не работать?



> Си

main.cpp

(nil)


аллокация глобальной переменной в отдельной процедуре



Segmentation fault.

Deleted
()

> почему аллокация глобальной переменной в отдельной процедуре

Где это в приведенном коде?

LamerOk ★★★★★
()
Ответ на: комментарий от friniz

>>Что такое «x32» и «x64»?

сборка на машине x86_64 в g++ -m64

Это ты сам придумал такие остроумные обозначения?

Led ★★★☆☆
()
Ответ на: комментарий от friniz

понимаю что сам туплю.. от платформы не зависит. накидал примерчик он не работает и на 32битной и на 64битной платформе. На практике понял что так делать нельзя. теперь в теории надо понять почему нельзя присвоить глобальному указателю ссылку на объект выделенный в куче. или mysql_init создает объект не в куче?

main.cpp int main(int argc, char** argv) {

if( !mysqlInit() ) return 1; //create database testbase; //create table testtable( field1 integer ); if( mysql_query(conn, «SELECT * FROM testtable;») != 0 ) printf(«\nmysql_query error: %s», mysql_error(conn)); return 0; }

mysqlfunc.cpp

#include «mysqlfunc.h» bool mysqlInit() { bool rezult = true;

conn = mysql_init(conn); if (conn == NULL) { printf(«\nconnecting mysql_init() failed (probably out of memory»); rezult = false; } else { opt_host_name = «192.168.0.222»; opt_port_num = 3306; opt_user_name = «test»; opt_password = «test»; opt_db_name = «testbase»; if (mysql_real_connect(conn, opt_host_name, opt_user_name, opt_password, opt_db_name, opt_port_num, opt_socket_name, opt_flags) == NULL) { printf(«\nFailed to connect to database: Error: %s», mysql_error(conn)); mysql_close(conn); rezult = false; } } return rezult; }

mysqlfunc.h

#include <mysql/my_global.h> #include <mysql/my_sys.h> #include <mysql/mysql.h>

#ifndef MYSQLFUNC_H #define   MYSQLFUNC_H

static char *opt_host_name = NULL; /* server host (default=localhost) */ static char *opt_user_name = NULL; /* username (default=login name) */ static char *opt_password = NULL; /* password (default=none) */ static unsigned int opt_port_num = 3306; /* port number (use built-in value) */ static char *opt_socket_name = NULL; /* socket name (use built-in value) */ static char *opt_db_name = NULL; /* database name (default=none) */ static unsigned int opt_flags = 0; /* connection flags (none) */ static MYSQL * conn; /* pointer to connection handler */

bool mysqlInit();

#endif   /* MYSQLFUNC_H */

friniz
() автор топика
Ответ на: комментарий от friniz

В этом уютном чатике есть такие важные фичи как lorcode, удаление своих (ненужных) постов и предпросмотр. Советую пользоваться ими как можно чаще.

anonymous
()
Ответ на: комментарий от friniz

> mysqlfunc.h

static MYSQL * conn; /* pointer to connection handler */


Объявляя переменную как static, ты ограничиваешь ее область видимости для компоновщика объектным файлом. Соответственно в main.cpp и mysqlfunc.cpp ты обращаешься к разным переменным.

Deleted
()
Ответ на: комментарий от friniz

Я вот ваш код модифицировал немного

http://paste.org.ru/?aleax3

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

P.S. read faq about Lor-Code, also use paste.org.ru Luke!

blinkenlichten
()
Ответ на: комментарий от Deleted

Спасибо вам большое. теперь все понятно.

friniz
() автор топика
Ответ на: комментарий от anonymous

Причем тут adriano32?

// ссылка на x некорректна из-за '!' на конце

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.