#ifndef AlinitH
#define AlinitH
#define  NPL   5000     /* число участков */
#define  LEN_G 10000000  /* размер рабочего простанства */
#define  SIZE_PG 50000   /* размер страницы массива векторов */

#define  NOVEC       8  /* нет вектора в массиве векторов */
#define  BIGLENV     9  /* размер вектора больше размера страницы */
#define  BIGLENMVC  10  /* число векторов превысило заявленное */
#define  NOSEQ      11  /* следование векторов не в возрастающем порядке */
#define  NOSTOR     12  /* нет памяти             */
#define  NOFRPLOT   13  /* слишком много участков */
#define  NOUSTN     14  /* массив не установлен   */
#define  ERRDATA    15  /* ошибка в данных        */
#define  ERRVNAME   16  /* ошибка в записи наименования */
#define  EOFDAT     17  /* преждевременный конец файла  */

#define CHECK(text)\
        if (rc!=0){\
           ErrorAppMessage(((AnsiString)text + "rc="+IntToStr(rc)).c_str());\
           return rc;\
        }
#define ALLOCMVC(mvc,pol,type)\
        rc = almvc(mvc,pol,sizeof(type));\
        CHECK("ALLOCMVC")
#define ALLOCVEC(vec,len,type)\
        vec = (type*)alvec((int)((len)*sizeof(type)),&rc);\
        CHECK("ALLOCVEC")

#define ALLOCMAT(mat,pol,len)\
        mat=(double**)almat((int)(pol),(int)(len),&rc);\
        CHECK("ALLOCMAT")

#define ALLOCMAT_I(mat,pol,len)\
        mat=(int**)almat_i((int)(pol),(int)(len),&rc);\
        CHECK("ALLOCMAT_I")

#define ALLOCMAT_I_(mat,pol,len)\
        mat=(int**)almat_i((int)(pol),(int)(len),&rc);\
        if (rc>0) { ErrorAppMessage(("Error almat_i, rc="+IntToStr(rc)).c_str()); return;}

#define ALLOCMAT_F(mat,pol,len)\
        mat=(float**)almat_f((int)(pol),(int)(len),&rc);\
        CHECK("ALLOCMAT_F")

#define ALLOCMAT_F_(mat,pol,len)\
        mat=(float**)almat_f((int)(pol),(int)(len),&rc);\
        if (rc>0) { ErrorAppMessage(("Error almat_f, rc="+IntToStr(rc)).c_str()); return;}
        

#define ALLOCMAT_B(mat,pol,len)\
        mat=(bool**)almat_b((int)(pol),(int)(len),&rc);\
        CHECK("ALLOCMAT_B")

#define ALLOCMVC_(mvc,pol,type)\
        rc = almvc(mvc,pol,sizeof(type));\
        if (rc>0) { ErrorAppMessage(("Error almvc_, rc="+IntToStr(rc)).c_str()); return;}

#define ALLOCVEC_(vec,len,type)\
        vec = (type*)alvec((int)((len)*sizeof(type)),&rc);\
        if (rc>0) { ErrorAppMessage("Error alvec_"); return;}

#define ALLOCMAT_(mat,pol,len)\
        mat=(double**)almat((int)(pol),(int)(len),&rc);\
        if (rc>0) { ErrorAppMessage("Error almat_"); return;}

#define NULLMVC(mvc)\
        mvc.addr_page=NULL

#define LOCMVC(mvc)\
        ((mvc->addr_page==NULL) ? 1:0)

#define VECTSELO(mvc,vec,pol,len,type)\
        vec = (type*)almveco(mvc,pol,len,&rc);\
        CHECK("VECTSELO")

#define VECTSELO_(mvc,vec,pol,len,type)\
        vec = (type*)almveco(mvc,pol,len,&rc);\
        if (rc>0) { ErrorAppMessage("Error VECTSELO_ "); return;}

#define VECTSEL(mvc,vec,pol,len,type)\
        vec = (type*)almvec(mvc,pol,&len,&rc);\
        CHECK("VECTSEL")

#define VECTSEL_(mvc,vec,pol,len,type)\
        vec = (type*)almvec(mvc,pol,&len,&rc);\
        if (rc>0) { ErrorAppMessage("Error VECTSEL_ "); return;}

#define FREEVEC(vec)\
        rc=frevec((char**)&vec);\
        CHECK("FREEVEC")

#define FREEVEC_(vec)\
        rc=frevec((char**)&vec);\
        if (rc>0) { ErrorAppMessage("Error frevec"); return;}

#define FREEMAT(mat)\
        rc=fremat((char***)&(mat));\
        CHECK("FREEMAT")

#define FREEMAT_(mat)\
        rc=fremat((char***)&(mat));\
        if (rc>0) { ErrorAppMessage("Error fremat"); return;}

#define FREEMVC(mvc)\
        rc=fremvc(&mvc);\
        CHECK("FREEMVC")

#define FREEMVC_(mvc)\
        rc=fremvc(&mvc);\
        if (rc>0) { ErrorAppMessage("Error"); return;}

typedef struct _mvc                  /* Оглавление массива векторов */
    {
      short size;                    /* размер элемента */
      int   len_mvc;
      int   cur_num;                 /* текущий номер   */
      char   ** addr_page;              /* Адрес страницы */
      short  *shift;                 /* Сдвиг относительно начала страницы */
      short  *len;                   /* Длина вектора */
    }  DSC_MVC;

typedef struct _stor{
     char *befep[NPL];
     int lefep[NPL];
     char flagep[NPL];  /* 0 - свободен */
     int nep;
     int nop;
}STOR;

int alinit();
char* alvec(int,int*);
double** almat(int,int,int*);
float** almat_f(int,int,int*);
int** almat_i(int,int,int*);
bool** almat_b(int,int,int*);
char** almat_size(int pol, int len, int size, int *rc);
int almvc(DSC_MVC  * ,int,int);
char* almveco(DSC_MVC* , int, int, int*);
char * almvec(DSC_MVC*,int,int*, int*);
int fremat(char ***);
int frevec(char**);
int fremvc(DSC_MVC* );
void ErrorAppMessage(char* text);
int get_count();
int check_count(int count, int diff);

//---------------------------------------------------------------------------
#endif