Июн 24 2010

Проблемы с delete[]?

Недавно в блоге Алёны (http://alenacpp.blogspot.com/2010/06/delete.html) был опубликован пост «Проблемы с delete[]», где был приведён пример вот такого кода:

A* a = new B[T];
delete[] a;

представляющего собой отрывок более длинного кода, приведённого в другом блоге (под девизом «Программирование — это просто!»): http://easy-coding.blogspot.com/2010/06/delete.html.
Адепты, достигшие просветления, уже поняли, что это работать не будет, а остальные могут читать дальше, и убедиться в том, что программирование — это не всегда просто.

Вот код из начального поста:

Листинг 1.

#define T 2
class A {
  public:
    virtual ~A() {
      p = 0;
    }
    int p;
  };
class B: public A {
  int a;
};
int main() {
  A* a = new B[T];
  delete[] a;
  return 0;
}

При запуске программа падает практически на любом компиляторе, кроме VisualStudio (и некоторых других).

Давайте разбёремся в том, что здесь неправильного, почему программа падает, и, самое главное, в том, почему она кое-где НЕ падает (хотя должна).

Примечание: в комментариях к блогу Алёны некто soonts пишет:

Как обычно, нормальные ОС + IDE этой проблемой не затронуты: в мире Windows всё работает.

Вот вам и объяснение: программа работает исключительно благодаря магической силе MS Windows и лично Билла Гейтса. Я надеюсь, что среди моих читателей не будет столь малообразованных молодых людей, которые делают такие обобщения, не разобравшись в сути вопроса.

Read more »

Июн 09 2010

Как это работает?

switch ((rand() >> 8) % 3) 
//the ">> 8" (typically) improves the period of the lowest 2 bits
       case 0: DoSmth();
       case 1: DoSmth1();
       case 2: DoSmth2();
     }
Июн 02 2010

Плата клавиатуры и дисплея

Плата дисплея и клавиатуры для нового прибора. Дисплей монохромный графический 128х64. По бокам от клавиатуры находятся энкодеры, служащие для управления прибором (наряду с клавиатурой).

Пока клавиатура приделана к плате с помощью картонок и скотча, но потом она будет приклеена к передней панели прибора.

Под катом ещё фотографии. Read more »

Июн 01 2010

Ещё одна плата нового прибора

Ещё одна плата нового прибора, который я разрабатываю.

Плата содержит 4 гальванически изолированных АЦП (24 бита) с контролем обрыва линий датчиков, 6 дискретных выходов (твердотельные реле с переключающими контактами), а также цепи управления силовыми ключами (управление ТЭНами). Также на плату монтируются сами силовые ключи и источник питания (AC/DC  преобразователь 220/24 в). Ключи и источник питания пока не установлены.

Плата является рабочим макетом, поэтому содержит макетные поля на всех свободных участках, куда при необходимости могут быть смонтированы дополнительные компоненты.

А вот так она выглядела на экране компьютера: http://32bit.me/?p=291.

Июн 01 2010

Плата нового прибора

Плата прибора, разработкой которого я сейчас занимаюсь. Плата содержит микроконтроллер LPC1768 и четыре гальванически изолированных (друг от друга и от процессора) каналов ЦАП (токовые выходы 4-20 мА, 12 разрядов), а также различные порты (USB, RS-232, RS-485).