Zoeken…


Opmerkingen

In C is het gebruikelijk om retourwaarden te gebruiken om fouten aan te geven die optreden; en om gegevens te retourneren door het gebruik van doorgegeven aanwijzingen. Dit kan om meerdere redenen worden gedaan; inclusief het niet hoeven toewijzen van geheugen op de heap of het gebruiken van statische toewijzing op het punt waar de functie wordt aangeroepen.

Aanwijzerparameters gebruiken om meerdere waarden te retourneren

Een veel voorkomend patroon in C, om gemakkelijk terugkerende meerdere waarden uit een functie te imiteren, is het gebruik van pointers.

#include <stdio.h>

void Get( int* c , double* d )
{
    *c = 72; 
    *d = 175.0;
}

int main(void)
{
    int a = 0;
    double b = 0.0;

    Get( &a , &b );

    printf("a: %d, b: %f\n", a , b ); 

    return 0;
}

Arrays doorgeven aan functies

int getListOfFriends(size_t size, int friend_indexes[]) {
  size_t i = 0;
  for (; i < size; i++) {
    friend_indexes[i] = i;
  }
}
C99 C11
/* Type "void" and VLAs ("int friend_indexes[static size]") require C99 at least. 
   In C11 VLAs are optional. */
void getListOfFriends(size_t size, int friend_indexes[static size]) {    
  size_t i = 0;
  for (; i < size; i++) {
    friend_indexes[i] = 1;
  }
}

Hier vraagt de static binnen de [] van de functieparameter dat de argumentarray minimaal evenveel elementen moet bevatten als zijn opgegeven (maw size elementen). Om die functie te kunnen gebruiken, moeten we ervoor zorgen dat de parameter size vóór de parameter array in de lijst komt.

Gebruik getListOfFriends() als volgt:

#define LIST_SIZE (50)

int main(void) {
  size_t size_of_list = LIST_SIZE;
  int friends_indexes[size_of_list];

  getListOfFriends(size_of_list, friend_indexes); /* friend_indexes decays to a pointer to the
                                                     address of its 1st element: 
                                                                      &friend_indexes[0] */

  /* Here friend_indexes carries: {0, 1, 2, ..., 49}; */

  return 0;
}

Zie ook

Multidimensionale arrays doorgeven aan een functie

Parameters worden doorgegeven door waarde

In C worden alle functieparameters doorgegeven door waarde, dus het wijzigen van wat wordt doorgegeven in callee-functies heeft geen invloed op de lokale variabelen van de bellerfuncties.

#include <stdio.h>

void modify(int v) {
    printf("modify 1: %d\n", v); /* 0 is printed */
    v = 42;
    printf("modify 2: %d\n", v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(v);
    printf("main 2: %d\n", v); /* 0 is printed, not 42 */
    return 0;
}

U kunt pointers gebruiken om callee-functies lokale variabelen van bellerfuncties te laten wijzigen. Merk op dat deze niet voorbij de hand, maar de pointer waarden verwijst naar de lokale variabelen worden doorgegeven.

#include <stdio.h>

void modify(int* v) {
    printf("modify 1: %d\n", *v); /* 0 is printed */
    *v = 42;
    printf("modify 2: %d\n", *v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(&v);
    printf("main 2: %d\n", v); /* 42 is printed */
    return 0;
}

Het retourneren van het adres van een lokale variabele aan de gebruiker resulteert echter in ongedefinieerd gedrag. Zie Dereferencing een aanwijzer naar variabele na de levensduur .

Volgorde van uitvoering van functieparameters

De volgorde van uitvoering van parameters is niet gedefinieerd in C-programmering. Hier kan het van links naar rechts of van rechts naar links worden uitgevoerd. De volgorde is afhankelijk van de implementatie.

#include <stdio.h>

void function(int a, int b) 
{
    printf("%d %d\n", a, b);
}

int main(void)
{
    int a = 1;
    function(a++, ++a);
    return 0;
}

Voorbeeld van een functie die struct met waarden met foutcodes retourneert

De meeste voorbeelden van een functie die een waarde retourneert, zijn een aanwijzer als een van de argumenten waarmee de functie de aangegeven waarde kan wijzigen, vergelijkbaar met het volgende. De werkelijke retourwaarde van de functie is meestal een type, zoals een int om de status van het resultaat aan te geven, of het werkte of niet.

int func (int *pIvalue)
{
    int iRetStatus = 0;             /* Default status is no change */

    if (*pIvalue > 10) {
        *pIvalue = *pIvalue * 45;   /* Modify the value pointed to */
        iRetStatus = 1;             /* indicate value was changed */
    }

    return iRetStatus;              /* Return an error code */
}

U kunt echter ook een struct als een retourwaarde gebruiken waarmee u zowel een foutstatus als andere waarden kunt retourneren. Bijvoorbeeld.

typedef struct {
    int    iStat;      /* Return status */
    int    iValue;     /* Return value */
}  RetValue;

RetValue func (int iValue)
{
    RetValue iRetStatus = {0, iValue};

    if (iValue > 10) {
        iRetStatus.iValue = iValue * 45;
        iRetStatus.iStat = 1;
    }

    return iRetStatus;
}

Deze functie kan vervolgens worden gebruikt zoals in het volgende voorbeeld.

int usingFunc (int iValue)
{
    RetValue iRet = func (iValue);

    if (iRet.iStat == 1) {
        /* do things with iRet.iValue, the returned value */
    }
    return 0;
}

Of het kan als volgt worden gebruikt.

int usingFunc (int iValue)
{
    RetValue iRet;

    if ( (iRet = func (iValue)).iStat == 1 ) {
        /* do things with iRet.iValue, the returned value */
    }
    return 0;
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow