Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2007, 14:44   #1
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
[C] strutture e realloc

salve, ho dichiarato una struttura di questo tipo:

Codice:
struct elementi {
	char *w;
};
poi nel main

Codice:
struct elementi *str;
per creare un array di strutture dinamico.

cosi, alloco la memoria per gli elementi dell'array str, e nello stesso tempo poi alloca la memoria per ogni elemento str[i].w. Fin qui tutto bene. Ma se volessi liberare completamente la memoria occupata dalla struttura, come dovrei fare?? cioè sia quella occupata dinamicamente da ogni str[i].w e sia quella dell'array str dinamico.

grazie
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread

Ultima modifica di gepeppe : 21-10-2007 alle 17:00. Motivo: modifica del titolo
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2007, 15:09   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
salve, ho dichiarato una struttura di questo tipo:

Codice:
struct elementi {
	char *w;
};
poi nel main

Codice:
struct elementi *str;
per creare un array di strutture dinamico.
Quindi allochi dinamicamente un array di struct elementi che assegni a 'str'.

Se vuoi liberare il tutto basta:
- fare una free di ogni singolo puntatore str[i].w (ammesso che tu abbia usato l'allocazione dinamica anche per queste aree di memoria)
- fare una free dell'intero array di strutture (free(str) in sostanza).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2007, 15:27   #3
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
cioè un:
Codice:
{
for(i = i; i<n, i++)
{free(str[i].w);}

free(str);

}
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2007, 17:00   #4
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
tornando alla struttura, ho un problema con realloc. Ho la struttura di dimensioni 10, e se la rialloco e poi vado a leggere gli elementi mi da errore:

Codice:
struct elementi {
	char *w;
};

struct elementi *I;

int i;
//prima allocazione di 10 elementi
I=(struct elementi *)malloc(10*sizeof(struct elementi));

//alloco poi ogni elemento w
for(i= 0; i<10; i++){
I[i].w = (char *)malloc(10*sizeof(char));
}
//realloco la struttura per ampliarla	
I =(struct elementi *)realloc(I, 30);

//alloco ora i nuovi elementi della struttura
for(i= 10; i<30; i++){
	I[i].w = (char *)malloc(10*sizeof(char));
}
	
//la caricao tutta con il valore c
	for(i= 0; i<30; i++)
		strcpy(I[i].w, "c");

//vado a leggermi i valori	
	for(i= 0; i<30; i++)
	printf("%s\n", I[i].w);
e nell'ultimo passaggio mi da errore!!! perchè??
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread

Ultima modifica di gepeppe : 22-10-2007 alle 12:21.
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2007, 12:19   #5
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
nessuno mi sà aiutare con la realloc dell'esempio?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2007, 23:23   #6
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Usi la realloc() in modo completamente sbagliato. Nella malloc() allochi (se la matematica non è un'opinione) 40 byte su architettura x86 32 bit, nella realloc() invece, specifichi di ridimensionare il blocco puntato da I a 30 byte. Ne consegue che al posto di ottenere un maggioramento della memoria allocata, ne ottieni invece uno shrink, causando nei for() successivi dei buffer overflow che ti portano al segfault (e precisamente nella strcpy())
Devi quindi riallocare 120 byte in totale per avere il comportamento sperato.
Il programma corretto è quindi questo:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct elementi {
	char *w;
};

struct elementi *I;

int main(void)
{
	int i;
        /* prima allocazione di 10 elementi */
	I = (struct elementi *)malloc(10*sizeof(struct elementi));

        /* alloco poi ogni elemento w */
        for(i = 0; i < 10; i++) {
		I[i].w = (char *)malloc(10*sizeof(char));
        }
        /* realloco la struttura per ampliarla */	
        I = (struct elementi *)realloc(I, 30* sizeof(struct elementi));

        /* alloco ora i nuovi elementi della struttura */
        for(i = 10; i < 30; i++) {
		I[i].w = (char *)malloc(10*sizeof(char));
        }
	
        /* la caricao tutta con il valore c */
	for(i = 0; i < 30; i++)
		strcpy(I[i].w, "c");

        /* vado a leggermi i valori */	
	for(i = 0; i < 30; i++)
		printf("%s\n", I[i].w);

	return 0;
}
Nota che ho lasciato il tuo codice il piu' invariato possibile (commenti inclusi) ma realloc() non "rialloca una struttura" bensi un blocco di memoria puntato da un puntatore. Inoltre tralascio la non verifica dei valori di ritorno delle varie funzioni (siamo pur sempre in un esempio, ma ce ne sarebbero di cose da dire).

Ultima modifica di mjordan : 22-10-2007 alle 23:48.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 11:19   #7
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
Quote:
Originariamente inviato da mjordan Guarda i messaggi
Usi la realloc() in modo completamente sbagliato....

Codice:
        /* realloco la struttura per ampliarla */	
        I = (struct elementi *)realloc(I, 30* sizeof(struct elementi));
Nota che ho lasciato il tuo codice il piu' invariato possibile (commenti inclusi) ma realloc() non "rialloca una struttura" bensi un blocco di memoria puntato da un puntatore. Inoltre tralascio la non verifica dei valori di ritorno delle varie funzioni (siamo pur sempre in un esempio, ma ce ne sarebbero di cose da dire).
Sbagliavo a scrivere la realloc..cavolo!!! Cmq come potrei fare per riallocare una struttura invece??
Ti ringrazio per la spiegazione
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread

Ultima modifica di gepeppe : 23-10-2007 alle 12:23.
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:42   #8
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
riscrivo la domanda in modo migliore. Ho una struttura come quella di prima, struct x; Mettiamo di avere una funzione che modifica la struttura

Codice:
void modfy(struct x *p){
p -> dato = 3;
}
Mentre nel main ho una cosa del genere:

Codice:
struct x valori;
modify(&valori);
printf("valore == $d\n", valori.dato);
passo alla funzione l'indirizzo della struttura, cosi che la modifica, e io nel main ho la struttura bella e modificata , infatti stampa 3. Ma se volessi fare lo stesso per un'array di strutture??
Cioè se nel main ho:
Codice:
struct valori x[10];
come la passo alla funzione modfy, e nella funzione come accedo ai membri tramite il puntatore per modificare tutti i sui valori, cioè x[1].dato, x[2].dato ecc..?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread

Ultima modifica di gepeppe : 23-10-2007 alle 12:49.
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:55   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
a parte che casomai sarebbe
Codice:
struct x valori[10];
anziché
Codice:
struct valori x[10];
... dipende da cosa deve fare esattamente la funzione modify: deve modificarle tutte e 10 o solo una? nel primo caso aggiungi un parametro che specifichi il numero di strutture nell'array e fai un for:
Codice:
void modify(struct x *p, int count) {
	for (int i = 0; i < count; i++) {
		p[i].dato = 3;
	}
}
nel secondo caso invece basta che passi l'indirizzo della struct che vuoi modificare; metti che vuoi modificare la sesta, cioè quella con indice 5:
Codice:
struct x valori[10];
modify(valori + 5);
printf("valore == $d\n", valori[5].dato);
oppure in alternativa:
Codice:
struct x valori[10];
modify(&valori[5]);
printf("valore == $d\n", valori[5].dato);
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:23   #10
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
no io voglio modificare nella funzione modify tutta la struttura, quindi nn posso passargli un solo valore. Inoltre se faccoi come hai detto tu, nella funzione modifico il valore locale della struttura, che non ritroverei all'uscita della stessa. Allora, facciamo cosi,

Codice:
void modify(struct x *p, int count) {
	for (int i = 0; i < count; i++) {
		p[i] -> .dato = 3;
	}
}

void main(){
struct x valori[10];

modfy(valori);

	for (int i = 0; i <10; i++) {
		printf("%d\n", valori[i].a);
	}
}
Il programma non funziona, perchè?? io voglio passare alla funzione un puntatore alla struttura, in modo tale che la funzione modfy modifica la struttura, ma nel main ho la struttura modificata e posso mostrarne i valori...
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread

Ultima modifica di gepeppe : 23-10-2007 alle 13:29.
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:28   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
Il programma non funziona, perchè??
più che altro non compila visto questo obbrobbrio sintattico:
Quote:
Codice:
		p[i] -> .dato = 3;
Quote:
io voglio passare alla funzione un puntatore alla struttura, in modo tale che la funzione modfy modifica la struttura, ma nel main ho la struttura modificata e posso mostrarne i valori...
e il codice mio non andava bene? te lo riscrivo per intero:
Codice:
struct x {
	int dato;
};

void modify(struct x *p, int count) {
	for (int i = 0; i < count; i++) {
		p[i].dato = 3;
	}
}

int main() {
	struct x valori[10];
	modify(valori, 10);
	printf("valore == %d\n", valori[5].dato);
	return 0;
}

Ultima modifica di 71104 : 23-10-2007 alle 13:30.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:32   #12
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
l'istruzione p[i].a pensavo che fosse simile all'istruzione p.a, cioè pensavo che modificasse in locale il valore di a, come con l'operatore . mentre invece io volevo usare i puntatori..e credevo che ci soffe una cosa del gennere:
p -> a (se non fosse stata un array di strutture
p[n] -> (se fosse stato un array di strutture) - (l'obbrobbrio )

invece da quanto ho capito si deve fare p[n].a ....ho capito bene?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:38   #13
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
p[n] -> (se fosse stato un array di strutture) - (l'obbrobbrio )
p[n] -> a non è necessariamente un obbrobbrio: a seconda di come dichiari p ed n potrebbe essere perfettamente valido. una cosa che è sicuramente sbagliata invece è quella che hai fatto tu, ma più per errore ortografico credo:
Codice:
p[i] -> .dato
è il punto dopo la freccia che non va: due operatori binari non possono stare uno appresso all'altro in C.

Quote:
invece da quanto ho capito si deve fare p[n].a ....ho capito bene?
senza che ci stiamo a dilungare troppo... prova a compilare quel coso e fallo andare: è la migliore prova del funzionamento o del non funzionamento di un programma
bastano solo pochi secondi: il gcc è gratis. se non ti compila o non ti funziona torna qui e vediamo di che si tratta.
non fare come i miei colleghi universitari del primo anno, che quando c'era da consegnare il programma di laboratorio non solo non lo provavano ma neanche lo compilavano: incrociavano le dita...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 14:33   #14
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
si ora funziona grazie
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 19:50   #15
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
[C] realloc

edit
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
Verso la fine della TV tradizionale? I g...
Cassa JBL a 39€, portatili, smartphone, ...
Cometa interstellare 3I/ATLAS: la sonda ...
Jensen Huang e Bill Dally di NVIDIA prem...
Il futuro della birra è green: H...
ECOVACS GOAT G1-2000: il robot tagliaerb...
Allarme sui bus elettrici cinesi: centin...
iPhone Fold sempre più vicino: fo...
Soundbar Samsung da 150W con subwoofer i...
Tensione tra Nexperia e la controllata c...
Samsung e il futuro della smart cleaning...
Tinder: ecco come userà l'IA (e l...
Oltre 55.000 dollari solo per il raffred...
Microsoft e tecnologia immorale: i dipen...
Come stanno andando Fastweb e Vodafone d...
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: 15:34.


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