praegune kellaaeg 19.06.2025 01:35:05
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
wazaabi
HV kasutaja

liitunud: 23.10.2006
|
05.05.2015 11:48:33
Veidi abi C keeles |
|
|
Hoiatan kohe ette ära, et olen täiesti algaja ja tegemist on koolitööga.
Programmi eesmärgiks on kuvada mingisugust tähemärki PWM stiilis. Üritasin ülesannet lahendada nii, et andsin ette aja, mille jooksul madalaim väärtus jõuab suurima väärtuseni, siis jagasin selle aja osadeks. Madalaima väärtuse juures kuvatakse tähemärki vähem ja tühja ekraani kauem ja suurima väärtuse juures vastupidi.
Spoiler 
#include <stdio.h>
#include <unistd.h>
void ClrScr()
{
const char* CLEAR_SCREE_ANSI = "\e[1;1H\e[2J";
write(STDOUT_FILENO,CLEAR_SCREE_ANSI,12);
}
int main(int argc, char * argv[]) {
double t, i, j;
t = 6; /* aeg madalaima ja kõrgeima väärtuse vahel sekundites */
double protsent = 0.2; /* määrab mitmeks võrdseks segmendiks aeg t jagatakse */
double aeg1 = protsent * t; /* ühe segmendi pikkus sekundites */
infinite_loop:
for (i = 0; i <= t; i = i + aeg1) {
printf("@@@@@@@@@\n@@@@@@@@@\n@@@@@@@@@\n@@@@@@@@@\n");
usleep(1000000*i*protsent); /* tähemärke kuvatakse i*protsent sekundit */
ClrScr(); /* Puhasta ekraan */
usleep (t*1000000-1000000*i*protsent); /*tühja ekraani kuvatakse t-i*protsent sekundit */
}
for (j = i; j >= 0; j = j - aeg1) {
printf("@@@@@@@@@\n@@@@@@@@@\n@@@@@@@@@\n@@@@@@@@@\n");
usleep(1000000*j*protsent);
ClrScr(); /* Puhasta ekraan */
usleep (t*1000000-1000000*j*protsent);
}
goto infinite_loop;
return 0;
} |
Selline on kood hetkel. Võibolla täielik nonsense. Ma ei osanud hästi ekraani tühjendada, nii et tähemärgid alati sama koha peale tagasi ilmuksid. void ClrScr() on midagi, mille netist leidsin, aga see ei tööta just kõige paremini. Samuti ei "teki" ja "kao" tähemärgid just kõige sujuvamalt ehk siis PWM stiilis vaid üsna kaootiliselt.
Endal mõistus otsas. Ehk mõni hea inimene suudab mind veidike harida. Seletada võiks nii, et loll ka aru saab.
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
Rauno266
Kreisi kasutaja
liitunud: 03.07.2009
|
05.05.2015 14:50:22
|
|
|
Ei saa hästi aru, mida sa selle PWM stiili all mõtled. Pulseerivad tähed?
|
|
Kommentaarid: 45 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
41 |
|
tagasi üles |
|
 |
wazaabi
HV kasutaja

liitunud: 23.10.2006
|
05.05.2015 16:49:02
|
|
|
Rauno266 kirjutas: |
Ei saa hästi aru, mida sa selle PWM stiili all mõtled. Pulseerivad tähed? |
Just. Mingisugune täht või grupp tähti, mis pulseerivad terminali aknas.
Spoiler 
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
Rauno266
Kreisi kasutaja
liitunud: 03.07.2009
|
05.05.2015 17:13:07
|
|
|
Kas peab olema sarnane sujuv värvivahetus või lihtsalt on-off?
|
|
Kommentaarid: 45 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
41 |
|
tagasi üles |
|
 |
wazaabi
HV kasutaja

liitunud: 23.10.2006
|
06.05.2015 14:30:11
|
|
|
Võiks võimalikult sujuvalt ekraanile tekkida.
Sain enam-vähem toimivaks...mõned iluvead vaja veel likvideerida.
Spoiler 
#include <stdio.h>
#include <unistd.h>
void ClrScr()
{
const char* CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
write(STDOUT_FILENO,CLEAR_SCREEN_ANSI,12);
}
void blink (long t, double ratio)
{
long t1 = t * ratio;
long t2 = t - t1;
printf("######\n######\n######\n######\n");
usleep(t1);
ClrScr();
usleep(t2);
}
int main(int argc, char * argv[]) {
double t, j, ratio;
t = 3; /* aeg madalaima ja kõrgeima väärtuse vahel sekundites */
double i = 0.02; /* määrab mitmeks võrdseks segmendiks aeg t jagatakse */
double t_segment = i * t; /* ühe segmendi pikkus sekundites */
infinite_loop:
for (ratio = 0; ratio <= 1; ratio = i + ratio) {
blink(t_segment*1000000, ratio);
}
for (j = 1; j >= 0; j = j - i) {
blink(t_segment*1000000, j);
}
goto infinite_loop;
return 0;
}
|
edit Paluti koodi lihtsustada. Nüüd millegipärast i muutmine ei pikenda pika intervalli aega (aeg madalaima ja kõrgeima väärtuse vahel). Samuti kuvatakse esimesel real alati üks üleliigne tähemärk.
Spoiler 
#include <stdio.h>
#include <unistd.h>
void ClrScr()
{
const char* CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
write(STDOUT_FILENO,CLEAR_SCREEN_ANSI,12);
}
void blink (long t, double ratio)
{
long t1 = t * ratio;
long t2 = t - t1;
printf("######\n######\n######\n######\n");
usleep(t1);
ClrScr();
usleep(t2);
}
int main(int argc, char * argv[]) {
double ratio;
double i = 0.0005;
long intervall = 100000;
infinite_loop:
for (ratio = 0; ratio <= 1; ratio = ratio + i) {
blink(intervall, ratio);
}
for (ratio = 1; ratio >= 0; ratio = ratio - i) {
blink(intervall, ratio);
}
goto infinite_loop;
return 0;
}
|
|
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|