LINUX.ORG.RU

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


21

16

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

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

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

Так не будет, естественно. Верни переменную. Надо вернуть структуру - верни структуру.

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

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

Кстати простой примерчик и вывод по памяти:

#include <stdio.h>

struct data {
    float f;
    int i;
};

struct data some( )
{
    struct data d;
    d.f = 0.10;
    d.i = 100;
    printf("struct ptr some:\t%p\n", &d);
    return d;
}

struct data print( struct data d )
{
    printf("struct ptr print:\t%p\n", &d);
    return d;
}

struct data another( struct data d )
{
    printf("struct ptr another:\t%p\n", &d);
    return d;
}


int main()
{
    another(print( some( ) ));
    return 0;
}

результат:

struct ptr some: 0x7fff2f213b90 struct ptr print: 0x7fff2f213b90 struct ptr another: 0x7fff2f213b90

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

блин

struct ptr some:	0x7fff2f213b90 
struct ptr print:	0x7fff2f213b90 
struct ptr another:	0x7fff2f213b90 
anonymous
()
Ответ на: комментарий от anonymous

struct ptr some: 0x7fff2f213b90 struct ptr print: 0x7fff2f213b90 struct ptr another: 0x7fff2f213b90

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

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

Это оптимизатор отработал. На самом деле, если ты отдашь структуру в функцию, которая ее изменит, то это будет уже копия.

void a( struct data d )
{
    d.f = 100;
    printf("struct ptr     a:\t%p\n", &d);
}

struct data another( struct data d )
{
    a(d);
    printf("struct ptr another:\t%p\n", &d);
    return d;
}
struct ptr some:	0x7fffbca4b330
struct ptr print:	0x7fffbca4b330
struct ptr     a:	0x7fffbca4b310 <- копия
struct ptr another:	0x7fffbca4b330

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

В си нет ссылок, в нём есть только явные указатели.

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

Следующий этап — узнать, что int может быть от 6 до 64 бит; char — от ~4 до 32; а long и long long могут быть одинаковыми!

Нет, следующий этап - писать код.

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

Талантлив, неудачник... Ты ушел слишком далеко в философию.

Послушай я тоже пишу много just for fun. Да, там я стараюсь делать код красивый, экспериментирую с новыми библиотеками, алгоритмами, десять раз могу перименовывать переменные, изощряюсь с комментариями, вылизываю дебаггинг и т. п. Но когда нужно выполнить задачу, то я использую проверенные методы и ориентируюсь на результат. Результат при этом должен быть четко ясен.

Петя - не неудачник. Просто цель затеи была заработать бабло. Не сделать качественный продукт, не написать идеальный код, не придумать идеальную архитектуру, а именно заработать бабло. И этого он не понял и начал заниматься перфекционизмом. А Вася - понял. И сделал ровно столько, сколько нужно было чтобы этого достичь. Поверь, у него продукт был не совсем поганый, иначе бы его (этот продукт) не покупали. Но Вася сумел правильно формулировать требования к продукту, выставить правильные стандарты качества и сфокусироваться на главном. Хотя с точки зрения качества кода его творение было далеко от совершенства. В этом мораль басни. Понимай задачу и выполняй ровно столько, сколько нужно для достижения результата. Это называется эффективностью.

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

я тут слышал одним ухом, что решения на с и спп в этих ваших европах запрещены в авиации и медицине

Интересно - если кто-то насрет кучу и скажет что это мармелад - ты ее схаваешь или подумаешь ?

anonymous
()

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

Уверен, что прочитал?

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

Потратить пол-года на изучение специализированного языка

Назови хотя бы один язык, который надо учить пол-года? Вообще, назови язык, который нельзя выучить за два дня.

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

Нельзя. Тебе понадобятся годы написания софта на этих языках, чтобы их выучить.

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: Learn C The Hard Way от ramon13666

Что вы находите в этом learn C the hard way? Ни о чем же.

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

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

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

Я легко освоил. Там же просто все.

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

Хочешь сказать, C или Java нельзя за два дня выучить? Ну ты, это, тормозной, что ли...

Муахахах. Так толсто, что даже смешно.

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

Я вот за год выучил 182 явы.

По 10 сигарет в день?

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

Муахахах. Так толсто, что даже смешно.

Да все тут и так знают, что ты тупой и толстый. Можешь не стараться.

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

Нельзя. Тебе понадобятся годы написания софта на этих языках, чтобы их выучить.

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

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

Да потому что программисты тебе уже говорили, что невозможно никакой ЯП выучить за такой короткий срок. Вот 2 года — нормально.

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

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

anonymous
()

Отвлеку от срача - думаю, документ будет небезынтересным для эмбеддеров. Его пиару послужил недавний фейл таёты, в прошивке у которой обнаружилось 11 000 глобальных переменных и прочие ништяки. «Гайдлайны разработки на Си для критических систем», составлены Ассоциацией надежнасти ПО в автомобильной промышленности.

http://caxapa.ru/thumbs/468328/misra-c-2004.pdf

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

уже обсасывали, и была высказана мысль, что если кто-то не может представить задачу, требующую 11 тыс. глоб. переменных - то это проблемы его фантазии, а если кто-то не может представить, как с пом. глоб. переменных оптимизируется «ембед-софт» - то это проблема его квалификации

yyk ★★★★★
()
Последнее исправление: yyk (всего исправлений: 1)
Ответ на: комментарий от prischeyadro

11 000 глобальных переменных

И что? Это же "embedded". Зачастую толпа глобальных переменных более оптимальна, чем глобальная структура.

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

Как минимум, стоит почитать и немного помедитировать над гайдлайнами и соображениями, которые за ними стоят.

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

Тем более, что этот код мог быть сгенерен из чего-то более высокоуровневого. Например, в embedded весьма популярны всякие генераторы state machines.

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

Тем более, что этот код мог быть сгенерен из чего-то более высокоуровневого.

Как что-то хорошее. Тут наоборот во все глаза смотреть надо, и не только за собой следить, чтобы имена переменных с чем-нибудь своим глобальным не пересеклись, но и не могли пересечься с чем-нибудь, что нагенерирует кодогенератор.

И да, если за глобальные переменные состояния FSM в морду не давать - за что же тогда давать?

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

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

Я просто не понял, к чему была твоя реплика. По существу есть что сказать?

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

Парни, можете объяснить, что эти злые люди хотят от меня? Как должен выглядеть switch в MISRA C?

Rule 15.0 (required): The MISRA C switch syntax shall be used.

The syntax for the switch statement in C is weak, allowing complex, unstructured behaviour. The following text describes the syntax for switch statements as defined by MISRA-C and is normative. This, and the associated rules, enforce a simple and consistent structure on to the switch statement.

The following syntax rules are additional to the C standard syntax rules. All syntax rules not defined below are as defined in the C standard.

switch-statement :
     switch (expression) {case-label-clause-list default-label-clause}

case-label-clause-list:
    case-label case-clause_opt
    case-label-clause-list case-label case-clause_opt

case-label:
    case constant-expression:

case-clause:
    statement-list_opt break ;
    { declaration-list_opt statement-list_opt break ; }

default-label-clause :
    default-label default-clause

default-label:
    default :

default-clause:
    case-clause

and

statement :
    /* labelled_statement removed */
    compound_statement
    expression_statement
    selection_statement
    iteration_statement
    /* jump_statement removed or just restricted to return depending on other rules */


The following terms are also used within the text of the rules:
switch label Either a case label or default label.
case clause The code between any two switch labels.
default clause The code between the default label and the end of the switch statement.
switch clause Either a case clause or a default clause.

A switch statement shall only contain switch labels and switch clauses, and no other code.

Any deviation from this normative text shall be considered a non-compliance if there are no other non-compliances with any other rule in section 15.

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

А читать ты не умеешь, да? break они хотят в каждом case, кроме default.

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

Можно. Синтаксис.

И семантику. И идиоматические практики. И всякие там ub и прочую дрянь. Языки - они все маленькие и простые.

anonymous
()
7 июля 2014 г.
Ответ на: комментарий от qulinxao


ты так тролил?
в С же (начиная с С89?) можно возвращать структуру by value/


не. я реально не знал. У меня почему-то не получалось...

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

ну можно было (оставляя в стороне by value return)

писать g(f(&r)); где

typedef r*(*RretR)(r*)

RretR g,f

т.е обычная реализация цепочечности ( прям как в js :) )

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.