Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 23:12   #1
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию Консольная программа под Linux

Добрый день!
У меня существует необходимость запустить программу под линуксом. Программа написанна на С++, запускалась на borland 3.1 и на builder. Теперь её необходимо каким-то образом запустить под linux. Компилятор скорее всего GCC, ось - апрельский Ubuntu, для удобства поставил kdevelop. Подскажите с какой стороны копать, какие библиотеки придётся заменить, какие добавить, какие директивы препроцессора дописать. Опыта программирования под иксами нет.
Прилогаю текст программы:

Код:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip.h>
# define SWAP(A,B) {A=A^B;B=A^B;A=A^B;}


int numb, numb2;
int increment (long inc[], long size);
int  shellsed (long *a, long size);
int  shell (long *a,long size);
int create (long *a,long *b, long size);
int view (long *a, long size);
int bublesort (long *a, long size);
int manual ();
int autom ();
int oper (long n, long param);

int main()
	{
	clrscr();
	randomize();
	cout<<"\n\t(A)-automatic\t(M)-manual\n\t Your choise: ";
	char ch;
	cin>>ch;
	switch (ch)
		{
		case 'A': autom(); break;
		case 'M': manual(); break;
		default: cout<<"\n\tIncorect choise";
		}
	getch();
	return 0;
	}

int manual ()
	{
	cout<<"\n\tEnter number of elements: ";
	long n;
	cin>>n;
	oper (n,1);
	return 0;
	}
	
int autom ()
	{
	cout<<"\n\n\tFirst array, 100 elements:";
	oper (100,0);
	cout<<"\n\n\n\tSecond array, 1000 elements:";
	oper (1000,0);
	cout<<"\n\n\n\tThird array, 10000 elements:";
	oper (10000,0);
	return 0;
	}

int oper (long n, long param)
	{
	long *a = new long [n];
	long *b = new long [n];
//	long *c = new long [n];
	double start,finish,del;
	create (a,b,n);
//	clock_t start,finish;
	cout<<"\n\n\tShell's sort:";
	if (param)
		{
		cout<<"\n\nUnsorted array:\n";
		view (a,n);
		}
//	time (&start);
	start = (double) clock();
	shell (a,n);
//	time (&finish);
	finish = (double) clock();
	if (param)
		{
		cout<<"\n\nSorted array:\n";
		view (a,n);
		cout<<"\n";
		}
	cout<<"\nNumber of oper. total: "<<numb<<", Shell: "<<numb2<<", Buble: "<<numb-numb2;
	del = (double) (finish-start)/CLOCKS_PER_SEC; 
	cout<<setprecision(4)<<"  Time: "<<del<<" sec";
/*	if (param)
		view (c,n);
	cout<<"\n\tShell's sort with iterations by Robert Sedgewick:";
	time (&start);
	shellsed (c,n);
	time (&finish);
	if (param)
		view (c,n);
	cout<<"\n\tNumber of operations total: "<<numb<<", Shell: "<<numb2<<", Buble: "<<numb-numb2;
	cout<<"  Time: "<<difftime(finish,start)<<" sec";
*/
	cout<<"\n\n\tBublesort:";
	if (param)
		{
		cout<<"\n\nUnsorted array:\n";
		view (b,n);
		}
	numb=0;
//	time (&start);
	start = (double) clock();
	bublesort(b,n);
	finish = (double) clock();
//	time (&finish);
	if (param)
		{
		cout<<"\n\nSorted array:\n";
		view (b,n);
		cout<<"\n";
		}
	cout<<"\nNumber of oper. total: "<<numb;
	del = (double) (finish-start)/CLOCKS_PER_SEC;
	cout<<setw(7)<<"  Time: "<<del<<" sec";
	delete[] a;
	delete[] b;
//	delete[] c;
	return 0;
	}
	
int create (long *a,long *b, long n)
	{
	for (long i=0;i<n;i++)
		b[i]=a[i]=random(100);
	return 0;
	}

int view (long a[], long n)
	{
	for (long i=0;i<n;i++)
		cout<<a[i]<<" ";
	return 0;
	}

/*
int increment (long inc[], long size)
	{
	long p1, p2, p3, s;
	p1 = p2 = p3 = 1;
	s = -1;
	do
		{
		if (++s % 2)
			{
			inc[s] = 8*p1 - 6*p2 + 1;
			}
		else
			{
			inc[s] = 9*p1 - 9*p3 + 1;
			p2 *= 2;
			p3 *= 2;
			}
		p1 *= 2;
		}
	while(3*inc[s] < size);
	return s > 0 ? --s : 0;
	}

int shellsed (long *a,long n)
	{
	numb=0;
	long inc,i,j,a2[30],s,tmp;
	s=increment(a2,n);
	cout<<"\nIncrements: ";
	cout<<"\n";
	while (s>-1)
		{
		inc = a2[s--];
		cout<<"\tInc= "<<inc;
		for (i=0;i<(n-inc-1);i++)
			{
			if (a[i]>a[i+inc])
				{
				SWAP (a[i],a[i+inc]);
				numb++;
				}
			}
		}
	cout<<"\n\n";
	numb2=numb;buntu, для удобства поставил kdevelop. Подскажите с какой стороны копать, какие
	bublesort(a,n);
	return 0;
	}
*/

int shell (long *a, long n)
	{
	numb=0;
	long inc, i, j;
	inc=n/2;
	while (inc>=1)
		{
//		cout<<"\tInc= "<<inc;
		for (i=0;i<(n-inc-1);i++)
			{
			if (a[i]>a[i+inc])
				{
				SWAP (a[i],a[i+inc]);
				numb++;
				}
			}
		inc/=2;
		}
//	cout<<"\n\n";
	numb2=numb;
	bublesort(a,n);
	return 0;
	}

int bublesort (long *a, long n)
	{
	long i,j,s;
	for (i=n;i>0;i--)	
		{
		s=0;
		for (j=0;j<i;j++)
			{
			if (a[j]>a[j+1])
				{
				SWAP (a[j],a[j+1]);
				s++; numb++;
				}
			}
		if (!s)
			return 0;
		}
	return 0;
	}
amdbodia вне форума Ответить с цитированием
Старый 31.05.2009, 23:33   #2
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

я прогу не собирал, но на вскидку:
- conio.h в линухе нет, все фунции, которые так или иначе используют этот заголовочный файл придется поменять
- функция randomize() - специфичная вещь борланда. юзать надо srand/rand.
- clrscr() - та же история.
- ну и мелочи, типо объявления пространства имен std для функций стандартной библиотеки с++ и убрать .h для заголовочных файлов.

вроде все
vvviperrr вне форума Ответить с цитированием
Старый 31.05.2009, 23:56   #3
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Никак не получется.Kdevelop ругается на отсутствие библиотек.
Может есть какая-то литература по сабжу?
amdbodia вне форума Ответить с цитированием
Старый 31.05.2009, 23:56   #4
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Никак не получется.Kdevelop ругается на отсутствие библиотек.
Может есть какая-то литература по сабжу?
amdbodia вне форума Ответить с цитированием
Старый 31.05.2009, 23:57   #5
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

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

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <iomanip>

# define SWAP(A,B) {A=A^B;B=A^B;A=A^B;}

using namespace std;

int numb, numb2;
int increment (long inc[], long size);
int  shellsed (long *a, long size);
int  shell (long *a,long size);
int create (long *a,long *b, long size);
int view (long *a, long size);
int bublesort (long *a, long size);
int manual ();
int autom ();
int oper (long n, long param);

int main()
	{
	system("clear");
	srand((unsigned long)time(0));
	cout<<"\n\t(A)-automatic\t(M)-manual\n\t Your choise: ";
	char ch;
	cin>>ch;
	switch (ch)
		{
		case 'A': autom(); break;
		case 'M': manual(); break;
		default: cout<<"\n\tIncorect choise";
		}
	//getch();
	return 0;
	}

int manual ()
	{
	cout<<"\n\tEnter number of elements: ";
	long n;
	cin>>n;
	oper (n,1);
	return 0;
	}
	
int autom ()
	{
	cout<<"\n\n\tFirst array, 100 elements:";
	oper (100,0);
	cout<<"\n\n\n\tSecond array, 1000 elements:";
	oper (1000,0);
	cout<<"\n\n\n\tThird array, 10000 elements:";
	oper (10000,0);
	return 0;
	}

int oper (long n, long param)
	{
	long *a = new long [n];
	long *b = new long [n];
	double start,finish,del;
	create (a,b,n);
	cout<<"\n\n\tShell's sort:";
	if (param)
		{
		cout<<"\n\nUnsorted array:\n";
		view (a,n);
		}
	start = (double) clock();
	shell (a,n);
	finish = (double) clock();
	if (param)
		{
		cout<<"\n\nSorted array:\n";
		view (a,n);
		cout<<"\n";
		}
	cout<<"\nNumber of oper. total: "<<numb<<", Shell: "<<numb2<<", Buble: "<<numb-numb2;
	del = (double) (finish-start)/CLOCKS_PER_SEC; 
	cout<<setprecision(4)<<"  Time: "<<del<<" sec";
	cout<<"\n\n\tBublesort:";
	if (param)
		{
		cout<<"\n\nUnsorted array:\n";
		view (b,n);
		}
	numb=0;
	start = (double) clock();
	bublesort(b,n);
	finish = (double) clock();
	if (param)
		{
		cout<<"\n\nSorted array:\n";
		view (b,n);
		cout<<"\n";
		}
	cout<<"\nNumber of oper. total: "<<numb;
	del = (double) (finish-start)/CLOCKS_PER_SEC;
	cout<<setw(7)<<"  Time: "<<del<<" sec";
	delete[] a;
	delete[] b;
	return 0;
	}
	
int create (long *a,long *b, long n)
	{
	for (long i=0;i<n;i++)
		b[i]=a[i]=(long)(rand() % 100 + 1);
	return 0;
	}

int view (long a[], long n)
	{
	for (long i=0;i<n;i++)
		cout<<a[i]<<" ";
	return 0;
	}


int shell (long *a, long n)
	{
	numb=0;
	long inc, i;
	inc=n/2;
	while (inc>=1)
		{
		for (i=0;i<(n-inc-1);i++)
			{
			if (a[i]>a[i+inc])
				{
				SWAP (a[i],a[i+inc]);
				numb++;
				}
			}
		inc/=2;
		}
	numb2=numb;
	bublesort(a,n);
	return 0;
	}

int bublesort (long *a, long n)
	{
	long i,j,s;
	for (i=n;i>0;i--)	
		{
		s=0;
		for (j=0;j<i;j++)
			{
			if (a[j]>a[j+1])
				{
				SWAP (a[j],a[j+1]);
				s++; numb++;
				}
			}
		if (!s)
			return 0;
		}
	return 0;
	}
vvviperrr вне форума Ответить с цитированием
Старый 31.05.2009, 23:59   #6
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

Цитата:
Сообщение от amdbodia Посмотреть сообщение
Никак не получется.Kdevelop ругается на отсутствие библиотек.
Может есть какая-то литература по сабжу?
я не юзаю никаких сред разработки. я юзаю vim. ничего по поводу твоего кдвелопа сказать не могу
vvviperrr вне форума Ответить с цитированием
Старый 14.06.2009, 00:23   #7
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Наконецто появилось свободное время и я закончил программу.
Написал её максимально близко к стандартам, чтоб запускалась в любом компиляторе. Проверил с компилятором builder c++ 6 - всё отлично работает.
Но на MinGW зависает, а на g++ из под linux'a очень долго работает.
Просьба специалистов попробовать запустить у себя код и попробоать подсказать в чём может быть причина проблем.
program.txt
В аттаче - текст программы. Изменить формат на *.cpp и можно компилировать.
Конкретнее о проблеммах:
Необходимо выбрать автоматический режим (А). В программе скомпилированной с помощью MinGW - программа выдаёт что-то типа "инструкция обратилась по адресу "f0000000..", память не может быть read", после того как совершается 1 раз выполнение ф-ции bubbles, сортирующей массив размером в 10^5, и начинается выполнение delete[] a, то-есть ф-ции удаляющей массив.
Программа скомпилированная с помощью g++ в linux, очень долго выдаёт надпись bubblesort после надписи "N=", то-есть, скорее всего, проблемма в функции create(long *a, long size), заполняющей массив рэндомно.

В общем, я написал мутно и не понятно, но, если у вас не будет желания разобраться и помочь, то, хотя-бы проверьте у себя эту програму.

З.Ы. Если у Вас програма запустится как надо, то не поленитесь, пришлите мне файл "results.txt", который создастся в папке с программой, и напишите какой компилятор вы используете, какая у вас ось и краткую харрактеристику вашего железа. Это мне нужно для статистики.
Заранее спасибо.
amdbodia вне форума Ответить с цитированием
Старый 14.06.2009, 18:27   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Отловил ее
У вас выделяется память под n элементов. То есть последний элемент массива будет иметь индекс (n-1).
А в функции сортировки идет обращение к n-ному элементу.
Код:
	for (i=n;i>0;i--)
Та же ситуация в других функциях.

Прикрепляю исправленный исходник + экзешник (скомпиленный в MinGW) + файл с результатами.

У меня Intel E6300 1.8 GHz и 1 Gb RAM.
Вложения
Тип файла: rar test2.rar (86.1 Кб, 17 просмотров)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 14.06.2009, 20:23   #9
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Спасибо огромное!
Цитата:
У вас выделяется память под n элементов. То есть последний элемент массива будет иметь индекс (n-1).
А в функции сортировки идет обращение к n-ному элементу.
Блин, я дебил >.<
amdbodia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консольная программа на Си: ввод, вывод, сортировка, сохранение в текстовый файл. zerg Помощь студентам 8 16.11.2007 12:57
нужен WebBrouser но под LINUX OOO_leg Компоненты Delphi 3 02.11.2007 09:29
Эмулятор Win под Linux Asain-Asa Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 1 10.11.2006 07:21