Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
C/C++ code ist zu langsam
#1
Code:
CLottospiel::euroj CLottospiel::ConvertToEuroj(std::string _sCSV)
{
    char del_sm[]=";";
    char del_p[]=".";
    char *hackestr1, *pop=NULL;
    char datum[11], *datum_hack;
    euroj ldaten;
    
    hackestr1=strtok_s((char*)_sCSV.c_str(), del_sm, &pop);
    unsigned int p=0;
    while (hackestr1!=NULL)
    {
        if (0==p)
        {
            //ldaten.Zusatzzahl=-1;
            //ldaten.Superzahl=-1;
            ldaten.Spieleinsatz=0.0;
            for (unsigned i=0; i<12; i++)
            {
                ldaten.Gewinner[i]=1;
                ldaten.Quote[i]=0.0;
            }
            /*
            int z=atoi(hackestr1);
            ldaten.tag=z/1000000;
            ldaten.monat=(z/10000)%100;
            ldaten.jahr=z%10000;
            */
            strcpy_s(datum, 11, hackestr1);
        }
        /*
        else if (1==p)
        {
            strcpy_s(ldaten.wochentag, 15, hackestr1);
        }
        */
        else if (p>=1 && p<=5)
        {
            ASSERT(0!=atoi(hackestr1));

            ldaten.zahlen[p-1]=atoi(hackestr1);
        }
        else if (6==p || 7==p)
        {
            ASSERT(0!=atoi(hackestr1));

            ldaten.Eurozahlen[p-6]=atoi(hackestr1);        
        }
        else if (8==p)
        {
            ASSERT(0.0!=atof(hackestr1));

            ldaten.Spieleinsatz=atof(hackestr1);
        }
        else if (p>=9 && p<=32)
        {
            if (1==p%2)
            {
                ldaten.Gewinner[(p-9)/2]=atoi(hackestr1);
            }
            else
            {
                ldaten.Quote[(p-10)/2]=atof(hackestr1);
            }
        }
        hackestr1=strtok_s(NULL, del_sm, &pop);

        p++;
    }

    ASSERT(33==p);

    double summe_auszahlung=0.0;
    unsigned int summe_gewinner=0;

    for (unsigned i=0; i<12; i++)
    {
        summe_auszahlung += ldaten.Gewinner[i] * ldaten.Quote[i];
        summe_gewinner += ldaten.Gewinner[i];
    }
    ldaten.bewertung_auszahlung = summe_auszahlung / summe_gewinner;
    ldaten.bewertung_einzahlung = ldaten.Spieleinsatz / summe_gewinner;

    datum_hack=strtok_s(datum, del_p, &pop);

    p=0;
    while (datum_hack!=NULL)
    {
        //ASSERT(0!=atoi(datum_hack));
        switch (p)
        {        
        case 0: ldaten.tag=atoi(datum_hack); break;
        case 1: ldaten.monat=atoi(datum_hack); break;
        case 2: ldaten.jahr=atoi(datum_hack); break;
        }

        datum_hack=strtok_s(NULL, del_p, &pop);

        p++;
    }
    return ldaten;
}
Mein C-code ist zu langsam. Kann man das auch in C++ code schreiben?
Spiele in einer Annahmestelle! Lotto
Zitieren

#2
Das ist doch C++-Code, allerdings mit C-ähnlichen Elementen,wie char*, strtok_s, atoi, atof, die nicht dem aktuellen C++-Stil entsprechen. Aktueller und sicherer z. B. mit std::stringstream, std::vector, std::stoi, std::stod, std::getline und ohne manuelle Speicheroperationen:

Code:
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
#include <iomanip>

struct euroj {
    int tag, monat, jahr;
    int zahlen[5];
    int Eurozahlen[2];
    double Spieleinsatz;
    int Gewinner[12];
    double Quote[12];
    double bewertung_auszahlung;
    double bewertung_einzahlung;
};

class CLottospiel {
public:
    euroj ConvertToEuroj(const std::string& _sCSV);
};

euroj CLottospiel::ConvertToEuroj(const std::string& _sCSV) {
    euroj ldaten{};
    std::stringstream ss(_sCSV);
    std::string token;
    std::vector<std::string> fields;

    // Zerlege CSV anhand von ';'
    while (std::getline(ss, token, ';')) {
        fields.push_back(token);
    }

    if (fields.size() != 33) {
        throw std::runtime_error("Unerwartete Anzahl an CSV-Feldern");
    }

    // Datum (z.B. "30.04.2025")
    std::stringstream dss(fields[0]);
    std::string dpart;
    std::getline(dss, dpart, '.'); ldaten.tag = std::stoi(dpart);
    std::getline(dss, dpart, '.'); ldaten.monat = std::stoi(dpart);
    std::getline(dss, dpart, '.'); ldaten.jahr = std::stoi(dpart);

    // Hauptzahlen
    for (int i = 0; i < 5; ++i) {
        ldaten.zahlen[i] = std::stoi(fields[1 + i]);
    }

    // Eurozahlen
    ldaten.Eurozahlen[0] = std::stoi(fields[6]);
    ldaten.Eurozahlen[1] = std::stoi(fields[7]);

    // Spieleinsatz
    ldaten.Spieleinsatz = std::stod(fields[8]);

    // Gewinner und Quoten
    for (int i = 0; i < 12; ++i) {
        ldaten.Gewinner[i] = std::stoi(fields[9 + i * 2]);
        ldaten.Quote[i] = std::stod(fields[10 + i * 2]);
    }

    // Bewertung berechnen
    double summe_auszahlung = 0.0;
    unsigned int summe_gewinner = 0;

    for (int i = 0; i < 12; ++i) {
        summe_auszahlung += ldaten.Gewinner[i] * ldaten.Quote[i];
        summe_gewinner += ldaten.Gewinner[i];
    }

    if (summe_gewinner > 0) {
        ldaten.bewertung_auszahlung = summe_auszahlung / summe_gewinner;
        ldaten.bewertung_einzahlung = ldaten.Spieleinsatz / summe_gewinner;
    } else {
        ldaten.bewertung_auszahlung = 0.0;
        ldaten.bewertung_einzahlung = 0.0;
    }

    return ldaten;
}
Es ist nie zu spät für eine glückliche Kindheit!
Meine freeware Toto13Tool, Toto45Tool, Zufall 2.0
Zitieren

#3
Danke, aber leider funktioniert dein code nicht mit Visual Studio 2005!
Die Angaben zu Auszahlung/Gewinner müssten jetzt stimmen!
16,43€ pro Gewinner beim Euro Jackpot.

   
Spiele in einer Annahmestelle! Lotto
Zitieren

#4
(03.05.2025, 11:29)nobbot schrieb: Danke, aber leider funktioniert dein code nicht mit Visual Studio 2005!
...

Kein Wunder, der Code ist aktuell, Deine Programmierumgebung hingegen ist knapp 20 Jahre alt. Die Info wäre vorher wichtig gewesen.
Es ist nie zu spät für eine glückliche Kindheit!
Meine freeware Toto13Tool, Toto45Tool, Zufall 2.0
Zitieren

#5
Ich habe leider nur Visual Studio 2005, das auf Windows XP läuft.
Die entwickelten Programme laufen trotzdem auf Windows 10. Ich habe kein Geld für neuere Software.

Code:
void CLottospiel::ConvertCSV(unsigned int &_nDay, unsigned int &_nMonth, unsigned int &_nYear, unsigned int _nGameType, unsigned int _anzahl)
{
    lotto spieldaten;
    euroj euroj;
    keno keno;
    
    if (0==_anzahl || _anzahl > m_vString.size())
    {
        _anzahl=m_vString.size();
    }

    for (std::vector<std::string>::iterator it=m_vString.begin(); it!=m_vString.begin()+_anzahl; ++it)
    {
        if (LOTTO==_nGameType)
        {
            spieldaten=ConvertToLotto(*it);
            m_vLotto.push_back(spieldaten);
        }
Wenn ich nur die 30 neuesten Datensätze lade ist die Geschwindigkeit gut. Ich benötige nicht alle Lotto-Datensätze.
_anzahl ist die Anzahl der Datensätze.
Spiele in einer Annahmestelle! Lotto
Zitieren

#6
Wenn du ein bisschen PC- und programmier-erfahren bist, könntest du auch versuchen, kostenloses Java-Developer-Kit (JDK) herunterzuladen.

Es gibt auch einige gute kostenlose Editoren, die dir den Text gleich hübsch und farbig gut lesbar machen. Java ist so verbreitet, das können eigentlich alle.

Wenn du nach Empfehlungen googelst: von Chip und Heise kann ich als verlässlich empfehlen.

Dann gehst du auf die Suchmaschine https://duckduckgo.com. Rechts oben ist Chat-GPT ohne Anmeldung.

Kannst schreiben:
Ich habe einen Code in Visual Studio 2005 geschrieben. Kannst du mir den in Java, Version xyz umschreiben?
Der Code lautet:
….

Es ist aber hilfreich, den Code grob zu verstehen. Sonst kannst du auch weiter nachfragen, wenn dir was unklar ist oder meckern, das du der Ansicht bist, da und da funktioniert was nicht etc pp.

Um zu sehen, ob das was für dich ist, kannst du vorher auch ChatGPT löchern. Wo sind Unterschiede, ist die Umstellung schwierig, kannst du mir mal Beispiel-Code zeigen. Oder lass dir deinen Code vorher mal in Java übersetzen, ob es für dich passen könnte.
Zitieren



Gehe zu:


Benutzer, die gerade dieses Thema anschauen:
1 Gast/Gäste

Deutsche Übersetzung: MyBB.de, Powered by MyBB 1.8.36, © 2002-2025 Melroy van den Berg.