Hej Jesper,
Til Søren: Ved godt at der er en del fejl hvis der både er /* eller og { i linjen... Frygter det vil kræve en kæmpe ombygning af 3. del af min kode... Men jeg vil starte med at få dette tli at virke. :-)
Helt enig. Del problemerne op, og tag et ad gangen. Lad os få denne version til at virke først. Det var også derfor jeg spurgte først inden jeg kommer med andre problemer :-)
Hej, min far kom igår og hjalp mig med at få rettet lidt op på programmet og vi fik /* og */ til at virke desværre virker // ikke...
bemærk at den store ændring er i de to if sætninger...
Bemærk også at koden virker selvom man fjerner kommentarene i:
if((!iOption) || (!kommentaraaben)/* || ((kommentar != string::npos) && (nummer < kommentar))*/)
og/eller sætter kommentarer i denne:
if((!iOption) || (!kommentaraaben) || ((kommentar != string::npos) && (nummer2 < kommentar)))
Nogen der kan se hvad jeg gør galt nu?
Øhh, jeg forstår slet ikke den del du har tilføjet, altså
(kommentar != string::npos) &&
Den skal efter min opfattelse ikke være der.
Lad mig ridse op hvorfor:
Udtrykket
(!kommentaraaben)
er sandt, præcis når { eller } ikke er kommenteret ud af /* */, hvor vi skal rykke ind eller ud. Fint.
Tilsvarende var udtrykket i sidste del af if-betingelsen du havde før, hvor der blot stod
(nummer2 < kommentar)
sandt, præcis når { eller } ikke er kommenteret ud af //. Altså:
} sand, der skal rykkes ud.
} // sand, der skal rykkes ud.
// } falsk, der skal ikke rykkes ud.
Fint.
Det nye udtryk
(kommentar != string::npos) && (nummer < kommentar)
har følgende værdier:
} falsk
} // sand
// } falsk
Hvad skal det gøre godt for?
Her er der 2 falske værdier. Det gør det lidt bedre fordi det er de sande værdier der ødelægger håndteringen af /**/ i det samlede udtryk, når du nu har || istedet for && mellem de to udtryk der håndterer /**/ hhv. //.
Er der en speciel grund til at du har || mellem udtrykkene? Jeg gentager lige hvorfor jeg synes der skal stå &&:
De krøllede parenteser {, } skal forårsage ind og udrykning når de står uden for _både_ den ene slags kommentarer /* */ _og_ uden for den anden slags //.
En helt anden ting:
De variable i programmet som modtager værdier fra string::find, synes jeg skal være af type size_t. Det er typen string::find returnerer. (det er det samme som string::size_type, som du andet steds i programmet har haft fat i).
De variable som håndterer returværdierne er af type int og unsigned int. Det kan give problemer hvis værdierne string::find returnerer ikke kan være i variablene. Det er ikke garanteret at en size_t kan være i en unsigned int. Specielt ikke string::npos, som er en _stor_ værdi (den største?) af size_t.
I min compiler er size_t == unsigned int, men måske er det ikke i din.
Min compiler skriver:
warning: '=' : conversion from 'size_t' to 'unsigned int', possible loss of data
Du skal også have tungen lige i munden og vide hvad du gør, når du sammenligner unsigned og signed int, som du gør i f.eks. '(nummer2 < kommentar)'.
(eller rettere undgå at sammenligne dem).
Min compiler skriver:
warning: '<' : signed/unsigned mismatch
Så vidt jeg kan se er det ikke her problemet er. For værdierne med fortegn bliver konverteret tilbage til unsigned, som de var oprindeligt i dit program, inden sammenligningen foretages.
(Hvis jeg sætter
nummer2 = string::npos
kommentar = string::npos
bliver
nummer2 == -1
kommentar == 4294967295
Men
(nummer2 < kommentar) er falsk og
(nummer2 == kommentar) er sand. )
Nå, det blev en lang smøre. Blev det for langt? Hvis ja, så undskyld.
Hilsen Søren.