Здравствуйте. Прошу мне помочь, прога выдаёт ошибку, запускается, работает, но ошибка вылетает после ввода задержки. Задание 3.2 на скрине #include <iostream> #include <windows.h> using namespace std; int ssize; int tick; int ou = ssize; int A1 = 0; int A2 = 0; int A3 = 0; int A4 = 0; int count1 = 0; int count2 = 0; int secondSize = 0; float Sum = 0; float* Mass = new float[ssize]; float* Mass2 = new float[ssize]; float* Mass4 = new float[ssize]; HANDLE hSemaphore; CRITICAL_SECTION cs; DWORD WINAPI Work(LPVOID) { EnterCriticalSection(&cs); cout << "Введите задержку "; cin >> tick; for (int i = 0; i < ssize; i++) { for (int j = 0; j < ssize; j++) { if ((i != j) && (Mass[i] == Mass[j])) { Mass2[A2++] = Mass[j]; break; } } } secondSize = ssize - A2; float* Mass3 = new float[secondSize]; for (int i = 0; i < ssize; i++) { int temp = Mass[i]; for (int j = 0; j < ssize; j++) if (temp == Mass[j]) count1++; if (count1 == 1) { Mass3[A3++] = temp; } count1 = 0; } cout << endl; for (int i = 0; i < A2 - 1; i++) { for (int j = 0; j < A2 - i - 1; j++) { if (Mass2[j] > Mass2[j + 1]) { int temp2 = Mass2[j]; Mass2[j] = Mass2[j + 1]; Mass2[j + 1] = temp2; } } } for (int i = 0; i < count1; i++) { for (A1 = i + 1; A1 < count1; A1++) { if (Mass2[i] < Mass2[A1]) { int t = Mass2[i]; Mass2[i] = Mass2[A1]; Mass2[A1] = t; } } } for (int i = 0; i < A2; i++) { Mass4[A4++] = Mass2[i]; ReleaseSemaphore(hSemaphore, 1, NULL); Sleep(tick); } for (int i = 0; i < secondSize; i++) { Mass4[A4++] = Mass3[i]; ReleaseSemaphore(hSemaphore, 1, NULL); Sleep(tick); } LeaveCriticalSection(&cs); return 0; } DWORD WINAPI SumElement(LPVOID) { EnterCriticalSection(&cs); for (int i = 0; i < ssize; i++) { Sum += Mass4[i]; } cout << "Сумма массива - " << Sum << endl; LeaveCriticalSection(&cs); return 0; } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Russian"); cout << "Введите размер массива "; cin >> ssize; for (int i = 0; i < ssize; i++) { cout << "Введите " << i << " элемент массива: "; cin >> Mass[i]; } cout << "Размер массива " << ssize << endl; cout << "Заполненный массив" << endl; for (int i = 0; i < ssize; i++) { cout << "[" << i << "]= " << Mass[i] << endl << flush; } InitializeCriticalSection(&cs); hSemaphore = CreateSemaphoreA(NULL, 0, ssize, NULL); DWORD idWork; HANDLE hWork = CreateThread(NULL, 0, Work, (void*)NULL, 0, &idWork); DWORD idSumElement; HANDLE hSumElement = CreateThread(NULL, 0, SumElement, (void*)NULL, 0, &idWork); cout << "Измененный массив " << endl; WaitForSingleObject(hSemaphore, INFINITE); for (int i = 0; i < ssize; i++) { WaitForSingleObject(hSemaphore, INFINITE); cout << "[" << i << "] = " << Mass4[i] << endl; } WaitForSingleObject(hSemaphore, INFINITE); cout << "[" << ssize << "] = " << Mass4[ssize] << endl; system("pause"); //LeaveCriticalSection(&cs); DeleteCriticalSection(&cs); CloseHandle(hSemaphore); CloseHandle(hWork); } C #include <iostream> #include <windows.h> using namespace std; int ssize; int tick; int ou = ssize; int A1 = 0; int A2 = 0; int A3 = 0; int A4 = 0; int count1 = 0; int count2 = 0; int secondSize = 0; float Sum = 0; float* Mass = new float[ssize]; float* Mass2 = new float[ssize]; float* Mass4 = new float[ssize]; HANDLE hSemaphore; CRITICAL_SECTION cs; DWORD WINAPI Work(LPVOID) { EnterCriticalSection(&cs); cout << "Введите задержку "; cin >> tick; for (int i = 0; i < ssize; i++) { for (int j = 0; j < ssize; j++) { if ((i != j) && (Mass[i] == Mass[j])) { Mass2[A2++] = Mass[j]; break; } } } secondSize = ssize - A2; float* Mass3 = new float[secondSize]; for (int i = 0; i < ssize; i++) { int temp = Mass[i]; for (int j = 0; j < ssize; j++) if (temp == Mass[j]) count1++; if (count1 == 1) { Mass3[A3++] = temp; } count1 = 0; } cout << endl; for (int i = 0; i < A2 - 1; i++) { for (int j = 0; j < A2 - i - 1; j++) { if (Mass2[j] > Mass2[j + 1]) { int temp2 = Mass2[j]; Mass2[j] = Mass2[j + 1]; Mass2[j + 1] = temp2; } } } for (int i = 0; i < count1; i++) { for (A1 = i + 1; A1 < count1; A1++) { if (Mass2[i] < Mass2[A1]) { int t = Mass2[i]; Mass2[i] = Mass2[A1]; Mass2[A1] = t; } } } for (int i = 0; i < A2; i++) { Mass4[A4++] = Mass2[i]; ReleaseSemaphore(hSemaphore, 1, NULL); Sleep(tick); } for (int i = 0; i < secondSize; i++) { Mass4[A4++] = Mass3[i]; ReleaseSemaphore(hSemaphore, 1, NULL); Sleep(tick); } LeaveCriticalSection(&cs); return 0; } DWORD WINAPI SumElement(LPVOID) { EnterCriticalSection(&cs); for (int i = 0; i < ssize; i++) { Sum += Mass4[i]; } cout << "Сумма массива - " << Sum << endl; LeaveCriticalSection(&cs); return 0; } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Russian"); cout << "Введите размер массива "; cin >> ssize; for (int i = 0; i < ssize; i++) { cout << "Введите " << i << " элемент массива: "; cin >> Mass[i]; } cout << "Размер массива " << ssize << endl; cout << "Заполненный массив" << endl; for (int i = 0; i < ssize; i++) { cout << "[" << i << "]= " << Mass[i] << endl << flush; } InitializeCriticalSection(&cs); hSemaphore = CreateSemaphoreA(NULL, 0, ssize, NULL); DWORD idWork; HANDLE hWork = CreateThread(NULL, 0, Work, (void*)NULL, 0, &idWork); DWORD idSumElement; HANDLE hSumElement = CreateThread(NULL, 0, SumElement, (void*)NULL, 0, &idWork); cout << "Измененный массив " << endl; WaitForSingleObject(hSemaphore, INFINITE); for (int i = 0; i < ssize; i++) { WaitForSingleObject(hSemaphore, INFINITE); cout << "[" << i << "] = " << Mass4[i] << endl; } WaitForSingleObject(hSemaphore, INFINITE); cout << "[" << ssize << "] = " << Mass4[ssize] << endl; system("pause"); //LeaveCriticalSection(&cs); DeleteCriticalSection(&cs); CloseHandle(hSemaphore); CloseHandle(hWork); }
Для запуска нужно качать всякое, поэтому могу разве что посоветовать принтить что то в консоль и выходить из программы в разных местах кода, так можно найти точное место где оно крашится и дальше уже проанализировать из за чего