Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
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


Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
Amazon aggiorna le offerte anche a metà ...
Trump elogia Microsoft: accordi con le B...
L'Unione Europea scommette sul software ...
In Cina parte la prima linea per batteri...
Un benchmark che mette in difficolt&agra...
OnePlus nella bufera a Taiwan: emesso ma...
Arriva Hyper Hosting, la nuova offerta ...
Steam non si ferma più: nuovo rec...
Venezuela, altro che petrolio: il tesoro...
EcoFlow DELTA Pro Ultra X: potenza e rap...
SK hynix: un nuovo impianto per produrre...
Facebook, cresce il furto di password co...
Tesla lancia la nuova Model Y con 7 post...
NVIDIA smentisce: nessun pagamento antic...
Il prototipo del razzo spaziale riutiliz...
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: 05:28.


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