Co mam spatne (strcmp()) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Co mam spatne (strcmp()) – C / C++ – Fórum – Programujte.comCo mam spatne (strcmp()) – C / C++ – Fórum – Programujte.com

 

Ivo
~ Anonymní uživatel
93 příspěvků
5. 6. 2007   #1
-
0
-

Ahoj, mam kod ktery posila do konzole string:

<IPBAN> NAME


v serveru (konzole) je funkce ktera kontroluje jestli se v konzoli neobevi zprava zacinajici <IPBAN>, pokud tam je izoluje "<IPBAN> " a vse co je za <IPBAN> a mezerou prevede na string, a ten string ja porovnavam s jinym stringem.. a tady je problem, po asi hodine kdyz jsem si stim hral, zkousel.. jsem pomoci logu prisel na to ze to VZDY crashne na
" if(strcmp(playerInfo[i].m_szPlayerHandle, szName));"
:





//BAN SECTION
if(!strnicmp(szMsg, "<IPBAN>", 7))
{
if(strlen(szMsg) > 8)
{

char *szName = szMsg + 7;
while(*szName == ' ')
szName++;

CArray< CPlayerInfo, CPlayerInfo & > playerInfo;

for(int i=0;i<15;i++)
{
if(strcmp(playerInfo[i].m_szPlayerHandle, szName));
{
int nIndex = i;
char IpBanList[512];
sprintf(IpBanList,"IPBANLIST.txt");
FILE *fh=fopen(IpBanList,"a+");
if(fh)
{
fprintf(fh, "* %s - BannedFromConsole",szName);
fprintf(fh, "\n");
fprintf(fh, "%s",m_JoinData[nIndex].m_szIP);
fclose(fh);
}
}
}
}
}
//END OF BAN SECTION





nevite nekdo co s tim? kde je chyba? aplikace vzdycky zatuhne a spadne kdyz to dojde k
"if(strcmp(playerInfo[i].m_szPlayerHandle, szName));"

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
5. 6. 2007   #2
-
0
-

No chyba je tam snad jen drobná, máš tam středník na víc. Konkrétně:


if(strcmp(playerInfo[i].m_szPlayerHandle, szName)) ;
{
int nIndex = i;
char IpBanList[512];
...

Nahlásit jako SPAM
IP: ...–
Ivo
~ Anonymní uživatel
93 příspěvků
5. 6. 2007   #3
-
0
-

ne, to je z jedny z poslednich kpii.. i kdyz to odstranim vzdycky to crashne na stejnym miste..

dojde to k if(strcmp(playerInfo[i].m_szPlayerHandle, szName))
a spadne to.

Nahlásit jako SPAM
IP: ...–
Ivo
~ Anonymní uživatel
93 příspěvků
5. 6. 2007   #4
-
0
-

kdyz pustim debugger a dam attach to process tak to bezi bezi bezi.. a jak se ma vykonat tahle fce tak First-chance exception in AVP2ServOriEdition.exe: 0xC0000005: Access Violation.

00406646 mov dl,byte ptr [ecx]




First-chance exception in AVP2ServOriEdition.exe: 0xC0000005: Access Violation.
The thread 0x7E4 has exited with code -1073741819 (0xC0000005).
The thread 0x1B18 has exited with code -1073741819 (0xC0000005).
The thread 0x25C has exited with code -1073741819 (0xC0000005).
The thread 0x1BB8 has exited with code -1073741819 (0xC0000005).
The thread 0x250 has exited with code -1073741819 (0xC0000005).
The thread 0x2A0 has exited with code -1073741819 (0xC0000005).
The program 'C:\Install\AvP2\Aliens vs. Predator 2\AVP2ServOriEdition.exe' has exited with code -1073741819 (0xC0000005).

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
6. 6. 2007   #5
-
0
-

Taky bych si dal pozor na tohle:


char *szName = szMsg + 7;
while(*szName == ' ')
szName++;


Tu chybu bych řekl, že to nezpůsobuje ale pousouvá adresu začátku pole kamsi pryč.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
6. 6. 2007   #6
-
0
-

Jsi si zcela jistý, že těch hráčů máš 15?

 for(int i=0;i<15;i++) //?? for(int i=0; i < playerInfo.GetSize(); ++i)

{
if(strcmp(playerInfo[i].m_szPlayerHandle, szName));
{

Dále si pro jistotu vypiš, co obsahuje proměnná szName.
Jinak je nějaký ůvod, proč používáš MFC a C? Tohle by šlo přece napsat v C++ za pomoci STL a daleko jendodušeji a bezpečněji. Nicméně jak se říká, proti gustu žádný dišputát.

Nahlásit jako SPAM
IP: ...–
ivo
~ Anonymní uživatel
93 příspěvků
6. 6. 2007   #7
-
0
-

To Jura:

OBJECT lto coz je dll file hry pouziva ID pro hrace 1-16
SERVERapp (AvP2ServOriEdition.Exe) pouziva id 0-15 (nevim proc ale je to tak .) )

"< playerInfo.GetSize();" je tam pouzite protoze tahle fce vrati aktualni pocet obsazenych ID, mam zkusenost z OBJECT.LTO ze kdyz kontrolujes ID ktery neexistuje crashne to.

promenna szname funguje, vkladal jsem radek po radku log aby mi to vypsalo kde to crashne, s vypisem promennych, v okamziku kde promenna szName ziska ten string do sebe je tam (vypsal se mi do textaku),

a nakonec.. pisu to tak protoze to jinak neumim =) a jsem rad za kadzou pomoc :)

To Matrix17:




char *szName = szMsg + 7;
while(*szName == ' ')
szName++;

se pouziva treba tady:


// -------------------------------------------------------------------- //
//
// NK
//
// KICK dle ID
//
// -------------------------------------------------------------------- //

else if(!_strnicmp(szMsg, "nk", 2))
{
if(strlen(szMsg) > 3)
{
// Finds the next non-space character
char *szName = szMsg + 2;

// Get rid of leading spaces
while(*szName == ' ')
szName++;


// Find the named client
int nIndex = FindClient(atoi(szName));


if(!_strnicmp(szName,"-silent",7))
{
szName+=7;
while(*szName == ' ')
szName++;

int nIndex = FindClient(atoi(szName));

if(nIndex != -1)
{

char szMsg[128];
sprintf(szMsg, "%s Kicked (SILENT).",m_ClientData[nIndex].m_hClient);
HMESSAGEWRITE hMessage = g_pLTServer->StartMessage(m_ClientData[senderID].m_hClient, MID_MPMGR_PRIVATE_MESSAGE);
hMessage->WriteDWord(0);
hMessage->WriteString(szMsg);
g_pLTServer->EndMessage(hMessage);

// ServerAppMessage(szString, nIndex);

g_pLTServer->KickClient(m_ClientData[nIndex].m_hClient);
}

return LTTRUE;
}

if(nIndex != -1)
{

char szMsg[128];
sprintf(szMsg, "Client %s Kicked From Server." , m_ClientData[nIndex].m_Data.m_szName);
HMESSAGEWRITE hMessage = g_pLTServer->StartMessage(NULL, MID_MPMGR_MESSAGE);
hMessage->WriteDWord(-1);
hMessage->WriteString(szMsg);
g_pLTServer->EndMessage(hMessage);


g_pLTServer->KickClient(m_ClientData[nIndex].m_hClient);


}

bCommandHandled = LTTRUE;
}
}


a tady tpo funguje jde o stejny princip.. geabuju to co je za "<IPBAN> " do stringu.

ja uz fakt nevim :'( zacinam z toho bejt zoufalej :(

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
6. 6. 2007   #8
-
0
-

Huh, tak ted uz nevim absolutne nic. Napis co presne potrebujes a pokusime se to dat do kupy jinak a lepe.
btw:


"< playerInfo.GetSize();" je tam pouzite protoze tahle fce vrati aktualni pocet obsazenych ID...


Tohle jsem tam, myslim, psal ja. Takze to oznameni vyse je otazka nebo jen tvrzeni, ze jsi to uz pouzil???

Nahlásit jako SPAM
IP: ...–
Ivo
~ Anonymní uživatel
93 příspěvků
7. 6. 2007   #9
-
0
-

To Jura: to "< playerInfo.GetSize();" je tam ted aktualne, protoe kdyz se jinde v kodu pouzilo 0-15 tak to crashlo protoze ten originalni praseci kod pak hledal i u klientu ktery neexistovaly a tak to psalo do neplatny pameti.


no co chci :(
co bych chtel :( je to v prdeli nevim PROC to VZDYCKY crashne tady:

"if(strcmp(playerInfo[i].m_szPlayerHandle, szName))"

:(

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
7. 6. 2007   #10
-
0
-

Nerozumím. Teď když používáš i < playerInfo.GetSize() to pádá pořád? Btw: Pokud chceš ty řetězce porovnávat na rovnost, tak by to mělo být spíše:



for(int i=0;i < playerInfo.GetSize();i++)
if(strcmp(playerInfo[i].m_szPlayerHandle, szName) == 0)
//..

Nahlásit jako SPAM
IP: ...–
Matrix17
~ Anonymní uživatel
300 příspěvků
7. 6. 2007   #11
-
0
-

To Ivo: Nevim, nevim ale mně se ten cykl while prostě moc nezdá hoď si tam radši kontrolní výpis/výpisy. Jelikož si myslím, že s adresou toho szName se tam až moc čachruje.

Nahlásit jako SPAM
IP: ...–
Ivo
~ Anonymní uživatel
93 příspěvků
7. 6. 2007   #12
-
0
-

To Matrix17: s tim white to funguje :( logy jsem tam daval, ty promenny szName se tam priradi to co chci.. tzn ze kdyz se v mkonzoli obevi <IPBAN> LAMER tak hodnota szName je LAMER, to je spravne.

ja uz fakt nevim propste to crashne podle logů presne v miste "if(strcmp(playerInfo[i].m_szPlayerHandle, szName))"
:/ :/

To Jura:
"Teď když používáš i < playerInfo.GetSize() to pádá pořád?" ano :'(
no pole playerInfo[i].m_szPlayerHandle ma treba hodnotu "KOKOS"
a pole szName ma treba hodnotu "POMERANC" a ja tim
potrebuju zjistit jestli pole playerInfo[i].m_szPlayerHandle ma stejnou hodnotu jako szName.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
7. 6. 2007   #13
-
0
-

Tak si jeste pro jistotu otestuj hodnotu promenne m_szPlayerHandle. Zkus tohle:



if(!strnicmp(szMsg, "<IPBAN>", 7))
{
if(strlen(szMsg) > 8)
{

char *szName = szMsg + 7;
while(*szName == ' ')
szName++;

CArray< CPlayerInfo, CPlayerInfo & > playerInfo; // radeji bych vector<CPlayerInfo> playerInfo; ale to uz je tvoje vec

for(int i=0;i < playerInfo.GetSize();i++)
{
if(playerInfo[i].m_szPlayerHandle && strcmp(playerInfo[i].m_szPlayerHandle, szName) == 0);
{
int nIndex = i;
char IpBanList[512];
sprintf(IpBanList,"IPBANLIST.txt"); // zajimave, mozna by to bylo vhodnejsi vytvorit jako konstantu
FILE *fh=fopen(IpBanList,"a+");
if(fh)
{
fprintf(fh, "* %s - BannedFromConsole",szName);
fprintf(fh, "\n");
fprintf(fh, "%s",m_JoinData[nIndex].m_szIP);
fclose(fh);
}
}
}
}
}

Nahlásit jako SPAM
IP: ...–
Ivo
~ Anonymní uživatel
93 příspěvků
7. 6. 2007   #14
-
0
-

To Jura:
Kdyz pouziju tvuj kod nestane se vubec nic (ani to necrashne ani to nic nezapise do IPBAN.TXT

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
7. 6. 2007   #15
-
0
-

To Ivo:
Takže s největší prevděpodobností nemáš inicializovány m_szPlayerHandle. Dej to bud o assertu nebo to projdi debuggerem. A ukaž zde jak vypada třída CPlayerInfo a jak inicializujes jednotlive proměnné..

Nahlásit jako SPAM
IP: ...–
Ivo
~ Anonymní uživatel
93 příspěvků
9. 6. 2007   #16
-
0
-

ServerDlg.h
:



struct CPlayerInfo
{
CPlayerInfo( )
{
m_nClientId = -1;
m_szPlayerHandle[0] = '\0';
m_nKills = 0;
m_nScore = 0;
m_nLives = 0;
m_nRace = 0;
m_bController = 0;
m_timeOnServer.GetCurrentTime( );
}

CPlayerInfo( const CPlayerInfo &playerInfo )
{
CopyData( playerInfo );
}

CPlayerInfo &operator=( const CPlayerInfo &playerInfo )
{
CopyData( playerInfo );
return *this;
}

void CopyData( const CPlayerInfo &playerInfo )
{
m_nClientId = playerInfo.m_nClientId;
strcpy( m_szPlayerHandle, playerInfo.m_szPlayerHandle );
m_nKills = playerInfo.m_nKills;
m_nScore = playerInfo.m_nScore;
m_nLives = playerInfo.m_nLives;
m_nRace = playerInfo.m_nRace;
m_bController = playerInfo.m_bController;
m_timeOnServer = playerInfo.m_timeOnServer;
}

int m_nClientId;
char m_szPlayerHandle[30];
int m_nKills;
int m_nScore;
int m_nLives;
char m_nRace;
char m_bController;
CTime m_timeOnServer;
};



takhle v ypadaji definice tech flagu v H souboru,



a tady je vlakno AddClient tam se ten flag zaplni tim jmenem:


void CServerDlg::OnShellAddClient( istrstream &msg )
{
CPlayerInfo *pPlayerInfo;
int nClientId = 0;
WORD nKey;
CString sVal;

// Get the client id for the player.
msg >> nClientId;

// Make a key.
nKey = ( WORD )nClientId;

// Remove any old players that might be in the player list.
if( m_mapPlayerInfo_Shell.Lookup( nKey, ( void *& )pPlayerInfo ))
{
// Shouldn't happen.
ASSERT( FALSE );

m_mapPlayerInfo_Shell.RemoveKey( nKey );
delete pPlayerInfo;
pPlayerInfo = NULL;
}

// Create a new player.
pPlayerInfo = new CPlayerInfo;
if( !pPlayerInfo )
return;

// Read in the player info.
pPlayerInfo->m_nClientId = nClientId;

// Load the temporary player name.
sVal.LoadString( IDS_NEWPLAYER );
strcpy( pPlayerInfo->m_szPlayerHandle, sVal );

// Set our current time.
pPlayerInfo->m_timeOnServer = CTime::GetCurrentTime( );

// Put the player in the list.
m_mapPlayerInfo_Shell.SetAt( nKey, pPlayerInfo );

// Signal to updateui that the player info changed.
m_bPlayerUpdate_Shell = TRUE;

// check fake player
// m_IPController.CheckFakePlayer();

// Add this player to the total number of visitors.
m_nTotalPlayers++;

TRACE( "Adding player (%d).\n", nClientId );
}

Nahlásit jako SPAM
IP: ...–
Ivo
~ Anonymní uživatel
93 příspěvků
9. 6. 2007   #17
-
0
-

tak vsem mpoc dekuji za rady.. predelal jsem to a uz mi funguje pirdavani do banlistu podle ID:

OBJECT.LTO prikaz:

// -------------------------------------------------------------------- //

//
// BAN
//
// BAN PLAYER FROM CONSOLE
//
// -------------------------------------------------------------------- //
else if(!_strnicmp(szMsg, "ban", 3))
{
if(strlen(szMsg) > 4)
{
// Finds the next non-space character
char *szName = szMsg + 3;

// Get rid of leading spaces
while(*szName == ' ')
szName++;


// Find the named client
int nIndex = FindClient(atoi(szName));

if(nIndex != -1)
{

char szMsg[128];
sprintf(szMsg, "Client %s IPbanned." , m_ClientData[nIndex].m_Data.m_szName);
HMESSAGEWRITE hMessage = g_pLTServer->StartMessage(NULL, MID_MPMGR_MESSAGE);
hMessage->WriteDWord(-1);
hMessage->WriteString(szMsg);
g_pLTServer->EndMessage(hMessage);

int PlayerID;
PlayerID = ( int )g_pLTServer->GetClientID( m_ClientData[nIndex].m_hClient );
char szBuf[512];
ostrstream memStream( szBuf, sizeof( szBuf ));
memStream << (( BYTE )SERVERAPP_BANPLAYER ) << PlayerID << ends;
// Send to the server app.
g_pLTServer->SendToServerApp( szBuf, sizeof( szBuf ));




}

bCommandHandled = LTTRUE;
}
}




a v server aplikaci
funkce OnShellBanClient:


void CServerDlg::OnShellBanClient( istrstream &msg )

{
int nClientId;
CPlayerInfo *pPlayerInfo;
WORD nKey;

// Keep reading player updates until invalid clientid given.
while( 1 )
{
msg >> nClientId;
if( nClientId == -1 )
break;

// Make a key.
nKey = ( WORD )nClientId;

// Lookup clientid in known clients.
if( !m_mapPlayerInfo_Shell.Lookup( nKey, ( void *& )pPlayerInfo ))
{
// We don't have this client. Something's skrewy.
ASSERT( FALSE );
break;
}

FILE *fh = NULL;
fh=fopen(g_BanName,"a+");
if(fh)
{
fprintf(fh, "\n");
fprintf(fh, "* %s - BannedFromConsole",pPlayerInfo->m_szPlayerHandle);
fprintf(fh, "\n");
fprintf(fh, "%s",m_JoinData[nClientId-1].m_szIP);
fprintf(fh, "\n");
fclose(fh);
}
}

}





DIKY VSEM ZA POMOC A SNAHU POMOCT! =)

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Podobná vlákna

Co mam spatne ? — založil Kamil

CO je spatne? — založil Figa

Spatne CSS ? — založil aTTix

Co dělám špatně? — založil Chrasty

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý