Gilbert Sparios Postat Februarie 5, 2021 Partajează Postat Februarie 5, 2021 (editat) Sa presupunem ca avem urmatoarea structura: typedef struct __attribute__((packed)) { byte zona1; byte zona2; byte zona3; .... ..... byte zona40; } mySETTINGS; in anumite situatii, avem nevoie sa alocam diferite variabile si va trebuii sa scriem cod. o sa simplific ideea in toate situatiile se va aduna cod, cam o caruta. pe mine nu ma doare mana dar creste skech-ul... zona1 = 12; zona2 = 32; zona3 = 11; .... .. zona40 = 1; cum as putea sa fac ceva de genul: for (uint8_t i=0; i<ITEM_IN_STRUCT;i++) { mySETTINGS.zona[i] = random(0,255); } in javascript merge de exemplu.. in Delphi merge..dar in C++/Arduino.. ? as cauta pe net, dar nu stiu exact dupa ce sa caut.. ar fi varianta sa fac multidimensional dar sunt curios daca se poate si asa cum am intrebat Editat Februarie 5, 2021 de Gilbert Sparios Link spre comentariu
bcristian Postat Februarie 5, 2021 Partajează Postat Februarie 5, 2021 Union declaration - cppreference.com #pragma pack(push, 1) union S { struct Names { int a; __int8 b; } names; unsigned __int8 bytes[sizeof(Names)]; }; #pragma pack(pop) Link spre comentariu
Gilbert Sparios Postat Februarie 6, 2021 Autor Partajează Postat Februarie 6, 2021 (editat) nu știu ce treaba are union aici, ca doar nu vreau sa descompun in high /low Rezolvarea e doar cu multidimensional. javascript poate face asta pentru ca nu se compileaza. delphi se compileaza, dar e totuși pentru windows.. nu cred ca merge ce am intrebat altfel decat struct nea_caisa { byte zona[40]; } dorel; for.... (){ zona[i] = xn } Editat Februarie 6, 2021 de nico_2010 Link spre comentariu
nico_2010 Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 De ce nu testezi idea inainte de a posta intrebarea? Este mai simplu si mai rapid asa! Link spre comentariu
bcristian Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 Acum 7 ore, Gilbert Sparios a spus: nu știu ce treaba are union aici, ca doar nu vreau sa descompun in high /low Rezolvarea e doar cu multidimensional Daca esti sigur ca rezolvarea e doar in felul ala, de ce mai intrebi? Trecand peste faptul ca ce ai postat nu e multidimensional. Ai incercat varianta pe care ti-am aratat-o? Ai incercat sa intelegi ce face? Link spre comentariu
mihaicozac Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 (editat) Dacă ai variabile gen zona1, zona2, etc cum vrei să ştie compilatorul de ceva gen zona[i] fără a declara arie ? O structură omogenă nu prea se justifică în general. Rezolvarea se poate face şi folosind un pointer: byte *index = &mySETTINGS; for(i = 0; i < ce_vrei_tu; i++) *(index + i) = random(0, 255); Editat Februarie 6, 2021 de mihaicozac Link spre comentariu
Gilbert Sparios Postat Februarie 6, 2021 Autor Partajează Postat Februarie 6, 2021 Acum 3 ore, mihaicozac a spus: Dacă ai variabile gen zona1, zona2, etc cum vrei să ştie compilatorul de ceva gen zona[i] fără a declara arie ? O structură omogenă nu prea se justifică în general. Rezolvarea se poate face şi folosind un pointer: byte *index = &mySETTINGS; for(i = 0; i < ce_vrei_tu; i++) *(index + i) = random(0, 255); mySettings ce e..? structura omogena de mai sus..? Cristian, nu înțeleg codul tău din păcate nu știu sa lucrez deocamdată cu union. știam doar putin. nico, iar ai dreptate dar dacă nu postam nu ma gandeam la multi. Link spre comentariu
mihaicozac Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 mySETTINGS este numele structurii declarate de tine în primul post. la bucla for am uitat să declar tipul variabilei i, my bad. Link spre comentariu
bcristian Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 Hai sa o luam de la inceput. Ce vrei sa faci de fapt? Codul din intrebarea initiala nu prea are logica. De ce ai declara byte b0, b1, b2, ... in loc sa declari pur si simplu byte b[N], un array? Daca ce vrei de fapt este sa umpli o structura cu zero sau alta valoare, ai memset. Link spre comentariu
Gilbert Sparios Postat Februarie 6, 2021 Autor Partajează Postat Februarie 6, 2021 pentru ca pur și simplu nu stiu de ce nu mi-a dat in cap până sa postez. eu vroiam sa formez cumva in ciclu for numele variabilei. o porcarie, acum nu mai pot retrage prostia.. Link spre comentariu
Gilbert Sparios Postat Februarie 6, 2021 Autor Partajează Postat Februarie 6, 2021 Acum 16 ore, bcristian a spus: Union declaration - cppreference.com #pragma pack(push, 1) union S { struct Names { int a; __int8 b; } names; unsigned __int8 bytes[sizeof(Names)]; }; #pragma pack(pop) incerc sa invat treaba cu #pragma pack daca am inteles eu bine ...ai renuntat la padding-uri prin pack(push,1) ? si pack(pop) e un fel de undo sau... nu prea inteleg ce e cu .. mai nou am problema intr-o structura in ESP8266. structura mea e asa struct __attribute__((__packed__)) _LiveStruct { uint8_t ZONEHEAT[ZONE_COUNT]; unsigned short LIVETEMP[ZONE_COUNT]; }; _LiveStruct LIVE; cand schimb insa LIVE.LIVETEMP[i] = (uint16_t) variabila; se modifica si ZONEHEAT. Cam ultima cu prima din ceaalta variabila. am ales atribut packed, degeaba. fara packet merge mai bine dar tot imi baga uneori problema. cod-ul nu conteaza pentru ca fac verificari fara cod, doar cu problema asta.. cumva...se amesteca datele , nu se aliniaza ce sa-i fac ? Link spre comentariu
Bandi Szasz Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 (editat) Acum 17 minute, Gilbert Sparios a spus: cand schimb insa LIVE.LIVETEMP[i] = (uint16_t) variabila; se modifica si ZONEHEAT. Cam ultima cu prima din ceaalta variabila. am ales atribut packed, degeaba. fara packet merge mai bine dar tot imi baga uneori problema. cod-ul nu conteaza pentru ca fac verificari fara cod, doar cu problema asta.. cumva...se amesteca datele , nu se aliniaza ce sa-i fac ? Pai si cam ce te astepti sa faca?? Tu ai alocat un spatiu de 8biti (uint8_t) si ii zici sa iti memoreze valoare cu 16biti... ii mai faci si typecast fortat prin "(uint16_t)" la 16biti..., inca nu am ajuns in punctul in care compliatorul sa ghieasca in globul de cristal ce sa faca si atunci aia 8 biti ramasi pe afara ti-l salveaza in urmatoarele 8biti a zonei de memorie care era alocat pt ZONEHEAT. Editat Februarie 6, 2021 de Bandi Szasz Link spre comentariu
modoran Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 Vezi ca #pagma aia depinde exclusiv de compilator, cu altul poate sa nu faca absolut nimic sau sa faca altceva. Link spre comentariu
Gilbert Sparios Postat Februarie 6, 2021 Autor Partajează Postat Februarie 6, 2021 (editat) Acum 38 minute, Bandi Szasz a spus: Pai si cam ce te astepti sa faca?? Tu ai alocat un spatiu de 8biti (uint8_t) si ii zici sa iti memoreze valoare cu 16biti... ii mai faci si typecast fortat prin "(uint16_t)" la 16biti..., inca nu am ajuns in punctul in care compliatorul sa ghieasca in globul de cristal ce sa faca si atunci aia 8 biti ramasi pe afara ti-l salveaza in urmatoarele 8biti a zonei de memorie care era alocat pt ZONEHEAT. uint8_t ZONEHEAT[ZONE_COUNT]; unsigned short LIVETEMP[ZONE_COUNT]; unsigned short = uint16_t = 16biti. prin schimbarea variabilei. LIVE.LIVETEMP[i] = (uint16_t) variabila; nu ar trebui sa se intample ce ai descris. pentru ca este pe 16 biti. eu asa credeam ...adica..cred ca totusi e altceva nu asta. intre timp am inteles ce e cu __attribute__((packed)) si evident nu doresc ca (,) compilatorul sa renunte la margini. asta explica de ce mergea mai bine fara packed. mi-am rezolvat problema cu __attribute__((packed, aligned(1))) trebuie insa modific si restul de cod. #pragma , merge pe ArduinoIDE. @bscristian inca nu am reusit sa inteleg cu "ceapa" union dar mai sap... Editat Februarie 6, 2021 de Gilbert Sparios Link spre comentariu
bcristian Postat Februarie 6, 2021 Partajează Postat Februarie 6, 2021 Ai cateva probleme, din gama alora care pot genera scarpinari in cap multa vreme :D Nu mai amesteca tipurile cu lungime explicita (int8, uint16, etc) cu cele a caror reprezentare depinde de platforma (int, short, char, etc). De ce folosesti packed? In general ai nevoie de aia doar cand trebuie neaparat sa ai o anumita asezare in memorie. Dar altfel performanta este semnificativ mai buna daca lasi compilatorul sa alinieze valorile asa cum e optim pt platforma respectiva. De exemplu, citirea unui int32 care nu e aliniat pe 4/8 octeti necesita 2 citiri din memorie si jonglerii pe biti ca sa recompuna valoarea. Pune te rog cel mai simplu cod in care zici ca se modifica ZONEHEAT[ZONE_COUNT] cand scrii in LIVETEMP. Nu ar trebui sa se intample asta, indiferent de aliniere. Daca chiar se intampla, e un bug in compilator. 1 oră în urmă, Bandi Szasz a spus: Pai si cam ce te astepti sa faca?? Tu ai alocat un spatiu de 8biti (uint8_t) si ii zici sa iti memoreze valoare cu 16biti... ii mai faci si typecast fortat prin "(uint16_t)" la 16biti..., inca nu am ajuns in punctul in care compliatorul sa ghieasca in globul de cristal ce sa faca si atunci aia 8 biti ramasi pe afara ti-l salveaza in urmatoarele 8biti a zonei de memorie care era alocat pt ZONEHEAT. Nu functioneaza asa, sau nu daca compilatorul functioneaza conform specificatiilor c/c++ :D Asignarea face cast la tipul membrului a carui valoare se seteaza, nu scrie in memorie incepand de acolo ce valoare ii dai. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum