Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.10.2009, 12:17

mbstowcs.c debug assertion

hallo,

ich hab ein kleines problem. Ich rufe die send-Funktion der Winsockets Api auf, diese liefert mir aber folge Meldung:

Quellcode

1
2
3
4
5
6
Debug assertion failed
...
File: F:\dd\vctools\crt_bld\self_x86\crt\src\mbstowcs.c
Line: 69

Expression: s != NULL


s ist bei mir der Socket, den ich der send funktion übergebe. Es ist eigentlich normal das der Socket nicht NULL ist oder? Warum kommt dieser doofe Fehler?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

10.10.2009, 12:39

Zeigmal den Code.

3

10.10.2009, 12:53

die funktion sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void CClient::Update()
{
    if(strlen(sendbuffer) > 0 && strlen(sendbuffer) < 768)
    {
        send(s, sendbuffer, strlen(sendbuffer), 0);
        ZeroMemory(sendbuffer, 768);
    }
    else EngineLog.Log("Nothing to send", LOG_WARNING);
}


die klassen deklaration:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class DLL_EXPORT CClient : public CEngine
{
    public:

        void CreateConnection(char* ip, int port);
        void SendCommand(char* command, char* param1, char* param2, char* datapointer);
        void Update();
        bool GetLastCommand(char* command, char* param1, char* param2, char* datapointer, int commandsize, int param1size, int param2size, int datapointersize);


    private:

        WSADATA wsa;
        SOCKET s;
        SOCKADDR_IN addr;

        char buffer[768];
        char sendbuffer[768];

        HANDLE ThreadHandle;
        DWORD ThreadId;

        static DWORD WINAPI RecieveThread(LPVOID pParameter);
};

4

10.10.2009, 12:59

sicher, das s initialisiert wurde, bevor die funktion aufgerufen wird?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

10.10.2009, 13:17

Und an welcher Stelle ist die assertion?

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

6

10.10.2009, 14:29

Re: mbstowcs.c debug assertion

Zitat von »"newby"«


Quellcode

1
2
Debug assertion failed
Expression: s != NULL

s ist bei mir der Socket, den ich der send funktion übergebe. Es ist eigentlich normal das der Socket nicht NULL ist oder? Warum kommt dieser doofe Fehler?

Assertion heißt übersetzt behaupten oder vermuten.

D.h. s != NULL ist nicht der festgestellte Fehler, sondern die Behauptung die Send anstellt. Und diese Behauptung trifft nicht zu, also bekommst du den Fehler.

Folglich dürfte s == NULL sein, prüfe nochmal ob du das socket auch wirklich initialisert hast. Am besten mal mit dem Debugger dein Programm durchgehen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

10.10.2009, 15:26

Mal ne wilde Idee: du rufst irgendwo mbstowcs mit 0 für den Parameter _Source auf... :shock:

8

10.10.2009, 17:47

Re: mbstowcs.c debug assertion

Zitat von »"newby"«

Warum kommt dieser doofe Fehler?
Weil du doof programmiert hast.

Nein wirklich: Du kannst sehr froh sein, dass es Assertions gibt. Die sind nicht da, um dich zu nerven, sondern bewahren dich von übelsten Fehlern (undefiniertes Verhalten, das in 97% der Fälle gut geht zum Beispiel). Sie sorgen dafür, dass ein Fehler gleich erkannt wird und sich nicht erst viel später bemerkbar macht, wo er kaum noch nachvollzogen werden kann.

Aber wenn die Assertion ausgelöst wird, gelangst du normalerweise zur betreffenden Codestelle, eventuell musst du noch den richtigen Stapelrahmen auswählen. Überprüfe doch dort die lokalen Variablen und Parameter und verfolge den Fehler auf diese Weise zurück. Mit dem Debugger sollte das relativ schnell gehen.

9

11.10.2009, 12:57

juhu, ich hab den fehler gefunden :D der lag in einer ganz anderen dll in einem ganz anderen thread :shock: das problem war, dass ich dem thread einen zeiger auf ein objekt übergeben habe, dieser aber jetzt wohl keinen zugriff auf eine funktion der basis klasse hatte, sehr seltsam

vielen dank für eure bemühungen

Werbeanzeige