Посмотрите на код здесь. Я добавил несколько точек с запятой в ваши операторы echo и добавил переменную запроса в метод mysqli_fetch_assoc. Я также добавил несколько комментариев, чтобы помочь вам понять, что я здесь сделал.
<?php
$query = "SELECT * FROM places";
$select_all_places = mysqli_query($connection, $query);
// This will be the state we are currently on. Start it as null.
$current_state = '';
while($row = mysqli_fetch_assoc($select_all_places)){
$p_state = $row['p_state'];
$p_city = $row['p_city'];
$p_address = $row['p_address'];
?>
<!-- Check if variable state is equal to current row's state. -->
<?php if($current_state != $p_state): ?>
<!-- Echo state if they aren't equal -->
<h1><?php echo $p_state; ?></h1>
<!-- Assign new current state -->
<?php $current_state = $p_state; ?>
<?php endif; ?>
<h2><?php echo $p_city; ?></h2>
<p><?php echo $p_address; ?></p>
<?php } ?>
Удаление CLI / STI по-прежнему работает из-за различий в операционной среде.
В 16-битной DOS может произойти прерывание, и это прерывание изначально будет выполняться в том же стеке. Если вас прервали в середине операции, прерывание может дать сбой, потому что вы обновили только ss, а не sp.
В Windows и любой другой современной среде каждый поток пользовательского режима получает свой собственный стек. Если ваш поток прерывается по какой-либо причине, его стек и контекст надежно сохраняются - вы этого не делаете. не нужно беспокоиться о том, что что-то еще работает в вашем потоке и в вашем стеке. cli / sti в этом случае будет защищать от чего-то, от чего вы уже защищены операционной системой.
Как упомянул Грег, безопасный поддерживаемый способ обмена стеками, подобный этому, в Windows - CreateFiber / SwitchToFiber. У этого действительно есть побочный эффект изменения всего вашего контекста, поэтому это не похоже на простое переключение стека.
Это действительно поднимает вопрос о том, что вы хотите сделать. Часто переключение стека происходит из-за ограниченного пространства стека, которое составляло 64 КБ в 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?
Как упоминал Грег, безопасным и поддерживаемым способом обмена стеками, подобными этому, в Windows является CreateFiber / SwitchToFiber. У этого действительно есть побочный эффект изменения всего вашего контекста, поэтому это не похоже на простое переключение стека.
Это действительно поднимает вопрос о том, что вы хотите сделать. Часто переключение стека происходит из-за ограниченного пространства стека, которое составляло 64 КБ в 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?
Как упоминал Грег, безопасным и поддерживаемым способом обмена стеками, подобными этому, в Windows является CreateFiber / SwitchToFiber. У этого действительно есть побочный эффект изменения всего вашего контекста, поэтому это не похоже на простое переключение стека.
Это действительно поднимает вопрос о том, что вы хотите сделать. Часто переключение стека происходит из-за ограниченного пространства стека, которое составляло 64 КБ в 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?
что было 64 КБ на 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки? что было 64 КБ на 16-битной DOS. В Windows у вас есть стек размером 1 МБ, и вы можете выделить еще больше. Почему вы пытаетесь переключить стеки?Безусловно, самый безопасный способ сделать это - перенести код на официальные структуры мультипрограммирования Win32, такие как потоки или волокна. Волокна обеспечивают очень легкую парадигму с несколькими стеками, которая кажется подходящей для вашего приложения.
Статья Почему Win32 вообще имеет волокна? - тоже интересное чтение.
Я сделал это в пользовательском режиме, и, похоже, проблем не возникло. Вам не нужен cli / sti, эти инструкции просто предотвращают прерывания в этой точке кода, что должно быть ненужным из-за ограниченной информации, которую вы нам сообщили.
Взгляните на Mtasker Берта Хьюберта. Он выполняет простую совместную многозадачность, вам может быть легко использовать его для переноса кода.
Не забывайте, что прыгающие стеки собирают все аргументы или резидентные переменные.