LINUX.ORG.RU

Правильная расшифровка int (*a)[2] = new int[n][2];

 , ,


0

1

Имеется определение:

int (*a)[2] = new int[n][2];

И есть два варианта его понимания:

1. Создается переменная-указатель на 2 массива из значений типа int, что может рассматриваться и как указатель на массив из двух элементов типа int (так как общий размер массива одинаковый)

2. Запись int (*a)[2] представляет указатель на массив из двух элементов типа int.

Какой вариант однозначно правильный?

★★★★★
Ответ на: комментарий от MOPKOBKA

Начнем с того, что если тебе нужна прям такая байтоебля и оптимизации(память обязательно одним куском, вот это вот всё), то тогда тебя ждет удивительный мир C++-аллокаторов и кастомных классов.

И да, с 99,(9)% вероятностью так под капотом будет вот эти вот чудо-конструкции из C.

Ты, конечно, можешь возразить - зачем использовать какие-то ненужные абстракции С++, если можно хреначить low level код в C-семантике? Но абстракции в C++ как раз и нужны, чтобы не хреначить low level код без нужды(преждевременной оптимизации).

А то мы так до программирования в машкодах докатимся, спасибо, не надо. Низкоуровневая анальщина нужна в очень специфическом наборе случаем(микроконтроллеры, ядра, вот это вот всё).

Тащить ее в прикладное ПО никто технически не запрещает конечно, но это сравнимо с сексом в гамаке.

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

Начнем с того, что если тебе нужна прям такая байтоебля и оптимизации(память обязательно одним куском, вот это вот всё), то тогда тебя ждет удивительный мир C++-аллокаторов и кастомных классов.

А причем тут аллокаторы, new тоже может использовать кастомный аллокатор, просто добавив «умных слов» задачу не решишь. Я написал в общем то конкретный запрос.

чудо-конструкции из C.
машкодах

Скажу прямо, тут много кто в треде ответил по смыслу идентично как ты. Ты просто увидел то что тебе непонятно, и вместо того что бы узнать как описываются типы в С, обиделся, и начал утверждать что это никому не нужно, или как тут выше писали «уволить», «ударить», ну в общем типичное такое поведение обезьяна, сам иногда сталкиваюсь с желанием такое ответить, но потом вспоминаю чем это вызывано.

Так вот, никакие тебе аллокаторы не помогут сделать массив который я прошу, а если знать как определяются типы в C/C++ то можно это сделать в одну строчку без всяких абстракций, и еще, где же ты возьмешь эти классы? А их только писать самому, но тогда ты поимеешь даже больше проблем, ведь придется реализовывать массив с нуля со всем его поведением, и это очень серьезная работа.

Поэтому наиболее правильным решением будет не обижаться на легкие вопросы на которые не можешь дать ответ, а просто узнать про описание типов, а конкретнее:

1. Как и где ставится const
2. Как определяются указатели на функции, или указатели на функции которые принимают функции
3. Как определяются массивы, обычные, VLA

Обычно с этим проблемы когда доходит до чтения или записи типов. Но нужно пройтись всего по 3 темам, и не нужно будет кидаться рандомными словами про аллокаторы когда встретишься с простейшей задачей объявления массива.

Никакой сложности в этом нету, никаких дополнительных проверок и надежности тебе свои массивы в виде классов не дадут.

Но конечно можно и без этого прекрасно жить, не каждому нужно сейчас создавать массивы или что то читать, обычно просто занимаются различными вариациями memcpy, например послать запрос сервису, получить данные, взять некоторые, и отправить другому сервису. Но злиться из за использования возможностей языка, когда это в тему, это слишком.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

в общем типичное такое поведение обезьяна

О, а вот и ярлыки подъехали. Конструктивненько! Я, кстати, если ты не заметил, ни на тебя, ни на ТСа с криками «уволить» не наезжал.

Ты просто увидел то что тебе непонятно
Поэтому наиболее правильным решением будет не обижаться на легкие вопросы на которые не можешь дать ответ,

Мне эта конструкция абсолютно понятна в рамках C. Мне нихрена непонятно зачем в рамках описанной ТС задачи тащить это говно в C++. Чтобы что?

Вот тебе аналогия: в C можно использовать ассемблерные вставки(а я, будучи еще школьником, дико угарал по ассемблеру - настолько что написал GUI-приложение аналог taskmgr.exe на чистом ассемблере с использованием WinAPI). Итак, о чём это я. Ах, да:

1) в C можно использовать ассемблерные вставки;
2) В ассемблерных вставках можно реализовать циклы;
3) Стоит ли выкинуть нахрен циклы из C++ и использовать вместо них ассемблерные вставки с циклами?

Никакой сложности в этом нету, никаких дополнительных проверок и надежности тебе свои массивы в виде классов не дадут.

см. выше мой пассаж про выкидывание циклов

Но злиться из за использования возможностей языка, когда это в тему, это слишком.

Так оно как раз и НЕ В ТЕМУ. Вот что ты получаешь, отказываясь от использования классов в C++ для этой задачи?

Читабельность кода? Нет(не надо меня убеждать в обратном, я насмотрелся на творения всяких гуру, которые мне читать было непросто, а моим коллегам подчас и вовсе невозможно).

Производительность? Да, но не занимаешься ли ты преждевременной оптимизацией? Выделение памяти одним куском - это в современном мире очень часто(но не только, конечно) - борьба с фрагментацией оперативки. А это - объемы данных в десятки гигабайт.

В задаче намечаются такие объемы? Если да, тогда конечно можно подумать о том, чтобы спуститься пониже(благо C++ позволяет) и позаниматься байтоебством. Но не раньше. И не надо заливать мне про то, что код надо сразу писать, чтобы он скейлился под увеличение объемов данных в 10, тысячу, миллион раз, не надо.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Мне нихрена непонятно зачем в рамках описанной ТС задачи тащить это говно в C++. Чтобы что?

Я выше описал другую задачу и предложил тебе дать решение для нее, что там у ТС я не знаю, может там в реальности другая размерность, другие размеры, и научные расчеты, а может ему нужно выделить массив int 2x2 и это можно сделать даже на стеке, поэтому рассуждать о его задаче бессмысленно, я предложил свою но тебе видимо о ней рассуждать неинтересно или ты пропустил, в общем тогда мне ответить нечего, говорим о разном.

Очевидно что там где можно легко и удобно использовать std::array или std::vector их использовать конечно же нужно. Но они не всегда подходят.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Ни в C, ни в C++ так никто не пишет.

Код должен +- быть такой:


#define SIZE_X 100
#define SIZE_Y 100

#define AT2D(ARRAY, X, Y) ARRAY[(X) + (Y)*SIZE_X]

int
main (void)
{
  int* array = malloc(sizeof(int) * SIZE_X * SIZE_Y);
  if (!array)
  {
    perror("Array allocation error");
    exit(1);
  }
  
  AT2D(array, 3, 4) = 5;
  
  free(array);

  return 0;
}

А на C++ соответственно +- такой:

template<class T>
class Matrix2D
{
private:
  Vector<T> m_data;
  const size_t m_x_size, m_y_size; 
public:
  Matrix2D (size_t x, size_t y) : m_x_size(x), m_y_size(y), m_data(x*y)
  {
  }
  
  T& operator() (size_t x, size_t y)
  {
    return m_data[m_x_size*y + x];
  }

  T operator() (size_t x, size_t y) const
  {
    return m_data[m_x_size*y + x];
  }

};

zx_gamer ★★★
()
Последнее исправление: zx_gamer (всего исправлений: 1)