Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ Virhe unresolved external symbol _WinMain@16

JussiR [05.10.2008 13:25:09]

#

Kun yritän ajaa tätä tulee virheet:
"Compiling...
main.cpp
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/bjbot.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe."

Ja tässä koko ohjelman koodi :)

#include <stdio.h>
#include <windows.h>

int ax=0,ay=0;
HDC hDC;

char swap[3];
char board[8][8];

typedef union clrs {
	DWORD clr1;
	unsigned char clr2[4];
} udata;

bool XGap(int cx, int cy, char jewel);
bool YGap(int cx, int cy, char jewel);
bool XDou(int cx, int cy, char jewel);
bool YDou(int cx, int cy, char jewel);


void Move(void)
{
	int xcrd = ax + 19 + swap[1]*38;
	int ycrd = ay + 19 + swap[2]*38;

	SetCursorPos(xcrd,ycrd);

	Sleep(100);

	mouse_event(2, 0, 0, 0, 0);
	Sleep(10);
	mouse_event(4, 0, 0, 0, 0);

	Sleep(100);

	if (swap[0] == 1) ycrd -= 38;
	if (swap[0] == 2) xcrd += 38;
	if (swap[0] == 3) ycrd += 38;
	if (swap[0] == 4) xcrd -= 38;
	SetCursorPos(xcrd,ycrd);

	Sleep(100);

	mouse_event(2, 0, 0, 0, 0);
	Sleep(10);
	mouse_event(4, 0, 0, 0, 0);

	Sleep(100);

	SetCursorPos(ax, ay - 50);

	Sleep(500);
}

char GetJewel(int boardx, int boardy)
{
	udata ucolor;

	ucolor.clr1 = GetPixel(hDC, ax + 19 + boardx * 38, ay + 19 + boardy * 38);

	if (ucolor.clr2[2] > 0xFE)
		return 1;
	else if (ucolor.clr2[2] == ucolor.clr2[1] && ucolor.clr2[2] == ucolor.clr2[0])
		return 2;
	else if (ucolor.clr2[0] > 0xEE)
	{
		if (ucolor.clr2[1] < 0xB0)
			return 3;
		else
		{
			if (ucolor.clr2[2] < 0x50)
				return 4;
			else
				return 5;
		}
	}
	else if (ucolor.clr2[1] > ucolor.clr2[2])
		return 6;
	else
		return 7;


	return 0;
}

bool GetBoard(void)
{
	char jewel2;
	int dy=0,dx=0;

	for (dy=0;dy<8;dy++)
	{
		for (dx=0;dx<8;dx++)
		{
			jewel2 = GetJewel(dx,dy);

			if (!jewel2)
				return false;

			board[dx][dy] = jewel2;
		}
	}

	return true;
}


void PrintBoard(void)
{
	char jewel1;
	int px,py;

	printf("board:\n");
	for (py=0;py<8;py++)
	{
		for (px=0;px<8;px++)
		{
			jewel1 = board[px][py];
			printf(" %d ", jewel1);
		}
		printf("\n");
	}
}

int main(int argc,char *argv[])
{
	printf("Finding Bejeweled board.\n");
	system("pause");

	int bx,by,bcount;
	bool noboard = true;
	DWORD bcolor;

	printf("Searching.");

	while (noboard)
	{
		printf(".");
		Sleep(500);

		hDC = GetDC(0);

		for (by=0;by<700&&noboard;by++)
		{
			for (bx=0;bx<1024;bx++)
			{
				bcolor = GetPixel(hDC, bx, by);

				if (bcolor == 0x293131)
					bcount++;
				else
					bcount = 0;

				if (bcount == 37 && GetPixel(hDC, bx+2, by) == 0x364c4c)
				{
					printf("\nJewels found at %d, %d\n", bx - bcount, by);
					ax = bx - bcount;
					ay = by;
					noboard = false;
					break;
				}
			}
		}
	}

	char bjewel;
	bool bmove, bwait=false;

	while (1)
	{
		if (GetAsyncKeyState(VK_F12) & 1)
			break;

		if (GetAsyncKeyState(VK_F11) & 1)
		{
			bwait = (!bwait);
			if (bwait) printf("waiting for F11...\n");
		}

		Sleep(500);

		if (bwait) continue;

		hDC = GetDC(0);

		if (GetBoard() == 0)
		{
			printf("board fucked...\n");
			Sleep(1000);
			continue;
		}

		//PrintBoard();
		//break;

		bmove = false;

		for (by=0;by<8;by++)
		for (bx=0;bx<8;bx++)
		{
			bjewel = board[bx][by];

			if (bmove) {}
			else if (bx<6 && bjewel == board[bx+2][by] && XGap(bx,by,bjewel))
			{ printf("xgap:"); bmove = true; }
			else if (by<6 && bjewel == board[bx][by+2] && YGap(bx,by,bjewel))
			{ printf("ygap:"); bmove = true; }
			else if (bx<7 && bjewel == board[bx+1][by] && XDou(bx,by,bjewel))
			{ printf("xdou:"); bmove = true; }
			else if (by<7 && bjewel == board[bx][by+1] && YDou(bx,by,bjewel))
			{ printf("ydou:"); bmove = true; }
		}

		if (bmove)
		{
			printf(" %d,%d with %d\n", swap[1],swap[2],swap[0]);
			Move();
		}
		else
			printf("no move...\n");
	}

	return 1;
}

bool XGap(int cx, int cy, char jewel)
{
	if (cy != 0 && jewel == board[cx+1][cy-1])
	{
		swap[1] = cx + 1;
		swap[2] = cy - 1;
		swap[0] = 3;
		return true;
	}

	if (cy != 7 && jewel == board[cx+1][cy+1])
	{
		swap[1] = cx + 1;
		swap[2] = cy + 1;
		swap[0] = 1;
		return true;
	}

	return false;
}

bool YGap(int cx, int cy, char jewel)
{
	if (cx != 0 && jewel == board[cx-1][cy+1])
	{
		swap[1] = cx - 1;
		swap[2] = cy + 1;
		swap[0] = 2;
		return true;
	}

	if (cx != 7 && jewel == board[cx+1][cy+1])
	{
		swap[1] = cx + 1;
		swap[2] = cy + 1;
		swap[0] = 4;
		return true;
	}

	return false;
}


bool XDou(int cx, int cy, char jewel)
{
	if (cx > 1 && jewel == board[cx-2][cy])
	{
		swap[1] = cx - 2;
		swap[2] = cy;
		swap[0] = 2;
		return true;
	}

	if (cx < 5 && jewel == board[cx+3][cy])
	{
		swap[1] = cx + 3;
		swap[2] = cy;
		swap[0] = 4;
		return true;
	}
	if (cy != 0)
	{
		if (cx != 0 && jewel == board[cx-1][cy-1])
		{
			swap[1] = cx - 1;
			swap[2] = cy - 1;
			swap[0] = 3;
			return true;
		}
		if (cx != 6 && jewel == board[cx+2][cy-1])
		{
			swap[1] = cx + 2;
			swap[2] = cy - 1;
			swap[0] = 3;
			return true;
		}
	}
	if (cy != 7)
	{
		if (cx != 0 && jewel == board[cx-1][cy+1])
		{
			swap[1] = cx - 1;
			swap[2] = cy + 1;
			swap[0] = 1;
			return true;
		}
		if (cx != 6 && jewel == board[cx+2][cy+1])
		{
			swap[1] = cx + 2;
			swap[2] = cy + 1;
			swap[0] = 1;
			return true;
		}
	}

	return false;
}

bool YDou(int cx, int cy, char jewel)
{
	if (cy > 1 && jewel == board[cx][cy-2])
	{
		swap[1] = cx;
		swap[2] = cy - 2;
		swap[0] = 3;
		return true;
	}
	if (cy < 5 && jewel == board[cx][cy+3])
	{
		swap[1] = cx;
		swap[2] = cy + 3;
		swap[0] = 1;
		return true;
	}
	if (cx != 0)
	{
		if (cy != 0 && jewel == board[cx-1][cy-1])
		{
			swap[1] = cx - 1;
			swap[2] = cy - 1;
			swap[0] = 2;
			return true;
		}
		if (cy != 6 && jewel == board[cx-1][cy+2])
		{
			swap[1] = cx - 1;
			swap[2] = cy + 2;
			swap[0] = 2;
			return true;
		}
	}
	if (cx != 7)
	{
		if (cy != 0 && jewel == board[cx+1][cy-1])
		{
			swap[1] = cx + 1;
			swap[2] = cy - 1;
			swap[0] = 4;
			return true;
		}
		if (cy != 6 && jewel == board[cx+1][cy+2])
		{
			swap[1] = cx + 1;
			swap[2] = cy + 2;
			swap[0] = 4;
			return true;
		}
	}

	return false;
}

Anthaing [05.10.2008 21:54:22]

#

Projekti tulee kääntää Win32 Console Application-tyyppisenä. Win32-sovellukset alkavat (ainakin Microsoftin työkaluilla) WinMain()-funktiosta, jota linkittäjä tuossa yrittää hakea. En itse äkkiseltään löytänyt Visual Studiosta mitään asetusta, jolla tuon voisi vaihtaa, joten helpointa lienee luoda uusi projekti ja kopioida koodi siihen.

JussiR [06.10.2008 16:16:01]

#

Joo kiitoksia sain käynnistymään. Muttta jostain syystä ei tapahdu mistään napista mitään -.-

Anthaing [06.10.2008 17:30:54]

#

GetAsyncKeyState()-funktion paluuarvon ylin bitti on päällä, jos nappi on pohjassa. Siis

if (GetAsyncKeyState() & 0x8000) { /* jotain */ }

JussiR [07.10.2008 17:38:05]

#

Mutta jostain syystä mulle ei toimi edes tämä "printf("waiting for F11...\n");". Ei tule tekstiä.

Metabolix [07.10.2008 22:26:18]

#

Varmaankin muistat painaa sitä nappia riittävän pitkään? Koodissasihan on puolen sekunnin odotus joka kierroksella, eli tuohon tarkistukseen ja tulostukseen päästään vain puolen sekunnin välein (tai harvemmin, jos muu koodi vie merkittävästi aikaa). Kokeilepa näin:

while (1) {
  if (GetAsyncKeyState(VK_F11) & 0x8000) {
    printf("F11 painettu.\n");
    Sleep(100);
  }
}

Jos tämäkään ei toimi, tarkista vielä, pääsetkö edes kyseiseen silmukkaan asti.

Tämän jälkeen voit ruveta itse selvittelemään, mikä toimii ja mikä ei. Kannattaa muistaa, että pitkät nukkumiset ovat debuggauksen kannalta joskus vaarallisia, jos ei tarkkaan pidä mielessä, milloin ohjelma nukkuu ja miten se vaikuttaa muun koodin toimintaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta