|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
[C] Array bidimensionali
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: Codice:
#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); } Ciao
__________________
[ punkeroso ] - [ powered by Arch Linux ] Ultima modifica di PuNkEtTaRo : 29-08-2007 alle 22:09. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
È chiaro però che se hai un array 4x4, la cella al limite è [3][3] (gli indici partono da 0).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
Quote:
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...
__________________
[ punkeroso ] - [ powered by Arch Linux ] |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7249
|
a me funziona il tuo codice
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
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!
__________________
[ punkeroso ] - [ powered by Arch Linux ] Ultima modifica di PuNkEtTaRo : 30-08-2007 alle 07:58. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7249
|
Quote:
![]() Codice:
#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); } |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
Quote:
avevo capito che i problemi erano nella scrittura su file...e mi stavo documentando! Grazie ancora. Ciao
__________________
[ punkeroso ] - [ powered by Arch Linux ] |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:29.