Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> метод для инициализации глобального массива 
V
    Опции темы
Larrikin
Дата 19.2.2008, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



компилится молча

при выполнении выдает:

ncalcd in free(): warning: junk pointer, too low to make sense

Код

// debug
    fprintf(stdout, "stage 1\n");

// Освобождаем память, занятую массивом
    if (neuro){
        free( neuro    );
        neuro = NULL;
    }

// debug
    fprintf(stdout, "stage 2\n");



вообще-то изначальная задача была сделать отдельный метод, который используя существующее уже один раз сделанное в методе main соединение к MySQL создавал бы глобальный (а лучше бы возвращал) массив на основе актуальной на тот момент таблицы в базе для использования этого массива другими методами

вот что у меня получилось пока:

Код

#include <common.h>

void init(MYSQL *conn)
{
    int
    n        // counter
    , rows;    // rows in table
    struct neuron *neuro;

    double valueX,valueY;

// Дескриптор результирующей таблицы
    MYSQL_RES *res;

// Дескриптор строки
    MYSQL_ROW row;



// debug
    fprintf(stdout, "stage 1\n");

// Освобождаем память, занятую массивом
    if (neuro){
        free( neuro    );
        neuro = NULL;
    }

// debug
    fprintf(stdout, "stage 2\n");

// Выполняем SQL запрос
    if (mysql_query(conn, "SELECT id,x,y,act,hp,born FROM neuro") != 0)
        puterror("Error: can't execute SQL-query\n");

// Получаем дескриптор результирующей таблицы
    res = mysql_store_result(conn);

    if (res == NULL)
        puterror("Error: can't get the result description");

    rows = mysql_num_rows(res);

// debug
    fprintf(stdout, "stage 3\n");

// debug
    fprintf(stdout, "We got %i rows from db\n", rows );


// Если имеется хотя бы одна запись - выводим
    if (rows > 0 ){

        neuro = malloc( rows+2 * sizeof( struct neuron) );
        if ( !neuro)
            puterror("Error: can't allocate memory\n");
// debug
//        fprintf(stdout, "sizeof neuro - %i\n",sizeof(neuro));
//        fprintf(stdout, "sizeof neuron - %i\n",sizeof(struct neuron));

        n = 0; // счетчик строк, пришедших из базы
        neuro[n].id = rows;

        while( (row = mysql_fetch_row(res) ) != NULL)
        {

// debug
            fprintf(stdout, "mySQL say: %s,%s,%s,%s\n", row[0], row[1], row[2], row[3]);

            n = n + 1;
            neuro[n].id = atoll (row[0]);
            neuro[n].n = n;
            neuro[n].x = atoll (row[1]);
            neuro[n].y = atoll (row[2]);
            neuro[n].act = *(char*)row[3];

            if (neuro[n].x < 0){
                valueX = x[-neuro[n].x];
            } else{
                valueX = neuro[neuro[n].x].value;
            }

            if (neuro[n].y < 0){
                valueY = x[-neuro[n].y];
            } else{
                valueY = neuro[neuro[n].y].value;
            }

            neuro[n].value = calc(valueX, neuro[n].act, valueY) ;
// debug
            fprintf(stdout,
                "Neuron %i:    value of %i %c value of %i = %f\n",
                neuro[n].n, neuro[n].x, neuro[n].act, neuro[n].y, neuro[n].value
            );

        }
    } else {

// debug
        fprintf(stdout, "No elements in table\n");
    }

// Освобождаем память, занятую результирующей таблицей
    mysql_free_result(res);

}



как лучше сделать?
почему хочу отдельный метод - потому что инициализировать этот массив нужно будет из разных мест программы после внесения изменений в таблицу MySQL
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 19.2.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  19.2.2008,  01:17 Найти цитируемый пост)
if (neuro){
        free( neuro    );
        neuro = NULL;
    }

в neuro значение не определено (почти всегда != NULL) и не валидно
может стоит так сделать
Код

static struct neuron *neuro = NULL;



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 19.2.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



вот думаю да может проще сделать безусловную
Код

free( neuro    );
neuro = NULL;

чем-нибудь грозит освобождение незанятой памяти?
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 19.2.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Larrikin
при первом вызове free() в neuro у тебя непонятно что
Цитата(Larrikin @  19.2.2008,  18:35 Найти цитируемый пост)
чем-нибудь грозит освобождение незанятой памяти? 

SIGSEGV


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mr_oz
Дата 19.2.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.10.2006

Репутация: нет
Всего: нет



 А что если, просто сообразить простенький класс,с конструктором и десструктором 
Или struct neuron явно инициализировать c 0;
PM MAIL   Вверх
Larrikin
Дата 19.2.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



mr_oz, я пишу на С


MAKCim, а как наверняка инициализировать, чтобы даже первый вызов корректно можно было освободить?
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 20.2.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  19.2.2008,  23:40 Найти цитируемый пост)
а как наверняка инициализировать, чтобы даже первый вызов корректно можно было освободить? 

я уже писАл
Код

static struct neuron *neuro = NULL;





--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 20.2.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



хорошо, а как же всё-таки сделать основную задачу существования метода init - чтобы я в любом месте основного кода мог сделать что-нибудь навроде    
Код

neuro = init(&conn);


и дальше спокойно всякие вещи типа

Код

    for ( n = 1; n <= neuro[0].id; n = n +1 )
        fprintf(stdout, "N(%i):     %f\n", n, neuro[n].value);



то есть что должно быть в определении функции init вместо текущего
Код

void init(MYSQL *conn)
{


и что в основной функции main определять заранее вместо текущего

Код

    struct neuron *neuro;



может быть надо что-то ещё?

Это сообщение отредактировал(а) Larrikin - 20.2.2008, 11:29
PM MAIL WWW ICQ   Вверх
Larrikin
Дата 20.2.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



вроде разобрались, пока работает...

заодно мелкий вопросик, для которого стыдно создавать тему:

мне надо выполнить запрос вида DELETE from neuro WHERE id = '1'

как мне это написать в коде, если id хранится в переменной int?

Код

if(mysql_query(conn,"DELETE from neuro WHERE id = " id) !=0)


так неправильно, а как?

Это сообщение отредактировал(а) Larrikin - 20.2.2008, 22:15
PM MAIL WWW ICQ   Вверх
turist
Дата 24.2.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 13.8.2007
Где: Киев

Репутация: нет
Всего: нет



Цитата(Larrikin @ 20.2.2008,  22:13)
заодно мелкий вопросик, для которого стыдно создавать тему:

мне надо выполнить запрос вида DELETE from neuro WHERE id = '1'

как мне это написать в коде, если id хранится в переменной int?

Код

if(mysql_query(conn,"DELETE from neuro WHERE id = " id) !=0)


так неправильно, а как?

Код

char query[100];
sprintf(query, "DELETE from neuro WHERE id = %d",id);

if(mysql_query(conn, query) !=0){
   ...
}

PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.