Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Funzione con array in ritorno

    Devo fare una funzione che dia come ritorno un array, dati in input 2 array e la loro dimensione. Questa funzione deve inserire nel terzo array(quello in ritorno) i valori alternati dei primi 2 array e inserire nell'ultimo posto la somma di tutti gli elementi di questo array.

    Per spiegarmi meglio, questo terzo array dovrebbe essere composto nel modo seguente: {v1_1, v2_1, v1_2, v2_2,....,v1_n,v2_n, (v1_1+v2_1+v1_2+v2_2+...+v1_n+v2_n)}. Dove v1_k e v2_k sono gli elementi k-esimi del primo vettore e del secondo.

    Vi faccio vedere come ho fatto:

    codice:
    int* alterna(int *vett1, int *vett2, int n)
    {
    	int* vett3;
    	int i=0;
    	int s=0;
    	vett3=malloc(MAX*sizeof(int));
    	for(i=0;i<2*n;i++)
    	{
    		*vett3=*(vett1+i); //l'i-esimo elemento di vett1 viene assegnato al primo elemento di vett3
    		vett3++;
    		vett3++;
    	}
    	for(i=0;i<2*n;i++)
    	{
    		vett3++;		
    		*vett3=*(vett2+i);
    		vett3++;
    	}
    	
    	for(i=0;i<2*n;i++)
    	{
    		s+=vett3[i];
    	}
    	vett3[2*n+1]=s;
    	
    	return vett3;
    }
    mentre il file main è così:
    codice:
    #include <stdio.h>
    #include "logic.h"
    #include <malloc.h>
    #define MAX 50
    
    int main()
    {
    	int vett1[MAX];
    	int vett2[MAX];
    	int* vett3=NULL;
    	int n, i;
    	printf("Inserire la dimensione degli array\n");
    	scanf("%d", &n);
    
    	vett3=malloc((2*n)+1*sizeof(int));
    
    	printf("Digitare gli elementi del primo array\n");
    	for(i=0;i<n;i++)
    		scanf("%d", &vett1[i]);
    
    	printf("Digitare gli elementi del secondo array\n");
    	for(i=0;i<n;i++)
    		scanf("%d", &vett2[i]);
    
    	vett3=alterna(vett1, vett2, n);
    
    	for(i=0;i<(2*n)+1;i++)
    		printf("%d ", vett3[i]);
    	printf("\n");
    
    
    	return 0;
    }
    Il programma si compila, ma alla fine viene stampato un array che è composto solo da 0, e non riesco a capire dove ho sbagliato. Qualcuno mi può aiutare?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Secondo me il problema è che all'interno della funzione fai troppe iterazioni

  3. #3
    Originariamente inviato da Marco1995
    Secondo me il problema è che all'interno della funzione fai troppe iterazioni
    Effettivamente, i cicli sono un po' ridondanti, ma ora ho semplificato e ottengo lo stesso risultato di prima:

    codice:
    for(i=0;i<2*n;i++)
    	{
    		*vett3=*(vett1+i); //l'i-esimo elemento di vett1 viene assegnato al primo elemento di vett3
    		vett3++;
    		*vett3=*(vett2+i); //l'i-esimo elemento di vett2 viene assegnato all'elemento di vett3 successivo
    		vett3++;
    	}

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Il problema è che vai a memorizzare i dati in locazioni sbagliate,molto probabilmente il tuo compilatore inizializza gli array a 0,ed è per questo che visualizzi sempre "zeri".Il mio compilatore non inizializza gli array a zero,infatti appena ho provato il codice da te postato ho visualizzato in output valori casuali.
    Ad ogni modo io avrei fatto in questo modo (utilizzando un unico ciclo for):
    codice:
    for(i=0;i<n;i++)
    	{
    
     vett3[indice++] = vett1[i]; //l'i-esimo elemento di vett1 viene assegnato al primo  elemento di       vett3
              vett3[indice++] = vett2[i];
        }
    dove indice è una variabile inizializzata a 0...
    Il codice che hai postato non va bene perchè va in indici non rilevanti

  5. #5
    Originariamente inviato da Marco1995
    Il problema è che vai a memorizzare i dati in locazioni sbagliate,molto probabilmente il tuo compilatore inizializza gli array a 0,ed è per questo che visualizzi sempre "zeri".Il mio compilatore non inizializza gli array a zero,infatti appena ho provato il codice da te postato ho visualizzato in output valori casuali.
    Ad ogni modo io avrei fatto in questo modo (utilizzando un unico ciclo for):
    codice:
    for(i=0;i<n;i++)
    	{
    
     vett3[indice++] = vett1[i]; //l'i-esimo elemento di vett1 viene assegnato al primo  elemento di       vett3
              vett3[indice++] = vett2[i];
        }
    dove indice è una variabile inizializzata a 0...
    Il codice che hai postato non va bene perchè va in indici non rilevanti
    Grazie mille per l'aiuto, adesso ho capito dove sbagliavo riguardando di nuovo il codice ho poi notato altre ingenuità che prima non avevo visto (come il fatto di assegnare il valore della somma all'elemento 2n+1, piuttosto che a quello 2n)

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Morale della favola:Stai ben attento a dove memorizzi i dati...e a dove vai a rileggerli,pena risultati inattesi ma sopratutto cerca di utilizzare una soluzione più lineare possibile.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.