Torna indietro   Hardware Upgrade Forum > Software > Programmazione

L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-08-2007, 21:38   #1
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
[C]Problema con matrice dinamica in una struttura

Innanzitutto chiedo scusa per tutti gli errori che faro', e' la prima volte che posto qui, ma sono disperato (ho un esame a fine agosto).

In breve devo creare una struttura semplice semplice che mi consenta di gestire un reparto d'ospedale con posti letto prenotabili per un anno.Bon.
Lasciamo stare i vari pezzi commentati, e' tutto work in progress. La cosa che non riesco a capire è come mai dopo che riempo la mia matrice con dei numeri (puramente a caso di prova), poi non riesco piu ad accedervi, difatti mi esce un bel processor fault quando nel main per prova ho tentato di cambiare un valore. Sicuramente e' un errore banale e grave (nel senso che sono stupido), daltronde io odio programmare...
Se per caso qualcuno lo legge anche solamente, grazie


Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

#define MAX 50
#define GIORNI 20

typedef struct s_reparto
	{
	char reparto [MAX+1];
	char ospedale [MAX+1];
	int num_letti;
  	int *matrice[];
	}tipo_reparto;

int num_reparti,indice_riga,indice_col,indice;
FILE *cf;
tipo_reparto *reparto;

void leggifile(void);
//void prenota(void);


void main()
{

 leggifile();
// prenota();
 indice=0;
 reparto[indice].matrice[1][0]=1;
		for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)  //stampa di controllo, e pure limitata a 12 per comodita'
		{
		  for(indice_col=0;indice_col<12;indice_col++)
			printf("%d ",reparto[indice].matrice[indice_riga][indice_col]);
		printf("\n");
		}
 fclose(cf);

}

void leggifile()
{

  if((cf=fopen("piemonte.txt","r+"))==NULL)
	printf("errore in apertura file\n");
  else
  {
	fscanf(cf,"%d",&num_reparti);    //finche' non finisco il file dovro' creare le caselle della mia struttura
	reparto=(tipo_reparto*)malloc(num_reparti*sizeof(tipo_reparto));  //cosi' dovrei creare un tot di allocazioni in
	while (!feof(cf))                                                 //memoria con una struttura tipo_reparto
	{
	  for (indice=0;indice<num_reparti;indice++)
	  {
		fscanf(cf,"%s%s%d",reparto[indice].ospedale,reparto[indice].reparto, &reparto[indice].num_letti);
//ora per ogni reparto di ospedale devo creare la matrice con tutti i letti disponibili o meno

		for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)
		{
		  reparto[indice].matrice[indice_riga]=(int *)malloc(GIORNI*sizeof(int));
		  for (indice_col=0;indice_col<GIORNI;indice_col++)
			reparto[indice].matrice[indice_riga][indice_col]=3;    //per ora setto tutti gli spazi della matrice a 0, lo uso per indicare
											   //che i letti sono tutti liberi
		}
//stampa di prova per la matrice, ridotta anche
		for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)  //stampa di controllo, e pure limitata a 12 per comodita'
		{
		  for(indice_col=0;indice_col<12;indice_col++)
			printf("%d ",reparto[indice].matrice[indice_riga][indice_col]);
		printf("\n");
		}



	  }  //chiudo il primo for
	}    //chiudo il while
  }      //chiudo if
//stampa di prova solo per vedere ospedale ,reparto e numero letti
  for (indice=0;indice<num_reparti;indice++)
  {
	printf("ospedale: %s  ,reparto: %s    ,numero letti: %d \n",reparto[indice].ospedale,reparto[indice].reparto,															  reparto[indice].num_letti);
  }
//  fclose(cf);
}


/*
void prenota()
{
  char reparto_p[MAX+1];
  int  giorni_p=0;
  while (giorni_p!=-1)
  {
    if(giorni_p!=-1) //per evitare di fare il primo passo altrove faccio subito un altro controllo...rozzo...ma semplice
	{
	printf ("Inserire il reparto in cui si vuole prenotare e il numero di giorni da prenotare: (-1 per terminare)\n");
	scanf("%s %d",reparto_p,&giorni_p);
//adesso dovremo vedere se troviamo un reparto che abbia un letto disponibile per quei tot giorni richiesti
//e dobbiamo anche trovare quello che ce li ha prima
	for (indice_reparto=0; indice_reparto<num_reparti; indice_reparto++)   //scorriamo tutti i reparti
	{

	}

	}  //chiudo if
  }   //chiudo while
}

*/
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 15:07   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Hai sbagliato l'allocazione della matrice...
Devi fare così:
Codice:
int **matrice;
int i;

matrice = (int **) malloc(sizeof(int *) * num_letti);

for(i = 0; i < GIORNI; ++i)
  matrice[i] = (int *) malloc(sizeof(int) * GIORNI);
Ovviamente inserendo la matrice nella struttura non cambia praticamente niente.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 16:24   #3
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
grazie mille, provo immediatamente e faccio sapere
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 16:53   #4
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
Ho provato a cambiare seguendo quello che mi hai detto

Nel pezzo interessato ho fatto cosi':

Codice:
	for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)
		{
		  reparto[indice].matrice=(int **) malloc(sizeof(int *) * reparto[indice].num_letti);
          for(i = 0; i < GIORNI; ++i)
		reparto[indice].matrice[i] = (int *) malloc(sizeof(int) * GIORNI);
		  for (indice_col=0;indice_col<GIORNI;indice_col++)
			reparto[indice].matrice[indice_riga][indice_col]=3;
il risultato e' che si', ora riesco ad accedere liberamente alla mia matrice, ma in compenso, dopo due passi di ciclo,invece di inserirmi tutti "3", mi mette numeri a casaccio, e non solo, va nel caos anche la stampa separata del nome ospedale e reparto.
Ad ogni modo continuo a lavorarci su e grazie !






Codice:
#include <stdio.h>
#include <stdlib.h>
 #include <string.h>
#include <conio.h>

#define MAX 50
#define GIORNI 20

typedef struct s_reparto
	{
	char reparto [MAX+1];
	char ospedale [MAX+1];
	int num_letti;
  	int **matrice;
	}tipo_reparto;

int num_reparti,indice_riga,indice_col,indice;
FILE *cf;
tipo_reparto *reparto;

void leggifile(void);
//void prenota(void);


void main()
{

  leggifile();
// prenota();
  indice=0;
  reparto[indice].matrice[0][0]=1;
	for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)  //stampa di controllo, e pure limitata a 12 per comodita'
		{
		for(indice_col=0;indice_col<12;indice_col++)
		printf("%d ",reparto[indice].matrice[indice_riga][indice_col]);
		printf("\n");
		}
 fclose(cf);

}

void leggifile()
{
  int i;

  if((cf=fopen("piemonte.txt","r+"))==NULL)
	printf("errore in apertura file\n");
  else
  {
  fscanf(cf,"%d",&num_reparti);    
   reparto=(tipo_reparto*)malloc(num_reparti*sizeof(tipo_reparto));  
	while (!feof(cf))                                                
	{
	  for (indice=0;indice<num_reparti;indice++)
	  {
fscanf(cf,"%s%s%d",reparto[indice].ospedale,reparto[indice].reparto, reparto[indice].num_letti);
	for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)
		{
		  reparto[indice].matrice=(int **) malloc(sizeof(int *) * reparto[indice].num_letti);
          for(i = 0; i < GIORNI; ++i)
			reparto[indice].matrice[i] = (int *) malloc(sizeof(int) * GIORNI);
		  for (indice_col=0;indice_col<GIORNI;indice_col++)
			reparto[indice].matrice[indice_riga][indice_col]=3;    //per ora setto tutti gli spazi della matrice a 0, lo uso per indicare
											   //che i letti sono tutti liberi
		}
//stampa di prova per la matrice, ridotta anche
		for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)  //stampa di controllo, e pure limitata a 12 per comodita'
		{
		  for(indice_col=0;indice_col<12;indice_col++)
			printf("%d ",reparto[indice].matrice[indice_riga][indice_col]);
		printf("\n");
		}



	  }  //chiudo il primo for
	}    //chiudo il while
  }      //chiudo if
//stampa di prova solo per vedere ospedale ,reparto e numero letti
  for (indice=0;indice<num_reparti;indice++)
  {
	printf("ospedale: %s  ,reparto: %s    ,numero letti: %d \n",reparto[indice].ospedale,reparto[indice].reparto,															  reparto[indice].num_letti);
  }
//  fclose(cf);
}
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 17:07   #5
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
niente da fare, sono negato.
Il fatto è che mi serve per forza dentro la struttura per fare in modo che ogni reparto abbia N letti e ogni letto abbia 365 slot da riempire o meno se sono occupati o non.
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 17:11   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Hai fatto un po' di confusione O meglio un po' l'avevo fatto anche io con gli indici
Codice:
reparto[indice].matrice=(int **) malloc(sizeof(int *) * reparto[indice].num_letti);
for (indice_riga=0;indice_riga<reparto[indice].num_letti;indice_riga++)
{
    reparto[indice].matrice[i] = (int *) malloc(sizeof(int) * GIORNI);
    for (indice_col=0;indice_col<GIORNI;indice_col++)
        reparto[indice].matrice[indice_riga][indice_col] = 3;
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 17:20   #7
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
assolutamente magnifico
ho a malapena capito il significato, pero' funziona
se passo sto esame mi laureo e addio C

Ad ogni modo tra oggi e domani sviluppo il programma se ho altri intoppi ritorno

Grazie infinite sei stato rapido e disponibile, piu' di cosi' non potevo desiderare
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 17:24   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da federik1982 Guarda i messaggi
assolutamente magnifico
ho a malapena capito il significato, pero' funziona
Se non hai capito chiedi
Comunque è semplice: si alloca un vettore di puntatori e poi si alloca un vettore per ogni puntatore del vettore di puntatori...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 17:46   #9
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
oh cavolo...ho fatto una segnalazione invece di una risposta...spero di non aver fatto casino...dannata fretta...se trovo un moderatore l'avverto -__-

comunque avevo solo scritto che non mi era molto chiaro il senso di
int **matrice, non l'avevo mai trovata prima come sintassi, a parte in qualche lista, ma con senso diverso

Ultima modifica di federik1982 : 17-08-2007 alle 17:48.
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 17:54   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da federik1982 Guarda i messaggi
oh cavolo...ho fatto una segnalazione invece di una risposta...spero di non aver fatto casino...dannata fretta...se trovo un moderatore l'avverto -__-
Ehm
<---------
Nessun problema
Quote:
Originariamente inviato da federik1982 Guarda i messaggi
comunque avevo solo scritto che non mi era molto chiaro il senso di
int **matrice, non l'avevo mai trovata prima come sintassi, a parte in qualche lista, ma con senso diverso
E' un puntatore a un puntatore...l'avrai trovato anche quando vai a modificare un puntatore all'interno di un funzione e vuoi che la modifica avvenga anche nel chiamante
Non è niente di particolare: in questo caso la motivazione è insita in quello che ci andiamo a mettere dentro. Per un vettore con allocazione dinamica normale si usa un puntatore, in questo caso visto che dovrà contenere un vettore allocato dinamicamente di puntatori serve appunto un puntatore a puntatore.

Ultima modifica di cionci : 17-08-2007 alle 17:57.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 18:09   #11
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
okkk grazie

Adesso in teoria devo solo implementare delle ricerche e dei settaggi della matrice, tanti ma dovrebbe essere semplici, spero.
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 18:12   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Mi raccomando se vuoi deallocare la struttura devi fare il passaggio inverso: deallocare uno per uno i vettori di interi, deallocare il vettore di puntatori e poi deallocare la struttura.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 18:45   #13
federik1982
Member
 
Iscritto dal: May 2006
Messaggi: 110
si hai ragione
ma grazie agli dei è una cosa che non ci chiederanno mai e poi mai

ma siccome sono curioso...
io so usare solo le istruzioni di free per liberare memoria
di solito lo faccio quando uso i malloc per le liste. Con le strutture non ho mai provato, suppongo sia uguale.
federik1982 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2007, 18:54   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Se elimini un reparto devi anche liberare la memoria
Si fa con la free...solo che non puoi farlo direttamente perché all'interno della struttura matrice contiene altra memoria allocata dinamicamente. Quindi devi usare la free, ma nell'ordine che ti ho detto. In pratica l'ordine inverso rispetto a quello con cui hai chiamato malloc
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Dopo gli unicorni, arrivano i "soon...
Europei sempre più diffidenti ver...
L'acquisto di Steam Machine è un ...
Lenovo Prime Day: i 6 migliori sconti (a...
CATL non riesce a superare la fase proto...
Mythos, il caso si complica: causa contr...
Il pazzesco nuovo record di Xiaomi YU7 G...
OneXPlayer 3: un PC gaming in formato Ni...
Climate.us riporta online i 15 anni di C...
Hisense da 58 pollici sotto i 300€ fa tr...
Windows 11 26H2: cosa cambia e chi resta...
SpaceX ha lanciato la sua prima capsula ...
Il prezzo medio di vendita degli smartph...
Prime Day robot tagliaerba: MAMMOTION, D...
Recensione Google Home Speaker: Gemini s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:08.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v