Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-09-2008, 13:36   #1
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
[C]Ultimi dubbi su funzioni e puntatori

Credo di avere gli ultimi dubbi sull'argomento programmazione in C (per ciò che mi serve), mettere insieme tutto ciò che ho imparato in questi giorni.
Dopo essere riuscito a realizzare lo stesso programma sotto riportato senza l'uso dei puntatori (quindi solo con la chiamata per valore), adesso vorrei appunto realizzarlo con un più efficiente chiamata per riferimento, ma le cose sono un po' più complicate.
Ecco una versione incompleta del programma, che immagazzina soltanto i dati richiesti (per renderlo più leggibile ho eliminato la parte che li visualizza, in cui avevo gli stessi dubbi):
Codice:
#include <stdio.h>

struct persona {
   char nome[25];
   char cognome[25];
   int eta;
};
typedef struct persona Persona;

void richiediDati (Persona *);

Persona dati[5], *wDati;
int numero;

main()
{
   char fine;

   printf ("Inserire il numero di dipendenti: ");
   scanf ("%d", &numero);
   richiediDati(dati);
   
   printf ("Digitare una lettera e premere invio per terminare. ");
   scanf ("%s", &fine);
   return 0;
}

void richiediDati (Persona *wDati)
{
   int i;

   wDati = &dati[0];

   printf ("Verranno ora richiesti i dati anagrafici relativi a %d dipendenti:\n\n", numero);
   
   for (i = 0; i <= (numero - 1); i++) {
      printf ("Inserire nome: ");
      scanf ("%s", wDati[i]->nome);
      printf ("Inserire cognome: ");
      scanf ("%s", wDati[i]->cognome);
      printf ("Inserire eta': ");
      scanf ("%d", &wDati[i]->eta); 
      printf ("********************\n\n");
   }
}
Il programma mi da' il seguente errore:

" base operand of `->' has non-pointer type `persona' "

Ecco i miei dubbi:
-Le funzioni dipendono da un puntatore a vettore "wDati": all'interno della funzione, ho passato l'indirizzo della variabile di struttura "dati" (che poi è un vettore di strutture) al puntatore. Dove sbaglio?
-So che un vettore è un puntatore che punta al suo primo elemento, per questo motivo ho eliminato [i] da ciascun ciclo for ed il programma funziona, ma ovviamente prende solo il primo dato. Perchè?
-Il programma funziona anche se sostituisco "->" con il ".", cosa che non mi aspettavo.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 15:35   #2
Noixe
Member
 
Iscritto dal: Aug 2008
Messaggi: 51
Nel ciclo for c'e' [i].

Inoltre quando scrivi

wDati[i]

hai gia dereferenziato il puntatore wDati quindi deviusare il punto e non l'operatore freccia per accedere al membro della struct.

Comunque wDati lo scorri per ogni dipendente senza aver allocato prima memoria, potresti riscontrare dei problemi, accedendo a locazioni di memoria gia utilizzate.
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 15:48   #3
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Quote:
Originariamente inviato da Noixe Guarda i messaggi
hai gia dereferenziato il puntatore wDati quindi deviusare il punto e non l'operatore freccia per accedere al membro della struct.
Ho capito. Ma quel mettere l'indice i nel ciclo for è ovviamente necessario a farlo funzionare, non esiste un modo per non deferenziare il puntatore e poter quindi utilizzare "->" al posto di "."? Oppure semplicemente non è possibile? Perchè usando il "." non sono più sicuro che si tratti di una chiamata per riferimento.
Quote:
Comunque wDati lo scorri per ogni dipendente senza aver allocato prima memoria, potresti riscontrare dei problemi, accedendo a locazioni di memoria gia utilizzate
Qui non mi è molto chiaro, cosa devo fare per ovviare?

Ultima modifica di Composition86 : 01-09-2008 alle 15:59.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 16:10   #4
Noixe
Member
 
Iscritto dal: Aug 2008
Messaggi: 51
Cosa centra la chiamata per riferimento?

Quella si fa relativamente al passaggio di parametri per le funzioni.

Il punto e la freccia si usano rispettivamente se hai un oggetto o un puntatore all'oggetto.

Per quanto riguarda l'array, non creare un puntatore a Persona, ma piuttosto dichiara questo:

Persona wDati[20];

In questo caso pero' puoi inserire al massimo i dati di 20 dipendenti, ma almeno le locazioni di memoria sono sicure.

Ultima modifica di Noixe : 01-09-2008 alle 16:41.
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 17:58   #5
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Voglio fare in modo di passare le funzioni per riferimento, e non per valore, quindi devo utilizzare i puntatori in qualche modo, cosa che sto cercando di capire.
Per questo motivo volevo utilizzare la freccia, in quanto la mia intenzione era di sfruttare i puntatori.

Quel puntatore *wDati che ho dichiarato di tipo persona, se non mi sto sbagliando, è del tutto inutile, in quanto non utilizzato nel main: il puntatore *wDati l'ho infatti definito nella funzione.

Correggimi se sbaglio.

Ti ringrazio per l'aiuto.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 18:21   #6
khelidan1980
Senior Member
 
L'Avatar di khelidan1980
 
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
il passaggio per riferimento già lo fai qui:


Codice:
void richiediDati (Persona *wDati)
e cmq imho ha un design pessimo questa applicazione,l'array che passi a richiesta dati sarà sempre vuoto,indi per cui quel parametro non è necessario,sicuramente c'è un modo migliore di scrivere l'applicazione
__________________
Khelidan

Ultima modifica di khelidan1980 : 01-09-2008 alle 18:23.
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 18:26   #7
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Ok. Ma poi vorrei capire questa cosa: effettivamente poi lavoro con i puntatori nella funzione?
Il dubbio mi viene dal fatto che l'uso del "." è tipico dei dati, quindi la mia impressione è che di fatto introduco i puntatori, ma poi non lavoro con gli indirizzi e quindi non capisco se il programma risulta essere realmente più efficiente.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 18:32   #8
khelidan1980
Senior Member
 
L'Avatar di khelidan1980
 
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Ok. Ma poi vorrei capire questa cosa: effettivamente poi lavoro con i puntatori nella funzione?
Il dubbio mi viene dal fatto che l'uso del "." è tipico dei dati, quindi la mia impressione è che di fatto introduco i puntatori, ma poi non lavoro con gli indirizzi e quindi non capisco se il programma risulta essere realmente più efficiente.
ma non centra niente poi cosa fai all'interno,li avviene il passaggio per riferimento perchè passi un puntatore ad una struttura,infatti non viene creata una copia della struttura ma bensì lavori su quella originale,che tu dopo utilizzi il punto oppure la freccia non centra con il passaggio per riferimento,userai punto o freccia a seconda se avrai bisogno di un puntatore al campo della struttura oppure no
__________________
Khelidan
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 18:42   #9
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Ok, allora su questo il problema non c'è, grazie.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 20:59   #10
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Codice:
void richiediDati (Persona *wDati)
{
   int i;

   wDati = &dati[0];
Blasfemia! E che ricevi a fare il puntatore?

Quando tu passi un puntatore ad una funzione, la stai informando del fatto che nella zona di memoria che ha inizio da dove indicato dal puntatore c'è uno o più elementi di uno stesso tipo. In questo modo, le dai la possibilità di modificare direttamente ciò che è contenuto in quella memoria, senza aggirare l'accesso con delle copie. Perciò, se tu le passi il puntatore non devi reimpostarlo appena la funzione inizia, altrimenti ti perdi l'unica informazione interessante per quel codice.

Ora, tu stai dicendo a quella funzione che nella locazione di memoria puntata da wDati c'è almeno una struct persona che puoi leggere o scrivere. Quando accedi ad uno degli elementi con la notazione wDati[i] stai già dereferenziando il puntatore in corrispondenza dell'i-esimo elemento di tipo struct persona a partire da quella locazione: dovrai quindi trattare non un puntatore, ma una semplice struttura dati (ai quali campi devi accedere con un punto, non con l'operatore freccia).
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2008, 14:05   #11
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Blasfemia! E che ricevi a fare il puntatore?

Quando tu passi un puntatore ad una funzione, la stai informando del fatto che nella zona di memoria che ha inizio da dove indicato dal puntatore c'è uno o più elementi di uno stesso tipo. In questo modo, le dai la possibilità di modificare direttamente ciò che è contenuto in quella memoria, senza aggirare l'accesso con delle copie. Perciò, se tu le passi il puntatore non devi reimpostarlo appena la funzione inizia, altrimenti ti perdi l'unica informazione interessante per quel codice.

Ora, tu stai dicendo a quella funzione che nella locazione di memoria puntata da wDati c'è almeno una struct persona che puoi leggere o scrivere. Quando accedi ad uno degli elementi con la notazione wDati[i] stai già dereferenziando il puntatore in corrispondenza dell'i-esimo elemento di tipo struct persona a partire da quella locazione: dovrai quindi trattare non un puntatore, ma una semplice struttura dati (ai quali campi devi accedere con un punto, non con l'operatore freccia).
Mi stai aiutando parecchio questi giorni, ti voglio sinceramente ringraziare per tutti i consigli che mi hai dato, precisi e veloci.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2008, 16:11   #12
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da Composition86 Guarda i messaggi
Mi stai aiutando parecchio questi giorni, ti voglio sinceramente ringraziare per tutti i consigli che mi hai dato, precisi e veloci.
Occhio che fra un po ti posta il conto PayPal...
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2008, 20:27   #13
Composition86
Senior Member
 
L'Avatar di Composition86
 
Iscritto dal: Jul 2005
Messaggi: 406
Speriamo di no!
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2008, 21:28   #14
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
In effetti, ora che ci penso...
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Toyota usa giochi e premi per spingere i...
HarmonyOS ha raggiunto la soglia di sopr...
Le offerte Amazon più convenienti...
Un gruppo di ladri ha usato Google Maps ...
Apple non si fida di Samsung per la real...
Windows 11: un nuovo driver nativo mette...
Vi hanno regalato buoni Amazon? Intanto ...
Via acari, polvere e sporco da materassi...
Cuffie Beats in super offerta su Amazon,...
Xbox Cloud Gaming arriva su Amazon Fire ...
Un blackout a San Francisco manda in til...
Windows 11 è diventato più...
Apple cambia strategia a causa della cri...
007 First Light: uscita rimandata di due...
Samsung Galaxy A37 e A57: il comparto fo...
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: 09:38.


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