Russian Qt Forum
Ноябрь 24, 2024, 03:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5 ... 7   Вниз
  Печать  
Автор Тема: как правильней писать указатель?  (Прочитано 42169 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Февраль 14, 2011, 18:00 »

А какой смысл в проверке?
Код
C
int * p = &test[0];
if (p) {
...
}
 
Тот что вектор может быть пуст

смотря что вы будете с ним делать..
я так ппонял, что вы будете им:
а) обходить им вектор
б) приводить его к указателю на что-нить другое и писать целую структуры в массив и разбирать её...
в) какая-то старая сишная функция, которой нужен int* в качестве параметра
на этом разумные причины кончаются и это всё ИМХО хакерство (ну быть может крове в).

если вы знаете ещё адекватные причины, то можете поделиться...
Поделюсь
Код
C++ (Qt)
void MyClass::Calc( int iInput, int * oOut1, int * oOut2 );
 
И что, oOut1, oOut2 не могут быть адресами элементов вектора(ов)?

Вообще главная цель вектора - совместимость с "С" массивом (и для этого жертвуется многим).
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #31 : Февраль 14, 2011, 18:02 »

Цитировать
write (fd, &vec
  • , vec.size ());
Нигде в стандартах не оговаривается, что все элементы массива лежат в памяти друг за дружкой начиная с указанного адреса.
К тому же размерность будет vec.size()*sizeof(vec[0])
Записан

Qt 5.11/4.8.7 (X11/Win)
brankovic
Гость
« Ответ #32 : Февраль 14, 2011, 18:04 »

Цитировать
write (fd, &vec
  • , vec.size ());
Нигде в стандартах не оговаривается, что все элементы массива лежат в памяти друг за дружкой начиная с указанного адреса.
К тому же размерность будет vec.size()*sizeof(vec[0])

Очень даже оговаривается. Про размерность вы правы (просто я подразумевал vector <char>),
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Февраль 14, 2011, 18:08 »

Цитировать
write (fd, &vec
  • , vec.size ());
Нигде в стандартах не оговаривается, что все элементы массива лежат в памяти друг за дружкой начиная с указанного адреса.
К тому же размерность будет vec.size()*sizeof(vec[0])
Из "к тому же" вытекает что "друг за дружкой", т.к. невозможно поддерживать/заполнять "дырки" без всяких дополнительных данных.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #34 : Февраль 14, 2011, 18:11 »

Цитировать
Очень даже оговаривается.
Будьте любезны, ткните носом.

Цитировать
Из "к тому же" вытекает что "друг за дружкой", т.к. невозможно поддерживать/заполнять "дырки" без всяких дополнительных данных.
Это была ремарка. А вот что одно вытекает из другого, насколько мне известно, стандартами не оговаривается.
« Последнее редактирование: Февраль 14, 2011, 18:13 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Февраль 14, 2011, 18:20 »

Немного др тема:

А есть ли (стандартный) контейнер с поддержкой прямого доступа (оператор []), но который лишен недостатков/громоздкости вектора (за счет того что к "С" массиву он не приводится)?. Мне такой часто бывает нужен.

Спасибо
Записан
Fat-Zer
Гость
« Ответ #36 : Февраль 14, 2011, 18:22 »

А какой смысл в проверке?
Код
C
int * p = &test[0];
if (p) {
...
}
 
Тот что вектор может быть пуст
не надёжно:
Код
C++ (Qt)
std::vector<int> vec;
vec.resize(1);
vec.resize(0);
int *p=&vec[0]; // p!=0
 

все примеры это функции в си-стиле и ИМХО правильнее было бы написать:
Код
C++ (Qt)
MyClass mc;
if(test.size()>=26)
 mc.Calc(iInput, &test[25],  &test[26] );
а вообще одна функция - одно возвращаемое значение
Цитировать
Очень даже оговаривается.
Будьте любезны, ткните носом.
+1
« Последнее редактирование: Февраль 14, 2011, 19:05 от Fat-Zer » Записан
brankovic
Гость
« Ответ #37 : Февраль 14, 2011, 18:25 »

Цитировать
Очень даже оговаривается.
Будьте любезны, ткните носом.

А вы так уверены, что и поискать лень? Времени нету сейчас. Вечером запощу.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #38 : Февраль 14, 2011, 18:55 »

Цитировать
А вы так уверены, что и поискать лень? Времени нету сейчас. Вечером запощу.
Своими заявлениями вы мою уверенность поставили под сомнение.
Поискал и наткнулся на C++ Standard Library Defect Report List (Revision D73), где есть "69. Must elements of a vector be contiguous? Section: 23.4.1 [vector] Status: TC1 Submitter: Andrew Koenig Opened: 1998-07-29 Last modified: 2010-10-29". Судя по дате изменения всё не так однозначно.
Записан

Qt 5.11/4.8.7 (X11/Win)
brankovic
Гость
« Ответ #39 : Февраль 14, 2011, 19:25 »

Section: 23.4.1 [vector] Status: TC1 Submitter: Andrew Koenig Opened: 1998-07-29 Last modified: 2010-10-29". Судя по дате изменения всё не так однозначно.

Это значит лишь то, что Эндрю Кёнег недоволен состоянием дел. Цитата из стандарта:

Цитировать
23.2.4 Class template vector
[lib.vector]
1 A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized)
 constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage
management is handled automatically, though hints can be given to improve efficiency. The elements of a
vector are stored contiguously
, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

жирным шрифтом выделенно ближе к концу. Что тут неоднозначного?

Стандарт 2003 года, ISO/IEC 14882, он-лайн версии с ходу не нашёл.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #40 : Февраль 14, 2011, 19:35 »

The elements of a vector are stored contiguously
На самом деле реализовать обратное действительно будет наверное трудно)
Всё, спасибо, вопрос закрыт.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #41 : Февраль 14, 2011, 21:37 »

Не хочу навязываться, но мой еще "открыт".

Немного др тема:

А есть ли (стандартный) контейнер с поддержкой прямого доступа (оператор []), но который лишен недостатков/громоздкости вектора (за счет того что к "С" массиву он не приводится)?. Мне такой часто бывает нужен.

Спасибо
Ну может не совсем стандартный, а где-то в бусте или др. месте ?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #42 : Февраль 14, 2011, 21:45 »

Цитировать
который лишен недостатков/громоздкости вектора (за счет того что к "С" массиву он не приводится)
Получается, что исходя из стандарта С++ 2003, ISO/IEC 14882 эта проблема вас не должна волновать.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Февраль 14, 2011, 21:51 »

Получается, что исходя из стандарта С++ 2003, ISO/IEC 14882 эта проблема вас не должна волновать.
Наверное я неверно пояснил. Я готов смириться с тем что "С" массива из контейнера не получу. Но взамен хотелось бы чтобы контейнер не жрал память как конь и не менял адреса элементов когда ему вздумается. Есть ли такой?
Записан
Anchorite
Гость
« Ответ #44 : Февраль 16, 2011, 18:28 »

У std::vector есть конструктор, создающий вектор заданного размера все элементы которого инициализированны заданным значением.
Не вставляй и не удаляй из него элементы.
Если необходимо получить из этого вектора массив - берешь адрес нулевого элемента.
« Последнее редактирование: Февраль 16, 2011, 18:44 от Anchorite » Записан
Страниц: 1 2 [3] 4 5 ... 7   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.351 секунд. Запросов: 23.