22.4.4 tee_avain
Seuraava on hahmotelma siitä, miten cJasen voisi alustaa
avaimensa. Jos on käytössä "viisaat kenttä- luokat",
niin silloin tietenkin kukin kenttä itse osaa muuttua avaimeksi.
/****************************************************************************/
void cJasen::tee_avain(int kentan_nro)
{
void *p; char s[20]; unsigned char *a;
int i; double d;
int tyyppi;
i = sizeof(avain);
if ( i < 20 ) {
printf("TEE AVAIN: Liian pieni avainkenttä!\n");
return;
}
tyyppi = kentan_tyyppi(kentan_nro);
p = kentan_osoite(kentan_nro);
switch (tyyppi) {
case Tjono:
kopioi_jono(N_S(avain),p);
poista_tyhjat(avain);
for (a=(unsigned char *)avain; *a; a++) {
*a = JARJESTYS.avainarvo[*a];
}
poista_tyhjat(avain);
return;
case Tsotu:
kopioi_jono(N_S(s),p); liita_jono(N_S(s)," ");
kopioi_jono(N_S(avain),s);
avain[0] = s[4]; /* Vaihdetaan pv ja vuosi keskenään! */
avain[1] = s[5];
avain[4] = s[0];
avain[5] = s[1];
return;
case Tint:
i = *(int *)p;
sprintf(avain,"%+05d",i);
if ( avain[0] == '- ' ) avain[0]='+'- 1; /* jotta - < + */
return;
case Tdouble:
d = *(double *)p;
sprintf(avain,"%+015.7lf",d);
if ( avain[0] == '- ' ) avain[0]='+'- 1; /* jotta - < + */
return;
default:
printf("TEE AVAIN: Ei ole kenttää %d!\n",kentan_nro);
return;
}
}
- Miksi kokonais- ja reaaliluvut käsiteltiin kuten edellä
eikä käyttäen aliohjelmaa kentta_jonoksi?
-
- "Kommentoi" (eli miksi tehdään?) tee_avain aliohjelman
jokainen rivi.
-
- Miten MacAnkka ja McAnkka käsiteltäisiin?
- Miten käsiteltäisiin Gauß?