Programare

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Messages
8,467
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,125
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,467
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,125
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,467
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,125
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,467
Î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,084
Cât de limitate sunt resursele alea dacă trebuie să optimizezi aia?
 

Marius '95

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

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Messages
5,125
In ASH de la busybox, cu orice alte utilitare mai contine busybox-ul:

1)
Am un director cu symlink-uri catre diverse desstinatii. Vreau sa copiez in alta parte symlink-urile care au o anumita destinatie. Sau sa fac altele noi cu aceleasi nume.
Am incercat, de proba, ceva de genul asta:
Code:
find /director -type l -exec if [[ $( readlink "{}") == "destinatie" ]] \; then echo "{}" \; fi \; ;
... cu toate combinatiile posibile de escape-uri, punct-si-virgule, ghilimele, etc. Nu-mi iese nicicum.

2)
Chestia de mai sus, dar sa intrebe [Y/N] inainte de fiecare link copiat.
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Messages
8,467
Nu te chinui să escapezi totul până iese un one-liner, pune partea de procesare într-un shell script separat cu link-ul ca $1 și pune în exec doar call-ul către acel shell script cu parametru.
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Messages
8,467
Nu ai specificat "... dar să fie cea mai complicată variantă posibilă". Chiar dacă vine de la tine, uneori mă aștept să te doară prea tare masochismul...

Cât timp nu bagi totul în apostroafe/ghilimele și alte prostii, find se oprește la primul \; găsit (și neapărat \; pentru că de ex. ; de la sfârșit nu e escapat și e prins de shell, nu e trimis către find).

Probabil vei avea succes mai mare cu -exec sh -c 'if...... fi' \;
 
Top Bottom