Programare

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Messages
8,447
Simplu, pentru că are mai multe forme și de fapt folosește
Code:
bool I2CDevice::read_bytes(uint8_t a_register, uint8_t *data, uint8_t len, uint32_t conversion) { // NOLINT
  return this->parent_->read_bytes(this->address_, a_register, data, len, conversion);
}
dar în i2c.h semnătura este
Code:
     bool read_bytes(uint8_t a_register, uint8_t *data, uint8_t len, uint32_t conversion = 0);
(conversion are un default 0 așa că poate să lipsească)

Vezi polymorphism / overloading / default arguments.

LE: editat cu versiunea corectă de semnătură

legătura se face prin
Code:
 class DHT12Component : public PollingComponent, public i2c::I2CDevice {
(dht12 extinde i2cdevice care conține acel read_bytes)
 
Last edited:

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Messages
5,097
Ma chinuie niste pointeri. Pls help!

Code:
#include <stdio.h>
int main(){
int data=123;

int inc_data_copy(int d){
    printf("\n Copy1: %d",d);    // 123 - corect
    d++;
    printf("\n Copy2: %d",d);    // 124 - corect
    return(d);}

int inc_data_ptr(int *d){
    printf("\n Ptr1: %d",*d);    // 123 - corect
    *d++;
    printf("\n Ptr2: %d",*d);    // o aberatie - De ce?
    return(*d);}



printf("\n Initial : %d",data);                  // 123 - corect
printf("\n RetCopy : %d",inc_data_copy(data));   // 124 - corect
printf("\n PostCopy: %d",data);                  // 123 - corect
printf("\n RetPtr  : %d",inc_data_ptr(&data));   // aberatia de mai sus
printf("\n PostPtr : %d",data);                  // 123 - De ce nu-i 124?
printf("\n");
} //main
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Messages
8,447
Vezi că * e un operator iar ++ e altul, iar precedența operatorilor zice că se execută ++ mai întâi, așa că tu incrementezi d, nu (*d). Aberația e ce e în memorie după int-ul ăla, pentru că ai incrementat adresa (pointer-ul) și nu valoarea din zona de memorie. Vezi cu (*d)++.
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Messages
5,097
Simplu, pentru că are mai multe forme și de fapt folosește
Code:
bool I2CDevice::read_bytes(uint8_t a_register, uint8_t *data, uint8_t len, uint32_t conversion) { // NOLINT
  return this->parent_->read_bytes(this->address_, a_register, data, len, conversion);
}
Cum fac sa apelez functia initiala dupa ce a fost modificata? Imi trebuie acces la acel "this->address_" in care vreau sa scriu altceva si care nu mai exista in varianta a doua a functiei.

Am incercat:
- this->write_byte(0x68,0x82,0xFE) => no matching function for call to 'esphome::axp192::AXP192Component::write_byte(int, int, int)'
- write_byte((uint8_t) 0x68, (uint8_t) 0x82, (uint8_t) 0xFE) => has not been declared
- this->write_byte((uint8_t) 0x68, (uint8_t) 0x82, (uint8_t) 0xFE) => no matching function for call to 'esphome::axp192::AXP192Component::write_byte(uint8_t, uint8_t, uint8_t)'
- esphome::i2c::I2CComponent::write_byte((uint8_t) 0x68, (uint8_t) 0x82, (uint8_t) 0xFE) => cannot call member function 'bool esphome::i2c::I2CComponent::write_byte(uint8_t, uint8_t, uint8_t)' without object
- esphome::i2c::I2CComponent::this->write_byte(0x68,0x82,0xFE) => expected unqualified-id before 'this'
- this->esphome::i2c::I2CComponent::write_byte((uint8_t) 0x68, (uint8_t) 0x82, (uint8_t) 0xFE) => 'esphome::i2c::I2CComponent' is not a base of 'esphome::axp192::AXP192Component'
- sa includ i2c::I2CComponent in definitia clasei mele (AXP192Component) => numeroase "request for member '<bla bla>' is ambiguous"
 
Last edited:

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Messages
8,447
Păi faci un alt obiect DHT12 whatever la care îi dai adresa (presupun că are opțiunea). Sau folosești direct un obiect I2CDevice pe care-l inițializezi cu un I2CComponent ca "parent" și atunci ai acces prin I2CComponent:

Code:
I2CDevice(I2CComponent *parent, uint8_t address) : address_(address), parent_(parent) {}
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Messages
5,097
Pe un MCU cu resurse limitate, am nevoie sa modific un bit (2) intr-un registru A al unei alte componente conectate prin I2c.

Code:
bool state; //starea finala care se doreste a fi setata in bitul ala
smallint A;
A = <comanda care citeste registrul prin I2c>
if( bool((A>>2)&1) != state ){
  A^=0x4;
  <comanda care scrie in registru prin I2c>
}

Exista vreun mod mai eficient in care pot scrie acel "if"?
Multumesc.

PS: Unde gasesc un tabel cu operatiile cu bool cum are PHP-ul?
 
Last edited:

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Messages
8,447
În C e mai simplu, orice e diferit de 0 e true.

(A>>2)&1 e echivalent cu A&4, și nu faci calcule de fiecare dată. Dacă vrei să fii complet dubios, poți folosi if ((!!(A&4) != state)

Oricum, compilatoarele optimizează chestiile astea pe pâine, nu trebuie să te chinui prea tare.
 

Thor

Membru Junior
Sugar daddy
Joined
Dec 6, 2004
Messages
2,076
Cât de limitate sunt resursele alea dacă trebuie să optimizezi aia?
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Messages
5,097
"state" il primesc; nu-i al meu.
((!!(A&4) != state) nu-i foarte citibil.
!(A&0x4) == state ?
 
Top Bottom