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:52Expression: _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 = Windowssry...
-
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 wiedertemp
freigegeben werden? Oder habe ich vielleicht gerade ein Brett vorm Kopf?
-
Virokams schrieb:
Debug assertion failed!
Programm:...
dbgdel.ccp
Libe:52Expression: _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 wiedertemp
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 Zeigertemp
) kopiert. Anschliessend wird der alte Speicher vonterm
freigegeben. Zuletzt zeigtterm
auf den neuen Inhalt (vontemp
).
-
Nexus schrieb:
Mizar schrieb:
Sollte dort vor verlassen der
for
-Schleife nicht auch wiedertemp
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 Zeigertemp
) kopiert. Anschliessend wird der alte Speicher vonterm
freigegeben. Zuletzt zeigtterm
auf den neuen Inhalt (vontemp
).Ok, das habe ich jetzt verstanden :). Herrje, ich muss mich mal mehr mit
new
unddelete
und auch noch mehr mit Zeigern auseinandersetzen.
-
Nexus schrieb:
Virokams schrieb:
Debug assertion failed!
Programm:...
dbgdel.ccp
Libe:52Expression: _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 FellhuhnGruß