Форум: "Прочее";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
ВнизВопросы наСИльникам :) Найти похожие ветки
← →
Servelat © (2006-06-04 10:22) [0]В перерывах между подготовкой к экзаменам решил занять себя полезным делом - изучить приплюснутый (два раза) си :). Вообще пост будет, я чувствую, долгим, так что самые нетерпеливые могут переходить собственно к вопросам. А я пока растекусь мысью по древу о том, что си требуется повсеместно и чаще, чем паскаль (который я, хотелось бы надеяться, знаю совсем не плохо) и вообще знать еще один язык очень неплохо. Ну всяким нубствам як "Damn this stupid world!" нас научили еще на первом курсе, а щас я решил усесться за него поплотнее. Установил Borland C++ 5.5 Compiler (к нему еще и Command Line Tools прилагались) и текстовый редактор (если кому интересно EditPlus, шароварный, мне понравился). Итак, первый вопрос:
1. Стоит ли для обучения предпочесть иной компилятор/IDE и вообще.
Парит в основном отсутствие хелпа, но онлайн MSDN спасает, да и на dvd где то лежал нормальный (оффлайновый что ли назвать), можно установить, но еще не собрался. Да, и еще отсутствие Ctrl+Click, и F8/F7 (отладки). С другой стороны бесплатно, хоть поприучусь использовать легальное ПО. Да и сам компилятор/редактор меня вполне удовлетворяют, кнопкокидательство аля формы что в Borland C++ Builder
мне не надо, а весит он на порядок больше моего сейчашнего варианта (люблю маленькие программы :) )
Уже ближе к программированию:
2. Как в Си плюс плюсе сделать нечто похожее на дельфевый тип byte. Посмотрев в собственно книжку (электронную, и даже не одну :) ) понял что это будет примерно так:typedef unsigned char byte;
Все замечательно пока не передаешь это байт куда-нибудь в стандартную процедуру, например:byte a;
cin >> a;
если ввести "5" то в a попадет код символа 5, что не есть хорошо. Понятно, что можно извратится через левую переменную, поиграть с приведением типов или с указателями, но я вообще ищу красивый способ, то есть чтобы код был понятным и удобочитаемым, без лишнего словоблудия при каждом вызове функции с таким типом. Ведь для unsigned short или unsigned long таких проблем нет, вот бы как-нибудь реализовать и тут так.
Совсем близко к программированию:
3. Длинные строки. Дельфи - строки до 4Гб, никаких заморочек ({$H+} 4ever) . Хочу подобное в си. Нет, основные принципы я понял, хитрости вроде тоже в работе со строками и непривычными функциями, но это все хорошо для строк char[255]. А мне бы длинные строки как в дельфи, но чтоб если строка не 1 гиг длинной статически этот гиг не выделять =). Есть ли какое-нибудь расширение, модуль, не знаю что еще для длинных строк в си?
Еще один:
4. что такое "namespace" (std) и с чем его едят (в двух словах), есть ли Дельфевая аналогия. Не сомневаюсь, что если хорошо поищу, то найду описалово в интернете, но раз уж начал задавать вопросы решил и этот сюда включить, хоть общее представление мож получу, легче читать будет.
И под завязку:
5. Рассматривал хитрый чужой исходник. Много не понял но эта не беда. Не понял как идет компиляция и что во что включается, вот это беда =)). В дельфи все понятно - знай пиши юниты в uses, а тут что я обнружил:
итак, есть файл main.c, он подключает кучу заголовочных файлов, в частности файл connection.h. Теперь, в файле connection.h описываются структуры данных и куча прототипов процедур, например:extern void conn_shutdown(t_connection * c, time_t now, t_timer_data foo)
все отлично. но, еще есть файл connection.c, где идет реализация этих процедур! А он не включается в connection.h (специально искал, нет такого include). Теперь, если я правильно понимаю, компилятору пофик в общем то на расширение файла, он смотрим на содержимое, то есть компилируется первый файл а в него включаются остальные. Дак каким образом в обработанный препроцессором (в заключительный) текст программы попадает собственно код процедур? Поясните пожалуйста этот механизм подробнее, я видимо что-то упустил. Да, еще там идет куча разных define"ов и undef"ов и ifdef"ов, да еще и файлов подключается тьма, так что в принципе включение может быть скрыто от невооружененого глаза, но тогда не понялно зачем это сделано... Большое количество всякой атрибутики типа #ifdef вполне объяснимо, ибо программа писалась как под UNIX так и под Win32, да еще и разными компиляторами её собирать можно.
ЗЫ Вернусь сюда вечером и прочитаю все ваши отзывы, заранее благодарен всем откликнувшимся.
ЗЗЫ Пишу в форум по дельфи потому что он (форум) мне как родной, привык я уже тут, хотя высказываюсь нечастно (молчание золото), но читаю частенько, хотя в Потрепаться бываю от случая к случаю. Да, ну и такого же дружелюбного, терпимого и актуального форума для си я пока не знаю =).
← →
[wl] © (2006-06-04 11:30) [1]1) компилятор любой совместимый с ANSI, если хочется кроссплатформенности, тогда - GCC, на нем можно писать под любой процессор, хоть под ARM (смартфоны, gameboy advance), хоть под MIPS (playstation portable), хоть под x86 (но кажется в основном под линукс, под виндовс - через cygwin).
IDE - лучше всего использовать Visual Studio, но если ты привык к делфи, по вполне подойдет C++Builder.
2) имхо, никак без приведения типов.
3) используй char*, там нет ограничения на размер, нулевой символ указывает на конец строки.
4) namespace - это "пространство имен", используется для избежания конфликтов по одинаковым именам. Примерная аналогия - классы:
class1.var1 и class2.var1 - переменные называется одинаково, однако принадлежат разным классам.
пространство имен std относится к библиотеке STL(standart template library) - набор шаблонов классов, таких как массивы, строки, алгоритмы, деревья и прочее.
5) .c-файлы нужно добавлять в проект, без IDE - нужно либо писать файл проекта Makefile, и собирать проект с помощью команды Make.exe, либо компилировать все *.c файлы отдельно, и затем собирать их все вместе с помощью линкера. сам такой ерундой не занимался, так как ярый приверженец IDE, но из встроенной справки к линкеру можно узнать формат командной строки.
← →
Колдун (2006-06-04 15:56) [2]Кстати, попробуй поюзать Dev C++ - отичная штука, к слову!
А вообще, впредь делай посты поменьше (просто "много букаф ниасилил" =))
← →
wicked © (2006-06-04 16:04) [3]0) научись нормально выражаться.... никто же не говорит здесь "пасквилянты", хотя ко многим это бы отнеслось в полной мере, еще и с приставкой "позорные"....
1) см. предыдущий ответ.... от себя добавлю, что компиляторов тьма и всегда можно будет найти что-то "своё" - от мейнстрима до экзотики....
2) можно через временную переменную
int temp;
byte b;
cin >> temp;
b = temp;
о недостатках такового способа можно подумать, но если честно, такие проблемы - и не проблемы вовсе, числа в char держать - себе вредить....
3) в си - char *.... в си++ - рекомендуется std::string.... ну и всё, что можно только придумать, многие имеют свои собственные библиотечки со строками, многое можно найти на http://sf.net/.... с бесплатным борландовским компилятором идет неплохой хелп по STL, который рекомендую почитать....
4) namespace - это пространство имен, аналог паскалевского модуля, но с другими идеями.... основная особенность - возможность "размазать" один namespace по нескольким исходникам..... также см. предыдущий ответ.... еще лучше - описание языка....
5) берет он реализации из скомпилированных и прилинкованных модулей с функциями... поскольку сейчас вопросы/ответы идут в контексте борландовского компилятора, то тут все просто - в командной строке просто перечисляем все файлы, входящие в проект - компилятор разберется и слинкует все сам.... с другими (особенно mingw gcc) все может быть намного сложнее....
← →
Эмиссар культа (2006-06-04 16:12) [4]1. ИМХО, для обучения можно не погнушаться и Visual Studio.
2. ИМХО, стоит вводить поменьше typedef`ов, если без этого можно обойтись (не сразу может быть понятно, что именно скрывается за byte (могут встречаться и более коварные случаи), кроме того, в WinAPI уже определен тип BYTE). В чем заключается проблема с передачей определения типа в "стандартные процедуры"? Если проблема только с вводом, то приведением типов опять же можно не погнушаться. В реальных приложениях лучше вводить информацию в строковый буфер, осуществлять проверку корректности введенной информации и использовать функции преобразования (atoi и подобные).
5. расширение файла компилятору как раз не безразлично и именно по нему он определяет, что содержащийся в файле код нужно воспринимать не как код c++, а именно c.
← →
Servelat © (2006-06-04 17:34) [5]
> 0) научись нормально выражаться...
Ну я это, нехотел никого обидеть, и сам на пасквилянта не обижаюсь, в шутку же. Но если я как-то попрал чте-то самолюбие - извините.
Всем 10x за ваши отеты, вроде многое прояснилось, посмотрим что будет дальше. В общем, выводы таковы:
1. Щас поставлю Dev-C++, не понравится - Borland Builder, не понравится - MVC.
2. никак
3. читаем хелпы по std::string. Ах да, ну и еще в си - char *.... - при таком варианте кто следит за памятью, я или си? Это выглядит как указатель на char =). Если я его ничему не присваиваю, то ничем хорошим код типаchar *c;
cin >> c;
не кончится. Или кончится? :)
4. бум читать хелп, вроде основную идею я уловил. надеюсь в msdn это есть.
5. хм, понятно что все хитро. хорошо было в дельфи - дпр главный, остальные вассалы =). вроде идею я понял - *.c компилируются отдельно в *.obj, а потом прилинковываются, и все это описано в makefile (который в рассматриваемой мной программе несомненно был, и не один). тогда остается один вопрос
> в командной строке просто перечисляем все файлы, входящие
> в проект
с какого файла он начнет компилировать? если я ему дам кучу .сpp файлов на съедение то он каждый из них скомпилирует в.obj, а тот, что с функцией main будет собственно программой, к которой и прилинкуются все необходимые .obj. Если что не так - поправляйте а то дров наломаю =)). вот, а если в двух файлах функция main? =) ну вот такой злой, написал две штуки. То получится две программы, или он меня пошлет, или еще что-нибудь интересное?
В любом случае всем спасибо за отзывчивость.
← →
wicked © (2006-06-04 18:10) [6]3) с char * за памятью должен следить ты.... это как в ассемблере - все в твоих руках... глюки в том числе... :)
4) на msdn лучше не полагаться - они там "свой стандарт" описывают...
5)
>
> с какого файла он начнет компилировать? если я ему дам кучу
> .сpp файлов на съедение то он каждый из них скомпилирует
> в.obj, а тот, что с функцией main будет собственно программой,
> к которой и прилинкуются все необходимые .obj. Если что
> не так - поправляйте а то дров наломаю =)). вот, а если
> в двух файлах функция main? =) ну вот такой злой, написал
> две штуки. То получится две программы, или он меня пошлет,
> или еще что-нибудь интересное?
начнет с первого, по штучке, наплодит obj файлов, которые потом попытается слинковать между собой и с рантаймом.... точка входа - функция main или WinMain - зависит от рантайма и типа аппликации.... имя екзешки будет именем первого файла в списке или того, который ты укажешь в опциях сам...
с двумя main-ами - попробуй сам.... по идее получишь матюки от линкера....
← →
Servelat © (2006-06-04 19:06) [7]1. Dev C++ понравился, тем более бесплатный, буду мучить.
3. во блин, самому память выделять под строки, в дельфи с этим заморочек небыло. может хоть std::string это на себя берет?
всем спасибо за разъяснения. =)
← →
Celades (2006-06-04 19:18) [8]Да, std::string всё берет на себя. По сути он более удобен чем string в Delphi.
← →
Колдун (2006-06-04 20:30) [9]Это ещё что!!! Под палм покодь - там даже автосборщика мусора нету :)
← →
вразлет © (2006-06-05 11:04) [10]3. Длинные строки. Дельфи - строки до 4Гб, никаких заморочек ({$H+} 4ever) . Хочу подобное в си. Нет, основные принципы я понял, хитрости вроде тоже в работе со строками и непривычными функциями, но это все хорошо для строк char[255].
А где ты вычитал про ограничение в 255 байт?
← →
J_f_S (2006-06-05 12:53) [11]Ну, у Servelat"a еще в голове много ереси... Ничего, через полгода пройдет, он сам станет кричать на форумах "Делфи мастдай"
← →
Servelat © (2006-06-05 13:50) [12]
> А где ты вычитал про ограничение в 255 байт?
А я не вычитал:
> основные принципы я понял, хитрости вроде тоже в работе
> со строками и непривычными функциями, но это все хорошо
> для строк char[255]. А мне бы длинные строки как в дельфи,
> но чтоб если строка не 1 гиг длинной статически этот гиг
> не выделять
в данном контексте, char[255] подразумевает строки на статической памяти (это поясняется во втором предложении). Как я понял, std::string этой проблемы не имеет, так что вопрос снят.
> он сам станет кричать на форумах "Делфи мастдай"
Не могу обещать, но мне кажется, что не стану. Я же сейчас не кричу что "си мастдай", каждый выбирает по душе. Я же предпочитаю знать все =).
← →
J_f_S (2006-06-05 14:02) [13]Да, а отраслевой стандарт - MSVC от 6.0 и выше.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.149 c