Esercizi con struct e puntatori ad array

di il
4 risposte

Esercizi con struct e puntatori ad array

Ciao a tutti mi sto esercitando sulla sintassi delle struct e puntatori.

Sebbene il compilatore non mi dia nessun errore  (però il programma si pianta)  penso che commetto degli errori di sintassi:

Ad esempio:

return new triangolo {x[2],y[2],z[2]};

La funzione scritta così mi restituirà solo un valore  per ogni array

triangolo *puntoA = new triangolo {(1,2,3),(4,5,6),(6,7,8)};

Anche qui non sono convinto: sarebbero 3 array se uso le paretesi quadre il compilatore mi dà errore

Sotto il codice completo

#include <iostream>

using namespace std;

struct triangolo
{
 long double  x[2];
 long double  y[2];
 long double  z[2];
};

triangolo *punto_medio(triangolo *a, triangolo *b)
{
    long double  *x = new long double[2];
    long double  *y = new long double[2];
    long double  *z = new long double[2];


    for (int i=0; i<3; i++)
    {
        x[i] = (a->x[i] + b->x[i]) /2;
        y[i] = (a->y[i] + b->y[i]) /2;
        z[i] = (a->z[i] + b->z[i]) /2;
    }


    return new triangolo {x[2],y[2],z[2]};  
}

int main()
{

    triangolo *puntoA = new triangolo {(1,2,3),(4,5,6),(6,7,8)};
    triangolo *puntoB = new triangolo {(10,20,30), (40,50,60),(60,70,80)};

    triangolo *medio = punto_medio(puntoA, puntoB);

    cout << "x" << medio->x[0];
    return 0;
}

4 Risposte

  • Re: Esercizi con struct e puntatori ad array

    Cominciamo dalla struct…

    Cosa descrive quella struttura? Cosa sono i due valori perx, per y e per z? 

  • Re: Esercizi con struct e puntatori ad array

    Sebbene il compilatore non mi dia nessun errore  (però il programma si pianta)  penso che commetto degli errori di sintassi:

    Il compilatore corregge gli errori di sintassi, di conseguenza la sintassi è corretta,

    hai commesso uno sfondamento di memoria , cosa veramente orribile su 40 line di codice .

    Se usi la new DEVI richiamare la delete altrimenti non liberi memoria.

    ti do' una dritta : non utilizzare numeri, all'interno del codice come ad esempio: “x[2]” ma utilizza x[ NDIMENSIONE ] o un altra parole che ti torna più familiare 

    #define NDIMENSIONE 2

    Secondo te in queto pezzo di codice:

    triangolo *punto_medio(triangolo *a, triangolo *b)
    {
    	long double  *x = new long double[2];
    	...
    
        for (int i=0; i<3; i++)
        {
            x[i] = ....
            

    lasciando stare il significato delle operazioni geometriche, a livello di logica di programmazione (indici, allocazione memoria, puntatori , array, etc.etc.) è tutto ok ?

    1. quanti elementi ha il vettore x allocato dinamicamente ? 2 o 3 ?
    2. quali sono gli indici del vettore x ? se volessi accedere al primo elemento del vettore X dovrei scrivere x[0] o x[1] ?
    3. se voglio accedere all'ultimo elemento del vettore X devo scrivere x[1] o x[2] ?
    4. l'indice dentro il for “i” parte da 0 e fino dove arriva ?

    ( praticamente ti ho detto dove stai toppando )

    rivede bene con attenzione tutto il codice .

  • Re: Esercizi con struct e puntatori ad array

    31/12/2023 - LukeSkyWalker ha scritto:


    1. quanti elementi ha il vettore x allocato dinamicamente ? 2 o 3 ?    3
    2. quali sono gli indici del vettore x ? se volessi accedere al primo elemento del vettore X dovrei scrivere x[0] o x[1] ?    0
    3. se voglio accedere all'ultimo elemento del vettore X devo scrivere x[1] o x[2] ?   2
    4. l'indice dentro il for “i” parte da 0 e fino dove arriva ? 

    ( praticamente ti ho detto dove stai toppando )

    rivede bene con attenzione tutto il codice .

    Grazie per la risposta esaustiva.

    Generalmente non capisco una cosa:

    Come faccio a restituire una struct  con dentro  degli array (a livello sintattico) con il return di una funzione correttamente?

  • Re: Esercizi con struct e puntatori ad array

    Come faccio a restituire una struct  con dentro  degli array (a livello sintattico) con il return di una funzione correttamente?

    puoi usare anche return di una struttura fregandotene di cosa ci sia dentro la struct (array, o  strutture annidate, stringhe, etc etc )

    struct pluto{
    	char* nome;
    	int età;
    	...
    	...altri campi ....
    };
    
    struct pippo{
    	int array[100];
    	pluto struttura_annidata;
    	.......
    	.......altri campi ....
    	....
    	
    };
    
    

    passaggio per valore, funziona non hai problemi di nessun tipo, ma non è il massimo dell'efficienza

    pippo get_pippo(){
    	pippo ret:
    	
    	ret.array[0] = 100;
    	...
    	ret.array[99] = 1;	
    	...
    	ret.struttura_annidata.nome = "mi chiamo pluto";
    	...
    	ret.struttura_annidata.eta' = 1000;
    	
    	return ret;
    }
    
    void main(){
    	...
    	pippo* pippo_ptr_1 = new pippo* ; // devi allocare senza inizializzare
    	
    	// usiamo l'aseterisco per accedere al valore del puntatore , a.k.a. passaggio per valore 
    	*pippo_ptr_1 = get_pippo(); 
    	
    	delete pippo_ptr_1; // devi deallocare pippo_ptr_1
    }

    se usi puntatori meglio qualcosa del tipo, passaggio per puntatore , molto più performante

    void get_pippo_ptr(	pippo* input_1,
    					pippo* input_2,
    					pippo* output) {
    
    	output->array[12] = input_1->array[12] + iput_2->array[12];
    	....
    	output->array[92] = input_1->array[92] + iput_2->array[92];
    	....
    	
    }
    
    void main(){
    	pippo* pippo_ptr_1 = new pippo* { inizializzo valori }; // devi allocare, e se è necessario inizializzare pippo_ptr_1
    	pippo* pippo_ptr_2 = new pippo* { inizializzo valori }; // devi allocare, e se è necessario inizializzare pippo_ptr_2
    	pippo* pippo_ptr_output = new pippo*; // devi solo allocare pippo_ptr_output
    	
    	........
    	get_pippo_ptr(main_input_1,main_input_2,pippo_ptr_output); 	
    	
    	cout << " array 12 " << pippo_ptr_output->array[12] << endl;
    	
    	delete pippo_ptr_1; // devi deallocare (liberare memoria) pippo_ptr_1
    	delete pippo_ptr_2; // devi deallocare (liberare memoria) pippo_ptr_2
    	delete pippo_ptr_output; // devi deallocare (liberare memoria) pippo_ptr_output	
    }

    ci sono altri 1000 modi per usare i puntatoi come argomenti o restituzione dei valori, questo è solo un esempio.

    appena puoi correggi il codice e ripostalo così vediamo se ci sono altri problemi.

Devi accedere o registrarti per scrivere nel forum
4 risposte