| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| C++ подводни камъни (за начинаещи) http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=881 |
Страница 1 от 2 |
| Автор: | HCL [ Чет Юли 21, 2005 2:00 pm ] | ||||||||||||||||||
| Заглавие: | C++ подводни камъни (за начинаещи) | ||||||||||||||||||
Темата е замислена, като място, където тези които започват да изучават С++, могат да намерят някои особености на синтаксиса и въобще на езика, които биха им създали проблеми. Първият пример е елементарен, но е хубаво да му се обърне внимание. Впрочем, някой можели да обясни, защо след като ++ има по-голям приоритет от =, х не е 1?
|
|||||||||||||||||||
| Автор: | Filo [ Чет Юли 21, 2005 2:20 pm ] | |||||||||
| Заглавие: | ||||||||||
Трябва да се обясни разликата между:
Тука е разковничето. Само дете мене ме няма по обясненията. |
||||||||||
| Автор: | HCL [ Чет Юли 21, 2005 3:04 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Ясно разбрах го. Явно в този случай, приоритетите се определят от правилото:
А някой можели да подскаже как де създам двудимензионален масив с показатели? Това не става:
|
|||||||||||||||||||
| Автор: | Predator_MF [ Чет Юли 21, 2005 3:09 pm ] |
| Заглавие: | |
Не ми е много ясно това понятие двуменсен масив, предполагам че ще е по-лесно с масив от масиви. |
|
| Автор: | HCL [ Чет Юли 21, 2005 3:13 pm ] | |||||||||
| Заглавие: | ||||||||||
С два масива става без проблеми, въпросът е дали може с един. Задачата е да се транспонира матрица и то с един масив. Нещо подобно
само дето не мога да използвам константи, понеже всяка задача е с различно големи матрици |
||||||||||
| Автор: | ¶ [ Чет Юли 21, 2005 3:31 pm ] | |||||||||
| Заглавие: | ||||||||||
|
||||||||||
| Автор: | HCL [ Чет Юли 21, 2005 3:45 pm ] |
| Заглавие: | |
pirev страшен си |
|
| Автор: | Predator_MF [ Чет Юли 21, 2005 5:01 pm ] |
| Заглавие: | |
A ше обясните ли каква е идеята на такъв масив и с какво се различава от масив от масиви например |
|
| Автор: | HCL [ Чет Юли 21, 2005 7:01 pm ] |
| Заглавие: | |
Хищник то това също се явява един вид масив от масиви. По-точно имаш един масив, като всеки елемент от масива е друг масив. Хубавото в случая е, че поинтерите ти позволяват да използваш паметта динамично. Т.е. не е нужно да задаваш големината на масивите при компилация, а можеш да я определиш от потребителски вход или по други начини по време на изпълнение (което си е огромен плюс ако не знаеш колко големи масиви ти трябват точно). В моя случай програмата създава квадратна матрица с m реда и m колони и това m го определя юзера, после разменя редовете и колоните и ако матриците са равни (т.е. с еднакви елементи) заключва, че матриците са симетрични. И това става много гъвкаво с този метод. |
|
| Автор: | Predator_MF [ Чет Юли 21, 2005 9:09 pm ] |
| Заглавие: | |
Hqma takyv forum drug po CBETA |
|
| Автор: | breeze [ Пет Юли 22, 2005 11:14 am ] | |||||||||
| Заглавие: | ||||||||||
Грешка Има и други разлики (в момента ме мързи да мисля за пример |
||||||||||
| Автор: | HCL [ Пет Юли 22, 2005 12:38 pm ] |
| Заглавие: | |
breeze разбирам какво имаш в предвид, но за какви други разлики става въпрос? Я дай някои примери. |
|
| Автор: | breeze [ Пет Юли 22, 2005 2:16 pm ] | |||||||||
| Заглавие: | ||||||||||
ОК Извинявам се за тъпия пример но не е изключено някой да напише следното:
В момента набързо измислих примера, аз самият се бях сблъскал с много по добър (съвсем реален) код но беше отдавна и не го помня. И така, тук приятелчето иска (по доста кофти начин де) да запълни масива a[] с последователните числа 0, 1, 2, 3, 4. Той разсъждава по следния начин "Горе първо се извършва присвояването (тоест, а[0] = 0) и после x се увеличава - значи няма проблеми". И го написва. И ако има късмет, компилатора му изчислява първо дясната част (например с включени някои опцийки за оптимизация) - и генерира код който запълва масива така: XX, 0, 1, 2, 3, 4 - като последната четворка излиза извън масива вече (и маже навън чужда памет) а първия елемент остава неинициализиран. Какво се е случило? Ами просто това е типичен случай на некоректен C код. Класика, както и изрази от типа а++ + а--. Но за човек който си мисли че увеличаването на x става едва след присвояването, израза си е напълно коректен и се чуди защо се получава така Разбира се, всеки свестен компилатор ще генерира предупреждение, нещо от сорта <Warning[Pa081]: undefined behavior: the order of read and modification of variable "x"> но човек трябва да разбере кога всъщност става увеличаването на x иначе ще се чеше по главата и ще се чуди какво му е недефинираното поведение на този код. |
||||||||||
| Автор: | HCL [ Нед Юли 24, 2005 10:11 pm ] | |||||||||||
| Заглавие: | ||||||||||||
Ето още една интересна "грешка", с която се сблъсках днес. Пишех програма, която да демонстрира 6 от по-известните алгоритми за сортиране и се сблъсках с проблема (не се смейте Интересното в случая е, че използвах switch за целта и допуснах грешката да дефинирам за втори път дефинирания вече в началото на програмата масив. Това че на предния ред освобождавам паметта не помогна и като капак на всичко компилатора не пусна съобщение за грешка. Съобщението се появи по късно след като пренаписах частта от сорса където е суйча с if else. Това е част ос сорса, прилагам и самата програмата като прикачен файл, на някой може да му е интересно. Но е възможно да има грешки в сорса, начинаещ съм, т.е. да се не взима на пълно доверие!!!
Като извод бих заключил, че трябва да се внимава, когато се използват по-големи от един ред statement-и в switch. Компилатора явно не "вижда" грешки в тази част от кода. Някой може ли да обясни защо?
|
||||||||||||
| Автор: | HCL [ Пон Юли 25, 2005 2:26 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Е сега вече няма да ми повярвате
и
не дават един и същ резултат. Ако ще увеличавате стойността, която сочи показателя използвайте първото. А го бях чел преди два-три дни и пак го обърках |
|||||||||||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|