Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > метод для инициализации глобального массива


Автор: Larrikin 19.2.2008, 01:17
компилится молча

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

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

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

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

static struct neuron *neuro = NULL;

Автор: Larrikin 19.2.2008, 18:35
вот думаю да может проще сделать безусловную
Код

free( neuro    );
neuro = NULL;

чем-нибудь грозит освобождение незанятой памяти?

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

SIGSEGV

Автор: mr_oz 19.2.2008, 22:43
 А что если, просто сообразить простенький класс,с конструктором и десструктором 
Или struct neuron явно инициализировать c 0;

Автор: Larrikin 19.2.2008, 23:40
mr_oz, я пишу на С


MAKCim, а как наверняка инициализировать, чтобы даже первый вызов корректно можно было освободить?

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

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

static struct neuron *neuro = NULL;



Автор: Larrikin 20.2.2008, 11:28
хорошо, а как же всё-таки сделать основную задачу существования метода 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, 22:13
вроде разобрались, пока работает...

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

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

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

Код

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


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

Автор: turist 24.2.2008, 00:44
Цитата(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){
   ...
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)