Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Passare un vettore allocato dinamicamente
Forum - C/C++ - Passare un vettore allocato dinamicamente

Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 11:45
Giovedì, 23/02/2012
Ciao a tutti,

nel mio file header.h ho dichiarato un tipo "archivio" che è un vettore di struct "studente".
Voglio allocare dinamicamente un vettore di struct studente (quindi un elemento di tipo archivio) nella funzione "crea_archivio()" e restituirlo. Tuttavia ho un errore nel return:

"cannot convert ‘studente*’ to ‘studente (*)[50]’ in return    header.cpp"

secondo voi perché? Grazie

Header.h:
Codice sorgente - presumibilmente C++

  1. typedef char stringa[50];
  2. typedef struct studente{
  3.         int matricola;
  4.         stringa nome;
  5.         int numeroEsami;
  6. }studente;
  7. typedef studente archivio[50];



Header.cpp:
Codice sorgente - presumibilmente C/C++

  1. archivio* crea_archivio(){
  2.         archivio *newPtr;
  3.         newPtr=new archivio[50];
  4.         return *newPtr;
  5. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:04
Giovedì, 23/02/2012
Un elemento di tipo archivio è già un vettore di strutture studente ed è allocato staticamente.

Se vuoi allocare dinamicamente un vettore di struct studente ti consiglio di scrivere

Codice sorgente - presumibilmente C++

  1. typedef struct
  2. {
  3.     int matricola;
  4.     char nome[50];
  5.     int numeroEsami;
  6. } studente;
  7.  
  8. studente* crea_archivio()
  9. {
  10.      return (new studente[50]);
  11. }





Ultima modifica effettuata da nessuno il 23/02/2012 alle 12:15


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 12:55
Giovedì, 23/02/2012
Grazie mille! Ma poi come faccio a distinguere i puntatori a studente dai puntatori ad un vettore di elementi studente?

In pratica adesso dovrei inserire un record nel vettore dinamico che ho appena allocato, ma qual è la sintassi che devo usare?

Codice sorgente - presumibilmente C/C++

  1. void inserisci_record(studente* archPtr){ //vorrei passargli il puntatore al vettore
  2.         studente *studPtr;
  3.         studPtr=crea_record(); //studPtr diventa il punt ad una struttura studente che creo in crea_record()
  4.         *archPtr[0]=*studPtr; //vorrei inserire il record nel vettore ma così mi da un bel "No match for operator"


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:20
Giovedì, 23/02/2012
Accedi al primo elemento dell'array con

archPtr[0].matricola = ...
archPtr[0].numeroEsami = ...

al secondo con

archPtr[1].matricola = ...
archPtr[1].numeroEsami = ...

ma se non chiarisci cosa deve fare la funzione inserisci_record e quali parametri deve avere in input, non ti si può rispondere.

Considera che in un array non "inserisci" elementi (che ci sono già) ma assegni tutte le varie parti. Per capirci, devi anche indicare quale elemento dell'array utilizzare 0, 1, 2 ...

Ultima modifica effettuata da nessuno il 23/02/2012 alle 13:21


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 13:35
Giovedì, 23/02/2012
Ah quindi devo assegnare i campi della struttura ad uno ad uno.. okay!

In pratica la funzione preso in ingresso il record inizializzato deve inserirlo nell’archivio.. magari dovrebbe essere una cosa del genere?

Codice sorgente - presumibilmente C/C++

  1. void inserisci_record(studente *archPtr,studente *studPtr,int i){
  2.         *archPtr[i].matricola=*studPtr.matricola;
  3.         *archPtr[i].nome=*studPtr.nome;
  4.         *archPtr[i].numeroEsami=*studPtr.numeroEsami;



Credo di no perché mi dà già errore :S

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:45
Giovedì, 23/02/2012
Non hai ben chiaro l'uso dei puntatori e delle stringhe ... dovresti rivederli seriamente sul libro ...

Codice sorgente - presumibilmente C/C++

  1. void inserisci_record(studente *archPtr, studente *studPtr, int i)
  2. {
  3.     archPtr[i].matricola = studPtr->matricola;
  4.     strcpy(archPtr[i].nome, studPtr->nome);
  5.     archPtr[i].numeroEsami = studPtr->numeroEsami;
  6. }



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote