PDA

Visualizza la versione completa : [C] Problemino in un programma


tommasoperilli
10-05-2014, 16:30
Ho un problema nel seguente programma:

#include <stdio.h>#include <stdlib.h>
#include <string.h>
#define MAX 20


void eliminatejob(char job[0],int tempo[0],int esec[0]);
void visualmenu();
void scelta(int *N);
void gestione(int N,char job[0],int tempo[0],int esec[0],int j);
void insjob(char job[0],int tempo[0],int esec[0],int j);
void visualjob(char job[0],int tempo[0],int esec[0]);
void execute(char job[0],int tempo[0],int esec[0]);
void inizializzazione(char job[0]);



int main(){
char job[MAX];
int tempo [MAX];
int esec[MAX];
int N;
int j=0;

inizializzazione(job);
visualmenu();
scelta(&N);
while(N!=5){
gestione(N,job,tempo,esec,j);
}








system("PAUSE");
return 0;
}
void inizializzazione(char job[0]){
int i;
for(i=0;i<MAX;i++)
job[i]='x';

return;
}
void visualmenu(){
printf("\t\t\t\tSCHEDULAZIONE");
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[0],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[0],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[0],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]!='x'){
printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]);
}
}
return;
}
void execute(char job[0],int tempo[0],int esec[0]){
int minore,indice,i;
indice = 0;
minore = tempo[0];
for(i=0;i<MAX;i++){
if(job[i]!='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[0],int tempo[0],int esec[0]){
int i;
for(i=0;i<MAX;i++){
if(job[i] != 'x'){
if(esec[i] = 1){
job[i] = 'x';
tempo[i] = 0;
esec[i] = 0;
}
}

}
printf("Programmi rimasti: ");
for(i=0;(i<MAX);i++){
if(job[i]!='x'){
printf("\n\t %s - %d - %d\n",job[i],tempo[i],esec[i]);
}

}


return;
}



In poche parole, quando inserisco 1, mi esce "Inserisci nome:" e "Inserisci tempo di esecuzione:" dopo aver inserito il tempo di esecuzione mi ri esce: "Inserisci nome:" e "Inserisci tempo di esecuzione:" e invece mi dovrebbe uscire il menu, come posso risolvere? E mi risulta provando questo codice che va in loop ma non riesco a trovare l'errore

torn24
10-05-2014, 18:09
inizializzazione(job);
visualmenu();
scelta(&N);
while(N!=5){
gestione(N,job,tempo,esec,j);
}


Una volta inserito un valore in N, questo rimane, visto che non vi è nessuna nuova richiesta di valore per N .

Potresti risolvere ripetendo la richiesta di un valore per N



inizializzazione(job);
do {
visualmenu();
scelta(&N);
gestione(N,job,tempo,esec,j);
} while(N!=5);

una volta inserito un valore richiama gestione ed esegue, poi ricomincia

ALTRO PROBELMA



char job[MAX]; // è UN ARRAY DI CARATTERI NON PUOI INSERIRE UNA STRINGA PER INDICE
scanf("%s",&job[j]); // DOVRESTRI USARE UN ARRAY BIDIMENSIONALE char job[MAX][20]

tommasoperilli
11-05-2014, 11:54
Okay ho modificato l'array char ma, riguardante il loop, posso inserire un fflush? perchè se io faccio il controllo in coda, se inserisco 5 al posto di uscire comunque entro nella gestione no?
comunque ho modificato così:

inizializzazione(job); visualmenu();
scelta(&N);
while(N!=5){
gestione(N,job,tempo,esec,j);
scelta(&N);
}
Solo che quando vado a eseguire questa procedura:

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;
}
Non mi escono tutti i job inseriti, ho fatto la prova inserendo solo 2 job e mi è visualizzato solo 1 ..

tommasoperilli
11-05-2014, 13:50
Mi correggo, mi esce solo l'ultimo job inserito .. come se la variabile j non si aggiornasse ogni volta

torn24
11-05-2014, 15:24
Be , la variabile j , nella funzione insjob() è un parametro locale , una copia della variabile j del main , tu la incrementi , ma la variabile j del main rimane invariata , se vuoi modificarla devi passare un puntatore come hai fatto per la variabile N .

Per il loop do while , il controllo sarebbe in coda , quindi inserendo 5 , richiami gestione che non ha nessun case 5 : quindi non farebbe niente , poi con la condizione del while uscirebbe senza fare niente ..

tommasoperilli
11-05-2014, 15:43
Okay, ho modificato:

inizializzazione(job); do{
visualmenu();
scelta(&N);
gestione(N,job,tempo,esec,&j);
}while(N!=5);
mentre per il puntatore ho fatto così:

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;

Però comunque mi risulta qualche errore, come posso risolvere?

torn24
11-05-2014, 15:49
case1: insjob(job,tempo,esec,*j);

Tu dereferenzi j *j , quindi gli passi il valore cioè zero , mentre devi passargli il puntatore j

mentre nella funzione insjob dovrai usare sempre dereferenziato *j in tutti i casi , controlla bene
e ripassa i puntatori ....

tommasoperilli
11-05-2014, 16:07
cosi?

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;
}
non capisco mi esce sempre lo stesso problema .-.

torn24
11-05-2014, 16:27
case1: insjob(job,tempo,esec,&j);

Puntatore = variabile che contiene l'indirizzo di memoria di un altra variabile
int *j;
*j= oggetto puntato "il contenuto dell'indirizzo "
j= indirizzo della variabile
&j= indirizzo del puntatore
----------------------------------
tu dovrai passare l'indirizzo della variabile j del main .

case1: insjob(job,tempo,esec,j);


Il resto va bene , non fare modifiche a caso .

tommasoperilli
11-05-2014, 16:35
quindi così?

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;
}
avevo sbagliato solo nella chiama alla procedura?

Loading