Wenn kein Operator vor (



  • hab das jetzt mal so eingefügt... ausser das ich std:: vor dem isdigit wegmachen musste liefs dann... ABER ZACK sobald ich 2(2+2) zum Testen eingebe kommt error.

    und zwar das angeblich irgendiwe der Hipe probleme kriegt oder so.
    kann jetzt keinen Screen machen.

    aber es ist keine Fehlermeldung in der Fehlerliste sondern so ein Windoof Kritikal Error oder so... total wirsch...

    ne ahnung?



  • Virokams schrieb:

    hab das jetzt mal so eingefügt... ausser das ich std:: vor dem isdigit wegmachen musste liefs dann... ABER ZACK sobald ich 2(2+2) zum Testen eingebe kommt error.

    und zwar das angeblich irgendiwe der Hipe probleme kriegt oder so.
    kann jetzt keinen Screen machen.

    aber es ist keine Fehlermeldung in der Fehlerliste sondern so ein Windoof Kritikal Error oder so... total wirsch...

    ne ahnung?

    Alles was hier wirsch ist, ist deine Fehlerbeschreibung.
    Was soll der Hipe sein? Was ist Windoof? Und was soll ein Kritikal Error sein?



  • Ahnung? Ja: char-Arrays. 😉
    Da wird wohl irgendwas mit der Allokierung und/oder Freigabe im Argen liegen.



  • Debug assertion failed!

    Programm:...
    dbgdel.ccp
    Libe:52

    Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

    so ich drücke retry

    Das Programm hat einen Haltepunkt ausgelöst

    ich kann damit garnichts anfangen.

    Hipe ist doch der "kleine" Speicher wo Stacks oder locale Variablen gesp. werden
    Windoof = Windows

    sry...



  • nochwas:

    wenn ich schritt für schritt durchgehe

    sobald ich diese Befehlszeile verlasse:

    delete[] term; // term wieder freigeben

    kommt der Fehler

    also bei:

    term = temp; // term zeigt jetzt auf den neu angeforderten speicher

    SO die Lösung des Problems ist also:

    Auskommentieren von: //delete[] term; // term wieder freigeben

    for(int i = 0; i < strlen(term)-1; i++) // du willst bis zum vorletzten Element
      {
        if (isdigit(term[i]) && term[i+1] == '(')
        {
            // jetzt hast du das Problem das du term theoretisch um 1 byte vergrößern musst.
            // ich gehe mal davon aus das term vom Typ char* ist.
          char * temp = new char[strlen(term)+2]; // neuer platz
        strncpy (temp, term, i+1); // alle zeichen bis zum neuen * kopieren
            temp[i+1] = '*'; // * einfügen
        strncpy (temp+i+2, term + i + 1, strlen(term)-i+1);
            //delete[] term; // term wieder freigeben
            term = temp; // term zeigt jetzt auf den neu angeforderten speicher
        }
      }
    

    Danke 🙂

    Nur eins noch:

    char * temp = new char[strlen(term)+2]; // neuer platz

    was macht das ... versteh ich nicht 😃

    kann mir bestimmt jemand erläutern...

    Danke Danke Danke 🙂



  • char * temp = new char[strlen(term)+2]; // neuer platz

    Dynamische Anforderung von der Länge von term + 2 und temp auf den Anfang des C-Stringes zeigen lassen.



  • Hm, zeig mal die Initialisierung von term.

    Mit new wird neuer Speicher angefordert und mit delete wird er wieder gelöscht. Läßt du das delete weg hast du ein klassisches Speicherleck.



  • Fellhuhn schrieb:

    Hm, zeig mal die Initialisierung von term.

    Mit new wird neuer Speicher angefordert und mit delete wird er wieder gelöscht. Läßt du das delete weg hast du ein klassisches Speicherleck.

    int main()
    {
    char term[1024];

    double berechne (const char * term)
    {}

    ???

    Ich habe dir mal peer Mail den kompletten Code geschickt... vielleicht ist es dann ersichtlicher WIE ich vorgehe... und vielleicht siehste dann besser den Fehler (obwohl es funktioniert 😮 😕 )



  • for(int i = 0; i < strlen(term)-1; i++) // du willst bis zum vorletzten Element
      {
        if (std::isdigit(term[i]) && term[i+1] == '(')
        {
            // jetzt hast du das Problem das du term theoretisch um 1 byte vergrößern musst.
            // ich gehe mal davon aus das term vom Typ char* ist.
            char *temp = new char[strlen(term)+2]; // neuer platz
            strncpy (temp, term, i+1); // alle zeichen bis zum neuen * kopieren
            temp[i+1] = '*'; // * einfügen
            strncpy (temp+i+2, term + i + 1, strlen(term)-i+1);
            delete[] term; // term wieder freigeben
            term = temp; // term zeigt jetzt auf den neu angeforderten speicher
        } 
      }
    

    Entschuldigt bitte das ich mich hier mal mit reinhänge, aber irgendwie verstehe ich die oberen Zeilen nicht so ganz. Sollte dort vor verlassen der for -Schleife nicht auch wieder temp freigegeben werden? Oder habe ich vielleicht gerade ein Brett vorm Kopf? 😞



  • Virokams schrieb:

    Debug assertion failed!

    Programm:...
    dbgdel.ccp
    Libe:52

    Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

    Daran wirst du dich gewöhnen müssen, wenn du es mit char* und deinem Gefrickel durchziehen willst. Du solltest einfach wissen, dass es einfacher geht. 😉

    Mizar schrieb:

    Sollte dort vor verlassen der for -Schleife nicht auch wieder temp freigegeben werden? Oder habe ich vielleicht gerade ein Brett vorm Kopf? 😞

    Nein, der von der alten Variable term referenzierte Speicherbereich wird ja in den neu angelegten Bereich (vom Zeiger temp ) kopiert. Anschliessend wird der alte Speicher von term freigegeben. Zuletzt zeigt term auf den neuen Inhalt (von temp ).



  • Nexus schrieb:

    Mizar schrieb:

    Sollte dort vor verlassen der for -Schleife nicht auch wieder temp freigegeben werden? Oder habe ich vielleicht gerade ein Brett vorm Kopf? 😞

    Nein, der von der alten Variable term referenzierte Speicherbereich wird ja in den neu angelegten Bereich (vom Zeiger temp ) kopiert. Anschliessend wird der alte Speicher von term freigegeben. Zuletzt zeigt term auf den neuen Inhalt (von temp ).

    Ok, das habe ich jetzt verstanden :). Herrje, ich muss mich mal mehr mit new und delete und auch noch mehr mit Zeigern auseinandersetzen.



  • Nexus schrieb:

    Virokams schrieb:

    Debug assertion failed!

    Programm:...
    dbgdel.ccp
    Libe:52

    Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

    Daran wirst du dich gewöhnen müssen, wenn du es mit char* und deinem Gefrickel durchziehen willst. Du solltest einfach wissen, dass es einfacher geht. 😉

    Ich weiß das es einfacher geht. es ist ja sozusagen mein erstes Programm... meine ersten schritte und ich soll es so machen (Anweisung von oben) um zu üben ...

    beim nächstenmal geh ich bestimmt mal anders an die Sache 😉

    Aber danke für die Hilfe zu diesem Thema super Forum 😉
    Danke Fellhuhn 😉

    Gruß


Anmelden zum Antworten