new int-Array-Zugriffsproblem
-
Optimizer schrieb:
das stimmt vielleicht, aber wenn du in __int64 rechnest und 2mal hin und her castest,
Ein Mal!
Ich werde morgen oder so mal testen, was schneller geht. Hoffentlich antwortet auch einer auf meine Call Stack-Frage.
-
Mir fällt mal grad so auf: Ich hab das Problem schon eingegrenzt!
Das hab ich nicht bemerkt, weil ich zu verbissen nach dem Call Stack gesucht habe.
Ich hab den Fehler sogar schon oben kommentiert:
CME386 schrieb:
if(op[i]>1) // hier tritt der Fehler auf!
-
Ersetze
for(int i=0; i<number-1; ++i)
durch
for(int i=0; i<number-1; i++)
.
Bei deinem Statement wird die Schleifenvariable sofort inkrementiert, und nicht erst nach Durchlaufen der Schleife.
-
Dr. Schnuggles schrieb:
Bei deinem Statement wird die Schleifenvariable sofort inkrementiert, und nicht erst nach Durchlaufen der Schleife.
Bloedsinn
-
@Dr. Schneggles: Nicht nur das es Blödsinn ist: Der Fehler tritt schon beim ersten Schleifendurchlauf auf.
Hier hab ich jetzt mal den Call Stack kopiert:
Direkt vor der Zeile, in der der Fehler auftritt:
calc(int * 0x00491bd0, int * 0x00491f90, int 2) line 117 parse(std::basic_string<char,std::char_traits<char>,std::allocator<char> > {0x00491fd1 "1 2 3"}, std::basic_string<char,std::char_traits<char>,std::allocator<char> > {0x00490131 "6"}) line 142 + 17 bytes main() line 16 + 83 bytes mainCRTStartup() line 206 + 25 bytes KERNEL32! 77e614c7()
Nach dem Fehler:
strlen() line 78 std::char_traits<char>::length(const char * 0x00000000) line 192 + 33 bytes std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * 0x00000000) line 152 + 38 bytes std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(const char * 0x00000000, const std::allocator<char> & {...}) line 65 + 61 bytes add(int * 0x00491bd0, int * 0x00491bd4) line 79 + 14 bytes calc(int * 0x00491bd0, int * 0x00491f90, int 2) line 125 + 48 bytes parse(std::basic_string<char,std::char_traits<char>,std::allocator<char> > {0x00491fd1 "1 2 3"}, std::basic_string<char,std::char_traits<char>,std::allocator<char> > {0x00490131 "6"}) line 142 + 17 bytes main() line 16 + 83 bytes mainCRTStartup() line 206 + 25 bytes KERNEL32! 77e614c7()
-
Ich muss mich bei euch entschuldigen. Ich hab nämlich die falsche Zeile als fehlerhafte angegeben.
Dadurch, dass die Bedingung beim ersten Funktionsaufruf nie erfüllt ist, ich aber den Haltepunkt in den Block nach dem if gesetzt habe, ist direkt die Fehlermeldung gekommen.
Sie ist eigentlich in folgender Zeile:
cout << calc_op[op[i]](&part[i], &part[i+1]) << flush;
-
Ich habs:
Mein "return 0" hat er nicht geschluckt. Ich hab es durch 'return ""' ersetzt. Jetzt krieg ich zwar einen anderen Runtime-Error, aber den werde ich wohl alleine schaffen.
Trotzdem Danke für deine Hilfe, Optimizer.
-
Das return 0; in deinen Berechnungsfunktionen ist das Problem. Es wird der std::string(const char*)-Konstruktor aufgerufen. Der versucht, die Länge des "Strings" festzustellen, und ruft strlen mit einem Nullzeiger auf.
-
@MFK: Danke, dass du auch vorbeigeschaut hast.
@Optimizer: Das Vorzeichenproblem hab ich jetzt so gelöst:
int i=0; if((*a)<0) i+=1; if((*b)<0) i+=1; if((*a)+(*b)<0) i+=1; if(i%2) return "Zahl zu gross!";
int i=0; if(*a<0) i+=1; if(*b<0) i+=1; int j=0; if(*a<0) j+=1; if(*a-*b<0) j+=1; if(i%2 || *a>*b) { if(j%2) return "Zahl zu klein!"; } else { if(j%2==0) return "Zahl zu klein!"; }
-
Ähm ja, das ist auch ne Lösung.
Die würde ich aber fast besser kommentieren.