промяна в езика C

T

tom12sg

Guest
Здрасти,

За съжаление, ако това е много фундаментални.Аз просто не мога да го разбера ...

Бих искал да смени един байта от ляво на непрекъснат 3 байта, така че пробвайте следното:
Аз не съм се грижат за малко краят на големи приключва на този monent.

struct (
грозен Чар val_hi;
грозен Чар val_mid;
грозен Чар val_lo;
) микс;

нищожен shift_byte (грозен Вал Чар)
(
mix.val_mid <<= 8; / / Последната стойност се очаква да се премести в Здравей
mix.val_lo <<= 8; / / Последната стойност се очаква да се премести в средата на
mix.val_lo = Val / / въведете нова стойност
)

Основните ()
(

shift_byte (0x24);
shift_byte (0x79);
shift_byte (0x03);

/ / Wanted очакваното производство: val_hi = 0x24
/ / Val_mid = 0x79
/ / Val_lo = 0x03
)

Как трябва да се изместване accompanish?
Моля, помогнете.Благодарности.

 
Здрасти,

Аз ще го направя по този начин:

нищожен shift_byte (грозен Вал Чар)
(
mix.val_hi = mix.val_mid / / Последната стойност се очаква да се премести в Здравей
mix.val_mid = mix.val_lo / / Последната стойност се очаква да се премести в средата на
mix.val_lo = Val / / въведете нова стойност
)

 
Ако имате три байт масив в struct вместо на отделни грозен символа тогава вие ще използвате по-малко памет.Това е така, защото компилатор ще уеднаквят грозен символа в struct до 2 байт граници.Той също така я прави по-удобно, ако искате да се увеличи броят на записи в нещо.

 
tom12sg написа:

Здрасти,struct (

грозен Чар val_hi;

грозен Чар val_mid;

грозен Чар val_lo;

) микс;Основните ()

(shift_byte (0x24);

shift_byte (0x79);

shift_byte (0x03);/ / Wanted очакваното производство: val_hi = 0x24

/ / Val_mid = 0x79

/ / Val_lo = 0x03

)Как трябва да се изместване accompanish?

Моля, помогнете.
Благодарности.
 
техника повръщане е хубаво и изглежда по-добре след кастинг си struct на друг тип показалеца!По същество тя не е същото, но по този начин тя изглежда по-елегантна.
Но трябва да проверите размера на Int за вашия компилатор!например: Imagecraft за AVR използва 16-битов за Int!дълъг е 32 битов.

Това е по-добре (за пренасяне на други компилатори / архитектури), за да определите свой собствен вид!

например:
Код:typedef грозен Чар U8;

typedef подписан Чар s8;

typedef грозен кратко U16;

typedef подписан кратко s16;

typedef грозен дълго u32;

typedef подписан дългосрочен s32;

 
Има група от видове с имената на формата intN_t, където N е броят на битовете, необходими за едно цяло число.Правните ценности са N 8, 16, 32 и 64.Някои компилатори изпълнение 24.Това е силно препоръчително да се използват тези типове, ако искате конкретен размер на променлива.

Съюзът метод е малко по-лоши, тъй като той предполага, че съставител съхранява стойности в паметта на по определен начин.Синдикатите не са били наистина избрано за писане като един вид четене и обратно като друг.Те са създадени главно за databasing приложения, при които различни видове променливи могат да бъдат съхранени в областта.Стойте далеч от съюзи!

Също така, по-рано, посочени съюз метод не може да функционира правилно, тъй като цели числа в рамките на stuct "Микс" може да бъде приведена в 2 байт граници.

 
така че, ако всички по-горе не е правилно след това може да ни даде решение за този проблем?

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Охлаждам" border="0" />чао

Пожар в Wire: SM2:[/ цитат]

 
Да.(имайте предвид, че съм използвал uintN_t група - подобно на intN_t, но грозен).Ако го искате в struct тогава слагам на масива в struct ...

Забележка: Някои от по-рано, посочени примери могат на практика да работят в някои компилатори, но не непременно в най-много.Този човек трябва да работят в най-съставители.Код:# включват <stdint.h>uint8_t нещо [3];нищожен shift_byte (uint8_t Val)

(

нещо [2] = нещо [1];

нещо [1] = нещо [0];

нещо [0] = Val;

)Int основни (Void)

(shift_byte (0x24);

shift_byte (0x79);

shift_byte (0x03);връщане 0;

)

 
Съгласен съм с xgoat,
Когато е необходимо единствено да byteshifts, на shift_byte метод се очертава като най-добрите.Тя ще работи на повечето архитектури и с най-съставители.
Други решения, използвайки bitshifts може да предизвика проблеми, дължащи се байт разположение.Може да има разлики между поставянето на байтове в масив, в structs и в цели числа.Трябва да се провери дали си компилатор / архитектура прави това по един последователен начин, преди да използвате някоя от другите Techniquest.
Може би не може да има леко увеличение изпълнение с други методи (например, когато си UC поддържа 32 байт смяна), но си струва неприятности (и може би си компилатор ще направим за оптимизиране за вас).

 

Welcome to EDABoard.com

Sponsor

Back
Top