Nowe posty

Autor Wątek: program dwuwatkowy w C [LINUX]  (Przeczytany 6747 razy)

Andi_911

  • Gość
program dwuwatkowy w C [LINUX]
« dnia: 2008-06-07, 12:07:33 »
Witam
staram sie przepisac program napisany pod windowsem na linuxa. Niestety nie potrafie sobie poradzic z kilkoma linijkami kodu, stad prosba o pomoc...

Ponizej zamieszczam pelen kod programu wraz z raportem z konsoli.

Z gory dziekuje za pomoc, pozdrawiam.

#include time.h //time
#include stdio.h
#include stdlib.h
#include pthread.h




//-------------------------------------------------
// Deklaracje funkcji wykorzystanych w programie
//-------------------------------------------------
void generowanie_danych_1();
void generowanie_danych_2();
DWORD WINAPI pole_rombu_1(LPVOID);
DWORD WINAPI pole_rombu_2(LPVOID);
void printf(char *);


//-------------------------------------------------
// Zmienne globalne wykorzystywane w programie
//-------------------------------------------------
int ile_obliczen = 20000;
int *e_1 = new int[ile_obliczen];
int *e_2 = new int[ile_obliczen];
int *f_1 = new int[ile_obliczen];
int *f_2 = new int[ile_obliczen];
int *pole_1 = new int[ile_obliczen];
int *pole_2 = new int[ile_obliczen];
int ile_powtorzen = 50000;


//---------------------
// void main()
//---------------------

int main()
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
// Funkcja main() - czyli podstawowa (g³ówna) funkcja programu
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
{
  int czas;
  char opcja;

 

/* printf("Program liczy pola trapezów na podstawie wygenerowanych
danych.\\n\\n");

  printf("W zale¿noœci od czêstotliwoœci zegara
taktuj¹cego procesor,\\n");
  printf("wykonywanie obliczeñ mo¿e potrwaæ od kilku do
kilkunastu sekund.\\n\\n");
*/
  printf("Opcje programu:");
  printf("\\n Naciœnij '2', jeœli chcesz skorzystaæ z
dwuw¹tkowoœci obliczeñ.");
  printf("\\n Naciœnij ka¿dy inny klawisz, aby pomin¹æ
dwuw¹tkowoœæ obliczeñ.");

  opcja = getchar();

  czas = time(0);
  srand(time(0));

  printf("\\n\\nGenerowanie danych do póŸniejszych obliczeñ...");
  generowanie_danych_1();
  generowanie_danych_2();
  printf("\\nGenerowanie danych zakoñczone!\\n");

  if(opcja == '2')
  {
    pthread_t w1, w2;
   
    printf("\\nWybrano dwuw¹tkowoœæ obliczeñ...");
    printf("\\n Utworzono 1 w¹tek obliczeniowy...");
    pthread_create(&w1,NULL,watek1,void* );
    printf("\\n Utworzono 2 w¹tek obliczeniowy...");
    pthread_create(&w2,NULL,watek2,void* );
    printf("\\nWykonywanie obliczeñ...");

     pthread_join(w1,NULL);
pthread_join(w2,NULL);
  } else {
    printf("\\nWybrano jednow¹tkowoœæ obliczeñ...");
    printf("\\nWykonywanie obliczeñ...");
    pole_rombu_1("void");
    pole_rombu_2("void");
  }

  czas = time(0) - czas;
  printf("\\nWykonywanie obliczeñ zakoñczone!");

  printf("\\n\\nCzas wykonywania obliczeñ: ");
  printf("%d",czas);
  printf("s\\n");

  printf("\\n\\nNaciœnij dowolny klawisz, aby zakoñczyæ
program...");
  getchar();
}



//-------------------------------------
// void generowanie_danych_1()
//-------------------------------------

void generowanie_danych_1()
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
// Funkcja umo¿liwia wygenerowanie danych dla trapezu.
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
{
  for(int i = 0 ; i < ile_obliczen ; i++)
  {
    e_1[i] = rand() % 1500;
    f_1[i] = rand() % 1500;
  }
}

//-------------------------------------
// void generowanie_danych_2()
//-------------------------------------

void generowanie_danych_2()
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
// Funkcja umo¿liwia wygenerowanie danych dla trapezu.
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
{
  for(int i = 0 ; i < ile_obliczen ; i++)
  {
    e_2[i] = rand() % 1500;
    f_2[i] = rand() % 1500;
  }
}


//------------------------------
// void pole_rombu_1()
//------------------------------

DWORD WINAPI pole_rombu_1(LPVOID)
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
// Funkcja umo¿liwia obliczenie pola trapezu na podstawie
// wczeœniej wygenerowanych danych dla danego trapezu.
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
{
  for(int j = 0 ; j < ile_powtorzen ; j++)
    for(int i = 0 ; i < ile_obliczen ; i++)
      polf_1[i] = (e_1[i] * f_1[i]) / 2;
  return 1;
}

//------------------------------
// void pole_rombu_2()
//------------------------------

DWORD WINAPI pole_rombu_2(LPVOID)
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
// Funkcja umo¿liwia obliczenie pola trapezu na podstawie
// wczeœniej wygenerowanych danych dla danego trapezu.
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */
{
  for(int j = 0 ; j < ile_powtorzen ; j++)
    for(int i = 0 ; i < ile_obliczen ; i++)
      pole_2[i] = (e_2[i] + f_2[i]) / 2;
  return 1;
}
knoppix@Knoppix:~/Desktop$ gcc -o projekt3 projekt3.cpp -lpthread
projekt3.cpp:14: error: 'DWORD' does not name a type
projekt3.cpp:15: error: 'DWORD' does not name a type
projekt3.cpp: In function 'int main()':
projekt3.cpp:71: error: 'watek1' was not declared in this scope
projekt3.cpp:71: error: expected primary-expression before 'void'
projekt3.cpp:73: error: 'watek2' was not declared in this scope
projekt3.cpp:73: error: expected primary-expression before 'void'
projekt3.cpp:81: error: 'pole_rombu_1' was not declared in this scope
projekt3.cpp:82: error: 'pole_rombu_2' was not declared in this scope
projekt3.cpp: At global scope:
projekt3.cpp:135: error: 'DWORD' does not name a type
projekt3.cpp:151: error: 'DWORD' does not name a type

goscccccccccccc

  • Gość
program dwuwatkowy w C [LINUX]
« Odpowiedź #1 dnia: 2008-06-07, 16:33:10 »
Niby gęsto dajesz komentarze, ale mimo wszystko napisz co ten program ma robić i do czego służyć - tak dla pewności ;-) możesz jeszcze powiedzieć jakbyś chciał, żeby to działało.

chmooreck

  • Gość
program dwuwatkowy w C [LINUX]
« Odpowiedź #2 dnia: 2008-06-07, 17:39:48 »
na prawdę nie rozumiesz tego, co ci napisał kompilator ?

Edit: A może nawet nie próbowałeś zrozumieć ?

Andi_911

  • Gość
program dwuwatkowy w C [LINUX]
« Odpowiedź #3 dnia: 2008-06-07, 17:42:50 »
witam,

program ma w pierwszym kroku dawac mozliwosc wyboru pomiedzy jedno- a wielowatkowoscia. Nastepnie w przypadku wybrania wielowatkowosci (dwu- konkretnie), ma za zadanie liczyc jednoczesnie pola dwoch ROZNYCH rombow. Jesli zostanie wybrana jednowatkowosc wtedy ma policzyc ow pola kolejno.
Dodatkowo potrzebuje funkcji liczacej czas - by moc porownac, ktora z drog jest szybsza. Tutaj nie jestem pewien czy to, co dziala pod windowsem zadziala rowniez pod linuxem. :)

pozdrawiam


EDIT:
prawde mowiac z linuxem wiele wspolnego nigdy nie mialem - musze zrobic program, ktory bedzie dzialal w obu srodowiskach - takie sa warunki zaliczenia...
Co do kompilatora to np DWORD z tego co szukalem w goglach jest rowniez stosowany pod linuxem, wiec nie wiem dlaczego nie dziala.
Nie udalo mi sie rowniez znalezc odpowiedzi na pytanie na co zamienic WINAPI, bo na zwyklego int'a czy long'a nie moge tego zmienic.

mikolajS.

  • Gość
program dwuwatkowy w C [LINUX]
« Odpowiedź #4 dnia: 2008-06-07, 20:56:06 »
To chyba widać, że DWORD to efekt typename zdaje się unsigned integer. Występuje w pliku nagłówkowym windows.h (tak mi się wydaje). Więc Twój przykład nie skompilowałby się nawet na windows. (to samo WINAPI i LPVOID - to mi wygląda na jakieś makro). Możesz sam sobie zdefiniować jeżeli musisz takich nazw używać albo zamienić na prawdzie typy.

chmooreck

  • Gość
program dwuwatkowy w C [LINUX]
« Odpowiedź #5 dnia: 2008-06-07, 21:47:33 »
do czasu polecam gettimeofday()

Edit: Jeśli program ma być kompilowalny pod linuksem i windowsem, to polecam użyć jakiejś biblioteki, która załatwi za Ciebie sprawę róznic w obu środowiskach, na przykład SDL'a (wystarczy ci podsystem czasu i wątków)

Andi_911

  • Gość
program dwuwatkowy w C [LINUX]
« Odpowiedź #6 dnia: 2008-06-07, 22:08:32 »
Programy, ktore maja powstac powinny byc mozliwe proste, wrecz lopatologiczne. A to dlatego, ze nikt nie uwierzy, ze ktos kto z programowaniem zbyt wiele wspolnego nigdy nie mial nagle uzywa zaawansowanych funkcji.
Jutro sprobuje powalczyc z tym programem jeszcze. Zobaczymy, moze cos z tego wyniknie...
Pozdr


ten program nie musi być kompilowany pod win i linuxem, napisałem dwa programy każdy to innego systemu, ta akurat wersja musi działać tylko pod linuxem.

mikolajS.

  • Gość
program dwuwatkowy w C [LINUX]
« Odpowiedź #7 dnia: 2008-06-12, 11:18:57 »
Wszystkie DWORD WINAPI przrób na int, a LPVOID na void.
W programie jest trochę błędów bo naprzykład co to  za zmienne watek1 i watek2?
Nigdzie nie są zadeklarowane.
Lepiej samemu nauczyć się pisać jakiekolwiek programy niż ściągać czyjeś programy i próbować je przerobić dla siebie. (a później się podpisywać pod nimi!)