web-dev-qa-db-fra.com

C Taille de la matrice transmise

Dupliquer possible:
[.____] Comment trouver la taille de "un pointeur pointant sur un tablea

Je comprends que la taille de l'opérateur est évaluée et remplacée par une constante au moment de la compilation. Étant donné que, comment une fonction peut être transmise de tableaux différents à différents moments d'un programme, a-t-il été calculé? Je peux le transmettre en tant que paramètre à la fonction, mais je préfère ne pas avoir à ajouter un autre paramètre si je n'ai absolument pas besoin.

Voici un exemple pour illustrer ce que je demande:

#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;
}
22
Untamed

Il n'y a pas de solution magique. C n'est pas une langue réfléchissante. Les objets ne savent pas automatiquement ce qu'ils sont.

Mais vous avez beaucoup de choix:

  1. Évidemment, ajoutez un paramètre
  2. Enveloppez l'appel dans une macro et ajoutez automatiquement un paramètre
  3. Utilisez un objet plus complexe. Définissez une structure contenant le tableau dynamique et la taille de la matrice. Ensuite, passez l'adresse de la structure.
18
DigitalRoss

Le problème est que votre fonction ne reçoit pas de valeur de matrice; Il reçoit une valeur de pointeur.

Sauf quand c'est l'opérande du sizeof ou unarys & opérateurs, ou il s'agit d'un littéral à chaîne utilisé pour initialiser un autre tableau dans une déclaration, une expression de type "tableau de T" sera convertie en type "pointeur sur T" et Sa valeur sera l'adresse du premier élément de la matrice.

Ainsi, lorsque vous appelez printarray, le type de array1 est implicitement converti de "Tableau de 100 éléments de double" à "pointeur sur double". Ainsi, le type de paramètre p est double *, ne pas double [100].

Dans le contexte d'une déclaration de paramètre de fonction, T a[] est identique à T *a.

C'est pourquoi vous devez transmettre la taille de la matrice séparément;

5
John Bode

Vous avez répondu à votre propre question. Il est calculé au moment de la compilation, alors comment "Taille de P" peut-il avoir plus d'une valeur pendant l'exécution?

Passer la longueur en tant que paramètre est une solution fine, sinon vous pouvez vous assurer que vos matrices se terminent toujours par une valeur spéciale (comme des cordes et l'octet null).

1
bobDevil

Vous pouvez utiliser une valeur sentinelle qui est la façon dont les chaînes sont traitées. L'inconvénient est que vous devez introduire sur toute la matrice pour trouver sa taille.

Par exemple, lorsque vous avez une chaîne telle que:

char s1[] = "foobar";

Ce que vous avez réellement, c'est un tableau de longueur 7, la septième endroit étant un NULL Terminant Char '\ 0' qui sert à indiquer la fin de la matrice/chaîne.

Une autre façon que vous puissiez le faire est de créer une structure qui consiste en une taille suivie de la matrice.

0
Robert S. Barnes

Vous devez soit

  1. Passez la taille de la matrice sous forme de paramètre sur la fonction
  2. Assurez-vous que la matrice se termine par une valeur connue et s'arrête lorsque vous atteignez cette valeur.
0
Scott Duckworth

Si votre tableau est NULL terminé, vous pouvez itérer via le tableau et trouver la dernière valeur. De nombreux opérateurs de cordes en C fonctionnent de cette façon

Sinon, vous n'avez pas beaucoup de choix.

tailleof retournera la taille de P, qui est un pointeur et sera égal à votre taille int

0
Eric