Народ помогите я в тупике... Не могу дописать уже 4 день 1 мелочь... Где ошибка? Что не так делаю?
Объясню принцип.. Когда переменная для скролирования становится крастно 46(полное окно), то текст должен переписаться в темповик, а потом счетаться из него в соответствие с тем куда движется текст.. Вниз всё ок, а вверх не могу дописать.. Не понимаю какие цифры нужны для этих смещений...
Вот код этого момента
if(c=='u')
while(++t!=yy+win/2)
{if(t<(yy-(win*3)/2)) fgets(byf,str_size,tmp);
else if(t>(yy-(win*3)/2)) { fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next; }
}
else if(c=='d')
while(++t!=(yy+win))
{if(t<yy) fgets(byf,str_size,tmp);
else if(t>yy) { fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next; }
}
fclose(tmp);
t=0;
if(c=='d')
p3=*text;
else if(c=='u')
{ p3=*text;
while(++t!=(win/2))
p3=p3->next;
}
Вот тестовая версия части проги..
В качестве проверки юзал файлик с цифрами от 1 до 999
#include <dos.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#define str_size 300
#define win 92
/////////////////////////////////STRUCT////////////////////////
struct Text
{char txt[str_size];
struct Text *next;
struct Text *prev;
};
//////////////////////////////////////INSERT////////////////////////////////
void insert( Text **golova, char *ms, Text **hvost)
{Text *n;
if(!(n=(Text*)calloc(1,sizeof(Text))))
return;
else strcpy(n->txt,ms);
if(!*golova)
*golova=*hvost=n;
else
{ n->prev=*hvost;
(*hvost)->next=n;
*hvost=n; }
}
//////////////////////////////////////OPEN////////////////////////
void open(Text **start)
{
FILE *txt,*rec;
rec=fopen("temp.tmp","w");
Text *hvost=NULL;
char ms[str_size+1];
int i=0;
if( (txt=fopen("123.txt","r"))==NULL)
{ printf("ЌҐў®§¬®¦® ®вЄалвм д ©«!!!");
delay(1500);
exit(1);
}
else
{ while(1)
{if(!feof(txt))
{fgets(ms,str_size,txt);
if(!feof(txt)) fputs(ms,rec);
if(i++<=win) insert(start,ms,&hvost);
}
else if(feof(txt)&&i<win)
{fputs("",rec);
if(i++<=win) insert(start,"",&hvost);
}
else break;
}fclose(txt);
fclose(rec);
}
}
///////////////////////////PROTOTIPS/////////////////////
int print(Text **,int,int,char);
void to_menu(void);
void refresh(void);
//void add(TXT *text,int x,int y);
//void to_text(void);
//void open
//void save
//void copy
//void paste
//void cut
//////////////////////////////////////////MAIN//////////////
void main()
{
textmode(64);
Text *text=NULL,*hvost;
int x=1,y=1,i; //Є®®а¤Ё вл ¤«п ЇҐаҐ¬ҐйҐЁп Ї® ®Єг । ЄвЁа®ў Ёп
int handle=0;
remove("recopy.tmp");
remove("temp.tmp");
if (_dos_creatnew("temp.tmp", _A_HIDDEN, &handle) != 0)
{
perror("Unable to create");
exit(1);
}
if (_dos_creatnew("recopy.tmp", _A_HIDDEN, &handle) != 0)
{
perror("Unable to create");
exit(1);
}
_dos_close(handle);
open(&text);
textbackground(BLUE);
clrscr();
//ᮧ¤ ЁҐ ўЁ¤
window(1,1,80,1);
textbackground(LIGHTGRAY);
for(i=0;i<80;i++) cputs(" ");
textcolor(BLACK);
cputs(" File Edit Search About ");
window(1,1,80,50);
gotoxy(1,2);
textcolor(YELLOW);
textbackground(BLUE);
cputs("ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");
cprintf(" F10 - enter menu Esc - exit menu");
window(3,3,78,47);
print(&text,1,1,'0');
gotoxy(1,1);
//®Є® ᮧ¤ ®
char sim; //ўў®¤Ё¬л© бЁ¬ў®«
int ps_x=1,ps_y=1; //ЇбҐў¤® y Ё е
long int scr_x=1,scr_y=1;
//y=44;
while(1)
{
switch(sim=getch())
{
case 0: switch(sim=getch())
{
case 68:
to_menu();
break;
case 72: if(ps_y==1)
{ ps_y=1;
y--;
if(y<=0) y=1;
if(scr_y>1)
{scr_y--;
if(scr_y<=0) scr_y=1;
print(&text,scr_x,scr_y,'u');
}
}
else {ps_y--;
y--;
}
gotoxy(ps_x,ps_y);
break;
case 80: if(ps_y==46)
{ ps_y=46;
y++;
if(ps_y==46&&y!=46)
{scr_y++;
print(&text,scr_x,scr_y,'d');
}
}
else
{ps_y++;
y++;
}
gotoxy(ps_x,ps_y);
break;
case 77: if(ps_x==76)
{ ps_x=76;
x++;
if(ps_x==76&&x!=76)
{scr_x++;
print(&text,scr_x,scr_y,'0');
}
}
else
{ps_x++;
x++;
}
gotoxy(ps_x,ps_y);
break;
case 75: if(ps_x==1)
{ ps_x=1;
x--;
if(x<=0) x=1;
if(scr_x>1)
{scr_x--;
if(scr_x<=0) scr_x=1;
print(&text,scr_x,scr_y,'0');
}
}
else {ps_x--;
x--;
}
gotoxy(ps_x,ps_y);
break;
}
default: break;//add(text,x,y);
}
}
getch();
}
void to_menu(void)
{
int i,j,k;
window(1,1,80,50);
_setcursortype(_NOCURSOR);
char *ms[4]={" File "," Edit "," Search "," About "};
gotoxy(1,1);
textcolor(BLACK);
textbackground(GREEN);
cprintf(" File ");
i=0;
while(1)
{
switch(getch())
{
case 77 : if(i==3) i=3;
else {
i++;
textbackground(LIGHTGRAY);
textcolor(BLACK);
gotoxy(1,1);
cputs(" File Edit Search About ");
textcolor(BLACK);
textbackground(GREEN);
if(i==0) gotoxy(1,1);
if(i==1) gotoxy(7,1);
if(i==2) gotoxy(13,1);
if(i==3) gotoxy(21,1);
cputs(*(ms+i));
}
break;
case 75 : if(i==0) i=0;
else {
i--;
textbackground(LIGHTGRAY);
textcolor(BLACK);
gotoxy(1,1);
cputs(" File Edit Search About ");
textcolor(BLACK);
textbackground(GREEN);
if(i==0) gotoxy(1,1);
if(i==1) gotoxy(7,1);
if(i==2) gotoxy(13,1);
if(i==3) gotoxy(21,1);
cputs(*(ms+i));
}
break;
}
}
}
int print(Text **text,int x,int yy,char c)
{window(1,1,80,50);
gotoxy(1,2);
textcolor(YELLOW);
textbackground(BLUE);
cprintf("ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"є є"
"ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј");
window(3,3,78,50);
gotoxy(1,1);
cprintf("%d", yy);
static int flg=0;
textcolor(WHITE);
textbackground(BLUE);
int t=0;
Text *p1=*text,*p2;
static Text *p3=*text;
if(c=='0')
{ p1=p3;
t=0;
while(p1->next&&(t++)!=46)
{gotoxy(1,t);
cprintf("%.76s",p1->txt+x-1);
p1=p1->next;
} return 0;
}
FILE *tmp,*rec;
if(yy%(win/2+1)==0)
{char *byf;
byf=(char*)calloc(str_size+1,sizeof(char));
if(flg==0) { tmp=fopen("temp.tmp","r+"); //error places not view
rec=fopen("recopy.tmp","w");
flg=1;
}
else { rec=fopen("temp.tmp","w"); //error places not view
tmp=fopen("recopy.tmp","r+");
flg=0;
}
t=0;
while(++t<(yy+win/2)) //+-1 perepis verha i okna i smeshenie po tmp k nizy
{
if(t<(yy-(win/2)-1)) { fgets(byf,str_size,tmp);
fputs(byf,rec); }
if(t>(yy-(win/2)-1)) { fputs(p1->txt,rec);
p1=p1->next;
fgets(byf,str_size,tmp); }
}
t=0;
while(!feof(tmp)) //Perepis konca
{ fgets(byf,str_size,tmp);
if(!feof(tmp))
fputs(byf,rec);
}
fclose(tmp);
fclose(rec);
if(flg==0) tmp=fopen("recopy.tmp","r");
else tmp=fopen("temp.tmp","r");
p1=*text;
if(c=='u')
while(++t!=yy+win/2)
{if(t<(yy-(win*3)/2)) fgets(byf,str_size,tmp);
else if(t>(yy-(win*3)/2)) { fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next; }
}
else if(c=='d')
while(++t!=(yy+win))
{if(t<yy) fgets(byf,str_size,tmp);
else if(t>yy) { fgets(byf,str_size,tmp);
strcpy(p1->txt,byf);
p1=p1->next; }
}
fclose(tmp);
t=0;
if(c=='d')
p3=*text;
else if(c=='u')
{ p3=*text;
while(++t!=(win/2))
p3=p3->next;
}
}
if(p3->next&&c=='d')
{p3=p3->next;
p1=p3;}
else if(p3->prev&&c=='u')
{p3=p3->prev;
p1=p3;}
t=0;
while(p1->next&&(t++)!=46)
{gotoxy(1,t);
cprintf("%.76s",p1->txt+x-1);
p1=p1->next;
}
return 0;
}