Programme laufen nicht bei allen

03/03/2008 - 11:24 von alfred schwarz | Report spam
Hallo,

Habe schon mehrmals denn Fall gehabt, das ich was in VS2005 Programmiert
habe und bei mir das Programm Funktioniert hat, aber bei anderen nicht und
diejenigen etwas àndern mussten, das es bei Ihnen funktioniert. Programmiere
in C.

Bsp.: Baue ein Menü mit Steuerpfeil (Steuerung mit Taste w: nach oben und s:
nach unten)

*Spiel Fortsetzen
Spiel Laden
Spiel Speichern

Mit diesem Pfeil(hier als Stern dargestellt) làst sich das Menü steuern.
Bei mir ist der Pfeil mit "#define ARROW 16" definiert und das Menü
funktioniert.
Bei meinem Freund aber stürzt das Programm ab wenn er eine Taste Drückt.
Wenn er es in "#define ARROW 50" àndert Funktioniert es bei Ihm, nur schaut
halt das Steuersymbol anders aus.

Kann mir wer sagen an was das liegt und wie ich diese Probleme lösen kann?

Wir Arbeiten in der Schule immer in einer Gruppe an Projekten zusammen und
wenn wir die Programme untereinander austauschen um daran weiter zu
Programmieren tauchen solche oder àhnliche Fehler immer wieder auf. Wie kann
man ein vernünftiges Programm Programmieren und gewàhrleisten das es überall
làuft?
Alle Projektmitglieder Benutzen VS2005. Zwei VISTA Premium, einer VISTA
Ultimate und einer XP Home. (glaube, das das eher egal ist mit dem
Betriebssystem)

MfG Alfred
 

Lesen sie die antworten

#1 Jochen Kalmbach [MVP]
03/03/2008 - 11:43 | Warnen spam
Hallo alfred!

Kann mir wer sagen an was das liegt und wie ich diese Probleme lösen kann?



Das Problem liegt vermutlich nicht daran, sondern an irgendeinem anderen
Problem in der Software (z.B. nicht initialisierter Speicher usw.).

Das "einfachste" ist bei einem Absturz einen MiniDump zu schreiben, denn
kannst Du dann bei Dir auf dem Rechner debuggen und dann siehst Du wo es
genau abstürzt.


Z.B. so:

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


typedef BOOL (__stdcall *tMDWD)(
IN HANDLE hProcess,
IN DWORD ProcessId,
IN HANDLE hFile,
IN MINIDUMP_TYPE DumpType,
IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
);
static HMODULE hdbghelpmod = NULL;
static tMDWD pMDWD;


static int WriteMiniDump(
LPCTSTR szFN,
struct _EXCEPTION_POINTERS *ep)
{
int ret = -1; // failed
HANDLE hFile;

if (hdbghelpmod == NULL)
hdbghelpmod = LoadLibrary(_T("dbghelp.dll"));
if (hdbghelpmod == NULL)
return ret;

if (pMDWD == NULL)
pMDWD = (tMDWD) GetProcAddress(hdbghelpmod, "MiniDumpWriteDump");
if (pMDWD == NULL)
return ret;



hFile = CreateFile(szFN,
GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);


if (hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION stMDEI;
stMDEI.ThreadId = GetCurrentThreadId();
stMDEI.ExceptionPointers = ep;
stMDEI.ClientPointers = TRUE;
// try to create an miniDump:
if (pMDWD(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal,
&stMDEI,
NULL,
NULL
) == FALSE)
{
_tprintf(_T("Minidump failed! 0x8.8X"), GetLastError());
OutputDebugString(_T("Minidump failed!"));
}
else
ret = 0; // suceeded
CloseHandle(hFile);
}
return ret;
}

static LONG __stdcall CrashHandlerExceptionFilter(
EXCEPTION_POINTERS* pExPtrs)
{
if (pExPtrs->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
{
static char MyStack[1024*128]; // be sure that we have enought
space...
// it assumes that DS and SS are the same!!! (this is the case for
Win32)
// change the stack only if the selectors are the same (this is the
case for Win32)
//__asm push offset MyStack[1024*128];
//__asm pop esp;
__asm mov eax,offset MyStack[1024*128];
__asm mov esp,eax;
}

WriteMiniDump(_T("minidump-file.dmp"), pExPtrs);
return EXCEPTION_CONTINUE_SEARCH;
}



int _tmain()
{
SetUnhandledExceptionFilter(CrashHandlerExceptionFilter);

char *szTest = (char*) 0x1;
strcpy(szTest, "Hello world"); // BANG...
}


Greetings
Jochen

Ähnliche fragen