|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2003
Messaggi: 2002
|
[C/C++] Problemi nell'allocazione di un'array si strutture
Salve a tutti, vorrei un aiuto per un piccolo problema.
Ho scritto un programma e vi riporto il codice: Codice:
#include <cstdlib>
#include <iostream>
#define SLEN 256
#define ARRAYSIZE 5
#define NUMNODI 3
struct clienti{
bool flag;
char filename[SLEN];
double Xcoords[ARRAYSIZE];
double Ycoords[ARRAYSIZE];
};
struct clienti* funzione(void);
int main(int argc, char *argv[])
{
int i,j=0;
struct clienti *ptr=NULL;
ptr=funzione();
if(ptr==NULL){
printf("ptr null!\n");
exit(-1);
}
for(j=0;j<NUMNODI;j++){
printf("%s\n",ptr[j].filename);
for( i=0;i<ARRAYSIZE;i++)
printf("1 - %.2f\n",ptr[j].Xcoords[i]);
for( i=0;i<ARRAYSIZE;i++)
printf("2 - %.2f\n",ptr[j].Ycoords[i]);
}
free(ptr);
return 0;
}
struct clienti* funzione(void){
char buffer[SLEN];
int i,j;
int randm;
struct clienti *nodo;
if (!(nodo=(struct clienti*)malloc(NUMNODI*sizeof(struct clienti)))){
printf("Memoria non allocabile!\n");
return NULL;
}
for(j=0;j<NUMNODI;j++){
printf("Inserisci il nome:");
scanf("%s",buffer);
strcpy(nodo[j].filename,buffer);
for( i=0;i<ARRAYSIZE;i++)
nodo[j].Xcoords[i]=1+rand()%100;
for( i=0;i<ARRAYSIZE;i++)
nodo[j].Ycoords[i]=1+rand()%100;
}
return nodo;
}
Funzione dal canto suo crea un'array di stutture clienti, fa alcune operazioni e restituisce il puntatore all'array di strutture. Il programma è compilato e funziona bene ma.........non dovrei usare l'operatore -> per riferirmi ai campi delle singole strutture piuttosto che il punto . Quando ho provato con -> il compilatore mi sputa fuori che: base operand of `->' has non-pointer type `clienti' . Qualche suggerimento?
__________________
Trattative sul mercatino del forum:tante e mai un problema! Controlla pure i miei vecchi post |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2003
Messaggi: 2002
|
nessun aiutino
__________________
Trattative sul mercatino del forum:tante e mai un problema! Controlla pure i miei vecchi post |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
|
Be' la risposta te l'ha data il compilatore.
L'indicizzazione nodo[j] fa si' che tu ti riferisca al j-iesimo elemento dell'array di strutture... mentre l'operatore "freccia" si usa col puntatore. Insomma o usi: (nodo+j)->Xcoords[i] o usi: nodo[j].Xcoords[i] ... o ancora: (*(nodo+j)).Xcoords[i] Cioe' si usa "." quando si accede direttamente a variabili di tipo struttura... mentre l'operatore "->" si usa quando si accede tramite l'indirizzo, il puntatore alla struttura. Ultima modifica di BrutPitt : 26-05-2009 alle 01:59. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2003
Messaggi: 2002
|
Quote:
grazie di tutto.
__________________
Trattative sul mercatino del forum:tante e mai un problema! Controlla pure i miei vecchi post |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
|
Quote:
La potenza dei "puntatori" risiede in altro... ti modifico la tua funzione: Codice:
struct clienti* funzione(void){
char buffer[SLEN];
int i,j;
int randm;
struct clienti *nodo,*ptrNodo; //copia di nodo.
if (!(nodo=(struct clienti*)malloc(NUMNODI*sizeof(struct clienti)))){
printf("Memoria non allocabile!\n");
return NULL;
}
ptrNodo=nodo; //copio l'indirizzo di memoria appena allocato
for(j=0;j<NUMNODI;j++){
printf("Inserisci il nome:");
scanf("%s",buffer);
strcpy(ptrNodo->filename,buffer); //accedo tramite puntatore
for( i=0;i<ARRAYSIZE;i++)
ptrNodo->Xcoords[i]=1+rand()%100; //accedo tramite puntatore
for( i=0;i<ARRAYSIZE;i++)
ptrNodo->Ycoords[i]=1+rand()%100; //accedo tramite puntatore
ptrNodo++; //incremento la copia del puntatore
}
return nodo;
}
si evita che ad ogni accesso alla struttura il programma calcoli indirizzo+spiazzamento... (nodo+j) o nodo[j]... incrementando invece direttamente, una sola volta a ciclo, l'indirizzo contenuto in ptrNodo. Due cosniderazioni: 1) E' necessario fare una copia dell'indirizzo e non agire direttamente su nodo, perche' alla fine del ciclo ptrNodo puntera' all'ultimo elemento, mentre bisogna far "ritornare" l'indirizzo al primo elemento dell'array di strutture. 2) Il codice sarebbe ulteriormente ottimizzabile, ma lasciandolo piu' vicino possibile all'originale si evidenziano meglio le differenze. Ultima modifica di BrutPitt : 26-05-2009 alle 18:41. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2003
Messaggi: 2002
|
Quote:
Se hai qualche ottimizzazione da suggerirmi fallo pure, ogni consiglio è sempre molto gradito.
__________________
Trattative sul mercatino del forum:tante e mai un problema! Controlla pure i miei vecchi post |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
|
Quote:
Codice:
struct clienti* funzione(void){
char buffer[SLEN];
int i;
int randm;
struct clienti *nodo, *ptrNodo, *ptrEnd; //copia di nodo e indirizzo fineciclo
if (!(nodo=(struct clienti*)malloc(NUMNODI*sizeof(struct clienti)))){
printf("Memoria non allocabile!\n");
return NULL;
}
ptrEnd = nodo+NUMNODI; //identifico "indirizzo" di fine array...
//cosi' gestsisco il ciclo con gli indirizzi
for(ptrNodo=nodo; ptrNodo<ptrEnd; ptrNodo++){
printf("Inserisci il nome:");
scanf("%s",buffer);
strcpy(ptrNodo->filename,buffer); //accedo tramite puntatore
for( i=0;i<ARRAYSIZE;i++)
ptrNodo->Xcoords[i]=1+rand()%100; //accedo tramite puntatore
for( i=0;i<ARRAYSIZE;i++)
ptrNodo->Ycoords[i]=1+rand()%100; //accedo tramite puntatore
}
return nodo;
}
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2003
Messaggi: 2002
|
Quote:
__________________
Trattative sul mercatino del forum:tante e mai un problema! Controlla pure i miei vecchi post |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:56.




















