Sari la conținut
ELFORUM - Forumul electronistilor

nume variabila-dinamic


Gilbert Sparios

Postări Recomandate

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 de Gilbert Sparios
Link spre comentariu
  • Răspunsuri 19
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

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 de nico_2010
Link spre comentariu
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

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 de mihaicozac
Link spre comentariu
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
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
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 de Bandi Szasz
Link spre comentariu
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 de Gilbert Sparios
Link spre comentariu

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări