Programma Non Viene Eseguito

di il
3 risposte

Programma Non Viene Eseguito

Ciao a tutti, non riesco a capire perchè non viene eseguito il seguente programma. Il compilatore non dà nessun errore ma quando eseguo, il terminale rimane scuro e non esegue neanche printf("CIAO"); subito dopo il main, inoltre una CPU arriva anche ad un utilizzo del 100% questo mi fa pensare che il programma viene eseguito ma le istruzioni non partono.
Sono in ambiente Linux ed utilizzo il seguente compilatore : gcc version 8.1.1 20180531 (GCC) .
Aiutatemi.


/* Confronto file transaziono e master */

#include <stdio.h>

struct acctData{
	int acctNum;
	char name[15];
	float balance;
};

struct Transact{
	int acctNum;
	float amount;
};

void updateMaster(FILE *trans, FILE *old, FILE *new);
void unmatchedTransactions(FILE *trans, FILE *old);

int main(int argc, char **argv)
{
	printf("CIAO");
	FILE *ofPtr; // puntatore oldmast
	FILE *tfPtr; // puntatore trans
	FILE *nfPtr; // puntatore newmast
	
	// apertura oldmast.dat
	if ((ofPtr = fopen("oldmast.dat", "r")) == NULL)
		puts("oldmast.dat could not be opened");
	// apertura trans.dat
	else if ((tfPtr = fopen("trans.dat", "r")) == NULL)
		puts("trans.dat could not be opened");
	// apertura newmast.dat
	else if ((nfPtr = fopen("newmast.dat", "w")) == NULL)
		puts("newmast.dat could not be opened");
		
	else {
		
		printf("CIAO");
		
		printf("%s", "Updating master...");
		updateMaster(tfPtr, ofPtr, nfPtr); // aggiorna master
		printf("%s", "done!");
	
		unmatchedTransactions(tfPtr, ofPtr); // visualizza transazioni senza match
	 
		// chiusura file utilizzati
		fclose(ofPtr);
		fclose(tfPtr);
		fclose(nfPtr);
	}
	
	return 0;
}

// aggiornamento master
void updateMaster(FILE *trans, FILE *old, FILE *new)
{
	struct acctData client = {0, "", 0.0}; // cliente vuoto di appoggio
	struct Transact transact = {0, 0.0}; // transazione vuota di appoggio
	
	while (!feof(old)) { // finchè ci sono record in oldmast.dat
		// leggi un record
		fscanf(old, "%d%s%f", &client.acctNum, client.name, &client.balance);
		
		// ricerca transazione relativa al record
		while(!feof(trans)) { // finchè ci sono record in trans.dat
			fscanf(trans, "%d%f", &transact.acctNum, &transact.amount); // leggi dati transazione
			
			if (transact.acctNum == client.acctNum) // trovata transazione corrispondente
				client.balance += transact.amount; // aggiungi l'ammontare della transazione
		} // fine transazioni
		rewind(trans); // reimposta il puntatore all'inizio di trans.dat
		
		// scrittura record su newmast.dat
		fprintf(new, "%d %s %f", client.acctNum, client.name, client.balance);
	}
}

void unmatchedTransactions(FILE *trans, FILE *old)
{
	rewind(trans);
	rewind(old);
	
	int transCode, oldCode; // codici account per confronto
	unsigned int match = 0; // match/unmatch transazione (false per default)
	
	while(!feof(trans)) { // finchè ci sono record in trans.dat
		// leggi un codice account da trans.dat
		fscanf(trans, "%d", &transCode);
		
		while (!feof(old)) { // finchè ci sono record in oldmast.dat
			// leggi un codice account da oldmast.dat
			fscanf(old, "%d", &oldCode);
			if (oldCode == transCode) // se c'è una corrispondenza tra transazione e master
				match = 1; // match = true
		}
		
		if (!match) // match non avvenuto
			printf("Unmatched transaction record for account number: %d", transCode);
			
		rewind(old); // imposta il puntatore a inizio file
	}
}

3 Risposte

  • Re: Programma Non Viene Eseguito

    Hai fatto un po' di debugging? Sicuramente viene eseguito ma resta a girare in qualche ciclo. Qual è il contenuto dei file letti?
  • Re: Programma Non Viene Eseguito

    Guarda mi sono accorto che il problema è nella chiamata alla funzione unmatchedTransactions(tfPtr, ofPtr); perchè commentando quest'ultima il programma non dà problemi ed esegue correttamente le altre istruzioni. Ma non capisco il motivo.
    Per quanto riguarda i file, contengono varie righe con dei dati di prova. Il contenuto è del tipo seguente

    1 simone 50.50
    2 marco 65.80
    7 giovanni 89.50
  • Re: Programma Non Viene Eseguito

    Risolto, in effetti c'era un loop infinito che veniva eseguito
Devi accedere o registrarti per scrivere nel forum
3 risposte