Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Star Wars Zero Company è l'erede di XCOM 2
Star Wars Zero Company è l'erede di XCOM 2
Bit Reactor porta nell’universo di Star Wars una struttura tattica che richiama apertamente XCOM 2, ma la arricchisce con legami tra i personaggi, progressione ruolistica, gestione della base e un sistema di combattimento costruito attorno a tre Punti Azione e alle risorse condivise della squadra
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-09-2008, 12: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, 14: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, 14: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 14:59.
Composition86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 15: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 15:41.
Noixe è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 16: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, 17: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 17:23.
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 01-09-2008, 17: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, 17: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, 17: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, 19: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, 13: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, 15: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, 19: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, 20: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


Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Oracle, stock option da quasi un miliard...
Starship: si è conclusa anticipat...
Un computer quantistico ha funzionato ne...
Sovranità sui dati: AWS è ...
Il nuovo nome della distro Linux mobile ...
Due ventole da 220 mm e non solo: Cooler...
Truffa telefonica via Google Ads: il bro...
Google pensiona le Gems di Gemini: cosa ...
Flight 14: incertezza per un problema a ...
C'è un problema con i robot Tesla: i dip...
Raggi gamma anomali dalla Via Lattea sve...
NIO vende il 30% della divisione scambio...
Sony brevetta un DualSense capace di acc...
Un volto per l'assistenza IA: cosa pu&og...
NVIDIA autorizza un buyback da 150 milia...
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: 17:22.


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