MC9S12C32 mikro denetleyici için bazı gömülü C kodlarında, statik olarak boyutlandırılmış bir bayt dizisi ve kuyruk önü ve arkası için iki "işaretçi" ile uygulanan dairesel bir sıraya (eş dairesel arabellek) sahibim. gerçekte kuyruklar dizisi için sadece endeksler.C imzasız modül, derleyici uyarısına neden oluyor
trear
arka elemanın gerçek endeks olmakla
tfront
(tabii 16 modülo tabi) ön eleman gerçek indeksi daha azdır biri olduğunu
// call unsigned chars bytes
typedef unsigned char byte;
byte trear = 0; // SCI transmit display buffer IN index
byte tfront = 0; // SCI transmit display buffer OUT index
byte tsize = 16; // size of transmit buffer
byte tbuf[16]= {0};// SCI transmit display buffer
Not. Yani, örneğin, eğer benim tampon "Merhaba", bu gibi görünebilir içeriyordu (boş yuvaları olan çöp değerler):
o kuyruktan bir bayt kaldırmak için zamanı geldiğinde, bunu_________________________________
| | |h|e|l|l|o| | | | | | | | | |
^ ^
front rear
:
// increment front index
tfront++;
// wrap front index if it exceeded bounds
tfront %= tsize; // (A)
// get character to transmit
byte outputChar = tbuf[tfront];
Tüm bunlar iyi çalışıyor - en azından, programım bu bölümle ilgili hiçbir hata göstermedi.
Olası kaybını ben bu programı derlemek Ancak, benim derleyici hattı hakkında beni uyarıyor şikayet, yukarıda fragmanındaUyarı: C2705: Veri
main.c hattı 402
(A)
işaretlenmiş
Satır 402 satırı (A). Gcc veya benzeri kullanmıyorum; Freescale'in CodeWarrior IDE'sinde derleme yapıyorum, ki bu da bana bazen başka bir şekilde mistikleyici uyarılar verdi.
// increment front index mod tsize
tfront = (tfront + 1 >= tsize) ? 0 : tfront + 1; // (B)
// get character to transmit
byte outputChar = tbuf[tfront];
Ancak, benim derleyici hala aynı uyarıyı, hat (B)
hakkında bu kez yayar: uyarı kurtulmak için bir girişim olarak, ben yukarıdaki fragmanı yeniden yazdım. Belki de derleyici bana bildirimde (tfront + 1 >= tsize)
, tfront
ifadesinin yürütmeden önce 255 ve taşma olabileceğini söylüyor. Tabii ki, bunun olmayacağını biliyorum, ama derleyicim öyle değil.
Böyle bir durum söz konusu olsa da, neden satır (A)
sorunluydu? Temel olarak, derleyicinin mutsuz olduğunu bilmek isterim.
sorumu yazarak beri, bir önişlemci tanımına değişken türünden tsize
değiştirerek çözdük (yani #define TSIZE 16
). Benim sorum yine de geçerli.
ilgili bazı sorular:
unsigned overflow with modulus operator in C
modulus operator with unsigned chars
Not ve o da düzgünce önler cast olmadan bu uyarı. Yani 16 elemanlık bir tampon için 'tfront% = 16' yerine' tfront | = 0x0f' yerine. Genel bir durumda, 2'nin gücü olan “tsize” için gerekli olan mod-mask “tsize - 1” dir. – Clifford
@Clifford Uyarı, lval = expr; 'lval' türü byte 've' expr '' int' türüne sahip olan atamanın genişletilmesiyle oluşursa, bit maskesi kullanmak uyarıdan kaçınmaz: ' tfront & = mask; 'tfront = tfront 'a genişler & mask;' ve 'tfront & mask' tür' int' türünde' tfront% size' aynı nedenden dolayı 'yapar (C99 6.3.1.1:2 ve 6.3.1.8:1 " Tamsayı promosyonları her iki işlenende gerçekleştirilir ”). –
@Clifford Ayrıca, bitüm operatörüne doğru bir şekilde ulaşması gerekiyor. Bunu mu demek istediniz? –