tamaño poligono para pairs librerias leyenda graficas graficar grafica funcion ejemplos c arrays function sizeof

poligono - Tamaño C de una matriz pasada



r grafica (7)

El problema es que su función no recibe un valor de matriz; recibe un valor de puntero.

Excepto cuando es el operando de sizeof o unary & operadores, o es un literal de cadena que se usa para inicializar otra matriz en una declaración, una expresión de tipo "array of T " se convertirá en "puntero a T " y su valor será la dirección del primer elemento de la matriz.

Por lo tanto, cuando llamas a printarray , el tipo de array1 se convierte implícitamente de "matriz de 100 elementos de double " a "de puntero a double ". Por lo tanto, el tipo del parámetro p es double * , no double [100] .

En el contexto de una declaración de parámetro de función, T a[] es idéntico a T *a .

Es por eso que debe pasar el tamaño de la matriz por separado;

Posible duplicado:
Cómo encontrar el tamaño de (un puntero apuntando a una matriz)

Entiendo que el operador sizeof se evalúa y reemplaza con una constante en tiempo de compilación. Dado que, ¿cómo puede una función, al pasar diferentes matrices en diferentes puntos de un programa, tener su tamaño calculado? Puedo pasarlo como un parámetro a la función, pero prefiero no tener que agregar otro parámetro si no es absolutamente necesario.

Aquí hay un ejemplo para ilustrar lo que estoy preguntando:

#include <stdio.h> #include <stdlib.h> #define SIZEOF(a) ( sizeof a / sizeof a[0] ) void printarray( double x[], int ); int main() { double array1[ 100 ]; printf( "The size of array1 = %ld./n", SIZEOF( array1 )); printf( "The size of array1 = %ld./n", sizeof array1 ); printf( "The size of array1[0] = %ld./n/n", sizeof array1[0] ); printarray( array1, SIZEOF( array1 ) ); return EXIT_SUCCESS; } void printarray( double p[], int s ) { int i; // THIS IS WHAT DOESN"T WORK, SO AS A CONSEQUENCE, I PASS THE // SIZE IN AS A SECOND PARAMETER, WHICH I''D RATHER NOT DO. printf( "The size of p calculated = %ld./n", SIZEOF( p )); printf( "The size of p = %ld./n", sizeof p ); printf( "The size of p[0] = %ld./n", sizeof p[0] ); for( i = 0; i < s; i++ ) printf( "Eelement %d = %lf./n", i, p[i] ); return; }


Ha respondido a su propia pregunta. Se calcula en tiempo de compilación, entonces, ¿cómo puede ''sizeof p'' posiblemente tener más de un valor durante el tiempo de ejecución?

Pasar el largo como un parámetro es una buena solución, de lo contrario, puede asegurarse de que sus matrices siempre terminen con algún valor especial (como cadenas y el byte nulo).


Los parámetros de función nunca tienen realmente tipo de matriz. Cuando el compilador ve

void printarray( double p[], int s )

o incluso

void printarray( double p[100], int s )

convierte uno a

void printarray( double* p, int s )

Entonces sizeof(p) es sizeof(double*) . Y sí, tendrás que pasar el tamaño como un parámetro.


Puede usar un valor centinela, que es la forma en que se manejan las cadenas. El inconveniente es que debe iterar sobre toda la matriz para encontrar su tamaño.

Por ejemplo, cuando tiene una cadena como:

char s1[] = "foobar";

Lo que realmente tiene es una matriz de longitud 7, siendo el séptimo punto un carácter de terminación nulo ''/ 0'' que sirve para indicar el final de la matriz / cadena.

Otra forma de hacerlo es crear una estructura que consta de un tamaño seguido de la matriz.


Si su matriz está terminada en nulo, puede recorrer la matriz y encontrar el último valor. Muchos operadores de cuerdas en C trabajan de esa manera

De lo contrario, no tienes muchas opciones.

sizeof devolverá el tamaño de p, que es un puntero y será igual a su tamaño int


Usted debe

  1. Pase el tamaño de la matriz como parámetro de la función
  2. Asegúrese de que la matriz finalice con un valor conocido y de que se detenga cuando alcance ese valor.

No hay una solución mágica C no es un lenguaje reflexivo. Los objetos no saben automáticamente lo que son.

Pero tienes muchas opciones:

  1. Obviamente, agregue un parámetro
  2. Envuelva la llamada en una macro y agregue automáticamente un parámetro
  3. Usa un objeto más complejo. Define una estructura que contiene la matriz dinámica y también el tamaño de la matriz. Luego, pase la dirección de la estructura.