Comunque così come ho messo prima non mi funziona .. cioè compila senza dar errore ma non mi da il risultato che volevo
Comunque così come ho messo prima non mi funziona .. cioè compila senza dar errore ma non mi da il risultato che volevo
Ultima modifica di tommasoperilli; 11-05-2014 a 20:15
Io non ho la minima idea di cosa deve fare il programma , noi ti possiamo indicare errori nel linguaggio ....
Ma la logica del programma "algoritmo" lo devi conoscere tu , se il programma non fa quello che volevi e non ci sono errori nel codice
hai sbagliato l'algoritmo e o l'implementazione ...........
Tecnologia
Oltre ad essere d'accordo con torn aggiungo che in un thread in genere si parla di un solo problema delimitato. Quando si discute per decine di post su tutto quello che riguarda un esercizio, dai problemi di include all'ultima variabile di decine di funzioni, si perde il filo del discorso e diventa veramente difficile rispondere.
No MP tecnici (non rispondo nemmeno!), usa il forum.
Questa è la traccia:
Realizzare un job scheduler che abbia le seguendi funzionalità:accodamento job
schedulazione prossimo job secondo le politiche sjf
simulazione job già eseguire
e il programma che è questo:
Il problema che dicevo prima è che, quando vado a visualizzare i job presenti in memoria, visualizzo SOLO l'ultimo job inserito, quindi il problema è presente in questa procedura:codice:#include <stdio.h>#include <stdlib.h> #include <string.h> #define MAX 20 void eliminatejob(char job[][20],int tempo[0],int esec[0]); void visualmenu(); void scelta(int *N); void gestione(int N,char job[][20],int tempo[0],int esec[0],int *j); void insjob(char job[][20],int tempo[0],int esec[0],int *j); void visualjob(char job[][20],int tempo[0],int esec[0]); void execute(char job[][20],int tempo[0],int esec[0]); void inizializzazione(char job[][20]); int main(){ char job[MAX][20]; int tempo [MAX]; int esec[MAX]; int N; int j=0; printf("\t\t\t\tSCHEDULAZIONE"); inizializzazione(job); do{ visualmenu(); scelta(&N); gestione(N,job,tempo,esec,&j); }while(N!=5); system("PAUSE"); return 0; } void inizializzazione(char job[][20]){ int i; for(i=0;i<MAX;i++) job[i][0]='x'; return; } void visualmenu(){ printf("\n\n\tMENU: \n"); printf("\n\t1:Inserisci job"); printf("\n\t2:Esegui job"); printf("\n\t3:Elimina job eseguiti"); printf("\n\t4:Visualizza job presenti"); printf("\n\t5:Exit"); return; } void scelta(int *N){ printf("\n\n\tScelta: "); scanf("%d",N); while((*N<1)||(*N>5)){ printf("Errore"); printf("Scelta: "); scanf("%d",N); } return; } void gestione(int N,char job[][20],int tempo[0],int esec[0],int *j){ switch(N){ case 1: insjob(job,tempo,esec,j); break; case 2: execute(job,tempo,esec); break; case 3:eliminatejob(job,tempo,esec); break; case 4: visualjob(job,tempo,esec); break; } return; } void insjob(char job[][20],int tempo[0],int esec[0],int *j){ if(*j!=MAX){ printf("\n\tInserisci nome: "); scanf("%s",&job[*j]); printf("\n\tInserisci tempo di esecuzione: "); scanf("%d",&tempo[*j]); esec[*j]=0; *j++; }else{ printf("\n\t!! Memoria piena, impossibile inserire altri job !!"); } return; } void visualjob(char job[][20],int tempo[0],int esec[0]){ int i; printf("\n\tProgrammi in memoria - Tempo di esecuzione - Programmi eseguiti\n"); for(i=0;(i<MAX);i++){ if(job[i][0]!='x'){ printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]); } } return; } void execute(char job[][20],int tempo[0],int esec[0]){ int minore,indice,i; indice = 0; minore = tempo[0]; for(i=0;i<MAX;i++){ if(job[i][0]!='x'){ if(tempo[i]<minore){ minore = tempo[i]; indice = i; } } } printf("Programma in esecuzione: %s",job[indice]); sleep(tempo[indice]); esec[indice] = 1; return; } void eliminatejob(char job[][20],int tempo[0],int esec[0]){ int i; for(i=0;i<MAX;i++){ if(job[i][0] != 'x'){ if(esec[i] = 1){ job[i][0] = 'x'; tempo[i] = 0; esec[i] = 0; } } } printf("Programmi rimasti: "); for(i=0;(i<MAX);i++){ if(job[i][0]!='x'){ printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]); } } return; }
e con torn stavamo appunto parlando che c'era un errore nel passaggio dei parametri. Così come sta il programma, compilandolo non mi da nessun errore ma comunque quando vado a visualizzare i job inseriti mi risulta solo l'ultimo ...codice:void insjob(char job[][20],int tempo[0],int esec[0],int *j){ if(*j!=MAX){ printf("\n\tInserisci nome: "); scanf("%s",&job[*j]); printf("\n\tInserisci tempo di esecuzione: "); scanf("%d",&tempo[*j]); esec[*j]=0; *j++; }else{ printf("\n\t!! Memoria piena, impossibile inserire altri job !!"); } return; }
Premetto che ho commesso il tuo stesso errore di valutazione , e ho trovato il problema dopo averci
pensato un po
*j++ , apparentemente si potrebbe pensare che incrementa di 1 il valore
ma per questione di precedenza di operatori , incrementa di uno il puntatore e poi dereferenzia
quindi o usi le parentesi per cambiare la precedenza o usi l'operatore +=1
codice:void insjob(char job[][20],int tempo[0],int esec[0],int*j){ if(*j!=MAX){ printf("\n\tInserisci nome: "); scanf("%s",&job[*j]); printf("\n\tInserisci tempo di esecuzione: "); scanf("%d",&tempo[*j]); esec[*j]=0; //*j++; (*j)++; }else{ printf("\n\t!! Memoria piena, impossibile inserire altri job !!"); } return; }
Tecnologia
Grazie mille torn, ci avevo pensato anche io. Ultima cosa, quando vado a eseguire un job, lui mi esegue il job che è più veloce quindi con il minor tempo di esecuzione e va benissimo fino qui, poi quando vado a eliminare i job eseguiti, non mi fa visualizzare i job rimasti, come se li eliminasse tutti quanti e invece dovrebbe eliminare solo il job eseguito ..
Guardandolo così sembra che non ci sia nessun problema perchè, ogni for visualizza solo i job inseriti e non quelli che hanno la 'x' diciamo così, dopo che ho eseguito il job gli da il nome 'x' così non lo visualizza e simula l'eliminazione. Il problema è che sembra che gli elimina tutti ..codice:void execute(char job[][20],int tempo[0],int esec[0]){ int minore,indice,i; indice = 0; minore = tempo[0]; for(i=0;i<MAX;i++){ if(job[i][0]!='x'){ if(tempo[i]<minore){ minore = tempo[i]; indice = i; } } } printf("Programma in esecuzione: %s",job[indice]); sleep(tempo[indice]*100); esec[indice] = 1; job[indice][0] = 'x'; return; } void eliminatejob(char job[][20],int tempo[0],int esec[0]){ int i; for(i=0;i<MAX;i++){ if(job[i][0] != 'x'){ if(esec[i] = 1){ job[i][0] = 'x'; tempo[i] = 0; esec[i] = 0; } } } printf("Programmi rimasti: "); for(i=0;(i<MAX);i++){ if(job[i][0]!='x'){ printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]); } } return; }![]()
eliminajob()
------------------
if(esec[i]=1){
----------------
if(esec[i]==1){
Tecnologia
Madonna che errore idiota, grazie![]()