Struct in c, domanda teorica

di il
10 risposte

Struct in c, domanda teorica

Salve ragazzi, domani ho l'esame per il C.
Volevo porvi una domanda sulle struct:
Ho sentito dal professore, oppure ho capito io male, che quando dichiariamo una struct e successivamente dichgiariamo un array di quel tipo, non e' possibile il passaggio per "indirizzo" (sorta di passaggio per indirizzo del c).\
Per intenderci:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Rect 
{
    double x;
    double y;
    double w;
    double h;
} Rect;

Rect insereisci (Rect A[]) { //A e' un vettore
                            ......
                            ......
                            ......
                            return A;
}
Il problema che quando vado a fare il passaggio per valore dell'array nel main mi da errore il compilatore!!

10 Risposte

  • Re: Struct in c, domanda teorica

    Riformula. Non si capisce cosa vuoi fare. Comunque quella funzione è sintatticamente errata perché se vuoi fare return A non puoi avere Rect insereisci (Rect A[]) come prototipo, a prescindere dal problema
  • Re: Struct in c, domanda teorica

    Non devo fare nulla in ambito pratico, solo teorico ed hai risposto.
    Volevo sapere come comportarmi quando devo restituire un array di tipo struct al main.
    Se al posto di Rect A[], avessi avuto Rect *A potevo fare return A???
    Grazie mille!!!
  • Re: Struct in c, domanda teorica

    Il puntatore puoi restituirlo, anche se non serve (potresti pure avere void nel prototipo) perché l'array viene modificato direttamente se lo vai a scrivere.
    
    #include <stdio.h>
    
    typedef struct Rect 
    {
        double x;
        double y;
        double w;
        double h;
    } Rect;
    
    Rect * inserisci (Rect A[]) 
    { 
        A[0].x = 1.0;
        A[0].y = 2.0;
        A[0].w = 3.0;
        A[0].h = 4.0;
        return A;
    }
    
    int main()
    {
        Rect ARR[5];
        Rect * PTR = inserisci(ARR);
    
        printf("%f %f %f %f\n", ARR[0].x, ARR[0].y, ARR[0].w, ARR[0].h);   
        printf("%f %f %f %f\n", PTR[0].x, PTR[0].y, PTR[0].w, PTR[0].h);
    
        return 0;
    }
    
    Se l'array ti serve solo in lettura puoi mettere, ad esempio, void inserisci (const Rect A[]) se vuoi essere sicuro di non toccare l'array originale


    Solitamente restituire i puntatori ti serve con gli array dinamici
    
    #include <stdio.h>
    #include <stdlib.h> 
    
    typedef struct Rect 
    {
        double x;
        double y;
        double w;
        double h;
    } Rect;
    
    Rect * inserisci () 
    { 
        Rect * A = (Rect *)malloc(5 * sizeof(Rect));
        A[0].x = 1.0;
        A[0].y = 2.0;
        A[0].w = 3.0;
        A[0].h = 4.0;    
        return A;
    }
    
    int main()
    {
        Rect * PTR = inserisci();
     
        printf("%f %f %f %f\n", PTR[0].x, PTR[0].y, PTR[0].w, PTR[0].h);
    
        return 0;
    }
    
  • Re: Struct in c, domanda teorica

    Okay si, infatti l'esercizio mi diceva di ritornare un array di tipo Rect allocato dinamicamente.
    Quindi se ho capito bene non e' possibile ritornare l'array ma se lo dichiaro puntatore si, sempre tramite allocazione dinamica, giusto??
    Grazie!!
  • Re: Struct in c, domanda teorica

    Si devi dichiararlo puntatore. L'allocazione dinamica è obbligatoria, perché se dichiari staticamente un array nuovo all'interno della funzione, il puntatore che restituirai punterà a un area di memoria nello stack che non è più riservata a quell'array, non appena esci dalla funzione stessa, e potresti avere dei valori casuali
  • Re: Struct in c, domanda teorica

    Ultima domanda:
    
    void insereisci (Rect A[]) { 
                                 int i;
    
                                 for ( i = 0; i < N; i++)
                                    {
                                        scanf ("%f",& A[i].w);
                                        scanf ("%f",& A[i].h);
                                        printf ("Base: %f"\n, a[i].w);
                                        printf ("Altezza: %f\n", a[i].h);
                                    }
                                
    }
    In questo caso per ritornare l'array come dovrei fare??
    Perche se non ho capito male non e' possibile siccome e' dichiarato Rect, l'unico modo e' dichiararlo puntatore giusto? Dichiarandolo puntatore posso ritornarlo alla MAIN.
    Grazie, mi stai levando bei dubbi.
  • Re: Struct in c, domanda teorica

    Mi sa che non ho capito..
    Rect *insereisci (Rect *A) { 
                                 int i;
    
                                 for ( i = 0; i < N; i++)
                                    {
                                        scanf ("%f",& A[i].w);
                                        scanf ("%f",& A[i].h);
                                        printf ("Base: %f\n", A[i].w);
                                        printf ("Altezza: %f\n", A[i].h);
                                    }
                                return A;
    }
    int main {
    A = inserisci(A);
    }
    
    
    Mi da errore: implicitr declaration of fuction 'inserisci'
    e anche: assignment to expression with array type
    TUtte e due rivolte ad A = inserisci(A)
  • Re: Struct in c, domanda teorica

    pixxx ha scritto:


    Ultima domanda:
    
    void insereisci (Rect A[]) { 
                                 int i;
    
                                 for ( i = 0; i < N; i++)
                                    {
                                        scanf ("%f",& A[i].w);
                                        scanf ("%f",& A[i].h);
                                        printf ("Base: %f"\n, a[i].w);
                                        printf ("Altezza: %f\n", a[i].h);
                                    }
                                
    }
    In questo caso per ritornare l'array come dovrei fare??
    Perche se non ho capito male non e' possibile siccome e' dichiarato Rect, l'unico modo e' dichiararlo puntatore giusto? Dichiarandolo puntatore posso ritornarlo alla MAIN.
    Grazie, mi stai levando bei dubbi.
    In questo caso dichiari staticamente l'array nel main(), non hai bisogno di nessun return value
    
    #include <stdio.h>
    
    #define N 3
    
    typedef struct Rect 
    {
        double x;
        double y;
        double w;
        double h;
    } Rect;
    
    void inserisci (Rect A[]) 
    // equivalente a void inserisci (Rect * A) 
    {
        for (int i = 0; i < N; i++)
        {
            scanf ("%lf", &A[i].w);
            scanf ("%lf", &A[i].h);
            printf ("Base: %f\n", A[i].w);
            printf ("Altezza: %f\n", A[i].h);
        }
    }
    
    
    int main()
    {
        Rect ARR[N];
        inserisci(ARR);
     
        for (int i = 0; i < N; i++)
            printf("\n%f %f\n", ARR[i].w, ARR[i].h);
    
        return 0;
    }
    
  • Re: Struct in c, domanda teorica

    pixxx ha scritto:



    Mi da errore: implicitr declaration of fuction 'inserisci'
    Se il main() sta sopra alla funzione che chiami, devi dichiarare il prototipo della funzione che utilizzi prima del main(), altrimenti stai facendo una dichiarazione implicita perché il compilatore ancora non conosce quella funzione. Tutte cose che dovresti sapere il giorno prima di un esame...
  • Re: Struct in c, domanda teorica

    Tieni in mente che il vettore viene passato sempre per indirizzo, comunque dichiari la funzione.
    Quando ritorni il puntatore e lo assegni ad un puntatore nel main, hai due variabili che puntano allo stesso vettore. Il contenuto del vettore non viene mai copiato, a meno che non lo fai manualmente.
Devi accedere o registrarti per scrivere nel forum
10 risposte