Lennox napísal: ↑03 Apr 2024, 14:41
Nuž a tu by som potreboval nejak ozrejmiť akú výhodu má v tom mojom skúšobnom kóde používať pointre, keď ten kód funguje identicky aj v prípade, že pointre vynechám viď:
Kód: Vybrať všetko
#include "debug.h"
#include "i2c_LCD.h"
u_char str_val[16];
// rutina na vypis na LCD
void Print_On_Lcd (int ptr){
sprintf(str_val,"VAR=%3d",ptr);
LCD_PrintXY(0, 0,str_val);
}
int main(void){
SystemCoreClockUpdate();
Delay_Init();
LCD_Config();
int x = 800; // zapis do premennej x hodnotu 800 dec
int y = 13; // zapis do premennej y hodnotu 13 dec
while(1){
Print_On_Lcd(x); // vypis na LCD hodnotu premennej x
Delay_Ms(2000);
Print_On_Lcd(y); // vypis na LCD hodnotu premennej y
Delay_Ms(2000);
}
}
V tvojom kóde v podstate žiadnu výhodu ale ak by si mal pole napríklad 1kb tak bez pointrov by si musel ho cele poslať do funkcie teda alokovať dalši 1kb a takto pošleš len jeden uint32 s adresou a ďalej už len ju inkrementuješ napríklad a čítaš hodnoty ktoré potrebuješ . Menej náročne na pamäť a rýchlejšie
Edit:
Tak tiež môžeš pozívať pointre na funkcie, a napríklad napísať nejaký univerzálny C kod pre spracovanie dat z periferie (templomer/vlhkomer/tlakomer....) , a funkcie pre hardverovu komunikáciu cez spi/i2C/uart ukázať cez pointer ďalej ak použiješ iný chip stačí len napísať hardvérové funkcie.
tu je príklad z mojej knižnice kde som si takto SPI komunikáciu spravil cez pointre teraz mi stačí napísať na ktoromkolvek mcu týchto 6 funkcii v inite ukázať ich adresu a bude to pracovať bez toho aby som knižnicu nejako upravoval.
Kód: Vybrať všetko
.h subor
extern void (*w5500_CS_SET)(void); // toggle down pin SCSn , Chip Select for SPI bus , Low: selected
extern void (*w5500_CS_RESET)(void); // switched up pin SCSn , Chip Select for SPI bus , High: deselected
extern void (*w5500_RST_SET)(void); // toggle down pin RSTn , Reset Chip, Low: selected
//Active low RESET should be held low at least 500 us for W5500 reset
extern void (*w5500_RST_RESET)(void); // switched up pin RSTn , Reset Chip, High: deselected
extern void (*w5500_delay_ms)(uint32_t); // delay function
extern void (*w5500_SPI_Transmit_Receive) (uint16_t*, uint16_t*,const uint16_t);
Kód: Vybrať všetko
void w5500_func_init (void)
{
//pointer to spi HW function
w5500_delay_ms = delay_ms;
w5500_RST_SET = w5500_rst_set;
w5500_RST_RESET = w5500_rst_reset;
w5500_SPI_Transmit_Receive = w5500_spi_transmit_receive;
w5500_hardware_reset(); // hw reset w5500 chip
w5500_delay_ms(5000);
w5500_sw_reset(); // sw reset w5500 chip
w5500_delay_ms(100);
}