/* dynaam.c */
/* SJ 060498 */

/* esimerkki dynaamisesta tilanvarauksesta */

#include <stdio.h>
#include <stdlib.h>

/* tilanvarausmakro */
#define NEWN(tyyppi, maara) \
	( (tyyppi*)malloc((maara)*sizeof(tyyppi)) )

/* funktio, joka palauttaa merkkijonosta
   löytämänsä kokonaisluvun, 0 muuten */
int luvuksi(char *m);

/* funktio, joka luo ja palauttaa parametrina
   saamansa luvun merkkijonona */
char *merkeiksi(int l);

int main()
{
  int N = 0, virhe = 0, i, *lukutau;
  char **mjonotau;

  do {
	  printf("Anna lukujen määrä:");
	  scanf("%d", &N);
  } while(N < 1);

  printf("Anna %d lukua:", N);

  lukutau = NEWN(int, N);
  /* siis sama kuin: */
  /* lukutau = (int*)malloc(N*sizeof(int)); */
 
  /* luetaan kokonaisluvut */
  for(i = 0; i < N; i++)
	  scanf("%d", &lukutau[i]);

  mjonotau = NEWN(char*, N);
  /* siis sama kuin: */
  /* mjonotau = (char**)malloc(N*sizeof(char*)); */

  /* siirretään luvut merkkijonomuotoon */
  for(i = 0; i < N; i++)
	  mjonotau[i] = merkeiksi(lukutau[i]);

  /* tarkistetaan täsmäsikö */
  for(i = 0; i < N; i++)
	  if (lukutau[i] != luvuksi(mjonotau[i])) {
		  printf("Eipä onnistunut\n");
		  virhe++;
	  }

  if (virhe)
	  printf("%d virhettä!\n", virhe);
  else
	  printf("Hyvin onnistui!\n");

  /* vapautetaan merkkijonot */
  for(i = 0; i < N; i++) {
	  free(mjonotau[i]);
	  mjonotau[i] = NULL;
  }

  /* vapautetaan taulukot */
  free(mjonotau);
  free(lukutau);

  mjonotau = NULL;
  lukutau = NULL;

  exit(virhe);

} /* main() */


/* lyhyt versio */
int luvuksi(char *m)
{
  int luku = 0;
  sscanf(m, "%d", &luku); 
  return luku;
} /* luvuksi */


/* lyhyt versio */
char *merkeiksi(int l)
{
  char *mjono;
  mjono = NEWN(char, 15); /* sopivan pituuden voisi 
							laskea logaritmillakin */
  /* siis sama kuin */
  /* mjono = (char *)malloc(15*sizeof(char)); */

  sprintf(mjono, "%d", l);

  return mjono;
} /* merkeiksi() */
