PDA

View Full Version : [C] Array bidimensionali


PuNkEtTaRo
29-08-2007, 22:55
Ciao a tutti ragazzi,
è la prima volta che scrivo in questa sezione del forum...ma questo è il mio primo programma in C...
Praticamente ho creato una matrice dinamica che dopo ho riempito con delle struct.
Il problema è che non riesco a scrivere ai limiti della matrice...
Mi spiego meglio:
se creo una matrice 4x4, non riesco a scrivere dove sono gli zeri in rosso....
0000 ovviamente con [0][3]...
0000 qui con [1][3]...e così via
0000
0000



questo è il sorgente:
#include <stdio.h>

#include <stdlib.h>



typedef struct

{

unsigned int IsReserved;

int ReservationNumber;

} Seat;


Seat **Cinema;
int rowNum, seatPerRow;


int main(int argc, char **argv) {

int i,j;

FILE *fp = fopen("mappa.dat","rb");
if (fp==NULL) {
fp=fopen("mappa.dat","wb+");
printf("Inserisci il numero di file del cinema ");
scanf("%d",&rowNum);
printf("Inserisci il numero di posti per fila del cinema ");
scanf("%d",&seatPerRow);
fwrite(&rowNum,sizeof(int),1,fp);
fwrite(&seatPerRow,sizeof(int),1,fp);
Cinema=malloc(rowNum*sizeof(Seat *));
if (Cinema == NULL) {
printf("Error: malloc could not allocate %d bytes for Cinema\n", rowNum*sizeof(int *));
return (-1);
}
for (i = 0; i < rowNum; i++) {
Cinema[i]=malloc(seatPerRow*sizeof(Seat));
}
for(i=0;i<rowNum;i++) {
for(j=0;j<seatPerRow;j++) {
Cinema[i][j].IsReserved=0;
Cinema[i][j].ReservationNumber=0;
}
}
Cinema[3][4].IsReserved=1; //perche' non va?
fwrite(Cinema,sizeof(Seat),rowNum*seatPerRow,fp);
fclose(fp);

for (i = 0; i < seatPerRow; i++) {
free(Cinema[i]);
}
free(Cinema);
}
else {
fread(&rowNum,sizeof(int),1,fp);
fread(&seatPerRow,sizeof(int),1,fp);
Cinema=malloc(rowNum*sizeof(Seat *));
if (Cinema == NULL) {
printf("Error: malloc could not allocate %d bytes for Cinema\n", rowNum*sizeof(int *));
return (-1);
}
for (i = 0; i < rowNum; i++) {
Cinema[i]=malloc(seatPerRow*sizeof(Seat));
}
fread(Cinema,sizeof(Seat),rowNum*seatPerRow,fp);
fclose(fp);
printf("%d %d\n",rowNum,seatPerRow);
for(i=0;i<rowNum;i++) {
for(j=0;j<seatPerRow;j++) {
printf("%d ",Cinema[i][j].IsReserved);
}
printf("\n");
}
}

/*for (i = 0; i < seatPerRow; i++) {
free(Cinema[i]);
}
free(Cinema);*/

return (0);

}


Grazie a tutti in anticipo...
Ciao

andbin
29-08-2007, 23:02
Ciao a tutti ragazzi,
è la prima volta che scrivo in questa sezione del forum...ma questo è il mio primo programma in C...
Praticamente ho creato una matrice dinamica che dopo ho riempito con delle struct.
Il problema è che non riesco a scrivere ai limiti della matrice...
Mi spiego meglio:
se creo una matrice 4x4, non riesco a scrivere dove sono gli zeri in rosso....
0000
0000
0000
0000

questo è il sorgente:La parte della allocazione dell'array principale e di quelli secondari mi sembra del tutto corretta (non hai controllato i valori di ritorno delle malloc .... vabbè).

È chiaro però che se hai un array 4x4, la cella al limite è [3][3] (gli indici partono da 0).

PuNkEtTaRo
29-08-2007, 23:08
La parte della allocazione dell'array principale e di quelli secondari mi sembra del tutto corretta (non hai controllato i valori di ritorno delle malloc .... vabbè).

È chiaro però che se hai un array 4x4, la cella al limite è [3][3] (gli indici partono da 0).
Ho controllato i valori di ritorno solo della malloc per l'array principale...

Comunque...che gli indici partano da zero...lo so bene...è qualche anno che programmo...(non in C purtroppo).

Se provi a far girare il programma, ti accorgi che se crei una Sala di 5x5, non posso scrivere nel valore [1][4], [2][4], etc...e così anche per [4][1], [4][2]...etc...
Cmq hai ragione, mi sono espresso male nel disegnino...

k0nt3
30-08-2007, 00:49
a me funziona il tuo codice :fagiano:

PuNkEtTaRo
30-08-2007, 08:53
a me funziona il tuo codice :fagiano:

Cioè, se la prima volta che lo esegui, inserisci 5 e 5 come numero di file e poltrone per file, la seconda volta ti stampa un "1" nell'ultima colonna???
A me no!

k0nt3
30-08-2007, 10:57
Cioè, se la prima volta che lo esegui, inserisci 5 e 5 come numero di file e poltrone per file, la seconda volta ti stampa un "1" nell'ultima colonna???
A me no!
effettivamente hai ragione.. questo è il codice che funziona :D
#include <stdio.h>
#include <stdlib.h>



typedef struct

{

unsigned int IsReserved;

int ReservationNumber;

} Seat;


Seat **Cinema;
int rowNum, seatPerRow;


int main(int argc, char **argv) {

int i,j;

FILE *fp = fopen("mappa.dat","rb");
if (fp==NULL) {
fp=fopen("mappa.dat","wb+");
printf("Inserisci il numero di file del cinema ");
scanf("%d",&rowNum);
printf("Inserisci il numero di posti per fila del cinema ");
scanf("%d",&seatPerRow);
fwrite(&rowNum,sizeof(int),1,fp);
fwrite(&seatPerRow,sizeof(int),1,fp);
Cinema=malloc(rowNum*sizeof(Seat *));
if (Cinema == NULL) {
printf("Error: malloc could not allocate %d bytes for Cinema\n", rowNum*sizeof(int *));
return (-1);
}
for (i = 0; i < rowNum; i++) {
Cinema[i]=malloc(seatPerRow*sizeof(Seat));
}
for(i=0;i<rowNum;i++) {
for(j=0;j<seatPerRow;j++) {
Cinema[i][j].IsReserved=0;
Cinema[i][j].ReservationNumber=0;
}
}
Cinema[3][4].IsReserved=1; //perche' non va?

for(i=0;i<rowNum;i++) {
for(j=0;j<seatPerRow;j++) {
fwrite(&Cinema[i][j],sizeof(Seat),1,fp);
printf("%d ",Cinema[i][j].IsReserved);
}
printf("\n");
}

fclose(fp);

for (i = 0; i < seatPerRow; i++) {
free(Cinema[i]);
}
free(Cinema);
}
else
{
fread(&rowNum,sizeof(int),1,fp);
fread(&seatPerRow,sizeof(int),1,fp);
Cinema=malloc(rowNum*sizeof(Seat *));
if (Cinema == NULL) {
printf("Error: malloc could not allocate %d bytes for Cinema\n", rowNum*sizeof(int *));
return (-1);
}
for (i = 0; i < rowNum; i++) {
Cinema[i]=malloc(seatPerRow*sizeof(Seat));
}

printf("%d %d\n",rowNum,seatPerRow);
for(i=0;i<rowNum;i++) {
for(j=0;j<seatPerRow;j++) {
fread(&Cinema[i][j],sizeof(Seat),1,fp);
printf("%d ",Cinema[i][j].IsReserved);
}
printf("\n");
}

fclose(fp);
}

/*for (i = 0; i < seatPerRow; i++) {
free(Cinema[i]);
}
free(Cinema);*/

return (0);

}

PuNkEtTaRo
30-08-2007, 15:42
effettivamente hai ragione.. questo è il codice che funziona :D
[CUT]
Ciao, grazie mille...
avevo capito che i problemi erano nella scrittura su file...e mi stavo documentando!
Grazie ancora.
Ciao