Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > popup под дос...не работает...


Автор: PuLN 24.4.2007, 22:39
всем привет!
помогите с кодом...
Код

#include "stdafx.h"
#include<stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>

#define BORDER  1
#define ESC 27
#define REV_VID 0x70
#define NORM_VID 7

void save_video(),restore_vodeo();
void gotoxy(),cls(),write_video();
void display_menu(),draw_border();

char *fruit[]={
"Apple",
"Orange",
"Pear",
"grapefruit",
"raspberry",
"strawberry"
};
char *color[]={
"red",
"yellow",
"Orange",
"green"
};

char *apple_type[]={
"red delicates",
"Dgonatan",
"Beliy Naliv",
"Antonovka"
};


int count;
int x,y;
int border;
char *menu();
char *keys();
int popup(menu,keys,count,x,y,border)
    {
    register int i,len;
    int endx,endy,choice;
    unsigned char *p;
        if((x>24)||(x<0)||(y<79)|| (y<0)){
            printf("vixod za predeli ekrana!");
            return -2;
        }


    len=0;
    for(i=0;i<count;i++)
        if(strlen(menu[i]) > len)
        len=strlen(menu[i]);
        endy=len+2+y;
        endx=count+1+x;
        if((endx+1>24)||(endy+1>79)){
        printf("vixod za predeli ekrana!");
        return -2;
        }
    p=(unsigned int*)malloc((endx-x+1)*(endy-y+1));
    if(!p)
    exit(1);

    void save_video(x,endx+1,y,endy+1,p);
    if(border) draw_border(x,y,endx,endy);
    
    void display_menu(menu,x,y,count);

    choice=get_resp(x,y,count,menu,keys);

    void restore_video(endx+1,y,endy+1,p);
    free(p);
    return choice;
    }

void main()
{
int i;
cls();
gotoxy(0,0);
    for(i=0;i<25;i++)
    printf("This is a text of popup menu");
    popup(fruit,"fruit",6,1,3,BORDER);
    popup(color,"color",4,5,10,BORDER);
    popup(apple_type,"type",4,10,18,BORDER);
}


  void display_menu(menu,x,y,count)
       char *menu[];
       int x,y,count;
       {
            register int i;
            for(i=0;i<count;i++,x++){
            gotoxy(x,y);
            printf(menu[i]);
     }
    }
    int startx,starty,endx,endy;
    void draw_border(startx,starty,endx,endy)

    {
        register int i;
        for(i=startx+1;i<endx;i++)
        {
            gotoxy(i,starty);
            putchar(179) ;
            gotoxy(i,endy);
            putchar(179);

        }
     for (i=starty+1;i<endy;i++)
     {
        gotoxy(startx,i);
        putchar(196);
        gotoxy(endx,i);
        putchar(196);

     }
     gotoxy(startx,starty);
     putchar(218) ;
     gotoxy(startx,endy);
     putchar(191);
     gotoxy(endx,starty);
     putchar(192);
     gotoxy(endx,endy);
     putchar(217);

    }
       get_resp(x,y,count,menu,keys);
       //int x,y,count;
      // char *menu[];
       //char *keys;
       {
        union inkey{
        char ch[2];
        int i;
    }c;
       }
       int arrow_chioce=0,key_choice;
       y++;

       gotoxy(x,y);

       write_video(x,y,menu[0],REV_VID);
       for(;;){
    while(!bioskey(1));
    c.i=bioskey(0);

    gotoxy(arrow_choice,y);
    write_video(x+arrow,choice,menu[arrow_choice],norm_vid);
    if(c.ch[0]) {
    key_choice=is_in(keys,tolower(c.ch[0]));
    if(key_choice) return key_choice-1;
    switch(c.ch[0]){
        case '\r': return arrow_choice;
        case ' ' : arrow_choice++;
        break;
        case ESC : return -1;
        };

    }
    else {
    switch(c.ch[1]){
        case 72 : arrow_choice--;
        break;
        case 80; arrow_choise++;
        break;
      };
    }

    if(arrow_choice==count) arrow_choice=0;
    if(arrow_choice<0) arrow_choice=count-1;

    gotoxy(x+arrow_choice,y);
    write_video(x+arrow_choice,y,menu[arrow_choice],REV_VID);
    }
    }

int x,y;
char *p;
int attrib;
void write_video(x,y,p,attrib)

{
    union REGS r;
    register int i,j;

    for(i=y; *p;i++){
    gotoxy(x,i);
      r.h.ah=9;
      r.h.bh=0;
      r.x.cx=1;
      r.h.al=*p++;
      r.h.bl=attrib;
      int86(0x10,&r,&r);

    }
}

void save_video(startx,endx,starty,endy,buf_ptr)
int startx,endx,starty,endy  ;
unsigned int *buf_ptr;
{
    union REGS r;
    register int i,j;
    for(i=starty;i<endy;i++)
        for(j=startxli<endx,j++){
        gotoxy(j,i);
        r.h.ah=8;
        r.h.bh=0;
        *buf_ptr++=int86(0x10,&r,&r);
        putchar(' ');
        }

}

void restore_video(startx,endx,starty,endy,buf_ptr)
int startx,endx,starty,endy;
unsigned int *buf_ptr;
{
    union REGS r;
    register int i,j;
    for(i=starty;i<endy;i++)
        for(j=startx;j<endx;j++){
          gotoxy(j,i);
          r.h.ah=9;
          r.h.bh=0;

          r.x.cx=1;
          r.h.al=*buf_ptr++;
          r.h.bl=*buf_ptr++;
          int86(0x10,&r,&r);
          }

    }

    void cls()
    {

    union REGS r;
    r.h.ah=6;
    r.h.al=0;
    r.h.ch=0;
    r.h.cl=0;
    r.h.dh=24;
    r.h.dl=76;
    r.h.bh=7;
    int86(0x10,&r,&r);

    }

Автор: JackYF 25.4.2007, 00:34
256 строк кода... Мдя...

Ты скажи, где конкретно у тебя код не работает. Никто, кроме мазохистов, это лопатить не будет.

Автор: dizzy1984 25.4.2007, 13:42
Вообщем согласен с предыдущим оратором.
Что значит
Цитата(PuLN @  24.4.2007,  22:39 Найти цитируемый пост)
помогите с кодом...

Хороший код, красивый.

Я помог тебе?

Автор: dumb 25.4.2007, 14:30
Цитата(PuLN @  24.4.2007,  22:39 Найти цитируемый пост)
помогите с кодом...

помогать не с чем. это - не код.
сие "нечто" написано, боюсь, еще до твоего рождения, посему синтаксис очень стар. разметка - хаос. и куча как синтаксических ошибок, так и опечаток, итд.

в сети можно найти куда более свежие и правильные "заготовки".

Автор: PuLN 25.4.2007, 20:10
да уж..я что то не подумал совсем...
код написан не до моего рождения,но он и правда старый.
по книжке написан, "Программирование на Си для профессионалов" ИВКсофт
год не помню..просто интересно стало повозится с Си именно.

ладно..я вобщем, думаю любителям чистого Си посвящается))

я компилил в BC 3.1 и в студии..ошибок 48..
видимо особенности,которых я не знаю, сказываются.
за советы буду благодарен;)

Автор: vinter 25.4.2007, 20:32
какие особенности? смотрим в код и что видим сразу же? бред
Код

void save_video(),restore_vodeo();
void gotoxy(),cls(),write_video();
void display_menu(),draw_border();

и это даже без детального просмотра, а код слишком убогий чтобы в нем разбираться..

Автор: PuLN 26.4.2007, 15:54
и какие особенности бреда?
что ж не так то?какие аргументы?

Автор: vinter 26.4.2007, 16:31
че за запятые?
так нельзя, обьявление ф-ии должно заверщаться точкой с запятой!

Автор: Daevaorn 26.4.2007, 16:38
Цитата(vinter @  26.4.2007,  17:31 Найти цитируемый пост)
так нельзя, обьявление ф-ии должно заверщаться точкой с запятой!

я бы на твоём месте не был бы столь категоричнымsmile

Автор: vinter 26.4.2007, 19:38
Цитата(Daevaorn @  26.4.2007,  16:38 Найти цитируемый пост)
я бы на твоём месте не был бы столь категоричным

поясни

Автор: Daevaorn 26.4.2007, 19:47
Цитата(vinter @  26.4.2007,  20:38 Найти цитируемый пост)
поясни

поясняюsmile Вот это заявление
Цитата(vinter @  26.4.2007,  17:31 Найти цитируемый пост)
так нельзя, обьявление ф-ии должно заверщаться точкой с запятой!

не верно. Чем спрашивается функции хуже переменных? Вот такой же код тебя не смущает:
Код

int a, b;

И с функциями тоже самое.

Автор: vinter 26.4.2007, 21:27
прикольно, не знал такогоsmile

Автор: Daevaorn 26.4.2007, 21:49
Цитата(vinter @  26.4.2007,  22:27 Найти цитируемый пост)
прикольно, не знал такого

вот поэтому и нужно быть сдержанным в высказываниях

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)