LINUX.ORG.RU

Switch - помогите осилить в C

 , , вкурить,


0

4

Читаю книгу по C. Дошел до Switch. А тут в книге такой говянный пример приведен по работе с данным циклом, что просто пипец.

Лор, пожалуйста приведите простой пример использования switch.

P.S если правильно понял, то при введеном значении, это значение прогоняется по всему листу switch case: и как только оно совпадает, то происходит действие вложенное в case n:


Ответ на: почему это быдлокодеров? от tiile

С чего это я быдлокодер?

Быдлокодер не понимает что лежит в основе используемых им инструментов. Ты тоже.

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

Ложь. Либо ты говоришь о заборостроительных университетах, либо в них преподают курс введения в программирования, где примеры дают на Си. Это не то же самое, что учить синтаксис Си.

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

Быдлокодер не понимает что лежит в основе используемых им инструментов. Ты тоже.

тогда уместнее ссылка на Кнута. А не на этот ваш LISP.

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

Разве

А что значит «понимать, что лежит в основе используемых интсрументов»?

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

Так и тут. Сел и изучил в достаточном объеме ЯП. Потом продолжаешь читать книги и стараться урвать с разных форумов/сайтов/конференций информацию по оптимизации алгоритмов.

Но вы правы. Я никогда не проходил основы и начальные стадии обучения программирования. Даже Pascal не видел...

tiile
() автор топика
Ответ на: комментарий от aedeph_

Ты опять всё перепутал, там ссылка на sicp, а не на lisp.

какая разница? яних*янипонял по любому.

drBatty ★★
()
Ответ на: Разве от tiile

Так и тут.

Тут вам не там.

Есть большая разница между тем как рубить дрова и как проектировать программы.

anonymous
()
Ответ на: Да какая разница? от mr_noone

Да какая разница?
Наличие мозгов обязательно в обоих случаях.

Да, вы правы. Он же себе ногу отпилит.

anonymous
()
Ответ на: Разве от tiile

Вот мне надо спилить дерево - я беру бензопилу и делаю это.

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

Сам факт того из чего состоит данный инструмент, его конструкция и прочее не влияет на качество.

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

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

Да и вообще, Си слишком сложен для первого ЯП, лучше что-нить попроще, вроде MIX (опять-таки, см Кнута), без ассемблера дао С понять невозможно.

drBatty ★★
()
Ответ на: Разве от tiile

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

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

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

Даже Pascal не видел...

И это очень хорошо.

+1

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

тогда уместнее ссылка на Кнута. А не на этот ваш лишп.

Заруби себе на носу, дружок: SICP — УЧЕБНИК ПО ПРОГРАММИРОВАНИЮ, а не книга по схеме. На чем выполнять задание - твое дело. Хоть на JavaScript-e (В интернете видел решения на C++/Scala/Ruby/Python/Clojure/Haskell). Прочитать Кнута топикстартеру тоже не помешает, но там материал не для его уровня.

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

Заруби себе на носу, дружок: SICP — УЧЕБНИК ПО ПРОГРАММИРОВАНИЮ, а не книга по схеме.

оно учебник по теории программирования, а не по практике. Практика там исключительно по лиспу, и ТСу будет только мешаться.

Прочитать Кнута топикстартеру тоже не помешает, но там материал не для его уровня.

да ладно, не так это и сложно на самом деле. За одно и знания в матане получит/освежит. Математика всяко полезнее ваших нелепых скобочек и смайликов.

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

SICP
оно учебник по теории программирования, а не по практике.

Нет, SICP - это именно практика. ЕЩЕ РАЗ, на чем ты там пишешь - неважно. Вон, сейчас вроде на питоне пишут.

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

Нет, SICP - это именно практика. ЕЩЕ РАЗ, на чем ты там пишешь - неважно.

ну давай схему на С том же... А то, как ты наверное понял, от этих ваших академических ЯП меня тошнит.

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

ну давай схему на С том же...

Вероятно имелось в виду «SICP на С»? Ну так вперед, на Питоне же переписали, чем Си хуже?

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

А то, как ты наверное понял, от этих ваших академических ЯП меня тошнит.

А то ты за деревьями леса не увидел?

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

SICP — УЧЕБНИК ПО ПРОГРАММИРОВАНИЮ

Есть мнение, что SICP — это не учебник по программированию, а учебник по управлению сложностью программ.

С другой стороны, есть мнение, что управление сложностью — это самый важный аспект программирования. =)

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

Вероятно имелось в виду «SICP на С»? Ну так вперед, на Питоне же переписали, чем Си хуже?

откуда мне знать? Так нету? Даже на JavaScript'е есть, а выходит На C не нужно? Может эта ваша SICP вообще не нужна?

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

Есть мнение, что SICP — это не учебник по программированию, а учебник по управлению сложностью программ.

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

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

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

Я и говорю: смотришь в книгу, видишь фигу.

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

Даже на JavaScript'е есть, а выходит На C не нужно? Может эта ваша SICP вообще не нужна?

Думаю ты найдешь много общего с dmfd.

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

ну давай схему на С том же... А то, как ты наверное понял, от этих ваших академических ЯП меня тошнит.

О, еще один юморист на сцене.

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

Мм, я видел sicp только с примерами на lisp, или я что-то не понял?

не понял. Мне тут предлагают почитать SICP, и попутно перевести все примеры на С, который я понимаю. Это у лисперов всегда так: не понятен лисп? Дык ведь он прямо переводится на С программой на лиспе! Это математически строго доказано!!! Я даже видео в интернетах кого-то, кто пытался переводить. Получилось нерабочая и нечитаемая НЁХ, потому-что это нужно только С-кодерам! Вот пусть они и допиливают.

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

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

Внезапно.

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

Да и вообще, Си слишком сложен для первого ЯП, лучше что-нить попроще, вроде MIX (опять-таки, см Кнута), без ассемблера дао С понять невозможно.

Си, не Си++ вполне ок для первого языка.

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

Ты все перепутал, лисп переводится на с программой на хацкел

в сортах говна не разбираюсь.

говно у тебя в голове, питерское быдло.

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

говно у тебя в голове, питерское быдло.

под «говном» ты подразумеваешь знание С? Тогда да, не спорю, есть немного. Оно мне полезнее этих ваших схем.

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

под «говном» ты подразумеваешь знание С?

Нет. Знание синтаксиса не может быть говном. Говно - это твоя узколобость, нетерпимость и фанатичность.

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

а это массив? да? ну посмотри повнимательней, сколько size_t занимает массив из 10 int'ов? На сколько я знаю, ровно 10*sizeof(int), а у тебя сколько? И да, расскажи-ка мне, как внутри твоей функции узнать номер посл. эл-та этого «массива»?

Про то, как понимать запись 5[a] я даже и спрашивать у тебя не стану...

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

И чо? Что сказать-то хотел, массивы в си остаются вполне массивами, но со своей спецификой. Массив в си не есть «что-то другое, не массив».

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

массивы в си остаются вполне массивами, но со своей спецификой.

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

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

Массивы в Си - это массивы, т.е. шматки памяти для размещения нужного количества элементов нужного типа. Помедитируй над:

#define SZ 5

typedef int int_arr_t[SZ];
typedef int *int_ptr_t;

...

int_arr_t arr1[SZ];
int_ptr_t arr2[SZ];

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

#define SZ 5

typedef int int_arr_t[SZ];

int f(int_arr_t *ptr_to_arr);

...

int arr1[SZ];
int arr2[SZ+1];

f(&arr1); /* ok */
f(&arr2); /* error */

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

Подумай над передачей явного указателя на массив и контролем со стороны компилятора над размером:

что тут думать? мне известен этот костыль. Только этот твой тип никакого отношения к массиву не имеет, это именно шматок памяти в 5 интов (и ИМЕННО 5!). Таким способом удобно объявлять «новые» типы данных, вроде 160и битных sha сумм. Вот даже вика пишет:

Массив — упорядоченный набор данных, для хранения данных одного типа, идентифицируемых с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа.

А у тебя тут не набор, а одна единица данных, это концептуально ближе к структуре, а вовсе не к массиву.

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

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

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

В С массив - это именно «упорядоченный набор данных, для хранения данных одного типа».

не совсем так. Да, когда ты пишешь int a[10];, то ты получаешь годный и правильный массив в 10 int'ов. Проблема лишь в том, что ты не можешь его _использовать_ как массив:
1. при передаче его внутрь функции, он становится обычным указателем внутри функции.
2. и даже при простом использовании, Внезапно оказывается, что операция X[Y] это всего лишь синтаксический сахар, и на самом деле трактуется как *(X+Y), в силу того, сложение массива с целым не имеет смысла, то он опять _преобразуется_ в самый обычный указатель, и при этом преобразовании необратимо теряется размер массива (потому компилятор никак не может среагировать на a[77]; и даже на -17[a])
3. единственное, как можно попробовать отличить массив от указателя - sizeof. Если мы ещё не успели превратить массив в указатель, то размер таки будет равен числу элементов на их размер. Тут правда невозможно отличить массив из одного эл-та от указателя.

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

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

int foo(int p[])
{
 return p[0];
}
помедитируй и ты, что покажет sizeof(p) внутри этой функции?

Но сам массив от этого не перестал быть массивом.

ну только лишь для тебя. Для компилятора это уже не массив.

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

Проблема лишь в том, что ты не можешь его _использовать_ как массив

Ага. Из-за конвертации в указатель на первый элемент. О том я и говорю. Извини, что стандарт новый - это единственный, что есть под рукой именно сейчас.

C11. 6.3.2.1/3

Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object

ну только лишь для тебя. Для компилятора это уже не массив.

В том месте, куда ты его передал, он для компилятора никогда массивом и не был, а всегда был указателем. Ну нет в С ссылок, как в С++. И нет передачи по значению для массивов. В результате почти вся работа с массивами осуществляется через указатели. Но сами индексные массивы в С есть.

An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. The element type shall be complete whenever the array type is specified. Array types are characterized by their element type and by the number of elements in the array. An array type is said to be derived from its element type, and if its element type is T , the array type is sometimes called ‘‘array of T ’’. The construction of an array type from an element type is called ‘‘array type derivation’’

На счет функций.

int foo(int p[])

Это полный эквивалент int foo(int *p); В чем ты легко можешь убедиться - и в том, и в другом случае ты можешь изменить p внутри функции(т.е. p в твоем коде - простой указатель, а не «что-то вроде константного»). int p[], указанный не в качестве параметра функции и без дальнейшей инициализации, не являлся бы кстати полным типом. А ты знаешь, что аргументами функции могут быть лишь полные типы. Ты просто не можешь передать массив в функцию - ты можешь передать или обычный указатель на тип элемента массива или указатель на массив.

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

В том месте, куда ты его передал, он для компилятора никогда массивом и не был, а всегда был указателем. Ну нет в С ссылок, как в С++. И нет передачи по значению для массивов. В результате почти вся работа с массивами осуществляется через указатели. Но сами индексные массивы в С есть.

угу. «есть». Можно выделить памяти под массив, но для использования у нас только указатель. О чём и речь.

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

Это полный эквивалент int foo(int *p); В чем ты легко можешь убедиться - и в том, и в другом случае ты можешь изменить p внутри функции(т.е. p в твоем коде - простой указатель, а не «что-то вроде константного»).

да? очень может быть и так. Как-то не задумывался над такими деталями.

Ты просто не можешь передать массив в функцию - ты можешь передать или обычный указатель на тип элемента массива или указатель на массив.

и чем в С указатель на массив отличается от указателя на указатель?

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

Спрашивали? Отвечаем. ;)

В теме «про пых» отписался. Возможно, что я неправильно поставил эксперимент, но в принципе, там ТС и так уже додумался... :)

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

и чем в С указатель на массив отличается от указателя на указатель?

++

Кстати. Ни разу не пробовал: интересно, будет ли gcc ругаться, если в функцию, требующую аргументом type***, передать type**?

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

будет ли gcc ругаться, если в функцию, требующую аргументом type***, передать type**?

warning выдаст

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

Кстати. Ни разу не пробовал: интересно, будет ли gcc ругаться, если в функцию, требующую аргументом type***, передать type**?

конечно будет. В крестах ещё и гемор с const добавляется.

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

Коренным образом они не отличаются от массивов в других языках. И, кстати, не так уж и много языков, в которых есть статические массивы. А вот динамических массивов в С нет - нужно делать самому(или брать готовые откуда-то), через указатели.

и чем в С указатель на массив отличается от указателя на указатель?

Это разные типы, я же показывал.

int (*)[N] /* указатель на массив из N элементов типа int  */
int *         /* указатель на int - к нему может быть преобразован любой массив из int'ов  */
int **      /* указатель на указатель - говорит сам за себя */
Вас просто смущают неявные преобразования и отсутствие возможности передать массив по значению, что возможно почти для всех(но не всех - функции тоже передаются через указатель) других типов. А это в языке просто для удобства использования - массив все-равно не имеет смысла передавать по значению, а для функции это было бы совсем странно. В современных языках вообще почти все передается по ссылке. Как правило, передачу по значению или оставляют только для встроенных примитивных типов, или вообще убирают.

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

Это разные типы, я же показывал.

типы разные, но разницы я не наблюдаю (кроме sizeof).

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

почему это «не имеет»? было-бы удобно передавать char[4] как int. а функци - да, я знаю. С ней ничего нельзя делать, кроме как взять её адрес...

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

Так разница в типе и заключается. По большому счету указатель - это дженерик-тип - он имеет одно и тоже представление для разных фактических типов. Премущества только в контроле со стороны компилятора и в адресной арифметике(которая учитывает тип указателя). А так, что void *, что int*, что int (*)[N] - все имеют одно и тоже представление - адрес.

было-бы удобно передавать char[4] как int.

Так и представляй - сишечка же. Только для начала убедись, что int у тебя действительно 4 байта ;)

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

А так, что void *, что int*, что int (*)[N] - все имеют одно и тоже представление - адрес.

ну наконец-то...

Так и представляй - сишечка же. Только для начала убедись, что int у тебя действительно 4 байта ;)

дык и представляю... куда деваться-то? структурами. Хотя часто по смыслу это таки никакая не структура, а именно массив.

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

Чего наконец-то? Ты не видешь смысла в различных типах для указателей? В различиях адресной арифметики? Типы разные и в этом суть.

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