LINUX.ORG.RU

понять Си

 , ,


3

2

посоветуйте, что почитать для поверхностного понимания философии языка Си.
я вот экспериментирую (Си+ООП из C++), решил сделать банальную функцию, возвращающую строку с датой:

char* sh_time::getTimeString() {
  time_t t = time(0);
  struct tm * now = localtime( & t );
  //(*s) << printf("%d-%02d-%02d\n", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);
  size_t sz;
  sz = snprintf(NULL, 0, "%d-%02d-%02d\n", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);
  s = (char *)malloc(sz + 1);
  snprintf(s, sz+1, "%d-%02d-%02d\n", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);
  return(s);
}

плюс отдельная функция, делающая free(s).
это у языка такая фишка - каждый на ровном месте огород городит - или же для подобных задач есть стандартизированные пути решения? (я не про готовые функции, а про традиционные способы решения задач)

★★★

Последнее исправление: CYB3R (всего исправлений: 4)
Ответ на: комментарий от anonymous

Тем более, кресты делают упор на структурную декомпозицию программы.

Кстати, поскольку скоп это та же [многовложенная] структура, то всю программу можно рассматривать как один большой конструктор, который начинается со скопа main() и в нем же заканчивается. А все возмущения в виде динамичности стека вызовов — это реакция конструкторов полей вложенных скопов на особенности внешней среды. И если объявление переменной это часть скопа функции, то вызов функции это шаг инициализации суперскопа (стека), а сама функция это конструктор шага. Собственно результатом работы программы являются фейлы шаговых конструкторов (возвраты из функций).

Как видишь, можно так повернуть, что никаких процедур и нет, только ресурсы и управление ими же.

arturpub ★★
()

это у языка такая фишка - каждый на ровном месте огород городит

да. Только я не очень понимаю, зачем тут твой огород на этом месте?

плюс отдельная функция, делающая free(s).

ты уж определись: если ты в C++, то это делает ::delete, скорее всего в деструкторе(виртуальном).

emulek ★
()
Ответ на: комментарий от batekman

Либо пиши на нормальном Си,

там нет классов.

это не баг, а фича.

либо используй возможности Си++ на полную катушку.

не дорос ещё.

в php есть классы.

тренироваться - ничуть.

ну если-бы это был-бы биатлон, то ты ехал на ушах, а потом стрелял попой.

emulek ★
()
Ответ на: комментарий от emulek

Только я не очень понимаю, зачем тут твой огород на этом месте?

я не очень освоился в языке и решил потренироваться, написав функцию-велосипед.

если ты в C++, то это делает ::delete, скорее всего в деструкторе(виртуальном).

спасибо - буду знать.

batekman ★★★
() автор топика
Ответ на: комментарий от emulek

в php есть классы.

в питоне тоже есть. но это всё скриптовые языки, а на Си линукс написан, на плюсах - Qt с кедами, вот и соблазнился.

ну если-бы это был-бы биатлон, то ты ехал на ушах, а потом стрелял попой.

мне бы за такое платину дали. за оригинальность и талант.

batekman ★★★
() автор топика

Серьёзно, если хочешь понять Си - пиши на Си. Вот и всё. Не на C++, не на Object-C, а на Си. Нет классов? Напиши классы. В чём проблема-то?

RisuX3 ★
()
Ответ на: комментарий от anonymous

А я никогда не понимал тех, кто путает руководства и справочники. Ну не заменит всеобъемлющий список всех ф-ций, методов, операторов и лексем базисных знаний. Это как пытаться выучить таблицу умножения без самой таблицы, зато имея все числа от 0 до 10 и знак умножения.

Выучить можно, но потраченных усилий это стоить не будет.

А вот потом, при наличии базиса, можно не париться и глядеть прямо в справочник/стандарт.

Pinkbyte ★★★★★
()

Кашмар какой, я про код.

robot12 ★★★★★
()

В таком формате длина даты будет равна 10 символам. Зачем все эти извращения с определением размера выделяемого буфера?

    time_t t = time(0);
    char *s = (char *)malloc(11);
    strftime(s, 11, "%Y-%m-%d", localtime(&t));
anonymous
()
Ответ на: комментарий от Pinkbyte

А вот потом, при наличии базиса, можно не париться и глядеть прямо в справочник/стандарт.

Базис к ЯП не привязан.

anonymous
()
Ответ на: комментарий от batekman

я не очень освоился в языке и решил потренироваться, написав функцию-велосипед.

зря ты её здесь запостил.

emulek ★
()
Ответ на: комментарий от batekman

в питоне тоже есть. но это всё скриптовые языки

какая разница?

ну если-бы это был-бы биатлон, то ты ехал на ушах, а потом стрелял попой.

мне бы за такое платину дали. за оригинальность и талант.

безусловно. Если-бы доехал и поразил мишень. Но увы...

emulek ★
()
Ответ на: комментарий от batekman

и по Java, и по плюсам. причём в обоих недалеко ушёл.

теперь ты знаешь, что учить одновременно два языка сразу нельзя.

emulek ★
()
Ответ на: комментарий от anonymous

time_t t = time(0);

char *s = (char *)malloc(11);

слушай, ты бы сам выучил хоть какой-то ЯП, прежде чем советы давать? У тебя первая строка на C++, вторая на PureC.

emulek ★
()
Ответ на: комментарий от anonymous

Если верхняя планка выше, но не хочется память разбазаривать, то можно и так:

char *s, *ret;
s = malloc(1024);
// делаем что-то с s
ret = strdup(s);
free(s);
return ret;

И все! И рыбку съели...

Eddy_Em ☆☆☆☆☆
()

понять Си

понять и простить Си =)

MikeDM ★★★★★
()
Ответ на: комментарий от anonymous

В таком формате длина даты будет равна 10 символам. Зачем все эти извращения с определением размера выделяемого буфера?

А потом из-за таких как ты придётся разворачивать масштабную кампанию по удалению Y10k багов.

anonymous
()

ТС упоролся. Его аватарка кстати очень даже символизирует. Именно таким может быть Си в руках некоторых людей.

flareguner ★
()
Последнее исправление: flareguner (всего исправлений: 1)

Ты - дурак. В Си все четко и понятно.

Dennis7 ★
()

Ты идиот, тотальная кусок говна. Ты нахреш кукарекаешь про си, если говнякаешь на говноплюсах? Ты реально идиот? Или ты решил либц называть Си? Ну дак пойми, что ты упоролся, а Си тут непричем.

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

Ну и да, это делается через буферы, не зря там передаётся размер буфера. О5 нулёвые дурачки взялись за сишку, уйди и не позрся.

anonymous
()
Ответ на: комментарий от batekman

streams так и вообще бесят, эзотерика какая-то.

Не, стрим довольно крутая штука by design, Но реализация меня самого бесит. Тот же форматный вывод, сделать его через printf на порядок проще и понятнее.

Dudraug ★★★★★
()
Ответ на: комментарий от anonymous

Единственный документ, который требуется прочитать, находится тут:

Ага, по стандарту язык учить. Толсто.

Dudraug ★★★★★
()
Ответ на: комментарий от anonymous

А потом я дорос. Только не до использования Си++, а до понимания, что чистого Си для моих задач полностью достаточно. Там, а где не хватает Си, есть языки типа питона.

Ну не сказал бы, в С++ есть boost. Конечно это тоже трэш и угар, зато мощный трэш и угар и никакой двойной трактовки на разных платформах и компиляторах.

Dudraug ★★★★★
()
Ответ на: комментарий от anonymous

А по чему еще, как не по стандарту? Или у тебя кал вместо мозга?

Ну-ну, просто так взять и с нуля по стандарту языку научиться. Толсто, иди отсюда.

Dudraug ★★★★★
()
5 апреля 2014 г.
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.