2016-03-23 12 views
-4

Когда я запускаю эту программу: http://hastebin.com/asorawoluw.mC Массив, который перезаписывается?

Я получаю эту ошибку в GDB:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000401f91 in resoudre (baie=...) at lineaire.c:291 
291   printf("type[%d] : %d\n", i, helper_glpk.col_bounds[i]->type); 

Когда я спрашиваю GDB для print i я получаю:

$1 = 1 

Таким образом, первая итерация неудачу, но я уверен, что написал в первом случае helper_glpk.col_bounds на линии 200-204, и я сделал malloc, так что нет способа (я думаю?), что мои данные переписываются или удаляются .. поэтому я не понимаю, почему Я получаю с.

Edit: вот минимальный код: Мои Структуры:

typedef struct Bounds Bounds; 
struct Bounds 
{ 
    int type; 
    double lb; 
    double ub; 
}; 

typedef struct HelperGlpk HelperGlpk; 
struct HelperGlpk 
{ 
    double *matrix_coefs; 
    double *obj_coefs; 
    Bounds **row_bounds; 
    Bounds **col_bounds; 
    int *column_of_coef; 
    int *row_of_coef; 
    int cpt_coef; 
    int cpt_contrainte; 
}; 

Мои функции в генерирует ограничение:

void genere_contrainte_1(int i, int j, HelperGlpk *helper_glpk, Baie baie){   
    helper_glpk->col_bounds[index_ouverture_serveur(i)]->type = GLP_DB; 
    helper_glpk->col_bounds[index_ouverture_serveur(i)]->lb = 0; 
    helper_glpk->col_bounds[index_ouverture_serveur(i)]->ub = 1; 

    helper_glpk->cpt_coef++; 

    helper_glpk->col_bounds[index_connexion(i, j, baie.nbr_serveur)]->type = GLP_LO; 
    helper_glpk->col_bounds[index_connexion(i, j, baie.nbr_serveur)]->lb = 0; 
    helper_glpk->col_bounds[index_connexion(i, j, baie.nbr_serveur)]->ub = 0; 

    helper_glpk->cpt_coef++; 
} 

и основная программа:

void resoudre(Baie baie){ 

    glp_prob *lp; 

    const int nbr_rows = baie.nbr_client + baie.nbr_serveur * baie.nbr_client; // nombre de contrainte 
    const int nbr_colums = baie.nbr_serveur + baie.nbr_serveur * baie.nbr_client; // nombre de variable 
    const int nbr_coefs = 3 * baie.nbr_serveur * baie.nbr_client; 

    int i, j; 

    HelperGlpk helper_glpk; 

    helper_glpk.matrix_coefs = malloc((nbr_coefs + 1) * sizeof(double)); 
    helper_glpk.matrix_coefs[0] = 0; 

    helper_glpk.obj_coefs = malloc((nbr_colums + 1) * sizeof(double)); 
    helper_glpk.obj_coefs[0] = 0; 

    helper_glpk.column_of_coef = malloc((nbr_colums + 1) * sizeof(int)); 
    helper_glpk.column_of_coef[0] = 0; 

    helper_glpk.row_of_coef = malloc((nbr_rows + 1) * sizeof(int)); 
    helper_glpk.row_of_coef[0] = 0; 

     helper_glpk.col_bounds = malloc((nbr_colums + 1) * sizeof(Bounds *)); 

for (int index = 0; index <= nbr_colums; index++) 
{ 
    helper_glpk.col_bounds[index] = malloc(sizeof(Bounds)); 
} 

helper_glpk.row_bounds = malloc((nbr_rows + 1) * sizeof(Bounds *)); 

for (int index = 0; index <= nbr_rows; index++) 
{ 
    helper_glpk.row_bounds[index] = malloc(sizeof(Bounds)); 
} 

    helper_glpk.cpt_coef = 1; 

    for(i = 1; i <= baie.nbr_serveur; i++) 
     for(j = 1; j <= baie.nbr_client; j++) 
      genere_contrainte_1(i, j, &helper_glpk, baie); 

    for(i = 1; i <= nbr_colums; i++) 
     printf("type[%d] : %d\n", i, helper_glpk.col_bounds[i]->type); 

    for(j = 1; j <= baie.nbr_client; j++) 
     genere_contrainte_2(j, &helper_glpk, baie.nbr_serveur); 

Ошибка Я получаю, пока я пытаюсь напечатать f после вызова generate_contrainte_1

+1

Пожалуйста, вставьте соответствующий минимальный код здесь –

+0

Ассумин это цикл 'for' или' while', вы не думаете, что 'i' должен начинаться с' 0'. –

+0

Что такое тип/декларация 'helper_glpk.col_bounds'? - Хорошо, просто видел это в вашей ссылке. Но обеспечение связей с пастебинами - это не способ использования SO. – jdarthenay

ответ

2

Этот код является неправильным:

helper_glpk.col_bounds = malloc((nbr_colums + 1) * sizeof(Bounds)); 

Вам необходимо исправить ее (при условии, что вам нужно nbr_colums + 1 элементы):

helper_glpk.col_bounds = malloc((nbr_colums + 1) * sizeof(Bounds *)); 
for (int index = 0; index < nbr_colums + 1; index++) 
{ 
    helper_glpk.col_bounds[index] = malloc(sizeof(Bounds)); 
} 

Я не проверил остальную часть кода, там могут быть другие ошибки.

Редактировать: возможно, вам не нужен цикл for в зависимости от того, что делает ваш genere_contrainte_1, но вам нужно исправить malloc с правом sizeof.

Edit2: Я прочитал ваш genere_contrainte_1, вам определенно нужны все эти malloc s. Но я действительно сомневаюсь, что вам нужно row_bounds и col_bounds быть Bounds **, мне кажется, Bounds * было бы хорошо, и таким образом достаточно одного malloc для каждого поля.

+0

Сначала это были Bounds *, но я хочу изменить col_bounds и row_bounds внутри функции, поэтому, я думаю, мне нужно сделать их указателями? – Hayanno

+0

Я только что обновил свой код, как вы сказали, теперь у меня есть Bounds *, но кажется, что моя структура не сохраняется, потому что внутри моей функции у меня есть helper_glpk-> col_bounds [1].type = 1; и снаружи я получаю ошибку: type = 216; недопустимый тип столбца – Hayanno

+0

Вы должны вызвать свою функцию следующим образом: 'my_function (helper_glpk-> col_bounds + i)', а аргумент 'my_function' должен быть' Bound * '. – jdarthenay