2014 dxdy logo

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

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




 
 Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение17.04.2010, 21:46 
Аватара пользователя
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 
Аватара пользователя
Вы бы хоть написали, что функция делает, и что за параметры ей передаются.

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

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

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

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

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

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

 
 
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение21.04.2010, 12:10 
Аватара пользователя
исходная программа взята из книги нашего препода, он гарантирует, что она верная. а где именно ошибки перевода?

 
 
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение22.04.2010, 17:07 
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Исходный алгоритм - однопроходный 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 
Аватара пользователя
спасибо большое, исправила. но теперь выдает ошибку E2208 Cannot access an inactive scope в 8-й строке, где t[j]++ в чем может быть причина?

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

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

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

 
 
 
 Re: Перевод из Delphi в C++(проверьте пожалуйста)
Сообщение25.04.2010, 22:57 
Аватара пользователя
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 
Аватара пользователя
работает) всем спасибо!

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group