Ошибка компиляции - C (СИ)
Формулировка задачи:
#include<windows.h> //подключаем библиотеки
#include<stdlib.h>
#include<time.h>
#include<process.h>
#include<stdio.h>
HANDLE hstdin, hstdout, hthread1, hthread2, hthread3, hthread4, hthread5, hthread6, hthread7, hthread8, em, adw, dw1, dw2, dw3;
//хэндлы для работы нитей, семафоров и ввода вывода
int imo = 0, dmo = 0, gas = 0, m1 = 0, m2 = 0, m3 = 0;//для очереди машин, водителей
int N; //число N
unsigned __stdcall gas1( void* pArguments)// Нить 1й колонки
{
int i;
COORD pos;
while (1) {
WaitForSingleObject(dw1, INFINITE);
int randomize(); // выполняется до завершения основной программы
Sleep(rand()% 500);
WaitForSingleObject(em, INFINITE);
m1 = 0;
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
pos.X = 17;
pos.Y = 1;
SetConsoleCursorPosition(hstdout, pos);
printf(" ");
if (imo>0) {
m1 = 1;
imo--;
pos.Y = 5;//перемещение машины по Х
for (pos.X = 39; pos.X>16; pos.X--)
{
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
SetConsoleCursorPosition(hstdout, pos);
printf("M");
ReleaseMutex(em);
Sleep(50);
WaitForSingleObject(em, INFINITE);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
SetConsoleCursorPosition(hstdout, pos);
printf(" ");
}//перемещение машины по Y
pos.X = 17;
for (pos.Y = 5; pos.Y>1; pos.Y--)
{
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("M");
ReleaseMutex(em);
Sleep(50);
WaitForSingleObject(em, INFINITE);
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
printf(" ");
}
pos.X = 17;
pos.Y = 1;
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("M");
dmo++;
}//водитель+
ReleaseMutex(em);
ReleaseMutex(dw1);
Sleep(rand()% 1500);
gas = 1;
}
}
unsigned __stdcall gas2(void* pArguments)
{
int i;
COORD pos;
while (TRUE) {
WaitForSingleObject(dw2, INFINITE);
int randomize();
Sleep(rand()% 500);
WaitForSingleObject(em, INFINITE);
m2 = 0;
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
pos.X = 25;
pos.Y = 1;
SetConsoleCursorPosition(hstdout, pos);
printf(" ");
if (imo>0) {
m2 = 1;
imo--;
pos.Y = 5;//перемещение машины по Х
for (pos.X = 39; pos.X>24; pos.X--)
{
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
SetConsoleCursorPosition(hstdout, pos);
printf("M");
ReleaseMutex(em);
Sleep(50);
WaitForSingleObject(em, INFINITE);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
SetConsoleCursorPosition(hstdout, pos);
printf(" ");
}//перемещение машины по Y
pos.X = 25;
for (pos.Y = 5; pos.Y>1; pos.Y--)
{
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("M");
ReleaseMutex(em);
Sleep(50);
WaitForSingleObject(em, INFINITE);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
SetConsoleCursorPosition(hstdout, pos);
printf(" ");
}
pos.X = 25;
pos.Y = 1;
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("M");
dmo++;
}//водитель+
ReleaseMutex(em);
ReleaseMutex(dw2);
Sleep(rand()% 15000);
gas = 2;
}
}
unsigned __stdcall gas3(void* pArguments)
{
int i;
COORD pos;
while (TRUE) {
WaitForSingleObject(dw3, INFINITE);
int randomize();
Sleep(rand()% 500);
WaitForSingleObject(em, INFINITE);
m3 = 0;
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
pos.X = 33;
pos.Y = 1;
SetConsoleCursorPosition(hstdout, pos);
printf(" ");
if (imo>0) {
m3 = 1;
imo--;
pos.Y = 5;//перемещение машины по Х
for (pos.X = 39; pos.X>32; pos.X--)
{
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
SetConsoleCursorPosition(hstdout, pos);
printf("M");
ReleaseMutex(em);
Sleep(50);
WaitForSingleObject(em, INFINITE);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
SetConsoleCursorPosition(hstdout, pos);
printf(" ");
}//перемещение машины по Y
pos.X = 33;
for (pos.Y = 5; pos.Y>1; pos.Y--)
{
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("M");
ReleaseMutex(em);
Sleep(50);
WaitForSingleObject(em, INFINITE);
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
printf(" ");
}
pos.X = 33;
pos.Y = 1;
SetConsoleCursorPosition(hstdout, pos);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("M");
dmo++;
}//водитель+
ReleaseMutex(em);
ReleaseMutex(dw3);
Sleep(rand()% 1500);
gas = 3;
}
}
unsigned __stdcall drv1(void* pArguments)// водители прорисовка
{
int i;
COORD pos;
while (TRUE) {
int randomize();
WaitForSingleObject(em, INFINITE);
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
pos.X = 13;
pos.Y = 7;
SetConsoleCursorPosition(hstdout, pos);
for (i = -3; i<dmo; i++) { printf(" "); }
if (dmo>0) {
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
SetConsoleCursorPosition(hstdout, pos);
for (i = 0; i<dmo; i++) { printf("D"); }//очередь водителей в кассу
//машин-1
}
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED);
pos.X = 40;
pos.Y = 5;
SetConsoleCursorPosition(hstdout, pos);
for (i = -3; i<imo; i++) { printf(" "); }
if (imo>0) {
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
SetConsoleCursorPosition(hstdout, pos);
for (i = 0; i<imo; i++) { printf("M"); }//очередь водителей в кассу
//машин-1
}
SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
pos.X = 0;
pos.Y = 9;
SetConsoleCursorPosition(hstdout, pos);
printf(" \n \n ");
SetConsoleCursorPosition(hstdout, pos);
printf(" Cars total = %d\n Cars here = %d\n Cars somewhere else = %d", N, (imo + m1 + m2 + m3), (N - imo - m1 - m2 - m3));
ReleaseMutex(em);
Sleep(50);
}
}
unsigned __stdcall drv2_1(void* pArguments)// водители счетчик очереди
{
int i;
COORD pos;
while (TRUE) {
int randomize();
WaitForSingleObject(dw1, INFINITE);
WaitForSingleObject(adw, INFINITE);
if (dmo>0) { Sleep(500 + rand()% 1500); dmo--; }
ReleaseMutex(dw1);
ReleaseMutex(adw);
}
}
unsigned __stdcall drv2_2(void* pArguments)// водители счетчик очереди
{
int i;
COORD pos;
while (TRUE) {
int randomize();
WaitForSingleObject(dw2, INFINITE);
WaitForSingleObject(adw, INFINITE);
if (dmo>0) { Sleep(500 + rand()% 1500); dmo--; }
ReleaseMutex(dw2);
ReleaseMutex(adw);
}
}
unsigned __stdcall drv2_3(void* pArguments)// водители счетчик очереди
{
int i;
COORD pos;
while (TRUE) {
int randomize();
WaitForSingleObject(dw3, INFINITE);
WaitForSingleObject(adw, INFINITE);
if (dmo>0) { Sleep(500 + rand()%1500); dmo--; }
ReleaseMutex(dw3);
ReleaseMutex(adw);
}
}
void main() //основная программа
{
//обозначаем что нити будут расположены после основной части программы
unsigned int threadid1, threadid2, threadid3, threadid4, threadid5, threadid6, threadid7, threadid8; //идентификатор для нитей
COORD pos;//координатная переменная
int i, j = 0;//переменные для циклов
hstdout = GetStdHandle(STD_OUTPUT_HANDLE); // инициализация хэндлов ввода, ввывода
hstdin = GetStdHandle(STD_INPUT_HANDLE);
em = CreateMutex(NULL, TRUE, NULL);//инициализация семафоров Mutex
if (em == NULL)
{
printf("Mutex=%d\n", em);
getchar();
}
dw1 = CreateMutex(NULL, TRUE, NULL);
if (dw1 == NULL)
{
printf("Mutex=%d\n", dw1);
getchar();
}
dw2 = CreateMutex(NULL, TRUE, NULL);
if (dw2 == NULL)
{
printf("Mutex=%d\n", dw2);
getchar();
}
dw3 = CreateMutex(NULL, TRUE, NULL);
if (dw3 == NULL)
{
printf("Mutex=%d\n", dw3);
getchar();
}
adw = CreateMutex(NULL, TRUE, NULL);
if (adw == NULL)
{
printf("Mutex=%d\n", adw);
getchar();
}
SetConsoleTextAttribute(hstdout, FOREGROUND_BLUE);
for (i = 0; i<10; i++) { printf("\n\n\n\n\n\n\n"); }// очистка экрана
printf("input N> ");
scanf("%d", &N);
pos.X = 0; //установка координат курсора вывода
pos.Y = 0; //рисование заправки
SetConsoleCursorPosition(hstdout, pos);
printf(" "); SetConsoleTextAttribute(hstdout, FOREGROUND_RED | FOREGROUND_BLUE | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf(""); SetConsoleTextAttribute(hstdout, FOREGROUND_RED);
printf(" "); SetConsoleTextAttribute(hstdout, FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("Gas #1"); SetConsoleTextAttribute(hstdout, FOREGROUND_RED);
printf(" "); SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("Gas #2"); SetConsoleTextAttribute(hstdout, FOREGROUND_RED);
printf(" "); SetConsoleTextAttribute(hstdout, FOREGROUND_BLUE | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("Gas #3\n"); SetConsoleTextAttribute(hstdout, FOREGROUND_RED);
printf(" "); SetConsoleTextAttribute(hstdout, FOREGROUND_RED | FOREGROUND_BLUE | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
printf("\n\n\n\n\n\n Cash\n");
SetConsoleTextAttribute(hstdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf("\n Anaai iaoei = %d\n N = %d\n", (imo + m1 + m2 + m3), N);
ReleaseMutex(em);
ReleaseMutex(dw1);
ReleaseMutex(dw2);
ReleaseMutex(dw3);
ReleaseMutex(adw);
hthread1 = (HANDLE)_beginthreadex(NULL, 4096, &gas1, NULL, 0, &threadid1); //Запуск нитей
if (hthread1 == NULL) { printf("hthread1=%d\n", hthread1); getchar(); }
hthread2 = (HANDLE)_beginthreadex(NULL, 4096, &gas2, NULL, 0, &threadid2);
if (hthread2 == NULL) { printf("hthread2=%d\n", hthread2); getchar(); }
hthread3 = (HANDLE)_beginthreadex(NULL, 4096, &gas3, NULL, 0, &threadid3);
if (hthread3 == NULL) { printf("hthread3=%d\n", hthread3); getchar(); }
hthread4 = (HANDLE)_beginthreadex(NULL, 4096, &drv1, NULL, 0, &threadid4);
if (hthread4 == NULL) { printf("hthread4=%d\n", hthread4); getchar(); }
hthread5 = (HANDLE)_beginthreadex(NULL, 4096, &drv2_1, NULL, 0, &threadid5);
if (hthread5 == NULL) { printf("hthread5=%d\n", hthread5); getchar(); }
hthread7 = (HANDLE)_beginthreadex(NULL, 4096, &drv2_2, NULL, 0, &threadid7);
if (hthread7 == NULL) { printf("hthread7=%d\n", hthread7); getchar(); }
hthread8 = (HANDLE)_beginthreadex(NULL, 4096, &drv2_3, NULL, 0, &threadid8);
if (hthread8 == NULL) { printf("hthread8=%d\n", hthread8); getchar(); }
do {
for (i = 5; i>0; i--) {
if (imo<N - i - m1 - m2 - m3) {
imo = imo + rand()% i;
break;
}
}
Sleep(rand()% 2500);
j++;
} while (j<150);
CloseHandle(hthread1);
CloseHandle(hthread2);
CloseHandle(hthread3);
CloseHandle(hthread4);
CloseHandle(hthread5);
CloseHandle(hthread6);
CloseHandle(hthread7);
CloseHandle(hthread8);
CloseHandle(hstdout);
CloseHandle(em);
CloseHandle(dw1);
CloseHandle(dw2);
CloseHandle(dw3);
CloseHandle(adw);
CloseHandle(hstdin);
}Решение задачи: «Ошибка компиляции»
textual
Листинг программы
int main(){
// тут программа
return 0;
}