Как портативно преобразовать строку в редкий целый тип?

Ваше определение функции JavaScript будет работать просто отлично, но ваша функция не вызывается из-за вашего британского кода C #. Если предполагается, что это код C #, то он недействителен, вам нужно явно проверить true и amp; ложные значения. В JavaScript вы можете просто приравнять истинные и ложные значения так, как вы это делали в своем первоначальном посте ...

Пример ...

if (someCondition) допустимо в JavaScript, но не в C #.

<script type="text/javascript">
    function openPopup() {
        $("#loginModal").modal('show');
    }

    @if (afterError != null)
    {

        openPopup();
    }
</script>

Также имейте в виду, что ваша логика вызывается только один раз при загрузке страницы. Вы можете отключить эту функцию из любого события, хотя ... щелчок мышью, мышиный центр и т. Д.

11
задан 8 revs 5 July 2009 в 09:31
поделиться

3 ответа

Существует одно устойчивое и портативное решение, которое должно использовать strtoimax() и проверьте на переполнение.

Таким образом, я анализирую intmax_t, проверьте на ошибку от strtoimax(), и затем также посмотрите, "подходит" ли это к a pid_t путем кастинга его и сравнения его с оригиналом intmax_t значение.

#include <inttypes.h>
#include <stdio.h>
#include <iso646.h>
#include <sys/types.h>
char *xs = "17";            /* The string to convert */
intmax_t xmax;
char *tmp;
pid_t x;                    /* Target variable */

errno = 0;
xmax = strtoimax(xs, &tmp, 10);
if(errno != 0 or tmp == xs or *tmp != '\0'
   or xmax != (pid_t)xmax){
  fprintf(stderr, "Bad PID!\n");
} else {
  x = (pid_t)xmax;
  ...
}

Не возможно использовать scanf(), потому что, (поскольку я сказал в комментарии), scanf() не обнаружит переполнение. Но я был неправ в высказывании что ни один из strtoll()- связанные функции берут intmax_t; strtoimax() делает!

Это также не будет работать для использования чего-либо еще, чем strtoimax() если Вы не знаете размера своего целого типа (pid_t, в этом случае).

8
ответ дан 3 December 2019 в 09:42
поделиться

Это зависит от точно, как портативный Вы хотите быть. POSIX говорит это pid_t тип целого числа со знаком, используемый для хранения идентификаторов процесса и идентификаторов группы процесса. На практике Вы могли принять с безопасностью это long является достаточно большим. Приводя к сбою это, Ваш intmax_t должно быть достаточно большим (таким образом, это примет любого допустимого pid_t); проблема, тот тип мог принять значения, которые не законны в pid_t. Вы застреваете в безвыходном положении.

Я использовал бы long и не волнуются очень об этом за исключением неясного комментария где-нибудь, что археолог программного обеспечения 100 лет следовательно будет находить и наблюдать, приводит причину, почему 256-разрядный ЦП скрипит к останову при вручении 512-разрядного значения как a pid_t.

POSIX 1003.1-2008 теперь имеется в сети (все 3 872 страницы из него в PDF и HTML). Необходимо зарегистрироваться (свободный). Я добрался до него из Книжного магазина Open Group.

Все, что я вижу, существует то, что это должен быть тип целого числа со знаком. Очевидно, во все допустимые значения целого числа со знаком вписываются intmax_t. Я не могу найти информацию в <inttypes.h> или <unistd.h> это указывает на PID_T_MAX или PID_T_MIN или другие такие значения (но я только что этим вечером получил доступ к нему, таким образом, он мог быть скрыт, где я не искал его). OTOH, я поддерживаю свой исходный комментарий - я полагаю, что 32-разрядные значения практично соответствуют, и я использовал бы long так или иначе, который был бы 64-разрядным на 8-разрядных машинах. Я предполагаю, что примерно худшая вещь, которая могла произойти, состоит в том, что 'соответственно привилегированный' процесс считал значение, которое было слишком большим, и отправило сигнал в неправильный процесс из-за несоответствия типов. Я не убежден, что был бы взволнован по поводу этого.

... oooh!... p400 под <sys/types.h>

Реализация должна поддерживать одну или несколько сред программирования, в которых ширины blksize_t, pid_t, size_t, ssize_t, и suseconds_t не больше, чем ширина типа долго.

3
ответ дан 3 December 2019 в 09:42
поделиться

Если Вы действительно обеспокоены, что можете _assert(sizeof(pid_t) <= long) или безотносительно типа Вы выбираете для своего материала '%'.

Как объяснено в этом ответе, говорит спецификация signed int. Если 'интервал' изменяется, Ваш '%u' по определению изменяется с ним.

0
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: