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


struct IArray {
      int size;
      int* start;
  } IArray;

struct IArray* createIntDynArray(int size){
        struct IArray* p;
        p = (struct IArray*) malloc(sizeof(struct IArray));
        if (p == NULL) {printf("error in malloc createIntArray\n");  }
        p->size =size;
        p->start = (int*) malloc(size*sizeof(int));
          if (p->start == NULL) {printf("error in malloc createIntArray\n");   }
               // responsibility to check error in callee
        // initialize to zero
        int i;
        for(i=0; i< p->size; i++) {
            p->start[i]=0;
        }
        return p;
}
void  freeIntArray (struct IArray* p){
       free(p->start);
       free(p);
      }

void writeIntArray(struct IArray* p, int index, int value){
      if(index >= 0 && index < p->size){    p->start[index]=value;}
      else {printf("out of bound index writeInt\n"); }
      }

int  readIntDynArray(struct IArray* p, int index, int* resultCode){
     if(index >= 0 && index < p->size){  *resultCode = 0; return  p->start[index];}
      else {printf("out of bound index readInt\n"); *resultCode = -1; }
      }


void printIntArray(struct IArray* p){
      int index ;
      printf("printing array %d\n", p);
      for(index=0; index< p->size; index++)
      printf("%d, ",  p->start[index]);
      printf("end %d\n", p);
      }



int main(int argc, char *argv[])
{
  // function1: create
  // function2,3:  read , write  checking the limits
  // function4: delete (free)

  struct IArray* arrayDyn;
  arrayDyn = createIntDynArray(3);
  printIntArray(arrayDyn);
  int result =0;
  int r = readIntDynArray(arrayDyn, 335, &result);   // as r = p[335], but checks limit
  if (result == -1) { printf("there was error\n");}
  writeIntArray(arrayDyn, 1, 33);   // as p[1] = 33;  but checks limits
   writeIntArray(arrayDyn, 99, 33);
  printIntArray(arrayDyn);
  freeIntArray(arrayDyn);

//  printIntArray(arrayDyn);

  /*
  for(;;){
    arrayDyn = createIntDynArray(1000000);
    freeIntArray(arrayDyn);
  }
  */
 // for(;;){
 //   arrayDyn = createIntDynArray(1000000);
//    freeIntArray(arrayDyn);
 // }


/*
  struct IArray* arrayDyn2;
  arrayDyn2 = createIntDynArray(40);
 // r = readIntDynArray(arrayDyn2, 12);
  writeIntArray(arrayDyn2, 5, value);
  freeIntArray(arrayDyn2);
*/
  system("PAUSE");
  return 0;
}

