пятница, 30 сентября 2011 г.

Template instantiation library

На конференции по математике речь зашла о програмировании. Один из участников спросил не знаю ли я как сделать "библиотеку из шаблонов", так как он использует свой шаблон только с определенным количеством типов.
Я написала ему вот такой вариант:

a.h:

#pragma once
#include <iostream>
#include <algorithm>
template <class T>
class A
{
    int size;
    T* a;

public:
    A(int s): size(s), a(new T[s]) { std::cerr << "A::A(int s)\n";} ;
    ~A() { std::cerr << "A::~A()\n"; delete [] a; }
    A(const A& source):  
      size(source.size), a(new T[source.size])  
    { 
        std::cerr << "A::A(const T&)\n" ;  
        std::copy(source.a, source.a + source.size, a);  
    } 
    bool compare(const T* with, int s) {
        std::cerr << "A::compare(const T&)";
        if (size == s)
             return std::equal(a, a + size, with);
        return false;
    }
};
 
instantiation.cpp:
#include "a.h"

template class A<int>;
main.cpp
#include <iostream>
#include "a.h"
using namespace std ; 
extern template class A;
int main()
{
        typedef A<int> IntA ;


        IntA ia(5) ;
        IntA ia1 = ia;
        int* a = new int[5];
        ia.compare(a, 5); 
        delete [] a;
}
Компиляция:
$ g++ -fno-implicit-templates -c main.cpp
$ g++  fno-implicit-template -c instantiation.cpp
$ g++ main.o  instantiation.o

Я мало сталкивалась с шаблонами, поэтому с радостью услышу критику такого подхода.

вторник, 23 августа 2011 г.

Капитан спешит на помощь.


Навеяно вот этим:


 В Яндексе используются протоколы маршрутизации – внутренний протокол OSPF и внешний протокол BGP. Из-за ошибки информация обо всех внешних маршрутах оказалась во внутренних таблицах маршрутизации. Это примерно на три порядка больше маршрутов, чем обычно. Протокол OSPF не рассчитан на такое количество. В результате у всех маршрутизаторов кончилась память, и они перестали работать. Нарушилась работа сети, и через несколько минут Яндекс стал полностью недоступен.


Текст новости.

четверг, 4 августа 2011 г.

WTF на WTFе сидит и WTFом погоняет

Вот в таком приходится копаться.

Виртуальные функции -- это для девочек.
class A{
        public:
                 void f() {/* code */}
};

class B: public A{
        public:
                void f() {/* code */}

};

// a is a pointer to A

B* b = dynamic_cast<B*>(a);
b->f();

Father, I need your help.
class A{
        public:
                 void a() {/* code */}
                 void b() {/* code */}
                 // c, d, e
                 void f() {/* code */}

};

class FeaturedA: public A{
        public:
                void a() {A::a()}
                void b() {A::b()}
                // c, d, e
                void f() {A::f()}

                void feature_1() {/* code */}
                void feature_2() {/* code */}
                void feature_3() {/* code */}


};
Очень дружелюбные.

 У класса много друзей (в среднем 9-10) и все они ведут себя по-свински вот так:
class Plant{
        FlowerBed bed;
        Flowers flowers;
    public:
        void plant(){
            // ...
             Flowers toPlant =  chooseFlowers(bed.size, bed.type) 
            // ...   
        }
        
};
class FlowerBed{
    Size size; 
    Type type;     
    // Time to make friends;
    friend class Plant;    
};
    

Не паниковать!
  /*
   * Part of a library
   */
  int A::someGreateMethod(){
        // code
        if (condition)
             return value;
        else{
            // OOPS something wrong
            abort(); // Time to start panick
            return  0; // Original comment for this line is: 
                       // "This line add to avoid compiler warning".
                       // Hm, after this he cares about warnings 0_o
         }
  }
А платят нам за строчки.
   // in class definition
   vector< vector<int> > index (6);
   // in constructor of this class
   for (int i = 0; i < 6; i++)
        index[i].resize(3);
    index[0][0] = -1;
    index[0][1] = 0;
    index[0][2] = 0;
    index[1][0] = 1;
    index[1][1] = 0;
    index[1][2] = 0;
    index[2][0] = 0;
    index[2][1] = -1;
    index[2][2] = 0;
    index[3][0] = 0;
    index[3][1] = 1;
    index[3][2] = 0;
    index[4][0] = 0;
    index[4][1] = 0;
    index[4][2] = -1;
    index[5][0] = 0;
    index[5][1] = 0;
    index[5][2] = 1;

Страшно выглядит? Это нормали к граням кубика. Связка "for-resize", меня добила.
Нам преподаватель по програмированнию рассказывал, что когда програмистам платят в зависимости от количества написанных строк, то они ставят фигурные скобки  на следующей строчке :). Так что если написать, например, вот так:
vector <vector <int> > index (6, vector<int> (3, 0));
то заплатят меньше.

Для наглядности?
Мотивы к использованию такой конструкции мне совсем не понятны:
class A{
        void someFunction(){
            A* a = this;
        }    
};

Что такое жидкость?
bool isFluid(int color) {
    if (color == 0 || color > 80)
        return false;
    return true;
}



Разноцветные.
Цитата из документации:
In config file you can set colors of compounds. If you do not want to do it, then this color will be generate automatically.
Ага, автоматически и без участия мозга человека:
color of voxel-compound is 8.59771e+08


P.S. Код подсвечивался при помощи Pygments.
P.P.S.  Спасибо Hades за картинку в тему.

вторник, 22 февраля 2011 г.

Мойте руки перед едой.

На работе проходят недели компьютерной грамотности. В кафетериях развешены напоминалки ("Блокируйте компьютеры перед уходом", "Используйте надежные пароли для защиты ваших данных", "Вступайте в ряды красной армии" ):

На столах лежат вот такие памятки:


Мне понравился вот этот кусочек памятки:
Sichere passwörter.
Gute und leicht zu merkende Passwörter finden Sie, wenn Sie sich aus Ihrer eigenen Lebensgeschichte  einen Satz uberlegen, die Anfangsbuchstaben der Wörter nehmen und ein Sonderzeichen beifügen.
Beispiel:
Ich ging mit Gabi 1993 nach Afrika! Passwörter: IgmG1993nA!
Что в переводе означает:
Безопасные пароли.
Хороший и простой для запоминания пароль можно получить из собственной биографии. Составьте предложение, описывающее событие из жизни,  возьмите начальные буквы слов этого предложения,  добавьте специальный символ.
Пример:
В 1993 году я ездил с Машей в Ростов! Пароль: V1993isMevR!