LINUX.ORG.RU

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

 , , вкурить,


0

4

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

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

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


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

есть ли возможность поиска по треду?

для регистрантов в низу есть магическая кнопочка, не помню как называется. потом ctrl+F

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

Не понял выражения. Видимо, пока плохо знаком с контекстом общения на данном ресурсе.

Да и к тому же именно этот ресурс меня интересует из-за нескольких вещей, stackoverflow мне не нужен.

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

Задам тот же вопрос, что и анонимусу: есть ли возможность поиска по треду?

сложно найти кусок КОДА, да ещё и такого специфичного?

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

Что-то вроде показать удаленные сообщения. Таким образом все комменты будут на одной странице. Дальше можешь искать встроенным в браузер поисковиком, чаще всего по Ctrl+F.

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

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

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

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

сложно найти кусок КОДА, да ещё и такого специфичного?

Путём визуального просмотра 5-и страниц?

Я думал есть способы удобнее.

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

Я уже это нашёл, благодаря подсказке анонимуса.

Но к сожалению свой комментарий про Duff's device удалить уже не смог, так как на него есть ответы.

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

ну там еще hizel еще раньше про то же самое говорил.

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

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

мне лисперы всегда нравились своей упёртостью - тема-то про С, что вы тут свой лисп пихаете? И даже не просто про С, а про СИНТАКСИС С... Это как надо было упороться, что-бы этого не заметить? Есть в этой вашей SICP хоть слово про сишный синтаксис? Я не нашёл. С тем же успехом посоветуйте почитать ТСу «Войну и Мир», тоже хорошая книга, и _любой_ культурный человек её обязан был прочитать. И точно также она не в тему.

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

Ясно.

там вопрос ИМХО не по php, с последним и так всё ясно - память забирается, но не освобождается, хотя это указано явно. Это просто пример того, что некоторые реализации могут «немного» отличаться, просто в пхп это куда как заметнее.

Сейчас гляну. У меня тут как-раз неподалёку стерверок с bitrix на тестировании есть, там есть пыхпых и 5.3 и 5.4. Там по-пробую, авось чего и выкружится. :)

ИМХО мутная книжка, текста много, но там мало что для меня нового оказалось.

Угу.

Это не к Вам именно, так... Если вдруг кто прочитает...

Только ребята малость подзабыли (а кто по-моложе, так те и вообще не знали) одну простую, но очень важную вещь. Есть программисты-системщики (системотехники), которые лазят вглубь ОС, системных либ и прочую фигню такого рода. А есть — прикладники, которые используют туеву хучу фреймворков, которые позволяют «просто отправить почту» или «просто получить данные». Как? А кто его знает — вон, есть класс, у него метод и т.д. и т.п. Задача решена, а как именно — не особо важно.

Но подход прикладника к решению именно и чисто системных задач это самоубийство. У системщика зачастую нет пары-тройки лишних тактов. Или пары килобайт памяти. Так что, замыкания, теории (категорий, графов), лямбда исчисления и прочие несомненно нужные, важных и интересные вещи просто мимо. Его поляна это именно те «детали реализации», которые для прикладника являются «чёрным ящиком». Единственное что он может — абстрагироваться от простых типов данных, используя advanced (или, иногда, abstract) data types. Но и то — от задачи надо смотреть (вопрос — «а надо ли?» здесь крайне важен).

Я НЕ хочу сказать что более правы те или более правы другие. Это просто разные типы программистов. Не всем дано быть прикладниками, но и не всем дано (таких, к сожалению, ещё меньше) именно грамотными системщиками. Тут цена ошибки может быть крайне велика. Это не эксепшон, который обработали и хрен с ним. Это ошибка, которая ведёт к полному краху системы со всеми эксепшонами и прочими... жителями и обитателями.

К чему это я всё? А к тому, что собственно, чем и мил нам всем ЛОР, так это тем, что здесь мнения и тех и других имеют равный вес. :)))

mr_noone
()
Ответ на: Не-не-не... от mr_noone

Какие проблемы на рфылудде написать обмен по какому-то протоколу с устройством/на устройстве? Впрочем «я не могу» - удобная формулировка, лол.

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

Это ты упертый.

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

Тебе уже не один раз говорили, что SICP - не учебник по схеме.

Тебе уже не один раз говорили, что никто ТС не предлагал учить или программировать на лишпе.

Тебе уже не один раз говорили, что те кто рекомендуют SICP не не любят Си.

Но ты же упорот. Ты же слушаешь никого.

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

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

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

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

А что, уже можно на...

... AT91SAM7P256 использовать рфылудде?

Нет? Нельзя? :))) Ну так о чём мы тогда? Ваш персональный localhost мне не интересен. :)))

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

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

PS: Я не являюсь лиспером, основные языки, на которых я пишу - фортран и педон.

aedeph_ ★★
()
Ответ на: А что, уже можно на... от mr_noone

Про конкретную железку на скажу, но на арме рфылудд есть (любителям с, кстати, должен понравится геморрой по сборке кросскомпайлера).

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

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

ну фортран я «знаю», в смысле, писал лет 20+ на нём несложные программки. А вот язык «педон» - это для мну что-то новое... На ум только плохие ассоциации приходят... Я угадал?

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

Угу...

Про конкретную железку на скажу

Я вот то же не скажу. Про ARM и рфылудд я в курсе, но мне не столько «в общем и целом», сколько «уже вчера» надо. Я понимаю что возможно это и не здорово, но таковы реалии. Тестировать, точнее даже думать в эту сторону не буду.

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

слова были, аргументов не было.

аргументы чего? того что я не люблю лишп и программирую на си? ты совсем упоролся, быдлоид?

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

это я понял, но в итоге получилось:

if (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9)
{
  // произвести ещё одну бессмысленную операцию
}

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

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

Очень часто китайский код пишут тупые студенты, которые пришли учиться по неясным причинам. Потом такой код приходится долго вкуривать.

PS: писать не лень было? я-бы не осилил...

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 ★★
()
Ответ на: комментарий от ms-dos32

На то есть циклы, глупости пишешь

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

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

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

anonymous
()
Ответ на: Дык! Это же у него в оффтопе было! от mr_noone

re: Посему простительно

Дурачкам на заметку: быдлокод пишут все и везде.

   int need_crc = 1;

   if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))
   {
      if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
          (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
         need_crc = 0;
   }

   else /* critical */
   {
      if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
         need_crc = 0;
   }

   /* 'uLong' is defined as unsigned long, this means that on some systems it is
    * a 64 bit value.  crc32, however, returns 32 bits so the following cast is
    * safe.  'uInt' may be no more than 16 bits, so it is necessary to perform a
    * loop here.
    */
   if (need_crc && length > 0)

Это тоже простительно, хоть и не под оффтоп.

malbolge ★★
()
Ответ на: комментарий от 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 ★★
()
Ответ на: re: Посему простительно от malbolge

Это тоже простительно, хоть и не под оффтоп.

этот код похож скорее на какой-то багфикс. Вероятно изначально секции /* critical */ не было. А потом порешили, что crc тут не нужно вообще (возможно оно в другом месте теперь вычисляется). На C++ так я всегда начинаю класс писать с заготовки, которая полна бессмысленных затычек, многие там так и остаются. Ну и что?

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

коммент супер

Ура!!!

Сборная России фаворит чемпионата Европы. Нэт ты ваще Уася!! Европы =)

// Искренне рад. А, что значит быть фаворитом Европы?

tiile
() автор топика
Ответ на: комментарий от 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 ★★
()

Самый, пожалуй, огромный недостаток switch-case в C и других си-подобных языках это отсутствие условий. Как же здесь хочется упомянуть хаскель, где такое поведение реализовано с помощью «сторожей». Ритчи, покойся с миром, ты сделал что мог.

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