Numerowanie przedmiotu w tablicy.

0

Mam problem gdy tworze item w ncurses, moge tam dac dwa argumenty, chce zeby pierwszym byl numer itemu a drugim jego nazwa ktora jest w tablicy z nazwami itemow, zaraz wrzuce ponizej jak probuje to rozwiazac ale ciagle mam komunikat o ochronie pamieci.


int numbers[8];
char *choices[]={
  "1.GREEN",
  "2.RED",
  "3.BLUE",
  "4.YELLOW",
  "5.WHITE",
  "6.MAGENTA",
  "7.BLACK",
};

  ITEM **my_items;
  MENU *my_menu;
  WINDOW *my_menu_win;
  int n_choices = ARRAY_SIZE(choices),number = 1;
  char choice;
  
  my_items = (ITEM **)calloc(n_choices + 1,sizeof(ITEM *));
  for(int i = 0;i < n_choices;++i){
    numbers[i]=i;
    my_items[i] = new_item(numbers[i],choices[i]);
  }

Probowalem tam w "my_items[i] = new_item(numbers[i],choices[i]);" dac tylko "i" ale to tez nie dziala zbyt dobrze, moze nie da sie tam podawac jako argumenty liczb calkowitych ? ale jak wtedy wypisywac numery itemow ?

@Edit - na razie rozwiazalem to tak:


int numbers[8];
char *choices[]={
  "1.GREEN",
  "2.RED",
  "3.BLUE",
  "4.YELLOW",
  "5.WHITE",
  "6.MAGENTA",
  "7.BLACK",
};

  ITEM **my_items;
  MENU *my_menu;
  WINDOW *my_menu_win;
  int n_choices = ARRAY_SIZE(choices),number = 1;
  char choice;
  
  my_items = (ITEM **)calloc(n_choices + 1,sizeof(ITEM *));
  for(int i = 0;i < n_choices;++i){
    numbers[i]=i;
    my_items[i] = new_item(numbers[i]," ");
  }

Dalem po prostu juz w tablicy numery a opis przedmiotu zastapilem spacja ale nie wiem czy to takie eleganckie wyjscie ;p No i przy wiekszej liczbie itemow moglby byc z tym klopot, jak ktos mialby problem jak to rozwiazac lepiej to czekam.

0

A co to za funkcja new_item? Mozesz podac jej kod? W ogole ciezko dojsc do tego o co w tym wszystkim chodzi. Jakbys wyrwal ten kawalek kodu z jakiejs wiekszej calosci. Korzystrasz z jakiegos frameworku? Czy co tam sie dzieje?

0

W czym to kompilujesz? Włącz wszystkie warningi i czytaj co Ci tam piszą. FLagi włączające wszystkie warningi w gcc: -Wall -Wextra -Wpedantic. Od razu mozesz dostac:

warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
my_items[i] = new_item(numbers[i],choices[i]);

Popatrz jakie argumenty przyjmuje new_item --> http://docs.oracle.com/cd/E19455-01/817-5436/6mkt3sbah/index.html

0

A wiec jak tutaj zaoperowac zeby obok deskrypcji itemu byla w nazwie literka ? probowalem zrobic tablice charow gdzie dodawalem znaki z tablicy ascii od 49 do momentu ile jest itemow a potem to wypisac ale tez cos nie zagralo....

0

Tak, przeczytałem, ze napisałeś, ale ja bym wolał wiedzieć na pewno, a nie podejrzewać. Poza tym robisz dalej to samo, podajesz do new_item jako pierwszy argument numbers[i], który wciąż jest intem, prawda?

0

Probuje tam podac ten charakter ale tez nie jest ok, wyglada to tak:

int menu(){
  char *choices_num[7];
  char *choices[]={
  "1.GREEN",
  "2.RED",
  "3.BLUE",
  "4.YELLOW",
  "5.WHITE",
  "6.MAGENTA",
  "7.BLACK",
};

  
  ITEM **my_items;
  MENU *my_menu;
  WINDOW *my_menu_win;
  int n_choices = ARRAY_SIZE(choices),number = 1;
  char choice;
  
  my_items = (ITEM **)calloc(n_choices + 1,sizeof(ITEM *));
  for(int i = 0;i < n_choices;++i){
    choices_num[i]=i + 49;
    my_items[i] = new_item(choices_num[i],choices[i]);
  }
0

Nie używałem tej biblioteki, ale zgodnie z dokumentacją pierwszy argument to nazwa (typ char*), a drugi to opis (typ char*). Spróbuj w ten sposób:

char *numbers[]={
  "1.",
  "2.",
  "3.",
  "4.",
  "5.",
  "6.",
  "7.",
};
...
for(int i = 0;i < n_choices;++i){
    my_items[i] = new_item(numbers[i],choices[i]);
}
0

Argument, który powinien być podany do funkcji jest typu const char*, czyli łańcucha znaków zakończonego znakiem '\0'. Jeden pojedynczy znak, albo jak wolisz charakter, jest typu char. Chcesz wrzucić tam opis, to musi to być łańcuch znaków. Znajdź funkcje, która zamienia char na łańcuch znaków albo po prostu stwórz sobie stałe wartości chociaż przy większej ilości opcji może to być rzeczywiście kłopotliwe.

Jeszcze krótka notka jeśli chodzi o używanie calloc zamiast malloc i zastanów się czy chcesz go używać:
http://stackoverflow.com/questions/8106782/when-should-i-use-calloc-over-malloc

0

Czuje ze dalej nie rozumiesz o co mi chodzi @Ąowski

0
char* items[] = {
	"GREEN",
	"RED",
	"BLUE",
	"YELLOW",
	"WHITE",
	"MAGENTA",
	"BLACK",
};

char buffer[16] = { 0 };

for (size_t i = 0; i < count; i++)
{
	sprintf(buffer, "%d", i + 1);

	my_items[i] = new_item(buffer, descs[i]);
}

BTW: Rozumiem, że kod ma być w C?

0

@colins
Wtedy przy itemie zawsze wyswietla jedna liczbe, 7...

int menu(){
  char *choices_num[7];
  char *choices[]={
  "1.GREEN",
  "2.RED",
  "3.BLUE",
  "4.YELLOW",
  "5.WHITE",
  "6.MAGENTA",
  "7.BLACK",
};
char buffer[16] = { 0 };

  for(int i = 0;i < n_choices;++i){
    sprintf(buffer, "%d", i);
    my_items[i] = new_item(buffer,choices[i]);
  }
0
  char *choices[]={
  "1.GREEN",
  "2.RED",
  "3.BLUE",
  "4.YELLOW",
  "5.WHITE",
  "6.MAGENTA",
  "7.BLACK",
};
  char buffer[7][16];
  for(int i = 0;i < n_choices;++i){
    sprintf(buffer[i],"%d",i);
    my_items[i] = new_item(buffer[i],choices[i]);
  }

dzieki ;) Ale dlaczego drugie miejsce ma miec 16 indeksow ? [7][7] nie bedzie ok ?

0

choices_num[i]=malloc(2 * sizeof(char)); - to co zamiast 2 moge dac bardzien iniwersalnego ? "i" chyba nie. np jak moge sprawdzic ile indeksow potrzebuje na zmienna "i" ?

0 użytkowników online, w tym zalogowanych: 0, gości: 0