⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int_expr.c

📁 LastWave
💻 C
📖 第 1 页 / 共 5 页
字号:
          for(j=1;j<size3;j++) *resFlt += array3[j];          break;        /* any */        case 4:          *resFlt = 0;          for(j=0;j<size3;j++) if (array3[j] != 0) {*resFlt = 1; break;}          break;        /* all */        case 5:          *resFlt = 1;          for(j=0;j<size3;j++) if (array3[j] == 0) {*resFlt = 0; break;}          break;        /* mean */        case 6:          *resFlt = array3[0];          for(j=1;j<size3;j++) *resFlt += array3[j];          *resFlt/=size3;          break;        }        Clean(*resVC);        return(FloatType);       }            if (r == RangeType) {        rg3 = (RANGE) *resVC;        if (rg3->size == 0) {          SetErrorf("Not expecting emty range");          *left = begin2+1;          Clean(*resVC);          return(0);        }        switch(opIndex) {                /* sum */        case 3 :          *resFlt = rg3->size*rg3->first+rg3->step*rg3->size*(rg3->size-1)/2;          break;        /* any */        case 4 :          if (rg3->first != 0 || rg3->size != 1) *resFlt = 1;          else *resFlt = 0;          break;        /* all */        case 5 :           f1 = -rg3->first/rg3->step;          if (f1 >= 0 && f1 <rg3->size && f1 == ((int) f1)) *resFlt = 0;          else *resFlt = 1;          break;        /*min and max */        case 1: case 2:                    if (rg3->step >= 0) {            if (opIndex == 1) *resFlt = rg3->first;            else if (opIndex == 1) *resFlt = rg3->first;            else *resFlt = RangeLast(rg3);          }          else {            if (opIndex == 2) *resFlt = rg3->first;            else *resFlt = RangeLast(rg3);          }          break;        }                  Clean(*resVC);        return(FloatType);       }    }           /* Case op(expression,expression) */     if (opIndex >= 3) {       SetErrorf("Bad syntax");       *left = begin;       Clean(*resVC);       return(0);     }     if (**left != ',') {       SetErrorf("Expecting a comma");       *left = begin;       Clean(*resVC);       return(0);     }          vc3 = *resVC;     temp = *resFlt;     begin = *left+1;     oldFlagSpace = defParam->flagSpace;     defParam->flagSpace = YES;     if (r == SignalType || r == RangeType) r = RangeType | SignalType;     if (!(r=TTExpr1(begin,left,resFlt,resVC,r,defParam))) return(0);     defParam->flagSpace = oldFlagSpace;     if (**left != ')') {       SetErrorf("Expecting a ')'");       *left = begin;       Clean(*resVC);       return(0);     }     if (r & flagType == 0) {       if (r==FloatType) SetErrorf("Not expecting a LWFLOAT");       else if (r==SignalType) SetErrorf("Not expecting a signal");       else if (r==ImageType) SetErrorf("Not expecting an image");       *left = begin2;       Clean(*resVC);       return(0);     }          (*left)++;          /* Case of floats */     if (r == FloatType) {       if (opIndex == 1) *resFlt = MIN(*resFlt,temp);       else *resFlt = MAX(*resFlt,temp);       Clean(*resVC);       return(r);     }       /* Case of images */     if (r == ImageType) {       i1 = (IMAGE) *resVC;       i2 = (IMAGE) vc3;       if (i1->nrow != i2->nrow || i1->ncol != i2->ncol) {         SetErrorf("Images should have the same size");         *left = begin2;         Clean(*resVC);         return(0);       }       if (i1->nRef == 1) i3 = i1;       else if (i2->nRef == 1) i3 = i2;       else {         i3 = TNewImage();         SizeImage(i3,i1->ncol,i1->nrow);       }       *resVC = (VALUE) i3;       if (opIndex == 1) {         for (j=0;j<i3->nrow*i3->ncol;j++) i3->pixels[j] = MIN(i1->pixels[j],i2->pixels[j]);       }       else {         for (j=0;j<i3->nrow*i3->ncol;j++) i3->pixels[j] = MAX(i1->pixels[j],i2->pixels[j]);       }       return(r);     }       /* Case of signals/ranges */     if (GetTypeValue(vc3) == rangeType) {       s1 = NULL;       rg1 = (RANGE) vc3;       size1 = rg1->size;     }     else {       s1 = (SIGNAL) vc3;       rg1 = NULL;       size1 = s1->size;     }     if (r == RangeType) {       s2 = NULL;       rg2 = (RANGE) *resVC;       size2 = rg2->size;     }     else {       s2 = (SIGNAL) *resVC;       rg2 = NULL;       size2 = s2->size;            }     if (size1 != size2) {       SetErrorf("Signals/ranges should have the same size");       *left = begin2;       Clean(*resVC);       return(0);     }     if (s1 && s1->nRef == 1) s3 = s1;     else if (s2 && s2->nRef == 1) s3 = s2;     else {       s3 = TNewSignal();       if (s1) {         SizeSignal(s3,size1,s1->type);         CopyFieldsSig(s1,s3);         if (s1->type == XYSIG) memcpy(s3->X,s1->X,s1->size*sizeof(LWFLOAT));       }       else SizeSignal(s3,size1,YSIG);     }     *resVC = (VALUE) s3;     if (opIndex == 1) {       if (rg1) {         if (rg2) for (j=0;j<s3->size;j++) s3->Y[j] = MIN(RangeVal(rg1,j),RangeVal(rg2,j));         else for (j=0;j<s3->size;j++) s3->Y[j] = MIN(RangeVal(rg1,j),s2->Y[j]);       }       else {         if (rg2) for (j=0;j<s3->size;j++) s3->Y[j] = MIN(s1->Y[j],RangeVal(rg2,j));         else for (j=0;j<s3->size;j++) s3->Y[j] = MIN(s1->Y[j],s2->Y[j]);       }     }     else {       if (rg1) {         if (rg2) for (j=0;j<s3->size;j++) s3->Y[j] = MAX(RangeVal(rg1,j),RangeVal(rg2,j));         else for (j=0;j<s3->size;j++) s3->Y[j] = MAX(RangeVal(rg1,j),s2->Y[j]);       }       else {         if (rg2) for (j=0;j<s3->size;j++) s3->Y[j] = MAX(s1->Y[j],RangeVal(rg2,j));         else for (j=0;j<s3->size;j++) s3->Y[j] = MAX(s1->Y[j],s2->Y[j]);       }     }     return(r);  }  /***********************************************************   *    * Operators "find"   *    * 'op(expression)' returns a signal/image   *   ***********************************************************/  /* Eighth array */  arrayIndex = 8;  for (op = opArray8, opSize = opSizeArray8 ;;op++,opSize++) {                                                             if (*op == NULL) break;     if (!strncmp(begin,*op,*opSize) && !IsValidSymbolChar(begin[*opSize])) break;   }  opIndex = op-opArray8+1;      if (*op != NULL) {        *left = begin;        /* Check some types */    if (!(flagType & (ImageType | SignalType))) {      SetErrorf("Not expecting a signal or an image");      Clean(*resVC);      return(0);    }    /* Skip operator */    begin2= begin;     begin  += *opSize;     ParamSkipSpace(begin);     *left = begin;    /* test (... */    if (*begin != '(') {      SetErrorf("Expecting a '('");      *left = begin;      Clean(*resVC);      return(0);    }    begin2 = begin;        /* Read expression */    begin1 = begin;    begin++;    *left = begin;    oldFlagSpace = defParam->flagSpace;    defParam->flagSpace = YES;    if (!(r=TTExpr1(begin,left,resFlt,resVC,ImageType | SignalType,defParam))) return(0);    defParam->flagSpace = oldFlagSpace;        if (**left != ')') {      SetErrorf("Expecting a ')'");      Clean(*resVC);      return(0);        }    (*left)++;    if (r == SignalType) {      s1 = (SIGNAL) *resVC;      s3 = TNewSignal();      for(j1=0,j=0;j<s1->size;j++) {        if (s1->Y[j] != 0) j1++;      }      SizeSignal(s3,j1,YSIG);      for(j1=0,j=0;j<s1->size;j++) {        if (s1->Y[j] != 0) s3->Y[j1++] = j;      }      *resVC = (VALUE) s3;      return(SignalType);    }    if (r == ImageType) {      i1 = (IMAGE) *resVC;      i3 = TNewImage();      for(n=0,j=0;j<i1->nrow;j++) {        for(j1=0;j1<i1->ncol;j1++) {          if (i1->pixels[j*i1->ncol+j1] != 0) n++;        }      }      SizeImage(i3,n,2);      for(n=0,j=0;j<i1->nrow;j++) {        for(j1=0;j1<i1->ncol;j1++) {          if (i1->pixels[j*i1->ncol+j1] != 0) {            i3->pixels[n] = j;            i3->pixels[(n++)+i3->ncol] = j1;          }        }      }            *resVC = (VALUE) i3;      return(ImageType);    }  }          /***********************************************************   *    *  A terminal expression   *    *    *   ***********************************************************/      r = TermExpr(begin,left,resFlt,resVC,flagType,defParam);   if (r==NO) return(0);      return(r);}/* * Generic function that Sets the output of a binary operator on floats, images, ranges and signals * * This function is called below by the TTExpr<n> functions which deal with binary * operators, i.e., the functions TTExpr<n> functions with 2<=n<=7 * * If both arguments of the operator are floats then this function is not called. * If one of the argument is neither a range, a signal, an image or a LWFLOAT it is not called either. * * The arguments are :  * *    - r1, vc1 : correspond to the first argument of the binary operator (r1 is the type *                and vc1 the corresponding variable content). If it is a LWFLOAT then *                vc1 = NULL *    - r2, vc2 : correspond to the second argument of the binary operator (r2 is the type *                and vc2 the corresponding variable content). If it is a LWFLOAT then *                vc2 = NULL *    - flag    : one of '+', '*' or '/' to manage more efficiently vectors  *                (a range + a range with the same step is a range .....) * * The function returns 1 if succeded and 0 otherwise. * (allocation wil be performed only if necessary). *       *  */static unsigned char TTSetOutput2(unsigned char r1, VALUE vc1,  unsigned char r2, VALUE vc2, VALUE *vc3, char flag) {   char flagRange;   char flagTemp1;   char flagTemp2;   SIGNAL s1,s2,s3;   IMAGE i1,i2,i3;   RANGE rg1,rg2,rg3;   unsigned char r3;   /* Some checkings */   if (r1!=SignalType && r1 != RangeType && r1 != ImageType && r1 != FloatType ||       r2!=SignalType && r2 != RangeType && r2 != ImageType && r2 != FloatType)        Errorf("TTSetOutput2() : Weird 1");   if (r1 == FloatType && r2 == FloatType) {     Errorf("TTSetOutput2() : Weird 2");   }         /* Bad combination error */   if (((r1==SignalType || r1 == RangeType) && r2==ImageType) || ((r2==SignalType|| r2 == RangeType) && r1==ImageType)) {     SetErrorf("Bad combination image - signal or range");     return(0);   }   /*     * Just set the variables     */   *vc3 = NULL;   s1 = s2 = s3 = NULL;   i1 = i2 = i3 = NULL;   rg1 = rg2 = rg3 = NULL;   if (r1 == SignalType) s1 = (SIGNAL) vc1;   else if (r1 == RangeType) rg1 = (RANGE) vc1;   else if (r1 == ImageType) i1 = (IMAGE) vc1;   if (r2 == SignalType) s2 = (SIGNAL) vc2;   else if (r2 == RangeType) rg2 = (RANGE) vc2;   else if (r2 == ImageType) i2 = (IMAGE) vc2;   if (vc1 && vc1->nRef == 1) flagTemp1 = YES;   else flagTemp1 = NO;   if (vc2 && vc2->nRef == 1) flagTemp2 = YES;   else flagTemp2 = NO;         /*    * Case one argument is a signal or a range    */   if (r1==SignalType || r2 == SignalType || r1 == RangeType || r2 == RangeType) {        /* If both are signals or ranges we must check their sizes */     if (r1==SignalType && r2 == SignalType && s1->size != s2->size) {       SetErrorf("Signals have different size");       return(0);     }     if (r1==SignalType && r2 == RangeType && s1->size != rg2->size) {       SetErrorf("Signal and range have different size");       return(0);     }     if (r2==SignalType && r1 == RangeType && s2->size != rg1->size) {       SetErrorf("Range and signal have different size");       return(0);     }     if (r2==RangeType && r1 == RangeType && rg2->size != rg1->size) {       SetErrorf("Ranges have different size");       return(0);     }      /* Is the result a range ? */     if (flag=='+' && ((r1 == RangeType && r2 == FloatType) || (r2 == RangeType && r1 == FloatType) ||          (r1 == RangeType && r2 == RangeType))) flagRange = YES;      else if (flag=='*' && ((r1 == RangeType && r2 == FloatType) || (r2 == RangeType && r1 == FloatType))) flagRange = YES;     else if (flag=='/' && (r1 == RangeType && r2 == FloatType)) flagRange = YES;     else flagRange = NO;            /* Set rg3 if necessary */     if (flagRange) {       if (flagTemp1 && r1 == RangeType) rg3 = rg1;       else if (flagTemp2 && r2 == RangeType) rg3 = rg2;       else rg3 = TNewRange();       *vc3 = (VALUE) rg3;       r3 = RangeType;       if (rg1) rg3->size = rg1->size;       else if (rg2) rg3->size = rg2->size;     }          /* Set s3 if necessary */     else {       if (r1 == SignalType && flagTemp1) s3 = s1;       else if (r2 == SignalType && flagTemp2) s3 = s2;       else {         s3 = TNewSignal();         if (r1==SignalType) {           SizeSignal(s3,s1->size,s1->type);           CopyFieldsSig(s1,s3);     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -