Как получить размер Массива? [дубликат]

Вы можете добавить свой обработчик перенаправления в метод render метода app/Exceptions/Handler.php, как показано ниже:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) {

       return \Illuminate\Support\Facades\Redirect::back()->withErrors(['msg' => 'The Message']);
    }

    return parent::render($request, $exception);
}

Затем он отправит вам ошибки во флэш-сессии, которые будут показаны на веб-интерфейсе.

10
задан Ivan Prodanov 17 May 2009 в 08:43
поделиться

5 ответов

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

Обычным решением этого вопроса, если он действительно представляет проблему, является использование std :: vector класс из стандартной библиотеки, который намного ближе к управляемому (C #) массиву, т.е. хранит его длину и дополнительно имеет несколько полезных функций-членов (для поиска и управления).

Использование std :: vector , вы можете просто вызвать vector.size () , чтобы получить его размер / длину.

14
ответ дан 3 December 2019 в 14:11
поделиться

Это действительно зависит от того, что вы подразумеваете под «массивом». Массивы в C ++ будут иметь размер (теперь это «сырой» размер байта), который будет в N раз больше размера одного элемента. Таким образом, можно легко получить количество элементов, используя оператор sizeof . Но для этого требуется, чтобы у вас все еще был доступ к типу этого массива. Как только вы передадите его функциям, он будет преобразован в указатели, и тогда вы потеряетесь. Размер больше не может быть определен. Вам нужно будет построить другой способ, основанный на значении элементов для расчета размера.

Вот несколько примеров:

int a[5];
size_t size = (sizeof a / sizeof a[0]); // size == 5

int *pa = a; 

Если теперь мы потеряем имя «a» (и, следовательно, его тип), например, передав «pa» функции, где эта функция только тогда имеет значение этого указателя, тогда нам не повезло. Тогда мы больше не сможем получить размер. Нам нужно будет передать размер вместе с указателем на эту функцию.

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

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

Он не может вернуть указатель, который имеет тип встроенного массива, потому что размер массива, созданного с помощью new можно рассчитать во время выполнения. Но типы в C ++ должны быть установлены во время компиляции. Таким образом, new стирает эту часть массива и вместо этого возвращает указатель на элементы. Обратите внимание, что вам не нужно возиться с new в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

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

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

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

Он не может вернуть указатель, который имеет тип встроенного массива, потому что размер массива, созданного с помощью new можно рассчитать во время выполнения. Но типы в C ++ должны быть установлены во время компиляции. Таким образом, new стирает эту часть массива и вместо этого возвращает указатель на элементы. Обратите внимание, что вам не нужно возиться с new в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

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

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

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

Он не может вернуть указатель, который имеет тип встроенного массива, потому что размер массива, созданного с помощью new можно рассчитать во время выполнения. Но типы в C ++ должны быть установлены во время компиляции. Таким образом, new стирает эту часть массива и вместо этого возвращает указатель на элементы. Обратите внимание, что вам не нужно возиться с new в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

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

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

Он не может вернуть указатель, который имеет тип встроенного массива, потому что размер массива, созданного с помощью new можно рассчитать во время выполнения. Но типы в C ++ должны быть установлены во время компиляции. Таким образом, new стирает эту часть массива и вместо этого возвращает указатель на элементы. Обратите внимание, что вам не нужно возиться с new в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

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

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

Он не может вернуть указатель, который имеет тип встроенного массива, потому что размер массива, созданного с помощью new можно рассчитать во время выполнения. Но типы в C ++ должны быть установлены во время компиляции. Таким образом, new стирает эту часть массива и вместо этого возвращает указатель на элементы. Обратите внимание, что вам не нужно возиться с new в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

Он не может вернуть указатель, в который включен тип массива, потому что размер массива, созданного с помощью new , может быть вычислен во время выполнения. Но типы в C ++ должны быть установлены во время компиляции. Таким образом, new стирает эту часть массива и вместо этого возвращает указатель на элементы. Обратите внимание, что вам не нужно возиться с new в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

int *p = new int[5];
  // can't get the size of the array p points to. 
delete[] p;

Он не может вернуть указатель, в который включен тип массива, потому что размер массива, созданного с помощью new , может быть вычислен во время выполнения. Но типы в C ++ должны быть установлены во время компиляции. Таким образом, new стирает эту часть массива и вместо этого возвращает указатель на элементы. Обратите внимание, что вам не нужно возиться с new в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

Не нужно возиться с новым в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

Не нужно возиться с новым в C ++. Вы можете использовать шаблон std :: vector , как рекомендовано в другом ответе.

17
ответ дан 3 December 2019 в 14:11
поделиться

Чтобы подсчитать количество элементов в статическом массиве, вы можете создать функцию шаблона:

template < typename T, size_t N >
size_t countof( T const (&array)[ N ] )
{
    return N;
} 

Для стандартных контейнеров, таких как std :: vector , size () функция . Этот шаблон также используется с массивами повышения , которые представляют собой массивы фиксированного размера и претендуют на не худшую производительность по сравнению со статическими массивами. Код, который вы указали в комментарии выше, должен быть:

for ( std::vector::size_type i(0); i < entries.size(); ++i )

(при условии, что размер изменяется в цикле, в противном случае поднимите его), а не рассматривать размер как переменную-член.

5
ответ дан 3 December 2019 в 14:11
поделиться

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

Строки могут иметь свою длину, определенную при условии, что они оканчиваются нулем, с помощью функции strlen (), но это просто считается до символа \ 0.

0
ответ дан 3 December 2019 в 14:11
поделиться

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

 GrmblFx loadOfElements [1027];
GrmblFx_length = sizeof (loadOfElements) / sizeof (GrmblFx);

0
ответ дан 3 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: