Just nu i M3-nätverket
Jump to content

Min unktion vill inte hoppa ur när jag vill


vlise

Recommended Posts

Hej nu är jag här och tjatar igen. Jag trode mitt program skulle funka felfritt nu, men tji fick jag.

 

Denna funktion ska fråga vart jag vill spara det mappar jag skapar. Det funkar jättefint. Men det finns ett MEN. Om jag i frågan

"Where do you want to save the directories?: " skriver: C:\Sökvägsomintefinns

Då säger programmet ifrån och funktionen anropar sig själv.

 

Om jag nu skriver en sökväg som finns anropar funktionen

YesOrNo() (den frågar om jag verkligen vill använda denna sökväg)

Om Input == n så kallar funktionen på sig själv igen. Om Input däremot == "y" så skall programmet hoppa ur denna funktion. Men istället för att hoppa ur funktionen anropar funktionen YesOrNo igen.

Och efter denna gång hoppar programmet ur WhereToSaveDirectory().

 

Ex:

"Where do you want to save the directories?: sökvägsomintefinns

"The valid path does not exist, please try again. "

"Where do you want to save the directories?: sökvägsomfinns

YesOrNo(); väljer "y"

YesOrNo(); väljer "y"

 

sen hoppar den ur. varför?

 

void WhereToSaveDirectory(string& directorypath)
{
   string path;
   cout <<"Where do you want to save the directories?: ";
   cin >> path;
   directorypath = path
   bool path_control = pathcontrol(path);
   if(path_control == false)
           WhereToSaveDirectory(directorypath);

   bool Exist = IfDirectoryExist(path);
   if(Exist == false)
   {
        cout <<"The valid path does not exist, please try again. " << endl; 
        WhereToSaveDirectory(directorypath);
    }

    bool PathName = true;
    string Input = YesOrNo(PathName, 0, 0);
    if(Input != "y")
        WhereToSaveDirectory(directorypath);
}

 

path_control kollar bara om :\ finns med

[inlägget ändrat 2009-10-07 16:51:00 av vlise]

[inlägget ändrat 2009-10-07 16:55:32 av vlise]

Link to comment
Share on other sites

Jag tror att det beror på att du inte riktigt har kunskapen om hur rekursiva funktioner beter sig så jag föreslår att du skriver om funktionen med användning av lämplig loop. Det är inte så lätt att förklara hur rekursivitet fungerar heller utan en massa skrivande och exempel.

 

Link to comment
Share on other sites

Aha ok...jag är inte så jätte haj på programmering men jag kommer bli =).

Jag viste inte att det var så svårt att kalla på sin egen funktion. Jag får läsa på mer om det. Så länge för jag lösa det på ett annat sätt.

 

Link to comment
Share on other sites

void WhereToSaveDirectory(string& directorypath)
{
   string path;
   bool loop = true;

   while (loop == true) {
     cout <<"Where do you want to save the directories?: ";
     cin >> path;
     directorypath = path
     bool path_control = pathcontrol(path);
     if(path_control == false) {
        cout << "The path is invalid."
        cout << "try again."
     } else {
     bool Exist = IfDirectoryExist(path);
     if(Exist == false)
     {
        cout <<"The valid path does not exist, please try again. " << endl; 
      } else {
      bool PathName = true;
      string Input = YesOrNo(PathName, 0, 0);
      if(Input == "y")
        return; // [b]Enda[/b] vägen ut ur denna funktion
      } // Exist == false
     } // Path_control == false
   }  // while loopen tar aldrig slut
}

 

Denna bör köra som du har tänkt

Man kan ju använt goto, men som Kernighan & Ritchie säger "Den är ful".

"Skall användas sparsamt". Detta ord har sin bakgrund i FORTRAN & BASIC.

Du kanske skulle titta lite på "C++ programmering" av Stephen Prata.

 

[inlägget ändrat 2009-10-09 13:23:09 av goha]

Link to comment
Share on other sites

Jag kom på en annan lösning där jag istället för att kalla på sin egen funktion returnerar false till funktionen som kallade på den. Där använder jag mig av en while-sats som återkallar WhereToSaveDirectory() så länge det är false. Jag vet inte vad som är fult och snyggt.

 

Men jag tror att ditt exempel verkar lite bättre. Då behöver jag ju inte går ur funktionen försen den verkligen är klar.

det här var vad jag tänkte.

 

 

bool WhereToSaveDirectory(string& directorypath)
{
 string path;
 cout <<"Where do you want to save the directories?: ";
 cin >> path;
 directorypath = path;
 bool path_control = Pathcontrol(path);
 if(path_control == false)
        return false;

  bool Exist = IfDirectoryOrFileExist(path, 1);
   if(Exist == false)
   {
        cout <<"The path is invalid! Please try again. " << endl; 
       return false;
   }

string Input = YesOrNo();
 if(Input == "n")
     return false;

return true;
}

string NewDirectory()
{
   bool yes = false;
   string directorypath;

  while(Yes == false)
      Yes = WhereToSaveDirectory(directorypath);
   ....
   ....
}

Fult?

 

Men som sagt jag tror ditt förslag är lite bättre. Observera att jag inte är så van med programmering och därför kan det ibland bli lite konstiga namn på variablerna. Hoppas du/ni har överseende med det.

 

 

[inlägget ändrat 2009-10-13 10:06:26 av vlise]

[inlägget ändrat 2009-10-13 10:07:12 av vlise]

[inlägget ändrat 2009-10-13 10:10:28 av vlise]

Link to comment
Share on other sites

  • 4 weeks later...

Det finns inget fel så länge det fungerar.

 

Ofta i början så vill man förkorta och optimera koden så mycket man kan.

Inget stort fel i det, men man kommer till en punkt då det kanske inte

fungerar längre. det är då bra att använda SCCS/RCS/SS/CVS och vad de alla heter. SCCS(SUN), RCS(de flesta Unix),Sorcesafe(Windows) och CVS (Sourceforge använder denna filitigt), Revision Control Sources.

Man kan då backa till en punkt då det fungerar igen.

 

Efter som jag har en SUN använder jag SCCS.

 

[inlägget ändrat 2009-11-09 14:39:21 av goha]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...