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 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.