Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Указатели c++1z

18.12.2015, 18:21. Показов 1946. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Случайно наткнулся. Вообще не понял. Это что?
C++
1
int *p = new int [(int*) new int];
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2015, 18:21
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++,...

31
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
18.12.2015, 20:19  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
И в его понимании это эквивалентно следующему коду:
а что удаляет delete ????
C++
1
2
3
4
while (1){
    int *p = new int [new int[1000]{0}];
     delete []p;
  }
Он, типа, в курсе о безымянном и ничему не известному new???
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2015, 20:25
Цитата Сообщение от daslex Посмотреть сообщение
а что удаляет delete ????
Насколько я могу судить - удаляет его оптимизатор. Т.к. констекст использования ему виден.
С -O0 delete[] на месте.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
18.12.2015, 20:51  [ТС]
Тогда еще вот это. (Я не умею ассемблер анализировать)
C++
1
2
3
4
const int N=5;
    int *x;
    int *p = new int [ x = new int[N]{11,12,13,14,15}]{};
    for (int i=0;i<N;i++) cout << x[i] << '\n';
Я думал, что x будет указателем на массив и он заполнится значениями, благодаря списку инициализации, но этого не произошло. Почему?

Добавлено через 12 минут
Смешивается с lambda-expression
из-за этого странные эффекты.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2015, 20:55
Цитата Сообщение от daslex Посмотреть сообщение
Я думал, что x будет указателем на массив и он заполнится значениями, благодаря списку инициализации, но этого не произошло. Почему?
Ассемблер тут уже не играет роли. Это чистой воды языковая штука.
new T[expr] -> T *
new T[expr][constant-expr] -> T(*)[constant-expr]
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
18.12.2015, 21:24  [ТС]
мне так непонятно. Да и выводы это попробовать только из поста про: "Clang, как настоящий мужик, молча терпит боль"
Я посмотрел во что он это превращает и подумалось, что можно это превращение превратить в "кашу", которая скомпилируется. С моей т.з. вся эта чисто языковая штука должна была вылиться в вывод на экран значений "11,12,13,14,15". Но я этого не увидел.

Посмотрел еще. (тут уже жесткая смесь [] от new и лямбд)
C++
1
2
3
4
5
const int N=5;
    int *x;
    int *p = new int [ x = new int[N]{8,2,3,4,5} ](){ return {11,12,14} }();
 
    for (int i=0;i<N;i++) cout << x[i] << '\n'; //Ну и что оно покажет? Ничего, что можно было ждать.
А почему так вышло? Во всем точка-запятая виновата. Отсюда мои выводы таковы, что происходит "кровосмешение разнородных expression"

Добавлено через 19 минут
Еще вот такое тоже баг?
C++
1
int *p = new int [new int[N]]{}{}{}{}{}{}{};
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.12.2015, 21:26
Цитата Сообщение от DrOffset Посмотреть сообщение
Clang, как настоящий мужик, молча терпит боль.
терпила чтоли?
Цитата Сообщение от DrOffset Посмотреть сообщение
И в его понимании это эквивалентно следующему коду:
то есть один new прошел просто так, а второй вообще выкинуло?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.12.2015, 21:30
Цитата Сообщение от DrOffset Посмотреть сообщение
Я знаю что происходит.
Баг репорт накатал уже?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2015, 22:18
Цитата Сообщение от Tulosba Посмотреть сообщение
Баг репорт накатал уже?
Ага.
Цитата Сообщение от Croessmah Посмотреть сообщение
а второй вообще выкинуло?
Некорректный выкидывает.
Цитата Сообщение от daslex Посмотреть сообщение
С моей т.з. вся эта чисто языковая штука должна была вылиться в вывод на экран значений "11,12,13,14,15". Но я этого не увидел.
Я тебе советую уже перестать гадать и что-нибудь почитать
Могу только одно сказать. Первоначальный пример к тому, что ты пишешь сейчас не имеет особого отношения.
То что возвращает new-expr никак не изменится от того, что ты запихнешь в первый [ ]. Это к вопросу из 23 поста.
Цитата Сообщение от daslex Посмотреть сообщение
Отсюда мои выводы таковы, что происходит "кровосмешение разнородных expression"
Ад какой-то написан. Хочешь сказать это компилируется?

Добавлено через 6 минут
daslex, да, вижу компилируется.
Сразу скажу, компилироваться это не должно. Происходит это видимо потому, что clang`у в этом выражении сносит крышу и он просто игнорирует все до точки с запятой. Если убрать из [] баговую конструкцию с указателем, то твой ад перестает собираться.
3
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
18.12.2015, 22:22
некоторые конторы на C++11 то не пишут, а тут уж 17)
visual studio поддерживает с++1z?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.12.2015, 22:26
Цитата Сообщение от daslex Посмотреть сообщение
Еще вот такое тоже баг?
Это все следствия одного и того же явления. Clang`у сносит крышу и он не разбирает дальше это выражение вообще. Подозреваю даже такое прокатит.
C++
1
2
3
4
5
int main()
{
    int * s = 0;
    int * p = new int [s] abracadabra ahalay-mahalay!;
}
Добавлено через 56 секунд
Ну точно: магия.

Добавлено через 2 минуты
Цитата Сообщение от tapochka Посмотреть сообщение
некоторые конторы на C++11 то не пишут, а тут уж 17)
Ну вот моя контора, например, не пишет.
У нас самый новый компилятор gcc 4.1.3

Цитата Сообщение от tapochka Посмотреть сообщение
visual studio поддерживает с++1z?
Если только чуть-чуть.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
18.12.2015, 22:31
Цитата Сообщение от DrOffset Посмотреть сообщение
У нас самый новый компилятор gcc 4.1.3
лично меня заставляют писать иногда на 2005 студии, так что...
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
19.12.2015, 12:32
Цитата Сообщение от DrOffset Посмотреть сообщение
Ага.
Приложил туда маленький патч как пример. Вроде фиксит проблему, если я ничего не упустил.
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
  // C++98 5.3.4p6: "The expression in a direct-new-declarator shall have
  //   integral or enumeration type with a non-negative value."
  // C++11 [expr.new]p6: The expression [...] shall be of integral or unscoped
  //   enumeration type, or a class type for which a single non-explicit
  //   conversion function to integral or unscoped enumeration type exists.
            // ДА-ДА! В ЭТОМ СТАНДАРТЕ КОЕ-ЧТО ИЗМЕНИЛОСЬ!
  // C++1y [expr.new]p6: The expression [...] is implicitly converted to
  //   std::size_t.
  if (ArraySize && !ArraySize->isTypeDependent()) {
    ExprResult ConvertedSize;
             // НУ ТЕПЕРЬ ТОЧНО ЯСНО, ПОЧЕМУ ОНО ФИГОВО РАБОТАЛО С С++14 И ВЫШЕ
    if (getLangOpts().CPlusPlus14) {
      assert(Context.getTargetInfo().getIntWidth() && "Builtin type of size 0?");
 
      ConvertedSize = PerformImplicitConversion(ArraySize, Context.getSizeType(),
                        AA_Converting);
 
                     // ДОБАВИЛ МАЛЕНЬКИЙ ФИКС - ВРОДЕ ТЕПЕРЬ РАБОТАЕТ
      if (ConvertedSize.isInvalid())
        Diag(StartLoc, diag::err_array_size_not_integral)
          << getLangOpts().CPlusPlus14
          << ArraySize->getType()
          << ArraySize->getSourceRange();
 
      if (!ConvertedSize.isInvalid() && 
          ArraySize->getType()->getAs<RecordType>())
        // Diagnose the compatibility of this conversion.
        Diag(StartLoc, diag::warn_cxx98_compat_array_size_conversion)
          << ArraySize->getType() << 0 << "'size_t'";
    } else {
Добавлено через 8 часов 6 минут
А еще лучше так, чтобы не выдавать сообщение, свойственное старым стандартам:
Bash
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
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td
index 82f5121..15422bd 100644
--- a/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/include/clang/Basic/DiagnosticSemaKinds.td
@@ -5505,6 +5505,8 @@ def err_placement_new_non_placement_delete : Error<
 def err_array_size_not_integral : Error<
   "array size expression must have integral or %select{|unscoped }0"
   "enumeration type, not %1">;
+def err_array_size_bad_conversion : Error<
+  "array size expression cannot be implicitly converted from type %0 to type %1">;
 def err_array_size_incomplete_type : Error<
   "array size expression has incomplete class type %0">;
 def err_array_size_explicit_conversion : Error<
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 01966d5..f6ad248 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -1368,6 +1368,10 @@ Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
       ConvertedSize = PerformImplicitConversion(ArraySize, Context.getSizeType(),
                                                AA_Converting);
 
+      if (ConvertedSize.isInvalid())
+        Diag(StartLoc, diag::err_array_size_bad_conversion)
+          << ArraySize->getType() << "'size_t'" << ArraySize->getSourceRange();
+
       if (!ConvertedSize.isInvalid() &&
           ArraySize->getType()->getAs<RecordType>())
         // Diagnose the compatibility of this conversion.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2015, 12:32

Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком
Смысл задания в том, что нужно отсортировать массив структур из 3х полей по сумме координат есть структура struct XYZ{ ...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?

Отсортировать массив и вывести на экран (массивы и указатели на указатели)
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru