Jump to content
GIGN Forum

While Cikls Nokaras, Kāpēc ?


ANALGINS
 Share

Recommended Posts

Lēnām mēģinu taisnot rokas iekš c++, un atdūros pret sekojošu problēmu kuru neizprotu

while cikls kurā ir pārbaude nokaras, un mainīgais powerLevel ir 100 - kāpēc ?

rekur kods


//LPT-controlled fan

#include <iostream>

#include <sys/io.h>

#define base 0x378

using namespace std;

void runFan(int powerLevel)

{

ioperm(base,1,1);

//Turn the fan to 100% for 1 second to get it spinning

outb(255,base);

sleep(1);

outb(0,base);

//Loop to generate PWM at a given percentage

while(1)

{

outb(0,base);

usleep(10000-powerLevel*100);

outb(255,base);

usleep(powerLevel*100);

if (powerLevel = powerLevel)

{

cout << "Power level %: ";

cin >> powerLevel;

//runFan(powerLevel);

}

}

}

int main()

{

int powerLevel = 0;

cout << "Power level %: ";

cin >> powerLevel;

runFan(powerLevel);

}

Edited by ANALGINS
Link to comment
Share on other sites

man pat nevajadzētu tikt arā, tik samainīt powerLevel vērtību...

īsāk sakot, ir tā kad kods tiek palaists, izpildīties sāk tikai pēc vērtības ievades, tad ieciklējas (jo tas taisa pwm signālu) un es gribu to powerLevel vērtību pamainīt kad tā jau 1x vai 32x bijusi ievadīta, mēģināju ar goto bet tas nesanāca, cik sapratu tad no funkcijas uz main tas nedarbojas

visticamāk ka mana pieeja ir gaužām līka, ir kāds cits pieejas veids ?

Link to comment
Share on other sites

tā ir mana līkā pieeja kā ievietot jaunu vērtību

pieņemsim, ka palaižot ievadu powerLevel 10, sākās cikla izpilde, un tad ar ifu salīdzina ja vērtība nav mainījusies piedāvāt to nomainīt pret jaunu.. un dēļ tās pārbaudes arī while cikls nokaras un powerLevel visu laiku ir 100, ja to iestarpinājumu nahrenizē, tad ievada mainīgā vērtību, while cikls izpildās kā tam vajadzētu ģenerējot pwm signālu, un arī tad programma ieciklējas un to var izslegt tikai ar ctrl+c

ps rakstu zem ubunta

Edited by ANALGINS
Link to comment
Share on other sites

Vienkārši skaidri un gaiši izstāsti programmas darbību no sākuma līdz beigām ar visiem nosacījumiem, tad būs daudz vienkāršāk palīdzēt.

While ciklu labāk ir taisīt main blokā, funkcijai ir jābūt beigām, pat rekursijas gadījumā, savādāk - not responding. Ar input un output mainīgajiem vari salīdzināt ievadītās vērtības.

Link to comment
Share on other sites

es joprojām nesaprotu tā ifa konstrukciju un tavu domu gājienu... pirmkārt lietojot zīmi "=" tu nevis salīzini, bet iestādi vērtību. Otrkārt, vai nu es esmu akls, vai tu izmanto vienu un to pašu variabli... reāli tu vienmēr iegūsti true šajā izteiksmē izņemot gadījumu, kad powerLevel = 0.

Ja tu gribi kaut ko salīdzināt, tad tev ir jābūt kaut kādam PowerLevel_old variablim, kā arī jāizmanto "==" zīme

Link to comment
Share on other sites

worm taisniba

sita rindina

if (powerLevel = powerLevel)

1) tur ir rakstits - pieskirt powerLevel powerLevel un atgriezt powerLevel vertibu. Ti - tas pats, kas raksits

if (powerLevel). Ieksh C++ salidzinasana ir 2vi ==.

2) pat ja salidzinasana butu pareizi uzrakstita ar ==, tapatas si izteiksme vienmer atgrieztu true.

Beefs

lol jā nu viss skaidrs. tavs kods ir gavno. Taisīt PWM ar LPT portu! Sveicināts 1990 gads! :D

Beefs

Link to comment
Share on other sites

njā.. acīmredzot esmu lasījis pārsteidzoši labas "pamācības" kur tā īsti nebija izskaidrota atšķirība starp = un == ...

programmas darbibas princips ir elementārs, juzeris ievada powerLevel vērtību, kas ir procentos, un tiek ģenerēts pwm signāls..

es gribu lai pēc vērtības ievades, tiktu piedāvāts ievadīt to atkārtoti, tādējādi mainot pwm signāla intensitāti

es saprotu ka šobrīd domāju galīgi greizi, kāds būtu pareizais virziens ?

ps beef, nekritize tik ļoti citus, kāda šķirba ko kur un kā es daru, ja apgūšu kaut ko normāli būs par dažiem stulbiem jautājumiem mazāk, un par vienu "mācītāju" mazāk :thumbsup:

Link to comment
Share on other sites

Pamēģini uztaisīt šādi:

1) uzraksti funkciju, kas maina šo powerlevel (bez cin un cout);

2) main blokā uztaisi while ciklu, kas pārbauda, vai ievadītā vērtība nav kaut kāda izejas komanda, kā gribi, tā nodēvē (quit, exit);

3) cikla iekšienē pieprasi lietotājam ievadīt powerlevel;

4) kad tiek ievadīts powerlevel, tad nodod to funkcijai. Kamēr nebūsi ievadījis specifisku skaitli ( integer ) vai vārdu ( string ), tikmēr tev programma, liks vēlreiz un vēlreiz ievadīt powerlevel.

P.S. Ja gribi salīdzināt vērtības, tad uztaisi globālo mainīgo ( ārpus while ), lai nepazaudētu iepriekšējo vērtību.

Link to comment
Share on other sites

Ieciklēšanās notiek tad, ja kāda komanda tiek mūžīgi pildīta, bet lietotāja starpniecības. Šajā gadījumā cin (jeb consoles input komanda) to aptur.

Link to comment
Share on other sites

2vi varianti, ka to var darit

1) blokejoshais inputs (usera inputs) un asinhronais pwm uz portu (cita threada)

2) neblokejosh input un neblokejosh pwm (ti, viss taja pasha threada).

1)

uztaisi pwm funkiciju cikla ar globalu volatile mainigo ka while nosacijumu un globalu volatile pwm vertibu. palaid cita threada pwm funciju ar dutty cyle 0. galvenaja threada realize ievadi un maini pwm (volatile) vertibu. pie izejas uzstadi while nosacijuma mainigo uz false.

2)

lidzigi ka esoshais risinajums, tikai powerlevel=powerlevel aizstaj ar kadu f-ciju kura atgriezh true/false ja ir nospiesta kada poga uz klaviaturas. conio.h ir kbhit() fcija kas atgriezh > 0 kad ir nospiesta kada poga, neblokejosa.

Beefs

Bet vispar tava programma ir bezjedziga, jo nevares darboties normali nekur, jo normali netiek dota pieeja portiem shada veida. Korekti stradat ar LPT portu butu to atvert ka failu (dabut handli) gan zem linux gan windows.

Edited by 0xDEAD BEEF
Link to comment
Share on other sites

OMFG GOOOOOREE!


//LPT-controlled fan

#include <iostream>

#include <sys/io.h>

#include <conio.h>

#define base 0x378

using namespace std;

static int g_powerLevel = 0; //globals mainigais lai nav cakars

bool enterPowerLevel(void)

{

//seit realizejam ievadi. ja atgriezisim false, tad programma beigsies. izdoma, ka to realizet

cout << "Power level %: ";

cin >> g_powerLevel;

return true;

}

void runFan(void)

{

ioperm(base,1,1);

//Turn the fan to 100% for 1 second to get it spinning

outb(255,base);

sleep(1);

outb(0,base);

//Loop to generate PWM at a given percentage

while(1)

{

outb(0,base);

usleep(10000-g_powerLevel*100);

outb(255,base);

usleep(g_powerLevel*100);

if (kbhit() > 0)

{

if(!enterPowerLevel())

{

break;}

}

}

}

int main()

{

if(enterPowerLevel())

{

runFan(powerLevel);

}

}

Link to comment
Share on other sites

un tagad pasaki kāda jēga bija no tava posta ? kārtējo reizi parāda visu priekšā ar hax paņēmieniem no kuriem neko nesaprotu un skaidrojumu gugle kapēc tā un ne savādāk noteikti arī neatradīšu :fsckinsad::thumbsdown:

Link to comment
Share on other sites

Tu bļeģ ko ahujel?

Viss, ko es tev izdarīju priekšā ir neliels refaktorings + parādīju, kā lietot kbhit() funkciju + iznesu powerLevel kā globālu mainīgo.

Pizģēc tev ir Analgin! Nākam reiz, kad tevi satikšu, tad sitīšu. Labi, ka tu biji maziņš!

Beefs

Link to comment
Share on other sites

nu tur jau tā lieta, pa gabaliem ko līmēt kopā ir pieņemami, bet gatavu iedot ir šausmas, anyhow paldies par to, bet gcc nav conio.h libarija, uz ātro arī gugle neko neatradu..

iedod labāk kādas grāmatas / ebook nosaukumu :)

ps Tu jau uz gign jaunā gada svinībām nebrauc, tākā diezvai satiksimies kur citur lmfao

Edited by ANALGINS
Link to comment
Share on other sites

int main()

{

if(enterPowerLevel())

{

runFan(powerLevel);

}

}

BEEF, padotais mainīgais nav jābūt g_powerLevel?

P.S. BEEF, Vari lūdzu pastāstīt par PVM ? ( pietiks ar abbrevatūras garo nosaukumu)

Link to comment
Share on other sites

kā jau es teicu worm, esmu lasījis visādas pamācības iekš c hello world(lol kā tad bez tā), mainīgie, cikli, ganjau drīz nāks arī masīvi etc, sintakse tik traki arī neatšķiras no tiem pašiem delphi vai pascal, manuprāt tik cita "krāsa" :) tur arī problema ka līkroči māca ar līkām rokām.. būtu man lieki 30 - 50ls iegādātos kādu grāmatu ... savukārt beefs (neņem personiski beef) nesaskata cilvēku aptuveno zināšanu līmeni un uzreiz grūž iekšā pārāk advancētas lietas, kas bieži vien piegružo prātu..

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...