Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.009 c
15-1149676254
Vlad Oshin
2006-06-07 14:30
2006.07.02
почему нельзя создать папку PRN?


11-1129719872
Brandys
2005-10-19 15:04
2006.07.02
KOL oledb


6-1140519916
Nachinaushiy
2006-02-21 14:05
2006.07.02
Место на диске у конечного хоста при передачи данных


2-1149901653
Fantasy
2006-06-10 05:07
2006.07.02
help


3-1146422646
Yaros-hoi
2006-04-30 22:44
2006.07.02
Относительные и абсолютные пути





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский