Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-04-2004, 23:28   #1
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
[C] Calendario Eventi

Ciao a tutti..

in questo periodo sto sviluppando del codice per un' applicazione per la gestione del traffico ferroviario.

Il settore di cui mi occupo è quello del "calendario eventi".
In pratica è una lista ordinata cronologicamente di tutti gli eventi che si verificano sul traffico (es. semaforo verde fra 2 minuti, treno in partenza fra 30 sec., etc...)

La struttura di un singolo evento è generica: c'è un ID evento, il timestamp e altre variabili di servizio.

La lista deve poi essere aggiornata ogni secondo, perchè lo scorrere inesorabile del tempo, decreterà quali sono gli eventi scaduti (un semplice confronto tra il timestamp attuale e quello dell' evento).

Secondo voi, che struttura è preferibile usare per gestire questo calendario? non ci sono imposizioni sulla memoria (ovvero si può fare tutto statico), ma la gestione degli eventi deve essere veloce..

Dapprima pensavo ad un array statico di "struct evento", ma poi mi sono reso conto che per quanto intuitivo e semplice, è un bordello inserire eventi nelle locazioni interne dell' array, perchè bisogna shiftare di un posto tutti gli eventi che andranno a scadere successivamente..

Dunque penserei ad una lista singolarmente collegata..è più efficiente da gestire come struttura, ma è più fragile (con i puntatori non sai mai cosa può accadere )

Cosa sarà meglio adottare? avete in mente altre soluzioni?

Grazie..ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 02:20   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Sicuramente la lista... E' l'ideale per una situazione del genere...
Evita la ricorsione...la differenza di velocità è minima, ma se gli eventi sono molti ti si potrebbe pienare lo stack...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 18:59   #3
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
grazie...

sto pensando ad una lista doppiamente collegata...
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 19:10   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Se gli eventi + lontani vengono inseriti in coda non ha senso fare una lista doppiamente collegata...a meno che tu non li debba scorrere dal più lontano al + vicino...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 19:46   #5
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
infatti non lo faccio perchè devo scorrere il tempo all' indietro...

mi serve per migliorare l' inserimento di eventi nel mezzo della catena: per inserire al posto giusto, devo trovare l'evento che sta subito prima cronologicamente e quindi piazzare l'evento subito dopo..

Immagina una catena di 400 eventi...fatti 350 comparazioni di timestamp solo prchè l' evento si và ad inserire in 351 posizione...

invece così potrei partire dal 400 e farmi solo 49 comparazioni all' indietro...

ovviamente non sto qui a spiegare tutto l'algoritmo per capire se conviene partire dall'inizio o dalla fine (c'è anche un "segnalino" al centro della catena)

comunque è carino questo progetto

ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2004, 00:17   #6
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Accidenti

Mi hanno detto che non posso usare memoria dinamica! quindi niente malloc!

Se voglio usare le liste doppie, devo piazzarle dentro un array statico...

una lista in un array? Non conosco questa tecnica..mai usata...

sapete dirmi nulla in proposito...dove becco documentazione? con Google non ho trovato una mazza.

Ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2004, 10:11   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Scusa, ma come fai a non usare array dinimaci ? Limiti dimensionalmente il problema ?

La lista in un array è facile... E' uguale alla lista normale...

struct lista {
struct info i;
lista *next;
liste *prev;
int used;
};

Se ad esempio l'elemento corrente è prima dell'1 e dopo l'8 allora:

next == &vet[1] e prev == &vet[8]

In alternativa puoi fare next e prev interi che contengono l'indice dell'array...ma sono operazioni più complesse ogni volta che accedi ad un elemento...

La variabile used ti indicherà se l'elemento è in uso oppure no...
Io mi terrei il numero di elementi liberi e l'indice del primo elemento libero...inoltre ogni volta che fai un inserimento dovresti cercare il prossimo elemento libero (il metodo più veloce di ricerca dovresti studiartelo per bene)...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2004, 10:36   #8
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Grazie!

ora vediamo cosa tiro fuori...
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2004, 23:50   #9
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Come lo vedi se uso 2 array?

1 dove metto le struct evento e l'altro dove metto i puntatori ad ogni evento del primo array..

l'ordine temporale lo faccio ordinando l'array dei puntatori e non quello degli eventi (più pesante da gestire)..

Mi costerebbe tanto fare gli shift dei puntatori? Io penso sia leggero da fare..sempre meglio che shiftare le struct evento..

che dici?

ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2004, 03:09   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ottima idea, ma credo che si possa fare di meglio...

Con un cosa del genere:

struct evento *vett[N];

ad ogni cancellazione dovresti compattare l'array...

Invece facendo una cosa del genere:
Codice:
struct lista {
   struct lista *prev;
   struct evento *e;
   struct lista *next;
   int usato;
};

struct lista l[N];

struct lista *primo_libero = l;
La cancellazione si riduce a:
Codice:
cur->usato = 0;
if(cur < primo_libero) primo_libero = cur;
if(cur->prev) cur->prev->next = cur->next;
if(cur->next) cur->next->prev = cur->prev;
L'inserimento, la modifica e la ricerca sono circa della stessa complessità (magari leggermente più lenti in questo caso, ma proprio poco)...ma hai il grosso vantaggio della cancellazione...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2004, 15:55   #11
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
che non è poco...

grazie..come al solito sei un buon intenditore
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2004, 21:54   #12
fpucci
Senior Member
 
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
Re: [C] Calendario Eventi

Quote:
Originariamente inviato da fedo
[...]
Dunque penserei ad una lista singolarmente collegata..è più efficiente da gestire come struttura, ma è più fragile (con i puntatori non sai mai cosa può accadere )

Cosa sarà meglio adottare? avete in mente altre soluzioni?
Io ho lavorato su un sistema molto simile al tuo.
Ho fatto delle liste linkate.
Vai alla grande coi ptr e sono pure veloci.
Ho fatto un array di 1440 puntatori (un elemento per ogni minuto della giornata) ed ogni elemento era un ptr ad una lista di eventi
fpucci è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2004, 09:54   #13
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
se mi passi il sorgente, ti bacio le mani
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2004, 12:05   #14
fpucci
Senior Member
 
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
Ci ho lavorato oltre dieci anni fa

Ti definisci un array statico di 1440 elementi di puntatori ad una struttura EVENT. (Io ne avevo tre perché gestivo tre giorni: ieri, oggi e domani)

La struttura EVENT deve contenere, oltre ai dati che servono per descrivere l'evento, un puntatore alla struttura stessa Iinizialmente valorizzato a NULL per indicare la lista vuota).

Codice:
typedef struct EVENT_T {
   ...
   ...
   ...
   struct EVENT_T   * Next;
} EVENT

EVENT ListaEventiGiornalieri [1440];
Ogni volta che devi inserire un evento, ti ricavi il minuto in cui quell'evento scatta (un intero compreso tra 0 e 1439) e vai ad allocare dinamicamente un elemento di tipo EVENT in corrispondenza dell'i-esimo elemento dell'array (con i = minuto_in_cui_scatta_evento), eventualmente aggiungendolo a quelli già presenti.

Se invece i tuoi eventi richiedono una risoluzione del secondo anziché del minuto, ti farai un array pari a 86400 elementi, tanti quanti sono i secondi di una giornata

L'accesso è velocissimo perché tu accedi all'array mediante un indice che è pari al minuto (o al secondo) che ti interessa gestire e poi scorri la lista di tutti gli eventi che devi far scattare.

Spero che sia chiaro
fpucci è offline   Rispondi citando il messaggio o parte di esso
Old 27-04-2004, 12:11   #15
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
infatti una soluzione del genere l'avevo pensata...


grazie
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2004, 04:20   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ma tu hai dettto che non puoi usare l'allocazione dinamica...

Comunque quella struttura è davvero ottima...non ci avevo pensato...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2004, 10:31   #17
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
infatti...mi hanno detto che non posso usare malloc()...

quindi...niente mem. dinamica...

La storia di fare un array dove ogni indice indica 1 sec. trascorso, è ottima...

Però, mano a mano che gli eventi in testa scadono, come faccio a far scorrere l' array nel tempo?

Cioè, immaginatevi una sliding window....il mio array dovrebbe scorrere...

ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2004, 10:35   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fare un array di liste, come consigliato sopra, era la cosa migliore... Ma mano che passa il tempo deallochi la lista corrispondente a quel minuto della giornata... Purtroppo se non puoi usare memoria dianmica allora questa soluzione diventa quasi imporponibile... Visto che dovresti fare un vettori di vettori (contenti liste) ed avresti problemi di dimensionamento delle liste... A meno che tu non abbia un vincolo che ti dice al max quanti aventi si possono verificare in un dato minuto...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2004, 10:36   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da fedo
Però, mano a mano che gli eventi in testa scadono, come faccio a far scorrere l' array nel tempo?
ListaEventiGiornalieri[ora*60+minuto] sarebbe la lista che contiene glie venti che stanno per verificarsi...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 28-04-2004, 11:24   #20
fpucci
Senior Member
 
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
Quote:
Originariamente inviato da cionci
ListaEventiGiornalieri[ora*60+minuto] sarebbe la lista che contiene gli eventi che stanno per verificarsi...
Esatto!

Inoltre, non potendo usare memoria dinamica (e non ne capisco il perché, a meno che non sia una esercitazione) l'unica cosa che ti resta è quella di utilizzare un array di array tutti staticamente dimensionati.
Il problema è sapere a priori il numero massimo di eventi che puoi avere in un dato istante (per istante intendo il generico minuto o secondo della giornata). Se puoi dimensionare questa entità, puoi fare:
Codice:
#define MAX_NUM_EVENTI         200
#define MIN_PER_DAY              1440
#define SEC_PER_DAY            86400
#define RISOLUZIONE             SEC_PER_DAY /* oppure MIN_PER_DAY */
...
...
EVENT ListaEventiGiornalieri [RISOLUZIONE] [MAX_NUM_EVENTI] ;
fpucci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
Le analisi di ALMA sulla cometa interste...
La missione cinese Tianwen-3 per portare...
Un satellite di HEO Space ha catturato u...
Mini LED 144Hz a prezzo folle: questo Hi...
Novità per Fortinet: arrivano For...
Volkswagen e Xpeng, il SUV è real...
Volkswagen ribattezza ID.3 e le dà un mo...
Aruba rende disponibile VMware Hosted Pr...
Questa Olympus da 20 MP con stabilizzazi...
Il nuovo dispositivo di Rabbit si chiama...
'Se avete RAM, siamo pronti ad acquistar...
Veeam corregge diverse vulnerabilit&agra...
MacBook Neo segna una svolta per Apple: ...
Polestar pubblica il report LCA di Poles...
Il rame non basta più: NVIDIA, AM...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:14.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v