LINUX.ORG.RU

Программирование на С


21

16

Здравствуйте мои дорогие любители погромирования. Прочитал K&R «Язык программирования Си». Теперь нужна книга, которая расскажет как правильно писать код на С, общепринятые приёмы и стандартные алгоритмы решения типичных задач. Цель: пишу быдлокод для МК и хочу повысить свой скилл.

Перемещено mono из talks

Ответ на: комментарий от Eddy_Em

скомпиль код с передачей структуры по указателю и этот .. и сравни. Будешь удивлен.

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

Пожалуйста, не позорьте имя Василиев, они этого не заслужили

shamaz
()
Ответ на: комментарий от Eddy_Em

Да запросто: в теле основной программы безо всяких маллоков объявляешь структуру, ее адрес передаешь в программу, которая эту структуру изменяет. Все ОК.

это страшно неудобный костыль. Не получится тогда результат одной функции сразу в другую пихать. простейший пример:

program test;

type TR = record
    a: integer;
    b: integer;
end;

function f: TR;
begin
    f.a:=2;
    f.b:=3;
end;

function g(r: TR): TR;
begin
    g.a:=r.a;
    g.b:=r.a+r.b;
end;

var
    r: TR;

begin
    r:=g(f);
    writeln(r.a,' ',r.b);
end.
dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от prischeyadro

Если тебе эту структуру еще потом где-то надо будет использовать вне тела функции, выделяющей под нее память, то без маллока не обойтись. Как это делают во всяких питонах — без понятия.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от dikiy
#include<stdio.h>

typedef struct{int a,b;}sex;

sex temp(void){
  return(sex){1,0};}

int main(){
  sex a=temp();
  printf("%d %d\n",a.a,a.b);}
$ gcc -std=c99 -Wall -Wextra -Wpedantic test.c -o test
$ ./test
1 0
anonymous
()
Ответ на: комментарий от shamaz

На одном МК 512к, на другом — 1М. У меня, похоже, наследие от пиков, когда реально приходилось тратить уйму времени на уменьшение размера кода, т.к. он тупо не лез в несчастные килобайты.

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

смысле так?
struct data some_call( )

да хотя бы так, да. Насколько я помню - сишка не хочет такое компилировать. Или уже научилась?

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

ну, у Техасов, например, в стандартной библиотеке аж три printf'а — обычный, «nofloat» (без плавающей точки) и минимальный (только целые с урезанными возможностями форматирования). Как раз для того, чтоб можно было выбрать меньший по размеру при необходимости.

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

спс. значит можно. А я почему-то в свое время натрахался несколько часов с этим.

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

с 89 года точно. может, и раньше. у K&R этого ещё не было, да.

alegz ★★★★
()

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от dikiy

Чем это неудобнее f(&r); g(&r);?

У Си, конечно, есть сложности с управлением памятью, но с такими примерами о них даже речи не идёт.

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

кто сказал? она спокойно передастся на стеке. а маленькие — могут даже и на регистрах.

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

Чем это неудобнее f(&r); g(&r);?

У Си, конечно, есть сложности с управлением памятью, но с такими примерами о них даже речи не идёт.

ну на то это и примеры, чтобы быть простыми. Я ж не помю уже конкретно своей проблемы. помню что трахался из-за этого ппц сколько.

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

Кстати Эдди, а есть какая стандартная либа для си, которая распространенные контейнеры умеет? ну вот чтоб оно взял и собралось как под линукс, так и под спарк, например? «вектор» там общий, дека, RBдерево, листы .. хотя листы это пара макросов всего.

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

Фиг ее знает: я же рукожопый быдлокодер, решаю только свои специфические задачки и не парюсь по поводу переносимости.

Подобные структуры (причем, переносимые) есть во всяких GSL'ях.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

причем тут gcc? Я, например, коды из книги Стивенса (UNP) в 90-далеком году компилил на интеловском и борландском :) fd_set это структура и она в некоторых примерах таки возвращается как результат функций.

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

причем тут gcc?

А я другими компиляторами не пользуюсь.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от shamaz

Лишено смысла: возвращать указатель нужно лишь если ты внутри функции память выделяешь (чтобы в случае ошибки вернуть NULL и другая функция могла легко проверить результат).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от dikiy

Пример примером, но в нём принципиален такой момент - при таком (императивном) подходе всё спокойно объявляется и создаётся на стеке, маллок даже близко там не нужен, сколь навороченными бы эти манипуляции не были. И с памятью поэтому там всё будет в порядке, она будет выделяться на стеке и освобождаться автоматически.

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

необязательно. Иногда удобно вернуть один из переданных указателей. man memcpy

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

И с памятью поэтому там всё будет в порядке, она будет выделяться на стеке и освобождаться автоматически.

дык стек-то убивается при выходе из функции. А результат надо дальше передавать.

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

а если я не хочу исходную структуру менять?

my_type* init_struct (my_type *s) {return s;}

:D

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

Там товарищ спрашивал как легко состыковать выход одной функции со входом другой вроде.

Типа foo (dest_op (obj1), obj2)); dest_op - деструктивная операция из типа obj в него же.

shamaz
()
Ответ на: комментарий от dikiy

Тогда my_type* init_struct (const my_type *s, my_type *res) {res->a = s->a+1; res->b = s->b; return res;}

shamaz
()
Ответ на: комментарий от dikiy

То, что функция возвращает, остаётся на стеке у вызывающей функции.

Это, конечно, не единственный подход, но другие подходы и надо разбирать на других примерах. )

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

То, что функция возвращает, остаётся на стеке у вызывающей функции.

так. вот отсюда попобробнее. Если я объявлю локальную переменную внутри функции а потом верну ссылку на нее, то разве эта переменная будет еще доступна?

dikiy ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.