Come passare una struct ad un sottoprogramma?

di il
7 risposte

Come passare una struct ad un sottoprogramma?

La domanda è molto semplice: come posso passare una struct dal main ad un sottoprogramma (per riferimento)?

La struct in questione è:

    struct{
           int numero;
           int salita;
           int livello;
           } pista[10][20];
Ho provato a passarla nel seguente modo:

int main(){

    struct{
           int numero;
           int salita;
           int livello;
           } pista[10][20];

    nome_sottoprogramma(&pista[10][20]);

    return 0;
}

int nome_sottoprogramma(struct *pista[10][20]){
    return 0;
}
Ma il compilatore mi dice che non va bene. Come posso fare?

Scusate se è una domanda da principianti, ma proprio non ci riesco!

7 Risposte

  • Re: Come passare una struct ad un sottoprogramma?

    E' necessario definire la struttura pista esterna. Il main deve semplicemente allocarla staticamente o dinamicamente per poi passare l'indirizzo. La funz. deve prevedere il tipo di pointer -ecco perchè viene def esterna-
    Esempio:
    
    #include <stdio.h>
    struct pista
    {
      int numero;
      int salita;
      int livello;
    };
    
    void nome_sottoprogramma (struct pista *my_pista)
    {
      printf ("struct %p\nnumero=%d\nsalita=%d\nlivello=%d\n",my_pista,my_pista->numero,my_pista->salita,my_pista->livello);
    }
    
    int main(){
    
        struct pista my_pista[10][20];
        
        my_pista[1][10].numero=1;
        my_pista[1][10].salita=2;
        my_pista[1][10].livello=3;
        
        nome_sottoprogramma(&my_pista[1][10]);
    
        return 0;
    }
    
    Saluti,
    Max
  • Re: Come passare una struct ad un sottoprogramma?

    Ciao, grazie per la risposta, ma ancora non sono riuscito a passare la struct.. ecco cosa ho provato:
    Il main
    #include "mio_header.h"
    
    struct pista {                 
               int numero;
               int salita;
               int livello;
               };
    
    int main()
    {
        struct pista my_pista[10][20];
        crea_pista(&my_pista[10][20]);              // chiamata crea_pista
        return 0;
    }
    
    Il sottoprogramma
    void crea_pista (struct pista *my_pista)
    {
        int i,j,conta[1]={55,47};
        for (i = 0; i < 10; i++) {                                      // creazione tracciato con numero celle
            for (j = 0; j < 20; j++) {
                *my_pista[i][j]->salita = 0;                        //  qui mi segnala [color=#FF0000]errore[/color]
                *my_pista[i][j]->numero = 100;
                if (i == 0 || j == 19) {                                // prima riga e ultima colonna
                    *my_pista[i][j]->numero = (i + j);
                }
                if (i > 0 && j == 0) {                                  // prima colonna
                    *my_pista[i][j]->numero = conta[0];
                    conta[0] = conta[0] - 1;
                }
    
                if (i == 9) {                                           // ultima riga
                    *my_pista[i][j]->numero = conta[1];
                    conta[1] = conta[1] - 1;
                }
            }
        }
    }
    L'header
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    
    
    void lancio_dado(int *dado);
    void crea_pista (struct pista *my_pista);
    
    Gli errori sono (uso Code::Blocks:, ma il progetto l'ho iniziato con Dev-Cpp, per questo si trova in quella cartella)
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\mio_header.h|8|warning: "struct pista" declared inside parameter list|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\mio_header.h|8|warning: its scope is only this definition or declaration, which is probably not what you want|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c||In function `main':|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|251|warning: assignment makes integer from pointer without a cast|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|259|warning: assignment makes pointer from integer without a cast|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c||In function `crea_pista':|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|276|warning: excess elements in array initializer|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|276|warning: (near initialization for `conta')|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|279|error: subscripted value is neither array nor pointer|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|280|error: subscripted value is neither array nor pointer|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|282|error: subscripted value is neither array nor pointer|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|285|error: subscripted value is neither array nor pointer|
    C:\Dev-Cpp\Progetti\Progetto Corsa Biciclette\main.c|290|error: subscripted value is neither array nor pointer|
    ||=== Build finished: 5 errors, 6 warnings ===|
    
    Grazie in anticipo..
  • Re: Come passare una struct ad un sottoprogramma?

    Ritiro tutto, dopo diversi tentativi ci sono riuscito

    Ora però ho un'altro problema (per adesso lo scrivo qui, ma se devo aprire un'altro topic, chiudete pure).

    In pratica ho una matrice "char classifica [5][20]" che contiene i nomi dei cinque ciclisti, e un vettore "int tempo[]={0,0,0,0,0}" che va a contenere i tempi di ogni ciclista. Premetto che alla posizione 0 del vettore tempo verrà memorizzato progressivamente il tempo del primo ciclista, il cui nome è posizionato nella riga 0 della matrice classifica (lo stesso ragionamento vale per gli altri ciclisti).

    Ora, ho provato a implemenare un algoritmo di ordinamento che posiziona in ordine crescete gli elementi del vettore "tempo", ed effettua gli stessi cambiamenti sul vettore "classifica".

    Purtroppo dopo qualche cambiamento al programma, questo sottoprogramma non funziona più.. eccolo nel dettaglio:
    int el1,tempo[]={0,0,0,0,0}
    char classifica[5][20], el2[20];    
    
    for (i=1;i<5;i++) {                                                 // ordinamento tempi e ciclisti
            el1 = tempo[i];
            el2 = classifica[i];                                        //  errore
            j = i-1;
            while(j>=0 && el1 < tempo[j]) {
                tempo[j+1] = tempo[j];
                classifica[j+1] = classifica[j];                    //  errore
                j--;
            }
            tempo[j+1] = el1;
            classifica[j+1] = el2;                                     //  errore
        }
    L'errore viene segnato 3 volte: Incompatibile types in assignment

    Scusate se non sono stato molto chiaro, ma devo inviare questo progetto entro stasera..

    Grazie in anticipo a chiunque voglia aiutarmi, se servono altri dettagli basta chiedere.
  • Re: Come passare una struct ad un sottoprogramma?

    Scusami,
    avevo capito che volessi passare una struct come parametro e non tutto l'array di struct.
    Nel caso di array di struct il reference è forzato automaticamente.
    Esempio:
    
    #include <stdio.h>
    struct pista {                 
               int numero;
               int salita;
               int livello;
               };
    
    void crea_pista (struct pista my_pista[][20])
    {
      printf ("my_pista addess:%p \n",my_pista);
    }
    
    int main()
    {
        struct pista my_pista[10][20];
        
        printf ("my_pista address:%p \n",my_pista);
        crea_pista(my_pista);              // chiamata crea_pista
        return 0;
    }
    
    Saluti,
    Max
  • Re: Come passare una struct ad un sottoprogramma?

    Sarebbe meglio aprire un alro post...

    ~Max~

    EDIT:
    Dovresti mettere tutta la funzione di ordinamento e le variabili esterne (se dichiarate). Non è possibile capire da un pezzo incompleto!
  • Re: Come passare una struct ad un sottoprogramma?

    Daccordo, ora lo apro.

    Cmq grazie per la risposta di prima, ero io che mi ero spiegato male!
  • Re: Come passare una struct ad un sottoprogramma?

    Ciao, io ho un prolblema simile, devo incrementare i campi di una struttura tramite dei sottoprogrammi(funzioni),ma non ci riesco, non compila
    in pratica ho dichiarato la struttura globale


    typedef struct giocatore{ //struttura giocatore
    char nome[10];
    int jol;
    int punt_mano;
    int punt_tot;
    };
    e poi nel main ho inserito l'arrai di struttura

    struct giocatore player [d];
    player [d].punt_mano=0;
    player [d].punt_tot=0;
    player [d].jol=0;
    ora:se io voglio incrementare i campi dell array player[d], devo rinserire ladichiarazione di struttura(struct giocatore player [d] in ogni funzione in cui incremento???
    inoltre devo passarmi anche l'ordine dell array [d] ma mi da errore tipo...few arguments for function....
    comunque, inserendo la dichiarazione dell array player in ogni funzione in cui serve.. non mi da errori, ma quando arriva al punto diincrementare i campi , si blocca l'eseguibile e si stacca
    consigli???
Devi accedere o registrarti per scrivere nel forum
7 risposte