Ычан: [d | au / b / bro / hr / l / m / mu / o / s / tran / tu / tv / vg / x | a / aa / c / fi / jp / rm / tan / to / vn]
[Назад]
Ответ в нить
Имя
Animapcha image [@] [?]
Тема   ( ответ в 14950)
Сообщение flower
Файл 
Пароль  (для удаления файлов и сообщений)
Параметры   
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаются файлы типов 7Z, BZ, BZ2, GIF, GZ, JPG, MO, MP3, MP4, OGG, OGV, PDF, PNG, PSD, RAR, SVG, SWF, TXT, WEBM, WEBP, XCF, ZIP размером до 5000 кБ.
  • Ныне 3632 unique user posts. Посмотреть каталог
  • Предельное количество бампов нити: 500
dahsdhsa.png - (51.52KB, 1216×800)
14950
No. 14950  
Компилирую программу в Cygwin, она ведёт себя как попало. Где могут быть неполадки?
No. 14951  
Уточню -
cat|./a
выдаёт на один текст
('')
разный ответ.
No. 14955  
>>14950
Ты используешь внутри своей программы функцию в описании которой есть слова "ундефайнед бехейвор". Так вот оно выглядит в реальности.
No. 14962  
>>14955
>"ундефайнед бехейвор"
Не знаю, откуда ему быть.
Вот код для проверки на ошибки:
#include <stdio.h>

#define OTHER 0
#define SINGLEQUOTE 1
#define DOUBLEQUOTE 2
#define COMMENT 3
#define SLASH 4
#define STAR 5
#define BACKSLASHSINQ 6
#define BACKSLASHDOUQ 7
main()
{
    int c, state, nparenthesis, nbrace, nbracket, line, cn;
    state = OTHER;
    nparenthesis = nbrace = nbracket = 0;
    cn = line = 1;
    while ((c = getchar()) != EOF) {
        if (state == OTHER)
            if (c == '\'')
                state = SINGLEQUOTE;
            else if (c == '\"')
                state = DOUBLEQUOTE;
            else if (c == '/')
                state = SLASH;
            else if (c == '(')
                nparenthesis++;
            else if (c == ')')
                if (nparenthesis == 0)
                    printf("Error at %d.%d position: this right parenthesis has not corresponding left parenthesis.", line, cn);
                else
                    nparenthesis--;
            else if (c == '{')
                nbrace++;
            else if (c == '}')
                if (nbrace == 0)
                    printf("Error at %d.%d position: this right brace has not corresponding left brace.\n", line, cn);
                else
                    nbrace--;
            else if (c == '[')
                nbracket++;
            else if (c == ']')
                if (nbracket == 0)
                    printf("Error at %d.%d position: this right bracket has not corresponding left bracket.\n", line, cn);
                else
                    nbracket--;
            else;
        else if (state == SINGLEQUOTE)
            if (c == '\'')
                state = OTHER;
            else if (c == '\\')
                state = BACKSLASHSINQ;
            else;
        else if (state == DOUBLEQUOTE)
            if (c == '\"')
                state = OTHER;
            else if (c == '\\')
                state = BACKSLASHDOUQ;
            else;
        else if (state == COMMENT)
            if (c == '*')
                state = STAR;
            else;
        else if (state == SLASH)
            if (c == '*')
                state = COMMENT;
            else if (c != '/') {
                state = OTHER;
                if (c == '(')
                    nparenthesis++;
                else if (c == ')')
                    if (nparenthesis == 0)
                        printf("Error at %d.%d position: this right parenthesis has not corresponding left parenthesis.", line, cn);
                    else
                        nparenthesis--;
                else if (c == '{')
                    nbrace++;
                else if (c == '}')
                    if (nbrace == 0)
                        printf("Error at %d.%d position: this right brace has not corresponding left brace.\n", line, cn);
                    else
                        nbrace--;
                else if (c == '[')
                    nbracket++;
                else if (c == ']')
                    if (nbracket == 0)
                        printf("Error at %d.%d position: this right bracket has not corresponding left bracket.\n", line, cn);
                    else
                        nbracket--;
            }
            else;
        else if (state == STAR)
            if (c == '/')
                state = OTHER;
            else if (c != '*')
                state = COMMENT;
        else if (state == BACKSLASHSINQ)
            state = SINGLEQUOTE;
        else if (state == BACKSLASHDOUQ)
            state = DOUBLEQUOTE;
        if (c == '\n') {
            line++;
            cn = 1;
        }
        else
            cn++;
    }
    if (nparenthesis != 0)
        printf("%d left parentheses have not corresponding right parentheses.\n", nparenthesis);
    if (nbrace != 0)
        printf("%d left braces have not corresponding right braces.\n", nbrace);
    if (nbracket != 0)
        printf("%d left brackets have not corresponding right brackets.\n", nbracket);
}

No. 14963  
>>14962
Наверное, когда программа сообщает о лишней квадратной скобке, она получает кроме печатных символов на вход ещё и escape-код какой-нибудь клавиши, которую ты нажал случайно, например стрелки вверх (у неё код
␛[A
).
No. 14964  
первое: https://en.wikipedia.org/wiki/Dangling_else
второе: код дублируется
третье: Cygwin сам по себе undefined behavior, cat|./a должно читать со стандартного ввода
No. 14969  
>>14963
Да, из-за этого, похоже, вывод и изменялся, спасибо, постараюсь избегать этого. Или есть возможность заставить явно печатать эти последовательности?
>>14964
>первое
Нашёл пропущенный
else;
, заработало как надо, спасибо за напоминание.
>третье
Имеется в виду >>14963?
No. 14971  
>>14969
> Или есть возможность заставить явно печатать эти последовательности?
Не знаю, есть ли под Cygwin такая возможность, можно попробовать вместо mintty.exe использовать для него другой эмулятор терминала. Другой вариант решения проблемы - поставить пакет rlwrap и запускать программу через rlwrap, тогда эти escape-последовательности вообще не будут приходить в getch().
Удалить сообщение []
Пароль  
[Mod]