Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
#1

проверьте, пожалуйста, мой первый код на c++ - C++

08.02.2010, 13:31. Просмотров 969. Ответов 9
Метки нет (Все метки)

Переучиваюсь с Delphi на C++
Посмотрите, пожалуйста, корректность, стиль программирования, и т.п. с точки зрения visual c++
Если бы этот код достался Вам на поддержку, что Вам не понравилось бы?
locker.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
 
// реализация блокировщика, который функционирует подобно критическим секциям
// но позволяет указывать максимальное время ожидания блокировки
class LOCKER
{
private:
    HANDLE  m_Mutex;            // Mutex используемый для блокировок
    int     m_DeadlockTime;     // максимально время ожидания блокировки
    LONG    m_RecursionCount;   // счетчик рекурсии (сколько раз вызывался lock из текущего потока)
    LONG    m_Thd;              // заблокировавший поток
public: 
    void lock();
    void unlock();
    LOCKER(const int pDeadlockTime); // параметр, максимальное время ожидания блокировки
    ~LOCKER();
};
locker.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "stdafx.h"
#include "windows.h"
 
#include "locker.h"
 
//пока заглушки
void trace(const char*){return;}
void error(const char*){return;}
 
LOCKER::LOCKER(const int pDeadlockTime)
{
    m_Mutex = CreateMutex(0, FALSE, 0);
    m_RecursionCount    = 0;
    m_Thd               = 0;
    m_DeadlockTime  = pDeadlockTime;
    trace("LOCKER::LOCKER");
}
 
LOCKER::~LOCKER()
{
    CloseHandle(m_Mutex);
    trace("LOCKER::~LOCKER");
}
 
void LOCKER::lock()
{
    LONG CurThd = GetCurrentThreadId();
    // блокировка осуществленна текущим потоком?
    if ( InterlockedCompareExchange(&m_Thd, 0, 0 ) == CurThd)
    {
        m_RecursionCount++;
        trace("LOCKER::lock рекурсия++");
    }
    else
    {
        trace("LOCKER::lock пытаюсь заблокировать Mutex");
        if (WAIT_OBJECT_0 == WaitForSingleObject(m_Mutex, m_DeadlockTime)) 
        {
            if (m_Thd != 0) error("LOCKER::lock (Thd!=0) чего быть не должно");
            m_Thd = CurThd;
            m_RecursionCount++;
            trace("LOCKER::lock lock");
        }
        else error("LOCKER::lock Deadlock");
    }
}
 
void LOCKER::unlock()
{
    if (GetCurrentThreadId() == m_Thd)
    {
        trace("LOCKER::unlock рекурсия--");
        if (0 == (--m_RecursionCount) )
        {
            trace("Освобождаю блокировку");
            m_Thd = 0;
            ReleaseMutex(m_Mutex);
        }
    } 
    else error("Пытаюсь освободить, хотя блокировки небыло, или была не из этого потока");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2010, 13:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос проверьте, пожалуйста, мой первый код на c++ (C++):

Написать код для игры НИМ. проверьте пожалуйста тот ли это код - C++
#include <string> using namespace std; int compChoose(int markers); int userChoose(int markers); int...

Проверьте код пожалуйста - C++
Цель работы Создать программу, которая вычисляет значения функции заданного диапазона; необходимо организовать ввод границ интервала,...

Проверьте пожалуйста код - C++
Программа должна проверить введенную строчку на соответствие слову как паролю.Условия Не меньше 8 символов, содержание латинских букв и...

Проверьте код пожалуйста - C++
В чем ошибка? Если он в ответе выдает только: Vvedite element massiva: A= #include "stdafx.h" #include <stdio.h> #include...

Проверьте пожалуйста код - C++
#include <iostream> #include<stdlib.h> // в этом файле содержатся функции rand() и srand() #include<time.h> ...

Проверьте пожалуйста код (C++) - C++
Вот я сам написал код(!)) Можете проверить: main() { printf("Content-type:text/html\n\n");

9
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
08.02.2010, 14:10 #2
WinAPI я пару раз в глаза видел, но всё-таки сделаю несколько замечаний.
1)
Цитата Сообщение от SkyN Посмотреть сообщение
int m_DeadlockTime; // максимально время ожидания блокировки
время в чём? секундах? миллисекунды?
2)
Цитата Сообщение от SkyN Посмотреть сообщение
LOCKER::~LOCKER()
{
CloseHandle(m_Mutex);
trace("LOCKER::~LOCKER");
}
объект LOCKER можно передавать в функцию/создавать массив LOCKER'ов? (т.е. копировать его можно?)
а т.к. явно конструктор копирования не указан, то будет использована его синтезируемая версия, которая почленно скопирует данные в классе. а это значит, что
Цитата Сообщение от SkyN Посмотреть сообщение
HANDLE m_Mutex;
будет указывать на один и тот-те адрес во всех экземплярах LOCKER. и соответственно при вызове деструктора для любого объекта все остальные объекты тоже будут изменены. так и задумывалось?
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.02.2010, 15:51 #3
конечно, можно всю программу написать исключительно прописными буквами, но существует какой-то "жаргон", а ты как раз спрашиваешь о "сопровождать". я бы, когда увидел
C++
1
2
class LOCKER
{
уже понял бы, что буду иметь головную боль...
0
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
09.02.2010, 00:41  [ТС] #4
to zim22:
1) Спасибо, поправил
2) ОГРОМНОЕ СПАСИБО, это именно те грабли, которых я боюсь, подсмотрел как реализован CObject, поправил.

to novi4ok
Спасибо, поправил, но меня смущает, что глядя на название я не понимаю это название типа или переменной. К тому же, как я понял изучая исходный код, давать переменной и типу имена различающиеся только реестром букв нормальная практика. К сожалению, я ни где не нашел свода хорошего тона именования объектов, буду благодарен если ткнете носом. Или вышлите на nebotov сабака маил ру.

Возможно ли использовать классы CTime, CString в проекте, при создании которого указывалась что он не MFC?

Текущий h файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
 
// реализация блокировщика, который функционирует подобно критическим секциям
// но позволяет указывать максимальное время ожидания блокировки
class Locker
{
private:
    HANDLE  m_Mutex;            // Mutex используемый для блокировок
    int     m_DeadlockMilliseconds;     // максимально время ожидания блокировки (миллисекунд)
    LONG    m_RecursionCount;   // счетчик рекурсии (сколько раз вызывался lock из текущего потока)
    LONG    m_Thd;              // заблокировавший поток
// вызываем ошибку при попытке копирования/присвоения
    Locker(const Locker& objectSrc);            // no implementation
    void operator=(const Locker& objectSrc);    // no implementation
public: 
    void lock();
    void unlock();
    explicit Locker(const int pDeadlockMilliseconds=1000); // параметр, максимально время ожидания блокировки
    ~Locker();
};
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 00:52 #5
google-> guidelines code c++

а вот - с большим юмором обратные рекомендации: как писать код, в котором никто не сможет разобраться. рекомендую в минуты стресса для поднятия духа:

http://mindprod.com/jgloss/unmain.html

использование mfc можно включить уже после создания проекта
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
09.02.2010, 09:49 #6
Цитата Сообщение от SkyN Посмотреть сообщение
explicit Locker(const int pDeadlockMilliseconds=1000);
explicit запрещает неявное преобразование типов.
т.е. ты не сможешь написать
C++
1
Locker l = 10;
(хотя ты полюбому не сможешь это написать, т.к. у тебя конструктор копирования объявлен private )

конструктор с одним параметром наоборот разрешает его.
так что или убери explicit, или значение параметра по умолчанию.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.02.2010, 10:01 #7
SkyN, первый код и сразу своя блокировка потоков? А готового мутекса нет? Или он плох? Чем именно?

Добавлено через 2 минуты
Хотя, у меня тоже своя коряга каталогов коде, кажется, в десятом, а может и раньше.
0
SkyN
1 / 1 / 0
Регистрация: 08.02.2010
Сообщений: 16
09.02.2010, 10:57  [ТС] #8
to zim22:
я хочу чтобы можно было написать
C++
1
2
3
Locker lock(); // т.е. возьмется значение по умолчанию
//или
Locker lock2(5000);
но нельзя
C++
1
2
3
4
5
6
7
8
9
10
Locker lock = 5000; // нельзя (т.к. не понятна логика преобразования int к объекту блокировка)
//или
Locker lock(); // <- это можно
Locker lock2 = lock; // нельзя (вызвав деструктор любого объекта, испортишь другой)
//или
Locker lock2(); // <- это можно
lock2 = 5000;   // нельзя (т.к. не понятна логика преобразования int к объекту блокировка)
//или
Locker lock3(); // <- это можно
functionName(lock3); // нельзя, (т.е. не хочу чтобы при выходе из функции закрылся хендл мьютекса)
to taras atavin:
главная цель переучивания на си (для меня), заключается в использовании большего количества готовых кусков кода )
но для начала я хочу переделать свою, уже готовую, программу, которая в данный момент написана на Delphi.
Готовые решения (искал для Delphi, возможно для с++ они есть, пока я не очень хорошо ориентируюсь в библиотеках с++) мне не подошли т.к.:
1) Построенные на мьютексах, не позволяют использовать рекурсию
2) Построенные на критических секциях, не позволяют отлавливать deadlock'и
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 11:00 #9
Цитата Сообщение от SkyN Посмотреть сообщение
главная цель переучивания на си (для меня), заключается в использовании большего количества готовых кусков кода )
тогда с здесь ни при чем: кода много, но повторно его использовать не всегда просто. прямой путь тебе - в java или c#.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
09.02.2010, 11:15 #10
Цитата Сообщение от SkyN Посмотреть сообщение
Готовые решения мне не подошли
посмотри библиотеку boost
с большой степенью вероятности там уже есть готовые решения, которые подойдут.

Цитата Сообщение от SkyN Посмотреть сообщение
Locker lock(); // т.е. возьмется значение по умолчанию
здесь ты не определяешь переменную lock.
это объявление функции, которая называется lock, ничего не принимает и возвращает объект типа Locker

Цитата Сообщение от SkyN Посмотреть сообщение
Locker lock2 = lock; // нельзя (вызвав деструктор любого объекта, испортишь другой)
здесь деструктор не вызывается. вызывается конструктор копирования.
0
09.02.2010, 11:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2010, 11:15
Привет! Вот еще темы с ответами:

Проверьте пожалуйста код на ошибку - C++
Всем привет , программа при вводе сравнивает является ли слово Палиндромом или нет. Проблема 1)Если я введу например aabcaa то...

Проверьте пожалуйста код на правильность ! - C++
2. Даны два вектора и найти угол между ними и модуль векторного произведения векторов X и Y. При вычислении использовать...

Проверьте код пожалуйста на цикл в С++ - C++
Почему он не выдает мне полную сумму? Где здесь не правильно написано #include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;conio.h&gt; int...

Проверьте пожалуйста код на правильность ! ! ! - C++
2. Дан массив размера 5 x 6 с элементами целого типа. Написать программу для вычисления числа элементов массива кратных 3. За ранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru