2017-06-20 2 views
2

J'ai reçu une fonction dont la valeur de retour est void *. Je dois retourner deux valeurs de cette fonction.Valeur de retour void * dans une fonction

void * studentsCount(int *Arr, int len, int score, int *lessCount, int *moreCount) { 
    if (Arr == NULL || len <= 0) 
     return NULL; 
    for (int i = 0; i < len; i++){ 
     if (Arr[i] < score) 
      *lessCount++; 
     else if (Arr[i] > score) 
      *moreCount++; 
    } 
    return lessCount; // <-- I need to return lesscount and morecount..! 
} 

Comment puis-je retourner les deux valeurs en utilisant le pointeur vide?

+4

Vous voulez peut-être '(* lessCount) ++;' – BLUEPIXY

+1

ne sais pas pourquoi vous revenez l'un d'eux puisque vous passons tous deux par référence. –

+2

Cette fonction est déjà en cours. Les pointeurs que vous passez pointent vers les valeurs dont vous avez besoin (bien, avec la correction @BLUEPIXY). –

Répondre

2

Vous n'avez pas à returnmoreCount et lessCount, il vous faut simplement mettre à jour leurs valeurs dans la fonction. Comme le type de retour void * est concerné, je suppose que cela signifie que si le tableau passé est un tableau "valide", si c'est le cas, vous pouvez choisir de retourner une valeur non nulle (dépend de la façon dont la fonction studentsCount est invoquée) .

L'appelant doit également se assurer moreCount et lessCount des points à un emplacement de mémoire valide, initialisé à propres valeurs

0

Non, vous devez passer au moins l'un d'eux par paramètre.

+1

Les deux sont passés par pointeur quand même. Il est possible de renvoyer plusieurs valeurs via un type de structure - ce qui serait préférable à un type de retour 'void *'. Étant donné que le code renvoie NULL lorsque le tableau ou la longueur ne sont pas valides, il semble probable que la fonction retourne le tableau (pointeur vers le début des données) quand il réussit, bien qu'il s'agisse d'une interface un peu bizarre. –

0

Vous devez passer les variables par référence lorsque vous appelez la fonction

studentsCount(<var Arr>,<var len>,<var score>,&<var lessCount>,&<var moreCount>); 

En plus , vous ne pouvez pas utiliser les opérateurs d'incrémentation ou de décrémentation dans une variable utilisée par référence, en raison de leur pointeur. Ci-joint un exemple de code de fonction, avec appel par référence pour les variables, je l'espère, cette aide vous

void ejemplo(int *valor1, int *valor2){ 
    int valor1_val=*valor1; 
    int valor2_val=*valor2; 
    printf("\nValues in Function\n"); 
    printf("Before Asignation\n"); 
    printf("Numero1 [%d]\nNumero2 [%d]\n",valor1_val,valor2_val); 
    valor1_val++; 
    valor2_val--; 
    printf("After Asignation\n"); 
    printf("Numero1 [%d]\nNumero2 [%d]\n\n",valor1_val,valor2_val); 
    *valor1=valor1_val; 
    *valor2=valor2_val; 
    printf("Return to Main Code\n\n"); 
} 

int main(int argc, char **argv){ 
    int numero1=100; 
    int numero2=100; 
    printf("In Main, before function call\n"); 
    printf("Numero1 [%d]\nNumero2 [%d]\n",numero1,numero2); 
    ejemplo(&numero1,&numero2); 
    printf("After function call\n"); 
    printf("Numero1 [%d]\nNumero2 [%d]\n",numero1,numero2); 
    exit(0); 
}