Модератор: Модераторы
azsx писал(а):третий человек пишет, что не любит С. А что в нем не так?
библиотеке, за день-два просто не разобраться. А если ещё нужно что-то собирать под новую систему (н.р. какой-нить юниксовую библиотеку под mingw32/msvisual), то оказывается что ещё нагромаждение сборочных систем. Без которых в Си, как и без препроцессора жить нельзя.
azsx писал(а):скалогрыз без шуток, вы меня расстраиваете. Я думал щас С выучу, потихоньку на нем писать начну - борода вырастет и чувство собственного величия... Насчет разношерстности компиляторов С++ согласен,я поэтому учу С
azsx писал(а):Кстати недавно на другом форуме я задавал вопрос, почему так сложно копировать и искать исходный код на С под разные алгоритмы. Ведь на С типа всё есть. Я думал, что это я искать не умею, а оно оказывается не идет половина сложных алгоритмов за просто так...
azsx писал(а):третий человек пишет, что не любит С. А что в нем не так?
azsx писал(а): А что в нем не так?
скалогрыз писал(а):Но самый мой ужас пришёл потом, когда пришлось ковырать Си-шные исходники, с грудами препроцессора. Оказалось, что Си недоделка и без препроцессора в нём никак. А препроцессор, это первокласный обфускатор.
Меня всегда удивляли люди, которые говорили, что в Си запись короче, чем в Паскале/Делфи. Это враньё. Просто любой исходник/заголовок Си, обвешен тоннами препроцессоров (во многом из-за нужды обслуживать разные версии компиляторов и разные системы. В паскале-то версий компиляторов меньше). Как итог в Си/Си++ записи расплываются раза в два-три длинее паскалевсих.
Задание №1. Вывести одним оператором printf четыре переменных типа long long (или unsigned long long для разнообразия). Сильно удивитесь, если это сделаете для разных компиляторов. Особенно эпична разница между Visual C++ и gcc/mgw
#include <stdio.h>
int main(int /*argc*/, char* /*argv*/[]) {
long long x = 5;
printf("%lli\n", x);
return 0;
}
Вывести через printf величину, хранящуюся в переменной типа long double.
#include <stdio.h>
int main(int /*argc*/, char* /*argv*/[]) {
long double x = 5;
printf("%Lf\n", x);
return 0;
}
Задание №3. Поработать с файлом длиной больше 4 гигабайт на 32-разрядной ОС. Чудные костылики. Если еще найдёте их. :D Потому как тщательно прячут.
#include <stdint.h>
#include <iostream>
#include <fstream>
int main(int /*argc*/, char* /*argv*/[]) {
using namespace std;
// более 4GB
uint64_t size = 4*1024*1024*(uint64_t)1024 + 1;
{
// создаём файл более 4GB
ofstream out("large.bin");
for (uint64_t i = 0; i < size; ++i)
out.put((char)i);
}
{
// читаем файл более 4GB
ifstream in("large.bin");
int count = 0;
for (uint64_t i = 0; i < size; ++i)
if (in.get() == 255)
++count;
// мы посчитали сколько раз встретилось 255,
// а это примерно 1/256 от размера файла
cout << count << endl;
}
return 0;
}
17:56:54 doj@malina:~$ g++ large.cpp -o large && time ./large
16777216
real 31m58.599s
user 26m25.430s
sys 2m2.540s
18:29:01 doj@malina:~$ uname -a
Linux malina 4.1.13+ #826 PREEMPT Fri Nov 13 20:13:22 GMT 2015 armv6l GNU/Linux
Дож писал(а):Нужно всё же отличать C и C++. Нет такого языка «C/C++», есть отдельно язык C со своим стандартом и отдельно язык C++ со своим стандартом, язык C не являюется подмножеством C++ (вопреки распространённому мнению). На C++ можно вполне себе писать короткий код без макросов.
скалогрыз писал(а):а ещё я нелюблю генерики
dedm0zaj писал(а):как тогда писать листы? отдельный лист под каждый тип? или юзая нетипизированный указатель? в него же можно положить что угодно, что плохо.
Дож писал(а):какой компилятор и в какой системе, по-вашему, неправильно отработает такой printf?
Дож писал(а):Написал самым прямолинейным и тупым способом, без костылей
Со школьной и студенческой скамьи вбивают - дублирование кода, это плохо. И почему же дженерики это не дублирование в промышленных масштабах?
так какие 2 явления? "ручное" и "автоматическое"? или ты имеешь в виду "дублирование логики" и "копирование реализации для другого типа"?Дож писал(а):Я уже не первый раз вижу, как в аргументации сливают два различных явления в одно (потому что и то, и другое можно назвать словом дублирование).
и именно по-этому я ратую за приведение типов, нежели дублирование, ручное или автоматическое.
так какие 2 явления? "ручное" и "автоматическое"? или ты имеешь в виду "дублирование логики" и "копирование реализации для другого типа"?
Дож писал(а):При этом внешние списки дублируете руками, а не приводите по типу
скалогрыз писал(а): Опять же писать спец-лист для каждого не обязательно. Например можно использовать TObjectList или TFPObjectHashTable. Сейчас прибегут и скажут, дескать "теряешь производительность на проверках типа". Отвечу, что не теряю, т.к. считаю, что проверка типа (is) займёт времени несоизмеримо меньше,
Дож писал(а):Дублирование логики в исходнике и дублирование одинакового кода в исполняемом файле, да.
if T is String then Result := a + a
else if T is Integer then Result := a * a
else if T is Record then // do nothing
else if T is ...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37