LINUX.ORG.RU

Где найти старые версии библиотек/компиляторов C++?

 , , , ,


0

1

Нашел для себя программку синтаксического восходящего анализатора, решил скомпилить код и запустить, посмотреть как работает программа. Однако, код не компилится, думаю из-за того, что написана она давно, и что-то с библиотеками или компиляторами, компилил под g++ (linux, windows). Знание плюсов - нулевые. Вот код:

#include <iostream.h>
#include <conio.h>
#include <string.h>

const n=1000;
char* s=new char [256];
char* wstack=new char[n];
unsigned char* rstack=new unsigned char[n];
unsigned int rp, wp;
char smb [17]={'V', 'W', 'F', 'H', 'P', 'C', '+', '-',
		'*', 'd', 'm', '(', ')', 'i', 'b', 'n', '$'};
char *rulez [14]={"VW", "WF", "WW+F", "WW-F", "FH", "HP", "HH*P",
		   "HHdP", "HHmP", "P(V)", "Pi", "PC", "Cn", "Cb"};
char tbl [17][17]=
	 {{-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1,-2,-2,-2,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 0, 0, 0,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2, 0,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2, 0,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  { 0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  { 2,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2}};

char right(char* s);

void main()
{char key;
 int i, r;
 clrscr();
 key=13;
 while (!(key==27))
  {s=new char [60];
   cout<<"Input a string"<<endl;
   cin>>s;
   r=int(right(s));
   cout<<"Rezult: "<<r<<endl;
   if (r) for (i=0; i<rp; i+=2)
    {cout<<rstack[i]<<" "<<int(rstack[i+1])<<" | ";}
   key=getch();
   clrscr();}
 delete(wstack);
 delete(rstack);
};

int decode(char c)// поиск кода для символа
{for (int i=0; i<17; i++)
  if (smb[i]==c) return i;
 return -1;}


char right(char* s) //анализатор
{int i, j;
 rp=wp=0;
 int priorrl=0, cp=0;
 char *priorr=new char [256];
 char *buf=new char [256];
 wstack[wp]='$'; wstack[wp+1]=1;

 while (1) {
 if (strlen(s)>0 && decode(s[0])==-1) return 0;
 if (strlen(s)>0) cp=tbl[decode(wstack[wp])][decode(s[0])];
 else cp=tbl[decode(wstack[wp])][decode('$')];
 switch (cp)
  {
   case -2:return 0;
   case -1:;
   case 2:;
   case 0:{wp+=2;
	   wstack[wp]=s[0];  wstack[wp+1]=cp;
	   rstack[rp]=s[0];  rstack[rp+1]=0;
	   rp+=2;
	   s=strcpy(s, s+1);
	   for(i=rp-3; i>0, priorrl>0; i-=2)
	    if (!rstack[i]) {rstack[i]=(rp-2)/2; priorrl--;}
	   if (cp==2) return 1;
	   break;};
   case 1:{priorr=strcpy(priorr, '\0');
	   while (wstack[wp+1]<=0)
	    {strcpy(buf, priorr);
	     priorr=strcpy(priorr+1, buf)-1;
	     priorr[0]=wstack[wp];
	     wp-=2;
	     if (wstack[wp+3]<0) break;};

	   priorrl=strlen(priorr);
	   for (i=0; i<14; i++)
	    if (!strcmp(rulez[i]+1, priorr))
	     {strcpy(buf, s);
	      s=strcpy(s+1, buf)-1;
	      s[0]=rulez[i][0];
	      break;}
	   break;};
};};};

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

★★★★★

Твоя проблема в том, что этот код завязан на windows (conio.h). Вообще можно убрать ".h" у хидеров после #include, выкинуть conio.h и написать свою реализацию clrscr() и getch().

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 2)
Ответ на: комментарий от m0rph

Конио исправлял на curses вроде плюс компилил это дело под виндой. Может мне другой компилятор нужен? Борладновский например?

Amet13 ★★★★★
() автор топика

В этом виде компилируется на gcc 4.8.2, но я понятия не имею правильно ли оно работает. clrscr это весь просто очистка экрана, поэтому я её просто комментировал. К тому же там много warning'oв:

 warning: deprecated conversion from string constant to ‘char*’
, мне лень их исправлять, а с ходу не знаю как.

#include <iostream>
#include <string.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;
const int n=1000;
char* s=new char [256];
char* wstack=new char[n];
unsigned char* rstack=new unsigned char[n];
unsigned int rp, wp;
char smb [17]={'V', 'W', 'F', 'H', 'P', 'C', '+', '-',
		'*', 'd', 'm', '(', ')', 'i', 'b', 'n', '$'};
char *rulez [14]={"VW", "WF", "WW+F", "WW-F", "FH", "HP", "HH*P",
		   "HHdP", "HHmP", "P(V)", "Pi", "PC", "Cn", "Cb"};
char tbl [17][17]=
	 {{-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1,-2,-2,-2,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 0, 0, 0,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2, 0,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2, 0,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  { 0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  { 2,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2}};

char right(char* s);

char getch(){
    char buf=0;
    struct termios old={0};
    fflush(stdout);
    if(tcgetattr(0, &old)<0)
        perror("tcsetattr()");
    old.c_lflag&=~ICANON;
    old.c_lflag&=~ECHO;
    old.c_cc[VMIN]=1;
    old.c_cc[VTIME]=0;
    if(tcsetattr(0, TCSANOW, &old)<0)
        perror("tcsetattr ICANON");
    if(read(0,&buf,1)<0)
        perror("read()");
    old.c_lflag|=ICANON;
    old.c_lflag|=ECHO;
    if(tcsetattr(0, TCSADRAIN, &old)<0)
        perror ("tcsetattr ~ICANON");
    printf("%c\n",buf);
    return buf;
}

int decode(char c)// поиск кода для символа
{
  for (int i=0; i<17; i++)
  if (smb[i]==c) return i;
  return -1;
}


 char right(char* s){
 int i, j;
 rp=wp=0;
 int priorrl=0, cp=0;
 char *priorr=new char [256];
 char *buf=new char [256];
 wstack[wp]='$'; wstack[wp+1]=1;

 while (1) {
 if (strlen(s)>0 && decode(s[0])==-1) return 0;
 if (strlen(s)>0) cp=tbl[decode(wstack[wp])][decode(s[0])];
 else cp=tbl[decode(wstack[wp])][decode('$')];
 switch (cp)
  {
   case -2:return 0;
   case -1:;
   case 2:;
   case 0:{wp+=2;
	   wstack[wp]=s[0];  wstack[wp+1]=cp;
	   rstack[rp]=s[0];  rstack[rp+1]=0;
	   rp+=2;
	   s=strcpy(s, s+1);
	   for(i=rp-3; i>0, priorrl>0; i-=2)
	    if (!rstack[i]) {rstack[i]=(rp-2)/2; priorrl--;}
	   if (cp==2) return 1;
	   break;};
   case 1:{priorr=strcpy(priorr, '\0');
	   while (wstack[wp+1]<=0)
	    {strcpy(buf, priorr);
	     priorr=strcpy(priorr+1, buf)-1;
	     priorr[0]=wstack[wp];
	     wp-=2;
	     if (wstack[wp+3]<0) break;};

	   priorrl=strlen(priorr);
	   for (i=0; i<14; i++)
	    if (!strcmp(rulez[i]+1, priorr))
	     {strcpy(buf, s);
	      s=strcpy(s+1, buf)-1;
	      s[0]=rulez[i][0];
	      break;}
	   break;};
  };}}



int main(){
 char key;
 int i, r;
 // clrscr();
 key=13;
 while (!(key==27))
  {s=new char [60];
   cout<<"Input a string"<<endl;
   cin>>s;
   r=int(right(s));
   cout<<"Rezult: "<<r<<endl;
   if (r) for (i=0; i<rp; i+=2)
    {cout<<rstack[i]<<" "<<int(rstack[i+1])<<" | ";}
   key=getch();
   //   clrscr();}
 delete(wstack);
 delete(rstack);
 return 0;
  }}
hope13 ★★★
()
#include <iostream.h>

Охохо, ну и археология.

Из очевидного getch() -> fgetc(stdin) .h убрать у iostrean.h, и using namespace std; после инклюдов

Может что-то ещё не заметил.

anonymous
()
Ответ на: комментарий от anonymous

Ещё

char const *rulez [14]={"VW", "WF", "WW+F", "WW-F", "FH", "HP", "HH*P",
		   "HHdP", "HHmP", "P(V)", "Pi", "PC", "Cn", "Cb"};

вместо

char  *rulez [14]={"VW", "WF", "WW+F", "WW-F", "FH", "HP", "HH*P",
		   "HHdP", "HHmP", "P(V)", "Pi", "PC", "Cn", "Cb"};

Оригинальное решение с getch Мух из гаубицы бьёте?

Давно нашёл этот кусок кода, так и лежит на всякий случай. Пригодился :)

hope13 ★★★
()

хз зачем я в этом овне копался.

$ cat crap.cc

#include <iostream.h>
#include <stdio.h>
#include <string.h>

const int n=1000;
char* s=new char [256];
char* wstack=new char[n];
unsigned char* rstack=new unsigned char[n];
unsigned int rp, wp;
char smb [17]={'V', 'W', 'F', 'H', 'P', 'C', '+', '-',
		'*', 'd', 'm', '(', ')', 'i', 'b', 'n', '$'};
char *rulez [14]={"VW", "WF", "WW+F", "WW-F", "FH", "HP", "HH*P",
		   "HHdP", "HHmP", "P(V)", "Pi", "PC", "Cn", "Cb"};
char tbl [17][17]=
	 {{-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1,-2,-2,-2,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 0, 0, 0,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2, 0,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2, 0,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2, 0,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  { 0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  {-2,-2,-2,-2,-2,-2, 1, 1, 1, 1, 1,-2, 1,-2,-2,-2, 1},
	  { 2,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-1,-2,-1,-1,-1,-2}};

char right(char* s);

int main()
{char key;
 int i, r;
 //clrscr();
 key=13;
 while (!(key==27))
  {s=new char [60];
   cout<<"Input a string"<<endl;
   cin>>s;
   r=int(right(s));
   cout<<"Rezult: "<<r<<endl;
   if (r) for (i=0; i<rp; i+=2)
    {cout<<rstack[i]<<" "<<int(rstack[i+1])<<" | ";}
   scanf(" %c", &key); //key=getch();
   }//clrscr();}
 delete(wstack);
 delete(rstack);
}

int decode(char c) // поиск кода для символа
{for (int i=0; i<17; i++)
  if (smb[i]==c) return i;
 return -1;}


char right(char* s) //анализатор
{int i, j;
 rp=wp=0;
 int priorrl=0, cp=0;
 char *priorr=new char [256];
 char *buf=new char [256];
 wstack[wp]='$'; wstack[wp+1]=1;

 while (1) {
 if (strlen(s)>0 && decode(s[0])==-1) return 0;
 if (strlen(s)>0) cp=tbl[decode(wstack[wp])][decode(s[0])];
 else cp=tbl[decode(wstack[wp])][decode('$')];
 switch (cp)
  {
   case -2:return 0;
   case -1:;
   case 2:;
   case 0:{wp+=2;
	   wstack[wp]=s[0];  wstack[wp+1]=cp;
	   rstack[rp]=s[0];  rstack[rp+1]=0;
	   rp+=2;
	   s=strcpy(s, s+1);
	   for(i=rp-3; i>0, priorrl>0; i-=2)
	    if (!rstack[i]) {rstack[i]=(rp-2)/2; priorrl--;}
	   if (cp==2) return 1;
	   break;};
   case 1:{priorr=strcpy(priorr, '\0');
	   while (wstack[wp+1]<=0)
	    {strcpy(buf, priorr);
	     priorr=strcpy(priorr+1, buf)-1;
	     priorr[0]=wstack[wp];
	     wp-=2;
	     if (wstack[wp+3]<0) break;};

	   priorrl=strlen(priorr);
	   for (i=0; i<14; i++)
	    if (!strcmp(rulez[i]+1, priorr))
	     {strcpy(buf, s);
	      s=strcpy(s+1, buf)-1;
	      s[0]=rulez[i][0];
	      break;}
	   break;};
};};};

минимальные правки.

asaw ★★★★★
()

К сожалению во всех случаях

Ошибка сегментирования (сделан дамп памяти)

Amet13 ★★★★★
() автор топика
Ответ на: комментарий от Amet13

А gdb? abrt?

P.S. Ох, какая забористая смесь С, плюсов и Win.

RPG
()
Последнее исправление: RPG (всего исправлений: 1)

До кучи:

$ cppcheck crap.cpp Checking crap.cpp... [crap.cpp:102]: (error) Memory leak: buf [crap.cpp:86]: (error) Null pointer dereference

Хотя течёт тут почти всё, странно почему анализатор не среагировал.

RPG
()
Ответ на: комментарий от anonymous

По идее строка: (n+m-b) mb должна быть валидной и выдавать результат.

Однако любая строка дает ошибку.

Amet13 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Оригинальное решение с getch Мух из гаубицы бьёте?

Это каноническая копипаста со stack overlow :)

gv
()

Где найти старые версии библиотек/компиляторов C++?

Debian (Woody)?

KennyMinigun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.