Січень 14th, 2009
У QT знайшов черговий приклад, як не треба робити. Спішу поділитися
Уявіть собі, є якийсь там клас QPluginLoader, який має метод QString QPluginLoader::errorString (). Типу, якщо шось там спрацювало не так як треба, то цей метод повертатиме текстовий опис помилки. Питання на засипку: що видає ця функція, якщо все пройшло добре? Коли б це проектували нормальні люди, то відповідь була б “No error”, або щось подібне. Стандартна perror(), наприклад, в такому випадку чітко і ясно пише “Success” (в англійській локалі, звісно). Натомість витвір заморожених норвежців запросто видає “Unknown error”. А фіглі його тут зайвий раз викликають…
Категорії: C/C++, Життя |
Теґи:c/c++, QT, програмування | Кометарів немає
Січень 12th, 2009
Вирішив викласти у себе, може, комусь знадобиться
стандарт C (C99)
чинний на сьогоднішній день стандарт C++
Категорії: C/C++, Життя, програмування |
Теґи:c/c++, стандарти | Кометарів немає
Листопад 10th, 2008
Ще одне цікаве завдання, з тих, що пропонує Яндекс:
Есть класс CodeGenerator, который умеет генерить код на разных языках.
-
-
class CodeGenerator
-
{
-
public:
-
enum Lang {JAVA, C_PLUS_PLUS, PHP};
-
CodeGenerator(Lang language) { _language=language; }
-
std::string generateCode()
-
{
-
switch(_language) {
-
case JAVA: //return generated java code
-
case C_PLUS_PLUS: //return generated C++ code
-
case PHP: //return generated PHP code
-
}
-
throw new std::logic_error("Bad language");
-
}
-
std::string someCodeRelatedThing() // used in generateCode()
-
{
-
switch(_language) {
-
case JAVA: //return generated java-related stuff
-
case C_PLUS_PLUS: //return generated C++-related stuff
-
case PHP: //return generated PHP-related stuff
-
}
-
throw new std::logic_error("Bad language");
-
}
-
-
private:
-
Lang _language;
-
}
-
Исходя из предположения, что количество языков будет добавляться, предложите refactoring кода. Аргументируйте преимущество вашего кода над существующим.
(ще…)
Категорії: C/C++, Паттерни проектування |
Теґи:c/c++, factory, refactoring, yandex, паттерни програмування, програмування, рефакторінг | Кометарів немає
Листопад 7th, 2008
Виявляється, Яндекс постійно набирає нових людей, зокрема, розробників C++. Перша частина співбесіди — онлайн. Завдання, що там пропонуються, без сумніву, варті уваги. Ось , наприклад, таке
-
-
class Top {
-
public:
-
virtual ~Top (){}
-
};
-
-
class Right : virtual public Top {
-
public:
-
void f () {}
-
};
-
-
class Left : virtual public Top {
-
public:
-
void f () {}
-
};
-
-
class Bottom : public Right, public Left {
-
public:
-
/*
-
* что надо написать чтобы выполнялось требование описанное в main
-
*/
-
};
-
-
int main (int, char**) {
-
Bottom b;
-
b.f(); // Требование: вызов Left::f()
-
}
-
Звісно, перше, що спадає на думку, зробити шось типу
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++ |
Теґи:c/c++, virtual, yandex, Яндекс | Кометарів немає
Жовтень 27th, 2008
Минулого до чотирьох з половиною сотень бейсиків додався ще один — Small Basic від Microsoft. Цього разу спеціально для дітей, щоб було на чому вчитися програмуванню. Середовище розробки максимально спрощене, але при цьому дуже красиве. Одне тільки автодоповнення яке гарне… (ще можна на офіційний скріншот глянути)

І мануал для цього чуда непоганий написали, і приколів поназбирали. Черепашку ту ж саму завели. Вона вміє по екрану ходити, залишаючи за собою слід. Малювати тобто.
Коротше всі в захваті. Малеча ганяє черепашку і завантажує фото з Flicr, старші покоління розказують одне одному байки про QBasic на 286-их машинах. Найсуворіші розповідають про GWBasic на ЕОМ радянського виробництва
Але це тільки на перший погляд. Копнеш глибше — казка закінчується, вилазять численні баги. От про один з них я далі і розповім.
(ще…)
Категорії: програмування |
Теґи:Microsoft, Small basic, інтернаціоналізація, локацізація | Кометарів немає
Жовтень 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, програмування |
Теґи:Miguel de Icaza, ODF, OOXML, Sun | Кометарів немає
Вересень 30th, 2008
C++ відомий своєю заплутаністю. Ключових слів ніби й небагато, але кожне може бути використане у багатьх контекстах. В цьому дописі я спробую звести воєдино всі відомі мені способи використання слова static. Хто знає, може буде щось таке, чого ви не знали раніше
(ще…)
Категорії: C/C++ |
Теґи:c/c++, keyword, static | Кометарів немає
Вересень 15th, 2008
Розміри вихідного коду вражають. На цій сторінці пропонують скачати архів розміром всьго навсього 437 мегабайт
Компілювати його пропонують за допомогою 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. От.
Категорії: Життя, програмування |
Теґи:google, google chrome | Кометарів немає
Вересень 13th, 2008
Еліпсисом (англ ellipsis) називають елемент синтаксису мови C, що представляє собою три крапки. Наприклад, як у оголошенні фукнції printf :
int printf(const char *format, ...);
Еліпсис означає, що на цьому місці знаходится якась кількість змінних якогось типу. Функція сама має визначити, які саме змінні їй передали.
(ще…)
Категорії: C/C++ |
Теґи:c/c++, ellipsis, printf, va_args, еліпсис | Коментарів: 1
Серпень 28th, 2008
Я до цього часу вважав, що C++ є розширенням C. Ну, насправді, я розумію, що це абсолютно різні мови, з різними сферами застосування і т.д. і блаблабла… Але от була така впевненість, що формально нема в C нічого такого, чого б не було C++. Тобто, я вважав, що сертифікований компілятор C++ має без будь-яких зауважень скомпілювати C-програму. А от ні, виявляється, є одна штука, якою ці мови відрізняються. Хоча, звісно, це така, дуже теоретична відмінність, наврядчи хтось може з цим зіткнутися в реальному житті.
(ще…)
Категорії: C/C++ |
Теґи:c/c++, gcc, програмування | Кометарів немає