Jump to content
ELFORUM - Forumul electronistilor
Gilbert Sparios

nume variabila-dinamic

Recommended Posts

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

Edited by Gilbert Sparios
Link to post
Share on other sites

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

} 

 

Edited by nico_2010
Link to post
Share on other sites
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 to post
Share on other sites

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);

 

Edited by mihaicozac
Link to post
Share on other sites
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 to post
Share on other sites

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 to post
Share on other sites

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 to post
Share on other sites
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.

Edited by Bandi Szasz
Link to post
Share on other sites
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...

Edited by Gilbert Sparios
Link to post
Share on other sites

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 to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines