Ciao, prima di tutto ti ringrazio per l'interesse e lo sbattimento ^^
Ho provato a compilare per vedere... ho corretto piccoli errori (quelli che ho capito XD)
Correct source:
codice:
#include <stdio.h>
#include <time.h>
#include <memory.h>
typedef unsigned int uint;
typedef struct
{
/* Carattere che rappresenta un blocco riempito della barra */
char cUnitFillBlock;
/* Carattere che rappresenta un blocco vuoto della barra */
char cUnitEmptyBlock;
/* Carattere iniziale della barra */
char cStartDelimitator;
/* Carattere finale della barra */
char cEndDelimitator;
/* Numero dei blocchi che costitutiscono la barra */
uint nTotalBlocksCount;
/* Operazioni totali da effettuare */
uint nTotalOperations;
/* Numero di operazioni per blocco */
double fOperationsPerBlock;
/* Numero delle operazione totali effettuate */
uint nCurrOperation;
/* Numero di blocchi "pieni" */
uint nFilledBlock;
/* La barra intesa come stringa (es. "[========]") */
char* szBar;
} ProgressBar;
void InitializeProgressBar( ProgressBar* pPb, uint totBlocks, uint totOperations, char unitBlock='=', char unitEmptyBlock=' ', char startDel='[', char endDel=']' );
void CleanProgressBar( ProgressBar* pPb );
void ShowProgressBar( ProgressBar* pPb );
bool UpdateProgressBar( ProgressBar* pPb, uint opToAdd=1 );
void isort( int a[], int n );
#define ARRAY_SIZE 0xFFFF
int main()
{
srand( time(0) );
int a[ARRAY_SIZE];
// Riempie l' array con valori casuali
int i;
for(i=0; i<ARRAY_SIZE; ++i )
a[i] = rand() % ARRAY_SIZE;
isort( a, ARRAY_SIZE );
return 0;
}
void isort( int a[], int n )
{
ProgressBar pb;
// Imposta i dati interni della barra
InitializeProgressBar( &pb, 10, n-1 );
int i, x=0, j=0;
for(i=1; i<n; i++ )
{
x = a[i];
j = i;
while( j>0 && (x<=a[j-1]) )
{
a[j] = a[j-1];
j--;
}
a[j] = x;
// Se la barra è cambiata (il numero di blocchi "pieni" è cambiato)
if( UpdateProgressBar( &pb, 1 ) )
{
// Cancella lo schermo
system("cls"); // Su unix mi sa che questo non va
// Mostra a video la nuova barra
ShowProgressBar( &pb );
}
}
CleanProgressBar( &pb );
}
void InitializeProgressBar( ProgressBar* pPb, uint totBlocks, uint totOperations, char unitBlock, char unitEmptyBlock, char startDel, char endDel )
{
// Imposta a 0 il numero di blocchi pieni
pPb->nFilledBlock = 0;
// Imposta il numero dei blocchi totali, il numero totale di operazioni, i caratteri per i delimitatori e per i blocchi
pPb->nTotalBlocksCount = totBlocks;
pPb->nTotalOperations = totOperations;
pPb->cUnitFillBlock = unitBlock;
pPb->cUnitEmptyBlock = unitEmptyBlock;
pPb->cStartDelimitator = startDel;
pPb->cEndDelimitator = endDel;
// Calcola il numero di operazioni per singolo blocco
pPb->fOperationsPerBlock = (double)pPb->nTotalOperations / (double)pPb->nTotalBlocksCount;
// Imposta a 0 il numero delle operazioni effettuate fin' ora
pPb->nCurrOperation = 0;
// Alloca memoria per la "barra-stringa", ne imposta i delimitatori e la riempe con blocchi "vuoti"
pPb->szBar = (char*)malloc( sizeof(char) * pPb->nTotalBlocksCount + 2 + 1 );
memset( pPb->szBar, pPb->cUnitEmptyBlock, sizeof(char)*(pPb->nTotalBlocksCount + 2 + 1) );
pPb->szBar[0] = pPb->cStartDelimitator;
pPb->szBar[ pPb->nTotalBlocksCount + 1] = pPb->cEndDelimitator;
pPb->szBar[ pPb->nTotalBlocksCount + 2] = '\0';
}
void CleanProgressBar( ProgressBar* pPb )
{
if( pPb->szBar )
free( pPb->szBar );
pPb->szBar = NULL;
}
void ShowProgressBar( ProgressBar* pPb )
{
printf( "%s\n", pPb->szBar );
}
bool UpdateProgressBar( ProgressBar* pPb, uint opToAdd )
{
// Aggiorna il numero delle operazioni effettuate
pPb->nCurrOperation += opToAdd;
// Dammi il numero di blocchi pieni secondo il nuovo numero delle operazioni
uint iCurrLastFilledBlock = (uint)((double)pPb->nCurrOperation / pPb->fOperationsPerBlock);
// Se il numero di blocchi pieni (appena calcolato) è maggiore di quello memorizzato
if( iCurrLastFilledBlock > pPb->nFilledBlock )
{
// Aggiorna il numero dei blocchi pieni memorizzato
pPb->nFilledBlock = pPb->nCurrOperation / pPb->fOperationsPerBlock;
// Aggiorna la barra-stringa
memset( pPb->szBar+1, pPb->cUnitFillBlock, sizeof(char) * pPb->nFilledBlock );
return true;
}
else
return false;
}
ho anche notato quel system("cls") che dovrebbe essere un comando DOS... mi ero dimenticato di dire che sono sotto Unix, più precisamente sotto Ubuntu... con cosa lo posso sostituire? clear? oppure devo cambiare proprio la funzione?
Ti mostro anche l'output di GCC:
codice:
barrasort.c:31: error: expected ‘;’, ‘,’ or ‘)’ before ‘=’ token
barrasort.c:34: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘UpdateProgressBar’
barrasort.c:78: warning: conflicting types for ‘InitializeProgressBar’
barrasort.c:55: note: previous implicit declaration of ‘InitializeProgressBar’ was here
barrasort.c: In function ‘InitializeProgressBar’:
barrasort.c:94: warning: incompatible implicit declaration of built-in function ‘malloc’
barrasort.c: In function ‘CleanProgressBar’:
barrasort.c:104: warning: incompatible implicit declaration of built-in function ‘free’
barrasort.c: At top level:
barrasort.c:114: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘UpdateProgressBar’
mancano , ; o ) (sembra una faccina XD) ma dove?
Grazie mille ancora!