|
Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!
Здравствуйте, гость ( Вход | Регистрация )
 Сейчас обсуждают
 
| |
|
  |
Язык Си/С++, вопросы и ответы |
|
|
mephisto |
18.2.2009, 23:54
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(milyan @ 18.2.2009, 22:47)  Люди у кого-нибудь есть учебник по структурам.. желательно чтоб там было побольше примеров программ.. язык Си
Прямо таки учебник? Там всё в одну главу умещается  Спрашивай уже что нужно
|
|
|
|
RedJ |
19.2.2009, 0:51
|

武士道
Группа: Пользователи
Сообщений: 3 288
Регистрация: 16.2.2008
Пользователь №: 20 846

|
Цитата(milyan @ 18.2.2009, 22:47)  Люди у кого-нибудь есть учебник по структурам.. желательно чтоб там было побольше примеров программ.. язык Си
http://lib.sibnet.ru/book/7500 отличная энциклопедия там есть очень много всего включая и структуры данных.
|
|
|
|
Linky |
3.3.2009, 13:19
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 3 466
Регистрация: 31.3.2008
Из: Барнаул
Пользователь №: 27 560
Репутация: 243

|
Раскритикуйте правильность подключения файлов  Необходимо было разбить проект на несколько файлов, а именно на заголовочный с интерфейсом и файл реализации. complex.h » Спойлер (нажмите, чтобы прочесть) « Код #include <iostream> #include <iomanip.h> #include <math.h>
class Complex { private: double real; double imag; public: inline Complex(double r=1, double i=2){ real=r; imag=i; }; void input(); void output(int set=5); Complex operator+(Complex &a); Complex operator-(Complex &a); Complex operator*(Complex &a); Complex operator/(Complex &a); void sqrt(); void pow(int n); };
#include "complex.cpp"
complex.cpp » Спойлер (нажмите, чтобы прочесть) « Код //определение различных функций для Complex...
main.cpp » Спойлер (нажмите, чтобы прочесть) « Код //основной файл
#include "complex.h"
using namespace std;
int main(int argc, char *argv[]) { Complex a,b; a.input(); b.input(); //всякие тривиальные действия над числами.. a=a+b; a=a-b; a=a*b; a=a/b; a.sqrt(); a.pow(2); a.output(10);
return system("PAUSE"); }
Сообщение отредактировал Linky - 3.3.2009, 14:51
|
|
|
|
Krawler |
3.3.2009, 14:48
|

Любит поговорить
Группа: Sibnet-club
Сообщений: 305
Регистрация: 24.5.2008
Из: А адресок не надо????
Пользователь №: 34 141
Репутация: 18

|
» Спойлер (нажмите, чтобы прочесть) « Цитата(Linky @ 3.3.2009, 13:19)  Раскритикуйте правильность подключения файлов Необходимо было разбить проект на несколько файлов, а именно на заголовочный с интерфейсом и файл реализации. Вобщем требуется чтоб в main.cpp подлючался лишь один .h файл. complex.h » Спойлер (нажмите, чтобы прочесть) « Код #include <iostream> #include <math.h> #include <iomanip.h>
class Complex { private: double real; double imag; public: inline Complex(double r=1, double i=2){ real=r; imag=i; }; void input(); void output(int set=5); Complex operator+(Complex &a); Complex operator-(Complex &a); Complex operator*(Complex &a); Complex operator/(Complex &a); void sqrt(); void pow(int n); };
complex.cpp » Спойлер (нажмите, чтобы прочесть) « Код //определение различных функций для Complex...
main.cpp » Спойлер (нажмите, чтобы прочесть) « Код //основной файл
#include "complex.h" #include "complex.cpp"//Вот это очень ненравится..
using namespace std;
int main(int argc, char *argv[]) { Complex a,b; a.input(); b.input(); //всякие тривиальные действия над числами.. a=a+b; a=a-b; a=a*b; a=a/b; a.sqrt(); a.pow(2); a.output(10);
return system("PAUSE"); }
Насколько я помню, чтобы файл подключался только один раз надо добавить примерно следующее Код #ifndef COMPLEX_H #define COMPLEX_H
//Здесь код заголовочного файла
#endif
Аналогино можно сделать и для СРР, но, по-моему при подключении заголовочного файла, файл с реализацией ищется автоматически (не помню точно) Сообщение отредактировал Krawler - 3.3.2009, 14:50
|
|
|
|
Linky |
3.3.2009, 14:53
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 3 466
Регистрация: 31.3.2008
Из: Барнаул
Пользователь №: 27 560
Репутация: 243

|
Krawler, спс, попробую. сейчас изменил заголовочный файл до такого вида, так все устраивает, но незнаю насколько это корректно ) Код #include <iostream> #include <iomanip.h> #include <math.h>
class Complex ... #include "complex.cpp"
main Код #include "complex.h" больше ничего не подключается
Сообщение отредактировал Linky - 3.3.2009, 14:58
|
|
|
|
Krawler |
3.3.2009, 17:29
|

Любит поговорить
Группа: Sibnet-club
Сообщений: 305
Регистрация: 24.5.2008
Из: А адресок не надо????
Пользователь №: 34 141
Репутация: 18

|
» Спойлер (нажмите, чтобы прочесть) « Цитата(Linky @ 3.3.2009, 14:53)  Krawler, спс, попробую. сейчас изменил заголовочный файл до такого вида, так все устраивает, но незнаю насколько это корректно ) Код #include <iostream> #include <iomanip.h> #include <math.h>
class Complex ... #include "complex.cpp"
main Код #include "complex.h" больше ничего не подключается
Да не надо реализацию в заголовочный файл вставлять  Он на то и заголовочный, что только содержит только объявления, но не реализацию... Можно просто тупо подключить заголовочный файл т.е. Код #include "complex.h" а реализацию он должен сам найти Сообщение отредактировал Krawler - 3.3.2009, 17:31
|
|
|
|
Linky |
3.3.2009, 17:35
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 3 466
Регистрация: 31.3.2008
Из: Барнаул
Пользователь №: 27 560
Репутация: 243

|
Цитата(Krawler @ 3.3.2009, 16:29)  » Спойлер (нажмите, чтобы прочесть) « Да не надо реализацию в заголовочный файл вставлять  Он на то и заголовочный, что только содержит только объявления, но не реализацию... я наверно не правильно показал что в нём находится, там только объявление класса и прототипы его функций, иначе бы компилятор ошибку выдал увидев копию этого класса в .cpp файле Цитата(Krawler @ 3.3.2009, 16:29)  Можно просто тупо подключить заголовочный файл т.е. Код #include "complex.h" а реализацию он должен сам найти Такое срабатывает когда эти файлы входят в состав проекта //А у тебя они как раз и входят в состав проекта  Ты же сам пишешь: "... разбить проект ..." - Krawler //to Krawler, да это ясно, с этим проектом всё норм  мне просто нужно будет потом их еще раз использовать уже в других проектах простым подключеним(не в проект) а просто через include <..>, закинув эти файлы в папку include самой среды //2Linky Тогда просто сделай как я тебе говорил с Код #ifndef <Имя_файла>_H ( или <Имя_файла>_CPP) #define <Имя_файла>_H ( или <Имя_файла>_CPP) //код #endif
и потом подключай оба и .h, и .cpp лишнего он не подключит Сообщение отредактировал Krawler - 3.3.2009, 18:03
|
|
|
|
mephisto |
3.3.2009, 20:39
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(Linky @ 3.3.2009, 16:35)  Такое срабатывает когда эти файлы входят в состав проекта
Да ну? А printf у тебя тоже частью проекта являться должен?
|
|
|
|
Linky |
3.3.2009, 22:01
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 3 466
Регистрация: 31.3.2008
Из: Барнаул
Пользователь №: 27 560
Репутация: 243

|
Я говорил про то что если подключить заголовочный файл, где находятся только прототипы без, указания на файл где хранятся их реализация, то ничего не будет работать, покрайней мере у меня в 2-х разныех средах так. Цитата(Krawler @ 3.3.2009, 16:29)  Можно просто тупо подключить заголовочный файл т.е. Код #include "complex.h" а реализацию он должен сам найти» Спойлер (нажмите, чтобы прочесть) « Код //header.h int func(); #include "file.cpp" //без этого у меня не работает, работает только когда все 3 файла будут в проекте.
//file.cpp int func(){return 10;};
//main.cpp #include "header.h" main(){ int i = func(); }
Насчет принтф, насколько мне известно прототип находится в stdio.h, которая в свою очередь подключает еще несколько хидеров, подключение файла где будет например просто printf(const char * __format, ...); ничего не даст, я не думаю что будет перебираться вся папка инклюд чтоб найти реализацию этой функции, а просто смотрится в подключенных к stdio.h файлах, если в них определения нету, то будет ошибка. Мне так кажется, могу ошибаться... Сообщение отредактировал Linky - 3.3.2009, 22:23
|
|
|
|
mephisto |
4.3.2009, 9:05
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(Linky @ 3.3.2009, 21:01)  Я говорил про то что если подключить заголовочный файл, где находятся только прототипы без, указания на файл где хранятся их реализация, то ничего не будет работать, покрайней мере у меня в 2-х разныех средах так.
Может тебе всё же нужно взять книжку и прочитать, что такое препроцессор и что такое компоновщик(он же линкер). Цитата(Linky @ 3.3.2009, 21:01)  Насчет принтф, насколько мне известно прототип находится в stdio.h, которая в свою очередь подключает еще несколько хидеров, подключение файла где будет например просто printf(const char * __format, ...); ничего не даст, я не думаю что будет перебираться вся папка инклюд чтоб найти реализацию этой функции, а просто смотрится в подключенных к stdio.h файлах, если в них определения нету, то будет ошибка. Мне так кажется, могу ошибаться...
Что я делаю не так? » Спойлер (нажмите, чтобы прочесть) « Код anton@bc:~$ cd /tmp/ anton@bc:/tmp$ cat > hello.c void hello(void) { printf("Hello!!!\n"); } anton@bc:/tmp$ cat > main.c int main (int argc, char ** argv) { hello(); return 0; } anton@bc:/tmp$ gcc -c hello.c -o hello.o hello.c: In function 'hello': hello.c:2: warning: incompatible implicit declaration of built-in function 'printf' anton@bc:/tmp$ gcc -c main.c -o main.o anton@bc:/tmp$ gcc main.o hello.o -o hello anton@bc:/tmp$ ./hello Hello!!! anton@bc:/tmp$
Сразу скажу, что gcc в директорию include без спросу не лезет. Да и о существовании функции hello() при компиляции main.c gcc "не знал", тем не менее... Для лучшего понимания продолжим эксперимент: Код anton@bc:/tmp$ gcc main.o -o hello main.o: In function `main': main.c:(.text+0x12): undefined reference to `hello' collect2: ld returned 1 exit status anton@bc:/tmp$
Всё же функция ищется на этапе компоновки...
|
|
|
|
Linky |
4.3.2009, 11:25
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 3 466
Регистрация: 31.3.2008
Из: Барнаул
Пользователь №: 27 560
Репутация: 243

|
мб я не верно вырозился, навсякий случайно попробую еще раз Есть заголовочный файл с прототипом функции и всё, больше там ничего нету, вообще. Есть файл с определением этой функции, но он никаким боком не указан в заголовочном файле ни в проекте, просто хранится в папке со средой. В основной программе подключаем только заголовок(include <..h>) и вызываем ф-ю из заголовочного файла, всё. Препроцессор скопирует содержимое файла в месте вызова дерективы инклюд, получим прототип + main() с вызовом этой ф-и. Цитата Работа компоновщика заключается в том, чтобы в каждом модуле разрешить ссылки на неопределённые имена Как компоновщик найдет реализация этой функции? он будет перебирать все файлы в поисках релизации? мне вот это интересно. Сообщение отредактировал Linky - 4.3.2009, 11:35
|
|
|
|
mephisto |
4.3.2009, 11:37
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(Linky @ 4.3.2009, 10:25)  Как компоновщик найдет реализация этой функции? он будет перебирать все файлы в поисках релизации? мне вот это интересно.
Да ты, я смотрю, ниразу с библиотеками сторонними не работал... Очевидно компоновщику явно указываются библиотеки/объектники в которых нужно осуществлять поиск. Стандартная библиотека Си подключена по-умолчанию. Замечу так же, что линковка может быть статической (когда куски кода из библиотеки выдираются и вставляются в результирующий файл) и динамической, когда необходимые библиотеки подгружаются на этапе исполнения программы (в виндах они DLL называются).
|
|
|
|
mephisto |
4.3.2009, 12:59
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(Linky @ 4.3.2009, 10:43)  Помоему я про это уже n-й пост пишу, что ничего не указывая - работать не будет.
Тем не менее смысла существования заголовочных файлов ты так и не понял. А смысл прост: есть уже скомпилированный код на момент использования заголовочного файла код, чтобы компилятору знать как "общаться" с кодом, исходники которого вообще могут быть не доступны, пишутся прототипы функций. Еще одно использование заголовочных файлов - определение констант, пример тому math.h, вот его фрагмент: Код # define M_E 2.7182818284590452354 /* e */ # define M_LOG2E 1.4426950408889634074 /* log_2 e */ # define M_LOG10E 0.43429448190325182765 /* log_10 e */ # define M_LN2 0.69314718055994530942 /* log_e 2 */ # define M_LN10 2.30258509299404568402 /* log_e 10 */ # define M_PI 3.14159265358979323846 /* pi */ # define M_PI_2 1.57079632679489661923 /* pi/2 */ # define M_PI_4 0.78539816339744830962 /* pi/4 */ # define M_1_PI 0.31830988618379067154 /* 1/pi */ # define M_2_PI 0.63661977236758134308 /* 2/pi */ # define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ # define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ # define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
Реализации же, скажем функции sin нет нигде в директории include!
|
|
|
|
|
  |
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|