// dodac memset
//dynamiczne zalokowac pamiec na tablice
//wyzerowac tablice na watki
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#define MAX_THREADS 101
double caly_iloczyn = 1;
HANDLE muteks;
//HANDLE tab_na_watki[MAX_THREADS];
typedef struct
{
int indeks_poczat;
int rozmiar;
}Zakres;
Zakres zakres[MAX_THREADS];
memset(*zakres, 0, sizeof(zakres));
DWORD WINAPI obliczanie_iloczynu(LPVOID wsk)
{
Zakres* wsk_z = (Zakres*)wsk;
int indeks_poczat = wsk_z->indeks_poczat;
int rozmiar = wsk_z->rozmiar;
printf("%d %d\n\n", indeks_poczat, rozmiar);
printf("Thread #%d size=%d first=%d \n", GetCurrentThreadId(), rozmiar, indeks_poczat);
double iloczyn_czast = 1;
for (int i = 0; i < rozmiar; i++)
{
int indeks = indeks_poczat + i;
int licznik = indeks;
int mianownik = indeks;
if (indeks % 2 == 1) licznik += 1;
else mianownik += 1;
iloczyn_czast *= licznik;
iloczyn_czast /= mianownik;
}
WaitForSingleObject(muteks, INFINITE);
caly_iloczyn *= iloczyn_czast;
ReleaseMutex(muteks);
printf("Thread #%d prod=%lf \n", GetCurrentThreadId(), iloczyn_czast);
return 0;
}
int main(int argc, char* argv[])
{
if (argc != 3)
{
printf("nie wlasciwa ilosc argumentow");
exit(-1);
}
int n = atoi(argv[1]);
int w = atoi(argv[2]);
if (n <= 1 || n >= 1000000000)
{
printf("zla liczba wyrazow ciagu");
exit(-2);
}
if (w <= 1 || w >= 100)
{
printf("zla liczba wyrazow ciagu");
exit(-2);
}
muteks = CreateMutex(NULL, FALSE, NULL);
if (muteks == 0)
{
printf("blad przy tworzeniu muteksu");
}
DWORD id_watku;
clock_t start;
clock_t stop;
double czas;
start = clock();
HANDLE* tab_na_watki = (HANDLE*)malloc((w + 1) * sizeof(HANDLE));
for (int watek = 1; watek <= w; watek++)
{
int rozmiar_zakresu = n / w;
if (watek == w)
{
rozmiar_zakresu += n % w; // reszta z dzielenia
}
zakres[watek].rozmiar = rozmiar_zakresu;
zakres[watek].indeks_poczat = (watek - 1) * (n / w) + 1;
tab_na_watki[watek] = CreateThread(NULL, 0, obliczanie_iloczynu, (LPVOID)&tab_na_watki[watek], 0, &id_watku);
if (tab_na_watki[watek] == NULL)
{
printf("Blad przy tworzeniu watkow");
}
// 1 arg - adres pod którym ma zostać zapamiętany id wątku
// 3 arg - funkcja liczÄ…ca iloczyn czÄ…stkowy
// 4 arg - parametry przekazywane temu wÄ…tkowi do funkcji
}
WaitForMultipleObjects(w, tab_na_watki + 1, TRUE, INFINITE);
stop = clock();
czas = (stop - start) / (double)CLOCKS_PER_SEC;
for (int i = 1; i <= w; i++)
{
CloseHandle(tab_na_watki[i]); //zamkniecie uchywtu do wÄ…tku
}
CloseHandle(muteks);
printf("w/Threads: PI= %lf time= %lfs \n", 2 * caly_iloczyn, czas);
start = clock();
double iloczyn = 1;
for (int i = 0; i < n; i++)
{
int indeks = 1 + i;
int licznik = indeks;
int mianownik = indeks;
if (indeks % 2 == 1) licznik += 1;
else mianownik += 1;
iloczyn *= licznik;
iloczyn /= mianownik;
}
stop = clock();
czas = (stop - start) / (double)CLOCKS_PER_SEC;
printf("wo/Threads: PI= %lf time= %lfs \n", 2 * iloczyn, czas);
free(tab_na_watki);
return 0;
}
Witam, program wyrzuca nastepujace komunikaty:
plik.c:1:1: error: stray '\304' in program
´╗┐─Ć┬╗┼╝// dodac memset
^
plik.c:1:2: error: stray '\217' in program
´╗┐─Ć┬╗┼╝// dodac memset
^
plik.c:1:3: error: stray '\302' in program
´╗┐─Ć┬╗┼╝// dodac memset
^
plik.c:1:4: error: stray '\273' in program
´╗┐─Ć┬╗┼╝// dodac memset
^
plik.c:1:5: error: stray '\305' in program
´╗┐─Ć┬╗┼╝// dodac memset
^
plik.c:1:6: error: stray '\274' in program
´╗┐─Ć┬╗┼╝// dodac memset
^
plik.c:23:8: error: expected declaration specifiers or '...' before '*' token
memset(*zakres, 0, sizeof(zakres));
^
plik.c:23:17: error: expected declaration specifiers or '...' before numeric constant
memset(*zakres, 0, sizeof(zakres));
^
plik.c:23:20: error: expected declaration specifiers or '...' before 'sizeof'
memset(*zakres, 0, sizeof(zakres));
Czy wie ktos gdzie jest problem albo jak go naprawic?