|
|||||||
|
|
|
![]() |
|
|
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 23: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: 7260
|
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 08:58. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
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: 01:51.




















