Статус: Офлайн
Реєстрація: 28.01.2009
Повідом.: 176
Реєстрація: 28.01.2009
Повідом.: 176
Ошибки линковки
Выложу исходник программы-сервера (игра крестики нолики):
Ошибки:
Компоновка...
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
Выложу исходник программы-сервера (игра крестики нолики):
Код:
#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