Конечно си легче! Потому что он ближе к реальному миру. Си делает то что ты ему говоришь делать, а не создает тонну абстракций на пустом месте. В си нет функторов, перегрузки функций и операторов, нет рефлексии, ничего по сути нет - поэтому он действительно проще. Разобрались что такое память, функция, переменная, условие и цикл и вуаля: вы пишите на си.
Да, вероятно. Если человек хочет быстро сделать что-то чтобы работало, то лучше брать что-то с автоматическим управлением памятью и другими ресурсами. Не придется тратить годы жизни на попытки понять где течет память, и почему у ОС закончились дескрипторы =)
Если честно сам не знаю что лучше. Я думаю если человек хочет стать профессиональным программистом - нужно начинать с низкого уровня, и плавно подходить к высокому. Если же и правда только как хобби, или чтобы для себя наваять простой сайт, скрипт или утилитку - то вполне можно забить на указатели, и сразу писать на питоне/джаве/js и тд.
С другой стороны начинать с языка Си хорошо тем, что человек понимает как что устроено внутри. Считается, что после си гораздо легче перейти на высокоуровневые языки чем если делать наоборот. Даже если потом автор захочет уйти в питон или жаву - знание работы с указателями с ним останется, что поможет ему понять причины многих явлений, скрытых за красивыми паттернами ( к примеру разницу между deep и shallow copy ).
Практическая часть вам в любом случае потребуется ( даже если ее не будет в этой книге, хотя какие-то примеры там будут обязательно ). Поэтому да - обязательно озаботьтесь устновкой IDE и компилятора языка си ( как вам уже советовали можно выбрать Visual Studio Express, или QtCreator со встроенным mingw компилятором ). Ну и дальше - советую проверять изученное в книге сразу же практике.
Сам когда-то читал Кернигана и Ричи, но думаю в сети можно найти много других учебников, не хуже этого. Просто сам не в теме, так что посоветовать не могу.
>> (GetTickCount() - startTime) / 1000
Тут случайно нет проблемы с делением целых чисел на целое число? Может из-за этого получаются неправильные результаты. Попробуйте на всякий случай сделать 1000.0
Консоль мерцает скорее всего из-за того что она вначале закрашивает все черным ( ну пробелами допустим ) а потом сверху рисует новые буквы. То есть фпс тут никак не поможет, для гуишных програм обычно используют double buffer чтобы избежать подобного поведения. Для консоли - даже не знаю, может вам попытаться взять на вооружение что-то вроде ncurses - либу предназначенную для консольных приложений.
Заворачивайте код пожалуйста в специальные теги, тогда не будет съедаться содержимое инклюдов, да и подсветка синтаксиса ( если указать плюсы ) появится.
Ну и второе- перед выкладкой - проводите хотя бы минимальную чистку кода - удалите закомментированный и просто не нужный код, чтобы те кто хочет вам помочь смогли бы сконцентрироваться на главном.
Тот же питон позволяет писать как под веб так и десктоп приложения ( wx.python, wxGtk ). На питоне можно писать и игры ( смотрите на pygame ).
Js - тут тоже игры, сервера, подозреваю что еще много чего =)
Энтерпрайз решения писать на удаленке вряд ли получится, тут нужно в офис будет ходить. Ну а там уже научат тому что надо, будь то жава или плюсы.
А вектор и создает сплошной участок памяти куда можно записывать все что угодно. Создавайте вектор байтов ( vector и используйте как хотите ).
vector a;
(&(a[0])) -> вот вам указатель на начало вашего блока памяти, пишите в него что хотите, хоть прямо туда, хоть со смещением. Впрочем для вашей задачи можно и new char[N] сделать, тоже будет не хуже работать, только потом не забыть освободить.
К сожалению не так просто. Допустим у вас есть код который запускает новый поток и дальше что-то делает, и есть тот который вы выложили сюда - создающий слушающий сокет. Ошибка у вас как-будто в последнем коде, но на самом деле код создающий и управляющий этим потоком отвечает за его хм "плохое" поведение. Впрочем для теста можете выставить селекту нулевой таймаут - tv_sec=0 и проверить будет ли ошибка или нет.
Interrupted system call - ага, видимо у вас этот код должен выполнятся в отдельном потоке, но поток умирает слишком рано, до того как select успеет прождать все свои 5 секунд ( время установленное в вашем таймауте ).
Надо смотреть на код который создает этот поток, и нет ли там преждевременного его удаления.
Проверьте внутри этой функции, все ли в порядке. Открывается ли слушающий сокет, и тд.
Ну и сообщение об ошибке от select проверьте. В errno будет номер ошибки, по нему через strerror можно получить ее строку ( в общем в той ссылке что я кидал есть рабочий пример ).
Код сервер или клиент? Если сервер - то там выше по коду переменная msoc должна быть правильно инициализированна, также настроена слушать какой-то порт. Возможно у программы просто не хватило прав чтобы дать вам этот порт ( или порт был уже занят ). Ищите вызовы bind/listen
Если клиент - ищите connect и проверьте правильно ли он завершился - если сокет не смог подключится, то и select на нем делать бесполезно.
Может быть просто сам сокет неправильно был инициализирован. Короче убедитесь что все системные фукнции с этой переменной до сих пор завершились успешно.
Попробуйте через strerror www.cplusplus.com/reference/cstring/strerror
Это оно, но я тут не вижу переменной msoc впрочем судя по всему она int. Попробуйте вначале вывести ошибку. Код писали сами или чужой ?
Сложно понять правильные ли аргументы получает селект если не видишь типов этих аргументов. Вот например msock я догадываюсь что это сокет но какого он типа? Вот и получается что проверить сложно. По внешнему виду кода все правильно.