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

09.10.2009, 00:47

Programmabsturz bei va_start | va_end | va_arg

Hallo,

ich habe in folgender Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void LogFile::WriteTopic ( unsigned int Size , unsigned int Parameter , ... )
{
    this->Write ( "<table align='center' cellspacing='0' cellpadding='0' width='100%' bgcolor='DFDFES'> <tr> <td align='center' valign='middle' > <font face = 'arial' size = '" ) ;
    this->Temporär << Size;
    this->Write (this->Temporär.str());
    this->Write ( "' > ");
    va_list Parameters ;
    std::string ParameterContent ;
    va_start ( Parameters , Parameter ) ;
    for ( unsigned int CurrentParameter = 0 ; CurrentParameter < Parameter ; CurrentParameter++ )
    {
        ParameterContent = va_arg ( Parameters , std::string );
        this->Write ( ParameterContent ) ;
    }
    va_end(Parameters);
    this->Write( "</font> </td> </tr> </table> </br>" ) ;
}


Das Problem das sie in dieser Form (Mit CurrentParameter < Parameter ) ein .Exe Error verursacht und folgendes in der Konsole ausgibt:

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

Ich frage mich wieso das passiert. Wenn ich anstatt (CurrentParameter < Parameter) nämlich (CurrentParameter == Parameter) benutze, kommt kein Fehler, es funktioniert aber auch nicht wie gewünscht. Ich hoffe mir kann jemand helfen.


Edit: Ich habe herrausgefunden dass das Problem nicht bei der for schleife liegt sondern zwischen "va_start ( Parameters , Parameter ) ; " und "va_end(Parameters); " liegen muss.
Ich finde trotzdem nicht den Fehler.

MfG
Tarliotama

2

09.10.2009, 08:23

bist du dir sicher, das du auch std::strings übergeben hast, und nciht zum Beispiel c-strings?

3

09.10.2009, 12:56

In der Main.cpp sieht es momentan so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
int main()
{
    LogFile LogFile;
    LogFile.OpenLogFile("TestLog.html");
    LogFile.WriteTopic(6, 1, "TESTLOL");
    return 0;
}


Die Funktion verlangt auch einen std::string.

Hmm, wenn ich den String mit std::string erstelle und dann den String übergebe funktioniert es :shock: .
Vielen dank für die Hilfe. Kann mir vielleicht jemand erklären wieso es so funktioniert? Wieso zählt "TESTLOL" nicht als std::string? Gibt es eine andere Möglichkeit es in eine Zeile zu fassen ohne extra einen String zu erstellen?
Nochmals danke für die Hilfe

MfG
Tarliotama

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

09.10.2009, 13:01

"TESTLOL" ist auch kein std::string. Wenn dann std::string("TESTLOL"). Trozdem wär ich mir jetzt mal absolut nicht sicher ob du einfach so nen std::string über eine va_list übergeben kannst...

5

09.10.2009, 13:10

Hmm, so funktioniert es auf jedenfall :D

C-/C++-Quelltext

1
2
3
4
5
6
7
int main()
{
    LogFile LogFile;
    LogFile.OpenLogFile("TestLog.html");
    LogFile.WriteTopic(6, 3, std::string("1"), std::string("2"), std::string("3"));
    return 0;
}


Danke für die Hilfe.

6

09.10.2009, 13:44

Du solltest in C++ besser keine variable Argumentlisten verwenden. Diese sind nämlich nicht typsicher, können nur mit PODs arbeiten (also nicht sinnvoll mit std::string!) und verursachen leicht Speicherverletzungen. Wenn es bei dir also jetzt funktioniert, kann es leicht sein, dass sich das plötzlich wieder ändert (undefined behaviour).

Nimm lieber was Objektorientiertes, wie zum Beispiel einen überladenen operator<< oder operator().

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

09.10.2009, 15:49

das problem ist, dass du bei va's keinerlei typeinfo hast.
der kompiler muss dein argument irgentwie übergeben. und da nimmt
er halt den statischen typ. es wird weder von lonlong zu int konvertiert,
noch von const char * zu std::string. woher soll der kompiler auch wissen,
dass du einen std::sring erwartest?

versuch mal einen std::string an printf zu übergeben ;)

du kannst entweder einen vector von strings übergeben, oder
dir mit den << operatoren eine streamfunktionalität bauen.

letzeres wäre der sauberste weg.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Werbeanzeige