1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

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

18.12.2015, 18:21. Показов 1983. Ответов 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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,041
Записей в блоге: 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru