Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9

    [C] Gestione pacchetti tramite funzione rand()

    Salve a tutti.Nel programma devo inviare ad una funzione un array di dieci elementi.La funzione deve copiarli in un altro array,succesivamente,deve restituire al main
    un valore casuale,che in base a quest'ultimo,continua ordinatamente ad inviare gli elementi dell'array oppure ripete di nuovo l'invio dell'ultimo elemento alla funzione.
    Allego il mio programma:
    codice:
    #include <stdio.h>
    #include <windows.h>
    #include <time.h>
    #include <stdlib.h>
    
    int destinatario(int pac[],int *conf){
    	
    	int ricevuti[4],j;
    	for(j=0;j<4;j++){
    		ricevuti[j]=pac[j];//copio l'intero array in un altro
    		srand(time(NULL));
    		*conf=rand()%2;//genero numero casuale e ritorno a mittente
    		if(*conf==1)
    			return 1;
    		else return 0;
    	}
    }
    
    void mittente(){
    	
    	int pacchetti[4]/*array pacchetti*/,i;
    	int conferma,risp;
    	
    	for(i=0;i<4;i++){
    		Sleep(2000);
    		printf("\n\nSpedizione pacchetto numero %d\n",i+1);
    		conferma=destinatario(pacchetti,&risp);//invio l'array a destinatario
    		Sleep(5000);
    		if(conferma==1){// condizioni per proseguire col prossino elemento oppure rinvio dello stesso.
    			printf("\nAck ricevuto\n");
    		}
    		else{
    			Sleep(2000);
    			printf("\nNack ricevuto\n");
    			i--;//qui decremento l'indice per la rispedizione del pacchetto
    		}
    		Sleep(2000);
    	}
    }
    
    main(){
    
    
    	printf("********************** SIMULAZIONE**********************\n");
    
    	Sleep(1000);
    
    	printf("\n\nInizio spedizione pacchetti........\n");
    	mittente();//invoco la funzione
    	
    	printf("\n********************** TERMINAZIONE SIMULAZIONE**********************\n");
    
    }
    .
    Provate ad eseguirlo,il problema è nella generazione del numero casuale,questo influisce l'invio o il rinvio degli elementi.
    Aspetto gentilmente un vostro consiglio.Vi ringrazio anticipatamente.

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Provo e ti faccio sapere.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    Ti ringrazio

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Dunque subito salta all'occhio che non inizializzi gli array. Male, male.

    Nella funzione di copia dell' array di fatto non copi proprio niente. Penso che tu abbia sbagliato il for: attualmente farà al piu' una copia, dato che il controllo successivo causerà il ritorno dalla funzione (che rand sia 0 o 1).

    Lo srand di solito va fatto una sola volta. Spostalo nel main.

    Con questo codice a me funziona. Dopo alcuni nack per i vari pacchetti, tutti e 4 vengono "spediti"

    codice:
    #include <stdio.h>
    #include <windows.h>
    #include <time.h>
    #include <stdlib.h>
    
    int destinatario(int pac[],int *conf){
    
    	int ricevuti[4],j;
    	for(j=0;j<4;j++){
    		ricevuti[j]=pac[j];//copio l'intero array in un altro
    	}
    		*conf=rand()%2;//genero numero casuale e ritorno a mittente
    		if(*conf==1)
    			return 1;
    		else return 0;
    }
    
    void mittente(){
    
    	int pacchetti[4]/*array pacchetti*/,i;
    	int conferma,risp;
    
    	for(i=0;i<4;i++){
    		printf("\n\nSpedizione pacchetto numero %d\n",i+1);
    		conferma=destinatario(pacchetti,&risp);//invio l'array a destinatario
    		if(conferma==1){// condizioni per proseguire col prossino elemento oppure rinvio dello stesso.
    			printf("\nAck ricevuto\n");
    		}
    		else{
    			printf("\nNack ricevuto\n");
    			i--;//qui decremento l'indice per la rispedizione del pacchetto
    		}
    	}
    }
    
    int main(){
    	
    	srand(time(NULL));
    
    	printf("********************** SIMULAZIONE**********************\n");
    
    
    	printf("\n\nInizio spedizione pacchetti........\n");
    	mittente();//invoco la funzione
    
    	printf("\n********************** TERMINAZIONE SIMULAZIONE**********************\n");
    
    }

    Ho tolto gli Sleep perchè non ce la facevo ad aspettare 30 anni per ogni output
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    Ti ringrazio vivamente xWolverinex. Oltre ad aver sbagliato la chiusura del for nella funzione,volevo chiederti come mai la srand non funzionava in destinatario?

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Non è che non funziona, puoi metterla quando ti pare.
    Ma il seme di solito si sceglie una volta.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

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.