Pole a struktury? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pole a struktury? – C / C++ – Fórum – Programujte.comPole a struktury? – C / C++ – Fórum – Programujte.com

 

Berbr0
Duch
22. 7. 2017   #1
-
0
-

Řeším následující problém, Potřebuji mít v paměti statické pole například 15bytu. Musí to byt statické pole typu unsigned char protože, specifický hw potřebuje získat ukazatel na první byt totoho pole, aby ho mohl přes DMA poslat po rychle seriové lince někam.

Zaroven ,ale dané pole obsahuje nastavovaci data pro několik, v případě 15bytů pro 5 čidel, každé se nastavuje 3byty¨. Data tedy vypadaji nějak takto

L1.A L1.B L1,C | L2.A L2.B L2.C | L3.A  L3.B L3.C | L4.A L4.B L4.C  | L5.A L5.B L5.C

Oč mi jde. O to jak to celé pojmout, Protože při odesílání dat sice potřebuji, aby to bylo pole a já měl ukazatelna jeho první prvek, ale po čas práce, tedy plnění toho pole je vyhodnější, aby to bylo něco jako  pole struktur , kde každá struktura obsahue tři prvky typu unsigned char.

A zároven by se mi šiklo abych mohl mít předpřipravená nastvení pro jednotlivá čidal například jako

#define IQ7 0xFF1611

a toto šlo jednoduše přiřadit třeba L3

Napadá mě několik způsobu jak to řešit,ale nemám v C až takové zkušenosti a proto se ptám, jak byste to řešili vy?

Npady typu mit data 2x vynechme, cel to je na spicifickém hw kde skutečně není místo na dvojtá data a nějaké přesuny

Nahlásit jako SPAM
IP: 162.247.73.–
gna
~ Anonymní uživatel
1891 příspěvků
22. 7. 2017   #2
-
0
-

Pole struktur není problém a samotný ukazatel je jen adresa a můžeš si ho přetypovávat jak potřebuješ.

Ten hw, nebo překladač může mít nějaká specifika, ale v principu by to vždycky mělo jít. 

struct {
	byte a, b, c;
} pole[5];

pole[3].c = ...;

... (byte*) &pole ...
Nahlásit jako SPAM
IP: 213.211.51.–
KIIV
~ Moderátor
+43
God of flame
22. 7. 2017   #3
-
0
-

#2 gna
problem muze nastat akorat se zarovnanim na 2 nebo 4 bajty. To nejspis nenastane pro 8b procesory, ale ty malokdy maji DMA (pokud vubec).

U gcc kompilatoru se to da prinutit, aby to bylo kompaktni nejak takto:

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};


jinde zase byva #pragma pack(neco)

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
gna
~ Anonymní uživatel
1891 příspěvků
22. 7. 2017   #4
-
0
-

#3 KIIV
To mě napadlo, ale na čemkoliv rozůmném by tady k zarovnávání nemělo dojít.

Nahlásit jako SPAM
IP: 213.211.51.–
Berbr0
Duch
22. 7. 2017   #5
-
0
-

Dik za info, vytvrořit pole struktur jsem uměl, ale nebyl sem si jist zda je nějak zaručeno jak se bude toto ukladat v pameti. Viz zminěné zarovnání nebo cokoliv jineho. Zkrátka mi přišlo zda není veke zvěrstvo pak "přetypovat" ukazatel na pole struktur na ukazatel na unsigned char.

Zkusil jsem to na svém překladači a tam to fungovalo, ale nebyl jsëm si jist jak se to bude chvat na nové verzi, jiném překladači atd,

Apropo byla zde zninka o x51 a neexistenci jeji verze s DMA. Sice to provozuji na vyrazne rychlejším hw, ale děla i do x51 a tak vim, že stále existuje marky hw v kterém jsou 8051 jadra a ma to DMA třeba pro ůpřenos dat do nějaké radiové casti viz třeba cc2430 od TI

Jinak děkuji za info.

Nahlásit jako SPAM
IP: 77.247.181.–
Zalman
~ Anonymní uživatel
1 příspěvek
22. 7. 2017   #6
-
0
-

Když jsem si pročetl vlákno napadl mě dotaz,

Mějme strukturu pro barvu v RGB modleu

struct color{

unsigned chart R;

unsigned chart G;

unsigned chart B;

} color;

jde nějak definovat makro ktere by dokazlalo trukturu naplnit z jednoho 24bit čísla

něco jako

#define RED 0xFF0000

color=RED;

Nahlásit jako SPAM
IP: 163.172.142.–
Sheldon
~ Anonymní uživatel
17 příspěvků
23. 7. 2017   #7
-
0
-

   

#define SET(x) { (unsigned char)(x >> 16), (unsigned char)(x >> 8), (unsigned char)x }
#define RED 0xFF0000


struct color{
unsigned chart R;
unsigned chart G;
unsigned chart B;

} color;

color=SET(RED);

Nahlásit jako SPAM
IP: 188.92.9.–
KIIV
~ Moderátor
+43
God of flame
23. 7. 2017   #8
-
0
-

#7 Sheldon
akorat bacha, na jednocipech byvaji ciselne konstanty typu 16 bitoveho intu, takze je potreba davat k cislu jeste suffix L (long) nebo UL (unsigned long). Bez toho se budes divit, proc to nefunguje.

V C to ani nezkompilujes (nejen kvuli "chart"). A v C++ musis zapnout standard c++11, aby slo priradit do struktury pomoci initializer listu (tj:  color = {11,22,33}; )

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý