determinar el tamaño de la matriz si se pasa a la función

¿Es posible determinar el tamaño de una matriz si se pasó a otra función (no se pasa el tamaño)? La matriz se inicializa como int array [] = {XXX} ..

Entiendo que no es posible hacer sizeof ya que devolverá el tamaño del puntero. La razón que pregunto es porque necesito ejecutar un bucle for dentro de la otra función donde se pasa el arreglo. Intenté algo como:

for( int i = 0; array[i] != NULL; i++) { ........ } 

Pero noté que en el extremo cercano de la matriz, la matriz [i] a veces contiene valores de basura como 758433, que no es un valor especificado en la inicialización de la matriz.

Las otras respuestas pasan por alto una característica de c ++. Puede pasar arrays por referencia y usar plantillas:

 template  void func(T (&a) [N]) { for (int i = 0; i < N; ++i) a[i] = T(); // reset all elements } 

entonces puedes hacer esto:

 int x[10]; func(x); 

pero tenga en cuenta que esto solo funciona para matrices , no para punteros.

Sin embargo, como otras respuestas han notado, usar std::vector es una mejor opción.

Si está bajo su control, use un contenedor STL como un vector o deque en lugar de una matriz.

No, no es posible.

Una solución alternativa: coloque un valor especial en el último valor de la matriz para que pueda reconocerlo.

Una solución obvia es usar STL. Si no es una posibilidad, es mejor pasar la longitud de la matriz de forma explícita. Soy escéptico sobre el uso del truco de valor centinela, para este caso particular. Funciona mejor con matrices de punteros, porque NULL es un buen valor para un centinela. Con una matriz de números enteros, no es tan fácil; necesitas tener un valor centinela “mágico”, lo cual no es bueno.

Nota al margen: si su matriz está definida e incializada como

  int array[] = { X, Y, Z }; 

en el mismo scope que su bucle, entonces

sizeof (array) devolverá su tamaño real en bytes, no el tamaño del puntero. Puede obtener la longitud de la matriz como

 sizeof(array) / sizeof(array[0]) 

Sin embargo, en el caso general, si obtiene una matriz como puntero, no puede usar este truco.

Si no puede pasar el tamaño, necesita un valor centinela distinguible al final (y debe colocarlo allí mismo; como ha descubierto, ¡no puede confiar en que C ++ lo hará automágicamente para usted!) . No hay forma de que la función llamada tenga un tamaño mágico divino, si no se pasa y no hay ningún centinela explícito y confiable en uso.

Puede agregar un terminador a su matriz int y luego recorrer el arreglo manualmente para descubrir el tamaño dentro del método.

 #include using namespace std; int howBigIsBareArray(int arr[]){ int counter = 0; while (arr[counter] != NULL){ counter++; } return counter; } int main(){ int a1[6] = {1,2,3,4,5,'\0'}; cout < < "SizeOfMyArray: " << howBigIsBareArray(a1); } 

Este progtwig imprime:

 SizeOfMyArray: 5 

Esta es una operación de complejidad de tiempo O (n) que es mala. Nunca debe pasar por una matriz solo para descubrir su tamaño.

¿Puedes intentar agregar un carácter nulo \0 a la matriz y luego enviarlo? De esta forma, solo puede verificar por \ 0 en el ciclo.

En realidad la lista de Chucks de

for (int i = 0; array [i]! = NULL; i ++) {……..}

Un tamaño de antes de cada llamada es un desperdicio y se necesita para saber lo que obtienes.

Funciona muy bien si pones un NULL al final de las matrices.

¿¿Por qué?? Con los diseños integrados que pasan un tamaño de cada rutina, cada llamada es muy grande en comparación con un NULL con cada matriz. Tengo un chip 2K PIC16F684 y toma hasta el 10 por ciento del chip con 12 llamadas usando un tamaño pasado junto con el conjunto. Con solo la matriz y el código de Chucks con NULLS om cada array … obtengo un 4 por ciento.

Un verdadero ejemplo. Gracias, buenas llamadas.