Struktura do pole od určitého indexu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Struktura do pole od určitého indexu – C / C++ – Fórum – Programujte.comStruktura do pole od určitého indexu – C / C++ – Fórum – Programujte.com

 

Romča
~ Anonymní uživatel
12 příspěvků
24. 6. 2014   #1
-
0
-

Ahoj,

mám zarovnanou strukturu a bytové pole. Potřebovala bych strukturu uložit po bytech do toho pole, ale od určitého indexu. Uložit to od 0 indexu není problém, ale od určitého indexu nevím. Mám ještě jedno omezení a to, že nesmím využívat dynamickou alokaci paměti. Od indexu 0:

~typedef struct
{
   int x;
   uint16_t reserved;
   uint16_t reserved2;
} foo_t;;
 
int main(){

 foo_t foo;
    uint8_t *b = (uint8_t *)&foo;
    int i;
 
   foo.x=127;
   foo.reserved = 5;
   foo.reserved2 = 6;

   for (i=0; i<sizeof(foo); i++)
      printf("%d ", b[i]);

   printf("\n");

   return 0;
}

Nahlásit jako SPAM
IP: 94.113.242.–
24. 6. 2014   #2
-
0
-

Kopírovat lze do pole jednak s pomocí indexů, jednak pomocí ukazatelů: Pomocí indexů stačí cyklus for 

for (i=zac; i<zac+velikost; i++)
{
  pole[i] = byte který do něj patří
}

kde zac je index prvku pole kam se kopíruje první byte a velikost je počet kopírovaných bytů.  

Pokud mám pole[128], pole je současně ukazatel na první prvek. Ukazatel na každý prvek pole je možné spočítat jako pole + index.

První způsob se mi zdá čitelnější.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Romča
~ Anonymní uživatel
12 příspěvků
24. 6. 2014   #3
-
0
-

#2 hlucheucho
Ahoj,

a jak do toho bytového pole dostanu po bytech tu strukturu? To mi nějak nedochází.... :

~typedef struct
{
   int x;
   uint16_t reserved;
   uint16_t reserved2;
} foo_t;;
 
int main(){

 foo_t foo;
    uint8_t *b = (uint8_t *)&foo;
    int i;
 uint8_t pole[20];

 for (i = 0; i < 10; i++)
 {
  pole[i] = 1;
 }


   foo.x=127;
   foo.reserved = 5;
   foo.reserved2 = 6;

   for (i=10; i< (10+sizeof(foo)); i++)
 {
  pole[i] = ?????????; // !!!!!!!!!!!!!!!!!!!!!!!!!!
 }


   for (i=0; i<sizeof(foo); i++)
      printf("%d ", b[i]);

   printf("\n");

   return 0;
}

Nahlásit jako SPAM
IP: 94.113.242.–
voty+1
Návštěvník
24. 6. 2014   #4
-
0
-

Ahoj,

to vypadá na nějakou školní úlohu, že? Takže nebudu psát rovnou řešení, ale návod.

Platí, že k libovolnému datovému typu lze v C/C++ přistupovat jako k poli charů. Tím pádem úloha zní, zkopírovat pole charů do jiného pole charů. Co tedy potřebujeme? Zdroj (odkud budeme kopírovat), cíl (kam budeme kopírovat), kolik toho budeme kopírovat a nějakou funkci, která kopírování provede.

Začněme od konce. Pokud to má být v C++, použil bych pro kopírování funkci std::copy(), pokud to má být v C, tak funkci memcpy(). Kam budeme kopírovat je pointer toho cílového pole (např. &pole[10]), zdroj bude pointer na tu strukturu (např. &foo) a délka je jasná (např. sizeof(foo)).

Nevím co umíš nebo ne, takže kdyžtak napiš, co ti není jasné.

Nahlásit jako SPAM
IP: 81.19.38.–
Jednu rozbil a tu druhou ztratil.
Romča
~ Anonymní uživatel
12 příspěvků
24. 6. 2014   #5
-
0
-

#4 voty
Ahoj,

no já nevím mi to stejně kopíruje do toho pole od indexu 0. Do školy to není :-).

Nahlásit jako SPAM
IP: 94.113.242.–
Romča
~ Anonymní uživatel
12 příspěvků
24. 6. 2014   #6
-
0
-

Tak se omlouvám jsem vypisovala jiné pole. Opravdu to jde pomocí memcpy, jen nevím jestli to je zrovna to pravé....

~typedef struct
{
   int x;
   uint16_t reserved;
   uint16_t reserved2;
} foo_t;;
 
int main(){

 foo_t foo;
     int i;
 uint8_t pole[20];

 for (i = 0; i < 10; i++)
 {
  pole[i] = 1;
 }


   foo.x=127;
   foo.reserved = 5;
   foo.reserved2 = 6;

   memcpy(&pole[10], &foo, sizeof(foo));


   for (i=0; i<20; i++)
      printf("%d ", pole[i]);

   printf("\n");

   return 0;
}

Nahlásit jako SPAM
IP: 94.113.242.–
voty+1
Návštěvník
24. 6. 2014   #7
-
0
-

#6 Romča
IMHO je memcpy() to pravé protože každý kdo se na kód na podívá, hned vidí, že se tam kopíruje obsah struktury foo do pole na offset 10. Čitelněji to snad už zapsat nejde :) Pokud máš nějaké jiné pochybnosti o použití, tak sem s nimi ...

Nahlásit jako SPAM
IP: 81.19.38.–
Jednu rozbil a tu druhou ztratil.
Rmča
~ Anonymní uživatel
1 příspěvek
29. 6. 2014   #8
-
0
-

Ahoj,

tento problém jsem nakonec vyřešila pomocí ukazatele na strukturu, který ukazuje v paměti na pole (nad to píšu dobře). Zdá se mi to jako nejlepší řešení:

~typedef struct
 {
    int x;
    uint16_t reserved;
    uint16_t reserved2;
 } foo_t;;
 
 int main(){

 foo_t *  foo;
 int i;
 uint8_t pole[20];

 for (i = 0; i < sizeof(pole); i++)
  {
   pole[i] = 1;
  }

 foo = (foo_t *) (pole + sizeof(pole) - sizeof(foo_t));

  foo->x=0xAA;
  foo->reserved = 0xBB;
  foo->reserved2 = 0xCC;

  for (i=0; i<20; i++)
     printf("%x ", pole[i]);

   printf("\n");

   return 0;
 }

Nahlásit jako SPAM
IP: 109.80.205.–
voty+1
Návštěvník
29. 6. 2014   #9
-
0
-

#8 Rmča
Tohle na x86 bude fungovat pravděpodobně bez problémů, ale obecně to není správné. Datové typy jiné než char mohou vyžadovat určité zarovnání v paměti a program tedy nemusí vůbec fungovat, neboť v tuto chvíli bude struktura uložena do toho pole na adresu, která může být zarovnaná nebo nemusí. Toto nevadí pokud se k ní přistupuje přes char (např. memcpy), ale vadí to když se k ní přistupuje "přímo" přes ukazatel na foo_t.

wiki http://cs.wikipedia.org/wiki/Zarovn%C3%A1n%C3%AD_pam%C4%9Bti

Možná zkus napsat, co přesně je cílem a najdeme nějaké pěkné řešení.

Nahlásit jako SPAM
IP: 37.188.226.–
Jednu rozbil a tu druhou ztratil.
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, 124 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ý