Блог пользователя zakharvoit

Автор zakharvoit, 9 лет назад, По-русски

Вдохновленный всякими CHelper и JHelper я написал свой небольшой скрипт, предназначенный для удобного использования prewritten code на c++.

Он удаляет все комментарии и разворачивает все include в кавычках в содержимое соответствующих файлов. При этом не разворачивая ничего рекурсивно.

Здесь можно его скачать https://github.com/zakharvoit/libparser.

Как использовать. Для примера напишем некоторый файл ~/lib/binpow.h

#ifndef LIB_BINPOW_H
#define LIB_BINPOW_H
int binpow(int a, int n)
{
    int res = 1;
    while (n > 0) {
	if (n & 1) {
	    res *= a;
	}
	a *= a;
	n >>= 1;
    }
    return res;
}
#endif

И некоторый файл ~/contest/main.cpp

#include <iostream>
#include "binpow.h"

using namespace std;

int main()
{
    cout << binpow(2, 10) << endl;
}

Теперь воспользуемся скриптом: ./libparser.pl ~/lib main.cpp output.cpp

После этого в файле output.cpp будет готовый к отправке код.

Для запуска скрипта нужен интерпретатор perl (уже должен быть установлен на unix-like системах). Не уверен, что скрипт будет работать под windows, но скорее всего будет. Если не работает — напишите в комментариях.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +64
  • Проголосовать: не нравится

Автор zakharvoit, 10 лет назад, По-русски

Мало кто знает, но компиляторы и стандартная библиотека C++ могут проверять выходы за границы массивов и векторов.

Если мы используем gcc и glibc, то следующий код бросит исключение:

#define _GLIBCXX_DEBUG

#include <bits/stdc++.h>

int main() {
    std::vector <int> a(100);
    int x = -1;
    printf("%d\n", a[x]);
}

И мы получим примерно вот такой вывод: error: attempt to subscript container with out-of-bounds index -1, but container only holds 100 elements.

Номер строки мы не узнаем, но лучше, чем ничего. С этим флагом все контейнеры С++ включают проверки на ошибки (кроме C++11 std::array, как я понял). Также можно не писать define прямо в коде, а передавать аргумент компилятору: g++ -D_GLIBCXX_DEBUG main.cpp -o main

А что делать с массивами? Для проверки выхода за границы массива предусмотрен флаг -fsanitize=bounds. Правда у меня его gcc(4.7.3) не принял, сказав, что неизвестный флаг, но clang скомпилировал.

#include <bits/stdc++.h>

int main() {
    int a[100];
    int x = -1;
    printf("%d\n", a[x]);
}

Компилируем вот так: clang++ main.cpp -fsanitize=bounds -o main

При запуске получаем: test.cpp:6:20: runtime error: index -1 out of bounds for type 'int [100]

Еще более дружелюбный вывод, чем в случае с векторами.

К сожалению c динамическими массивами (int *a = new int[100]) такое не работает, но есть еще флаг -fsanitize=undefined (включает в себя bounds) и -fsanitize=adress, который как раз уронит вариант с динамическим массивом.

UPD: WARNING: Не отсылайте решения с этим макросом в коде, неизбежно получите ТЛ.

UPD2: Чтобы использовать -fsanitize нужен gcc >=4.9 или clang

Полный текст и комментарии »

  • Проголосовать: нравится
  • +77
  • Проголосовать: не нравится

Автор zakharvoit, 10 лет назад, По-русски

Мой сосед по комнате столкнулся с забавной ситуацией: Java 8 ускорила код более, чем в два раза

http://codeforces.com/contest/425/submission/6501078

http://codeforces.com/contest/425/submission/6501090

Полный текст и комментарии »

  • Проголосовать: нравится
  • +21
  • Проголосовать: не нравится

Автор zakharvoit, 10 лет назад, По-русски

Полиогон не добавляет решение на haskell(*.hs), хотел написать в issue tracker, но ссылки на public issue tracker и на end-user documentation на главной странице не работают.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +11
  • Проголосовать: не нравится

Автор zakharvoit, 12 лет назад, По-русски

Пытаюсь добавить к задаче эталонное решение на C#(*.cs). Polygon мне отвечает, что "File has invalid extension". Я так понял, что руками указать на каком языке написано решение нельзя?

Полный текст и комментарии »

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

Автор zakharvoit, 12 лет назад, По-русски

30-31 мая пройдет "Международный конкурс по практической безопасности Positive Hack Days".

Кто нибудь участвовал в этом мероприятии раньше? Если участвовал было бы интересно узнать что это такое и что там надо делать.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

Автор zakharvoit, 12 лет назад, По-русски

Здравствуйте, обитатели Codeforces.

На полуфинале ВКОШП в Дальневосточном регионе за победу нашей команде выдали айпады, насколько я понял - даже вторые. Почитав в интернете про возможность программирования на этой штуковине я нашел не так уж и много информации. Такие возможности есть, но они стоят некоторое количество долларов. Пока я поставил себе блокнот с возможностью онлайн компилирования(тоже не бесплатный).

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

Все же если кто-то имел опыт программирования на на чем нибудь подобном, мне было бы интересно услышать ваши советы насчет установки на айпад компиляторов и IDE.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится