Kan ikke finde ud af hvad der er galt med min kode :-s

Tags:    c++

<< < 12 > >>
Hej, jeg har lavet et lille program som skal "reparere" filer hvor indrykningerne er gået skævt...
Det bruges så ledes: fixtab (som jo er programmets navn) [filnavn] [-i] (som gør at den IKKE skal læse i komentarer (// og mellem /* og */)) [-m] (som gør at der IKKE bliver lavet mellemrum i de tomme linjer)
Mit problem er at af en eller anden grund virker min -i ikke.
Her er koden:

Fold kodeboks ind/udKode 


Håber i kan hjælpe...
/Jesper



16 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Jeg er enig med Bertel Brander i hvor fejlen ligger. Men jeg mener ikke 'kommentaraaben' skal helt slettes i linierne. Så vil det, som Bertel skriver, ikke virke med /* */. Linier med } som er kommenteret ud med /* */ vil forårsage udrykning. (undskyld udtrykket).

Så vidt jeg kan se, har du lavet et || hvor der skulle have været &&.
I tilfældet } skal der rigtignok rykkes ud hvis 'iOption' er falsk eller } står uden for kommentar. Men } står uden for kommentar hvis den både står uden for /* */ _og_ står inden evt. //
Så mit første bud er:

if (!iOption || (!kommentaraaben && nummer2 < kommentar)) antalIndRyk--;

Som jeg ser det, virker dette, dog kun hvis man ikke blander {, }, /*, */ på samme linie.
Du tester hvor på linien // står i forhold til }. Men du tester ikke hvor på linien /* og */ står.
Men for at undersøge om { og } står i /* */ bliver du nok nødt til at løbe gennem linien med en løkke. For der kan jo være flere af /* og */ , så en enkelt string::find("/*") kan nok ikke gøre det.


Sig til hvis du vil have mere feedback, der er nogle tilfælde hvor programmet ikke rykker rigtigt ind.

Ellers flot program. Keep up the good work!

Hilsen Søren D.
(en newbie her på Udvikleren, så undskyld hvis der er noget i tekstformateringen eller andet jeg gør forkert.)




//Dette er et program der skal lave indrykninger
//korekte, eller hvad man nu siger ;-)
//Vi laver programmet i tre dele:
//1. Lav sikkerhedskopi - færdig
//2. Fjern mellemrum - ikke lavet
//3. Lav mellemrum - mangler skriv fil



I skal ikke tage jer af det der står i den kommentar... alle tre dele er lavet...



Den første argument til main er 1, så du skal lave denne:

for (int j=2; j<argc; ++j) //Løb de medsendte data igennem

om til:
for (int j=1; j<argc; ++j) //Løb de medsendte data igennem

argv[0] er programmets navn.



Den første argument til main er 1, så du skal lave denne:

for (int j=2; j<argc; ++j) //Løb de medsendte data igennem

om til:
for (int j=1; j<argc; ++j) //Løb de medsendte data igennem

argv[0] er programmets navn.


Ved nærmere eftersyn: glem den kommentar.



Den første argument til main er 1, så du skal lave denne:

for (int j=2; j<argc; ++j) //Løb de medsendte data igennem

om til:
for (int j=1; j<argc; ++j) //Løb de medsendte data igennem

argv[0] er programmets navn.


Såvidt jeg kan se er det han gør her helt korrekt, da han først vil have filnavn og derefter flag.

MH.

The-Freak

Livet er for kort til at kede sig.



Jeg tror at problemet er kommentaraaben i disse linier:
if((!iOption) || (!kommentaraaben) || (nummer2 < kommentar)) antalIndRyk=antalIndRyk-1; //Tæl antalIndRyk en ned

if((!iOption) || (!kommentaraaben) || (nummer < kommentar)) antalIndRyk=antalIndRyk+1; //Tæl antalIndRyk en op

kommentaraaben er false medmindre du har en /* */ kommentar og dermed er udtrykket sandt uanset om du har -i

Hvis du prøver at slette kommentaraaben fra udtrykkene burde det virke (dog ikke med /* */ kommentarer)



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... Her er koden:

Fold kodeboks ind/udKode 


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?




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. :-)



Lad os et øjeblik kikke på:
Fold kodeboks ind/udKode 

Hvilket betyder:
hvis ikke iOption eller ikke kommentaraaben eller // starter efter {

Hvis kommentaraaben er falsk vil udtrykket være sand, uanset kommentar.

Du skal have en && noget i stil med:
Fold kodeboks ind/udKode 


Du bør sætte kommentar til string::npos ikke 255 ved initiering, det er vigtigt hvis iOption ikke sættes.



Hej, en kommentar til:


Du bør sætte kommentar til string::npos ikke 255 ved initiering, det er vigtigt hvis iOption ikke sættes.


Ja, skal den initialiseres til en stor værdi, er npos bedre, når vi nu tit og ofte i programmet tester lighed med npos.

Men så vidt jeg kan se, er værdien af 'kommentar' ligegyldig hvis 'iOption' ikke sættes.
Hvis 'iOption' ikke sættes er vi jo ligeglade med om der er //, /* og */, så vi skal ikke bruge variablen 'kommentar' til noget.
I koden viser det sig ved, at alle steder hvor 'kommentar' bliver brugt, er det i if-sætninger der starter med if ( (! iOption) || ...
Så hvis 'iOption' er falsk bliver betingelsen i if-sætningen sand uanset hvad.

Så 'kommentar' behøves slet ikke blive initialiseret i starten af programmet. (hvis 'iOption' er sand bliver den jo initialiseret i starten af while-løkken.)

Hilsen Søren.




<< < 12 > >>
t