¿De dónde viene la matriz? Por lo general, las funciones que toman matrices también toman un parámetro de longitud para tratar este problema.
Michael Myers
2
Bueno, estoy haciendo un programa "libs locas" que tiene una matriz con todo el texto, así como las ubicaciones de los sustantivos / verbos que el usuario tiene que completar. Me gustaría usar una función para ejecutar el matriz completa, reemplazando los valores "[sustantivo]" y "[verbo]" con el texto ingresado por el usuario.
Tenga en cuenta que en C las matrices no son objetos o estructuras. Como tal, no tienen ningún parámetro de longitud almacenado en ningún lugar de forma predeterminada. Si desea trabajar con ellos como objetos en C ++, use los objetos C ++ std :: vector o std :: array de C ++ 11 si puede. Si tiene que usar punteros, siempre pase la longitud de la matriz como segundo parámetro a cada función que funcione con ella.
Pihhan
Si está utilizando C ++ 20, también he agregado una respuesta para eso. Podría perderse fácilmente ya que hay tantas respuestas aquí.
gprathour
Respuestas:
511
Si te refieres a una matriz de estilo C, entonces puedes hacer algo como:
int a[7];
std::cout <<"Length of array = "<<(sizeof(a)/sizeof(*a))<< std::endl;
Esto no funciona en punteros (es decir , no funcionará para ninguno de los siguientes):
int*p =newint[7];
std::cout <<"Length of array = "<<(sizeof(p)/sizeof(*p))<< std::endl;
Tampoco funciona si pasa la matriz a una función diferente e intenta hacerlo allí :)
San Jacinto
23
@San Jacinto: No, esto funciona (en matrices ) sin importar en qué función se encuentre. Pasar una matriz de longitud variable a una función como parámetro, sin embargo, es imposible (se descompone en un puntero), pero si pasa un matriz dentro de una estructura, entonces esto funciona como se esperaba.
eq-
1
@OliverCharlesworth también si pasaste la matriz por valor a otra función y la probaste allí, no funcionará, ¿verdad? La pregunta es por qué
A_Matar
55
@A_Matar: no puede pasar una matriz por valor en C o C ++.
Oliver Charlesworth
1
@yusha: son lo mismo.
Oliver Charlesworth
142
Como otros han dicho, puede usar el sizeof(arr)/sizeof(*arr)pero esto le dará la respuesta incorrecta para los tipos de puntero que no son matrices.
Esto tiene la buena propiedad de no compilar para tipos que no son de matriz (Visual Studio tiene _countofqué hace esto). Esto constexprhace que esta sea una expresión de tiempo de compilación para que no tenga inconvenientes sobre la macro (al menos ninguna que conozca).
También puede considerar el uso std::arrayde C ++ 11 que expone su longitud sin sobrecarga en una matriz C nativa.
C ++ 17 tiene std::size()en el <iterator>encabezado lo que hace lo mismo y también funciona para contenedores STL (gracias a @Jon C ).
@yau es cómo escribes una referencia a una matriz , mira esta respuesta . Mi versión se ve un poco diferente ya que he omitido el nombre del parámetro ya que el parámetro no se usa, solo se necesita su tipo. Con un nombre sería T(arg&)[N].
Motti
1
Gracias Motti! El nombre del parámetro omitido ya estaba claro para mí. Pero increíble que al parecer no tenía uso de referencias / punteros a las matrices nunca antes. Y probablemente no lo hará en el futuro, ya que tales matrices se están extinguiendo aún más.
@IsaacPascual No estaba familiarizado extent, al verlo ahora hay dos características que lo hacen menos útil que la función anterior (para este caso de uso). (1) Devuelve cero para punteros (en lugar de un error de compilación). (2) Requiere un parámetro de tipo, por lo que para verificar una variable que tendría que hacerdecltype
Motti
86
Al hacerlo sizeof( myArray ), obtendrá el número total de bytes asignados para esa matriz. Luego puede encontrar el número de elementos en la matriz dividiendo por el tamaño de un elemento en la matriz:sizeof( myArray[0] )
Esta es una solución muy simple y fácil de superar lo que parece ser un problema antiguo.
44
No funciona para matrices "nuevas" de C ++ en poder de un puntero. Obtiene el tamaño del puntero (4 bytes) o el tamaño de su primer elemento si lo desreferencia.
DragonLord
1
@DragonLord sí, aunque cualquiera que declare el tamaño de la matriz usando la palabra clave new ya sabrá el tamaño de la matriz en tiempo de ejecución, por lo que no es necesario usar el operador sizeof para encontrar el tamaño de la matriz en ese caso. Estoy seguro de que lo sabes. Esto es solo para el beneficio de cualquiera que no lo haga.
Martyn Shutt
@surega No se bloqueará
CITBL
61
Si bien esta es una pregunta antigua, vale la pena actualizar la respuesta a C ++ 17. En la biblioteca estándar ahora existe la función de plantilla std::size(), que devuelve el número de elementos tanto en un contenedor estándar como en una matriz de estilo C. Por ejemplo:
Esto no funcionaría para tamaños de matriz individuales variables
Don Larynx
44
+1 para vectores. Hay muy pocos casos sólidos para usar las matrices C ++ de estilo antiguo. A menos que el tamaño de la matriz nunca cambie, pero aun así, debe usar la clase de contenedor de matriz en su lugar. Es mejor usar una clase de contenedor como vector para el almacenamiento de matriz dinámica. Las ventajas de usar clases de contenedor superan con creces las desventajas de tener que administrar su propia memoria.
Martyn Shutt
@MartynShutt Cuando estás vinculado a la memoria caché, como en gamedev, a veces no puedes permitirte usar un vector.
Tara
30
std::vectortiene un método size()que devuelve el número de elementos en el vector.
Creo que este solo funciona para variables locales que están en la pila.
DragonLord
Esta es la mejor respuesta. @DragonLord, también funciona para miembros variables. Ver cpp.sh/92xvv .
Shital Shah
24
Desde C ++ 11, se introducen algunas plantillas nuevas para ayudar a reducir el dolor cuando se trata de la longitud de la matriz. Todos ellos están definidos en el encabezado <type_traits>.
Si Tes un tipo de matriz, proporciona el valor constante del miembro igual al número de dimensiones de la matriz. Para cualquier otro tipo, el valor es 0.
Si Tes un tipo de matriz, proporciona el valor constante del miembro igual al número de elementos a lo largo de la Ndimensión th de la matriz, si Nestá en [0, std::rank<T>::value). Para cualquier otro tipo, o si Tes una matriz de límite desconocido a lo largo de su primera dimensión y Nes 0, el valor es 0.
Si Tes una matriz de algún tipo X, proporciona al miembro typedef type igual a X, de lo contrario, type es T. Tenga en cuenta que si se Ttrata de una matriz multidimensional, solo se elimina la primera dimensión.
En C ++, utilizando la clase std :: array para declarar una matriz, se puede encontrar fácilmente el tamaño de una matriz y también el último elemento.
#include<iostream>#include<array>int main(){
std::array<int,3> arr;//To find the size of the array
std::cout<<arr.size()<<std::endl;//Accessing the last elementauto it=arr.end();
std::cout<<arr.back()<<"\t"<<arr[arr.size()-1]<<"\t"<<*(--it);return0;}
Agradable; Veo que tienes muchas habilidades; y ... gran enfoque. Creo que también debería escribir más respuestas a preguntas tan famosas ;-)
GhostCat
5
Esta es una pregunta bastante antigua y legendaria y ya hay muchas respuestas sorprendentes por ahí. Pero con el tiempo se agregan nuevas funcionalidades a los idiomas, por lo que debemos seguir actualizando las cosas según las nuevas funciones disponibles.
Acabo de notar que nadie ha mencionado aún sobre C ++ 20. Así que pensé en escribir la respuesta.
C ++ 20
En C ++ 20, hay una nueva forma mejor agregada a la biblioteca estándar para encontrar la longitud de la matriz, es decir std:ssize(). Esta función devuelve a signed value.
Solo para su información, si se pregunta por qué este enfoque no funciona cuando la matriz se pasa a otra función . La razón es,
Una matriz no se pasa por valor en C ++, sino que se pasa el puntero a la matriz. Como en algunos casos, pasar los arreglos completos puede ser una operación costosa. Puede probar esto pasando la matriz a alguna función y hacer algunos cambios en la matriz allí y luego imprimir la matriz en main nuevamente. Obtendrás resultados actualizados.
Y como ya sabría, la sizeof()función proporciona el número de bytes, por lo que en otra función devolverá el número de bytes asignados para el puntero en lugar de la matriz completa. Entonces este enfoque no funciona.
Pero estoy seguro de que puede encontrar una buena manera de hacerlo, según sus requisitos.
ARRAYSIZE (arr) funciona inspeccionando sizeof (arr) (el número de bytes en la matriz) y sizeof (* (arr)) (el número de bytes en un elemento de la matriz). Si el primero es divisible por el segundo, quizás arr sea de hecho una matriz, en cuyo caso el resultado de la división es el número de elementos en la matriz. De lo contrario, arr no puede ser una matriz, y generamos un error de compilación para evitar que el código se compile.
Dado que el tamaño de bool está definido por la implementación, necesitamos convertir! (Sizeof (a) y sizeof (* (a))) a size_t para garantizar que el resultado final tenga el tipo size_t.
Esta macro no es perfecta ya que acepta erróneamente ciertos punteros, es decir, donde el tamaño del puntero es divisible por el tamaño del puntero. Dado que todo nuestro código tiene que pasar por un compilador de 32 bits, donde un puntero es de 4 bytes, esto significa que todos los punteros a un tipo cuyo tamaño sea 3 o mayor que 4 serán (correctamente) rechazados.
con un conjunto de enteros como este: int nombres[5] = { 9, 3 };esta función regresa en 5lugar de 2.
Anwar
GOOGLE_ARRAYSIZE(new int8_t)vuelve 8a mi entorno de prueba, en lugar de generar un error. La parte fundida parece redundante, sin mencionar los gritos de C macro. sizeof(a) / sizeof(*a)funciona de manera suficiente como solución heredada.
3
Para C ++ / CX (al escribir, por ejemplo, aplicaciones UWP que usan C ++ en Visual Studio), podemos encontrar el número de valores en una matriz simplemente usando la size()función.
Si bien este fragmento de código puede resolver el problema, no explica por qué o cómo responde la pregunta. Incluya una explicación para su código, ya que eso realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo a la pregunta de los lectores en el futuro, y esa gente puede no saber las razones de su sugerencia de código
Balagurunathan Marimuthu
3
RESPUESTA :
int number_of_elements =sizeof(array)/sizeof(array[0])
EXPLICACIÓN :
Como el compilador establece un tamaño específico de memoria a un lado para cada tipo de datos, y una matriz es simplemente un grupo de esos, simplemente divide el tamaño de la matriz por el tamaño del tipo de datos. Si tengo una matriz de 30 cadenas, mi sistema reserva 24 bytes para cada elemento (cadena) de la matriz. Con 30 elementos, eso es un total de 720 bytes. 720/24 == 30 elementos. El algoritmo pequeño y ajustado para eso es:
int number_of_elements = sizeof(array)/sizeof(array[0]) lo que equivale a
number_of_elements = 720/24
Tenga en cuenta que no necesita saber qué tipo de datos es la matriz, incluso si se trata de un tipo de datos personalizado.
No es necesario este enfoque anticuado y propenso a errores en 2019. stackoverflow.com/a/59109106/560648 También es solo un engaño de las respuestas existentes.
Carreras de ligereza en órbita el
Sin embargo, es simple, elocuente, rápido, de baja demanda, independiente de la plataforma y elimina la necesidad de incluir vectores o punteros. En cuanto a duplicar otras respuestas, parece que solo hay otra respuesta con el mismo algoritmo, y esa no da ninguna explicación sobre la mecánica subyacente del problema como lo hace mi respuesta. Respetuosamente sugiero que, en lugar de ser propenso a errores, es bastante robusto.
Bob Warner el
1
Solo un pensamiento, pero solo decidí crear una variable de contador y almacenar el tamaño de la matriz en la posición [0]. Eliminé la mayor parte del código que tenía en la función, pero verás que después de salir del bucle, a prime [0] se le asigna el valor final de 'a'. Intenté usar vectores, pero VS Express 2013 no me gustó mucho. También tenga en cuenta que 'a' comienza en uno para evitar sobrescribir [0] y se inicializa al principio para evitar errores. No soy un experto, solo pensé en compartir.
int prime[]={0};int primes(int x,int y){usingnamespace std;int a =1;for(int i = x; i <= y; i++){prime[a]= i; a++;}
prime[0]= a;return0;}
@bobbogo Funciona con inline o constexpr, ¿tal vez tenías inline off o es opcional? ideone.com/VxogJ4
QuentinUK
@QentinUK constexpres la solución. inlineno es. constexpraunque es bastante moderno. ¿Está seguro de que su programa de prueba no está utilizando otra característica moderna, donde puede declarar una matriz local cuya longitud está dada por una variable? Pruébelo con dos matrices globales.
bobbogo
1
Para el antiguo compilador de g ++, puede hacer esto
Esta es la respuesta correcta. Muy portátil entre las versiones de C ++, no funciona con punteros, además la respuesta está disponible en tiempo de compilación
bobbogo
1
Proporciono una solución difícil aquí:
Siempre puedes almacenar lengthen el primer elemento:
// malloc/new
arr[0]= length;
arr++;// do anything. int len =*(arr-1);
free(--arr);
Eso funciona solo cuando arres de un tipo compatible inty la matriz no es más larga que el valor máximo del tipo. Por ejemplo, las cadenas de Pascal son en realidad conjuntos de bytes que utilizan este truco; La longitud máxima de las cadenas en Pascal es de 255 caracteres.
Palec
Supongo que uno podría reservar digamos 8 bytes al comienzo de cada matriz y usar un largo sin signo si quisieran almacenar objetos. Creo que un vector es probablemente más fácil. Pero definitivamente es una buena solución para sistemas embebidos.
aj.toulan
1
Puede encontrar la longitud de una matriz de la siguiente manera:
int arr[]={1,2,3,4,5,6};int size =*(&arr +1)- arr;
cout <<"Number of elements in arr[] is "<< size;return0;
Yo personalmente sugeriría (si no puede trabajar con funciones especializadas por cualquier motivo) primero expandir la compatibilidad de tipo de matrices más allá de lo que normalmente usaría (si estuviera almacenando valores ≥ 0:
unsignedint x[]->int x[]
de lo que haría que el elemento de matriz 1 sea más grande de lo que necesita para hacerlo. Para el último elemento, colocaría algún tipo que se incluye en el especificador de tipo expandido pero que normalmente no usaría, por ejemplo, usando el ejemplo anterior, el último elemento sería -1. Esto le permite (mediante el uso de un bucle for) encontrar el último elemento de una matriz.
Una de las razones más comunes por las que terminaría buscando esto es porque desea pasar una matriz a una función y no tener que pasar otro argumento para su tamaño. En general, también le gustaría que el tamaño de la matriz sea dinámico. Esa matriz puede contener objetos, no primitivos, y los objetos pueden ser complejos, de modo que size_of () no es una opción segura para calcular el recuento.
Como otros han sugerido, considere usar un std :: vector o una lista, etc. en lugar de una matriz primitiva. Sin embargo, en los compiladores antiguos, aún no tendría la solución final que probablemente desea simplemente haciendo eso, porque llenar el contenedor requiere un montón de líneas feo push_back (). Si eres como yo, quieres una solución de línea única con objetos anónimos involucrados.
Respuestas:
Si te refieres a una matriz de estilo C, entonces puedes hacer algo como:
Esto no funciona en punteros (es decir , no funcionará para ninguno de los siguientes):
o:
En C ++, si desea este tipo de comportamiento, debería usar una clase contenedor; Probablemente
std::vector
.fuente
Como otros han dicho, puede usar el
sizeof(arr)/sizeof(*arr)
pero esto le dará la respuesta incorrecta para los tipos de puntero que no son matrices.Esto tiene la buena propiedad de no compilar para tipos que no son de matriz (Visual Studio tiene
_countof
qué hace esto). Estoconstexpr
hace que esta sea una expresión de tiempo de compilación para que no tenga inconvenientes sobre la macro (al menos ninguna que conozca).También puede considerar el uso
std::array
de C ++ 11 que expone su longitud sin sobrecarga en una matriz C nativa.C ++ 17 tiene
std::size()
en el<iterator>
encabezado lo que hace lo mismo y también funciona para contenedores STL (gracias a @Jon C ).fuente
T(arg&)[N]
.extent
, al verlo ahora hay dos características que lo hacen menos útil que la función anterior (para este caso de uso). (1) Devuelve cero para punteros (en lugar de un error de compilación). (2) Requiere un parámetro de tipo, por lo que para verificar una variable que tendría que hacerdecltype
Al hacerlo
sizeof( myArray )
, obtendrá el número total de bytes asignados para esa matriz. Luego puede encontrar el número de elementos en la matriz dividiendo por el tamaño de un elemento en la matriz:sizeof( myArray[0] )
fuente
Si bien esta es una pregunta antigua, vale la pena actualizar la respuesta a C ++ 17. En la biblioteca estándar ahora existe la función de plantilla
std::size()
, que devuelve el número de elementos tanto en un contenedor estándar como en una matriz de estilo C. Por ejemplo:fuente
¡Si!
Tratar
sizeof(array)/sizeof(array[0])
No veo ninguna manera de esto a menos que su matriz sea una matriz de caracteres (es decir, cadena).
PD: En C ++ siempre use
std::vector
. Hay varias funciones incorporadas y una funcionalidad extendida.fuente
std::vector
tiene un métodosize()
que devuelve el número de elementos en el vector.(Sí, esta es una respuesta irónica)
fuente
fuente
Desde C ++ 11, se introducen algunas plantillas nuevas para ayudar a reducir el dolor cuando se trata de la longitud de la matriz. Todos ellos están definidos en el encabezado
<type_traits>
.std::rank<T>::value
Si
T
es un tipo de matriz, proporciona el valor constante del miembro igual al número de dimensiones de la matriz. Para cualquier otro tipo, el valor es 0.std::extent<T, N>::value
Si
T
es un tipo de matriz, proporciona el valor constante del miembro igual al número de elementos a lo largo de laN
dimensión th de la matriz, siN
está en [0,std::rank<T>::value
). Para cualquier otro tipo, o siT
es una matriz de límite desconocido a lo largo de su primera dimensión yN
es 0, el valor es 0.std::remove_extent<T>::type
Si
T
es una matriz de algún tipoX
, proporciona al miembro typedef type igual aX
, de lo contrario, type esT
. Tenga en cuenta que si seT
trata de una matriz multidimensional, solo se elimina la primera dimensión.std::remove_all_extents<T>::type
Si
T
es una matriz multidimensional de algún tipoX
, proporciona el miembro typedef type igual aX
, de lo contrario, type esT
.Para obtener la longitud en cualquier dimensión de una matriz multidimensional,
decltype
podría usarse para combinar constd::extent
. Por ejemplo:BTY, para obtener el número total de elementos en una matriz multidimensional:
O póngalo en una plantilla de función:
Se pueden encontrar más ejemplos de cómo usarlos siguiendo los enlaces.
fuente
También existe la forma TR1 / C ++ 11 / C ++ 17 (verlo Live on Coliru):
fuente
En lugar de utilizar la función de matriz integrada, también conocida como:
debe usar la clase de matriz y la plantilla de matriz. Tratar:
Entonces, si desea encontrar la longitud de la matriz, todo lo que tiene que hacer es usar la función de tamaño en la clase de matriz.
y eso debería devolver la longitud de los elementos en la matriz.
fuente
En C ++, utilizando la clase std :: array para declarar una matriz, se puede encontrar fácilmente el tamaño de una matriz y también el último elemento.
De hecho, la clase array tiene muchas otras funciones que nos permiten usar un contenedor estándar.
Referencia 1 a la clase std :: array de C ++
Referencia 2 a la clase std :: array de C ++
Los ejemplos en las referencias son útiles.
fuente
Esta es una pregunta bastante antigua y legendaria y ya hay muchas respuestas sorprendentes por ahí. Pero con el tiempo se agregan nuevas funcionalidades a los idiomas, por lo que debemos seguir actualizando las cosas según las nuevas funciones disponibles.
Acabo de notar que nadie ha mencionado aún sobre C ++ 20. Así que pensé en escribir la respuesta.
C ++ 20
En C ++ 20, hay una nueva forma mejor agregada a la biblioteca estándar para encontrar la longitud de la matriz, es decir
std:ssize()
. Esta función devuelve asigned value
.C ++ 17
En C ++ 17 había una mejor manera (en ese momento) para la misma que se
std::size()
define eniterator
.PD Este método funciona para
vector
.Antiguo
Este enfoque tradicional ya se menciona en muchas otras respuestas.
Solo para su información, si se pregunta por qué este enfoque no funciona cuando la matriz se pasa a otra función . La razón es,
Una matriz no se pasa por valor en C ++, sino que se pasa el puntero a la matriz. Como en algunos casos, pasar los arreglos completos puede ser una operación costosa. Puede probar esto pasando la matriz a alguna función y hacer algunos cambios en la matriz allí y luego imprimir la matriz en main nuevamente. Obtendrás resultados actualizados.
Y como ya sabría, la
sizeof()
función proporciona el número de bytes, por lo que en otra función devolverá el número de bytes asignados para el puntero en lugar de la matriz completa. Entonces este enfoque no funciona.Pero estoy seguro de que puede encontrar una buena manera de hacerlo, según sus requisitos.
Feliz codificación.
fuente
Tiene un montón de opciones para usar para obtener un tamaño de matriz C.
int myArray [] = {0, 1, 2, 3, 4, 5, 7};
1) sizeof(<array>) / sizeof(<type>):
2) sizeof(<array>) / sizeof(*<array>):
3) sizeof(<array>) / sizeof(<array>[<element>]):
fuente
Aquí es una implementación de
ArraySize
de Google Protobuf .fuente
int nombres[5] = { 9, 3 };
esta función regresa en5
lugar de2
.GOOGLE_ARRAYSIZE(new int8_t)
vuelve8
a mi entorno de prueba, en lugar de generar un error. La parte fundida parece redundante, sin mencionar los gritos de C macro.sizeof(a) / sizeof(*a)
funciona de manera suficiente como solución heredada.Para C ++ / CX (al escribir, por ejemplo, aplicaciones UWP que usan C ++ en Visual Studio), podemos encontrar el número de valores en una matriz simplemente usando la
size()
función.Código fuente:
Si usted
cout
lasize_of_array
salida será:fuente
sizeof(array_name)
da el tamaño de toda la matriz ysizeof(int)
da el tamaño del tipo de datos de cada elemento de la matriz.Entonces, dividir el tamaño de toda la matriz por el tamaño de un solo elemento de la matriz da la longitud de la matriz.
fuente
RESPUESTA :
EXPLICACIÓN :
Como el compilador establece un tamaño específico de memoria a un lado para cada tipo de datos, y una matriz es simplemente un grupo de esos, simplemente divide el tamaño de la matriz por el tamaño del tipo de datos. Si tengo una matriz de 30 cadenas, mi sistema reserva 24 bytes para cada elemento (cadena) de la matriz. Con 30 elementos, eso es un total de 720 bytes. 720/24 == 30 elementos. El algoritmo pequeño y ajustado para eso es:
int number_of_elements = sizeof(array)/sizeof(array[0])
lo que equivale anumber_of_elements = 720/24
Tenga en cuenta que no necesita saber qué tipo de datos es la matriz, incluso si se trata de un tipo de datos personalizado.
fuente
Solo un pensamiento, pero solo decidí crear una variable de contador y almacenar el tamaño de la matriz en la posición [0]. Eliminé la mayor parte del código que tenía en la función, pero verás que después de salir del bucle, a prime [0] se le asigna el valor final de 'a'. Intenté usar vectores, pero VS Express 2013 no me gustó mucho. También tenga en cuenta que 'a' comienza en uno para evitar sobrescribir [0] y se inicializa al principio para evitar errores. No soy un experto, solo pensé en compartir.
fuente
Una buena solución que usa genéricos:
Luego simplemente llame
arraysize(_Array);
para obtener la longitud de la matriz.Fuente
fuente
constexpr
es la solución.inline
no es.constexpr
aunque es bastante moderno. ¿Está seguro de que su programa de prueba no está utilizando otra característica moderna, donde puede declarar una matriz local cuya longitud está dada por una variable? Pruébelo con dos matrices globales.Para el antiguo compilador de g ++, puede hacer esto
fuente
Proporciono una solución difícil aquí:
Siempre puedes almacenar
length
en el primer elemento:El costo es obligatorio
--arr
al invocarfree
fuente
arr
es de un tipo compatibleint
y la matriz no es más larga que el valor máximo del tipo. Por ejemplo, las cadenas de Pascal son en realidad conjuntos de bytes que utilizan este truco; La longitud máxima de las cadenas en Pascal es de 255 caracteres.Puede encontrar la longitud de una matriz de la siguiente manera:
fuente
Simplemente puede usar este fragmento:
y aquí está la referencia: http://www.cplusplus.com/reference/array/array/size/
fuente
Evite usar el tipo junto con sizeof, ya que
sizeof(array)/sizeof(char)
, de repente, se corrompe si cambia el tipo de la matriz.En Visual Studio, tienes el equivalente si
sizeof(array)/sizeof(*array)
. Puedes simplemente escribir_countof(array)
fuente
Yo personalmente sugeriría (si no puede trabajar con funciones especializadas por cualquier motivo) primero expandir la compatibilidad de tipo de matrices más allá de lo que normalmente usaría (si estuviera almacenando valores ≥ 0:
de lo que haría que el elemento de matriz 1 sea más grande de lo que necesita para hacerlo. Para el último elemento, colocaría algún tipo que se incluye en el especificador de tipo expandido pero que normalmente no usaría, por ejemplo, usando el ejemplo anterior, el último elemento sería -1. Esto le permite (mediante el uso de un bucle for) encontrar el último elemento de una matriz.
fuente
Una de las razones más comunes por las que terminaría buscando esto es porque desea pasar una matriz a una función y no tener que pasar otro argumento para su tamaño. En general, también le gustaría que el tamaño de la matriz sea dinámico. Esa matriz puede contener objetos, no primitivos, y los objetos pueden ser complejos, de modo que size_of () no es una opción segura para calcular el recuento.
Como otros han sugerido, considere usar un std :: vector o una lista, etc. en lugar de una matriz primitiva. Sin embargo, en los compiladores antiguos, aún no tendría la solución final que probablemente desea simplemente haciendo eso, porque llenar el contenedor requiere un montón de líneas feo push_back (). Si eres como yo, quieres una solución de línea única con objetos anónimos involucrados.
Si opta por el contenedor STL alternativo a una matriz primitiva, esta publicación SO puede serle útil para encontrar formas de inicializarla: ¿Cuál es la forma más fácil de inicializar un std :: vector con elementos codificados?
Aquí hay un método que estoy usando para esto que funcionará universalmente en compiladores y plataformas:
Cree una estructura o clase como contenedor para su colección de objetos. Defina una función de sobrecarga del operador para <<.
Puede crear funciones que tomen su estructura como parámetro, por ejemplo:
Entonces, puedes llamar a esa función, así:
¡De esa manera, puede construir y pasar una colección de objetos de tamaño dinámico a una función en una sola línea limpia!
fuente
Digamos que tiene una matriz global declarada en la parte superior de la página
Para averiguar cuántos elementos hay (en c ++) en la matriz, escriba el siguiente código:
El tamaño de (NAME_OF_ARRAY) / 4 le devolverá el número de elementos para el nombre de matriz dado.
fuente