Skocz do zawartości

Nietypowe deklaracje zmiennych


Pomocna odpowiedź

3 minuty temu, rafal220 napisał:

 

 

A to w ten sposób idzie... To już trochę komplikuje sprawę, bo gdybym miał więcej podobnych funkcji, to będę to musiał podobnie porozrzucać po całym kodzie. A już myślałem, że całą funkcję da się tak fajnie zrobić w jednym miejscu jak to było przedstawiane w przykładzie z kursu.   

No funkcje to potęga! Piszesz kawałek kodu w jednym miejscu i za pomocą jej nazwy wywołujesz sobie z którego miejsca chcesz w kodzie...

(edytowany)
16 minut temu, rafal220 napisał:

A to w ten sposób idzie... To już trochę komplikuje sprawę

Jest coś takiego jak pliki .h i .hpp żeby uniknąć komplikacji insynuowanych tutaj, to są pliki nagłówkowe, tworzy się je po to aby nie powtarzać definicji fukcji. I czasem tych plików nagłówkowych potrafić być sporo...

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_freertos_hooks.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
#include "freertos/timers.h"
#include "freertos/event_groups.h"

#include "esp_log.h"
#include "esp_system.h"
#include "esp_netif.h"
#include "esp_event.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "esp_wifi.h"

#include "esp_ota_ops.h"
#include "esp_partition.h"

#include "lwip/sockets.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>
#include <errno.h>



#include "driver/gpio.h"
#include "driver/rmt.h"
#include "time.h"

#include "wifi.h"
#include "ota.h"
/* Littlevgl specific */
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
//#include "lvgl/lvgl.h"
//#include "lv_conf_template.h"
#include "lvgl_helpers.h"
#include "ui.h"
#include "ui_helpers.h"

#include "myuifunct/events.h"

  #include "strip_driver.h"
#include "WS2812func.h"
#include "rotary_encoder.h"
//#include "button_gpio.h"
#include "iot_button.h"
#include "nvs_data.h"

🙂 a to i tak nie wszystko  

 

 

 

Edytowano przez _LM_
Gość
14 minut temu, _LM_ napisał:

a to i tak nie wszystko  

Jak masz bardzo dużo pamięci, to możesz kopiuj wklej uruchomić całą zawartość notatnika podstawowych nazw bibliotek...

 

16 minut temu, farmaceuta napisał:

No funkcje to potęga!

Zgadzam się, ale jak zrobić zamknięte działanie? Teraz spróbowałem czegoś takiego.

 

int iloczyn(void); // Deklaracja

void setup() 
{
    Serial.begin(9600);
}

void loop() 
{
    Serial.println(iloczyn);
    delay(100);
}

int iloczyn (void) // Definicja
{
 int x=2; 
 int y=2;
    return x * y;
}

Czyli na razie samo działanie ma obliczać. Później rozbuduję to o zmienne w okrągłych nawiasach.   

A teraz następny knif bo narzekasz że źle się wymyśla kolejne nazwy zmiennych (racja, też bym narzekał) szczęśliwie mądrzy ludzie wymyślili coś takiego jak struktury i typy złożone. Potrzebujesz sprawdzać parametry stu silników? No problem: definiujesz typ 
 

typedef struct
{
  bool praca;
  float temperatura;
  uint32_t prad;
}silnik_t;

następnie obiecane sto silników

silnik_t stoSilnikow[100];

jak odwołać się do konkretnej wartości? A o, tak:

prinf("prad silnika 33 = %dA\n",stoSilnikow[33].prad);

 

Gość
9 minut temu, _LM_ napisał:

jak odwołać się do konkretnej wartości? A o, tak:

No nie to miałem na myśli. Odwołanie do maszyny mogę zrobić poprzez zmienną np. motor_WS1_łoz_1_C1, albo słynne kksy w których na bank się pogubisz jak nie masz wyklepane na pamięć. 

Rozchodzi mi się  o zmienne lokalne które będą działać jedynie w samej funkcji do czystych obliczeń tak aby wartości nie wyprowadzać na zewnątrz funkcji. 

(edytowany)

Po to przynudzamy tu i ówdzie że zmienne i funkcje powinny po nazwie sugerować swoje przeznaczenie co jest bardziej zrozumiałe:

void zal_betoniarke_macka_ale_na_budowie_przepustu_w_sopotni();

czy 

void mieszaj_beton(mieszamyBeton_t info);

 

Edytowano przez _LM_
(edytowany)

Oczywiście typ mieszamyBeton_t musi być jasno określony:

typedef struct{
char * nazwamajstra; // ten od maćka
char * budowa; // w sopotni
char * ktoObsluguje // maciek
char * corobimy; // mieszamy beton
int ktorabetoniarka[5]; // jest 5 betoniarek a maciek obsluguje drugą
}mieszamyBeton_t; 
  

 

Edytowano przez _LM_
Gość
7 minut temu, _LM_ napisał:

Po to przynudzamy tu i ówdzie że zmienne i funkcje powinny po nazwie sugerować swoje przeznaczenie co jest bardziej zrozumiałe:

To się zgadza. Ale czy zastanawiasz się ile razy betoniarka się obróci w czasie rozrabiania betonu? Chcę zadeklarować w funkcji działania które mnie nie interesują na zewnątrz funkcji. Owszem funkcja będzie mieć swoją nazwę tzw. nazwy zmiennych wejściowych i wyjściowych, ale jak zadeklarować zmienne które będą istotą samej funkcji? np. zmienne współczynników w obliczeniach których nie chcesz wyprowadzać poza funkcję?

Wyobraź sobie, że zmienne x, y to współczynniki. Jak zrobić żeby to działanie wykonało się jedynie wewnątrz funkcji, oraz zwróciło wynik do return i printa?

int iloczyn(void); // Deklaracja

void setup() 
{
    Serial.begin(9600);
}

void loop() 
{
    Serial.println(iloczyn);
    delay(100);
}

int iloczyn (void) // Definicja
{
 int x=2; 
 int y=2;
    return x * y;
}

 

int iloczyn(int x, int y); // Deklaracja

int iloczyn (int x, int y) // Definicja
{
    return x * y;
}

wywołanie:

int z = iloczyn(2,2);
printf(z)

 

7 minut temu, rafal220 napisał:

ale jak zadeklarować zmienne które będą istotą samej funkcji?

w funkcjach nazwy zmiennych mogą się powtarzać np:

int iloczyn(int x, int y); // Deklaracja

int iloczyn (int x, int y) // Definicja
{
    return x * y;
}

i
 

int suma(int x, int y); // Deklaracja

int suma (int x, int y) // Definicja
{
    return x + y;
}

 

Gość

No ale to nie pójdzie w ten sposób, bo na zewnątrz dalej musisz określić wartości umownych współczynników.

A ja chcę zrobić taki myk;

int iloczyn(int x, int y); // Deklaracja

void setup() {
  Serial.begin(9600);
}

void loop() {

Serial.println(iloczyn);

}
int iloczyn (int x, int y) // Definicja
{
    return x * y;
}

Zwróć uwagę że w serialu mam nazwę samej funkcji, a w środku funkcji wartości współczynników np. x=2 i y=2. Jak zrobić, aby działanie się wykonało, a funkcja zwróciła wartość jedynie do samej nazwy? Czyli nie podajemy w print wartości stałych współczynników które nas nie interesują. Funkcja ma tylko zwrócić wartość z mnożenia współczynników bez określania ich wartości w print.  No tego nie kumam.

albo na przykład chcesz po podaniu promienia znać obwód koła (2πr)

float obwod(float r)

{

   return 2.0*3.14*r;

}

możesz zrobić definicję stałej PI 
 

#define PI 3.14f
  
  float obwod(float r)

{

   return 2.0*PI*r;

}

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...