Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-12-2011, 18:45   #1
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
[C] compressione file con tecnica rle

Salve a tutti, dovrei scrivere un programma che comprimi un file .txt e che sarà chiamato con l'estensione .rle, mediante la tecnica dell'rle. Credo di aver capito all'incirca come l'algoritmo è definito, ma non riesco ad implementarlo, cioè non riesco a prendere l'input di tutto il file ( in byte ) e contare e vedere se si ripetono, qualcuno potrebbe darmi un consiglio?
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2011, 18:26   #2
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
nessuno può darmi una mano a capire??
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2011, 20:28   #3
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12900
Per contare se i caratteri si ripetono potresti usare un array con 255 posizioni, una per ogni carattere.

Codice:
int NumeroCaratteri[ 255 ];
A quel punto quando leggi un carattere, puoi fare qualcosa del tipo:

Codice:
while( EsistonoCaratteriDaLeggere )
{
    char CarattereCorrente = EstraiCarattereCorrente();

     NumeroCaratteri[ CarattereCorrente ] += 1;
}
Comunque esplicita meglio qual è il tuo problema... cos'è che non riesci a fare esattamente? La lettura da file? Il conteggio? L'output? (sono solo esempi).
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2011, 21:11   #4
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Per contare se i caratteri si ripetono potresti usare un array con 255 posizioni, una per ogni carattere.

Codice:
int NumeroCaratteri[ 255 ];
A quel punto quando leggi un carattere, puoi fare qualcosa del tipo:

Codice:
while( EsistonoCaratteriDaLeggere )
{
    char CarattereCorrente = EstraiCarattereCorrente();

     NumeroCaratteri[ CarattereCorrente ] += 1;
}
Comunque esplicita meglio qual è il tuo problema... cos'è che non riesci a fare esattamente? La lettura da file? Il conteggio? L'output? (sono solo esempi).
contare i byte che si ripetono, proprio non capisco come si faccia....
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2011, 22:02   #5
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
leggere i byte uno alla volta e vedere se si ripetono o no?

1 byte = 1 char
vorresti dire che è la stessa cosa delle stringhe?
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2011, 19:28   #6
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
scusate un altra cosa non riesco a fare.... come faccio a cambiare l'estensione del file??

Codice:
rename(argv[1]".rle",fp2);
questa funzione non vale, come faccio?

poi l'algoritmo deve anteporre il numero di volte davanti al carattere che si ripete, ma come diavolo faccio??

è un pò che sbatto la testa su questo programma ma sinceramente non riesco proprio a scriverlo... una mano sarebbe più che gradita.
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2011, 21:58   #7
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
si, 1 byte = 1 char, leggi con fread...

e ma dopo la lettura? come faccio a contare se si ripete ogni singolo carattere e poi inserirlo nel file stesso?!!
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2011, 22:51   #8
mmx[ngg]
Senior Member
 
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
rename(argv[1]".rle",fp2); ....ci sei quasi

Che poi...scusa...perchè rinominare il file ? Non ha molto senso se lo devi comprimere, dovresti crearne uno nuovo con l'estensione diversa.

Prima di tutto come funziona l'RLE...comprime sostituendo le sequenze uguali di caratteri adiacenti con un marcatore di riconoscimento + il numero delle volte da ripete + il carattere da ripetere

Esempio :

- il file contiene AAAAACAAA
- il tuo marcatore sarà ?
- dopo la compressione avrai ?5AC?3A

...se qualcuno che mi conosce vede questo esempio mi prendono x il culo per decenni

Questa è la spiegazione più semplice che mi viene, lontana dall'essere perfetta visto che l'utilizzo di un marcatore in quel modo è da evitare ma non vedo soluzioni più eleganti.

Pseudo algoritmo :

Codice:
NumeroRipetizioni = 0
Minimo = 3

Routine RLE
   Se CharAttuale <> CharPrecedente
     Se NumeroRipetizioni > Minimo
         Scrivi marcatore
         Scrivi NumeroRipetizioni
         Scrivi CharPrecedente
         NumeroRipetizioni = 0
      FineSe
      Ciclo NumeroRipetizioni > 0
         Scrivi CharPrecedente
         NumeroRipetizioni - 1
      FineCiclo
      CharPrecedente = CharAttuale
   FileSe
FineRoutine

Ciclo !EOF
   Leggi CharAttuale
   Esegui RLE
   NumeroRipetizioni + 1
FineCiclo
Esegui RLE
Grossolano ma la logica è quella. Ricorda che il marcatore, che decidi te, deve essere un carattere non presente nel file o la decompressione non funziona infatti al suo posto si utilizza la soglia minimi di caratteri ripetibili come segnale di inizio della compressione (ma mi sembra che sia fuori traccia altrimenti non potresti/dovresti scrivere il numero di volte prima).

P.S.

Spero per te che non dovrai mai vedertela con algoritimi di compressione aritmetica o peggio
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità
mmx[ngg] è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2011, 23:05   #9
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da mmx[ngg] Guarda i messaggi
rename(argv[1]".rle",fp2); ....ci sei quasi

Che poi...scusa...perchè rinominare il file ? Non ha molto senso se lo devi comprimere, dovresti crearne uno nuovo con l'estensione diversa.

Prima di tutto come funziona l'RLE...comprime sostituendo le sequenze uguali di caratteri adiacenti con un marcatore di riconoscimento + il numero delle volte da ripete + il carattere da ripetere

Esempio :

- il file contiene AAAAACAAA
- il tuo marcatore sarà ?
- dopo la compressione avrai ?5AC?3A

...se qualcuno che mi conosce vede questo esempio mi prendono x il culo per decenni

Questa è la spiegazione più semplice che mi viene, lontana dall'essere perfetta visto che l'utilizzo di un marcatore in quel modo è da evitare ma non vedo soluzioni più eleganti.

Pseudo algoritmo :

Codice:
NumeroRipetizioni = 0
Minimo = 3

Routine RLE
   Se CharAttuale <> CharPrecedente
     Se NumeroRipetizioni > Minimo
         Scrivi marcatore
         Scrivi NumeroRipetizioni
         Scrivi CharPrecedente
         NumeroRipetizioni = 0
      FineSe
      Ciclo NumeroRipetizioni > 0
         Scrivi CharPrecedente
         NumeroRipetizioni - 1
      FineCiclo
      CharPrecedente = CharAttuale
   FileSe
FineRoutine

Ciclo !EOF
   Leggi CharAttuale
   Esegui RLE
   NumeroRipetizioni + 1
FineCiclo
Esegui RLE
Grossolano ma la logica è quella. Ricorda che il marcatore, che decidi te, deve essere un carattere non presente nel file o la decompressione non funziona infatti al suo posto si utilizza la soglia minimi di caratteri ripetibili come segnale di inizio della compressione (ma mi sembra che sia fuori traccia altrimenti non potresti/dovresti scrivere il numero di volte prima).

P.S.

Spero per te che non dovrai mai vedertela con algoritimi di compressione aritmetica o peggio
mhm ok infatti la rinomina mi sembra sbagliata, ma aprendo un nuovo file, non riesco a dargli un'estensione diverse in quanto, puoi passare per argomento solo il file di input e non quello di output, cioè non si può decidere a priori il nome del file compresso.

L'RLE ormai l'avevo capito come algoritmo ma ti ringrazio per la spiegazione, il problema è proprio implementarlo con i file, ora provo meglio, visto che mi hai scritto anche in pseudocodice e mi hai dato una mano grandissima, anche se ho ancora numerosissimi dubbi a riguardo, a partire proprio dall'estensione che viene cambiata del file!
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2011, 00:07   #10
mmx[ngg]
Senior Member
 
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
Sono secoli che non uso più il C quindi magari è sbagliato ma ricordo una roba tipo :

Codice:
strcpy(OutputFileName, argv[1]); -- Aggiungge l'estensione al file
strcat(OutputFileName, ".rle");

pos = strrchr(argv[1], '.')-argv[1]; -- Cambia l'estensione al file
strncpy(OutputFileName, argv[1], pos);
OutputFileName[pos + 1] = '\0';
strcat(OutputFileName, ".rle");
Ho qualche dubbio sul secondo perchè non ricordo se terminava le stringhe in automatico o meno comunque prova e vedi che ti dice. Ovviamente questo è il file che devi andare ad aprire in scrittura senza rinominare l'altro.
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità
mmx[ngg] è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2011, 09:20   #11
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da mmx[ngg] Guarda i messaggi
Sono secoli che non uso più il C quindi magari è sbagliato ma ricordo una roba tipo :

Codice:
strcpy(OutputFileName, argv[1]); -- Aggiungge l'estensione al file
strcat(OutputFileName, ".rle");

pos = strrchr(argv[1], '.')-argv[1]; -- Cambia l'estensione al file
strncpy(OutputFileName, argv[1], pos);
OutputFileName[pos + 1] = '\0';
strcat(OutputFileName, ".rle");
Ho qualche dubbio sul secondo perchè non ricordo se terminava le stringhe in automatico o meno comunque prova e vedi che ti dice. Ovviamente questo è il file che devi andare ad aprire in scrittura senza rinominare l'altro.
bravissimo ecco cosa ci voleva, non ci ho proprio pensato, la concatenazione!! bravo!!
ora impresa difficile sarà continuare il programma
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03
tecno789 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
STMicroelectronics e SpaceX proseguono l...
Numeri da record, Xiaomi distribuisce ol...
BitLocker accelerato via hardware: Micro...
Blue Origin prosegue lo sviluppo dei lan...
Moore Threads: nuove GPU 15 volte pi&ugr...
Steam diventa esclusivamente 64-bit: Val...
La Corte Suprema restituisce a Elon Musk...
X lancia Creator Studio su mobile: nuovi...
Dieci anni fa SpaceX fece atterrare per ...
POCO M8 e M8 Pro arriveranno nel 2026: e...
Caos Formula 1: il motore Mercedes &egra...
Tariffe nazionali per le chiamate e gli ...
Tassa chilometrica non solo per elettric...
FSR 4 su Radeon RX 5000, 6000 e 7000? Li...
Quanti alberi ci sono in Skyrim? In The ...
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: 20:23.


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