Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [C] VAL argument lijst  (gelezen 1237 keer)

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
[C] VAL argument lijst
« Gepost op: 2009/12/24, 00:02:25 »
Hallo allemaal !

Ik heb vandaag nog eens met variabele argument lijsten zitten te spelen in C :

#include <stdio.h>
#include <stdarg.h>

double gemiddelde ( unsigned short arg_c, ... )
{
    if ( arg_c > 3 ) return 0;
    va_list arg_lijst;
    unsigned short a;
    double som = 0;
    for ( a = 0; a < arg_c; a++ )
    {
        som += va_arg ( arg_lijst, double );
    }
    va_end ( arg_lijst );
    return som / ( float ) arg_c;
}

int main ( void )
{
    printf ( "%f \n", gemiddelde ( 3, 40,0, 40,0, 40,0 ) );
    return 0;
}

Het probleem is echter dat het gewoon niet werkt. De bedoeling is dus het gemiddelde te berekenen van een variabel aantal getallen. Maar in plaats van het gemiddelde krijg ik rare getallen waar ik niets mee kan. Waar zit de fout ? Waar zou de fout kunnen zitten ? Ik heb echt geen idee. Ik hoop dat iemand me hiermee kan helpen.

Alvast bedankt !

Offline djurny

  • Lid
  • Steunpunt: Nee
Re: [C] VAL argument lijst
« Reactie #1 Gepost op: 2009/12/24, 07:57:04 »
je mist ergens de 'va_start(arg_lijst, arg_c)' ? en probeer het eens met echte doubles in de 'va_list';

#include <stdio.h>
#include <stdarg.h>

double gemiddelde ( unsigned short arg_c, ... )
{
    if ( arg_c > 3 ) return 0;
    va_list arg_lijst;
    unsigned short a;
    double som = 0;
    
    va_start(arg_lijst, arg_c);
    
    while (a < arg_c)
    {
        fprintf(stderr, "a='%u'\n", a);
        fprintf(stderr, "som='%f'\n", som);
        som += va_arg ( arg_lijst, double );
        a += 1;
    }
    
    va_end ( arg_lijst );
    
    return som / ( float ) arg_c;
}

double average(double d, ...) {
  va_list va;
  double avg;
  int num;
  
  avg = 0.0;
  
  va_start(va, d);

  avg = (avg + va_arg(va, double)) / ++num;
  
  va_end(va);
  
  return avg;
}


int main ( void )
{
    printf ( "%f \n", gemiddelde ( 3, 40,0, 40,0, 40,0 ) );
    printf ( "%f \n", gemiddelde ( 3.0, 40.0, 0.0, 40.0, 0.0, 40.0, 0.0 ) );
    printf("avg='%f'\n", average(1.0, 2.0, 3.0, 4.0, 5.0, 6.0));
    return 0;
}

$ gcc va_list.c -o va_list; ./va_list
a='0'                                                          
som='0.000000'                                                  
a='1'
som='0.000000'
a='2'
som='0.000000'
0.000000
a='0'
som='0.000000'
a='1'
som='40.000000'
a='2'
som='40.000000'
26.666667
avg='0.000010'
echo "Ka Me Ha Me Ha Me Ha!" | tr [A-Z] [a-z]

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] VAL argument lijst
« Reactie #2 Gepost op: 2009/12/24, 16:00:10 »
Enorm bedankt voor je antwoord, maar ik heb toch mijn eigen versie aan de praat gekregen. Vanmorgen heb ik gewoon even rustig bedacht wat de functie moet doen en hoe deze zou moeten werken, en dit is er dan uitgerold :

#include <stdio.h>
#include <stdarg.h>

float average ( unsigned short arg_c, ... )
{
    if ( arg_c > 3 )
        return 0;

    unsigned short a = 0;
    va_list arg_lijst;
    unsigned short som = 0;
   
    va_start ( arg_lijst, arg_c );
   
    while ( a < arg_c )
    {
        som += va_arg ( arg_lijst, int );
        a++;
    }   
 
    va_end ( arg_lijst );

    return som / arg_c;
}

int main ( void )
{
    printf ( "%f", average ( 2, 4, 10 ) );
    return 0;
}


Dit werkt goed. Maar als je het praktisch wilt gebruiken, verander dan het type van de variabel "som" in een int ( of een long / long long als je met heel veel en grote getallen gaat werken ).

Toch enorm bedankt !