[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. darkwing_duk

    darkwing_duk New Member

    Joined:
    25 Jun 2013
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Помогите, пожалуйста!
    Только начал учить язык, учу по Страуструпу.
    Написал программу, по заданию, вычисляющую площадь прямоугольника и площадь в рамках.
    Выдаёт ошибку -"R6010-abort () has ben called.
    В чем проблема?
    Code:
    #include"../../../std_lib_facilities.h"
    using namespace std;
    int area(int lendth, int weidth){
    	if(lendth<=0||weidth<=0) error("error?");
    	return lendth*weidth;
    }
    int framed_area(int a, int b){
    	const int frame=2;
    	return area(a-frame,b-frame);
    }
    int main (){
    	int x=3;
    	int y=6;
    	int z=8;
    	int area1=area(x,y);
    	int area2=framed_area(1,z);
    	int area3=framed_area(y,z);
    	double ratio=double(area1)/area3;
    	cout<<area1<<endl
    		<<area2<<endl
    		<<area3<<endl
    		<<ratio<<endl;
    	system("pause");
    	return 0;
    }
     
    #7681 darkwing_duk, 30 Jun 2013
    Last edited: 30 Jun 2013
  2. Black_Rabbit

    Black_Rabbit New Member

    Joined:
    4 Jan 2013
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    возможно я чтото не понял но у меня работает вот этот код:

    Code:
    #include <iostream>
    
    using namespace std;
    int area(int lendth, int weidth){
    	if(lendth<=0||weidth<=0)
            cout << "error?";
    	return lendth*weidth;
    }
    int framed_area(int a, int b){
    	const int frame=2;
    	return area(a-frame,b-frame);
    }
    int main (){
    	int x=3;
    	int y=6;
    	int z=8;
    	int area1=area(x,y);
    	int area2=framed_area(1,z);
    	int area3=framed_area(y,z);
    	double ratio=double(area1)/area3;
    	cout<<area1<<endl
    		<<area2<<endl
    		<<area3<<endl
    		<<ratio<<endl;
    
    	return 0;
    }
    
     
  3. darkwing_duk

    darkwing_duk New Member

    Joined:
    25 Jun 2013
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    в таком случае, если будут введены неправильные аргументы, то программа не остановится и вернёт не правильные результат, после чего могут возникнуть другие ошибки((((
     
  4. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24
    Code:
    #include <iostream>
    
    using namespace std;
    int area(int lendth, int weidth){
    	if(lendth<=0||weidth<=0)
            cout << "error?"<<endl;
    	return lendth*weidth;
    }
    int framed_area(int a, int b){
    	const int frame=2;
    	return area(a-frame,b-frame);
    }
    int main (){
    	int x=3;
    	int y=6;
    	int z=8;
    	int area1=area(x,y);
    	int area2=framed_area(1,z);
    	int area3=framed_area(y,z);
    	double ratio=double(area1)/area3;
    	cout<<area1<<endl
    		<<area2<<endl
    		<<area3<<endl
    		<<ratio<<endl;
    
    	return 0;
    }
    Собрал, запустил у меня вроде работает.

    Что значит может не остановиться?
    Какие не верные аргументы (не буквы же)
    'Побегай' дебагером по ней, посмотри что куда там ложиться

    http://zalil.ru/upload/34639380
     
  5. GrenkovV

    GrenkovV New Member

    Joined:
    10 Aug 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Проблема с многопоточностью в DLL

    Доброго времени суток!

    Проблема возникает при вызове ф-ции CreateThread, если после неё расположен цикл. Поток не стартует до завершения цикла. Выглядит это так:

    Code:
    DWORD TestThread(LPVOID lpThreadParameter)
    {
    	MessageBoxA(0, "Test Thread", "Thread", 0);
    	return 0;
    }
    
    void TestFunc()
    {
    	DWORD ThreadId = 0;
    	CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TestThread, NULL, 0, &ThreadId);
    	CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TestThread, NULL, 0, &ThreadId);
    	for(int i=0; i<3; i++)
    	{
    		Sleep(1000);
    	}
    }
    
    BOOL APIENTRY DllMain( HMODULE hModule,
    	DWORD  ul_reason_for_call,
    	LPVOID lpReserved
    	)
    {
    	hDllModule = hModule;
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    		TestFunc();
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    
    Проверял возвращаемые хендлы, id потоков и GetLastError() после вызова CreateThread - всё в норме. Но появляются меседжбоксы только по прошествии 3 секунд, т.е. после завершения цикла. Следовательно при вычислениях с использованием while(true){Sleep(1000);} тело ф-ции потока не выполняется вообще.
    Пробовал создавать потоки с флагом CREATE_SUSPENDED а следом вызывать ResumeThread() - не помогло. Изменение приоритета потоков так же не возымело эффекта.

    При этом если вызвать ф-цию TestFunc() не в dll, а в exe, то всё отрабатывает предсказуемо - появляются 2 меседжбокса, а параллельно с ними крутится цикл.

    PS: проект 64-битный. Запускается dll стандартным вызовом LoadLibraryA()
     
    #7685 GrenkovV, 17 Jul 2013
    Last edited: 17 Jul 2013
  6. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    И тут всё предсказуемо. Просто кто-то не читает документацию.

    http://blogs.msdn.com/b/oldnewthing/archive/2007/09/04/4731478.aspx
     
    _________________________
  7. FunOfGun

    FunOfGun Elder - Старейшина

    Joined:
    5 Sep 2012
    Messages:
    388
    Likes Received:
    72
    Reputations:
    124
    Туплю, выручайте
    Есть функция, объявленная как
    Code:
         
        template <class T> 
            static vector<T> replaceRange(vector<T> src, vector<T> find, vector<T> repl); 
    она вызывается вот так:
    Code:
        vector<int> t {0,1,2,3,4,5,6,7,8,9};
        vector<int> f {3,4,5};
        vector<int> r {13,14};
        
        t=Utils::replaceRange<int>(t,f,r); 
    на что я получаю
    Code:
     undefined reference to `std::vector<int, std::allocator<int> > Utils::replaceRange<int>(std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
    где произошла нестыковка? Хедер, разумеется, заинклудил, код функции написал. Заранее благодарен.
     
  8. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Используй константные ссылки, как аргументы функции:
    Code:
        template <class T> 
            static vector<T>& replaceRange(const vector<T>& src, const vector<T>& find, const vector<T>& repl);
     
    1 person likes this.
  9. FunOfGun

    FunOfGun Elder - Старейшина

    Joined:
    5 Sep 2012
    Messages:
    388
    Likes Received:
    72
    Reputations:
    124
    вопрос снят в связи с отказом от С++ в пользу C# :D
    не-а, все равно
    Code:
    undefined reference to `std::vector<int, std::allocator<int> >& Utils::replaceRange<int>(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> > const&)'
    сама функция выглядит вот так:
    Code:
     template <class T> vector<T>& Utils::replaceRange(const vector<T>& src, const vector<T>& find, const vector<T>& repl){
        int pos;
        while((pos=Utils::findSubvector<int>(src,find))!=-1){
            src.erase(src.begin()+pos,src.begin()+pos+find.size());
            src.insert(src.begin()+pos,repl.begin(),repl.end());
        }
        return src;
    }
     
    #7689 FunOfGun, 23 Jul 2013
    Last edited: 24 Jul 2013
  10. iKNG

    iKNG New Member

    Joined:
    23 Jan 2013
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    Code:
    #include <iostream>
    
    using namespace std;
    
    int main () {
    	cout << "Hello, world!\n";
    	return 0;
    }
    В C:\Program Files\MS Visual Studio 10.0\VC\include iostream.h нету. Замена 1 строки на #include <iostream.h> не дает результатов.
     
  11. weInc

    weInc New Member

    Joined:
    29 Mar 2012
    Messages:
    40
    Likes Received:
    3
    Reputations:
    0
    Все правильно:
    Microsoft Visual Studio 10.0\VC\include, только дело в том что со стандарта ISO C++ 98 года файл называется iostream без расширения. Ну и отличием от .h в том что все находится в пространстве std, т.е после подключения дописываем using namespace std, дабы не писать std::cin и т.д.
     
  12. Sifon110

    Sifon110 New Member

    Joined:
    13 Mar 2011
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Имею класс:

    Code:
    
    class Human
    {
       private:
           int age;
           char name[size], profession[size], gender[size];
       public:
           Human();
           void edit_age(int age1);
           void edit_gender(char gender1[]);
           void edit_name(char name1[]);
           void edit_profession(char profession1[]);
           void print_info();
    };
    
    Human person[person_count];
    
    
    После объявления конструктора Human(); компилятор ругается:
    Code:
    error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Human::Human(void)" (??0Human@@QAE@XZ) в функции "void __cdecl `dynamic initializer for 'person''(void)" (??__Eperson@@YAXXZ)
    
    MVS 2008. Подскажите пожалуйста как лечится.
     
  13. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    это все что ты написал? я вижу только отсутствие точки входа и попытку сконструировать объект, у которого не реализован конструктор.

    Code:
    class human
    {
    public:
    	human();
    	void edit_age(int age1);
    	void edit_gender(char gender1 []);
    	void edit_name(char name1 []);
    	void edit_profession(char profession1 []);
    	void print_info();
    
    private:
    	int age;
    	char name[256];
    	char profession[256];
    	char gender[256];
    };
    
    human::human()
    {
    	// do anything or remove fucking away if not necessary
    }
    
    void human::edit_age(int age1)
    {
    	// do enithing
    }
    
    void human::edit_gender(char gender1 [])
    {
    	// do enithing
    }
    
    void human::edit_name(char name1 [])
    {
    	// do enithing
    }
    
    void human::edit_profession(char profession1 [])
    {
    	// do enithing
    }
    
    void human::print_info()
    {
    	// print this shit
    }
    
    int main()
    {
    	human humans[10];
    
    	return 0;
    }
    
     
  14. Sifon110

    Sifon110 New Member

    Joined:
    13 Mar 2011
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Привет всем. Помогите пожалуйста еще с одной проблемкой ...

    В общем есть базовый класс:

    Code:
    
    class Product
    {
        protected:
            char name[size];
            char model[size];
            int price;
        public:
            void edit_name(char name1[]);
            void edit_model(char model1[]);
            void edit_price(int price);
            virtual void print_info(int num) = 0;
    };
    
    
    И есть 3 дочерних класса:

    Code:
    class sausage : public Product
    {
        private:
            float weight;
        public:
            void print_info(int num);
            void edit_weigth(float weigth1);
    };
    
    class milk : public Product
    {
        private:
            int count_of_packets;
        public:
            void print_info(int num);
            void edit_count_of_packets(int count_of_packets1);
    };
    
    class cookie : public Product
    {
        private:
            int count_of_box;
        public:
            void print_info(int num);
            void edit_count_of_box(int count_of_box1);
    };
    
    Создаю объекты так:

    Code:
    Product *product_sausage[count_product], *product_cookie[count_product], *product_milk[count_product];
    
    product_sausage[0] = new sausage;
    product_sausage[1] = new sausage;
    
    product_cookie[0] = new cookie;
    product_cookie[1] = new cookie;
    
    product_milk[0] = new milk;
    product_milk[1] = new milk;
    
    
    Так вот в чем вопрос собественно: как вызвать методы edit_weigth, edit_count_of_packets, edit_count_of_box у дочерних классов? Например так не получается:

    Code:
    product_milk[0]->edit_count_of_packets(5);
    
    Говорит, что метод edit_count_of_packets не является методом класса Product.
     
  15. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Sifon110, у тебя массивы указателей на базовый класс. Нужно привести указатель к указателю на дочерний:

    Code:
    ((milk *)product_milk[0])->edit_count_of_packets(5);
    
     
    #7695 herfleisch, 22 Sep 2013
    Last edited: 22 Sep 2013
  16. Sifon110

    Sifon110 New Member

    Joined:
    13 Mar 2011
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Спасибо большое :cool:
     
  17. Amery

    Amery New Member

    Joined:
    10 Mar 2013
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Ищу человека который может помочь с простыми задачами на C++
    Возможна оплата
    Связь в лс или icq 55669520
     
  18. ITdocer

    ITdocer New Member

    Joined:
    23 Aug 2011
    Messages:
    80
    Likes Received:
    0
    Reputations:
    -5
    сколько символов может максимально иметь имя переменной в C++?
     
  19. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    глупый вопрос. зависит от компайлера.
     
  20. Sifon110

    Sifon110 New Member

    Joined:
    13 Mar 2011
    Messages:
    34
    Likes Received:
    1
    Reputations:
    0
    Здравствуйте.

    Есть базовый класс:

    Code:
    class A
    {
       //
    };
    
    Есть производный от него класс:

    Code:
    class B : public A
    {
       //
    };
    
    ...
    
    A *mass[5];
    A *buff;
    
    ....
    
    for (int i=0; i<5; i++)
    {
        mass[i] = new B;
    }
    
    
    Так вот в чем вопрос: подскажите пожалуйста, как указать указатель buff на массив указателей mass? Чтобы можно было обратится к элементам массива mass как-то так: buff[0] - например. Спасибо.
     
Thread Status:
Not open for further replies.