2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение17.04.2010, 21:46 
Аватара пользователя


17/04/10
18
Коломна
Delphi
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
  1. Procedure SortMath (Var X: Array of zap; Niz: integer = 0)
  2.      Const n = 65535;     //размер массива счетчиков для двухбайтного ключа
  3.      Var t^ Array [0..n] of integer; i,j,k: integer; w:zap;
  4. begin
  5.      For j:=0 to n do t[j]:=0;   //находим мощности групп записей (счетчики t[j])
  6.      For k:=0 to High (X) do begin j:=X[k].key - Niz; Inc(t[j]) end;
  7.      For j:=1 to n do t[j]:=t[j] + t[j - 1];   //преобразуем вектор мощностей
  8.      For k:=0 to High(X) do                  //расставляем записи в исходном массиве X
  9.            Repeat             //j-ый элемент массива t является отображением ключа
  10.                       j:=X[k].key - Niz; i:=t[j] - 1;  // i указывает новую позицию записи X[k]
  11.                       If i<=k then Break;  // i<=k, если запись уже занимает эту позицию
  12.                       t[j]:=i; w:=X[i]; X[i]:=X[k]; X[k]:=w
  13.            Until false;
  14. end;
  15.  


C++

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
  1. void SortMath (struct zap *X, int n, int *a, int *b)
  2. {
  3. int NIZ=0; int i,j,k,h;
  4. int t[Nmax];
  5. struct zap w;
  6. h=n-1;
  7.   for (j=0; j<Nmax; j++)
  8.       t[j]=0;                                
  9.   for (k=0; k<h; k++)                        
  10.       {
  11.       j=X[k].key-NIZ;
  12.       t[j]++;
  13.       }
  14.   for (j=1; j<Nmax; j++)
  15.       t[j]=t[j]+t[j-1];                      
  16.   for (k=0; k<h; k++)                        
  17.       {                                      
  18.       i=t[j]-1;                              
  19.       j=X[k].key-NIZ;
  20.       while (i>k)                            
  21.             {
  22.             t[j]=i;                          
  23.             w=X[i];
  24.             X[i]=X[k];
  25.             X[k]=w;
  26.             }
  27.       }
  28. }
  29.  


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

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение17.04.2010, 21:58 
Админ форума
Аватара пользователя


19/03/10
8952
Вы бы хоть написали, что функция делает, и что за параметры ей передаются.

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение18.04.2010, 19:02 
Аватара пользователя


17/04/10
18
Коломна
функция сортировки, параметры - структура запись с одним полем int. А если бы я сама смогла разобраться - то не писала бы здесь...

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение19.04.2010, 21:02 
Заслуженный участник


26/07/09
1559
Алматы
2green_Ekatherine

Цитата:
не могу понять, ошибка в этом переводе или в самой программе

Перевод явно неправильно выполнен. А исходная программулька работает?

Цитата:
запись с одним полем

В таких трюках вообще редко когда надобность возникнуть может.

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение21.04.2010, 12:10 
Аватара пользователя


17/04/10
18
Коломна
исходная программа взята из книги нашего препода, он гарантирует, что она верная. а где именно ошибки перевода?

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение22.04.2010, 17:07 


25/01/10
33
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
  1. void SortMath (struct zap *X, int Niz = 0)
  2. {
  3.         const n = 65536;
  4.         int t[n]; int i,j,k;
  5.         struct zap w;
  6.  
  7.         for  (j = 0; j < n; j++) t[j] = 0;
  8.         for (k = 0; k < HighX; k++) { j = X[k].key - Niz; t[j]++; }
  9.         for ( j = 1; j < n; j++) t[j] = t[j] + t[ j - 1 ];
  10.         for ( k = 0; k < HighX; k++) {    
  11.                 do {                              
  12.                         j=X[k].key-Niz;
  13.                         i=t[j]-1;
  14.                         if ( i <= k) break;
  15.                         t[j] = i;                          
  16.                         w = X[i]; // В С++ работает по-другому!
  17.                         X[i] = X[k]; // В С++ работает по-другому!
  18.                         X[k] = w; // В С++ работает по-другому!
  19.                 } while (1);
  20.         }
  21. }
  22.  
  23.  

Вроде так. Только замените HighX в циклах на аналогичную в С++. Что делает функция High() в Паскале?
И структуры в C++ присваиваются по-другому. Присвойте каждый элемент отдельно!

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение22.04.2010, 22:32 
Заслуженный участник


04/05/09
4593
Исходный алгоритм - однопроходный bucket sort, с ключами в диапазоне [Niz, Niz+65535]. Явных ошибок я не заметил.

green_Ekatherine в сообщении #310704 писал(а):
не могу понять, ошибка в этом переводе или в самой программе, проверьте пожалуйста! заранее спасибо!
Перевод содержит кучу ошибок. Во первых, куда делся параметр Niz и откуда появились два новых параметра a и b?
Пропало определение Nmax.
Основной цикл переписали так, что он стал работать неправильно. Переменные i и j должны вычисляться заново при каждой итерации внутреннего цикла.

rederblack в сообщении #312173 писал(а):
Только замените HighX в циклах на аналогичную в С++. Что делает функция High() в Паскале?
Судя по коду, High() возвращает индекс последнего элемента массива. В переписанном на C++ коде используется простой массив, а не vector<>, поэтому размер массива передаётся дополнительным параметром n.

rederblack в сообщении #312173 писал(а):
И структуры в C++ присваиваются по-другому.
Нормально структуры присваиваются, не надо наговаривать.

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение24.04.2010, 00:23 
Аватара пользователя


17/04/10
18
Коломна
спасибо большое, исправила. но теперь выдает ошибку E2208 Cannot access an inactive scope в 8-й строке, где t[j]++ в чем может быть причина?

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение24.04.2010, 00:38 
Заслуженный участник


04/05/09
4593
А новый текст программы где?

-- Пт апр 23, 2010 17:42:04 --

green_Ekatherine в сообщении #312663 писал(а):
E2208 Cannot access an inactive scope
Это, вроде, сообщение отладчика. К работе программы не относится. Просто у вас в отладчике где-то есть окно, где отображается локальная переменная, которая уже исчезла.

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение25.04.2010, 22:57 
Аватара пользователя


17/04/10
18
Коломна
void SortMath (struct zap X[Nmax], int n, int a, int b)
{
int NIZ=0; int i,j,k,h;
int t[Nmax];
struct zap w;
h=n-1;
for (j=0; j<Nmax; j++)
t[j]=0;
for (k=0; k<h; k++)
{
j=X[k].key - NIZ;
t[j]++;
}
for (j=1; j<Nmax; j++)
t[j]=t[j]+t[j-1];
for (k=0; k<h; k++)
{
do
{j=X[k].key - NIZ;
i=t[j]-1;
if (i<= k)
break;
t[j]=i; w= X[i]; X[i]=X[k]; X[k]=w;
}
while (true);
}
}
;

основная программа

{
int n; zap x[Nmax];
int a=0; int b=0;
float start, end, time, time1;
for (int j=0; j<10; j++)
{
start=clock()/CLOCKS_PER_SEC;

for (int i=0; i<Nmax; i++)
{
x[i].key=random(Nmax/2);


SortMath(x, Nmax, a, b);
end=clock()/CLOCKS_PER_SEC;
time1=end-start;
time+=time1;
}
}

Form1->Edit1->Text=FloatToStr(time/10);

}

в ошибке указывает на t[j]

 Профиль  
                  
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение06.05.2010, 12:19 
Аватара пользователя


17/04/10
18
Коломна
работает) всем спасибо!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group