#ifdef LOCAL сатрҳоро то #endif танҳо дар сурате нигоҳ медорад, ки ном LOCAL муайян шуда бошад. Дар компютери худатон онро бо g++ -DLOCAL records.cpp -o records муайян мекунед. Он гоҳ барнома барои ҳар рӯз як сатр менависад:
Рӯзи 3 мисли рӯзи 2 гарм аст, на гармтар, ва боз ҳам ҳисоб шудааст: x >= best бояд x > best бошад. Довар бе -DLOCAL компилятсия мекунад, барои ҳамин барои он сатрҳои санҷишӣ вуҷуд надоранд ва шумо онҳоро гузошта метавонед. Дар Code::Blocks LOCAL-ро дар танзимоти компилятор, дар варақаи #defines илова кардан мумкин аст.
cerr-ро истифода баред, на cout-ро: cout баромадро дар буфер нигоҳ медорад. Агар барнома вайрон шавад, буфер гум мешавад ва шумо вайроншавиро дар ҷойи нодуруст меҷӯед.
assert: дар аввалин ваъдаи шикаста қатъ шудан
Ҳар барнома ба боварӣ такя мекунад: мавқеъ миёни 1 ва n аст, вектор дар ин ҷо холӣ нест. assert бовариро ба санҷиш табдил медиҳад:
Ҳангоме ки шарт дуруст аст, assert ҳеҷ кор намекунад. Вақте нодуруст шавад, барнома қатъ мешавад. Барои p = 0 g++ дар Linux менависад (номи барнома, парванда ва сатр аз барномаи шумо мебошанд):
Сикл то i = n - 1 меравад ва a[n]-ро мехонад, яктои баъд аз охир. Бо g++ -O2 сохташуда, он дар компютери мо 3 чоп кард: нодуруст. Бе -O g++ 15 онро бо Assertion '__n < this->size()' failed. қатъ мекунад. Компиляторҳои кӯҳна ин корро намекунанд ва метавонанд ҷавоби дурустро ба тасодуф чоп кунанд. Се имконият бахтро ба хато бо нишондоди ҷой табдил медиҳанд:
-D_GLIBCXX_DEBUG: индекси берун аз vector ё string, ё front()-и холӣ. Он дар ҳар g++, аз ҷумла Code::Blocks, ҳаст.
-fsanitize=address,undefined: ҳар хондан ё навиштан берун аз массив, пуршавии int, тақсим ба сифр. Он бо g++ дар Linux ва macOS (ва WSL) кор мекунад; MinGW дар Windows онро пайваст карда наметавонад.
-ftrapv: пуршавии int барномаро қатъ мекунад, бе рақами сатр.
Бо -D_GLIBCXX_DEBUG барнома бо ин паём қатъ мешавад (барои ҷо шудан шикаста шудааст):
Бо -O1 -g -fsanitize=address,undefined ҳисобот чунин оғоз мешавад (кӯтоҳшуда). -O1 муҳим аст: бе он g++ 15 аввал дар санҷиши худаш қатъ мешавад.
Бо -fsanitize=undefined барои пуршавии int ҳисоботе дода мешавад, ки сатр ва ду ададро номбар мекунад.
Барои ҷавоб додан ва нигоҳ доштани пешрафт ворид шавед.Ворид шудан
худро санҷ1 хол
Шумо дар Windows бо Code::Blocks кор мекунед. Кадом параметри компилятор боис мешавад, ки ҳангоми хондани a[n] аз вектор барнома бо паёми хато қатъ гардад?
Як ҷавобро интихоб кунед
Барои ҷавоб додан ва нигоҳ доштани пешрафт ворид шавед.Ворид шудан
day 1: records = 1
day 2: records = 2
day 3: records = 3
day 4: records = 3
positions: positions.cpp:20: int main():
Assertion `1 <= p && p <= n' failed.
20:15: warning: suggest parentheses
around assignment used as truth value
11:1: warning: control reaches end
of non-void function
25:22: warning: 'zeros' may be used
uninitialized
Error: attempt to subscript container
with out-of-bounds index 4, but
container only holds 4 elements.
ERROR: AddressSanitizer:
heap-buffer-overflow on address ...
READ of size 4 at 0x... thread T0
#0 0x... in main descents.cpp:16
for(int i = 0; i < n; i++){ int x; cin >> x; if(i == 0 || x >= best){ records++; best = x;}#ifdef LOCAL cerr << "day "<< i + 1<< ": records = "<< records << "\n";#endif}
cin >> p;// мавқеъҳо аз 1 ҳисоб мешавандassert(1<= p && p <= n);cout << a[p - 1]<< "\n";