Toon posts:

[C++] Range check error

Pagina: 1
Acties:
  • 316 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een functie gemaakt die een string (een AnsiString om precies te zijn) controleerd op een &, @, : en een spatie. Als één of meerdere van deze karakters voorkomen in de string moeten ze worden vooraf gegaan door een '\'.

Ik krijg een foutmelding op de plaats waar ik met de index operator, [], werk. Daar krijg ik terug, Range check error. Ik heb het vermoeden dat ie om een of andere reden uit zijn range gaat dus dat ik deze constructie waarschijnlijk niet met een AnsiString kan gebruiken.

Ik heb op goolge niet veel bruikbaars gevonden, dus daarom post ik deze vraag nu hier.

Dit is trouwens de functie:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
AnsiString CheckInterfaceDescription(AnsiString Desc)
{
  int i=0;
  int lengte=Desc.Length();

  while (i<lengte)
  {
    if (Desc[i]=='&'||Desc[i]==':'||Desc[i]=='@'||Desc[i]==' ')
    {
      Desc.Insert('\\', i);
      lengte=Desc.Length();
      i++;
    }
  }
  return Desc;
}

[ Voor 0% gewijzigd door Verwijderd op 15-10-2002 16:12 . Reden: foutje in m'n functie ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:21
Heb je dat stukje al eens gedebugged?
Wanneer geeft hij precies die out-of-range exception?

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

afgezien van die fout, je increment i alleen als de char matcht
bovendien moet je rekening houden dat als je een char insert dat je dan m extra moet incrementen, anders blijft ie de hele tijd hetzelfde character controleren en krijg je dus een infinite loop tot je geheugen op is

De lengte moet je natuurlijk ook incrementen na een insert

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

bij een ansistring staat op de 0-de pos de len van de string. . . . en er staat GEEN 0 achteraan de string ..

:)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 15 oktober 2002 @ 16:26:
bij een ansistring staat op de 0-de pos de len van de string. . . . en er staat GEEN 0 achteraan de string ..

:)


waar staat dan dat ie daar vanuit gaat?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:21
.oisyn schreef op 15 oktober 2002 @ 16:27:
[nohtml]
[...]
[/nohtml]

waar staat dan dat ie daar vanuit gaat?


Hij begint vanaf het 0-de item in z'n string. Als op element[0] idd de lengte staat, dan moet hij vanaf element 1 beginnen toch?

https://fgheysels.github.io/


Verwijderd

Verwijderd schreef op 15 oktober 2002 @ 16:26:
bij een ansistring staat op de 0-de pos de len van de string. . . . en er staat GEEN 0 achteraan de string ..

:)
Alweer een reden om standaard features (std::string) te gebruiken en geen homegrown Borland/MS meuk. Vooral als ook nog eens blijkt dat die ansistrings aan range-checking doen, dat is volledig tegen de ontwerpfilosofie van C++...

Verwijderd

Topicstarter
Heb je dat stukje al eens gedebugged?
Wanneer geeft hij precies die out-of-range exception?
Hij geeft niet out-of-range exception, alleen Range check error.

En op deze regel stopt ie.
C++:
1
if (Desc[i]=='&'||Desc[i]==':'||Desc[i]=='@'||Desc[i]==' ')

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:21
Verwijderd schreef op 15 oktober 2002 @ 16:36:
[...]

Hij geeft niet out-of-range exception, alleen Range check error.

En op deze regel stopt ie.
C++:
1
if (Desc[i]=='&'||Desc[i]==':'||Desc[i]=='@'||Desc[i]==' ')


Begint een ansistring dan wel te 'subscripten' vanaf 0 en niet vanaf 1 ?

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 15 oktober 2002 @ 16:35:
Vooral als ook nog eens blijkt dat die ansistrings aan range-checking doen, dat is volledig tegen de ontwerpfilosofie van C++...


sorry, maar dat is echt onzin
Waarom zou een class geen rangechecks mogen doen om bugs eruit te halen?
(Ik ben het met je eens dat je dit uit zou moeten kunnen zetten, dus alleen die error bij debug builds oid)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Het was dus inderdaad het dat een AnsiString vanaf 1 begint te tellen. Wie heeft dat bedacht?? ik heb altijd geleerd vanaf 0 te tellen.

Verwijderd

Verwijderd schreef op 15 oktober 2002 @ 16:56:
Het was dus inderdaad het dat een AnsiString vanaf 1 begint te tellen. Wie heeft dat bedacht?? ik heb altijd geleerd vanaf 0 te tellen.
Wie dat bedacht heeft weet niemand. Als het nu in elk geval 1 of 0 zou zijn was het tenminste altijd duidelijk! :(

Verwijderd

.oisyn schreef op 15 oktober 2002 @ 16:43:
sorry, maar dat is echt onzin
Waarom zou een class geen rangechecks mogen doen om bugs eruit te halen?
(Ik ben het met je eens dat je dit uit zou moeten kunnen zetten, dus alleen die error bij debug builds oid)
Omdat een out-of-range een error is die nooit in een werkende app kan voorkomen. Dit komt dus neer op het gooien van een exception voor een bug en niet voor een runtime error, en dat is volledig tegen de ontwerpfilosofie van C++: je maakt je applicatie traag voor iets dat niet mag voorkomen.

Ff een mogelijke oplossing met std::string:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
const char ESCAPES[]= "&@: ";

void escape_string(std::string& str)
{
        std::string::size_type pos= 0;
        std::string::size_type at= str.find_first_of(ESCAPES, pos);
        while(at != std::string::npos) {
                str.insert(at, 1, '\\');
                pos= at + 2;
                at= str.find_first_of(ESCAPES, pos);
        }
}

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 15 oktober 2002 @ 17:03:
[...]


Wie dat bedacht heeft weet niemand. Als het nu in elk geval 1 of 0 zou zijn was het tenminste altijd duidelijk! :(
Sinds wanneer heet ik niemand?? ;)

De string en ansistring typen van Borland beginnen allebij bij 1 te tellen. Dit komt omdat de string (en later ook de ansistring) overblijfselen zijn van (Object) Pascal. Gebruik de std::string om dit soort ongein te voorkomen. De string en ansistring zijn er alleen om compatible te blijven met de VCL. (die geschreven is in Object Pascal / Delphi)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 15 oktober 2002 @ 17:08:
[...]

Omdat een out-of-range een error is die nooit in een werkende app kan voorkomen. Dit komt dus neer op het gooien van een exception voor een bug en niet voor een runtime error, en dat is volledig tegen de ontwerpfilosofie van C++: je maakt je applicatie traag voor iets dat niet mag voorkomen.


vandaar dat ik zei dat je ze uit zou moeten kunnen zetten, maar ik ga ervan uit dat de TS in debugbuild zit, en daar is het imho volledig legitiem om checks uit te voeren

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 15 oktober 2002 @ 17:19:
vandaar dat ik zei dat je ze uit zou moeten kunnen zetten, maar ik ga ervan uit dat de TS in debugbuild zit, en daar is het imho volledig legitiem om checks uit te voeren
:) Heb je er wel eens bij stilgestaan dat je dan je hele try- en catch- constructs óók zou moeten uitzetten (#ifdeffen) in een release build? Als een object een exception gooit dan moet het dat (theoretisch) zowel in een debug- als in een release-build doen, anders verandert de functionaliteit van dat object.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 15 oktober 2002 @ 17:28:
[...]

:) Heb je er wel eens bij stilgestaan dat je dan je hele try- en catch- constructs óók zou moeten uitzetten (#ifdeffen) in een release build? Als een object een exception gooit dan moet het dat (theoretisch) zowel in een debug- als in een release-build doen, anders verandert de functionaliteit van dat object.


hoezo? mijn debugger is volledig in staat om een exception af te vangen zonder dat ik er een try-catch omheen heb staan. Bovendien, wie zegt dat de TS een exception krijgt en niet gewoon een debug error message? (van een assert bijvoorbeeld)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 15 oktober 2002 @ 17:34:
hoezo? mijn debugger is volledig in staat om een exception af te vangen zonder dat ik er een try-catch omheen heb staan.
Wat is het nut van een exception gooien die je vervolgens niet vangt? Ga er dan meteen uit met een std::perror("Major programmer fuckup") en een std::exit(1). ;)
Bovendien, wie zegt dat de TS een exception krijgt en niet gewoon een debug error message? (van een assert bijvoorbeeld)
Geen idee, als het asserts zijn verandert dat natuurlijk de zaak :+

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

[nohtml]
Verwijderd schreef op 15 oktober 2002 @ 17:42:
[...]

Wat is het nut van een exception gooien die je vervolgens niet vangt? Ga er dan meteen uit met een std::perror("Major programmer fuckup") en een std::exit(1). ;)
ik heb liever dat mijn debugger breakt op een bepaald punt met de melding "hier wordt een exception gegooid" dan dat het programma gewoon sluit zonder dat ik weet waarom :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 15 oktober 2002 @ 16:26:
bij een ansistring staat op de 0-de pos de len van de string. . . . en er staat GEEN 0 achteraan de string ..
:)
Tering, 20 posts en nog steeds geen antwoord voor die jongen... zal ik dan maar ff?

Op de 0e byte van AnsiString staat wel degelijk data, namelijk het eerste karakter van de string, en AnsiStrings hebben echt wel een trailing null-byte (geen idee waar je dit vandaan haalt). De implementatie van de index operator echter is als volgt in dstring.h:
C++:
1
2
3
4
5
6
7
    // Accessing character at specified index

    char __fastcall operator [](const int idx) const
    {
      ThrowIfOutOfRange(idx);   // Should Range-checking be optional to avoid overhead ??
      return Data[idx-1];
    }

Daar dit een inline functie is moet Knien dit overigens in z'n debugger hebben zien gebeuren (heb je uberhaupt wel naar de callstack gekeken?) ThrowIfOutOfRange gooit simpelweg de EOutOfRange knaller als idx 0 of lager is of groter dan de lengte van de string, en daarna wordt er expliciet 1 van afgetrokken om de 'goede' plek in de buffer tbv. Pascal-compatibility te geven.

Als afsluiter wil ik nog even de helpfiles citeren wat betreft AnsiString, method operator[]:
Returns the character at a specified index in the string.
C++:
1
char& __fastcall operator [](const int idx);


Description

This operator returns the character in the string at index value idx. The [] operator assumes a base index of 1. For example, given the string “Hello” and an index value of 2, the character returned would be ‘e’.
Ergo, volgende keer echt beter de help lezen Knien, net als je vorige 10 topics: dit had je wederom makkelijk kunnen vinden met wat moeite. Kun je de volgende keer ook BCB in je topictitle zetten ipv C++, dit was geen C++-vraag.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

curry684 schreef op 15 oktober 2002 @ 23:53:
volgende keer echt beter de help lezen Knien, net als je vorige 10 topics: dit had je wederom makkelijk kunnen vinden met wat moeite. Kun je de volgende keer ook BCB in je topictitle zetten ipv C++, dit was geen C++-vraag.
Ter onderbouwing nodig ik iedereen uit even hier te checken hoeveel topics die jongen per week opent. Je kunt best een keer hier en daar vast zitten maar dit riekt wel erg hard naar absoluut niet proberen.

Geinig detail trouwens: ik zie op die lijst enkel gaten tijdens de zomervakantie en andere vakantieperiodes... ruik ik hier GoT-HuiswerkHulp-neigingen? :Z

Geen probleem mee, maar dan ga ik wel 100 euro/uur rekenen :Y)

[ Voor 0% gewijzigd door curry684 op 15-10-2002 23:57 . Reden: addition ]

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:21
curry684 schreef op 15 oktober 2002 @ 23:53:
[...]

Tering, 20 posts en nog steeds geen antwoord voor die jongen... zal ik dan maar ff?

Op de 0e byte van AnsiString staat wel degelijk data, namelijk het eerste karakter van de string, en AnsiStrings hebben echt wel een trailing null-byte (geen idee waar je dit vandaan haalt). De implementatie van de index operator echter is als volgt in dstring.h:
Ik dacht dat hij reeds postte dat hij het werkend had gekregen en dat het eerste element van de ansistring op positie 1 staat en niet op 0 ?

knien001:
Het was dus inderdaad het dat een AnsiString vanaf 1 begint te tellen. Wie heeft dat bedacht?? ik heb altijd geleerd vanaf 0 te tellen.

* whoami heeft hier geen BCB of Delphi en kan het dus nu niet even testen.
Ergo, volgende keer echt beter de help lezen Knien, net als je vorige 10 topics: dit had je wederom makkelijk kunnen vinden met wat moeite. Kun je de volgende keer ook BCB in je topictitle zetten ipv C++, dit was geen C++-vraag.

* whoami agrees.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ter onderbouwing nodig ik iedereen uit even hier te checken hoeveel topics die jongen per week opent. Je kunt best een keer hier en daar vast zitten maar dit riekt wel erg hard naar absoluut niet proberen.

Geinig detail trouwens: ik zie op die lijst enkel gaten tijdens de zomervakantie en andere vakantieperiodes... ruik ik hier GoT-HuiswerkHulp-neigingen? :Z

Geen probleem mee, maar dan ga ik wel 100 euro/uur rekenen :Y)
Je hoeft niet bang te zijn dat je mij met huiswerk help, want ik zit niet meer op school. En inderdaad heb ik iedere week wel vragen. Maar het is niet dat ik niet zelf op onderzoek uitga. Ik ben nu eenmaal een beginnend C++'er met wat verouderde middelen (borland builder 3 met een zeer beknopte help die in nieuwere versie beter is).

Mijn vragen zijn soms eenvoudig en dat zie ik zelf ook als eer een heel eenvoudig andwoord op komt. Maar ik vind dit gewoon een hele fijne plaats om vragen te stellen en andere topics te lezen. Daar leer ik van (hoop ik ;) ).

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Okies, geen probleem en van mij kun je hulp blijven verwachten, maar de volgende keer echt wat beter zoeken, deze vraag was niet nodig geweest met wat meer werk in de helpfiles.

Professionele website nodig?


Verwijderd

offtopic:
Konijn001 (ja ik ben ook limburger) mag dan wel veel topics openen, hij genereert vaker interessante discussies in P&W. Daarnaast zijn huiswerkvragen niet (meer) "verboten".

Het enige negatieve dat ik in zijn topics zie, is dat de vragen meestal gaan over non-standaard features van zijn (verouderde) compiler/API.


Vandaar de vraag aan knien001: leer je C++ uit een boek, of probeer je het volledig autodidactisch? Ik zou je adviseren een tamelijk recent boek te kopen en dat te volgen, anders leer je jezelf allerlei praktijken aan die alleen voor jouw specifieke (compiler) situatie werken. Net als bij een spreektaal leer je jezelf hoogstwaarschijnlijk een plaatselijk dialect aan, maar niet de "ABN" norm.

Verwijderd

Topicstarter
Vandaar de vraag aan knien001: leer je C++ uit een boek, of probeer je het volledig autodidactisch?
Ik heb C uit een boek geleerd "De Programmeertaal C, Grondbeginselen en toepassingen". C++ probeer ik middels internet, GoT en de help te leren
Ik zou je adviseren een tamelijk recent boek te kopen en dat te volgen, anders leer je jezelf allerlei praktijken aan die alleen voor jouw specifieke (compiler) situatie werken.
Als jij zegt een C++ boek is geen overbodige luxe neem ik deze tip graag aan. Heb je misschien dan ook een tip voor welk boek ik dan moet aanschaffen. Ik heb de ervaring dat de boeken van Academic Service over delphi heel makkelijk en duidelijk zijn. Is dit ook zo met C++?

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:21
Verwijderd schreef op 16 oktober 2002 @ 15:37:
Als jij zegt een C++ boek is geen overbodige luxe neem ik deze tip graag aan. Heb je misschien dan ook een tip voor welk boek ik dan moet aanschaffen. Ik heb de ervaring dat de boeken van Academic Service over delphi heel makkelijk en duidelijk zijn. Is dit ook zo met C++?


Check dit topic:
[rml][ /14 disc] Wat zijn _DE_ boeken om te hebben?[/rml]

Misschien vind je wel wat.

https://fgheysels.github.io/


Verwijderd

De meeste boeken van Academic service zijn wel goed idd. Op hun site vind ik 4 boeken die C++ inclusief de STL behandelen, voor een van die zou ik gaan. Vooral C++ van Leen Ammeraal lijkt mij ok, dat is een gerespecteerde auteur. (Ik kan je niet specifieker helpen want ik beheers C++ al meer dan 10 jaar.)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
curry684 schreef op 15 oktober 2002 @ 23:53:
[...]

Tering, 20 posts en nog steeds geen antwoord voor die jongen... zal ik dan maar ff?
Volgens mij was het probleem al opgelost.
C++:
1
2
3
4
5
6
7
    // Accessing character at specified index

    char __fastcall operator [](const int idx) const
    {
      ThrowIfOutOfRange(idx);   // Should Range-checking be optional to avoid overhead ??
      return Data[idx-1];
    }

Daar dit een inline functie is moet Knien dit overigens in z'n debugger hebben zien gebeuren (heb je uberhaupt wel naar de callstack gekeken?) ThrowIfOutOfRange gooit simpelweg de EOutOfRange knaller als idx 0 of lager is of groter dan de lengte van de string, en daarna wordt er expliciet 1 van afgetrokken om de 'goede' plek in de buffer tbv. Pascal-compatibility te geven.
Als idx 0 is, is idx-1 -1 en Data[-1] lijkt me niet juist. Dus ik denk dat idx hoger dan 0 moet zijn en dat op Data[0] geen lengte staat.
Pagina: 1