ThrowIfOutOfRange(idx) AnsiString
-
Hallo ich hoff mir kann man mir helfen komm einfach nicht weiter. Habe nach meinen Erkenntnissen schon alles mögliche probiert doch komme einfach nicht weiter.
Das hier ist mein Codeteil der mir Porbleme bereitet. Er soll einfach den AnsiString "Wort" zufällig sortieren. Das klappt auch problemlos aber nicht beliebig oft. d.h. nach dem 5 mal ausführen kommt bei mir eine fehlermeldung und ich fliege in die headerdatei dstring.h und dort zeigt er mir einen fehler bei:
char& __fastcall operator [](const int idx)
{
ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??
Unique(); // Ensure we're not ref-counted
return Data[idx-1];
}Ich benutze den C++Builder5 von Borland. Kann mir jemand vll helfen. Hab schon alles mögliche gegoogelt bin aber auf keinen grünen Zweig gekommen. thx

Mein Code:
srand( time( NULL ) );
Wort = "bla123";
str = "";for( int i = 0; i < anzahl; i++ )
{
str = str + Wort[rand() % Wort.Length()];
}
-
das ist aber nicht dein kompletter code.
was sind denn str und Wort für typen? std::string? dann passt Length aber nicht, sondern nur length. aber gesetzt dem fall, wäre das eigentlich soweit richtiger code...
-
Sind beide vom Typ AnsiString. Bzw String. der Fehler kommt bei beiden

-
Also wie gesagt der Code funktioniert aber je nach dem wie groß die variable "anzahl" ist flieg ich zu der dstring.h. Ist anzahl = 50 dann eg immer sofort bei. anzahl = 5 vll beim 5mal ausführen

-
Fremik schrieb:
Ich benutze den C++Builder5 von Borland. Kann mir jemand vll helfen. Hab schon alles mögliche gegoogelt bin aber auf keinen grünen Zweig gekommen. thx

Nimm bloß etwas anderes.
Anscheinend beginnt der Index-Operator bei 1 zu zählen (
return Data[idx-1];). *schauder* (das müssen Mathematiker verzapft haben)
Du verwendest ihn so als würde er bei 0 anfangen.
-
hm okay hab halt eg immer nur den benutzt und bin eg auch damit zurecht gekommen auch wenn er schon etwas alt ist
zuwas sollte man dann tendieren Visual C++ 2010 Express?
-
Also angenommen du entwickelst für Windows (gibt es Borland für eine andere Plattform? Keine Ahnung...)...
Meine erste Wahl wäre Visual Studio Express 2012. Gibt erst den Release Candidate, aber ganz lange kann die RTM nicht mehr auf sich warten lassen (der Name legt ja wohl nahe dass es noch 2012 kommen soll).
Wenn du nicht warten kannst, weil du z.B. noch heuer releasen musst, dann halt Visual Studio 2010. Der Umstieg auf 2012 sollte auch relativ schmerzlos sein wenns dann heraussen ist.
-
Borland Special zum Haareraufen:
Der Zugriff auf die Zeichen eines AnsiString sind 1-basiert, nicht wie in C/C++ üblich 0-basiert. Das heißt, deine Zugriffe müssen über das Intervall [1..size()] gehen. Wenn bei
[rand() % Wort.Length()zufällig 0 rauskommt gibt´s inoperator[]einen Unterlauf und deshalb wird eine Exception geworfen.PS:
Das soll wohl historische Gründe haben. Das VCL Framework ist in Delphi geschrieben, dessen Vorgänger Pascal die Stringlänge im Element 0 untergebracht hat.
-
Also danke schön an alle habs Regeln können
Ist jetzt warscheinlich noch unprofessioneller geworden aber es läuft 
int zufall;
for( int i = 0; i < numChars; i++ )
{
lable:zufall = rand()% Wort.Length();
if (zufall == 0)
{
goto lable;
}str = str+Wort[zufall];
}
und nochmal besonderes danke an DocShoe
-
da mache ich dir mal das hier draus...
int zufall; for( int i = 0; i < numChars; i++ ) { zufall = rand()% Wort.Length(); if (zufall == 0) { continue; } str = str+Wort[zufall]; }
-
OMG!
richtig:
zufall = (rand()% Wort.Length()) + 1;und kein if!
-
Unter Anbetracht des ersten Postings schlage ich das hier vor:
#include <System.hpp> #include <algorithm> int main() { AnsiString Wort = "Wort"; std::random_shuffle( &Wort[1], &Wort[1] + Wort.Length() ); }Edit:
Code fixed