Ciao a tutti, il programma è completo, ma ho due problemi:
1. Quando creo por la prima volta il book (selezione 'b') nelle primi posti punta a roba strana (strano perchè tutta la struttura dati dovrebbe essere inizializzata a '\0', in
newBook()).
2. Quando creo per la seconda volta il book mi dà un errore che penso derivi dall'istruzione (
free(book) in case: 'b' . free(): invalid next size (fast)) ma non capisco il perchè...qualcuno saprebbe delucidarmi? Vi ringrazio in anticipo. Posto il codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void menu (int m);
char **newBook (int n);
void bookA (char **b, int n, int posto);
void printBook (char **print, int n);
void cancel (char **br, int toRemove, int n);
void move (char **bm, int from, int to);
int i;
int controllo = 1;
int main() {
char **book, c;
int n, add, toRemove, from, to;
//int p = 0;
menu (controllo);
while (( c = getchar () ) != 'f' ){
switch (c) {
case 'b':
if (controllo == 2)
free (book);
printf ("\nPosti: ");
scanf ("%d", &n);
book = newBook (n);
controllo = 2;
menu(controllo);
break;
case '+':
printf ("\nPosto: ");
scanf ("%d", &add);
bookA (book, n, add);
//printf ("%s", book[p]);
//p++;
//system ("clear");
menu(controllo);
break;
case '-':
printf ("\nPosto da cancellare: ");
scanf ("%d", &toRemove);
cancel (book, toRemove, n);
menu (controllo);
break;
case 'm':
printf ("\nFrom....To: ");
scanf ("%d %d", &from, &to);
move (book, from, to);
menu (controllo);
break;
case 'p': // p ---> printBook()
printBook (book, n);
menu (controllo);
break;
}
}
return 0;
}
void menu(int m) {
system ("clear");
switch (m) {
case 1:
printf ("b - New book\n");
printf ("f - Quit\n");
break;
case 2:
printf ("b - New book\n");
printf ("+ - Book\n");
printf ("- - Cancel\n");
printf ("m - Move\n");
printf ("p - Print book\n");
printf ("f - Quit\n");
break;
}
printf ("\nOperazione: ");
}
char **newBook (int n) {
char **b;
b = malloc (n * sizeof(char));
for (i = 0; i < n; i++) {
b[i] = malloc (sizeof(char));
b[i][0] = '\0';
}
return b;
}
void bookA (char **b, int number, int posto) {
char c;
int n = 0, size = 2;
if (posto < number) {
if (b[posto][0] != '\0') {
getchar();
printf ("\nNon disponibile, premere INVIO ... \n");
getchar();
}
else {
getchar();
printf ("\nNome: ");
i = 0;
b[posto] = malloc (size * sizeof(char));
while ((c = getchar())) {
if (n >= size) {
size++;
b[posto] = realloc (b[posto], size);
}
if (c == '\n') {
b[posto][i] = '\0';
break;
}
b[posto][i] = c;
i++;
}
}
} else {
getchar();
printf ("\nPosto non disponibile, premere INVIO ...\n");
getchar();
}
}
void cancel (char **br, int toRemove, int n) {
if (toRemove < n) {
if (br[toRemove][0] != '\0') {
br[toRemove] = realloc (br[toRemove], 1);
br[toRemove][0] = '\0';
} else {
getchar();
printf ("Posto libero! Premere INVIO ...");
getchar();
}
}
}
void move (char **bm, int from, int to) {
int lunghezza;
if (bm[from][0] == '\0') {
getchar();
printf ("\nPosto %d libero!", from);
getchar();
} else {
if (bm[to][0] == '\0') {
lunghezza = strlen (bm[from]);
bm[to] = realloc (bm[to], lunghezza+1);
strcpy (bm[to], bm[from]);
bm[from] = realloc (bm[from], 1);
bm[from][0] = '\0';
getchar();
printf ("\n\n%s spostato dal posto %d al posto %d. Premere INVIO ...", bm[to], from, to);
getchar();
} else {
getchar();
printf ("\nPosto %d già occupato. Premere INVIO ...", to);
getchar();
}
}
}
void printBook (char **print, int n) {
system ("clear");
for (i = 0; i < n; i++) {
if (print[i][0] != '\0')
printf ("\nPosto N° %d: %s", i, print[i]);
}
getchar();
printf ("\n\nPremere INVIO ...\n");
getchar();
}