Задать вопрос
  • Почему не получается прочитать/записать bmp изображение?

    alsopub
    @alsopub
    Попробуйте сначала в циклах Width заменить на Height, остальные параметры вроде нормальные.
  • Почему не получается прочитать/записать bmp изображение?

    alsopub
    @alsopub
    В BMP изображение идет снизу-вверх, слева-направо.
    Соответственно читать надо BMInfoHeader.Height строк размером BMInfoHeader.Width*3
    Аналогично надо и записывать.
    Это на вскидку сразу гляда в код.
  • Почему не получается прочитать/записать bmp изображение?

    alsopub
    @alsopub
    На счет построчной записи... тут надо смотреть очень внимательно. Если массив тот же самый, то есть вероятность что компилятор выровняет поля в памяти как ему будет удобнее (быстрее, оптимальнее) и просто так в Rgbtriple[i] прочитать данные, наверное, нельзя.
  • Почему не получается прочитать/записать bmp изображение?

    alsopub
    @alsopub
    Читать/писать по 1 байту это в любом случае не хорошо.
    Надо смотреть входной/выходной файл.
  • Как собрать статистику отключивших Javascript?

    alsopub
    @alsopub
    Нет проблем, я, вероятно, не понял вашу задачу.
  • Как собрать статистику отключивших Javascript?

    alsopub
    @alsopub
    Вставить туда картинку-счетчик, плюс картинка-счетчик за пределами тэга.
  • Как избежать вольную интерпретацию макета?

    alsopub
    @alsopub
    Slava: Возмонжо при определенных усилиях, но в вашем случае, как мне кажется, достаточно сильные различия макета и верстки, то есть надо улучшить совпадение процентов на 50 хотя бы.
  • Правда ли, что сайты больше 10 мб не индексируются поисковиками?

    alsopub
    @alsopub
    Игорь Николаевич: То что возвращает веб-сервер в ответ на GET запрос по конкретному URL.
    Я так считаю. Совпадение моего мнения с мнением Яндекса считать случайным.
  • Где закралась ошибка?

    alsopub
    @alsopub
    Вот список измененных блоков:
    get_positive([S|T], Number, TailString):-
        symbol_to_digit(S, _Digit), !,
        get_positive(integral, 0, [S|T], Number, TailString).
    
    string_to_expression(_BinaryOrUnary, [], Stack, Buffer, Expression):-
    
        string_to_list(String, L),
        string_to_expression(unary, L, [], [], E),
  • Где закралась ошибка?

    alsopub
    @alsopub
    Kartoshka D: Тут смотрите в чем дело. Ваш скрипт ожидает что строка - это массив байт. И (как я прочитал) это действительно возможно, но строка должна быть в двойных кавычках и, возможно, установлен флаг в Прологе.
    Во-первых попробуйте вставить set_prolog_flag(double_quotes, codes), возможно этого будет достаточно (проверить не смог - в онлйн прологе эта функция заблокирована) для вашей исходной программы. Еще обязательно при этом используйте "1+2" вместо '1+2'.
    Если не поможет, то я не только string_to_list добавил, я добавил еще редактировал самый первый get_positive. Так как я много чего правил и возвращал обратно и было это глубоко заполночь, я уже не скажу что еще правил, но кажется все остальное я вернул на место.
  • Где закралась ошибка?

    alsopub
    @alsopub
    И одиночные кавычки на двойные заменить.
  • Где закралась ошибка?

    alsopub
    @alsopub
    Но похоже все намного проще.
    Можно попробовать добавить set_prolog_flag(double_quotes, codes) и исходный скрипт может заработает.
  • Где закралась ошибка?

    alsopub
    @alsopub
    Теперь можно вернуть кусок кода, который я предлагал заменить.
    Смотрите код в ответе.
    Основная проблема - в работе со списками и строками.
    Ваш код расчитан на то что со строкой "123" можно работать как [Head|Tail].
  • Где закралась ошибка?

    alsopub
    @alsopub
    Kartoshka D: Я немного подкорректировал программу, не знаю правильно или нет, но, кажется, она работает теперь в swish.swi-prolog.org/.
    binary_operator(0'-, minus).
    binary_operator(0'+, plus).
    binary_operator(0'*, multiplication).
    binary_operator(0'/, division).
    
    unary_operator(0'-, unary_minus).
    
    priority(open_bracket, -1).
    priority(close_bracket, 0).
    priority(plus, 1).
    priority(minus, 1).
    priority(multiplication, 2).
    priority(division, 2).
    priority(unary_minus, 3).
    
    pop_stack_before_open_bracket([open_bracket|TailStack], PoppedBuffer, TailStack, PoppedBuffer):-!.
    pop_stack_before_open_bracket([Head|TailStack], ExpressionBuffer, PoppedStack, PoppedBuffer):-
        pop_stack_before_open_bracket(TailStack, [Head|ExpressionBuffer], PoppedStack, PoppedBuffer).
        
    pop_stack_before_less_priority(_Priority, [], PoppedBuffer, [], PoppedBuffer):-!.
    pop_stack_before_less_priority(Priority, [HeadStack|TailStack], PoppedBuffer, [HeadStack|TailStack], PoppedBuffer):-
        priority(HeadStack, HeadStackPriority), HeadStackPriority < Priority, !. % stop popping
    pop_stack_before_less_priority(Priority, [HeadStack|TailStack], ExpressionBuffer, PoppedStack, PoppedBuffer):-
        pop_stack_before_less_priority(Priority, TailStack, [HeadStack|ExpressionBuffer], PoppedStack, PoppedBuffer).
    
    
    symbol_to_digit(0'0, 0).
    symbol_to_digit(0'1, 1).
    symbol_to_digit(0'2, 2).
    symbol_to_digit(0'3, 3).
    symbol_to_digit(0'4, 4).
    symbol_to_digit(0'5, 5).
    symbol_to_digit(0'6, 6).
    symbol_to_digit(0'7, 7).
    symbol_to_digit(0'8, 8).
    symbol_to_digit(0'9, 9).
    
    
        
    get_positive([S|T], Number, TailString):-
        symbol_to_digit(S, _Digit), !,
        get_positive(integral, 0, [S|T], Number, TailString).
    get_positive(integral, IntegralPart, [0'.|Tail], Number, TailString):-
        !, get_positive(fraction, 0, 10, Tail, FractionPart, TailString),
        Number is IntegralPart + FractionPart.
    get_positive(integral, IntegralPart, [HeadDigit|Tail], Number, TailString):-
        symbol_to_digit(HeadDigit, Digit), !,
        TailIntegralPart is IntegralPart*10 + Digit,
        get_positive(integral, TailIntegralPart, Tail, Number, TailString).
    get_positive(integral, Number, String, Number, String):-!.
    get_positive(fraction, FractionPart, Factor, [HeadDigit|Tail], Number, TailString):-
        symbol_to_digit(HeadDigit, Digit), !,
        TailFractionPart is FractionPart + Digit/Factor,
        TailFactor is Factor*10,
        get_positive(fraction, TailFractionPart, TailFactor, Tail, Number, TailString).
    get_positive(fraction, Number, _TailFactor, String, Number, String).
    
    
    string_to_expression(_BinaryOrUnary, [], Stack, Buffer, Expression):-
        /* if string is empty - pop the stack */
        !, reverse(Stack, ReversedStack),
        append(ReversedStack, Buffer, ReversedExpression),
        reverse(ReversedExpression, Expression).
    
    string_to_expression(_BinaryOrUnary, String, Stack, Buffer, Expression):-
        /* if read the number - push it into buffer */
        get_positive(String, Number, TailString), !,
        string_to_expression(binary, TailString, Stack, [(number, Number)|Buffer], Expression).
    
    string_to_expression(_BinaryOrUnary, [0'(|TailString], Stack, Buffer, Expression):-
        /* if read the open bracket - push it into stack */
        !, string_to_expression(unary, TailString, [open_bracket|Stack], Buffer, Expression).
    
    string_to_expression(_BinaryOrUnary, [0')|TailString], Stack, Buffer, Expression):-
        /* if read the close bracket - pop stack before open bracket */
        !, pop_stack_before_open_bracket(Stack, Buffer, PoppedStack, PoppedBuffer),
        string_to_expression(binary, TailString, PoppedStack, PoppedBuffer, Expression).
    
    string_to_expression(binary, [OperatorSymbol|TailString], Stack, Buffer, Expression):-
        /* if read binary_operator - pop stack before head stack has bigger or equal priority than that binary_operator */
        binary_operator(OperatorSymbol, Operator), !,
        priority(Operator, OperatorPriority),
        pop_stack_before_less_priority(OperatorPriority, Stack, Buffer, PoppedStack, PoppedBuffer),
        string_to_expression(unary, TailString, [Operator|PoppedStack], PoppedBuffer, Expression).
    
    string_to_expression(unary, [OperatorSymbol|TailString], Stack, Buffer, Expression):-
        unary_operator(OperatorSymbol, UnaryOperator),
        priority(UnaryOperator, OperatorPriority),
        pop_stack_before_less_priority(OperatorPriority, Stack, Buffer, PoppedStack, PoppedBuffer),
        string_to_expression(unary, TailString, [UnaryOperator|PoppedStack], PoppedBuffer, Expression).
    
    calculate_binary_operator(plus, LeftOperand, RightOperand, Result):-
        !, Result is LeftOperand + RightOperand.
    calculate_binary_operator(minus, LeftOperand, RightOperand, Result):-
        !, Result is LeftOperand - RightOperand.
    calculate_binary_operator(multiplication, LeftOperand, RightOperand, Result):-
        !, Result is LeftOperand * RightOperand.
    calculate_binary_operator(division, LeftOperand, RightOperand, Result):-
        !, Result is LeftOperand / RightOperand.
        
    calculate_unary_operator(unary_minus, Operand, OperatorResult):-
        OperatorResult is -Operand.
    
    calculate_reverse_polish_notation([], [Result], Result):-!.
    calculate_reverse_polish_notation([(number, Value)|Tail], Operands, Result):-
        calculate_reverse_polish_notation(Tail, [Value|Operands], Result), !.
    calculate_reverse_polish_notation([UnaryOperator|Tail], [Operand|TailOperands], Result):-
        calculate_unary_operator(UnaryOperator, Operand, OperatorResult),
        calculate_reverse_polish_notation(Tail, [OperatorResult|TailOperands], Result).
    calculate_reverse_polish_notation([Operator|Tail], [RightOperand, LeftOperand|TailOperands], Result):-
        calculate_binary_operator(Operator, LeftOperand, RightOperand, OperatorResult),
        calculate_reverse_polish_notation(Tail, [OperatorResult|TailOperands], Result).
    
    calculate_string(String, Result):-
        string_to_list(String, L),
        string_to_expression(unary, L, [], [], E),
        calculate_reverse_polish_notation(E, [], Result).

    calculate_string('(1+2)*3', R).
    R = 9
  • Где закралась ошибка?

    alsopub
    @alsopub
    Сдается мне нужен или "другой" пролог или не знаю даже.
    Рассмотрим get_positive(String, Number, TailString).
    Она вызывается в виде get_positive("1+2", _G5327, _G5328), то есть первый параметр - строка.
    В теле вызывается get_positive(integral, 0, String, Number, TailString), то есть третий параметр - строка, однако ниже идет определение get_positive(integral, IntegralPart, [HeadDigit|Tail], Number, TailString) где третий параметр - список.
    По крайней мере тот интерпретатор, которым я пользовался - swish.swi-prolog.org строку "12" не может разбить на список [A|B]:
    aaa([A|B], A, B).
    ?aaa([1, 2], A, B). - работает
    ?aaa("12", A, B). - не работает