[C]Variabili locali e return di funzioni

di il
4 risposte

[C]Variabili locali e return di funzioni

Salve a tutti, ho un dubbio. Posso in C, definire una variabile all'interno di un ciclo for, o di un blocco if/while e poi far ritornare dalla funzione quella variabile definita all'interno del ciclo/blocco. Vi posto un esempio di una funzione che compara gli indici pari di due vettori e restituisce un terzo vettore che ha negli indici dispari il contenuto del primo vettore e negli indici pari il massimo tra l'elemento i-esimo (di indice pari) di v1 e v2.

#include <stdio.h>
#include <stdlib.h>

float* maxDispari(float* v1, float* v2, int dim1, int dim2):

int main(int argo, char** argv){
	float*  v1[4] = {1.0,2.0,3.0,4.0}
	float*  v2[4] = {4.0,5.0,6.0,7.0}
	int dim1 = 4;
	int dim2 = 4;
	float* v3 = maxDispari(v1,v2,dim1,dim2);
	return 0;
}
	
float* maxDispari(float* v1, float* v2, int dim1, int dim2){
	if ((v1 == NULL && v2 == NULL) || (dim1 <= 0 && dim2 <= 0)){
		float* vec = NULL;
		return vec;
	}
	if (v1 == NULL || dim1 <= 0){
		float* vec = (float*)malloc(dim2*sizeof(float));
	}
	if (v2 == NULL || dim2 <= 0){
		float* vec = (float*)malloc(dim1*sizeof(float));
	}
	int max = 0;
	if (dim1 >= dim2){
		max = dim1;
	}else{
		max = dim2;
	}
	float* vec = (float*)malloc(max * sizeof(float));
	if (dim1 > dim2){
		for (int i = 0; i < dim2; i++){
			if((i+1)%2 == 0){
				if(v1[i] > v2[i]){
					vec[i] = v1[i];
				}else{
					vec[i] = v2[i];
				}
			}else{
				vec[i] = v1[i];
			}
		}
		for(int i = dim2; i < dim1; i++){
			vec[i] = v1[i];
		}
	}

	if (dim2 > dim1){
		for(int i = 0; i < dim1; i++){
			if ((i+1)%2 == 0){
				if (v1[i] > v2[i]){
					vec[i] = v1[i];
				}else{
					vec[i] = v2[i];
				}
			}else{
				vec[i] = v1[i];
			}
		}
		for(int i = dim1; i < dim2; i++){
			vec[i] = v2[i];
		}
	}

	if (dim1 == dim2){
		for (int i = 0; i < dim1 ;i++){
			if ((i+1) %2 == 0){
				if (v1[i] > v2[i]){
					vec[i] = v1[i];
				}else{
					vec[i] = v2[i];
				}
			}else{
				vec[i] = v1[i];
			}
		}
	}
	return vec;
}
Ovviamente il programma è castrato, non ci sono le funzioni per allocare gli array, le funzioni di stampa,ecc... Tutti i test sono effettuati da file. Ma quello su cui mi volevo concentrare è, la chiamata a float* vec nella funzione fatta nei primi tre if di controllo si può fare? (a tempo di compilazione mi da dei warning)
E se si float* vec = (float*)malloc(max * sizeof(float)); fatta prima dei cicli di controllo di lunghezza degli array posso inserirla all'intero del singolo if?

4 Risposte

  • Re: [C]Variabili locali e return di funzioni

    No, fai attenzione perché le variabili vec che hai utilizzato sono diverse una dall'altra. Se dichiarate nel blocco sono locali al blocco e non esistono all'esterno.

    Quella nella prima if va bene perché la utilizzi subito per il return. Ma se la chiamavi topolino era lo stesso, non ha alcun riferimento con le altre.

    Le altre due non vanno bene perché sono subito distrutte e nulla hanno a che vedere con l'altra che hai dichiarato in seguito.

    In pratica il tuo codice è equivalente a questo
    
    #include <stdio.h>
    #include <stdlib.h>
    
    float* maxDispari(float* v1, float* v2, int dim1, int dim2):
    
    int main(int argo, char** argv){
    	float*  v1[4] = {1.0,2.0,3.0,4.0}
    	float*  v2[4] = {4.0,5.0,6.0,7.0}
    	int dim1 = 4;
    	int dim2 = 4;
    	float* v3 = maxDispari(v1,v2,dim1,dim2);
    	return 0;
    }
    	
    float* maxDispari(float* v1, float* v2, int dim1, int dim2){
    	if ((v1 == NULL && v2 == NULL) || (dim1 <= 0 && dim2 <= 0)){
    		float* topolino = NULL;
    		return topolino;
    	}
    	if (v1 == NULL || dim1 <= 0){
    		float* paperino = (float*)malloc(dim2*sizeof(float));
    	}
    	if (v2 == NULL || dim2 <= 0){
    		float* pluto = (float*)malloc(dim1*sizeof(float));
    	}
    	int max = 0;
    	if (dim1 >= dim2){
    		max = dim1;
    	}else{
    		max = dim2;
    	}
    	float* vec = (float*)malloc(max * sizeof(float));
    	if (dim1 > dim2){
    		for (int i = 0; i < dim2; i++){
    			if((i+1)%2 == 0){
    				if(v1[i] > v2[i]){
    					vec[i] = v1[i];
    				}else{
    					vec[i] = v2[i];
    				}
    			}else{
    				vec[i] = v1[i];
    			}
    		}
    		for(int i = dim2; i < dim1; i++){
    			vec[i] = v1[i];
    		}
    	}
    
    	if (dim2 > dim1){
    		for(int i = 0; i < dim1; i++){
    			if ((i+1)%2 == 0){
    				if (v1[i] > v2[i]){
    					vec[i] = v1[i];
    				}else{
    					vec[i] = v2[i];
    				}
    			}else{
    				vec[i] = v1[i];
    			}
    		}
    		for(int i = dim1; i < dim2; i++){
    			vec[i] = v2[i];
    		}
    	}
    
    	if (dim1 == dim2){
    		for (int i = 0; i < dim1 ;i++){
    			if ((i+1) %2 == 0){
    				if (v1[i] > v2[i]){
    					vec[i] = v1[i];
    				}else{
    					vec[i] = v2[i];
    				}
    			}else{
    				vec[i] = v1[i];
    			}
    		}
    	}
    	return vec;
    }
    
    La tua funzione dovrebbe iniziare con
    
    
    float* maxDispari(float* v1, float* v2, int dim1, int dim2){
    	float* vec = NULL;
    
            ...
    
    
    	return vec;
    }
    e poi dovresti correggere il codice seguente
  • Re: [C]Variabili locali e return di funzioni

    Hai ragione ho sbagliato nel riscrivere la funzione ,l'ho riscritta e non copiata perché quella del programma richiama altre funzioni e strutture e sarebbe stato inutile spiegare un programma più complesso per una domanda singola. Quindi è corretto se mettessi in ogni if un return alla variabile creata nel blocco?
  • Re: [C]Variabili locali e return di funzioni

    Sì, in questo caso funzionerebbe ma non sarebbe un codice scritto bene, non sarebbe codice chiaro.

    Come ti dicevo, la cosa migliore è scrivere all'inizio

    float* vec = NULL;

    e poi, se vuoi restituire il valore NULL allora scrivi nella if direttamente

    return vec;

    oppure assegni un valore diverso

    vec = (float *) malloc ...

    e quando ti serve sempre

    return vec;
  • Re: [C]Variabili locali e return di funzioni

    oregon ha scritto:


    Sì, in questo caso funzionerebbe ma non sarebbe un codice scritto bene, non sarebbe codice chiaro.

    Come ti dicevo, la cosa migliore è scrivere all'inizio

    float* vec = NULL;

    e poi, se vuoi restituire il valore NULL allora scrivi nella if direttamente

    return vec;

    oppure assegni un valore diverso

    vec = (float *) malloc ...

    e quando ti serve sempre

    return vec;
    Mi sono accorto che qualcosa non andava quando avevo dei warning in compilazione anche se la correttezza dell'applicativo c'è ma è sempre meglio rispettare una teoria e le giuste regole della programmazione grazie mille sempre molto chiaro e gentile.
Devi accedere o registrarti per scrivere nel forum
4 risposte