nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 19 Apr 2024 12:13



Reply to topic  [ 163 posts ]  Go to page Previous  1 ... 7, 8, 9, 10, 11
Какой язык программирования надо втюхивать в школе 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
imsushka wrote:
причем я тп использовал как компилятор асма.

Последний раз, когда я что-то писал на Паскале, я его тоже использовал, как компилятор асма. :wink:
Мне нужен был пример работы с ЖК дисплеем через ЛПТ-порт, ну и образец нашел на Паскале.

Посмотрел я, а там лишь графический экран открыли на Паскале... остальное почти всё на асме.
Захотелось мне в образец отсебятинки добавить, а Паскалю то так не нравится, то иначе... :-?

Плюнул я тогда на его придирки и написал всё в нём на асме вызовами ДОС АПИ.
А когда наигрался, то подумал:"ну можно сказать, что на ПАСКАЛЕ написал!" :ebiggrin:

_________________
iLavr


09 Feb 2023 11:07
Profile
Fanat

Joined: 01 Jan 2023 11:37
Posts: 80
Reply with quote
begin и end в паскале — это да, сомнительное решение. Но в целом, если воспринимать их как аналоги { } в Си, коими они и являются, нет в них ничего особенно плохо. Может и не идеально, но и не совсем плохо.

А вот в Basic сомнительной и вредной фигни гораздо больше, из-за чего серьёзные программисты на него даже не смотрят, да и начинающим он не подходит:

  • Отсутствие объявления переменных и странные умолчания — да, понимаю, наследие древних диалектов Фортрана где тип определялся по первой букве переменой, но всё-таки...
  • Очень странное объявление функций в QBasic (и наверное в Quick тоже, будем далее писать QB, имея ввиду оба), они скрываются из вида и нужно куда-то нажимать, чтобы на них посмотреть.
  • REM для комментариев. Если уж Begin/End ты считаешь недостатком, то REM куда хуже, поскольку комментарии нужны постоянно. В хорошем коде они могут быть вообще через строчку. В то время как операторные скобки встречаются не так часто.
  • Наследие восьмибитных бейсиков с gosub и goto. Может и не является недостатком именно QB, где есть и более современный синтаксис, но при поиске литературы по BASIC, начинающий программист скорее наткнётся на что-то где описан бейсик с номерами строк и вполне возможно так в QB и начнёт писать с лапшой из goto.

Тогда как Pascal хорош тем, причём именно для начинающих, что в нём писать в плохом стиле сложнее чем в хорошем. Например переменные объявлять вообще обязательно, метки тоже надо объявлять, благодаря чему соблазн устроить лапшу из goto меньше, begin/end позволяют лучше видеть структуру кода, разделение функций и процедур помогает избегать побочного эффекта в функциях и позволяет хотя бы понять, что это такое и так далее.

В дальнейшем, когда хороший стиль и мышление уже сформированы, можно переходитть на C или наоборот на какие-нибудь более далекие от железа языки вроде OCaml или Tcl.


10 Feb 2023 04:42
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Andnor wrote:
begin и end в паскале — это да, сомнительное решение. Но в целом, если воспринимать их как аналоги { } в Си, коими они и являются, нет в них ничего особенно плохо. Может и не идеально, но и не совсем плохо.

А вот в Basic сомнительной и вредной фигни гораздо больше, из-за чего серьёзные программисты на него даже не смотрят, да и начинающим он не подходит:
 Всё остальное...
    Quote:
  • Отсутствие объявления переменных и странные умолчания — да, понимаю, наследие древних диалектов Фортрана где тип определялся по первой букве переменой, но всё-таки...
  • Очень странное объявление функций в QBasic (и наверное в Quick тоже, будем далее писать QB, имея ввиду оба), они скрываются из вида и нужно куда-то нажимать, чтобы на них посмотреть.
  • REM для комментариев. Если уж Begin/End ты считаешь недостатком, то REM куда хуже, поскольку комментарии нужны постоянно. В хорошем коде они могут быть вообще через строчку. В то время как операторные скобки встречаются не так часто.
  • Наследие восьмибитных бейсиков с gosub и goto. Может и не является недостатком именно QB, где есть и более современный синтаксис, но при поиске литературы по BASIC, начинающий программист скорее наткнётся на что-то где описан бейсик с номерами строк и вполне возможно так в QB и начнёт писать с лапшой из goto.

  • Тогда как Pascal хорош тем, причём именно для начинающих, что в нём писать в плохом стиле сложнее чем в хорошем. Например переменные объявлять вообще обязательно, метки тоже надо объявлять, благодаря чему соблазн устроить лапшу из goto меньше, begin/end позволяют лучше видеть структуру кода, разделение функций и процедур помогает избегать побочного эффекта в функциях и позволяет хотя бы понять, что это такое и так далее.

    В дальнейшем, когда хороший стиль и мышление уже сформированы, можно переходитть на C или наоборот на какие-нибудь более далекие от железа языки вроде OCaml или Tcl.

Операторные скобки в ЯВУ не нужны как факт, иначе это не язык Высокого уровня, если вы помогаете компилятору.
ЯВУ отличается от языка низкого уровня тем, что приближен к естественному человеческому языку.
Но у вас мозг так проформатирован Паскалем, что вы этого понять на можете, к сожалению... :(

И мне очень странно, что совершенно не зная Basic, вы продолжаете писать здесь полный бред. :-?
REM - это атавизм, комментарий в Basic: " ' "

Если вы до такой глупости одурманены Паскалем, то хоть бы на картинки смотрели, которые вам показывают:

Image

Никаких REM-ов, как вы видите нет.
Переменные при необходимости объявляются - объявлен тип regs на картинке.
А goto есть и в Паскале, не справились вы без goto
Процедуры и функции определяются автоматически и редактируются в отдельных окнах, можно одновременно
смотреть и на вызов функции и на саму функцию.

Так что если вы не знаете Basic и валите общеизвестые глупости в одну кучу, я вам посоветовал
уже ознакомиться для начала с предметом обсуждения, а то тошнит читать и отвечать на ту бредятину,
которую вы здесь совершенно огульно пишете. :-?

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

А Паскаль гибкостью не отличается и содержит слишком много бредятины, совершенно не нужной
программисту, но лишь упрощающей его компилятор.
То есть на вас, как на осла, навьючили помощь компилятору в синтаксическом разборе текста программы.
Но вы гордо это называете "строгостью", потому как Паскалем вам безнадёжно испортили мозг. :(

Мои искренние сожаления... :oops:

_________________
iLavr


10 Feb 2023 13:53
Profile
Fanat

Joined: 01 Jan 2023 11:37
Posts: 80
Reply with quote
Хватит уже скриншоты кидать... Если уж хочешь поделиться, кидай файл исходника лучше. (и нет, мне не нужен, но посмотреть в принципе вид кода удобнее по тексту а не по скрину)

Quote:
Операторные скобки в ЯВУ не нужны как факт, иначе это не язык Высокого уровня, если вы помогаете компилятору.


Тем не менее, операторные скобки в том или ином виде есть почти во всех известных мне ЯВУ, в том числе скриптовых, в том числе бейсике, почему-то...

Паскаль: begin / end; repeat ... until condition;
Си: { };
bash: do ... done, if ... fi и тд, зависит от составного оператора
basic: for ... to ... step ... ... next var; if ... end if; и так далее
Python: отступы

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

Tcl — операторных скобок как таковых нет, { } используются как сильные кавычки, if expr {...} else {...} где { } объединяют фрагмент кода в одно слово. Если там операция из одной строки, то можно без них. Например объявлены процедуры do_then и do_else и переменная flag содержащая условие, тогда можно написать команду if $flag do_then else do_else на одной строке и это сработает.

Lisp — обычные скобки используются

Forth ­— как правило используются определения слов : word .. ;

Quote:
REM - это атавизм, комментарий в Basic: " ' "


А, ну да, но это сокращение для REM, так же как ? — сокращение для PRINT

Quote:
совершенно не зная Basic, вы продолжаете писать здесь полный бред


Я писал на этом QBasic программу для курсовой работы на первом курсе. На втором уже C и асм были. После этого писал на ZX Spectrum на нём несколько программ. Я его не то что не знаю, просто давно это было и подзабыл.

Quote:
Процедуры и функции определяются автоматически и редактируются в отдельных окнах, можно одновременно
смотреть и на вызов функции и на саму функцию.


Вот в почти любом текстовом редакторе есть split view чтобы одновременно смотреть в отдельных окнах на два куска кода, причём более универсально. А то что в QB это неотключаемо и нельзя файл полностью посмотреть за один заход — серьёзный недостаток. Впрочем, наверное можно писать код в нормальном текстовом редакторе, а потом запускать компилятор в отдельном окне консоли... Или отдельного консольного компилятора в комплекте нет?

Quote:
А Паскаль гибкостью не отличается и содержит слишком много бредятины, совершенно не нужной
программисту, но лишь упрощающей его компилятор.
То есть на вас, как на осла, навьючили помощь компилятору в синтаксическом разборе текста программы.
Но вы гордо это называете "строгостью", потому как Паскалем вам безнадёжно испортили мозг.


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

Цель начального обучения программированию — дать понимание того, как работает компьютер в принципе. Иными словами убрать из работы компьютера "магию", чтобы не было ощущения, что пользователю помогают добрые невидимые гномики, а было понятно, что там просто есть оперативная память, процессор и машинный код. И понятно это было именно на глубоком уровне, а не просто в общих чертах. Для чего нужно хотя бы примерно представлять, что делает компилятор и тд. Соответственно, если компилятор более простой и примитивный, понять как он работает проще.

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

А зачем Basic вообще непонятно. Ему нет места в последовательности Pascal → assembler → C, → всякие разные другие языки на выбор.

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

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

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


10 Feb 2023 23:07
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22543
Location: Silicon Valley
Reply with quote
> А зачем Basic вообще непонятно. Ему нет места в последовательности Pascal → assembler → C, → всякие разные другие языки на выбор.

В идеале последовательность должна выглядеть так С → С++ всё :roll:

Ну и асм иногда - когда надо совсем низко чото поглядеть (типо как я щас на работе вылавливаю невыровненные обращения к памяти в скомпилированной сишной проге под мипс)

_________________
:dj: https://mastodon.social/@Shaos


10 Feb 2023 23:15
Profile WWW
Fanat

Joined: 01 Jan 2023 11:37
Posts: 80
Reply with quote
Shaos, ну я же тебе перечислил, почему C для начального обучения не подходит. Ты вместо ответа заявил, "Нет подходит", а смысл-то какой?

Вот ещё статейка есть, почему не Си:
Attachment:
stolyarov_2010.pdf [245.35 KiB]
Downloaded 136 times


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


10 Feb 2023 23:50
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22543
Location: Silicon Valley
Reply with quote
Поверь мне - я первокурсникам универа преподавал голимый си в начале нулевых - шло на ура как первый язык :dj:

_________________
:dj: https://mastodon.social/@Shaos


10 Feb 2023 23:53
Profile WWW
Senior

Joined: 12 Jan 2023 07:26
Posts: 165
Reply with quote
Andnor wrote:
Я бы ещё понял если бы ты за Forth топил, например. Его между асмом и Си вставить можно, тоже низкоуровневый язык, но с совершенно другой парадигмой, а бейсик ничего нового тому кто уже знает паскаль, ассемблер и Си не даст..

Форт одновременно и "низкоуровневый" и сверхвысокоуровневый смотря с какой базовой точки зрения его рассматривать.
Броуди2
т.е. язык не имеющий фактически синтаксиса, кроме его построения исходя из использования семантики слов, как первоосновы и простейший цикл Repl трансляции входного потока слов для превращения их в исполняемый код с изрядной долей возможностей "произвольного" построения
"предложений" программы за счёт метарасширяемости.

Хотя да, Форт соотносят в большей степени к парадигме использования конкатенативных языков программирования concatenative.org

P.S. FORTH (Computer program language) ещё книги по Форт.


Last edited by forthuser on 11 Feb 2023 00:11, edited 2 times in total.



10 Feb 2023 23:59
Profile
Senior

Joined: 12 Jan 2023 07:26
Posts: 165
Reply with quote
Shaos wrote:
Поверь мне - я первокурсникам универа преподавал голимый си в начале нулевых - шло на ура как первый язык :dj:

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

P.S. Спросить не спросят, но понимание может и не состояться в базовой необходимости применения звёздочек, амперсандов ...
Си, конечно, хороший язык если его начинать изучать с правильных книг, как Шилда.
и иметь под рукой справочник-подсказку от Болски.


11 Feb 2023 00:05
Profile
Fanat

Joined: 01 Jan 2023 11:37
Posts: 80
Reply with quote
На C даже мне сложно писать до сих пор, хотя у меня есть кое-какой опыт. Вот кстати пример оправданного на мой взгляд применения goto. Писал код недавно, одну штуку хотел проверить:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
   long n;
   char *errptr;
   if (argc < 3) {
      goto error;
   }
   n = strtol(argv[1], &errptr, 0);
   if (*errptr != '\0') {
      goto error;
   }
   fwrite(argv[2], n, 1, stdout);
   return 0;
error:
   fprintf(stderr, "Output `length` bytes from `data` to stdout.\n");
   fprintf(stderr, "Usage: %s length data\n", argv[0]);
   return 1;
}


Просто указатели — это ещё ничего, а указатели на указатели уже ломают мозг. Хотя справиться можно, но надо напрягаться. А в C без указателей на каждом шагу вообще никуда. Как школьник по-твоему осилит указатели на указатели, или указатели на указатели на указатели, если ему даже обычные if и for — новая концепция? Ну!

Quote:
Поверь мне - я первокурсникам универа преподавал голимый си в начале нулевых - шло на ура как первый язык


После того как они изучили Pascal в школе, а не прямо с нуля.

Quote:
P.S. Спросить не спросят, но понимание может и не состояться в базовой необходимости применения звёздочек, амперсандов ...
Си, конечно, хороший язык если его начинать изучать с правильных книг, как Шилда.
и иметь под рукой справочник-подсказку от Болски.

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

Си и Паскаль вообще очень похожи, просто подход разный. Паскаль более строгий и чуть дальше от ассемблера, но при этом даёт доступ и к низкому уровню, позволяя свободно манипулировать, а в Си без этого доступа к низкому уровню даже простейшие программы не идут. Например strtol или (s)scanf требуют передать им адрес переменной, поскольку передачи параметров по ссылке в Си в принципе не предусмотрено. Да, указатели её с успехом заменяют, но может всё-таки не надо это втюхивать прямо с самых первых уроков информатики?


11 Feb 2023 00:18
Profile
Senior

Joined: 01 Jan 2022 04:34
Posts: 168
Location: USSR, Tashkent
Reply with quote
Andnor wrote:
На C даже мне сложно писать до сих пор, хотя у меня есть кое-какой опыт. Вот кстати пример оправданного на мой взгляд применения goto. Писал код недавно, одну штуку хотел проверить:



еее, а вот так не правильно ?
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
   long n;
   char *errptr;
   if (argc < 3) {
      goto error;
   }
   n = strtol(argv[1], &errptr, 0);
   if (*errptr != '\0') {
error:
       fprintf(stderr, "Output `length` bytes from `data` to stdout.\n");
       fprintf(stderr, "Usage: %s length data\n", argv[0]);
       return 1;
   }
   fwrite(argv[2], n, 1, stdout);
   return 0;

}


хотя и это не правильно можно было и без гото обойтись

вот оправданный гото
Code:
               if ( X.buf[B_CMD] == CMD_GET ) {
                  if ( Glob.Type == 0xFF ) {

                     goto sendserialerr;

                  }
                  if ( ( Glob.Type == TYPE_INA ) ||  ( Glob.Type == TYPE_INA8 ) ) {

                     Tmp.Addr = &regs;
                     Tmp.Addr += X.buf[B_DATA1] + X.buf[B_DATA1];
                     X.buf[B_DATA0] = *Tmp.Addr;
                     Tmp.Addr++;
                     X.buf[B_DATA1] = *Tmp.Addr;
                     X.buf[B_SIZE]  = B_HEADER + 2;
                     goto sendserial;

                  }
                  if ( Glob.Type == TYPE_OUTD ) {

                     X.buf[B_DATA0] = Glob.b & 0x0F;
                     goto sendserialone;

                  }
                  if ( Glob.Type & TYPE_OUTPUT ) {

                     X.buf[B_SIZE]  = B_HEADER + 3;

                     X.buf[B_DATA2] = Glob.b & 0x0C;
                     goto left0;
                  }
                  if ( Glob.Type == TYPE_INAD8 ) {

                     X.buf[B_SIZE]  = B_HEADER + 8;

                     X.buf[B_DATA4] = regs.ain.data[4];
                     X.buf[B_DATA5] = regs.ain.data[5];
                     X.buf[B_DATA6] = regs.ain.data[6];
                     X.buf[B_DATA7] = regs.ain.data[7];
                     regs.ain.data[4] = 0;
                     regs.ain.data[5] = 0;
                     regs.ain.data[6] = 0;
                     regs.ain.data[7] = 0;
                     goto left1;
                  }
                  if ( Glob.Type & TYPE_INPUT ) {

                     X.buf[B_SIZE]  = B_HEADER + 4;

                     left1:
                     X.buf[B_DATA2] = regs.ain.data[2];
                     X.buf[B_DATA3] = regs.ain.data[3];
                     regs.ain.data[2] = 0;
                     regs.ain.data[3] = 0;

                     left0:
                     X.buf[B_DATA0] = regs.ain.data[0];
                     X.buf[B_DATA1] = regs.ain.data[1];
                     regs.ain.data[0] = 0;
                     regs.ain.data[1] = 0;
                     goto sendserial;

                  }
                  goto sendserialno;

               }
// ---- PUT ----
               if ( X.buf[B_CMD] == CMD_PUT ) {

                  if ( Glob.Type == TYPE_OUTS ) {

                     Tmp.Addr = &regs.sero.data + X.buf[B_DATA1];
                     *Tmp.Addr = X.buf[B_DATA2];
                     Tmp.Addr++;
                     *Tmp.Addr = X.buf[B_DATA3];
                     Tmp.Addr++;
                     *Tmp.Addr = X.buf[B_DATA4];
                     Tmp.Addr++;
                     *Tmp.Addr = X.buf[B_DATA5];
                     regs.sero.count = regs.sero.maxbits;

                     goto sendserialok;

                  }

                  if ( Glob.Type & TYPE_OUTPUT ) {

                     Tmp.b.lo = X.Buf[B_DATA1];
                     portout();
                     goto sendserialok;

                  }
                  goto sendserialno;

               }
// ----
               if ( X.buf[B_CMD] == CMD_SETNUM ) {

                  Glob.Addr = X.buf[B_DATA1];
                  Tmp.Addr  = ADDR_MODUL_NUM;
                  Tmp.Dat  = X.buf[B_DATA1];
                  writerom();
                  goto sendserialok;

               }
               if ( X.buf[B_CMD] == CMD_GETTYPE ) {

                  X.buf[B_DATA0] = Glob.Type;
                  goto sendserialone;

               }
               if ( X.buf[B_CMD] == CMD_GETROM ) {

                  Tmp.Addr = X.buf[B_DATA1];
                  readrom();
                  X.buf[B_DATA0] = Tmp.Dat;
                  goto sendserialone;

               }
               if ( X.buf[B_CMD] == CMD_SETROM ) {

                  Tmp.Addr = X.buf[B_DATA1];
                  Tmp.Dat = X.buf[B_DATA2];
                  writerom();
                  goto sendserialok;

               }
 
               sendserialno:
               X.buf[B_DATA0] = '-';
               goto sendserialone;

               sendserialerr:
               X.buf[B_DATA0] = '!';
               goto sendserialone;

               sendserialok:
               X.buf[B_DATA0] = '+';

               sendserialone:
               X.buf[B_SIZE]  = B_HEADER + 1;

               sendserial:

               DISABLE_INT_RA3

               X.buf[B_PREFIX] = 0xA5;
               X.buf[B_ADDR]   = Glob.Addr;


11 Feb 2023 02:12
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Andnor wrote:
Хватит уже скриншоты кидать... Если уж хочешь поделиться, кидай файл исходника лучше. (и нет, мне не нужен, но посмотреть в принципе вид кода удобнее по тексту а не по скрину)
Я знаю, что не нужен, поэтому и ничего не кидаю. Поскольку после вашей фразы:
Andnor wrote:
Ну не QBasic же?! Нет ну серьёзно, это даже не компилятор, к тому же требует DOS для работы...
Я понял, что вы совершенно не в теме, и убеждать вас в чем-то бесполезно... :(

Но не надо мне "тыкать", я с вами водки не пил! :-?
Andnor wrote:
Quote:
Операторные скобки в ЯВУ не нужны как факт, иначе это не язык Высокого уровня, если вы помогаете компилятору.
Тем не менее, операторные скобки в том или ином виде есть почти во всех известных мне ЯВУ, в том числе скриптовых, в том числе бейсике, почему-то...
Паскаль: begin / end; repeat ... until condition;
Си: { };
bash: do ... done, if ... fi и тд, зависит от составного оператора
basic: for ... to ... step ... ... next var; if ... end if; и так далее
Python: отступы

Во всех языках, в том числе русском и английском, существует какой-то синтаксис так или иначе.
Языки высокого уровня, если они хотят такими называться, должны иметь синтаксис, близкий к естественному языку.
Я это объясняю вам уже в третий раз!
В Бейсике и Python-е операторные скобки неявные и близки к естественному языку.
Так что зря вы по своей паскалевской привычке влепили там " ; " - в Basic их нет.

Поэтому я и говорю, что язык с синтаксисом, близким к естественному человеку освоить гораздо проще.
По роду своей деятельности человек может быть совершенно не связан в жизни с программированием
и ЭВМ, поэтому знать устройство её каждому совершенно не обязательно!
Но уметь пользоваться на простом уровне - для многих профессий весьма полезно.
Языки высокого уровня для того и придумали, чтобы скрыть от пользователя аппаратные особенности ЭВМ.

Я тут приводил пример человека, который физик и всю жизнь работал на Фортране, при этом Фортран его
совершенно неплохо функционировал и на IBM 360, и на IBM PC - ему совершенно не было нужды знать
устройство этих железок, и уж тем более - понятие "байт". :wink:

_________________
iLavr


12 Feb 2023 06:36
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
imsushka wrote:
...а вот так не правильно ?
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
   long n;
   char *errptr;
   if (argc < 3) {
      goto error;
   }
   n = strtol(argv[1], &errptr, 0);
   if (*errptr != '\0') {
error:
       fprintf(stderr, "Output `length` bytes from `data` to stdout.\n");
       fprintf(stderr, "Usage: %s length data\n", argv[0]);
       return 1;
   }
   fwrite(argv[2], n, 1, stdout);
   return 0;

}

хотя и это не правильно можно было и без гото обойтись
вот оправданный гото

Меня всё время удивляют вот такие рассуждения" "правильный", "неправильный", "оправданный"...

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

Во времена Windows 95 ещё столкнулся я с явной ошибкой ОС, при всём кодировании по мануалам М$
у меня происходила утечка памяти и винил я в этом свои кривые руки тогда.
Ведь "Что хорошо для Windows - хорошо для всех!" - такой был лозунг тогда! :roll:

Но мне повезло тогда, помогли мне снисходительно по Интернету люди из одной софтверной фирмы,
потому что при написании кода я пользовался в том числе и их статьёй в открытом доступе.

Они объяснили мне, что да - есть такая ошибка в ОС Windows - она уже известна, поэтому они
рассказали, как ошибку обойти и прислали код одной dll из ОС Windows.

И вот тут-то я впервые был в полном шоке! :o
В коде этой dll было многократно, как в вашем примере:
Code:
...
      goto error;
...

Но в конце кода был комментарий автора кода с его именем и фамилией.
В переводе на русский комментарий звучал примерно так:
"Да, я знаю, что goto не самое красивое решение, но в данном случае так проще." :wink:

С тех пор я придерживаюсь правила:"Если это проще для Windows, то мне и совсем простительно!" :ebiggrin:

_________________
iLavr


12 Feb 2023 07:07
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 163 posts ]  Go to page Previous  1 ... 7, 8, 9, 10, 11

Who is online

Users browsing this forum: Bing [Bot] and 28 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.