Функція повідомлення про помилку

Січень 14th, 2009

У QT знайшов черговий приклад, як не треба робити. Спішу поділитися :)

Уявіть собі, є якийсь там клас QPluginLoader, який має метод QString QPluginLoader::errorString (). Типу, якщо шось там спрацювало не так як треба, то цей метод повертатиме текстовий опис помилки. Питання на засипку: що видає ця функція, якщо все пройшло добре? Коли б це проектували нормальні люди, то відповідь була б “No error”, або щось подібне. Стандартна perror(), наприклад, в такому випадку чітко і ясно пише “Success” (в англійській локалі, звісно). Натомість витвір заморожених норвежців запросто видає “Unknown error”. А фіглі його тут зайвий раз викликають…

Категорії: C/C++, Життя | Теґи:, , | Кометарів немає

Стандарти C та C++

Січень 12th, 2009

Вирішив викласти у себе, може, комусь знадобиться

стандарт C (C99)
чинний на сьогоднішній день стандарт C++

Категорії: C/C++, Життя, програмування | Теґи:, | Кометарів немає

Рефакторінг

Листопад 10th, 2008

Ще одне цікаве завдання, з тих, що пропонує Яндекс:

Есть класс CodeGenerator, который умеет генерить код на разных языках.

  1.  
  2. class CodeGenerator
  3. {
  4. public:
  5.     enum Lang {JAVA, C_PLUS_PLUS, PHP};
  6.     CodeGenerator(Lang language) { _language=language; }
  7.     std::string generateCode()
  8.     {
  9.         switch(_language) {
  10.         case JAVA:        //return generated java code
  11.         case C_PLUS_PLUS: //return generated C++ code
  12.         case PHP:         //return generated PHP code
  13.         }
  14.         throw new std::logic_error("Bad language");
  15.     }
  16.     std::string someCodeRelatedThing() // used in generateCode()
  17.     {
  18.         switch(_language) {
  19.         case JAVA:        //return generated java-related stuff
  20.         case C_PLUS_PLUS: //return generated C++-related stuff
  21.         case PHP:         //return generated PHP-related stuff
  22.         }
  23.         throw new std::logic_error("Bad language");
  24.     }
  25.  
  26. private:
  27.     Lang _language;
  28. }
  29.  

Исходя из предположения, что количество языков будет добавляться, предложите refactoring кода. Аргументируйте преимущество вашего кода над существующим.

(ще…)

Категорії: C/C++, Паттерни проектування | Теґи:, , , , , , | Кометарів немає

На роботу в Яндекс

Листопад 7th, 2008

Виявляється, Яндекс постійно набирає нових людей, зокрема, розробників C++. Перша частина співбесіди — онлайн. Завдання, що там пропонуються, без сумніву, варті уваги. Ось , наприклад, таке

  1.  
  2. class Top {
  3.   public:
  4.     virtual ~Top (){}
  5. };
  6.  
  7. class Right : virtual public Top {
  8.   public:
  9.     void f () {}
  10. };
  11.  
  12. class Left : virtual public Top {
  13.   public:
  14.     void f () {}
  15. };
  16.  
  17. class Bottom : public Right, public Left {
  18.   public:
  19. /*
  20. * что надо написать чтобы выполнялось требование описанное в main
  21. */
  22. };
  23.  
  24. int main (int, char**) {
  25.   Bottom b;
  26.   b.f(); // Требование: вызов Left::f()
  27. }
  28.  

Split post hereЗвісно, перше, що спадає на думку, зробити шось типу

void f () { Left::f();}

Але так негарно. Виклик однієї функції через іншу… Не дуже добре, особливо якщо в реальному житті трапиться метод з багатьма параметрами.

Насправді, розумні люди підказали , треба робити так:


using Left::f;

Цей запис виглядав би так само, навіть якби у батьківських класах метод f приймав би якісь параметри.

В тому коді є ще пара цікавих моменти, про які особисто я не знав, не знав, та й забув.

По-перше, спосіб наслідування virtual publiс. Виявляється, слово virtual в даному випадку означає, що у класі Bottom буде присутня одна і тільки одна реалізація об’єкту класу Top. Якби virtual не було, тоді виникала б неоднозначність при використанні членів класу Top, успадкованих як в Left, так і в Right. Втім, в прикладі цього не видно, бо в Top занадто спрощений.

По-друге, клас Top має віртуальний деструктор. Питання: який взагалі сенс деструктору бути віртуальним, коли його все одно не можна перекрити в класі-нащадку? Погугливши, знайшов відповідь . Справа в тому, що якби не слово virtual, то ось в такому випадку

int main {
Top* tp = new Right;
}

було б викликано деструктор явно заданого класу (Top), в той час, коли насправді треба викликати ~Right.

Категорії: C/C++ | Теґи:, , , | Кометарів немає

Дитяча помилка в програмі для дітей

Жовтень 27th, 2008

Минулого до чотирьох з половиною сотень бейсиків додався ще один — Small Basic від Microsoft. Цього разу спеціально для дітей, щоб було на чому вчитися програмуванню. Середовище розробки максимально спрощене, але при цьому дуже красиве. Одне тільки автодоповнення яке гарне… (ще можна на офіційний скріншот глянути)

І мануал для цього чуда непоганий написали, і приколів поназбирали. Черепашку ту ж саму завели. Вона вміє по екрану ходити, залишаючи за собою слід. Малювати тобто.

Коротше всі в захваті. Малеча ганяє черепашку і завантажує фото з Flicr, старші покоління розказують одне одному байки про QBasic на 286-их машинах. Найсуворіші розповідають про GWBasic на ЕОМ радянського виробництва :) Але це тільки на перший погляд. Копнеш глибше — казка закінчується, вилазять численні баги. От про один з них я далі і розповім.
(ще…)

Категорії: програмування | Теґи:, , , | Кометарів немає

Про розмір специфікації OOXML

Жовтень 4th, 2008

Майже випадково натрапив на старий (від першого лютого) пост Мігеля Ікази. Він там висловлює власну думку про війну форматів, і, зокрема, про обсяг специфікації формату, запропонованої Microsoft:

Основне запереченя проти OOXML полягає в тому, що специфікація є “занадто великою”. Нібито 6000 сторінок занадто багато для специфікації і що це заважатиме третім сторонам від реалізовувати підтримку стандарту.

Насправді, це, мабуть, насправді є скоріше перевагою. Варто згадати, що протягом багатьох років ми намагались отримати як можна більше інформації про ці стандарти.

Наприклад, дуже давно, коли я працював над Gnumeric, суттєвою проблемою була відсутність інформації про функції і формули в Excel. В наявній тоді літературі це все було описано дещо неповно.

В описі OOXML опису формул та функцій присвячено 324 сторінки.

В початковому зверненні до робочої групи ECMA TC45 ця інформація була відсутня. Jody Goldberg та Michael Meeks (представники Novell у TC45) запросили її та включили до опису стандарту. Я вважаю це перемогою. Ці 324 сторінки (майже половина опису ODF) — перемога для всіх.

В залежності від того, як рахувати, в ODF на опис формул відведено від 4 до 10 сторінок. Очевидно, геть неможливо написати програму для обробки таблиць, використовуючи лише цей опис.

Щоб написати програму для роботи з таблицями в форматі ODF, доведеться додатково вивчати вихідні коди існуючих реалізацій (OpenOffice.org, Gnumeric), або відкриту документацію Microsoft, або , як це не смішно, OOXML.

(ще…)

Категорії: linux, програмування | Теґи:, , , | Кометарів немає

Багатозначне слово Static

Вересень 30th, 2008

C++ відомий своєю заплутаністю. Ключових слів ніби й небагато, але кожне може бути використане у багатьх контекстах. В цьому дописі я спробую звести воєдино всі відомі мені способи використання слова static. Хто знає, може буде щось таке, чого ви не знали раніше :) (ще…)

Категорії: C/C++ | Теґи:, , | Кометарів немає

Ще пара фактів про Google Chrome

Вересень 15th, 2008

Розміри вихідного коду вражають. На цій сторінці пропонують скачати архів розміром всьго навсього 437 мегабайт 8) Компілювати його пропонують за допомогою Microsoft Visual Studio 2005 (власне, у тому архіві проект *.sln, типовий для студії). Процес компіляції (за їх оцінками) може тривати від 15 до 40 хвилин. А фінальний результат — трохи більше семи мегабайт.

Втім, знаходяться таки люди, здатні все це переглянути і знати щось цікаве. Ось такий коментар, наприклад:

“// Completely undocumented from Microsoft. You can find this information by
// disassembling Vista’s SP1 kernel32.dll with your favorite disassembler.
enum PROCESS_INFORMATION_CLASS {
ProcessExecuteFlags = 0×22,
}”

Тобто, невідомий розробник чесно зізнається, що йому довелося дизасемблювати один з системних модулів Windows. Що поробиш, заради такої світлої мети, як уникнення вразливостей в коді програми, можа піти навіть на порушення EULA.

Оскільки код відкритий, не дивно, що почали з’являтись оффлайнові інсталятори Мабуть, помітивши це, хлопці з Google вирішили не жлобитися і теж випустили свій, офіційний Full Standalone Offline Installer for google chrome. Різниця між ними у півтора мегабайти, тому радять все ж використовувати гуглівський, бо він гарантовано free from any spyware, adware and malware. От.

Категорії: Життя, програмування | Теґи:, | Кометарів немає

Еліпсис, або як створити свій аналог printf

Вересень 13th, 2008

Еліпсисом (англ ellipsis) називають елемент синтаксису мови C, що представляє собою три крапки. Наприклад, як у оголошенні фукнції printf :
int printf(const char *format, ...);

Еліпсис означає, що на цьому місці знаходится якась кількість змінних якогось типу. Функція сама має визначити, які саме змінні їй передали.

(ще…)

Категорії: C/C++ | Теґи:, , , , | Коментарів: 1

Відмінність між C та C++

Серпень 28th, 2008

Я до цього часу вважав, що C++ є розширенням C. Ну, насправді, я розумію, що це абсолютно різні мови, з різними сферами застосування і т.д. і блаблабла… Але от була така впевненість, що формально нема в C нічого такого, чого б не було C++. Тобто, я вважав, що сертифікований компілятор C++ має без будь-яких зауважень скомпілювати C-програму. А от ні, виявляється, є одна штука, якою ці мови відрізняються. Хоча, звісно, це така, дуже теоретична відмінність, наврядчи хтось може з цим зіткнутися в реальному житті.
(ще…)

Категорії: C/C++ | Теґи:, , | Кометарів немає