Добрый день, столкнулся со сложностями по созданию макроса. Есть четыре сетевые переменные значение которых приходят с реле, необходимо при определенных значениях этих сетевых переменных, чтобы появлялось текстовое сообщение при определенной комбинации: фаза1, фаза2 , фаза3. Помогите написать макрос и объясните для чего нужен раздел глобальный макрос
В глобальном макросе определяешь глобальные переменные и можно написать свои функции, которые используются в других, обычных макросах
Например глобальный макрос
90696
#define gotoxy GOTOXY //+
#define clrscr CLRSCR //+
#define getch GETCH //+
#undef putchar
#define putchar PUTCHAR //+
#define kbhit KBHIT //+
#define printf PRINTF //+
//
unsigned long clock(void);
void INITIAL(int Lines, int Columns);
void GOTOXY(int xpos, int ypos);
void CLRSCR(void);
int GETCH(void);
int PUTCHAR(int cb);
int KBHIT(void);
int PRINTF(char *format, ...);
#define KEY_UP 72 //
#define KEY_DOWN 80 //
#define KEY_LEFT 75 //
#define KEY_RIGHT 77 //
#define KEY_SPACE 32 //
#define KEY_ESC 27 //
#define KEY_ENTER 13 //
#define SIZEX 16
#define SIZEY 17
#define FMAP_COUNTS 7 //
#define TRUE 1
#define FALSE 0
#define SCR_SP '\x95' //
//#define SCR_SP '\xB0' //
#define SCR_OB '\x7F' //
char* GAME_TITLE;
char* GAME_MENU;
int screen[SIZEX][SIZEY] = {0}; //
int map[4][4]; //
int px, py, score, nextmap;
int fmap[FMAP_COUNTS][4][4];
unsigned long CLOCK(void)
{
return *(DWORD*)(PSW + 38) * 100;
}
void print(void) //
{
int i, j;
int buff[SIZEX][SIZEY];
for(i = 0; i < SIZEY; i++) for(j = 0; j < SIZEX; j++) buff[j][i] = screen[j][i]; //
for(i = 0; i < 4; i++) for(j = 0; j < 4; j++) if(map[j][i]) buff[j + px][i + py] = 1; //
gotoxy(0, 0); //
for(i = 0; i < SIZEY; i++)
{
for(j = 0; j < SIZEX; j++)
{
putchar(buff[j][i] == 0 ? SCR_SP : SCR_OB); //
}
putchar('\n');
}
gotoxy(SIZEX + 1, 0); //
printf("Score: %i", score); //
}
void printnextmap(void) //
{
int i, j;
gotoxy(SIZEX + 1, 2);
printf("Next: ");
for(i = 0; i < 4; i++)
{
gotoxy(SIZEX + 2, i + 3);
for(j = 0; j < 4; j++)
{
putchar(fmap[nextmap][j][i] == 0 ? ' ' : SCR_OB); //
}
}
}
int getkey(void)
{
int c;
if(kbhit()) //
{
if((c = getch()) == 224) c = getch(); //
return c;
}
return FALSE;
}
int valnewpos(int x, int y) //
{
int i, j;
if(x < 0) return FALSE;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
{
if(map[j][i])
{
if((j + x >= SIZEX) || (i + y >= SIZEY)) return FALSE;
if(screen[j + x][i + y])
{
return FALSE;
}
}
}
}
return TRUE;
}
void rotatemap(void) //
{
#define inv(x) ((x * (-1)) + 3)
// inv(0) => 3
// inv(1) => 2
// inv(2) => 1
// inv(3) => 0
// /* Optimize!
int _map[4][4];
int i, j, sx = 4, sy = 4;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
{
_map[j][i] = map[j][i];
if(map[j][i])
{
if(i < sx) sx = i;
if(inv(j) < sy) sy = inv(j);
}
map[j][i] = 0;
}
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
if(_map[inv(i)][j]) map[j - sx][i - sy] = 1;
if(!valnewpos(px,py)) for(i = 0; i < 4; i++) for(j = 0; j < 4; j++) map[j][i] = _map[j][i];
}
int rnd(int max) //
{
max++;
// return (int)(rand() * max / RAND_MAX);
//return (int)RAND() % max;
return (int)rand() % max;
}
void sleep(int milsec) //
{
// clock_t t = clock();
// while(clock() - t < milsec);
Delay(milsec);
}
void deleteline(void) //
{
int i, j, k, cl;
for(i = SIZEY - 1; i >= 0; i--)
{
cl = 1;
for(j = 0, cl = 1; j < SIZEX; j++)
{
if(!screen[j][i]) cl = 0;
}
if(cl)
{
// /* Animation
gotoxy(0, i);
for(k = 0; k < SIZEX; k++) putchar('_'), sleep(20);
// /* ---------
score += (((i * (-1)) + SIZEY) * 10);
for(k = i; k > 0; k--)
{
for(j = 0; j < SIZEX; j++)
{
screen[j][k] = screen[j][k - 1];
}
}
i++;
print();
}
}
}
void createmap(void) //
{
int i, j;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
map[j][i] = fmap[nextmap][j][i];
py = 0;
px = SIZEX / 2;
nextmap = rnd(FMAP_COUNTS - 1);
printnextmap();
}
void clearscreen(void) //
{
int i, j;
for(i = 0; i < SIZEY; i++)
for(j = 0; j < SIZEX; j++)
screen[j][i] = 0;
}
void createrndscreen(void) //
{
int i, j, rn;
clearscreen();
rn = rnd(10);
for(i = SIZEY - 1; i >= (SIZEY - 1) - rn; i--)
for(j = 0; j < SIZEX; j++)
{
screen[j][i] = rnd(1);
}
}
void startgame(void) //
{
int i, j, c;
unsigned long tm;
clrscr();
px = SIZEX / 2;
py = 0;
score = 0;
tm = CLOCK();
nextmap = rnd(FMAP_COUNTS - 1);
createmap();
while(TRUE)
{
Delay(10); //----my debug
c = getkey();
switch(c)
{
case KEY_UP:
rotatemap();
break;
case KEY_SPACE:
rotatemap();
break;
case KEY_DOWN:
for(; valnewpos(px, py + 1); py++);
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
if(map[j][i]) screen[px + j][py + i] = 1;
print();
deleteline();
createmap();
break;
case KEY_LEFT:
if(valnewpos(px - 1, py)) px--;
break;
case KEY_RIGHT:
if(valnewpos(px + 1, py)) px++;
break;
case 'p':
getch();
break;
case KEY_ESC:
return;
}
// if((CLOCK() - tm) > 320)
if((CLOCK() - tm) > 520)
{
tm = CLOCK();
if(!(valnewpos(px, py + 1)))
{
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
if(map[j][i]) screen[px + j][py + i] = 1;
createmap();
deleteline();
}
else py++;
}
print();
for(i = 0; i < SIZEX; i++)
{
if(screen[i][0])
{
// CLRSCR();
gotoxy(30, SIZEY - 1);
printf("GAME OVER :( ");
return;
}
}
}
}
void gamemenu(void) //
{
int p = 1, c = 0;
const char* GAME_MENU = "\t" "\x1A" "1. Start\n"
"\t 2. Start & Add Random Blocks\n"
"\t 3. Info\n"
"\t 4. Exit";
clrscr(); printf("%s%s", GAME_TITLE, GAME_MENU);
gotoxy(9, 8);
while(TRUE) //
{
c = getch();
gotoxy(8, 8 + p - 1); //
putchar(' ');
switch(c)
{
case '1':
case '2':
case '3':
case '4':
p = c - '0';
case KEY_ENTER:
switch(p)
{
case 1:
clearscreen();
startgame();
gotoxy(20, SIZEY); printf("Press ESC to exit to main menu..."); while(getch() != KEY_ESC);
break;
case 2:
clearscreen();
createrndscreen(); //
startgame();
gotoxy(20, SIZEY); printf("Press ESC for exit to main menu..."); while(getch() != KEY_ESC);
break;
case 3:
clrscr();
/*
PRINTF( "%s%s", GAME_TITLE,
"\t\x1B Left \n"
"\t\x1A Right\n"
"\t\x19 Put Down\n"
"\tSpace Rotate\n"
"\tP Pause\n"
"\tESC Exit\n\n"
"Press any key...\n");
*/
printf( "%s%s", GAME_TITLE,
"\t\t\t<LEFT> Left \n"
"\t\t\t<RIGHT> Right\n"
"\t\t\t<DOWN> Put Down\n"
"\t\t\t<UP> or <SPACE> Rotate\n"
"\t\t\t<P> Pause\n"
"\t\t\t<ESC> Exit\n\n"
"Press any key... ");
getch(); if(kbhit()) getch();
break;
case 4: return;
}
clrscr(); printf("%s%s", GAME_TITLE, GAME_MENU);
p = 1;
break;
case KEY_UP:
if(p > 1) p--;
break;
case KEY_DOWN:
if(p < 4) p++;
break;
case KEY_ESC:
return;
}
gotoxy(8, 8 + p - 1); //
putchar('\x1A');
}
}
//
///// CONSOLE //////
#include <stdarg.h>
#define _lenBuff 1440
#define _Input PSW[136]
#define _dwInput *(DWORD*)(PSW + 136)
#define _BuffScr PSW[_ScrAddr]
#define _KbdStatus PSW[135]
//----------------------
#define ReversBit(reg, bitno) ((reg) ^= (1 << (bitno)))
#define GetKbdStatus(bitno) ((_KbdStatus) & (1 << (bitno)))
#define ResetKbdStatus(bitno) ((_KbdStatus) &= ( ~ (1 << ((bitno)))))
#define SetKbdStatus(bitno) ((_KbdStatus) |= ( 1 << ((bitno))))
//define (bitno) to KbdStatus
#define Shift 0
#define Ctrl 1
#define Repead 2
#define Caps 3
#define ru 4
#define en 5
#define ClrScreen 6
//----------------------------
#define ReversPSB(PSB_No) PSB[(PSB_No) / 8] ^= (1 << ((PSB_No) % 8))
static int _lTotal;
static int _cTotal;
const int _tabs = 8;
static int _SIZE_Scr;
static int _cCount, _lCount;
static char _savMark;
static BOOL _init;
static BYTE *_pBuffScr;
static int _ScrAddr;
static int _stdinNoEmpty;
void INITIAL(int Lines, int Columns)
{
_stdinNoEmpty = 0;
_init = TRUE;
SetKbdStatus(en);
// _KbdStatus = 32;
_dwInput = 0;
_lTotal = Lines;
_cTotal = Columns;
_SIZE_Scr = _lTotal * _cTotal;
_ScrAddr = PSW[10] - _SIZE_Scr/2;
PSW[138] = _ScrAddr;
CLRSCR();
return;
}
//-------------------------------------
int GETCH(void)
{
#define first blck.str[0]
#define second blck.str[1]
union pw {
int i;
char str[4];
};
static int flag;
static union pw blck;
switch( flag) {
case 1:
flag = 0;
if (! GetKbdStatus(Repead)) _dwInput = 0;
else Delay(100);
return second;
case 0:
do {
Delay(5);
blck.i = _dwInput;
if (GetPSBStatus(4)) *_pBuffScr = '_'; // Blink cursor
else *_pBuffScr = _savMark; //
} while(_dwInput == NULL);
*_pBuffScr = _savMark;
if (strlen(blck.str) != 1) {
flag = 1;
ResetKbdStatus(Ctrl);
ResetKbdStatus(Shift);
}
else {
if (GetKbdStatus(Ctrl) && isalpha(first)) first = first & 0x1F;
else {
if (GetKbdStatus(Caps)) {
if ((first >= 0xE0) || isalpha(first)) ReversBit(first, 5);
else if (first == 0xB8) ReversBit(first, 4);
}
if (GetKbdStatus(Shift)) {
if (isupper(first)) first = tolower(first);
else if (islower(first)) first = toupper(first);
else if ((first == 0xB8) || (first == 0xA8)) ReversBit(first, 4);
else if (first >= 0xC0) ReversBit(first, 5);
else if (first == '1') first = '!';
else if ((first == '2') && GetKbdStatus(ru)) first = '\"';
else if (first == '2') first = '@';
else if ((first == '3') && GetKbdStatus(ru)) first = 0xB9;
else if (first == '3') first = '#';
else if ((first == '4') && GetKbdStatus(ru)) first = ';';
else if (first == '4') first = '$';
else if (first == '5') first = '%';
else if ((first == '6') && GetKbdStatus(ru)) first = ':';
else if (first == '6') first = '^';
else if ((first == '7') && GetKbdStatus(ru)) first = '?';
else if (first == '7') first = '&';
else if (first == '8') first = '*';
else if (first == '9') first = '(';
else if (first == '0') first = ')';
else if (first == '-') first = '_';
else if (first == '=') first = '+';
else if (first == '\'') first = '\"';
else if (first == '[') first = '{';
else if (first == ']') first = '}';
else if (first == '\\') first = '|';
else if (first == ';') first = ':';
else if ((first == '/') && GetKbdStatus(en)) first = '?';
else if ((first == ';') && GetKbdStatus(en)) first = ':';
else if (first == ',') first = '<';
else if ((first == '.') && GetKbdStatus(ru)) first = ',';
else if (first == '.') first = '>';
else if (first == '`') first = '~';
}
}
if (! GetKbdStatus(Repead)) {
_dwInput = 0;
ResetKbdStatus(Ctrl);
ResetKbdStatus(Shift);
}
else Delay(100);
}
}
return first;
}
//-------------------------------------------
int KBHIT(void)
{
return _Input;
}
//-------------------------------------------
int PUTCHAR(int cb)
{
union pw {
int i;
char ch[4];
};
register int tmp;
union pw blck;
if (cb == EOF) return EOF;
blck.i = cb;
*_pBuffScr = _savMark;
switch (blck.ch[0]) {
case 0x07: //Bell - (ctrl+G)
Beep();
break;
case 0x8: //backspace - (ctrl+H /Delete)
if (_cCount != 0) {
_cCount--;
_pBuffScr--;
*_pBuffScr = ' ';
}
else return EOF;
break;
case 0x9: //Tab - (ctrl+I)
if (_cCount < (_cTotal - _tabs)) {
tmp = _tabs - _cCount % _tabs;
_cCount = _cCount + tmp;
}
else {
tmp = _cTotal -1 - _cCount;
_cCount = _cTotal-1;
}
_pBuffScr = _pBuffScr + tmp;
break;
case 0xA: //LF - line feed (ctrl+J)
_lCount++;
_pBuffScr = _pBuffScr + _cTotal - _cCount;
_cCount = 0;
break;
case 0xD: //CR - carriage return (ctrl+M /Enter)
_pBuffScr = _pBuffScr - _cCount;
_cCount = 0;
break;
case 0x03: //ETX - end of text (ctrl+C)
case 0x04: //EOT - end of transmission (ctrl+D)
case 0x1A: //ctrl+Z (SUB -substitute)
default:
*_pBuffScr = blck.ch[0];
_pBuffScr++;
_cCount++;
break;
}
_savMark = *_pBuffScr;
if (
_cCount >= _cTotal) {
_cCount =0;
_lCount++;
}
if (_lCount >= _lTotal) {
memmove(&_BuffScr, &_BuffScr + _cTotal/2, ((_lTotal-1) * _cTotal));
_lCount=_lTotal-1;
memset(&_BuffScr+(_lTotal-1) * _cTotal/2, ' ', _cTotal);
_savMark = ' ';
_pBuffScr = (BYTE *)&_BuffScr + _lCount * _cTotal + _cCount;
}
return cb;
}
//--------------------------------
int PRINTF(char *format, ...)
{
char *pBuff = Malloc(_lenBuff);
register int t;
int len;
va_list ptr;
va_start(ptr, format);
len = vsnprintf (pBuff, _lenBuff - 1, format, ptr);
va_end(ptr);
pBuff[len] = '\0';
for (t = 0; pBuff[t]; t++) PUTCHAR(pBuff[t]);
Free(pBuff);
return len;
}
//------------------------------------------------
void CLRSCR(void)
{
memset(&_BuffScr, ' ', _cTotal * _lTotal); //
_lCount = _cCount = 0;
_pBuffScr = (BYTE *)&_BuffScr;
_savMark = ' ';
return;
}
//---------------------------------------------
void GOTOXY(int xpos, int ypos)
{
_lCount = Min(Max(ypos, 0), (_lTotal - 1));
_cCount = Min(Max(xpos, 0), (_cTotal - 1));
*_pBuffScr = _savMark;
_pBuffScr = (BYTE *)&_BuffScr + _lCount * _cTotal + _cCount;
_savMark = *_pBuffScr;
}
И обычный макрос
90695
extern char* GAME_TITLE;
extern char* GAME_MENU;
extern int fmap[FMAP_COUNTS][4][4];
int t;
char* TITLE = "########### ########### ########### ######### ##### ### #######\n"
"# # # # # # # # # # # # # # #\n"
"# # # # # # # # # # # # # # \n"
" # ##### # ###### # ## # # \n"
" # # # # # # # # # # \n"
" # # # # # # # # # # #\n"
" ####### ########### ####### ### ##### ### ##### ###### \n\n";
char* MENU = "\t" "\x1A" "1. Start\n"
"\t 2. Start & Add Random Blocks\n"
"\t 3. Info\n"
"\t 4. Exit";
int Setmap[FMAP_COUNTS][4][4] =
{
{
{1, 1, 0, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
{
{1, 0, 0, 0},
{1, 0, 0, 0},
{1, 0, 0, 0},
{1, 0, 0, 0}
},
{
{0, 0, 1, 0},
{1, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
{
{1, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
{
{0, 1, 1, 0},
{1, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
{
{1, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
},
{
{1, 1, 1, 0},
{0, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
}
};
INITIAL(18, 80); //Set screen parameters to 18 rows(_cTotal) and 80 columns(_lTotal)
GAME_TITLE = TITLE;
GAME_MENU = MENU;
memcpy(fmap, Setmap, sizeof(Setmap));
srand(PSW[38]); //srand((unsigned)time(NULL))
gotoxy(0,8);
printf(" PETER_A PRESENTS THE GAME\n");
Delay(3000);
gotoxy(0, _lTotal);
t = 10;
while(t--) {
putchar('\n');
Delay(100);
}
gotoxy(0,5);
printf( "%s", GAME_TITLE);
Delay(2000);
t = 9;
while(t--) {
putchar('\n');
Delay(100);
}
Delay(500);
printf("Press any key to begin... ");
getch(); if(kbhit()) getch();
gamemenu();
gotoxy(0, _lTotal);
t = 12;
while(t--) {
putchar('\n');
Delay(100);
}
gotoxy(0,8);
printf(" Bye-bye take care of yourself!!!\n");
printf(" :)");
https://owen.ru/forum/showthread.php?t=33784&p=340895&viewfull=1#post340895
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot