Размер статического массива - PullRequest
14 голосов
/ 17 января 2009

Я объявляю статический массив символов, затем передаю его функции. Как получить нет. байтов в массиве внутри функции?

Ответы [ 7 ]

34 голосов
/ 17 января 2009

Вместо этого используйте шаблон функции, который имеет нетипизированный параметр шаблона:

template <size_t N>
void func(char (&a)[N]) {
    for (int i = 0; i < N; ++i) {
        cout << "a[" << i << "] = " << a[i] << endl;   // Or whatever you want to do
    }
}

Для звонка:

char myArray[500];        // Or "static char myArray[500]", if you want
func(myArray);

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

14 голосов
/ 17 января 2009

Вы должны передать его функции. Вы можете использовать sizeof (), чтобы получить размер массива.

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

Эта страница MSDN объясняет больше о sizeof и имеет больший пример.

Редактировать: * см. Ответ j_random_hacker's для интригующей техники с использованием шаблонов ... *

3 голосов
/ 17 января 2009

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

Используя вектор, вам больше не нужно беспокоиться о переполнении буфера. И ваша функция может легко узнать размер vecor.

#include <vector>
vector<char> myVector;

void DoSomething(vector<char> &v)
{
    int sizeOfVector = v.size();
}
2 голосов
/ 09 августа 2018

Вы также можете использовать std::size() из C ++ 17

https://en.cppreference.com/w/cpp/iterator/size

#include <iostream>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = { 3, 1, 4 };
    std::cout << std::size(v) << '\n'; 

    int a[] = { -5, 10, 15 };
    std::cout << std::size(a) << '\n';
}

Для pre c ++ 17 скопировать примеры реализации;)

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}
2 голосов
/ 20 ноября 2009

int array_size = sizeof (Array) / sizeof (Array [0]);

0 голосов
/ 17 января 2009

Еще одна опция, которую вы имеете, - это создание строкового класса, который управляет строкой. Я уверен, что кто-то там уже сделал это. Самая примитивная версия - это структура с символом * и длиной буфера, где вы должны вручную управлять размером при его изменении. Другой конец спектра - полностью реализованный класс строк с функциями перегрузки операторов и функций манипуляции.

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

0 голосов
/ 17 января 2009

Вы не можете. Массивы в C ++ являются указателями, и это все, что у вас есть: указатель на начало массива. Если это строка, вы можете использовать strlen для измерения ее длины. Если это какой-то другой известный формат, вы можете рассчитать длину в соответствии с этим форматом.

Рассмотрим этот код:

static char str[] = "hello world";

foo(str);
bar(str);

void foo(char* str)
{
   // length of str is unknown
}

void bar(char str[])
{
  // length of str is still unknown
}

Независимо от того, является ли параметр вашей функции char [] или char *, вы не знаете размер.

Я предлагаю передать размер в качестве отдельного параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...