Toon posts:

[C++] forcing value to bool 'true' or 'false'

Pagina: 1
Acties:

Verwijderd

Topicstarter
C++:
1
  KString tm2 = new KString(&_ptr[startpos]); // make new string


KString is eigenlijk gewoon een char* die encapsulated is (ja ik weet het, er zwerven er al zoveel rond ^_^)

char* _ptr;

Dit geeft me de fout:
D:\Backup\VB Programs\Temp\VB Array To C++\CString_test\KString.cpp(236) : warning C4800: 'class KString *' : forcing value to bool 'true' or 'false' (performance warning)


Voor zover ik weet vraag ik aan C++ om een nieuwe KString te maken, met als initwaarde een char* (ja toch?). Maw om een nieuwe KString te maken die begint vanaf startpos.

Maar hoe komt de compiler er in godsnaam bij dat dit een boolean is??

KString(bool invoer); <-- deze functie bestaat ook ja, maar
KString(char*invoer); <-- deze functie is toch meer 'specialized' ???

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

is _ptr toevallig een const char * ?

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.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik weet niet of de [] operator precedence heeft boven de & reference operator, maar volgens mij niet.

In het 'niet' geval moet je even haakjes om de _ptr [ startpos ] heen te zetten, maar dat zou je even na moeten zoeken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

drm: uiteraard heeft [] precedence boven &, het is gewoon geldige, goede syntax

_ptr + startpos kan overigens ook ;)

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.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Dat 't goede syntax is twijfelde ik niet aan, want dat hangt ook niet af van de precedence van de operators ;) En die "uiteraard" vind ik zo uiteraard niet, eigenlijk...

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
ja, ik had eerst _ptr+startpos geprobeerd... Maar ik dacht, misschien is die compiler zo dom om dat aan te zien als bool... Daarom dat ik expliciet gekozen heb voor de adres-notatie... Maar nu is het alsof die dat ook aanziet als een boolean ???

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
class KString
{
private:
  char *  _ptr;
...
};

[ Voor 17% gewijzigd door Verwijderd op 04-03-2003 15:30 . Reden: code-tag vergeten ]


Verwijderd

Verwijderd schreef op 04 maart 2003 @ 15:12:
C++:
1
  KString tm2 = new KString(&_ptr[startpos]); // make new string


KString is eigenlijk gewoon een char* die encapsulated is (ja ik weet het, er zwerven er al zoveel rond ^_^)

char* _ptr;

Dit geeft me de fout:
D:\Backup\VB Programs\Temp\VB Array To C++\CString_test\KString.cpp(236) : warning C4800: 'class KString *' : forcing value to bool 'true' or 'false' (performance warning)


Voor zover ik weet vraag ik aan C++ om een nieuwe KString te maken, met als initwaarde een char* (ja toch?). Maw om een nieuwe KString te maken die begint vanaf startpos.

Maar hoe komt de compiler er in godsnaam bij dat dit een boolean is??

KString(bool invoer); <-- deze functie bestaat ook ja, maar
KString(char*invoer); <-- deze functie is toch meer 'specialized' ???
Staat deze "KString tm2 = new KString(&_ptr[startpos]);" wel in de KString.cpp file op regel 236, of gebruik je dit in een andere file en denk je dat het daar mis gaat terwijl de compiler het over de code in de cpp file heeft?

Of verdwijnt de warning als je er "KString tm2 = new KString((char *)&_ptr[startpos]);" van maakt? Zo niet dan ziet de compiler de KString(char *) variant gewoon niet...

Verwijderd

Topicstarter
KString tm2 = new KString(_ptr + startpos); // make new string
^--- Dit staat inderdaad op regel 236

met (char*) ervoor had ik al geprobeerd, maar warning bleef gewoon

en wat bedoeld u juist met "dan ziet de compiler de KString(char *) variant gewoon niet..." ?

KString(char*) constructor IS gedefinieerd...

Verwijderd

Verwijderd schreef op 04 March 2003 @ 15:37:
KString tm2 = new KString(_ptr + startpos); // make new string
^--- Dit staat inderdaad op regel 236

met (char*) ervoor had ik al geprobeerd, maar warning bleef gewoon

en wat bedoeld u juist met "dan ziet de compiler de KString(char *) variant gewoon niet..." ?

KString(char*) constructor IS gedefinieerd...
offtopic:
Hij zegt u tegen mij ;)


Ehm, stom dat ik dit niet eerder zie, maar bedoel jij niet :
C++:
1
KString tm2(_ptr + startpos); // make new string

of
C++:
1
KString *tm2 = new KString(_ptr + startpos); // make new string

Verwijderd

new KString(&_ptr[startpos]); geeft toch een pointer terug? Bedoel je dan niet:

KString *tm2 = new KString(&_ptr[startpos]); // make new string

Met een sterretje.

Verwijderd

Topicstarter
ja, dat is het rare dus hé!
die 1e dat je schrijft
C++:
1
KString tm2(_ptr + startpos); // make new string


Dus dit werkt perfect.

Ik zal even die functie hier posten (niet lachen pls :p)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
KString KString::Mid ( long startposition, long aantal )
{
  if (aantal < 0)
  {
    aantal = len;
  }

  long startpos = startposition - vbindex;

  if (startpos > len)
    return KString("");

  if ( aantal + startpos > len)
    aantal = len - startpos;

  char tmp = _ptr[startpos + aantal];
  _ptr[startpos + aantal] = 0;

  KString *tm2 = new KString(_ptr + startpos); // make new string
  _ptr[startpos + aantal] = tmp;

  return tm2;
}


in de constructors maak ik altijd een _strdup van de meegegeven string etc.

Ik had eerst
C++:
1
2
3
char tmp=new char[aantal + 1];
strncpy(tmp, _ptr + startpos);
tmp[aantal+1]=0;


Maar natuurlijk moet ik dit erna deleten ... Na die in die KString gezet te hebben. Dat vond ik zelf nogal dom omdat bij initialisatie van KString die toch NOG eens ge _strdup'ed word...

Dus ik onthoud even het char dat ik 0 gemaakt heb, ik init een nieuwe KString met mijn huidige (capped) pointer. En verander dan terug die ge-0-maakte character door wat het eigenlijk was.


... Ideeen? :-)

BTW, die KString *tm2 ... werkt ook niet hé. Die blijft performance warning geven 8)7.

Dus is er op 1 of andere manier dat de compiler vind dat "KString(bool)" constructor er meer bij aansluit dan "KString(char*)" constructor.

[ Voor 81% gewijzigd door Verwijderd op 04-03-2003 15:54 . Reden: toch niet :'( ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

je snapt het concept pointers blijkbaar nog niet :)

je functie geeft een KString terug, maar tm2 is een pointer naar KString

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
Nee :)
Ik kom van een VB-omgeving naar C++ ... Dus een paar moeilijkheden om mij aan te passen. Daarom dat ik gewoon even een paar veelgebruikte VB functies deftig wil gaan schrijven in C++. Dan moet ik daarna er gewoon niet meer over nadenken ;) en toch de performantie grotendeels behouden.

Wat jij dus zegt te doen: KString*tm2 (pointer naar tm2) = new KString( _ptr + startpos ) (new geeft pointer naar deze nieuwe KString, right?).

En dan de functie header moet KString * KString::Mid... worden (begin ik het al door te hebben? ^_^)

Maar wat lost dat op als hij vind dat "_ptr + startpos" een boolean is? :)

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
KString[b]*[/b] KString::Mid ( long startposition, long aantal )
{
  if (aantal < 0)
  {
    aantal = len;
  }

  long startpos = startposition - vbindex;

  if (startpos > len)
    return [b]new[/b] KString("");

  if ( aantal + startpos > len)
    aantal = len - startpos;

  char tmp = _ptr[startpos + aantal];
  _ptr[startpos + aantal] = 0;

  KString *tm2 = new KString(_ptr + startpos); // make new string
  _ptr[startpos + aantal] = tmp;

  return tm2;
}


Dit compiled perfect... Nu even testen of het werkt...

.oisyn... Kan jij me misschien uitleggen waarom??? Of kan je me doorverwijzen naar één of andere site waar ik dat even kan nalezen hoe de compiler in dit geval aan het denken was?

[ Voor 5% gewijzigd door Verwijderd op 04-03-2003 16:08 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

je kunt wel overal pointers van maken, maar dan zit je weer met geheugenmanagement. Je kan ook gewoon overal juist geen pointers van maken

een nieuwe KString () op de stack aanmaken doe je zoals DaZaffiro voorstelde:
C++:
1
KString tm2(_ptr + startpos);

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
ja, dat werkt ok, maar hoe return ik die??
Die is lokaal in de Mid-functie gedefinieerd... Dus hoe breng ik eigenlijk naar de hogere "lokale" functie?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

:?
C++:
1
return tm2;
werkt prima hoor

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Wat ook had gewerkt:

KString tm2 = KString( _ptr + startpos ); // zonder new dus

omdat dat hetzelfde is als

KString tm2 ( _ptr + startpos );

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Jups, ik pak toch liever die versie van MSalters ^_^

werkt perfect ;) nu... Ik kreeg daarnet nog een foutje maar dat was omdat ik operator= niet gedefined had...

swat, moet er iemand mijn code hebben? Anders post ik die wel ...

Verwijderd

Waarom maak je trouwens gebruik van een "char *" als datamember, waarom gebruik je niet gewoon een std::string om de string in te bewaren, dan kun je "substr" gebruiken voor deze "mid" functie en een hele hoop ander handige functies die je zonder twijfel een hoop moeite zouden besparen/hadden bespaard... (En eveneens de class een stuk meer exception-save hadden gemaakt zonder daar veel moeite voor te hoeven doen)

[ Voor 21% gewijzigd door Verwijderd op 04-03-2003 16:37 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 04 March 2003 @ 16:26:
Jups, ik pak toch liever die versie van MSalters ^_^


waarom eigenlijk?

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Een voordeel is minder kans op verwarring:
code:
1
foo bar( baz );

Is dit een functie 'bar', die een (type) baz in een (type) foo verandert, of een 'foo' object genaamd 'bar', met initiele waarde 'baz' ?
code:
1
foo bar = baz ;

Duidelijk.

[ Voor 20% gewijzigd door MSalters op 04-03-2003 17:04 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

MSalters schreef op 04 maart 2003 @ 17:03:
Een voordeel is minder kans op verwarring:
code:
1
foo bar( baz );

Is dit een functie 'bar', die een (type) baz in een (type) foo verandert, of een 'foo' object genaamd 'bar', met initiele waarde 'baz' ?
code:
1
foo bar = baz ;

Duidelijk.
Niet mee eens. Als je de bovenste in je code hebt staan (uiteraard is dat in een functie), en je verwart het met een functie, dan is er toch echt wat mis je kennis van C++. :)

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:45 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Die bool komt denk ik door (een poging tot) impliciete (automatische) type conversie. Zet voor die ctor met een bool als parameter even het keyword "explicit"

Verwijderd

Topicstarter
over die versie van MSalters: ik vind die meer voor de hand liggend dan die van .oisyn (tja, ik kom van een niet-pointer omgeving hé)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

KaRel: wel of geen pointers hebben daar weinig mee te maken, maar goed, het is natuurlijk een kwestie van voorkeur :)

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.

Pagina: 1