Сообщения v0r0n
Стиль или как правильно
Здравствуйте. Какой способ получения контейнера из класса предпочтительнее для каждого из вариантов списка:
- по значению;
- без копирования, с возможностью редактирования полученного контейнера;
- без копирования и без возможности редактирования.
#ifndef MYCLASS_H
#define MYCLASS_H
#include <vector>
class MyClass
{
public:
MyClass();
std::vector<int> getVec0();
std::vector<int> &getVec1();
const std::vector<int> &getVec2();
void getVec3(std::vector<int>::iterator &itBeg, std::vector<int>::iterator &itEnd);
void getVec4(std::vector<int>::const_iterator &itBeg, std::vector<int>::const_iterator &itEnd);
void getVec5(std::vector<int> &vec);
void getVec6(std::vector<int> *vec);
private:
std::vector<int> myVec;
};
#endif // MYCLASS_H
И ещё вопросик, насколько допустимо объявление структур и функций не являющихся членами класса в *.h, но используемых в реализации функций-членов в *.cpp? Например, есть у меня обёртка для функций boost::spirit, заголовочные файлы и структуры, определяющие грамматики, объявлены только в parser.cpp и никак не фигурируют в parser.h.
/* parser.h */
//...
class MyParser
{
public:
void getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd);
private:
vector<int> myCon;
};
//...
/* parser.cpp */
#include "myparser.h"
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
//...
void foo(vector<int> &vec, int val)
{
//...
}
template <typename Iterator>
struct MyGrammar
: qi::grammar<Iterator, vector<int>(), qi::space_type>
{
//...
};
void MyParser::getMyCon(string str, vector<int>::const_iterartor &itBegin, vector<int>::const_iterator &itEnd)
{
//...
}
Значение по-умолчанию для ссылки на итератор
Всем здрасте. Господа, подскажите, пожалуйста, как можно задать значение по-умолчанию для аргумента it.
//...
class MyClass
{
public:
MyClass();
int setBase(const string &str, string::iterator &it /* = ЧТО? */);
//...
};
C память
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
/* Печать элемента базы данных пользователей */
static void print_pwent (const struct passwd *pw) {
printf ("Имя пользователя: %s\n", pw->pw_name);
printf ("Идентификатор пользователя: %d\n", pw->pw_uid);
printf ("Идентификатор группы: %d\n", pw->pw_gid);
printf ("Начальный каталог: %s\n", pw->pw_dir);
printf ("Начальная программа: %s\n", pw->pw_shell);
}
int main (void) {
char *lgnm; /* Имя текущего пользователя */
struct passwd *pw; /* Данные о текущем пользователе */
/* Поиск и печать информации о текущем пользователе */
if ((lgnm = getlogin ()) == NULL || (pw = getpwnam (lgnm)) == NULL) {
fprintf (stderr, "\nНе удалось найти информацию о текущем пользователе\n");
return 1;
}
printf ("\nИнформация о текущем пользователе\n");
print_pwent (pw);
/* То же для пользователя root */
if ((pw = getpwuid ((uid_t) 0)) == NULL) {
fprintf (stderr, "\nНе удалось найти информацию о пользователе root\n");
return 1;
}
printf ("\nИнформация о пользователе root\n");
print_pwent (pw);
return 0;
}
При вызове getpwnam память под pw выделяется внутри функции, как я понимаю, но не ясно где она освобождается?
C++ &*
Вот коментарий из stl_iterator.h
// 24.4.1 Reverse iterators
/**
* Bidirectional and random access iterators have corresponding reverse
* %iterator adaptors that iterate through the data structure in the
* opposite direction. They have the same signatures as the corresponding
* iterators. The fundamental relation between a reverse %iterator and its
* corresponding %iterator @c i is established by the identity:
* @code
* &*(reverse_iterator(i)) == &*(i - 1)
* @endcode
*
* <em>This mapping is dictated by the fact that while there is always a
* pointer past the end of an array, there might not be a valid pointer
* before the beginning of an array.</em> [24.4.1]/1,2
*
* Reverse iterators can be tricky and surprising at first. Their
* semantics make sense, however, and the trickiness is a side effect of
* the requirement that the iterators must be safe.
*/
Объясните, пожалуйста, смысл данного выражения:
&*(reverse_iterator(i)) == &*(i - 1)
И что означает &* ?
Оператор преборазования типа С++
Господа, подскажите, пожалуйста, какое назначение имеет квалификатор const перед типом к которому приводится значение?
operator const T() const
{
T t = T();
for (unsigned i = 0; i < sizeof(T); i++)
t |= T(bytes[i]) << (i << 3);
return t;
}
Перемещено beastie из general
Указатель на функцию, возвращающую указатель
Господа, что-то переклинило от бессонной ночи)
uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length);
Правильно я понимаю что приведённая выше строчка кода является указателем на функцию, возвращающаю указатель на целочисленную переменную?
STM32F4 Таймер
Здравствуйте, господа. Запускаю на STM32F4Discovery следующую программу:
#include "stm32f4xx.h"
int main()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD, GPIO_Pin_15);
/*
HCLK: 168 MHz
APB1 Prescaler: 4 => CK_PSC = 2 * 42 MHz = 84 MHz
*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1; // CK_CNT = 1 MHz
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // CK_CNT / 1000 = 1 kHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM5, ENABLE);
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM5, ENABLE);
NVIC_EnableIRQ(TIM5_IRQn);
while (1) { }
}
void TIM5_IRQHandler()
{
if (TIM_GetITStatus(TIM5, TIM_IT_Update) == SET){
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
GPIO_ToggleBits(GPIOD, GPIO_Pin_15);
}
}
Именование .h и .cpp файлов при использовании Qt
Господа, подскажите как по правилам хорошего тона именовать заголовочные файлы?
HeaderFile.h
headerFile.h
header_file.h
headerfile.h
передача функции как аргумента
Господа, такая проблема...
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QString>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void foo (int (*bar)(int), int);
int foo2(int);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
foo(foo2, 4);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::foo(int (*bar)(int), int i)
{
(*bar)(i);
}
int MainWindow::foo2(int i)
{
return i;
}
$ qmake
$ make
/usr/bin/uic mainwindow.ui -o ui_mainwindow.h
g++ -c -m64 -pipe -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/linux-g++-64 -I. -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I/usr/include/qwt -I. -I. -o main.o main.cpp
g++ -c -m64 -pipe -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/linux-g++-64 -I. -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I/usr/include/qwt -I. -I. -o mainwindow.o mainwindow.cpp
mainwindow.cpp: In constructor «MainWindow::MainWindow(QWidget*)»:
mainwindow.cpp:10:16: ошибка: нет подходящей функции для вызова «MainWindow::foo(<unresolved overloaded function type>, int)»
mainwindow.cpp:10:16: замечание: candidate is:
In file included from mainwindow.cpp:1:0:
mainwindow.h:22:10: замечание: void MainWindow::foo(int (*)(int), int)
mainwindow.h:22:10: замечание: no known conversion for argument 1 from «<unresolved overloaded function type>» to «int (*)(int)»
make: *** [mainwindow.o] Ошибка 1
назначение клавиш в Emacs
господа, подскажите, пожалуйста, как в emacs на f5, к примеру, можно повесить следующие команды:
1. сохранение содержимого буфера(ов)
2. выполнение shell-command с аргументами
З.Ы.: имеется ввиду сразу оба действия на одну клавишу
разработка под ОС реального времени
Разработка под ОСРВ отличается от онной под ОС общего назначения?
Для ОСРВ процесс должен выполниться за определённый промежуток времени, иначе он считается «битым» и система предпринимает по отношению к нему особые инструкции? Если так, то ОСВР должна как-то определять какой интервал на исполнение этого процесса нужно выделить, но как это достигается?