Me dieron una función cuyo valor de retorno es void *. Necesito devolver dos valores de esa función.

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..!
}

¿Cómo puedo devolver ambos valores usando puntero vacío?

2
Sai Shankar 20 jun. 2017 a las 19:15

3 respuestas

La mejor respuesta

No tiene que return moreCount y lessCount, solo tiene que actualizar sus valores dentro de la función.

Según el tipo de devolución void * se refiere, supongo que significa que si la matriz aprobada es una matriz "válida", si lo es, puede elegir devolver un valor no nulo (depende de cómo studentsCount se invoca la función).

La persona que llama también debe asegurarse de que moreCount y lessCount apunten a una ubicación de memoria válida, inicializada a valores apropiados

2
P0W 20 jun. 2017 a las 16:20

Debe pasar las variables por referencia al llamar a la función

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

Además, no puede utilizar los operadores de incremento o decremento en una variable utilizada por referencia, debido a que son un puntero. Adjunto un ejemplo de código de función, con llamada por referencia para variables, espero que esto te ayude

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);
}
0
RodrigoBurgosMella 21 jun. 2017 a las 16:53

No, debe pasar al menos uno de ellos por parámetro.

0
James Maa 20 jun. 2017 a las 16:16