View Full Version : [C] creare scritta di asterischi
Come faccio a creare una scritta, ad esempio la parola "CIAO" fatta di asterischi??
Esiste un metodo veloce??
Grazie
ci sono dei programmi che ricalcano delle immagini e creano un file di testo con il disegno tramite il codice ascii
repne scasb
31-01-2005, 15:42
ilsensine
31-01-2005, 16:08
Se ti vuoi divertire, con questa (http://aa-project.sourceforge.net/index.html) libreria ci si vedono anche i film :D
Qualche screenshot:
http://aa-project.sourceforge.net/gallery/
C'è un piccolo comando di linux che permette di fare qualcosa di simile, scrivendo in verticale.
banner -w50 CIAO
(con -w si imposta la dimensione).
Se usi linux ti puoi ispirare per i caratteri :p
repne scasb
01-02-2005, 22:16
Originariamente inviato da repne scasb
Ho avuto un po di tempo per scrivere qualcosa di migliore:
Incredibile, non ci credo :D
Dove hai trovato la codifica del font dei caratteri di sistema? (non voglio credere che tu abbia riempito a mano una matrice di 16k :p).
Ho modificato leggermente il codice in modo che disegni ogni carattere usando il carattere stesso:
if(argc!=2)
{
printf("Use: <message>");
exit(1);
}
for(j=0;j<FONT_HIGH;j++)
{
for(i=0;*(argv[1]+i);i++)
{
for(l=0;l<FONT_WIDTH;l++)
{
if(font_table[(*(argv[1]+i))*FONT_HIGH+j]&(1<<l))
if (*(argv[1]+i)) *(string_hi+FONT_WIDTH-l-1)=_
(*(argv[1]+i));
else *(string_hi+FONT_WIDTH-l-1)=' ';
else
*(string_hi+FONT_WIDTH-l-1)=' ';
}
*(string_hi+FONT_WIDTH)=0x00;
printf("%s",string_hi);
}
printf("\n");
}
(_ indica a capo, con questo non compila :p
l'ho inserito per non modificare la larghezza del post)
A me dice return type of main is not int.
L ho cambiato ma nn parte il programma......si vede per un nanosecondo la finestra nera e poi basta.......che devo fare??
Originariamente inviato da Rikka
A me dice return type of main is not int.
L ho cambiato ma nn parte il programma......si vede per un nanosecondo la finestra nera e poi basta.......che devo fare??
Su Visual Studio 2003 va perfettamente a patto di sostituire
void main(argc,argv)
con
void main(int argc, char** argv)
ovviamente rimuovendo le dichiarazioni successive.
Per la finestra che scompare subito... prova a eseguire il programma da riga di comando (Esegui > cmd). Questo perchè il programma esce subito una volta disegnata la scritta. Inoltre devi passare la scritta e il carattere di disegno come argomenti (chiamiamo sayhi il programma):
sayhi "ciao" #
Scrive "ciao" in minuscolo con il carattere "#".
repne scasb
02-02-2005, 08:48
repne scasb
02-02-2005, 09:00
Originariamente inviato da repne scasb
Modalita' reale: INT 10h, AX=1130h, BH=3h, in ES:BP ritorna un puntatore in modalita' reale della tabella del font 8x8 presente nella ROM di tutte le schede grafiche VGA (sta nel BIOS della tua scheda grafica VGA). Puoi notare, infatti, che i bit che compongono ogni carattere del font sono speculari (esattamente come sono nel banco 3 in blocchi da 8k in tutte le schede grafiche VGA). NOTA: il vettore e' composto da 2048 caratteri char, quindi non pesa 16k ma 2k.
Infatti avevo fatto mentalmente il calcolo in bit, e mi sono dimenticato di specificarlo. Infatti sono 16 Kb, quindi 2 KB.
Cosi' e' piu' versatile:
Decisamente più versatile :D
Fa più di quello che fa la mia variante e il tuo codice originario, ed è pure più compatto ;)
repne scasb
02-02-2005, 10:58
repne scasb
02-02-2005, 11:36
Originariamente inviato da repne scasb
Anche in verticale (non ho controllato se ci sono errori):
Ho trovato un modo per disegnare le scritte con la dimensione specificata. Mi sono ispirato alla tecnica "nearest" per il texturing in 2D e 3D :D
La variante è per le scritte verticali, si può facilmente applicare anche alle orizzontali:
for(k=WIDTH-1;k>=0;k--)
{
for(j=HEIGHT-1;j>=0;j--)
putchar(font_table[(*(argv[1]+i))*FONT_HEIGHT+(j*FONT_HEIGHT/HEIGHT)]&(1<<(k*FONT_WIDTH/WIDTH))?*(argv[2]+i%strlen(argv[2])):' ');
printf("\n");
}
Ovviamente si deve specificare
#define WIDTH 6
#define HEIGHT 6
Ho provato con 6, 31 e 50 e funziona.
repne scasb
02-02-2005, 13:28
io non credo: aveva chiesto un metodo veloce :D
be' certo, vero è che se glielo fanno gli altri è velocissimo :D
PS: soddisfattA? E se fosse un maschio? :confused: :D
repne scasb
02-02-2005, 14:53
Sono un maschio!!!! :)
Però gli ultimi programmi sul Dev continuano a nn girare, mi appare per un attimo la schermata nera e poi nn si vede piu niente, come faccio??
Grazie
Ziosilvio
02-02-2005, 16:54
Originariamente inviato da Rikka
[quote]mi appare per un attimo la schermata nera e poi nn si vede piu niente, come faccio??
Ti riferisci al fatto che compare per un attimo una finestra con il prompt dei comandi, che pero' sparisce subito?
Se e' cosi': l'avro' spiegato un centinaio di volte, l'ultima sara' stata il mese scorso; cerca tra i miei vecchi post di questa sezione.
repne scasb
02-02-2005, 17:02
Originariamente inviato da repne scasb
Spero che 71103 sia soddisfattA ora.
non sono soddisfattA per due motivi:
1) Rikka è un maschio (tiè)
2) fidati, io non potrei *MAI* essere soddisfattA... :D bwhuahuahuahuahuahu ora basta x cortesia.
AnonimoVeneziano
04-02-2005, 23:28
Repne , se per caso passassi ancora per questa discussione vorrei informarti che ti ho inviato un PVT per chiederti delucidazioni su un paio di cosette che non mi sono chiare :)
Grazie del tuo tempo
Ciao
LimiT-MaTz
05-02-2005, 11:35
Originariamente inviato da ilsensine
Se ti vuoi divertire, con questa (http://aa-project.sourceforge.net/index.html) libreria ci si vedono anche i film :D
Qualche screenshot:
http://aa-project.sourceforge.net/gallery/
ok installate le librerie (sotto linux) per utilizzarle come faccio?
per convertire ad esempio un immagine in asci o vedere un filmato?
ho un po smanettato ma non riesco a capirlo
Fenomeno85
05-02-2005, 16:22
Originariamente inviato da Rikka
Sono un maschio!!!! :)
Però gli ultimi programmi sul Dev continuano a nn girare, mi appare per un attimo la schermata nera e poi nn si vede piu niente, come faccio??
Grazie
semplicemente perchè non si bloccano alla fine.
Basta che aggiungi come ultima riga di codice questa:
system("PAUSE");
~§~ Sempre E Solo Lei ~§~
AnonimoVeneziano
08-02-2005, 19:50
We raga, un po' di tempo fa ho inviato a repne un PVT per chiedere una cosa, ma dato che si vede che è occupata e non ha tempo di rispondervi rigiro la domanda a tutti postando il PVT qua, spero qualcuno sappia rispondermi :P
Ciao
Ciao ,
ho visto quella discussione sulle scritte con gli asterischi ( o affini ) e mi è piaciuta
molto la storia della chiamato al BIOS Video che ti riporta un puntatore alla tabella
dell'encoding dei caratteri .
Premetto che del BIOS Video conosco molto poco e che come funziona
l'encoding della posizione dei pixel dei caratteri nel BIOS l'ho capito leggendo il
tuo prezioso programma che mi ha illuminato su un nuovo argomento
Nel tuo messaggio avevi scritto che AX=1130h BH=03h INT 10h dava la
possibilità di ottenere tale tabella per i caratteri 8x8 fonts .
Nel programma che hai allegato poi hai messo come numero di caratteri "256"
definendo una costante NUM_CHAR con tale valore .
Poi hai detto che tale array è grosso 2KB .
A sto punto mi sorge un dubbio .
Su diverse "Reference" di chiamate al BIOS video ho visto che tale funzione
(AX=1130h BH=03h) riporta sì nella locazione di memoria puntata da ES:BP la
tabella dei caratteri 8x8 , ma solo dal carattere 0 al carattere 127 (quindi in totale
128 caratteri e non 256), mentre per i rimanenti "Extended characters" (128-255)
bisognerebbe usare BH=04h . Questo spiegherebbe perchè ad esempio col tuo
programma non possono essere disegnati alcuni caratteri oltre l'ASCII 127 come
"ì" , "ù", "ò" .... (anche se non sono sicuro sia questo il motivo ...)
Questo è il primo dubbio. Il secondo dubbio è che sempre tali "Reference"
riportano che nel registro CX dovrebbe essere memorizzato il numero di Bytes
usati per l'encoding della posizione dei pixel di ogni carattere nella tabella .
Controllando il valore del registro CX dopo la chiamata a INT 10H questo mi
risulta con valore 10H , ossia 16 , perciò ogni carattere dovrebbe usare 16 bytes
, ma leggendo il tuo programma e facendo un po' di prove "manuali" sulla tabella
(tipo disegnare a mano i vari caratteri seguendo l'encoding della tabella) mi
sembra proprio che il numero di bytes usati per ogni carattere non sia 16, ma 8 ,
cosa che mi confonde molto . Perchè il bios dovrebbe mentire? E poi , se la
dimensione usata per ogni carattere è 8 bytes e i caratteri riportati dalla
AX=1130h BH=03H sono quelli da 0 a 127 perchè usare un array di 2KB quando
ne basterebbe uno da 1KB? E nel secondo KB cosa ci sarebbe? Dati a caso?
Le Reference di cui parlo sono queste:
http://www.giobe2000.it/HW/Video01/Pag/Bios10_11_30.asp
http://www.uv.tietgen.dk/staff/mlha...nt/INT10.htm#11
http://www.outer-court.com/basic/echo/T1015.HTM
In particolare l'ultimo dice chiaramente che con BH=03h viene caricata la prima metà dei caratteri ASCII e con BH=04H la seconda metà .
Scusa se ho detto tante castronate e per la mia ignoranza in generis, ma mi
piacerebbe capire cosa non torna nel mio ragionamento e di capire cosa sbaglio
o se mi sono perso qualche passaggio.
Ti ringrazio del tuo tempo
Marcello
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.