Grundlæggende C spørgsmål.

J

Jos Brink

Guest
Ok, jeg havde en fejl i mit program.have et kig på denne lille kode:

(
unsigned char i, j, * ptr1, * ptr2, temp, x_max, y_max;
unsigned char row_index;
unsigned int row_offset, bitmap_offset;

row_offset = x_max * row_index;
)

i dette tilfælde x_max = 122, og row_index varierer fra 0-3.

i løbet af denne gange, row_offset fik forkerte værdier.Ved at ændre row_index til en unsigned int, var problemet overstået.

Kan nogen forklare, hvorfor row_index skal være en int i stedet for en char, og x_max ikke?

Thnx.BTW: Jeg bruger codevisionLagt efter 20 minutter:OK, jeg skrev en lille test program til at finde ud af, hvad der sker.

unsigned int k, z;
unsigned char i, j, x, y;

(
x = 122;
i = 122;

for (y = 0; y <8; y )
(
z = x * y;
putchar (z>> 8);
putchar (z & 0x00FF);
)

/ / Output var: 0000, 007A, 00F4, 006E, 00E8, 0062, 00DC, 0056

z = 122;

for (j = 0; j <8; j )
(
k = z * j;
putchar (k>> 8);
putchar (k & 0x00FF);
)
)

/ / Output var: 0000, 007A, 00F4, 016E, 01E8, 0262, 02DC, 0356Det lader til, at en af de to variabler skal være en int, er det ligegyldigt hvilken.
Er compiler bruge variabler også til midlertidig oplagring?

 
int = uchar * uchar;
når compileren ser dette *, det gør multiplikation og resultatet er af typen uchar (8bits værdi) og jeg tror, 3 * 122 har brug for mere end 8bits opbevaring.hvad compileren vil gøre i dette tilfælde vil afkorte den mest betydningsfulde bits & holder kun 8least dem.
Til opgave, at finde det LHS er unsigned int, så det vil udvide uchar til uint af nuller.Thats hvorfor resultatet anderledes.
Til over kommer du bør ikke kaste en af multiplikation operander til det resultat, type, med henblik på at fremme de andre opernad til det resultat, type & holder afkortede data før.
Hilsen,
Amraldo.

 
Lyder som om din compiler er ikke ANSI C kompatibel.Det bør automatisk fremme dine to unsigned char værdier int, før den formerer dem.

Den CodeVisionAVR 1.24.7 brugermanual beskriver en compiler indstilling "fremme char til int" for ANSI kompatibilitet.Prøv det.

 

Welcome to EDABoard.com

Sponsor

Back
Top