Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: [email protected]

Ошибки линковки

  • Автор теми Автор теми inferno_99
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 28.01.2009
Повідом.: 176
Ошибки линковки

Выложу исходник программы-сервера (игра крестики нолики):
Код:
#include "stdafx.h"
#include "Zadanie1_Serv.h"
#include "Windowsx.h"
#include "Winsock2.h."

#define MAX_LOADSTRING 100

DWORD dwThreadAccept, dwThreadSend, dwThreadRecv;

// Глобальные переменные:
HINSTANCE hInst;								// текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];					// Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];			// имя класса главного окна

int k=20;
const int n=30;

int a[n][n], x_mouse=0, y_mouse=0;

HANDLE hAccept, hSend, hRecv;

SOCKADDR cAdr;
int size1=sizeof(cAdr);
SOCKET ClientSock;

char recvbuf;
int recvbuflen = 2;




struct inf					// на отправку по сети
{
	int i;
	int j;
	bool win;
};

inf inf1, inf2;

struct data
{
	SOCKADDR_IN clientService; 
	SOCKET* sock;
	
};

data d1;

struct dataS
{
	SOCKET* ClientSock;
	char sendbuf;
};

dataS ds;

bool send_data=false;

void ThreadAccept(data* d);
void ThreadSend(dataS* ds);
void ThreadRecv();



// Отправить объявления функций, включенных в этот модуль кода:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

BOOL Search1(int x, int y);
BOOL Search2(int x, int y);
BOOL Search3(int x, int y);
BOOL Search4(int x, int y);


int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: разместите код здесь.
	MSG msg;
	HACCEL hAccelTable;

	// Инициализация глобальных строк
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_ZADANIE1_SERV, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Выполнить инициализацию приложения:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ZADANIE1_SERV));

	// Цикл основного сообщения:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ZADANIE1_SERV));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_ZADANIE1_SERV);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND	- обработка меню приложения
//  WM_PAINT	-Закрасить главное окно
//  WM_DESTROY	 - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	TCHAR szError[100];
	WSADATA WSAData; 
	static SOCKET ServerSock;

	switch (message)
	{
	case WM_CREATE:
		{
			for (int i=0;i<n;i++)		//обнуление матрицы соответствия клеткам
				for(int j=0;j<n;j++)
					a[i][j]=0;


			if ( WSAStartup( MAKEWORD(2,2), &WSAData ) != 0 ) 
			{
				wsprintf (szError, TEXT("Ошибка функции WSAStartup : %d"), WSAGetLastError ());
				MessageBox (NULL, szError, TEXT("Error"), MB_OK );
			}
			
			PHOSTENT pHost;

			pHost=gethostbyname("localhost");
			memcpy ((char FAR *)&(d1.clientService.sin_addr),pHost->h_addr,pHost->h_length);

			d1.clientService.sin_family = AF_INET;
			d1.clientService.sin_port = htons( 27015 );
			

			ServerSock = socket (AF_INET, SOCK_STREAM, 0);

			if ( ServerSock == INVALID_SOCKET )
			{
				wsprintf (szError, TEXT("Allocating socket failed. Error: %d"),	WSAGetLastError () );
				MessageBox (NULL, szError, TEXT("Error"), MB_OK);				
			}

			if (bind (ServerSock,(PSOCKADDR) &(d1.clientService),sizeof(d1.clientService)) == SOCKET_ERROR) 
			{
				wsprintf (szError, TEXT("binding to the server failed. Error: %d"),WSAGetLastError ());
				MessageBox (NULL, szError, TEXT("Error"), MB_OK);
				closesocket (ServerSock);
				return FALSE;
			}


			if (listen(ServerSock,1) == SOCKET_ERROR) 
			{
				wsprintf (szError,TEXT("listing to the server failed. Error: %d"),WSAGetLastError ());
				MessageBox (NULL, szError, TEXT("Listen Error"), MB_OK);
				closesocket (ServerSock);
				return FALSE;
			}

			d1.sock=&ServerSock;

			hAccept=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadAccept,&d1,NULL,&dwThreadAccept);
			hRecv=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadRecv,&ds,NULL,&dwThreadRecv);
			hSend=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadSend,&ds,NULL,&dwThreadSend);




			break;
		}
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Разобрать выбор в меню:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_LBUTTONDOWN:
		{
			x_mouse=GET_X_LPARAM(lParam);
			y_mouse=GET_Y_LPARAM(lParam);

			RECT rc;
			rc.left=x_mouse-k-5;
			rc.top=y_mouse-k-5;
			rc.right=x_mouse+k+5;
			rc.bottom=y_mouse+k+5;

			if (x_mouse<=n*k&&y_mouse<=n*k)		// проверка на попадание в поле
			{
				a[x_mouse/k][y_mouse/k]=2;		// установка ячейки матрицы в состояние "хрестик"
				InvalidateRect(hWnd,&rc,TRUE);
			}
			
			int x, y;

			x=x_mouse/k;
			y=y_mouse/k;

			inf1.i=x;
			inf1.j=y;
			
			if (Search1(x,y)||Search2(x,y)||Search3(x,y)||Search4(x,y))
			{
				MessageBox(hWnd,_T("Вы выиграли!!!"),_T("Победа!"),MB_OK);

				for (int i=0;i<n;i++)				//обнуление матрицы соответствия клеткам
				for(int j=0;j<n;j++)
					a[i][j]=0;

				InvalidateRect(hWnd,NULL,TRUE);

			}
			ds.sendbuf=(char)&inf1;
			send_data=true;

			break;
		}
	case WM_PAINT:
		{
			hdc = BeginPaint(hWnd, &ps);

			int y=0;							// рисование поля
			for(int x=0;x<=n*k;x+=k)
			{
				MoveToEx(hdc,x,y,NULL);
				LineTo(hdc,x,y+n*k);
			}

			int x=0;
			for(int y=0;y<=n*k;y+=k)
			{
				MoveToEx(hdc,x,y,NULL);
				LineTo(hdc,x+n*k,y);
			}


			for (int i=0;i<n;i++)				//рисование хрестика
			{
				for(int j=0;j<n;j++)
				{
					if(a[i][j]==2)
					{						
						Ellipse(hdc,i*k+1,j*k+1,i*k+k-1,j*k+k-1);
					}
					else
						if(a[i][j]==1)
						{
							MoveToEx(hdc,i*k,j*k,NULL);
							LineTo(hdc,i*k+k,j*k+k);

							MoveToEx(hdc,i*k+k,j*k,NULL);
							LineTo(hdc,i*k,j*k+k);
						}
				}
			}


			EndPaint(hWnd, &ps);
			break;
		}
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

BOOL Search1(int x, int y)
{
	int i=x, j=y, ki=x, kj=y, b=0, count=0;
	
	BOOL up=TRUE;

	while(b<6)
	{
		if(a[i][j]==1)count++;
		else up=FALSE;

		if(up)
		{
			i++;
			j++;
		}
		else 
		{
			i=--ki;
			j=--kj;
		}
		b++;

	}
	if(count>=5) return TRUE;
	else return FALSE;
}

BOOL Search2(int x, int y)
{
	int i=x, j=y, ki=x, kj=y, b=0, count=0;
	
	BOOL up=TRUE;

	while(b<6)
	{
		if(a[i][j]==1)count++;
		else up=FALSE;

		if(up)
		{
			i++;
			j--;
		}
		else 
		{
			i=--ki;
			j=++kj;
		}
		b++;

	}
	if(count>=5) return TRUE;
	else return FALSE;
}

BOOL Search3(int x, int y)
{
	int i=x, j=y, ki=x, kj=y, b=0, count=0;	
	BOOL up=TRUE;

	while(b<6)
	{
		if(a[i][j]==1)count++;
		else up=FALSE;

		if(up)
		{
			i++;			
		}
		else 
		{
			i=--ki;			
		}
		b++;

	}
	if(count>=5) return TRUE;
	else return FALSE;
}

BOOL Search4(int x, int y)
{
	int i=x, j=y, ki=x, kj=y, b=0, count=0;
	
	BOOL up=TRUE;

	while(b<6)
	{
		if(a[i][j]==1)count++;
		else up=FALSE;

		if(up)
		{			
			j++;
		}
		else 
		{
			j=--kj;
		}
		b++;

	}
	if(count>=5) return TRUE;
	else return FALSE;

}

void ThreadAccept(data d1)
{
		ClientSock=accept(*d1.sock, &cAdr, &size1);
		ds.ClientSock=&ClientSock;
}

void ThreadSend(dataS ds)
{
	if(send_data)
	{
		send_data=false;
		send ( ClientSock, (const char *)ds.sendbuf, (int)strlen((const char *)ds.sendbuf), 0 );
	}
}

void ThreadRecv()
{
	if( recv(ClientSock,&recvbuf,sizeof(recvbuf),0) != SOCKET_ERROR)
	{
		
		inf2=(inf&)recvbuf;
		a[inf2.i][inf2.j]=2;
	}

}

Ошибки:
Компоновка...
Zadanie1_Serv.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ThreadSend(struct dataS *)" (?ThreadSend@@YAXPAUdataS@@@Z) в функции "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
Zadanie1_Serv.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ThreadAccept(struct data *)" (?ThreadAccept@@YAXPAUdata@@@Z) в функции "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
D:\Study\3 курс\ИПП (Волк)\ИДЗ\Zadanie1_Serv\Debug\Zadanie1_Serv.exe : fatal error LNK1120: 2 неразрешенных внешних элементов
Журнал построения был сохранен в "file://d:\Study\3 курс\ИПП (Волк)\ИДЗ\Zadanie1_Serv\Zadanie1_Serv\Debug\BuildLog.htm"
Zadanie1_Serv - ошибок 3, предупреждений 0
 
Код:
void ThreadAccept(data[b][color=red]*[/color][/b] d);
void ThreadSend(dataS[b][color=red]*[/color][/b] ds);
void ThreadRecv();

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
			hAccept=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadAccept,&d1,NULL,&dwThreadAccept);
			hRecv=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadRecv,&ds,NULL,&dwThreadRecv);
			hSend=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadSend,&ds,NULL,&dwThreadSend);

....

}


void ThreadAccept(data d1)
{
		ClientSock=accept(*d1.sock, &cAdr, &size1);
		ds.ClientSock=&ClientSock;
}

void ThreadSend(dataS ds)
{
	if(send_data)
	{
		send_data=false;
		send ( ClientSock, (const char *)ds.sendbuf, (int)strlen((const char *)ds.sendbuf), 0 );
	}
}

Ошибки:
Компоновка...
Zadanie1_Serv.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ThreadSend(struct dataS *)" (?ThreadSend@@YAXPAUdataS@@@Z) в функции "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
Zadanie1_Serv.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl ThreadAccept(struct data *)" (?ThreadAccept@@YAXPAUdata@@@Z) в функции "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)

Ошибки ровно такие как пишет. Внимательнее посмотрите на сигнатуры при описании и определении.

Кроме того есть ещё одна более тонкая ошибка, признаком которой является необходимость явно преобразовывать тип к LPTHREAD_START_ROUTINE. См. например
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
и особенно
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
.
Код:
typedef DWORD ([b]__stdcall[/b] *LPTHREAD_START_ROUTINE) (
    [in] LPVOID lpThreadParameter
);
 
Спасибо! Ошибок больше нет, только вот что-то не работает((
 
Назад
Зверху Знизу