888集闭登录网10px 20px; 上下、左右外

文章来源:霍城在线    发布时间:2019年06月18日 07:41:02  【字号:      】

要在js的N个方法前执行一些判断代码,M个方法后执行处理代码。如果直接将代码写在具体方法里面增加处理代码,那会导致代码很难维护。对于这个需求,当时想到有2种解决方案。    1.新建一个抽象类,统一入口,然后在入口再分发到具体的方法。但需要对源代码进行不少改动。而且如何分发也是一些问题,如方法参数不一。所以就没坚持这种方案。    2.搬照spring的AOP编程。最后发现是可以实现的。    网上找了一些资料,修改整理了一个util类Js代码 /*            aop工具类            onedear 2011-06-10        */         var AOPUtil = {             /*                    className:个人称之为作用域,也可称之为类名                    fnName:方法名,字符串类型                    beforeFn:before function             */             before : function (className , fnName , beforeFn) {                 if(typeof(className) == 'function')                     className = className.prototype ;                 if(typeof(className[fnName]) != 'function')                     return ;                 if(typeof(beforeFn) != 'function')                     return ;                 var target = className[fnName] ;                  className[fnName] = function () {                     beforeFn.apply(this,arguments);                     return target.apply(this, arguments);                 }             },             beforeJudge : function (className , fnName , beforeFn) {                 if(typeof(className) == 'function')                     className = className.prototype ;                 if(typeof(className[fnName]) != 'function')                     return ;                 if(typeof(beforeFn) != 'function')                     return ;                 var target = className[fnName] ;                  className[fnName] = function () {                     var result = beforeFn.apply(this,arguments);                     if(!result)                         return ;                     return target.apply(this, arguments);                 }             },             //同上             after : function (className , fnName , afterFn ) {                 if(typeof(className) == 'function')                     className = className.prototype ;                 if(typeof(className[fnName]) != 'function')                     return ;                 if(typeof(afterFn) != 'function')                     return ;                 var target = className[fnName] ;                  className[fnName] = function () {                     var returnValue = target.apply(this, arguments);                     afterFn.apply(this,arguments);                     return returnValue;                 }             }         };  调用sampleJs代码 function before(){         alert("before");     }     function after() {         alert("after");     }  本人习惯的方法定义有这么几种:  1.handle = {         testHandle : function() {             alert("testHandle");         } } 则调用方法为 AOPUtil.before(window.handle,"testHandle" , after);   2.function test2() {         alert("test2");     } 则调用方法为: AOPUtil.before(window,"test2" , before);   3.var t = function(){};     t.prototype.test = function(param1 , param2) {         alert(param1+"_"+param2);     } 则调用方法为: AOPUtil.before(t, "test" , before);  js还有其他方法定义

p;   可以很清楚的看到0002803C处为0002A3A4,再用上面的方法算出物理偏移地址为000283A4,WINHEX显示如

atte

6、极冰地雷爆炸:在火炮兰的生命值下降至一定阶段后会在地面设置极冰地雷,一段时间后引爆,造成巨量伤

简单一些了,如图所示,client要从datanode上,读取FileA。而FileA由block1和block2组

] #include <iostream> #include <algorithm> #include <cstdlib> #include <ctime> using namespace std;  // 积木块的信息 #define BLOCK_SIZE  7 #define ROTATE_SIZE 4 #define SIDE_LEN    4 const int BLOCK_AREA = SIDE_LEN*SIDE_LEN; // 棋盘的信息 #define HORIZ_LEN   12 #define VERT_LEN    15 const int CHESS_AREA = HORIZ_LEN*VERT_LEN; // 其它信息 #define TOP_STEP    25 #define inf         10000 // 计分信息 const int clearLineScore[] = {0, 1, 3, 7, 13};  struct Block    // 积木块 {     void init(unsigned char *l)      {         memcpy(layout, l, BLOCK_AREA);         int i, j;         for (i=0; i<SIDE_LEN; i++)         {             for (j=SIDE_LEN-1; j>=0 && layout[j*SIDE_LEN+i]==0; j--);             maxRow[i] = j+1;         }         for(i=0; i<SIDE_LEN && maxRow[i]==0; i++);         minCol = i;         for (i=SIDE_LEN-1; i>=0 && maxRow[i]==0; i--);         maxCol = i;     }     unsigned char layout[BLOCK_AREA];   // 积木块的布局     unsigned char maxRow[SIDE_LEN];     // 积木块每一列所占区域的最大行,取值从1开始     unsigned char minCol;               // 积木块所占区域的最小值列和最大列,取值从0开始     unsigned char maxCol; };  Block blockSet[BLOCK_SIZE][ROTATE_SIZE];    // 7种积木块,每种积木块有4种旋转方向 unsigned char chess[CHESS_AREA];        // 棋盘的布局 unsigned char nextChess[CHESS_AREA];    // 下一步棋盘的布局 int height[HORIZ_LEN];                  // 棋盘每一列所占区域的最小行,即高度  void calcHeight(unsigned char *curchess)    // 计算当前棋盘的高度信息 {     int i, j;     for (i=0; i<HORIZ_LEN; i++)     {         for (j=0; j<VERT_LEN && curchess[j*HORIZ_LEN+i]==0; j++);         height[i] = j;     } }  // 计算若积木块从offsetX列落下,会落在第几行,即offsetY int calcBottomOffsetY(const Block& b, int offsetX)   {     int offsetY = VERT_LEN;     for (int i=0; i<SIDE_LEN; i++)     {         if (b.maxRow[i]==0) continue;         offsetY = min(offsetY, height[offsetX+i]-b.maxRow[i]);     }     return offsetY; }  // 将积木块贴到棋盘上 void pasteTo(unsigned char *curchess, const Block& b,     int offsetX, int offsetY) {     for (int i=b.minCol; i<=b.maxCol; i++)         for (int j=0; j<SIDE_LEN; j++)         {             unsigned char bij = b.layout[j*SIDE_LEN + i];             unsigned char& cij = curchess[(j+offsetY)*HORIZ_LEN + i+offsetX];             if (bij && cij==0)                 cij = bij;             else if (bij && cij)                 cout << "ERROR" << endl;         } }  // 消去[offsetY,offsetY+SIDE_LEN)中remline为1的行 void clearLines(unsigned char *curchess, int offsetY, unsigned char *remline) {     int i, j, gap=0;     for (j=offsetY+SIDE_LEN-1; j>=0; j--)     {         if (j-offsetY>=0 && remline[j-offsetY])             gap++;         else if (gap)         {             memcpy(curchess+(j+gap)*HORIZ_LEN, curchess+j*HORIZ_LEN, HORIZ_LEN);         }     } }  // 计算[offsetX,offsetX+SIDE_LEN)列的洞的个数 int calcHoles(unsigned char *curchess, int offsetX, int offsetY) {     int i, j;     int holeCount = 0;     for (i=offsetX; i<offsetX+SIDE_LEN; i++)     {         if (i<0 || i>=HORIZ_LEN) continue;         for (j=offsetY; j<VERT_LEN && curchess[j*HORIZ_LEN+i]==0; j++);         for (; j<VERT_LEN; j++)             if (curchess[j*HORIZ_LEN+i]==0)                 holeCount++;     }     return holeCount; }  // 计算当前棋盘的得分 int calcScore(unsigned char *curchess, int offsetX, int offsetY) {     int i, j, score = 0;     int remlineCount = 0;     unsigned char remline[SIDE_LEN] = {0};     // 统计消行数     for (j=offsetY; j<offsetY+SIDE_LEN; j++)     {         for (i=0; i<HORIZ_LEN && curchess[j*HORIZ_LEN+i]; i++);         if (i==HORIZ_LEN)          {             remlineCount++;             remline[j-offsetY] = 1;         }     }     score += clearLineScore[remlineCount];     // 统计洞的个数     if (remlineCount)         clearLines(curchess, offsetY, remline);     int holeCount = calcHoles(curchess, offsetX, offsetY) -                      calcHoles(chess, offsetX, offsetY);     score -= holeCount*4;     // 位置过高则扣分     if (holeCount > 5) score -= 15;     if (offsetY-remlineCount < VERT_LEN*3/5)         score -= VERT_LEN*3/5-(offsetY-remlineCount);     return score; }  void output(unsigned char *curchess) {     for (int j=0; j<VERT_LEN; j++)     {         for (int i=0; i<HORIZ_LEN; i++)             cout << curchess[j*HORIZ_LEN+i] << " ";         cout << endl;     } }  int main() {     srand(time(0));     int i, j, k, n, m;     // 初始化积木块     for (i=0; i<BLOCK_SIZE; i++)         for (j=0; j<ROTATE_SIZE; j++)         {             unsigned char l[BLOCK_AREA];             for (k=0; k<BLOCK_AREA; k++)                 scanf("%d",&l[k]);             blockSet[i][j].init(l);         }     // 初始化棋盘     for (i=0; i<CHESS_AREA; i++)         scanf("%d",&chess[i]);     // 显示前TOP_STEP步     int offsetX, offsetY;     unsigned char tmpchess[CHESS_AREA];     for (n=TOP_STEP; n>=0; n--)     {         output(chess);         calcHeight(chess);  // 为每一步计算一次height数组,避免计算offsetY时过多的重复计算         int bind = rand()%BLOCK_SIZE;   // 积木块的序号         int maxScore = -inf;         for (j=0; j<ROTATE_SIZE; j++)    // 要考虑积木块的各种旋转情况         {             const Block& b = blockSet[bind][j];     // 得到当前的积木块             for (offsetX=-b.minCol; offsetX<HORIZ_LEN-b.maxCol; offsetX++)             {                 // 计算从offsetX列落下,所落在棋盘的位置offsetY                 offsetY = calcBottomOffsetY(b, offsetX);                 if (offsetY<0) continue;                 memcpy(tmpchess, chess, CHESS_AREA);                 pasteTo(tmpchess, b, offsetX, offsetY); // 在棋盘中添加积木块                 int curScore = calcScore(tmpchess, offsetX, offsetY);   // 计算当前情况下的得分                 if (curScore > maxScore)                 {                     maxScore = curScore;  www.2cto.com                    memcpy(nextChess, tmpchess, CHESS_AREA);                 }             }         }         memcpy(chess, nextChess, CHESS_AREA);     } }&nbs

设备在使用之前必须向系统进行注册,设备注册是在设备初始化时完成

安装过程中遇到的

实现这样的一个提示窗口,只是针对自定义控件来说,应该是So easy的,不过这里我们想着会有一些比较完善的功能,比如,我们要同时去显示多个提示时,又该如何呢?这一点我们就要去模仿Toast原本的队列机制

在此工作表的K2、L2、M2中输入总计、班级排名、年级排名,再在K3、 L3、M3单元格中输入公式=SUM(E3:J3)、=SUMPRODUCT(($D$3888集闭登录网:$D$144=D3)*($K$3:$K$144& gt;K3))+1、=RANK(K3,$K$3:$K$144),分别用来计算每个学生的考试总分、在本班排名以及本年级的排名,并将这些公式复 制到下面对应的单元格中,学生的考试排名就出来

选择端口,点击添加端口,选择Standard TCP/IP Port后点击新端




(责任编辑:喻君)

专题推荐