Programare

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:
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
 
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)++.
 
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:
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) {}
 
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:
Î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.
 
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.
 
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.
 
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' \;
 
Are cineva un php cu sqlite3 sa testeze chestia asta?
Code:
$DB=new SQLite3('/tmp/test.sqlite');
$DB->exec('CREATE TABLE test (ID INTEGER NOT NULL PRIMARY KEY, OtherID INTEGER NULL UNIQUE);');
$DB->exec('BEGIN;');
$STATEMENT=$DB->prepare('INSERT INTO test (OtherID) VALUES (:OtherID) RETURNING ID,OtherID');
$STATEMENT->bindValue(':OtherID','1234');
$RESULT=$STATEMENT->execute();
$ROW=$RESULT->fetchArray();
var_dump($ROW);
$DB->exec('COMMIT;');
Ziceti ce versiuni aveti si daca merge sau nu.
Multumesc!
 
N-am așa ceva, dar singura chestie fishy e partea cu bindValue(': OtherID','1234') - în prepared statements faci bind direct la tipul de date folosit, nu la string, pentru că altfel valoarea poate să fie interpretată dubios. Adică bindValue(': OtherID',1234, SQLITE3_INTEGER). Altfel e ceva nedeterminat, care ar putea să aibă rezultate surprinzătoare în funcție de versiuni.
 
Nope. Tot nu merge.
Cu sau fara SQLITE3_INTEGER:
SQLite3Result::fetchArray(): Unable to execute statement: UNIQUE constraint failed: test.OtherID
N-am inteles cum poate sa nu fie unic, din moment ce baza de date e goala. Si cum naiba da eroarea abia la fetchArray?

PS: fara tip, nu e ceva nedeterminat, este SQLITE3_TEXT in php<7 si tipul variabilei in php>7. Dar oricum nu-i acolo problema.
 
Last edited:
WTF?! Bah, cum naiba mi se intampla sa dau numai peste aberatii din astea?
OK deci, PHP s-a dus draq. Ce pot folosi in loc de PHP? (Daca zice careva ASP, scot mitraliera! :kill: )
Lua? Tcl?
 
Back
Top