Професионална програма
Loading...
+ Нов въпрос
LoshaPanda avatar LoshaPanda 8 Точки

C++ Advaced Task {5} - Pointers and References

Здравейте, имам проблем с Task - 5 !

 

Това, което ми е дадено е вход, който се подрежда по определен начин в паммета, като unsigned char byte е масив, който има адреси в него и аз трябва да взимам стойностите по определен начин. Интересното е, че при входовете, като :

42 117 110 105 0 2 73 75 83 78

13 106 111 114 111 0 1 71 71

( те се записват в bytes )

Трябва да имам изход :

42 uni (I.K.,S.N.)

13 joro (G.G.)
( разпределени са по asciitable, не бих искал да ви губя времето с условието ). След като са подредени в byte, като вече за кастнати към characters се случва нещо интересно. Работата е там, че в Visual Studio Commuity 2019 ми връща исканият вход, а в judge не. Разминаването е в скобите (иниациалите I.K, S.N. и т.н). Това, което трябва да се погледне в кода ми ( самото разминаване ) е while цикъла с условие times--. Там за да взема текущият адрес използва *memory, а следващият *(++memory), да обаче не изглежда това да работи в judge системата, ето го и кода ( 38 ред ):

https://sourceb.in/2a74023b51 

Все пак ето го и условието заедно с дадените скелети : 
https://imagebin.ca/v/5RRjOaxYVzUv
 

Header ( skeleton )
https://sourceb.in/4a779ecf3a

main ( skeleton )

https://sourceb.in/7bc6cf21b3
 

1
C++ Advanced
MartinBG avatar MartinBG 2783 Точки
Best Answer

Това се случва, защото компилаторът има свободата да изпълни инкрементирането на memory поинтъра след като е прочел текущата памет към която сочи и е я подал на pair конструктора. Различните компилатори (и версиите им) се държат различно, тъй като спецификацията на езика не е дефинирала поведението в този случай (имаме т.н. undefined behavior).

Проблемът, на който си се натъкнал е често срещан и дори някои компилатори ще маркират кода с подобен warning: "operation on ‘memory’ may be undefined [-Wsequence-point]".

За да оправиш решението, може да промениш кода така:

    while (times--)
    {
      char first = *(++memory);
      char second = *(++memory);
      symbs.emplace_back(first, second);

      symbs.at(i++).second = *memory;
    }

 

Няколко четива по темата, ако ти е интересна:

Unsequenced modification and access

Undefined behavior and sequence points

Undefined behavior and sequence points reloaded

Unsequenced value computations (a.k.a sequence points)

0
28/06/2020 19:56:11
LoshaPanda avatar LoshaPanda 8 Точки

Благодаря Ви ! Вече ми е ясно :)

1