Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите в изучении C. (http://forum.oszone.net/showthread.php?t=277047)

Efimalex 03-02-2014 23:16 2302174

Помогите в изучении C.
 
Добрый вечер. Решил я попытаться освоить программирование, решил начать с C. До этого с программированием дела не имел ( школьный курс Basic не в счет ). Читаю книгу Д. Ритчи & Керниган Б. Язык программирования С., поставил Eclipse, компиляторы MinGW. Начал писать, а вернее списывать:), свою первую программу. Текст программы взят из книги.
Код:

#include <stdio.h>
main()
{
    printf("Hello, world\n");
}

eclipse после компиляции выдавал две ошибки, хотя и запускал программу. Они пропали после того как текст изменил на
Код:

#include <stdio.h>
int main()
{
    printf("Hello, world\n");
    return 0;
}

Этот текст я взял в инете. Объясните в чем разница? Что такое int я разобрался, но зачем в данной программе нужно указывать тип функции? И про return 0

torauma 04-02-2014 08:57 2302268

Цитата:

Цитата Efimalex
eclipse после компиляции выдавал две ошибки, хотя и запускал программу. »

Не ошибки, а предупреждения (warning). Это просто указание на места в коде, которые хоть и являются синтаксически допустимыми, но кажутся компилятору странными или не соответствуют стандарту. Их можно не исправлять, если вы уверены, что они не приведут к ошибкам.
Скорее всего у вас используется компилятор C++, а не C. В стандарте С++ есть требование, что функция main должна возвращать целочисленный код завершения. return 0, в данном случае означает, что программа при успешном завершении передает операционной системе код завершения 0. Обычно код завершения 0 означает успешное завершение программы, другими значениями обозначают аварийное завершение.

Iska 04-02-2014 08:58 2302269

Цитата:

Цитата Efimalex
Объясните в чем разница? »

В настройках компилятора?
Код:

#include <stdio.h>
main()
{
printf("Hello, world\n");
}

У меня в среде Dev-C++ ошибок не наблюдается.

lxa85 04-02-2014 08:59 2302271

Efimalex, если кратко, то Большая разница: int main() или void main()?
return 0 - возвращает ноль компилятору, свидетельствуя о том, что функция (программа) завершена правильно.
Иностранные источники:
stackoverflow.com What is the proper declaration of main
msdn.microsoft.com Main() Return Values (C# Programming Guide)
stackoverflow.com What should main return in c and c

Iska 04-02-2014 09:26 2302279

lxa85, тут что-то всё в кучу — и C, и C++, и C#.

torauma 04-02-2014 09:39 2302284

Цитата:

Цитата lxa85
return 0 - возвращает ноль компилятору »

Может быть операционной системе?

lxa85 04-02-2014 11:40 2302376

torauma, может и операционной системе, не знаю. :)
Главное куда-то "вышестоящей системе", которая примет решение о дальней судьбе программы.
Операционной системы... Нашел.
Есть такая любопытная вещь OSv. (Краткая справка на opennet.ru)
Там куда 0 возвращается, тоже в операционную систему?
Или она там такая "тонкая", что почти как гипервизор? :)
Iska, на msdn явное упоминание С++ на нашел, т.к. С++ и С# языки родственные + на stackoverflow попадаются вырезки из стандартов, оставил.

torauma 04-02-2014 13:03 2302441

lxa85, не знаю как там OSv устроена, но в Линуксе и Винде, если я правильно помню, передается родительскому процессу. А передачей информации между процессами вроде как ОС занимается.
Точно могу сказать, что код завершения компилятору не передается, т.к. к моменту его передачи компилятор все свои задачи уже выполнил.

lxa85 04-02-2014 14:31 2302492

Цитата:

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

Или все таки компилятору? :)
Нет, в целом я согласен, что моя формилировка вызывает вопросы, просто спортивный интерес.

AFAIK программы написанные в среде .Net в строгом смысле не являются непосредственно исполняемыми на процессоре. Они находятся в некотором промежуточном коде, и исполняются компилятором "на лету". Т.е. компилируя программу в .NET мы получаем переносимый код. А его исполнение зависит от оболочки на каждой конкретной архитектуре. По смыслу очень похоже на технологию Java.

Efimalex 04-02-2014 22:50 2302828

Спасибо, с этим вроде разобрался. Если что компилятор ставил как тут написано http://www3.ntu.edu.sg/home/ehchua/p...wTo.html#mingw

torauma 05-02-2014 08:49 2302985

lxa85, c .NET я не сталкивался, а Java компилируется в байткод, который потом выполняется на специальной виртуальной машине JVM. Согласитесь, javac никаких кодов завершения не получает, т.к. в выполнении программы не участвует.

Efimalex 05-02-2014 22:35 2303597

Итак, добрался я до следующей программы:
Код:

#include <stdio.h>
/* печать таблицы температур по Фаренгейту
и Цельсию для fahr = 0, 20, ..., 300 */

main()
{
    int fahr, celsius;
    int lower, upper, step;

    lower = 0; /* нижняя граница таблицы температур */
    upper = 300; /* верхняя граница */
    step = 20;  /* шаг */

    fahr = lower;
    while (fahr <= upper) {
        celsius = 5 * (fahr-32) / 9;
        printf(“%d\t%d\n”, fahr, celsius);
        fahr = fahr + step;
    }
}


Поясните пожалуйста вот эти две строчки
Код:

int fahr, celsius;
int lower, upper, step;

Я правильно понял, что переменные нужно "раскладывать" раскладывать по типам? И непонятно с формулой, вернее с объяснением
Цитата:

Причина, по которой мы сначала умножаем на 5 и затем делим на 9, а не сразу умножаем на 5/9, связана с тем, что в Си, как и во многих других языках, деление целых сопровождается отбрасыванием, т. е. потерей дробной части. Так как 5 и 9 - целые, отбрасывание в 5/9 дало бы нуль, и на месте температур по Цельсию были бы напечатаны нули.
Может мне другими словами это разъясните? Ни как я не пойму этого отбрасывания. Может на конкретном примере покажете что происходит?

Iska 06-02-2014 00:29 2303687

Цитата:

Цитата Efimalex
Может мне другими словами это разъясните? Ни как я не пойму этого отбрасывания. Может на конкретном примере покажете что происходит? »

С этим: Представление целых чисел - Поиск в Google Вы знакомы?

Что получится при обычном делении 5 на 9? «0.5(5)» — «0.5555555555555555555555555555555…». Операция деления над двумя целыми числами даёт целочисленный результат, т.е. вся дробная часть — «.5555555555555555555555555555555…» просто теряется, остаётся только «0». При делении 10 на 9 будет 1 («1.1111111111111111111111111111111»), 20/3 = 6 («6.6666666666666666666666666666667»).

Efimalex 06-02-2014 22:01 2304338

В упражнении нужно переделать программу наоборот. Вот что получилось
Код:


#include <stdio.h>
/*печать таблицы температур по Фаренгейту
 и Цельсию
 */
int main()
{
    printf("Таблица температур\n");

        float fahr, celsius;
        float lower, upper, step;

        lower=-17.8; /*нижняя граница температур*/
        upper=300.0; /*верхняя граница температур*/
        step=20.0; /*шаг*/

        celsius=lower;
              while (fahr<=upper)
              {
                      fahr=(9.0/5.0*celsius+32.0);
                      printf("%5.1f %8.2f\n%" , celsius, fahr);
                      celsius=celsius+step;
              }
        return 0;
}

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

printf("%5.1f %8.1f\n%" , celsius, fahr);
Программа выводила такие числа например, 162.2 323.0 (по Цельсию и Фаренгейту соответственно).
Когда указал в спецификации что выводить нужно с точностью до сотых, начала выводить нормально, 162,2 323,96. Это что, шло округление? Я думаю, не должно, ведь он должен просто откинуть все что идет после десятых долей, или я не прав?

User001 07-02-2014 09:19 2304584

Цитата:

Цитата Efimalex
Это что, шло округление? »

Оно самое почитайте например, здесь.

Efimalex 30-11-2014 21:47 2437762

Добрый вечер. Помогите разобраться вот в чем. Поставил на другой ноут(Win7 x86) Eclipse и MinGW. При запуске Build, создается лишь папка Debug, а бинарный фал нет. Но если использовать готовый проект Hello World ANSI C Project с кодом:
Код:

============================================================================
 Name        : hr.c
 Author      :
 Version    :
 Copyright  : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */
 
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    return EXIT_SUCCESS;
}

то все проходит нормально. Но если создавать свой проект с кодом
Код:

#include <stdio.h>
 
int main() {
  printf("Hello, world!\n");
  return 0;
}

то при запуске Build, в консоли выводится следующее: Info: Internal Builder is used for build
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o h.o "..\\h.c"
gcc -o hk.exe h.o
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):main.c.text.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

22:55:18 Build Finished (took 1s.715ms)

alef2474 01-12-2014 00:56 2437811

Цитата:

Цитата Efimalex
Если что компилятор ставил как тут написано http://www3.ntu.edu.sg/home/ehchua/p...wTo.html#mingw »

Я, конечно, не программист и пусть меня не бьют ногами за это.
Но, имхо, изучать С(а не C#) на базе допотопных средств из 1980-х годов на сегодня негоже (это на совести старых авторов (Ритчи и т.п.), читающих многолетние курсы для профессионалов, для таких случаев можно и так).
Нужно поставить какую-нибудь версию MSVisualStudio из современных и изучать программирование, исходя из ее особенностей, интерфейса,
потому что все это изучение нужно для возможности в перспективе создать что-то современно-полезное, а не просто сдать экзамен по началам С и забыть надолго.
Примерно так http://msdn.microsoft.com/ru-ru/library/k1sx6ed2.aspx (У меня без всяких вопросов все сразу заработало)

Иначе неизбежно будут горы ненужных для изучения проблем в разных версиях, которые в последнем вопросе.
Можно там в Studio обыгрывать примерчики с фаренгейтами из Ритчи.

Iska 01-12-2014 06:46 2437842

alef2474, можете пояснить — с какого перепуга MinGW и Eclipse в Ваших устах превратились в «допотопные средства из 1980-х годов»?

alef2474 01-12-2014 10:25 2437879

Цитата:

Цитата Iska
с какого перепуга MinGW и Eclipse »

Да, Википедия говорит о 1998 годе, но начало было положено раньше в 1985-ом https://ru.wikipedia.org/wiki/GNU_Compiler_Collection.
В любом случае, имхо, это несовременно изучать отмирающие версии языка и старые грабли версий для новичка, в моей ссылке на MS, кстати отвечены варианты написания main() Управление памятью значительно усовершенствовано в C# по сравнению с C++ Имхо, нужно изучать не только язык, но и нормальную среду программирования, а не что-то минималисткое, вызывающее вопросы.
Если я неправ, объясните в чем.

Вы ответите про return EXIT_SUCCESS; и stdlib из последнего вопроса?

Iska 01-12-2014 11:46 2437924

Цитата:

Цитата alef2474
Если я неправ, объясните в чем. »

В азарте. Язык — всего лишь инструмент. Не надо делать из него фетиш. Кто-то пишет на стандартном C, кто-то — на C++. Кто-то жить не может без C#, а кому-то хватает и пакетных файлов. Апологеты чистого ассемблера их запросто заклюют за «неправильный», с их точки зрения, подход.

Цитата:

Цитата alef2474
Вы ответите про return EXIT_SUCCESS; и stdlib из последнего вопроса? »

Нет, конечно. У меня нет MinGW.

Efimalex 01-12-2014 21:32 2438213

Так что мне делать, в какую сторону "копать" то хоть?

lxa85 01-12-2014 23:39 2438290

Код:

#include <iostream>
int main(){
        printf("Hellow World! \n");
        system("pause");
        return 0;
}

?
Цитата:

Цитата Efimalex
Так что мне делать, в какую сторону "копать" то хоть? »

Туда, где все работает. Точней сказать не могу, сам переодически от этого страдаю. :(

Iska 02-12-2014 05:53 2438360

Цитата:

Цитата lxa85
Туда, где все работает. »

У меня в «Dev-Cpp» вышеуказанный автором «проблемный» «Hello, world!» код работает ;). Дело явно в настройках среды, проекта или компилятора.

alef2474 02-12-2014 15:14 2438616

Цитата:

Цитата lxa85
Так что мне делать, в какую сторону "копать" то хоть? »
Туда, где все работает. »

В MS Visual Studio.
Возможно, мы с Iska друг друга неправильно поняли.
Я имел в виду, что в любом деле лучше пользоваться наилучшим имеющимся инструментом, например, копать землю острой и легкой лопатой, а не тупой и тяжелой. Можно изучать Windows на примере windows 98 или ХР(знакомясь с их глюками), а можно на примере win 8.

Программирование на чем угодно - это прежде всего способность самому понять и найти свои ошибки и исправить и потом меньше их допускать.
Hello world очень здорово выглядела в 1960-70-е годы, когда электрическая консольная машинка в большом машинном зале, заставленном шкафами, составлящими один компьютер, вдруг оживала и начинала сама печатать "Hello world!", при этом клавиши на ней сами нажимались, будто за ней сидел кто-то невидимый. Или Вы ей что-то отвечали на той же машинке, а она перебивала вас и вы отдергивали руки от неожиданного движения клавиатуры под пальцами.Компьютер был реально живой - он двигал "пальцами", такого сейчас нет.В 80-е годы появились мониторы.

Efimalex 02-12-2014 21:13 2438801

Пришел к выводу что проблема кроется где то в настройках самих проектов, потому что если создать готовый Hello World ANSI C Project, а код туда поставить свой - то все работает. Осталось за малым найти различия в настройках. Кстати, а кто какими средами и компиляторами пользуется, помимо MS Visual Studio?

Iska 03-12-2014 04:39 2438898

Dev-C++. Только «пользуюсь» — это громко сказано. Я давно уже не программист. Так, применяю для помощи.

Drongo 03-12-2014 16:07 2439162

Цитата:

Цитата Efimalex
Кстати, а кто какими средами и компиляторами пользуется, помимо MS Visual Studio? »

Embarcadero RAD Studio 2010

User001 06-12-2014 06:20 2440200

Насчет
Цитата:

Цитата Efimalex
#include <stdio.h> main() { printf("Hello, world\n"); } »

void main(void) vs main()
Цитата:

Цитата Efimalex
Пришел к выводу что проблема кроется где то в настройках самих проектов, потому что если создать готовый Hello World ANSI C Project, а код туда поставить свой - то все работает. Осталось за малым найти различия в настройках. Кстати, а кто какими средами и компиляторами пользуется, помимо MS Visual Studio? »

Так вот и посмотрите в чем различия проектов (флаги компилятора и т.д.). Обратите внимание на стандарты.
Средства разработки выбирайте сами, исходя из своих целей и желаний. Для начала лучше научитесь писать в notepad и собирать вручную, чтобы потом не гадать где и что значит у нормальной IDE.
А так, к примеру, Iska, пишет классные скрипты, а среда, возможно, не впечатлит :)

pva 06-12-2014 15:28 2440360

Цитата:

Цитата Efimalex
Так что мне делать, в какую сторону "копать" то хоть? » »

Efimalex, Дело вот в чём:
в unix- подобнызх системах (где и родился "C") стартующая функция имеет вид
Код:

int main(int argc, char **argv);
argc - размер массива argv
argv - массив строк-параметров. Считается что оболочка unix разбивает строчку с аргументами на массив и вызывает main()
из-за особенностей вызова cdecl, можно пропускать аргументы

Микрософт решил, что им это не подходит, и придумал свою функцию
Код:

int WinMain(HINSTANCE this, HINSTANCE prev. char *cmdline, int nshow);
this - описатель текущего приложения
prev - описатель прошлого запущенного его экземпляра
cmdline - командная строка целиком
nshow - что рекомендуется сделать с окошком (функцией ShowWindow)

Чтобы работали оба варианта, mingw имеет флаг компоновки, при котором используется та или иная стартующая функция.
Убери в проекте Settings -> Tool Settings -> command или где-то там слова -Wl,-subsystem,windows
http://stackoverflow.com/questions/7...gw-and-eclipse
Но лучше создавай Empty C Project для MinGW и вручную добавляй файл main.c

Efimalex 06-12-2014 21:17 2440523

pva, спасибо, попробую. User001, отличия ищу, но пока времени из за работы было мало:)

Efimalex 08-12-2014 22:11 2441486

Как бы стыдно не было это писать, но надо:) Кто бы за меня нажал Ctrl+S перед Build :blush2: на другом ноуте в Eclipse это делалось автоматом.


Время: 08:45.

Время: 08:45.
© OSzone.net 2001-