2017-04-21 9 views
2

J'essaie de comprendre exactement ce que ce code essaie d'accomplir. La fonction median a été donnée, mais j'ai ajouté la fonction principale et typedef/prototypes dans les efforts pour comprendre ce qu'elle fait, en passant quelque chose dans la fonction. Cependant je peux comprendre quoi ou comment y passer quelque chose. Je comprends que la fonction est une sorte de sorte. Ce que j'ai vraiment besoin de savoir, c'est ce qui est exactement transmis à la fonction? Un tableau d'index N?Comment passez-vous un tableau à une fonction comme ceci: void fooboo (char array [i]);

Nous vous remercions de votre aide!

#include <stdio.h> 
#include <stdlib.h> 

typedef unsigned char pix_t; 
pix_t median(pix_t window[N]); 

int main() { 

    pix_t window[] = { 4, 3, 2, 1 }; 
    pix_t output; 
    output = median(window[N]); 

} 

pix_t median(pix_t window[N]) 
{ 
    pix_t t[N], z[N]; 
    int ii, k, stage; 

    // copy locally 
    for (ii = 0; ii<N; ii++) z[ii] = window[ii]; 

    for (stage = 1; stage <= N; stage++) { 
     k = (stage % 2 == 1) ? 0 : 1; 
     for (ii = k; ii<N - 1; ii++) { 
      t[ii] = MIN(z[ii], z[ii + 1]); 
      t[ii + 1] = MAX(z[ii], z[ii + 1]); 
      z[ii] = t[ii]; 
      z[ii + 1] = t[ii + 1]; 
     } 
    } 

    return z[N/2]; 
} 
+4

Vous ne savez pas si je le manque, mais où est défini 'N'? Ça ne semble pas même compiler. – ray

+0

En outre, la fonction 'median' attend un tableau de' pix_t', mais vous n'envoyez qu'une seule valeur scalaire. – ray

Répondre

5

Compte tenu de la signature de la fonction

pix_t median(pix_t window[N]) 

un appel comme

median(window[N]); 

est faux. La fonction attend un tableau de pix_t avec au moins N éléments Notez, alors que vous passez une seule variable de type pix_t.

Morale de l'histoire :: Chaque fois que dans la confusion, vérifiez les types de données

La fonction doit être appelée avec un tableau, quelque chose comme

#define N 10         //any number 

int main(void) {        //note the change 

    pix_t window[N] = { 4, 3, 2, 1 }; 
    pix_t output; 
    output = median(window);     //passing the array 
} 

devrait faire.


Point à noter: en dépit de la notation de tableau utilisé dans la signature de la fonction

pix_t median(pix_t window[N]) { //.... 

dans la fonction, window est pas un tableau . Citant C11, chapitre §6.7.6.3

Une déclaration d'un paramètre comme « » tableau de type « » doit être réglée à « » pointeur qualifié pour type « », où les qualifications de type (le cas échéant) sont ceux spécifiés dans [ et ] de la dérivation de type tableau . [....]


Note:

Ce que je vraiment besoin de savoir est exactement ce qui est d'être passé à la fonction? Un tableau d'index N?

La signification des « éléments au moins N » fait référence à la garantie que le tableau a suffisamment d'espace de stockage pour contenir N éléments jusqu'à la position N-1, et non pas que les indices N, N+1, N+2, ... sont valides/adressable.

Vous pouvez le lire comme: «J'ai une garantie d'au moins N cellules d'espace de stockage pour que je puisse stocker à la plupartN éléments N-1 positions valides. » Cependant, il incombe au programmeur de garder une trace de ces détails manuellement pour éviter l'indexation dans un emplacement invalide et provoquer une erreur de segmentation; l'environnement ne le fera pas automatiquement pour vous.

+1

"La fonction attend un tableau de pix_t avec au moins N éléments". Cela semble incorrect. C'est avec at * most * 'N-1' éléments; "au moins" cela implique que vous pouvez indexer "N", "N + 1", etc., ce qui serait simplement segfault. – ray

+0

@ray je ne suis pas sûr. Je l'ai lu comme, "il est garanti que le pointeur permettrait au moins" N-1 "des index valides, bien que cela soit appliqué par le programmeur, pas par standard. –

+0

Je pense que je comprends ce que vous voulez dire, mais vous pouvez au moins préciser que le "au moins" est une garantie de l'espace indexable, pas comme dans "au moins" X-1 " ',' X + 1', etc " – ray

5

Avec window[N], vous transmettez un élément à la fonction. L'élément avec l'index N. Qui, en fonction de la valeur de N pourrait être hors limites.

Les tableaux se désintègrent naturellement aux pointeurs vers leur premier élément, et les fonctions déclarées pour prendre un tableau comme argument en réalité prennent un pointeur. Cela signifie que vous ne pouvez utiliser que le nom du tableau et que cela fonctionnera:

median(window);