Pętla while nie przerywa wykonywania kodu

W tym miejscu zadajemy pytania na temat języka C++, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Pętla while nie przerywa wykonywania kodu

Postautor: foreste » środa 27 wrz 2017, 21:23

Witam mam problem w pętlą while powtarza kod ciagle nie zwracając uwagi na liczbę cykli , np 3 razy chce by wykonał się kod.

Kod: Zaznacz cały

void alarm_power(int counter, float voltage_limit_definition )
{
   
   while (counter >= 0)
   {
      if (monitor_batery() <= voltage_limit_definition)
      {
         
            
         licznik.start();
            
         if (licznik.read_ms() >= 1500)
         {
               
            buzzer = !buzzer;
            licznik.reset();
               
         }
            
         
      }
      counter--;
   }
   }
♫,♫.¨♫

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Pętla while nie przerywa wykonywania kodu

Postautor: Antystatyczny » środa 27 wrz 2017, 21:27

Jakiego typu jest zmienna counter? Nigdzie nie widać jej deklaracji.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Re: Pętla while nie przerywa wykonywania kodu

Postautor: foreste » środa 27 wrz 2017, 21:29

Antystatyczny pisze:Jakiego typu jest zmienna counter? Nigdzie nie widać jej deklaracji.
tak wyglada w głównej while(1)

Kod: Zaznacz cały

alarm_power(3, 4.10);
♫,♫.¨♫

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Pętla while nie przerywa wykonywania kodu

Postautor: Antystatyczny » środa 27 wrz 2017, 21:34

Ok, moja ślepota. Counter jest typu int. No dobra, jeśli dobrze rozumiem... powyższy kod ma się wykonywać tak długo, aż wartość zmiennej counter spadnie poniżej zera i zasadniczo nie widzę tam problemu. W pętli while jest dekrementacja tej zmiennej, a jej typ umożliwia zejście poniżej zera. Inna sprawa jest taka, że w pętli głównej wywołujesz funkcję alarm_power(), a więc notorycznie nadajesz zmiennej counter wartość 3.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Re: Pętla while nie przerywa wykonywania kodu

Postautor: foreste » środa 27 wrz 2017, 21:40

Antystatyczny pisze:Ok, moja ślepota. Counter jest typu int. No dobra, jeśli dobrze rozumiem... powyższy kod ma się wykonywać tak długo, aż wartość zmiennej counter spadnie poniżej zera i zasadniczo nie widzę tam problemu. W pętli while jest dekrementacja tej zmiennej, a jej typ umożliwia zejście poniżej zera. Inna sprawa jest taka, że w pętli głównej wywołujesz funkcję alarm_power(), a więc notorycznie nadajesz zmiennej counter wartość 3.

jak to naprawić lub poprawić ?.
♫,♫.¨♫

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Pętla while nie przerywa wykonywania kodu

Postautor: Antystatyczny » środa 27 wrz 2017, 21:46

To zależy, co tak naprawdę chcesz osiągnąć. Obecnie wywołujesz funkcję alarm_power() non stop, więc pewnie Ci się wydaje, że tak funkcja działa cały czas. Zastanów się najpierw, kiedy ta funkcja ma być wywoływana, bo nie sądzę, by musiała być wywoływana setki tysięcy razy na sekundę.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Pętla while nie przerywa wykonywania kodu

Postautor: Antystatyczny » czwartek 28 wrz 2017, 20:41

Wróżki doniosły, że chcesz, aby kod wewnątrz funkcji został wykonany trzykrotnie, a potem jego wykonanie miałoby być udaremniane zewnętrzną zmienną. Oto moja propozycja naskrobana na kolanie:

Kod: Zaznacz cały

typedef enum
{
    LockType_Unlocked = 0,
    LockType_Locked
}LockType;

LockType lock = LockType_Unlocked;

void foo(void)
{
    if(lock == LockType_Unlocked)
    {
        for(int i = 0; i < 3; ++i)
        {
            //put your code here
        }
       
        lock = LockType_Locked;
    }
}

int main(void)
{
    while(true)
    {
        foo();
    }
}



Ot, taka prosta konstrukcja. Zmienna lock umożliwia sterowanie wykonywaniem kodu wewnątrz funkcji foo().
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Re: Pętla while nie przerywa wykonywania kodu

Postautor: foreste » sobota 30 wrz 2017, 13:01

Napisałem podobny kod ale nie robi 3 razy kodu tylko jakby tylko opóźniło to

Kod: Zaznacz cały

oid alarm_power( float voltage_limit_definition )
{
   
   
      if (monitor_batery() <= voltage_limit_definition)
      {
         if (lock == 0)
         {
            for (int x =0; x < 3; x++)
            {
               licznik.start();
            
               if (licznik.read_ms() >= 1500)
               {
               
                  buzzer = !buzzer;
                  licznik.reset();
               
               }
               
            }
            lock = 1;
         }
      }
   }

edit
problem rozwiążany zamiast while i for dałem typowe if i kod chodzi

Kod: Zaznacz cały

void alarm_power( float voltage_limit_definition )
{
   
   
      if (monitor_batery() <= voltage_limit_definition)
      {
         if (lock <= 4)
         {
         
               licznik.start();
            
               if (licznik.read_ms() >= 1500)
               {
               
                  buzzer = !buzzer;
                  licznik.reset();
               
               }
            lock++;
            }
            
         
      }
   }

A tak wygląda cały kod programu

Kod: Zaznacz cały

#include "mbed.h"
#include "MPL3115A2.h"
#include "Terminal.h"
#include "eeprom.h"
#include "cstdlib"
#include "string"

#define EEPROM_ADDR 0x00   // I2c EEPROM address is 0x00

#define SDA PTE25            // I2C SDA pin
#define SCL PTE24           // I2C SCL pin
int32_t eeprom_size ,  addr;
Terminal pc(PTA2, PTA1); // tx, rx
I2C i2c(PTE0, PTE1);       // sda, scl
EEPROM brain(SDA, SCL, EEPROM_ADDR, EEPROM::T24C08);
MPL3115A2 sensor(&i2c, &pc);
int temperature_live_state;
static int read_user_temp;
int val = 0;
int *temp_data = &read_user_temp;
Timer licznik;
char buffer[20];
char dane[4];
float  check_battery;



DigitalOut myled1(PTA12);     // Sanity check to make sure the program is working.
DigitalOut buzzer(PTD1, 1 );     // Sanity check to make sure the program is working.
AnalogIn batery(PTC2);
int lock  = 0;

float monitor_batery()
{
   check_battery = batery.read();
   float resume;
return    resume = (check_battery*4.1);
}
void refresh_buffer()
{
   for (int y = 0; y < sizeof(buffer); y++)
      buffer[y] = 0;
   for (int z = 0; z < sizeof(dane); z++)
      dane[z] = 0;
}      
void serials()
{
   if (pc.readable())
   {
      pc.scanf( "%s", buffer);
   }
}

void signaller()
{
   licznik.start();
   
   if (licznik.read_ms() >= 1000)
   {
      buzzer = !buzzer;
      licznik.reset();
   }
   
}

void alarm_power( float voltage_limit_definition )
{
   
   
      if (monitor_batery() <= voltage_limit_definition)
      {
         if (lock <= 4)
         {
         
               licznik.start();
            
               if (licznik.read_ms() >= 1500)
               {
               
                  buzzer = !buzzer;
                  licznik.reset();
               
               }
            lock++;
            }
            
         
      }
   }

void alarm_temp(string  & temp_read_input)
{
   string str = temp_read_input;
   temperature_live_state = atoi(str.c_str());
   if (temperature_live_state >= *temp_data)
   {
      signaller();
   }
   if (*temp_data > temperature_live_state)
   {
      buzzer = 0;
   }
   
}

void screen()
{
   pc.foreground(0xFFFF00);
   pc.hideCursor();
}
void intro()
{
   pc.locate(15, 5);
   pc.printf(" ** inteligentny Termometr   ** ");
   pc.locate(15, 6);
   pc.printf("Created by Foreste");
}
void labels()
{
   pc.locate(10, 7);
   pc.printf("Temperatura");
   pc.locate(25, 7);
   pc.printf("Cisnienie");
   pc.locate(38, 7);
   pc.printf("otrzezenie wysokiej temp");
   pc.locate(65, 7);
   pc.printf("Bateria");
}
void input_add_user_define_temperature()
{
   int tempint;
   refresh_buffer();
   
   screen();
   intro();
   pc.locate(1, 7);
   pc.printf("Wpisz wartość temperatury ,po której termometr bedzie sygnalizował przekroczenie");
   
   if (pc.readable())
   {
      pc.scanf("%s", dane);
      
   }   
   
   
   for (int   z = 0; z < 4; z++)
   {
               
      if (isdigit(dane[z]))//sprawdzanie czy znak jest liczbą
      {
       
         tempint = atoi(dane); //kowertowanie tablicy typu char na zmienną int
            
      }
   }
   
            
   *temp_data = tempint;
   if ((*temp_data >= 1) && (*temp_data <= 99))
   {
      
      if ((*temp_data >= 12) && (*temp_data <= 40))
      {
         pc.cls();
         screen();
         intro();
         brain.write(eeprom_size = 8, (int32_t) *temp_data);
         pc.locate(20, 7);
         pc.printf("Zapisalem podaną temperature przekroczenia");
         wait(5);
         val = 1;
         //fflush(stdin);
         refresh_buffer();
         pc.cls();
            
      }
      else
      {
         pc.cls();
         screen();
         intro();
         pc.locate(20, 7);
         pc.printf("Wpisano niepoprawne dane. Dopuszczalny zakres: od 12 do 40");
         wait(5);
         pc.cls();
         
      }
   }
}

   

void rs232_menu()
{
   
   if (strcmp(buffer, "reset") == 0)
   {
      NVIC_SystemReset();
   }
   else if (strcmp(buffer, "alarm") == 0)
   {
      pc.cls();
      while (val <= 0)
      {
         input_add_user_define_temperature();
      }
   }
   
}

int main() {
   int lock  = 0;   
   pc.baud(9600);     
   pc.cls();
   sensor.init();
   screen();
   intro();
   wait(5);
   Temperature t;
   Pressure p;                                                                                                                                     
   sensor.setOffsetTemperature(20);
   sensor.setOffsetPressure(-32);
   brain.read((uint32_t)(eeprom_size = 8), (int32_t&) *temp_data);
   
   while (read_user_temp <= 0)
   {
      while (val <= 0)
      {
         input_add_user_define_temperature();
      }      
   }
   pc.cls();
   
   
   while (1)
   {
      val = 0;
      
      sensor.readTemperature(&t);
        sensor.setModeStandby();
      sensor.setModeBarometer();
      sensor.setModeActive();
      sensor.readPressure(&p);
      
      screen();
      intro();
      labels();
      string temp_cache = t.print();
      pc.locate(10, 9);
      pc.printf("%s C", t.print());
      pc.locate(25, 9);
      pc.printf("%s Hpa", p.print());
      pc.locate(45, 9);
      pc.printf("%d", *temp_data);
      pc.locate(65, 9);
      pc.printf("%1.2fV", monitor_batery());
      pc.locate(65, 11);
      pc.printf("%d", licznik.read_ms());
      pc.locate(65, 12);
      alarm_temp(temp_cache);
      serials();
      alarm_power(4.20);
      rs232_menu();
      
      sensor.setModeStandby();
      sensor.setModeAltimeter();
      sensor.setModeActive();
      
   }
}
♫,♫.¨♫


Wróć do „Pisanie programów w C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości