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

 
1 2 3 4 5 6 7
US Mishka #10.10.2008 22:56  @Non-conformist#10.10.2008 21:20
+
-
edit
 

Mishka

модератор
★★★

Non-conformist> У меня ХР СП3. Досовское окошко в русской ХР СП3 нашел в пуск/программы/стандартные/командная строка

Non-conformist> Открывается это окно уже с заголовком-копирайтом и строчкой
Non-conformist> С:\Documents and settings\имя_компа>мигающий курсор



Отлично. Если в нём запускать программку, то это окошко не закроется и ты будешь видеть результаты. Когда запускаешь из под TC, то открывается точно такое же окошко, но, как только программа выполнилась, окошко закрывается. Поэтому ты видишь мелькание.



Non-conformist> Если после ">" ввожу path, то пишет
Non-conformist> PATH=C:\Windows\system32;C:\Windows;C:Windows\system32\Wbem
Non-conformist> Типа три пути каких-то... ???

У тебя в пути отмечены три папки (можно сказать три пути) для поиска исполняемых файлов. Тут я задам вопрос — насколько ты знаком с терминологией — папки, файлы, исполняемые файлы?

Суть в том, что вся информация хранится в системе в виде файлов — это такой кусок инфы, которая система рассматривает как нечто целое. Файлы можно читать (как книгу или документ), писать (как книгу или документ) при помощи программ. А есть ещё исполняемые файлы — т.е. те, которые система может прочитать и выполнить. Последняя категория делится на несколько. В форточках тип файла определяется по расширению файла (имя файла состоит из двух частей — имени и расширения). К исполняемым, если говорить упрощённое, относяться
.exe
.com
.bat
(если кому-то охота повыступать про другие интерпретаторы и т.п., сразу говорю — в сад!).


Т.е. вот окошко доса запускается командой cmd.exe. Вот exe после точки и говорит системе, что это исполняемый файл. Программка, которая получается в результате компиляции TC тоже исполняемый файл.

Далее, если иметь очень много файлов в одном месте, то это неудобно. Для этой цели придумали папки. Папка может содержать не только файлы, но и другие папки. Получается рекурсия. Но как только ты стал создавать папки, то сразу начинается проблема — в какой папке искать файл? Проблема аналогичная тому, когда ты ищешь товарища Иванова. А улиц в городе много, а на каждой улице куча домов, в каждом доме куча квартир. И Ивановых может быть много. Какого ты имел ввиду? Вот тут и приходит на помощь полный почтовый адрес. Так же и с файлами — ты указываешь все папки, для того, чтобы до файла добраться. Поэтому у тебя в одной папке не могут быть два файла с одним и тем же именем, а в разных папках (даже, если это подпапки) — могут. Вот указание как добраться до файла и называют путём (path).

Скажем, тот же cmd.exe живёт в c:\windows\system32. Полное имя файла будет c:\windows\system32\cmd.exe — т.е., если пойти на диск C:, а на нём найти корневую папку (у неё всегда имя \), потом под ней найти папку windows, а в папке windows найти папку system32, то в последней ты увидишь файл cmd.exe.


Переменная среды — это объекты, которые содержат некоторые данные, доступные всем программам, которые в этой среде работают. Вот, запустил ты ДОС окно. И выдал команду path. Эта команда показала текущее значение переменно среды PATH. Её значение можно поменять.

set PATH=C:\Windows\system32;C:\Windows;C:Windows\system32\Wbem;C:\Program Files\TurboC\bin
или
path C:\Windows\system32;C:\Windows;C:Windows\system32\Wbem;C:\Program Files\TurboC\bin

Эта команда добавить в конец пути ещё один путь.

Для чего эта переменная нужна? Как я же сказал, всегда можно указать полное имя файла — c:\windows\system32\cmd.exe — но набирать очень много — затрахаешься. Гораздо приятнее набрать просто cmd.exe и, чтобы программа запустилась. Вот для этого и используется переменная среды PATH — она показывает все поддиректории, где надо поискать cmd.exe и выполнить. Полный порядок таков.

1. Ищем в текущей папке (там, где мы сейчас находимся — ты запустил ДОС окно и оно показало, что ты находишься в папке С:\Documents and settings\имя_компа — это и есть текущая папка. Если нашли, то выполняем.
2. Если не нашли, то берем строчки, которые в переменной PATH. Там первым стоит
C:\Windows\system32 (до точки с запятой). Ищем там, ага, нашли — выполняем.


Если прошли везде и не нашли, то выдаем сообщение о том, что не можем найти файл для исполнения.

Non-conformist> При введении команды path в виндовую строку, что расположена по адресу start/run, пишет, что винде не удалось найти path.

Туда ты должен был ввести cmd.

Non-conformist> Виноват, не понял. Команда path показывет путь к некоему файлу? Или перед этой командой надо ввести имя файла, к которому надо узнать путь? И вообще зачем нужно что-то менять? Значит ли это, что сейчас, с непрописанным путем чего-то куда-то, установленный мной Турбо работает неправильно?

Это там, где надо искать исполняемые файлы — смотри объяснение выше. И не обязательно это показывает, что ТС установлен не правильно.

Non-conformist> 1. Что такое переменная среды? Какой-то параметр настройки среды программирования, Турбо Си?

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

Non-conformist> 2. Зачем надо изменять ее значение? Имеется в виду пропись (изменение) пути к какому-то файлу Турбо?

Для того, чтобы можно было ввести просто имя файла для исполнения, а система бы его нашла сама. Альтернатива всегда писать полное имя файла. Но что-то мне подсказывает, что очень скоро ты согласишься с тем, что легче поменять PATH, чем каждый раз писать по 100 буквочек. :)

Non-conformist> 3. В каком окошке - досовском (командной строке по адресу пуск/программы/стандартные/командная строка)?

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

Non-conformist> 4. Что значит "в системе" - в винде, т.е. в строке start/run? Как ею пользоваться?

Это весь твой компьютер с операционной системой.

Non-conformist> Сильно подозреваю, что в обозримом будущем у меня будет стоять ОДИН компилятор - ТС2.01. Пользуюсь машиной я один, паролей не надо (если речь шла об этом). Что нужно сделать, чтобы поставить означенную среду раз и надолго, и работать с ней одной, читая книжку?

Ну, тогда можно пойти в Start/Settings/Control Panel/System/Advanced/Environment Variables/System variables и там поменять эту переменную.

Non-conformist> ***
Non-conformist> Виноват, конечно, за обилие "вопросов"... Можно ли что-нибудь сделать, чтобы этот топик не болтался вверху списка?

Наоборот, пусть болтается. :)
 3.0.33.0.3
UA Non-conformist #11.10.2008 20:14  @Mishka#10.10.2008 22:56
+
-
edit
 

Non-conformist

аксакал

Mishka> Отлично. Если в нём запускать программку, то это окошко не закроется и ты будешь видеть результаты. Когда запускаешь из под TC, то открывается точно такое же окошко, но, как только программа выполнилась, окошко закрывается. Поэтому ты видишь мелькание.

Заработала программа! Не знаю, наверное, потому что машина дома намного медленнее, чем на работе, но я успеваю разглядеть строчку sum=5 перед тем, как черное окошко захлопывается! Это, как ты и говоришь, если просто в Тотале кликать по свежеиспеченному мной екзешнику. Потом открыл (САМ открыл, до того, как прочитал твой ответ!!) командную строку через меню "Старт", ввел ПОЛНОЕ имя моего файла (с путём), кликнул - есть сумма! Хоть что-то уже начинает получаться...


Non-conformist>> Если после ">" ввожу path, то пишет
Non-conformist>> PATH=C:\Windows\system32;C:\Windows;C:Windows\system32\Wbem
Non-conformist>> Типа три пути каких-то... ???
Mishka> У тебя в пути отмечены три папки (можно сказать три пути) для поиска исполняемых файлов.

Понял. И пути эти содержатся в конфиг.сис? Значит, в этом файле нужно дописать четвертый путь - C:\TC (ТС я установил в корень С)? Правильно ли я понял, что переменная path объявлена в тексте этого файла?

Mishka> Вот, запустил ты ДОС окно. И выдал команду path. Эта команда показала текущее значение переменно среды PATH. Её значение можно поменять.
Mishka> set PATH=

Прописал путь! Теперь в cmd просто пишешь noname.exe, нажимаешь ентер - sum=5!!!

Non-conformist>> 1. Что такое переменная среды? Какой-то параметр настройки среды программирования, Турбо Си?
Mishka> Это не ТС, это доступно всем программам, которые работают в этой среде.

А в данном случае, эта среда - ДОС, т.е. как бы "комп в чистом виде"? Интересующая нас переменная в ней носит имя path. Чтобы изменить значение этой переменной, применяем команду set. Так? Тогда мне непонятно, почему система воспринимает ИМЯ переменной (слово path), КАК КОМАНДУ искать исполняемые файлы... Стало быть, переменную нельзя обозвать как попало, ее имя еще и командой может быть? Я тут слегка запутался... Или имя переменной и есть команда считать ее значение?

Non-conformist>> 2. Зачем надо изменять ее значение? Имеется в виду пропись (изменение) пути к какому-то файлу Турбо?
Mishka> Для того, чтобы можно было ввести просто имя файла для исполнения, а система бы его нашла сама.

Mishka> ... можно пойти в Start/Settings/Control Panel/System/Advanced/Environment Variables/System variables и там поменять эту переменную.

:) Большое спасибо! "Мы пойдем другим путем!" (С)


***
Вопросы:

1. Насчет пробелов - когда их наличие в тексте программы критично, когда - нет? Я имею в виду сам код, не комментарии.
2. Что такое
return 0
Возврат в начало программы? Т.е. программа будет работать и без этой строчки?
3. Существуют ли в компьютере аналоги портов МК? Насколько я понимаю, если код загружается в МК через СОМ или ЛПТ, то и светодиодами можно мигать, подключив их напрямую к каким-то ножкам этих разъемов? Само собой, через ключи, чтобы их не грузить? Меня интересует чистый принцип - понятное дело, ничего такого я пробовать не собираюсь. Или я неправильно понимаю этот момент?
Skype: a_schabanow  
UA Non-conformist #11.10.2008 20:26
+
-
edit
 

Non-conformist

аксакал

Только сейчас прочитал ортветы на предыдущей странице. Хоть и запоздало, но все равно спасибо, весьма доходчиво!

***
2_ГОГИ насчет Басика: да я не против, но... Я человек настроения - заинтересовала меня именно тема Си, хочу слегка вправить себе мозги по этой части. Никаких прикладных задач перед собой совершенно не ставлю... Но сделать бегущие огни на Си мне будет ГОРАЗДО приятнее, чем на Басике. Почему-то. :)
Skype: a_schabanow  
UA Non-conformist #11.10.2008 20:34
+
-
edit
 

Non-conformist

аксакал

А, вот еще что нашел в ридми по ТС:

"Убедитесь, что в вашем конфиг.сис есть строчка
FILES=20
..."

Ну, и дальше насчет путей написано, но о них я уже не спрашиваю. Что это за переменная? Как ее дописать в конфиг.сис?

config.sys
set config.sys .... ..... .....
.... .... .... FILES=20

:) ???
Skype: a_schabanow  
US Сергей-4030 #11.10.2008 20:43  @Non-conformist#11.10.2008 20:34
+
-
edit
 

Сергей-4030

исключающий третье
★★
Non-conformist> А, вот еще что нашел в ридми по ТС:
Non-conformist> "Убедитесь, что в вашем конфиг.сис есть строчка
Non-conformist> FILES=20
Non-conformist> ..."
Non-conformist> Ну, и дальше насчет путей написано, но о них я уже не спрашиваю. Что это за переменная? Как ее дописать в конфиг.сис?
Non-conformist> config.sys
Non-conformist> set config.sys .... ..... .....
Non-conformist> .... .... .... FILES=20
Non-conformist> :) ???

Если вы под XP - не грузитесь c конфигом. Это из тех времен, когда деревья были большими.
 3.0.33.0.3
EE Татарин #11.10.2008 20:50  @Non-conformist#11.10.2008 20:14
+
-
edit
 

Татарин

координатор
★★★★☆
Non-conformist> 1. Насчет пробелов - когда их наличие в тексте программы критично, когда - нет? Я имею в виду сам код, не комментарии.
Пробелов не может быть внутри операторов (например, строчка "а += 1"; не может быть записана как "а + = 1;", потому что "+=" - оператор). Остальное - вольному воля.

Non-conformist> 2. Что такое
Non-conformist> return 0
Non-conformist> Возврат в начало программы? Т.е. программа будет работать и без этой строчки?
В С существует понятие "функция" - кусок кода выполняемый отдельно, и способный возвращать из себя результат выполнения. Сама по себе программа с точки зрения компилятора С - это тоже функция (называется main), которая принимает параметры командной строки и возвращает как результат выполнения целое число.

Если у тебя написано int main(int argc, char **argv), это значит что ты обязываешься по выполнению своей программы вернуть из неё целое число (int). В этом смысле return 0; - обязательная строка, ты не можешь завершить функцию без возврата обещаного результата (раз уж написал int main() - будь любезен). КОмпилятор на это будет возмущаться.

Кстати говоря, это возвращаемое значение ты можешь потом узнать и использовать из ДОС.

Non-conformist> 3. Существуют ли в компьютере аналоги портов МК? Насколько я понимаю, если код загружается в МК через СОМ или ЛПТ, то и светодиодами можно мигать, подключив их напрямую к каким-то ножкам этих разъемов?
Наиболее близок - LPT. Порты 0x378 (LPT1), 0x278 (LPT2) - это восьмибитные порты, каждый бит которых соответсвует состоянию ноги от 2 до 9 на LPT-разъёме.
C COM-портом сложнее. Во-первых, напряжение там 12В, во-вторых, там всё далеко не так прозрачно.

Что тебе нужно иметь в виду: нормальная винда тебе может не дать возможностей для таких манипуляций. Прямой доступ к портам из винды (НТ, 2000, ХР) для тебя закрыт. В Виндовс 9х (если й тебя ещй есть такая экзотика) с этим попроще. Но тоже есть тонкости.

Non-conformist> Само собой, через ключи, чтобы их не грузить? Меня интересует чистый принцип - понятное дело, ничего такого я пробовать не собираюсь. Или я неправильно понимаю этот момент?
25-30мА на ногу, не более 150-200мА на порт можешь грузить и пробовать совершенно свободно, не рискуя ничем. Часто это очень помогает в наколенных конструкциях.

Да, ты правильно понимаешь этот момент. :) Проблема только в том, что РС за время своего развития учапал от природы очень далеко. LPT - это единственный рудимент, через который ты можешь напрямую поиграть с какими-то ногами снаружи.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  3.0.33.0.3
EE Татарин #11.10.2008 20:51  @Non-conformist#11.10.2008 20:34
+
-
edit
 

Татарин

координатор
★★★★☆
Non-conformist> Ну, и дальше насчет путей написано, но о них я уже не спрашиваю. Что это за переменная? Как ее дописать в конфиг.сис?
Эта строчка говорит о том, что ДОС может иметь не менее 20 (раз FILES=20) открытых файлов одновременно. Актуально это было лет 10-15 назад. :)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  3.0.33.0.3
US Mishka #11.10.2008 20:57  @Non-conformist#11.10.2008 20:14
+
-
edit
 

Mishka

модератор
★★★

Non-conformist> Заработала программа! Не знаю, наверное, потому что машина дома намного медленнее, чем на работе, но я успеваю разглядеть строчку sum=5 перед тем, как черное окошко захлопывается! Это, как ты и говоришь, если просто в Тотале кликать по свежеиспеченному мной екзешнику. Потом открыл (САМ открыл, до того, как прочитал твой ответ!!) командную строку через меню "Старт", ввел ПОЛНОЕ имя моего файла (с путём), кликнул - есть сумма! Хоть что-то уже начинает получаться...

Вот и хорошо. :) У более современных сред разработки это окошко запускается с аттрибутом, который говорит, чтобы оно не закрывалось после завершения задачи. Там обычно горит такая надпись: "Press any key to continue". Нажимаешь any key и окошко закрывается. :) Про этот аттрибут уже кто-то в теме выше упомянул.

Non-conformist> Понял. И пути эти содержатся в конфиг.сис? Значит, в этом файле нужно дописать четвертый путь - C:\TC (ТС я установил в корень С)? Правильно ли я понял, что переменная path объявлена в тексте этого файла?

Нет, так было в MS DOS и ранних форточках. Сейчас система хранит всё в реестре, соответственно надо там и править. Но править там напрямую ручками страшно — можешь завалить комп на раз. Поэтому это можно править используя в контрольной панели иконку система, или внутри открытого ДОС окна выдавая команду
set AA=pisets
Этой командой я установил значение переменной среды AA в pisets. Но оно действительно только для текущего ДОС окна. И нигде более не видно. Система переменных сред устроена иерархически. Первую среду имеет сама операционка. Операционка запускает другие программы, которым она среду создаёт — обычно путём копирования своей. Поэтому другой процесс (программа) может менять свою среду как ей взбредёт в голову без опаски повлиять на родителя. Аналогично, если другой процесс запускает ещё процесс, то всё повторяется. В нашем случае, Операционка запустила проводника и выдала ей копию среды, проводник запустил ДОС окно, ТурбоС (через начать-Программы и т.д.) и каждому выдал копию среды. ты в ДОС окне поменял путь (предположим) теперь в этом ДОС окне он другой, но ни операционка, ни проводник, ни ТУрбоС не знают об этом. Но, когда ты из ДОС окна запустишь свою программку, то ДОС окно сделает копию среды со своей (уже изменённой) для твоей программки. Поэтому твоя программка уже знает об изменения.

Чтобы посмотреть все переменный среды в ДОС окне — введи команду set без параметров. У тебя получится большой список. Скажем, у меня такой:
code text
  1. D:\>set
  2. ALLUSERSPROFILE=C:\Documents and Settings\All Users.WINDOWS
  3. APPDATA=C:\Documents and Settings\Evs\Application Data
  4. CLASSPATH=.;C:\Program Files\Java\jre1.6.0_03\lib\ext\QTJava.zip
  5. CommonProgramFiles=C:\Program Files\Common Files
  6. COMPUTERNAME=MISHA
  7. ComSpec=C:\WINDOWS\system32\cmd.exe
  8. CYGWIN=tty
  9. FP_NO_HOST_CHECK=NO
  10. HOMEDRIVE=C:
  11. HOMEPATH=\Documents and Settings\Evs
  12. INCLUDE=C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\include\
  13. LIB=C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Lib\
  14. LOGONSERVER=\\MISHA
  15. NUMBER_OF_PROCESSORS=1
  16. OS=Windows_NT
  17. Path=F:\oracle\product\10.2.0\client_1\bin;F:\oracle\product\10.2.0\db_1\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\S
  18. ystem32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel;C:\Program Files\SecureCRT;C:\PROGRA~1\ABSOLU~1;C:\Prog
  19. ram Files\Common Files\GTK\2.0\bin;C:\Program Files\OpenSSH\bin;C:\Program Files\Java\jdk1.5.0_06\bin;C:\MySQL\MySQL Ser
  20. ver 5.0\bin;C:\Program Files\QuickTime\QTSystem\;C:\Program Files\OpenVPN\bin;C:\Program Files\MKVtoolnix;C:\Program Fil
  21. es\MKVtoolnix;C:\Program Files\MKVtoolnix
  22. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
  23. PERL5LIB=F:\oracle\product\10.2.0\db_1\perl\5.8.3\lib\MSWin32-x86;F:\oracle\product\10.2.0\db_1\perl\5.8.3\lib;F:\oracle
  24. \product\10.2.0\db_1\perl\5.8.3\lib\MSWin32-x86;F:\oracle\product\10.2.0\db_1\perl\site\5.8.3;F:\oracle\product\10.2.0\d
  25. b_1\perl\site\5.8.3\lib;F:\oracle\product\10.2.0\db_1\sysman\admin\scripts;
  26. PROCESSOR_ARCHITECTURE=x86
  27. PROCESSOR_IDENTIFIER=x86 Family 15 Model 31 Stepping 0, AuthenticAMD
  28. PROCESSOR_LEVEL=15
  29. PROCESSOR_REVISION=1f00
  30. ProgramFiles=C:\Program Files
  31. PROMPT=$P$G
  32. QTJAVA=C:\Program Files\Java\jre1.6.0_03\lib\ext\QTJava.zip
  33. SESSIONNAME=Console
  34. SystemDrive=C:
  35. SystemRoot=C:\WINDOWS
  36. TEMP=C:\DOCUME~1\Evs\LOCALS~1\Temp
  37. TMP=C:\DOCUME~1\Evs\LOCALS~1\Temp
  38. USERDOMAIN=MISHA
  39. USERNAME=Evs
  40. USERPROFILE=C:\Documents and Settings\Evs
  41. VS71COMNTOOLS=C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\
  42. windir=C:\WINDOWS
  43.  
  44. D:\>

Все строки имеют вид — имя переменной=значение.

Значение всех переменных среды можно посмотреть

Non-conformist> Прописал путь! Теперь в cmd просто пишешь noname.exe, нажимаешь ентер - sum=5!!!

Есть лёгкий способ добавлять, а не прописывать заново:

code text
  1. set PATH=%PATH%;c:\my_programs



Non-conformist> А в данном случае, эта среда - ДОС, т.е. как бы "комп в чистом виде"? Интересующая нас переменная в ней носит имя path. Чтобы изменить значение этой переменной, применяем команду set. Так? Тогда мне непонятно, почему система воспринимает ИМЯ переменной (слово path), КАК КОМАНДУ искать исполняемые файлы... Стало быть, переменную нельзя обозвать как попало, ее имя еще и командой может быть? Я тут слегка запутался... Или имя переменной и есть команда считать ее значение?


Я немного объяснил выше как это работает. Среда — просто вместилеще для разных переменных. Есть известные имена — PATH одна из таких переменных. Имена их, по договорённости, зафиксированы и имеют определённый смысл — примерно как в жизни, когда здание обзывают почтой, то люди ожидают определённого смысла за этим словом. Но ты можешь заводить свои переменные. Скажем, ты у меня выше в примере видишь переменную INCLUDE — эта переменная понятно только компиляторам с языка С/С++. Остальные её не используют. А PATH понятна операционке и ты её использовать не обязан.

Non-conformist> :) Большое спасибо! "Мы пойдем другим путем!" (С)

Тут одна маленькая заковыка. :) Когда ты меняешь переменную среды через систему, то ОС рассылает сообщение всем программам об изменении среды. И они её перечитывают. К сожалению, ДОС окна этого не делают. Поэтому, не удивляйся, когда ты изменишь переменную, а старое ДОС окно не видит, а вновь запущенное — видит. Я в этом случае просто закрываю ДОС окна, которые были открыты до изменения (если этим окнам надо знать об изменениях) и запускаю новые.

Non-conformist> ***
Non-conformist> Вопросы:
Non-conformist> 1. Насчет пробелов - когда их наличие в тексте программы критично, когда - нет? Я имею в виду сам код, не комментарии.

Критично, когда "лексическая единица" меняет своё значение. Умные слова, но за ними ничего сложного. Например, когда ты используешь текстовую константу — "ааа ааа" и "а а а ааа" разные. Компилятор не имеет права изменять смысл константы — текстовая ничем не отличается от числовой. Я думаю, что ты бы сильно расстроился, если бы написав а=3, обнаружил, что вместо 3 компилятор приписал 5. Второе — ты объявил переменную summary — это одно слово, а sum mary — два. В С/С++ в тектсте программы пробел выступает обычно как разделитель. И правило таково, что много разделителей считаются за один. Поэтому люди используют пробелы для писания так, чтобы было удобно читать. Но тут ты вступаешь в шаткую полосу стиля писания. :)

Non-conformist> 2. Что такое
Non-conformist> return 0
Только с ;
В С есть процедуры, а есть функции. Процедуры что-то делают и завершаются. Им можно написать в точке возврата return; В конце можно не писать — компилятор сам знает, что всё, конец, дойдя до закрывающей }. А вот ф-ция что-то делает и ещё пытается передать назад значение. Какое значение определяется тем, как ф-ция определена (описана), и величиной за return — в моём случае, это 0, т.е. ф-ция main возвращает значение 0. В миру программистов для этой конктретной ф-ции это означает, что всё сработало хорошо. Различия в том, что я описал main как
code text
  1. int main( int argc, char* argv[ ] )

Это обозначает, что ф-ция возвращает значение типа целое, а имеет два аргумента. Аргументы у main тоже относяться к хорошо известным — количество параметров, которые ты передал, когда запустил твою программку, и массив самих аргументов.
Ты же описал ф-цию как
code text
  1. main( )


Это по сути значит такое (это для С++, для С немного другое):

code text
  1. void main( void )


Т.е. ничего не возвращать, никаких аргументов. Тут два отступления.
1. Для других ф-ций так не работает. Это только для main. Просто не всем людям надо что-то возвращать (хотя я это рассматриваю как плохой стиль), и не всем надо знать про те параметры, что были заданы при запуске программы.
2. Формально, в С/С++ нет процедур и ф-ций, а есть только ф-ции. Процедуры — это те ф-ции, которые возращают ничего. Но это чисто формализм.


Non-conformist> Возврат в начало программы? Т.е. программа будет работать и без этой строчки?

Нет, возврат из программы. с определённым значением.

Non-conformist> 3. Существуют ли в компьютере аналоги портов МК? Насколько я понимаю, если код загружается в МК через СОМ или ЛПТ, то и светодиодами можно мигать, подключив их напрямую к каким-то ножкам этих разъемов? Само собой, через ключи, чтобы их не грузить? Меня интересует чистый принцип - понятное дело, ничего такого я пробовать не собираюсь. Или я неправильно понимаю этот момент?

Конечно. :) МК — это слабая породия на настоящий компьютер. :F Щютка.
 3.0.33.0.3
UA Non-conformist #11.10.2008 21:50  @Татарин#11.10.2008 20:50
+
-
edit
 

Non-conformist

аксакал

Татарин> LPT - это единственный рудимент, через который ты можешь напрямую поиграть с какими-то ногами снаружи.

Понятно. Как аналог портов МК можно рассматривать лишь параллельный порт, в котором биты текут на ножки параллельными потоками, и можно каждый рассмотреть в отдельности в виде вспышки светодиода. Если эти самые потоки не слишком быстрые...

2_Mishka
Дописал путь через винду - теперь даже вновь открытое дос-окно запускает мой файл и отображает результат.


***
Вопрос:
Почему в тексте программы переменная с одним и тем же именем может иметь несколько значений? Не изменять свое значение, а именно объявляться несколько раз с разными значениями?

code text
  1. /* простые арифметические действия */
  2. #include <stdio.h>
  3. main(){
  4. int fst = 2, scnd = 3;
  5. int df,prd,qt,rm;
  6. df = fst - scnd;
  7. prd = fst * scnd;
  8. qt = fst / scnd;
  9. fst = 123;
  10. scnd = 17;
  11. rm = fst % scnd;
  12. /* rm - остаток от деления fst на scnd */
  13. printf("%d %d %d %d\n",df,prd,qt,rm);
Skype: a_schabanow  
RU HolyBoy #12.10.2008 00:31  @Non-conformist#11.10.2008 21:50
+
-
edit
 

HolyBoy

аксакал

Non-conformist> Почему в тексте программы переменная с одним и тем же именем может иметь несколько значений? Не изменять свое значение, а именно объявляться несколько раз с разными значениями?

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

С не любит небрежности. Тут что сделаешь, то и получишь. Может быть умный компилятор какой-нибудь и напоминает, что ты забыл проинициализировать какую-то переменную нужным значением, но я таких не встречал. Поэтому, возьми за правило: объявил переменную - присвоил сразу значение.
 
US avmich #12.10.2008 02:47  @Non-conformist#11.10.2008 21:50
+
-
edit
 

avmich

координатор

Non-conformist> Почему в тексте программы переменная с одним и тем же именем может иметь несколько значений? Не изменять свое значение, а именно объявляться несколько раз с разными значениями?

Объявляться не может - например, такой текст "int i = 0; int i = 0;" компилироваться не будет.
 3.0.33.0.3
EE Татарин #12.10.2008 03:14  @Non-conformist#11.10.2008 21:50
+
-
edit
 

Татарин

координатор
★★★★☆
Non-conformist> Почему в тексте программы переменная с одним и тем же именем может иметь несколько значений? Не изменять свое значение, а именно объявляться несколько раз с разными значениями?
В отцитированом тобою куске кода объявление для всех переменных одно, например, для fst:
int fst = 2;
строка же fst = 123, это просто присваивание.

Вообще говоря, С++ (не С!) допускает многократные объявления переменной в теле функции, но тебя это волновать не должно. Вряд ли какой-то микроконтроллерный проект для реализации потребует С++ со всеми его наворотами. :)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  3.0.33.0.3
US Mishka #12.10.2008 05:15  @Татарин#11.10.2008 20:50
+
-
edit
 

Mishka

модератор
★★★

Татарин> Наиболее близок - LPT. Порты 0x378 (LPT1), 0x278 (LPT2) - это восьмибитные порты, каждый бит которых соответсвует состоянию ноги от 2 до 9 на LPT-разъёме.
Татарин> C COM-портом сложнее. Во-первых, напряжение там 12В, во-вторых, там всё далеко не так прозрачно.

Хотя, для стандартного компа это верно, но замечу, что для этих компов существует куча плат, для которыхи или есть драйвера, или нет. :) И там можно играть как душе угодно в пределах правил ОС — в данном случае форточек. :)

Татарин> Что тебе нужно иметь в виду: нормальная винда тебе может не дать возможностей для таких манипуляций. Прямой доступ к портам из винды (НТ, 2000, ХР) для тебя закрыт. В Виндовс 9х (если й тебя ещй есть такая экзотика) с этим попроще. Но тоже есть тонкости.

Ну, есть правила, как работать напрямую с портами и оборудованием. Но сложные. :F MS мануал, описывающий API занимает около 3 томов по 3,000 страниц. Описания каждого вызова состояит на 80% чего не должна делать реализация этого API.

Татарин> 25-30мА на ногу, не более 150-200мА на порт можешь грузить и пробовать совершенно свободно, не рискуя ничем. Часто это очень помогает в наколенных конструкциях.

Зависит от плат. :) Для встроенных — это так.

Татарин> Да, ты правильно понимаешь этот момент. :) Проблема только в том, что РС за время своего развития учапал от природы очень далеко. LPT - это единственный рудимент, через который ты можешь напрямую поиграть с какими-то ногами снаружи.


Почему? Спроси Vale, он же с карточками и приборами играет...
 3.0.33.0.3
US Mishka #12.10.2008 05:58  @Non-conformist#11.10.2008 21:50
+
-
edit
 

Mishka

модератор
★★★

Non-conformist> Дописал путь через винду - теперь даже вновь открытое дос-окно запускает мой файл и отображает результат.

:) В принципе, это иногда считается не безопасным. Но об этом потом.

Non-conformist> ***
Non-conformist> Вопрос:
Non-conformist> Почему в тексте программы переменная с одним и тем же именем может иметь несколько значений? Не изменять свое значение, а именно объявляться несколько раз с разными значениями?

Давай вводить некоторые определения.

1. Мы говорим, что у нас программа фон Неймановская, если она выполняется последовательно, т.е. строчка за строчкой. Это важно для того, чтобы понять разницу между объявлением переменной, её возможными значениями, правилами изменений.

2. Объявление переменной — это введение имени с атрибутами. Атрибутов в С может быть несколько. Но сейчас нас волнует тип. Объявление типа переменной — это указание компилятору — хочу выделить кусок памяти по какому-то адресу (пусть компилятор это решает), а я буду использовать имя вместо адреса — удобнее для программиста. Но С не позволяет, грубо говоря, просто складывать груши и персики. Поэтому надо указывать тип имени — т.е. указание, что там будет храниться.

3. В С есть только один официальный способ изменить значение переменной — оператор присваивания. Это единственный операторов, ЕМНИП, который имеет побочное действие. Всё остальное выражается через него (даже семантика передачи параметров описывается через него).

Поэтому я прокомментирую код используя С++ коммертарии — // коментарий до конца строки.

code text
  1. /* простые арифметические действия */
  2. #include <stdio.h> // это ничто иное, как использование препроцессора. Про него потом.
  3. main(){ // описание ф-ции main. В чистом С это эквавалентно int main( void )
  4. // в С++ void main( void )
  5. // ещё тут же начало тела ф-ции -- {
  6. int fst = 2, scnd = 3; // вот это объявление двух переменных с инициализацией
  7. // из этого оператора компилятору понятно, что ты завёл две целые переменные и
  8. // присвоил им начальные значения. Для себя, если тебе нравится аналогии, оторви
  9. // два кусока бумажки и на одном  вверху ручкой напиши int fst и карандашом под
  10. // этим делом 2. А на второй ручкой int scnd  и карандашом 3.
  11.  
  12. int df,prd,qt,rm;
  13. // тут ты объявил 4 переменные, но не инициализировал их. Поэтому у них может
  14. // быть любое значение. В программистком сленге -- грязь (garbage). Разные компиляторы
  15. // реагируют на это по разному. Некоторые ничего не делают, некоторы обнуляют, а другие
  16. // присваивают специальные значения -- скажем у юниксистов принято использовать
  17. // шестнацатиричную константу для глобально инициализации памяти 0xdeadbeaf
  18.  
  19. // возьми 4 бумажки и ручкой напиши заголовки int df, int prd, int qt, int rm
  20. // карандашом ничего не пиши или накалякая каку.
  21.  
  22. // такое объявление (всех 6 переменных) имеет ещё один неявный аттрибут. Т.к.
  23. // они объявлены внутри ф-ции, то они видны только внутри её и размещаются на стеке,
  24. // а не в глобальной памяти. Поэтому они существуют только тогда, когда ф-ция
  25. // вызвана, и исчезнут, как только выйдет из ф-ции. Чтобы немного задурить тебе
  26. // голову, скажу, если рекурсивно вызывать ф-цию, то будут существовать
  27. // множественные объявления с разными значениями, но каждый экземпляр ф-ции
  28. // в рекурсии будет знать и работать только со своими переменными.
  29.  
  30. df = fst - scnd;
  31. // это уже вычисление, а не объявление. Берёшь бумажку с именем
  32. // fst и запоминаешь значение написаное карандашом, затем бумажку
  33. // scnd и вычитаешь это значение из запомненого. Результат надо записать
  34. // на бумажку df, предварительно стерев значение там. Именно так -- тебя не
  35. // волнует предыдущее значение. И порядок выполнения операторов именно таков.
  36. // новое значение -1.
  37.  
  38.  
  39. prd = fst * scnd;
  40. qt = fst / scnd;
  41.  
  42. // Проделай тоже самое и здесь. Заметь, что каждая бумажка как объявление
  43. // всегда одна, а вот значения могут меняться.
  44.  
  45. // новые значения 6 и 0.
  46.  
  47. fst = 123;
  48.  
  49. // здесь просто оператор присваивания, а не объявление. Сотри предыдущее
  50. // значение fst и напиши 123. Вот оно проявление фон Нейманоского определения
  51. // переменная одна, а значение сменилось. При этом вовсе не два значения, и не
  52. // не две переменные fst.
  53.  
  54. scnd = 17;
  55. // аналогично и здесь для переменной scnd
  56.  
  57. // новые значения у fst 123, а у scnd 17.
  58.  
  59. rm = fst % scnd;
  60. /* rm - остаток от деления fst на scnd */
  61. // Ага, вот тут первое настоящее значение лоя переменной rnd.
  62. // и, если ты аккуратно работаешь с бумажками, то у тебя уже будут
  63. // числа 123 и 17, для которых ты вычисляешь остаток 123 % 17, а
  64. // результат будет 4.
  65.  
  66. printf("%d %d %d %d\n",df,prd,qt,rm);
  67.  
  68. // Должно быть напечатано:
  69. // -1 6 0 4
  70. // интересно, я прав?

Надеюсь, что не окончательно запутал и заморочил голову. :)
 3.0.33.0.3
+
-
edit
 

Mishka

модератор
★★★

HolyBoy> С не любит небрежности. Тут что сделаешь, то и получишь. Может быть умный компилятор какой-нибудь и напоминает, что ты забыл проинициализировать какую-то переменную нужным значением, но я таких не встречал. Поэтому, возьми за правило: объявил переменную - присвоил сразу значение.

Практически все сейчас. Просто надо ставить уровень предупреждений соответствующий. Более того, большинство компиляторов отслеживают ветки исполнения — если в одной может использоваться неиницилизированное значение, то выдаётся предупреждение.
 3.0.33.0.3
US Mishka #12.10.2008 06:55  @Татарин#12.10.2008 03:14
+
-
edit
 

Mishka

модератор
★★★

Татарин> Вообще говоря, С++ (не С!) допускает многократные объявления переменной в теле функции, но тебя это волновать не должно. Вряд ли какой-то микроконтроллерный проект для реализации потребует С++ со всеми его наворотами. :)

Грядут изменения. Если уже не там. Я не смотрел последние стандарты С. :)

И, если быть строгим, то да, в теле ф-ции нет, но в единце компиляции — запросто. И при этом не в разных ф-циях, а как глобальное и локальное. :)
 3.0.33.0.3
RU HolyBoy #12.10.2008 09:31  @Татарин#12.10.2008 03:14
+
-
edit
 

HolyBoy

аксакал

Татарин> Вообще говоря, С++ (не С!) допускает многократные объявления переменной в теле функции,

Неправда.
В стандарте С99 допустимо объявление, скажем, в теле цикла, некой временной переменной.
code text
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4. int i=-99;
  5.  
  6. for (int i=0; i<10; i++)
  7.   printf ("%d ",i); //выведет числа от 0 до 9
  8.  
  9. printf ("\n"); // тут похоже глюк, т.к. \ (слеш) перед n не отображается.
  10.  
  11. printf ("i=%d", i); // выведет i=-99
  12.  
  13. return 0;
  14. }


Вот так.
 
EE Татарин #12.10.2008 20:21  @Mishka#12.10.2008 05:15
+
-
edit
 

Татарин

координатор
★★★★☆
Татарин>> Наиболее близок - LPT. Порты 0x378 (LPT1), 0x278 (LPT2) - это восьмибитные порты, каждый бит которых соответсвует состоянию ноги от 2 до 9 на LPT-разъёме.
Татарин>> C COM-портом сложнее. Во-первых, напряжение там 12В, во-вторых, там всё далеко не так прозрачно.
Mishka> Хотя, для стандартного компа это верно, но замечу, что для этих компов существует куча плат, для которыхи или есть драйвера, или нет. :) И там можно играть как душе угодно в пределах правил ОС — в данном случае форточек. :)
АПИ ОС его, как я понял не интересует - в контексте МК это неважно.

Mishka> Ну, есть правила, как работать напрямую с портами и оборудованием. Но сложные. :F MS мануал, описывающий API занимает около 3 томов по 3,000 страниц. Описания каждого вызова состояит на 80% чего не должна делать реализация этого API.
Да знаю я, я по физике имел дело с железом. Так получается, что если нет драйверов, то с виндой связываться - себе дороже.

Татарин>> 25-30мА на ногу, не более 150-200мА на порт можешь грузить и пробовать совершенно свободно, не рискуя ничем. Часто это очень помогает в наколенных конструкциях.
Mishka> Зависит от плат. :) Для встроенных — это так.
Ну и для встроеных может отличаться. :) Это я с некоторым запасом.

Татарин>> Да, ты правильно понимаешь этот момент. :) Проблема только в том, что РС за время своего развития учапал от природы очень далеко. LPT - это единственный рудимент, через который ты можешь напрямую поиграть с какими-то ногами снаружи.
Mishka> Почему? Спроси Vale, он же с карточками и приборами играет...
Потому что всё остальное - нестандартно и нужно покупать за отдельные деньги. А LPT именно имеет вид порта МК: что туда вывел, то там и висит.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  3.0.33.0.3
EE Татарин #12.10.2008 20:24  @Mishka#12.10.2008 06:55
+
-
edit
 

Татарин

координатор
★★★★☆
Татарин>> Вообще говоря, С++ (не С!) допускает многократные объявления переменной в теле функции, но тебя это волновать не должно. Вряд ли какой-то микроконтроллерный проект для реализации потребует С++ со всеми его наворотами. :)
Mishka> Грядут изменения. Если уже не там. Я не смотрел последние стандарты С. :)
С-компиляторы для МК не обязаны поддерживать последние стандарты С. Они и не поддерживают. :)
То есть, заранее прочитать С-1999 и сказать, на что наткнёшься и с чем придётся работать - ИМХО, нельзя.

Mishka> И, если быть строгим, то да, в теле ф-ции нет, но в единце компиляции — запросто. И при этом не в разных ф-циях, а как глобальное и локальное. :)
:)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  3.0.33.0.3
US Mishka #12.10.2008 20:27  @Татарин#12.10.2008 20:21
+
-
edit
 

Mishka

модератор
★★★

Татарин> Потому что всё остальное - нестандартно и нужно покупать за отдельные деньги. А LPT именно имеет вид порта МК: что туда вывел, то там и висит.

Для современных мам это уже не правда. Нет на них LPT и COM — всё заменилось на USB, 1394 и сеть (Ethernet, WiFi, etc). :)
 3.0.33.0.3
US Mishka #12.10.2008 20:30  @Татарин#12.10.2008 20:24
+
-
edit
 

Mishka

модератор
★★★

Татарин> С-компиляторы для МК не обязаны поддерживать последние стандарты С. Они и не поддерживают. :)

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

Татарин> То есть, заранее прочитать С-1999 и сказать, на что наткнёшься и с чем придётся работать - ИМХО, нельзя.

С99 уже устарел. Они хотел в следующем накрутить такого... В общем, чтобы уйти по дальше от С++. За что были очень сильно раскритикованы. Война, одним словом. Но тут я уже не слежу за ними постоянно. :)
 3.0.33.0.3
UA Non-conformist #12.10.2008 20:49
+
-
edit
 

Non-conformist

аксакал

Здравствуйте. Такая вот программка:

code text
  1. /* простые арифметические действия */
  2.  
  3. #include <stdio.h>
  4.  
  5. main()
  6.  
  7. {
  8.  
  9. int fst = 2, scnd = 3;
  10. int df,prd,qt,rm;
  11.  
  12. df = fst - scnd;
  13. prd = fst * scnd;
  14. qt = fst / scnd;
  15.  
  16. fst = 123;
  17. scnd = 17;
  18.  
  19. rm = fst % scnd;
  20.  
  21. printf("%d %d %d %d\n",df,prd,qt,rm);
  22.  
  23. }


В книжке автор предлагает определить, при каком значении переменных fst, scnd программа еще выдает правильный результат при умножении, и догадаться, сколько бит в переменной типа int. Я определил, что самое большее значение, которое может принимать переменная prd = 32761 (181 x 181). Результат 181 x 182 уже отображается неправильно (какое-то неправильное отрицательное число). В двоичном виде 181 будет выглядеть как 10110101. Т.е. восемь бит много, а семь - мало... Или автор имел в виду переменную prd, куда записывается результат умножения? Но и тут - пятнадцать бит мало (32467), а шестнадцать - уже много... ???

И еще вопрос: можно ли где-нибудь посмотреть список английских слов (как я понимаю, большей частью - глаголов), от которых произошли мнемонические аббревиатуры команд ДОС, да и того же Си?

***
Большое спасибо всем за разъяснения по поводу переменных.
Skype: a_schabanow  
RU HolyBoy #12.10.2008 22:44  @Non-conformist#12.10.2008 20:49
+
-
edit
 

HolyBoy

аксакал

Non-conformist> Здравствуйте. Такая вот программка:
Non-conformist> В книжке автор предлагает определить, при каком значении переменных fst, scnd программа еще выдает правильный результат при умножении, и догадаться, сколько бит в переменной типа int. Я определил, что самое большее значение, которое может принимать переменная prd = 32761 (181 x 181). Результат 181 x 182 уже отображается неправильно (какое-то неправильное отрицательное число).

Если бы я не знал о существовании операции sizeof(), и не мог бы определить для простого типа его размерность, то пользовался бы двоичным поиском:

code text
  1.  
  2. int i;
  3.  
  4. i=111111111111;
  5. printf ("%d",i);
  6.  


1. Если выдаст на печать неверный результат, то уменьшал бы число в 2 раза, до тех пор, пока не выдаст правильный результат.
2. Диапазон между первым правильным и последним неправильным числом поделил бы пополам и проверил бы эту середину.
3. В зависимости от результата, он бы стал или граничным правильным или граничным неправильным числом и снова шаг 2.
4. Шаги 2-3 повторять до тех пор, пока не останется одно число. Оно и будет искомой границей типа.

Для такого типа задач двоичный поиск подходит идеально. :)

ЗЫ Ну и, разумеется, я бы это делал в цикле. :)
 
US Mishka #13.10.2008 01:01  @Non-conformist#12.10.2008 20:49
+
-
edit
 

Mishka

модератор
★★★

Non-conformist> Здравствуйте. Такая вот программка:
Non-conformist> В книжке автор предлагает определить, при каком значении переменных fst, scnd программа еще выдает правильный результат при умножении, и догадаться, сколько бит в переменной типа int. Я определил, что самое большее значение, которое может принимать переменная prd = 32761 (181 x 181).


Степень двойкиЧисло
-0
01
12
24
38
416
532
664
7128
8256
9512
101,024
112,048
124,096
138,192
1416,384
1532,768
1665,536
17131,072
18262,144
19524,288
201,048,576
212,097,152
224,194,304
238,388,608
2416,777,216
2533,554,432
2667,108,864
27134,217,728
28268,435,456
29536,870,912
301,073,741,824
312,147,483,648
324,294,967,296
48281,474,976,710,656
6418,446,744,073,709,551,616


Это показатели степеней двойки. Машины, на данный момент, используют двоичную систему. Это одна из систем счисления с положительной фиксированной базой. :) Для таки систем основание системы всегда записывается как 10. И в ней столько цифр, сколько сказано в самой системе, начиная с 0. В десятичной системе их 10 - 0-9. В двоичной системе — 0 и 1. Далее позиция цифры в числе определяет его вес. Например,

9705 в десятичной системе по школьной программе есть не что иное, как 9*103 + 7*102 + 0*101 + 5*100.
Для двоичной системы аналогино (как и для троичной, восмеричной или шестнадцатеричной — последние две системы хороши тем, что они просто переводятся друг в друга и в двоичную). Поэтому двоичное число
1101101 будет 1*26 + 1*25 + 0*24 + 1*23 + 0*22 + 1*20 = 64 + 32 + 0 + 8 + 4 + 0 + 1 = 109.

Из этой таблицы надо выделить 10, 20, 30 степени, т.к. они примерно равны 103, 106, 109. Т.е. каждые 10 двоичных разрядов примерно равны 1000 (кило), 1000000 (мега), 1000000000 (гига). Тут, кстати лежит источник противоречий между производителям HDD и программистами. Скажем, железячники меряют часто в десятичных кило, мега и гига, а программисты в программистких (степенях двойки). Чтобы различать используют большие и маленькие буквы (ещё, есть байты и биты — обычно бит — это двоичный разряд, а Байт — это совокупность битов; обычно, в современных машинах Байт — это 8 битов).
1 кБ — это 1,000 Байтов.
1 КБ — 1,024 Байта.
1 мБ — 1,000,000 Байт.
1 МБ — 1,048,576 Байт.
1 КБ эквивалентен 8 * 1 Кб (Кило бит) = 8,196 бит.


Другие числа, которые надо запомнить это степени 8, 16, 32 и 64 — это разрядности современных машин. Вот как они связаны с максимальным представлением числа:
Если машина 16 разрядная (или представление целого 16 разрядное), то там разрядов ровно 16, значит максимальная степень двойки 15 (помни, что начинаем с 0). Поэтому, 1111 1111 1111 1111 число максимальное безнаковое целое, которое влезает в 16 разрядов. Если к нему добавить 1, то получиться число 1 0000 00000 0000 0000 — которое уже не вмещается, но даёт идею — это есть 216, и на 1 больше максимально представимого. Т.е. для 16 разрядов максимальное число равно 216-1. Вот так просто. Теперь, если мы говорим про знаковое, то один разряд отдаётся под знак (о комплементарной арифметике мы можем поговорить потом, если будет интересно), поэтому остаётся 15 разрядов. Исходя из приведённого выше, максимальное знаковое число в 16 разрядах будет 215-1=32,768-1=32,767. :)

Число 248 я привёл просто потому, что это ethernet address. А вот 2128 я приводить не стал, хотя это то, как представляется IPv6 — новые инетовские адреса в IP протоколе версии 6. Но это будет около 1039.

Non-conformist> Результат 181 x 182 уже отображается неправильно (какое-то неправильное отрицательное число). В двоичном виде 181 будет выглядеть как 10110101. Т.е. восемь бит много, а семь - мало... Или автор имел в виду переменную prd, куда записывается результат умножения? Но и тут - пятнадцать бит мало (32467), а шестнадцать - уже много... ???
Смотри выше. :)

Non-conformist> И еще вопрос: можно ли где-нибудь посмотреть список английских слов (как я понимаю, большей частью - глаголов), от которых произошли мнемонические аббревиатуры команд ДОС, да и того же Си?

Ты спрашивай, а мы ответим. :)

AArp
Assoc
At
Atmadm
Attrib
BBatch files
Bootcfg
Break
CCacls
Call
Change
Chcp
Chdir
Chkdsk
Chkntfs
Cipher
Cls
Cmd
Cmstp
Color
Command shell overview
Comp
Compact
Convert
Copy
Cprofile
CScript overview
DDate
Defrag
Del
Dir
Diskcomp
Diskcopy
DiskPart
Doskey
Driverquery
EEcho
Endlocal
Eventcreate
Eventquery
Eventtriggers
Evntcmd
Exit
Expand
FFc
Filter commands
Find
Findstr
Finger
Flattemp
For
Format
Fsutil
Ftp
Ftp subcommands
Ftype
GGetmac
Goto
Gpresult
Gpupdate
Graftabl
HHelp
Helpctr
Hostname
IIf
Ipconfig
Ipseccmd
Ipxroute
Irftp
LLabel
Lodctr
Logman
Lpq
Lpr
MMacfile
Mkdir (md)
Mmc
Mode
More
Mountvol
Move
MS-DOS subsystem configuration commands
Msiexec
Msinfo32
NNbtstat
Net services overview
Net services commands
Netsh command overview
Netsh commands for AAAA
Netsh commands for DHCP
Netsh diagnostic (diag) commands
Netsh commands for Interface IP
Netsh commands for RAS
Netsh commands for Routing
Netsh commands for WINS
Netstat
Nslookup
Nslookup subcommands
Ntbackup
Ntcmdprompt
Ntsd
OOpenfiles
PPagefileconfig
Path
Pathping
Pause
Pbadmin
Pentnt
Perfmon
Ping
Popd
Print
Prncnfg
Prndrvr
Prnjobs
Prnmngr
Prnport
Prnqctl
Prompt
Pushd
QQuery
RRasdial
Rcp
Recover
Redirection operators
Reg
Regsvr32
Relog
Rem
Rename
Replace
Reset session
Rexec
Rmdir
Route
Rsh
Rsm
Runas
SSc
Schtasks
Secedit
Set
Setlocal
Shift
Shutdown
Sort
Start
Subst
Systeminfo
System File Checker (sfc)
TTaskkill
Tasklist
Tcmsetup
TCP/IP utilities and services
Telnet commands
Terminal Services commands
Tftp
Time
Title
Tracerpt
Tracert
Tree
Type
Typeperf
UUnlodctr
VVer
Verify
Vol
Vssadmin
WW32tm —
Winnt — Windows NT
Winnt32 — Windows NT 32
WMIC — Windows Management Instrumentation Command
XXcopy — eXtra copy —


Non-conformist> ***
Non-conformist> Большое спасибо всем за разъяснения по поводу переменных.
Ты спрашивай, спрашивай, а уж мы тебе объясним. И сами поймём. :F
 3.0.33.0.3
EE Татарин #13.10.2008 01:03  @Non-conformist#12.10.2008 20:49
+
-
edit
 

Татарин

координатор
★★★★☆
Non-conformist> Здравствуйте. Такая вот программка:
Non-conformist> В книжке автор предлагает определить, при каком значении переменных fst, scnd программа еще выдает правильный результат при умножении, и догадаться, сколько бит в переменной типа int. Я определил, что самое большее значение, которое может принимать переменная prd = 32761 (181 x 181). Результат 181 x 182 уже отображается неправильно (какое-то неправильное отрицательное число). В двоичном виде 181 будет выглядеть как 10110101. Т.е. восемь бит много, а семь - мало... Или автор имел в виду переменную prd, куда записывается результат умножения? Но и тут - пятнадцать бит мало (32467), а шестнадцать - уже много... ???
Тут дело такое: тип int в языке С определяется как самый эффективный целый тип для исполнения на текущем процессоре. Поскольку ТС компилирует для реального режима 80x86 процессоров, самый эффективный размер - 16 бит (он полностью укладывается в регистры AX,BX,CX,DX). Так что int тут тоже 16 бит.
Скажем, если возьмёте писишный т.н. 32-бит компилятор С для защищённого режима, там int будет 32 бита. На восьмибитных процессорах int тоже 8 бит. Достаточно путано? :) Ну вот многим тоже так кажется, по этому поводу С много критиковали.

Есть такая (упомянутая выше HolyBoy) операция sizeof(тип_данных) или sizeof(переменная), которая вернёт размер типа или переменной (в байтах), реально занимаемое в памяти переменной на данной конкретной машине (один и тот же С-код теоретически можно скомпилировать и на 8-бит процессоре, и на 16-бит, и на 32, и на 64, при этом int будет иметь каждый раз свой размер... по меньшей мере, должен по стандарту :)).

Теперь к твоему конкретному случаю. У тебя int - ровно 16 бит. По умолчанию целые типы в С - знаковые, то есть 1 бит как бы отдан под знак. :)
215 = 32768. :)
Так что переполнение случается при превышении положительного числа 32767 (или при уменьшении отрицательного ниже 32768).
Чтобы использовать положительные числа от 0 до 65535 в твоём случае надо написать unsigned int (точно так же unsigned char даст диапазон от 0 до 255, а не от -128 до 127).

Числа, которые ты видел - не странные, это т.н. "дополнительные числа". При этом восьмибитная -1 представляется как 11111111, -2 - как 11111110, ... -128 - как 10000000. Прелесть в том, что с такими знаковыми числами можно оперировать по точно тем же правилам, что и с беззнаковыми. Проверь сам - попробуй прибавить к такой -1 единицу по обычным правилам сложения. Ты получишь 0. Аналогично с вычитанием.

Non-conformist> И еще вопрос: можно ли где-нибудь посмотреть список английских слов (как я понимаю, большей частью - глаголов), от которых произошли мнемонические аббревиатуры команд ДОС, да и того же Си?
Словарь? :)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  3.0.33.0.3
1 2 3 4 5 6 7

в начало страницы | новое
 
Поиск
Поддержка
Поддержи форум!
ЯндексЯндекс. ДеньгиХочу такую же кнопку
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru