Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 60 из 87<  1 ... 57  58  59  60  61  62  63 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 11.01.2009
У меня тот же самый вопрос, что и у автора этой темы, только ему не ответили. Как сделать с свои header файлы? Есть функция в файле cpp, ну я изменил расширение на h, кинул в папку include, но всеравно пишет, что такого хидера нет...



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
tolikrog
А мозг включить?
Предположим, что у Вас программа состоит из нескольких функций:
Код:
void main (void)
{...}

void func1()
{...}

void func2()
{...}

Хидер нужен для того, чтобы
а) не важен был порядок определения функций в cpp файле
б) чтоб можно было вынести разные функции в разные файлы и программа знала, что у нее есть эти ф-ции. Тоже с классами, переменными и пр. объектами, которые будут использоваться в нескольких файлах.
Теперь Вы хотите, чтобы func1 и func2 были в файле func.cpp, а main - в prog.cpp. Для этого сделаем так:
func.cpp
Код:
#include "func.h"
// в данном случае этот инклюд необязателен.
void func1()
{...}

void func2()
{...}

prog.cpp
Код:
#include "func.h"
// а как Вы думаете работают инклюды стандартных функций?
// пока не сделаете include стандартным заголовкам - программа не будет знать, что есть функции стандартной библиотеки C - printf, cos, sin и пр.
void main(void)
{....}

func.h
Код:
// здесь будут прототипы ф-ций
void func2();
void func1();

И самое главное - НИЧЕГО в каталог include кидать не надо.
include "file" - добавляет заголовочный файл из текущего каталога
include <file> - добавляет заголовочный файл из стандартного каталога программы (среды разработки, компилятора) - задается в настройках.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Спасибо, я сделал. Но теперь пишет - Undefined symbol название функции.

Если указывать только funс.h, то от куда он может знать, что все функции описаны в файле func.cpp?


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
tolikrog
в проект запихать все cpp файлы... Если делается все в среде (какой тоже не указано - ну, и как тут можно помогать??? :?: )
Цитата:
Но теперь пишет - Undefined symbol название функции.

КТО??? Компилятор, линкер или еще кто?
Цитата:
Если указывать только funс.h, то от куда он может знать, что все функции описаны в файле func.cpp?

компилятор это и не должно волновать. Он из func.h узнает, что есть некие символы, которые можно использовать. Чем он и занимается. А потом линкер (компоновщик связей) собирает все в кучу и если есть некая функция, у которой отсутствует тело, то начинает ругаться - дайте исходник (объектник) или библиотеку, где она есть.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Спасибо, линкер писал.

Компилятор, borland c++ 3.1

И прототипы и тела функции положил в один файл, и все стало работать - меня это устраивает.
Раньше, я сделал по вашей инструкции, и читался .h файл только с прототипами функций, а с телами в .cpp не читался...
Теперь работает, так как тела функций в том же .h файле, что и прототипы.
Спасибо еще раз за помощь!


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
tolikrog
Цитата:
Теперь работает, так как тела функций в том же .h файле, что и прототипы.

не... это неправильно. :-( Могли бы еще почитать справку по ключевому слову 'extern' и заодно попросвещаться касательно области определений и работе с программой (проектом) из нескольких cpp/h-файлов.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Не читает .h файл, напишите, что у меня сделано неправильно... На скрине видно ошибку, сами файлы, и то что в компиляторе указана папка, где эти файлы.

#77


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
В свойствах проекта неверно указаны пути к Lib-файлам и H-файлам. Прооверь, должно помочь...


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
tolikrog
может стоит для начала файлы обзывать по схеме 8.3? BC3.1 - все-таки ДОСовская программа...
А вообще фиг его знает в чем проблема.

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 14.11.2008
Откуда: Украина, Одесса
Перерыл гугол... Конфу... Ничего не нашел - обращусь к вам)
Простейшее задание по С++ - нужно перевести математический пример с двумя\тремя неизвестными на С и сделать программу которая будет считать ответ при вводе 2х неизвестных... Где можно прочитать про это!!??? :?:


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
зачем вообще использовать, этот устаревший уже на 20 лет BC3.1 ?

Rad.2mv

что тут искать можно?
Код:
#include <iostream>

using namespace std;

void main()
{
   int a, b;

   cout << "Input a ";
   cin >> a;

   cout << endl;

   cout << "Input b ";
   cin >> b;

   cout << endl;
   cout << "a + b = " << (a + b) << endl;
}


 

Member
Статус: Не в сети
Регистрация: 14.11.2008
Откуда: Украина, Одесса
нее... я имел в виду как сам пример перевести... то есть пример дан сложный - деление логарифма на модуль кубического корня итд.. как его записать - хз... где можно правила почитать, как перевести?


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
Rad.2mv писал(а):
нее... я имел в виду как сам пример перевести... то есть пример дан сложный - деление логарифма на модуль кубического корня итд.. как его записать - хз... где можно правила почитать, как перевести?
Ты хочешь почитать про математические функции в c++ (логарифм, возведение в степень и т.д.) - я правильно понял? Если так, то, насколько я помню, в c++ есть библиотека math.h и там есть базовые мат. функции. Вот, например, описание логарифма (там и другие есть).


 

Member
Статус: Не в сети
Регистрация: 25.08.2005
Откуда: SPb
Сегодня писал тестовую фигулинку и обнаружил такую фигню с рандомом: после инициализации srand'ом rand выдает значения жестко привязанные ко времени. arr_size_f убывает на единицу в секунду, например во время первого запуска arr_size_f == 0.98, второго 0.97, третьего 0.95. Разница значений зависит не от номера пуска, а от времени прошедшего с последнего запуска. Компилятор борландовский (C++ Builder 6.0)
У gcc с тем же кодом значение arr_size_f наоборот, растет, только гораздо медленнее.
На других машинах код работает как и ожидается - нормально.
В чем загвоздка?


Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>


int main()
{

    int mytime = time(NULL);
    printf("%d\n", mytime);
    srand(mytime);

    int rand_num = rand();
    printf("%d\n", rand_num);


    double
        arr_size_f = (double)(rand_num) / (RAND_MAX + 1);

    printf("%.2f\n ", arr_size_f);
    getch();
    return 0;

}



 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
hub
значения mytime как изменяются с разными запусками программы?

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
rand - генератор псевдослучайных чисел, высчитывается по определённому алгоритму и в разных реализациях (например в borland мы можем получить описанную картину). ты инициализируешь srand вполне определённым числом , которое зависит от времени. Попробуй где нибудь сохранять последнее случайное число и в последующем запуске проги инициализировать srand именно им. Можно попробовать вообще не инициализировать srand.


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
hub
Цитата:
Сегодня писал тестовую фигулинку и обнаружил такую фигню с рандомом: после инициализации srand'ом rand выдает значения жестко привязанные ко времени.
Не совсем так. Правильнее будет сказать: "после инициализации srand'ом rand выдает ПЕРВОЕзначение жестко привязанным ко времени". Берите не первое, а, например, второе - и будет вам счастье - никакой привязки ко времени.


 

Member
Статус: Не в сети
Регистрация: 25.08.2005
Откуда: SPb
Root
mytime принимает значения времени в секундах. Увеличивается по одной в секунду, как и должно.
oxy
Просто я хорошо помню, что раньше srand нормально инициализировал rand и в билдере и в codeblocks(gcc).
theone писал(а):
после инициализации srand'ом rand выдает ПЕРВОЕзначение жестко привязанным ко времени". Берите не первое, а, например, второе - и будет вам счастье - никакой привязки ко времени.

Просто хочется понять, почему раньше первое значение не было жестко привязано ко времени как теперь?

Кстати, на другой машине исходник компилировался watcom'ом и работал как надо. У себя я не проверял, не успел. Еще забрасывал экзешник собранный у меня на другую машину, там странное поведение повторилось.


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
hub писал(а):
Просто хочется понять, почему раньше первое значение не было жестко привязано ко времени как теперь?
Кстати, на другой машине исходник компилировался watcom'ом и работал как надо. У себя я не проверял, не успел. Еще забрасывал экзешник собранный у меня на другую машину, там странное поведение повторилось.

Я думаю, результат зависит не от машины, на котором запускается экзешник, а от компилятора, версии библиотек. Вполне возможно, что в некоторых компиляторах исправлен этот недостаток (то, что первое значение зависит от времени), и берется, например, сразу второе. Либо первое вычисляется по какой-то более сложной формуле.


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
hub писал(а):
Кстати, на другой машине исходник компилировался watcom'ом и работал как надо. У себя я не проверял, не успел. Еще забрасывал экзешник собранный у меня на другую машину, там странное поведение повторилось.


Всё зависит от реализации rand() - у каждого производителя компилятора она своя (и у watcom`а и у borland`a) и зависит от версии библиотек. Не стоит инициализировать srand() временем - оно не случайно...

К стати, time() возвращает? Вроде как time_t а не int http://www.cplusplus.com/reference/clibrary/ctime/time/


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 60 из 87<  1 ... 57  58  59  60  61  62  63 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan