Question

je convertir un tableau d'entiers en un produit de carbonisation par itération à travers toute la matrice, puis j'ajoute la chaîne résultante à la méthode de la ncurses new_item. Pour une raison que je fais quelque chose de mal, je le sens mémoire reallocate, donc je reçois la première colonne comme:

-4 Choice 1                 0 Choice 1
 4 Choice 2                 1 Choice 1
 4 Choice 3  - Instead of - 2 Choice 1
 4 Choice 4                 3 Choice 1
 4 Exit                     4 Choice 1

-

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <menu.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define CTRLD     4

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                  };
int table[5]={0,1,2,3,4}; 
int main()
{    ITEM **my_items;
    int c;              
    MENU *my_menu;
    int n_choices, i;
    ITEM *cur_item;

    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    n_choices = ARRAY_SIZE(choices);
    my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));

    char *convert = NULL;
    for(i = 0; i < n_choices; ++i){
        convert = (char *) malloc ( sizeof(char) * 4);
        sprintf(convert, "%i", table[i]); 
        my_items[i] = new_item(convert, choices[i]);
    }
    my_items[n_choices] = (ITEM *)NULL;

    my_menu = new_menu((ITEM **)my_items);
    mvprintw(LINES - 2, 0, "F1 to Exit");
    post_menu(my_menu);
    refresh();

    while((c = getch()) != KEY_F(1))
    {   switch(c)
        {   case KEY_DOWN:
                menu_driver(my_menu, REQ_DOWN_ITEM);
                break;
            case KEY_UP:
                menu_driver(my_menu, REQ_UP_ITEM);
                break;
        }
    }

    char *n = NULL, *d = NULL;

    unpost_menu(my_menu);
    free_menu(my_menu);
    for(i = 0; i < n_choices; ++i){
       n = (char *) item_name (my_items[i]);
       free (n);
       d = (char *) item_description (my_items[i]);
       free (d);
       free_item(my_items[i]);
    }

    free(my_items);
    endwin();
}

** Mise à jour: Ceci a été corrigé. Voir le code ci-dessus!

Était-ce utile?

La solution

Vous essayez de realloc le même bloc de mémoire avec la même taille encore et à nouveau, pour lequel realloc retourne juste le même bloc de mémoire. Donc, vous écrasez les valeurs antérieures de convert, et le stockage du même tableau de caractères dans tous les éléments.

Vous devez utiliser à la place malloc:

// right here
char *convert = NULL;
for(i = 0; i < n_choices; ++i){
    convert = (char *) malloc (sizeof(char) * 4);
    sprintf(convert, "%i", table[i]); 
    my_items[i] = new_item(convert, choices[i]);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top