[c++]Goeie conditie geeft false

Pagina: 1
Acties:
  • 56 views sinds 30-01-2008

  • madwoody
  • Registratie: Augustus 2001
  • Laatst online: 29-06 10:53

madwoody

Connection reset by ME

Topicstarter
Ik ben een programma aan het maken in C/C++ in Dev c++ 4.9.7.9 die als een soort If statement gaat fungeren voor een andere programmeer taal die standaard geen If then else condities kent maar wel dos programma's kan openen.

Ik ben dus een programma aan het schrijven die de parameters achter het commando inleest en dit ziet er dan ongveer zo uit:

c:\ifmet 5 ">" 1
return 1

Hij leest dus 3 parameters uit namelijk value1, operator en value2. Het probleem is dat het bij het inlezen van de operator fout gaat. Hij zet dit in een char neer. Als ik deze op het scherm print dan staat er gewoon de operator (in dit geval een > ) in maar zodra ik met een if statement hierop controleer dan zegt hij dat dit false is en gaat hij dus niet naar de procedure TFConvert:

C++:
1
if (mainv.oper==">") TFConvert(greaterthen(mainv.val1,mainv.val2));


Als ik gewoon de procedure zonder check op die operator aanroep lukt het wel dus het moet in dit stuk zitten. Hieronder rest van mogelijk interessante code :

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int main(int argc, char *argv[])
{
  for (int c=1; c<argc; c++)
  {
    GetInput(c,argv[c]);
  }
  cout << mainv.oper; // Laat zien wat er in mainv.oper zit 
  
  if (mainv.oper==">") TFConvert(greaterthen(mainv.val1,mainv.val2));
  if (mainv.oper=="<") TFConvert(lesserthen(mainv.val1,mainv.val2));
  if (mainv.oper=="=") TFConvert(equalto(mainv.val1,mainv.val2));

  return 0;
}

void GetInput(int a,char c[])
{
  
  if (a==1) 
  {
    mainv.val1 = atoi(c);
  }
  if (a==2) 
  {
    strcpy(mainv.oper,c);
  }
  if (a==3)
  {
    mainv.val2 = atoi(c);
  }
}

// stukje uit header file
class Cmain
{
  public:
    int  val1;
    int  val2;
    char oper[];
};

Cmain mainv;


Even voor de duidelijkheid, in *argv[] komen dus de ingeven parameters terecht en argc is het aantal parameters. Het zal denk ik wel een dom foutje zijn ofzo. Ik ben beter in Borland C ++ ;)

Specs: Game/LANBak FTP/Gameserver Unix Server Visit http://www.gamesfm.nl


Verwijderd

Probeer eens met strcmp die vergelijking te maken. Als mainv.oper een char * is dan ben je oop jouw manier een pointer (adreswaarde) met een char (">") aan het vergelijken.

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

drm

f0pc0dert

offtopic:
Het is "greater than" en "less than" ;)


Als je 't in een char zet, moet je 't wel met een char vergelijken ;) Enkele quotes, dus :)

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


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

madwoody schreef op 26 March 2003 @ 13:29:
Als ik deze op het scherm print dan staat er gewoon de operator (in dit geval een > ) in maar zodra ik met een if statement hierop controleer dan zegt hij dat dit false is en gaat hij dus niet naar de procedure TFConvert:
Heb je ook gekeken of hij niet uitgevuld is met spaties of zoiets?

Who is John Galt?


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
code:
1
if (mainv.oper==">") TFConvert(greaterthen(mainv.val1,mainv.val2));

mainv.oper is een string en ">" is ook een string
Wat hier wordt gekeken is of de plaats in het geheugen van beide strings gelijk is, dit is niet zo dus is de vergelijking false.
Wat je moet doen is iets van
code:
1
if (!strcmp(mainv.oper, ">")) TFConvert(greaterthen(mainv.val1,mainv.val2));

De functie strcmp zit dacht ik gewoon in string.h
Als de strings gelijk zijn return ie 0 wat dus false is !
Dit omdat ie met een positief of negatieve return waarde kan aangeven welk van de 2 strings eerder voorkomen als je ze zou sorteren ofietsdergelijks.
Wat je ook zou kunnen doen als je zeker weet dat mainv.oper maar 1 teken is, is dit
code:
1
if (mainv.oper[0]=='>') TFConvert(greaterthen(mainv.val1,mainv.val2));

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • madwoody
  • Registratie: Augustus 2001
  • Laatst online: 29-06 10:53

madwoody

Connection reset by ME

Topicstarter
Thx, het werkt met (!strcmp(mainv.oper, ">")) :)

Specs: Game/LANBak FTP/Gameserver Unix Server Visit http://www.gamesfm.nl


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

drm

f0pc0dert

Overigens, dat is met Borland C++ niet anders :?

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


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 17-08 22:31

Belgar

Archmaster ranzige code..

niet als je ansistring gebruikt, waar '==' 'overloaded' is voor dit soort dingen

...Als het maar werkt


  • madwoody
  • Registratie: Augustus 2001
  • Laatst online: 29-06 10:53

madwoody

Connection reset by ME

Topicstarter
Ja precies. In Borland c++ heb je AnsiString, daar zitten al die leuke dingen al ingebouwd

Specs: Game/LANBak FTP/Gameserver Unix Server Visit http://www.gamesfm.nl


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
En jij kunt blijkbaar geen gebruik maken van std::string?

"He took a duck in the face at two hundred and fifty knots."


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Je kunt natuurlijk ook gewoon de UNIX "test" utility gebruiken (die ook wel onder Windows compileert, gok ik).

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het zoveelste "strings vergelijken lukt niet" topic

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

Dit topic is gesloten.