Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
Solved

# Convert code from unstructured to structured with embedded assignments.

Posted on 2013-12-20
Medium Priority
271 Views
Followup to question

http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_28322873.html

Here is some spaghetti code with embedded assignments. I need to restructure the code without goto and line numbers.

``````If Abs(xi - x1) < Abs(0.00001 * xi) And Abs(yi - y1) < Abs(0.00001 * yi) Then F=1:GoTo 10
If Abs(xi - x2) < Abs(0.00001 * xi) And Abs(yi - y2) < Abs(0.00001 * yi) Then F=1:GoTo 10
If Abs(x1 - x2) < (0.0000001 * x1) Then If (yi - y1) * (yi - y2) < 0 Then F=2:GoTo 10 Else GoTo 20
If (xi - x1) * (xi - x2) < 0 Then F=2:GoTo 10
GoTo 20
10
If Abs(xi - x3) < Abs(0.00001 * xi) And Abs(yi - y3) < Abs(0.00001 * yi) Then F=F or 4:GoTo 30
If Abs(xi - x4) < Abs(0.00001 * xi) And Abs(yi - y4) < Abs(0.00001 * yi) Then F=F or 4:GoTo 30
If Abs(x3 - x4) < Abs(0.000001 * yi) Then If (yi - y3) * (yi - y4) < 0 Then F=F or 8:GoTo 30 Else GoTo 20
If (xi - x3) * (xi - x4) < 0 Then F=F or 8:GoTo 30
GoTo 20

30 F = 1

20
``````
0
Question by:Saqib Husain, Syed

LVL 35

Accepted Solution

mvidas earned 2000 total points
ID: 39731996
Hi Saqib,

Give this a shot. I used fanpages' testing sub from the other question and it all matches:
``````Function F(xi As Double, x1 As Double, x2 As Double, x3 As Double, x4 As Double, _
yi As Double, y1 As Double, y2 As Double, y3 As Double, y4 As Double) As Long

If (Abs(xi - x1) < Abs(0.00001 * xi) And Abs(yi - y1) < Abs(0.00001 * yi)) Or _
(Abs(xi - x2) < Abs(0.00001 * xi) And Abs(yi - y2) < Abs(0.00001 * yi)) Then
F = 1
ElseIf (Abs(x1 - x2) < (0.0000001 * x1) And (yi - y1) * (yi - y2) < 0) Or _
((xi - x1) * (xi - x2) < 0) Then
F = 2
Else
Exit Function
End If

If Not (Abs(xi - x3) < Abs(0.00001 * xi) And Abs(yi - y3) < Abs(0.00001 * yi)) And _
Not (Abs(xi - x4) < Abs(0.00001 * xi) And Abs(yi - y4) < Abs(0.00001 * yi)) Then
If Abs(x3 - x4) < Abs(0.000001 * yi) And Not ((yi - y3) * (yi - y4) < 0) Then Exit Function
If Not (Abs(x3 - x4) < Abs(0.000001 * yi)) And Not ((xi - x3) * (xi - x4) < 0) Then Exit Function
End If

F = 1
End Function
``````
Matt
0

LVL 35

Expert Comment

ID: 39733343
Thanks for looking at this Matt :)
0

LVL 14

Expert Comment

ID: 39733359
This is what I came up with:-
``````Sub Restructured()

Dim xi As Double, x1 As Double, x2 As Double, x3 As Double, x4 As Double
Dim yi As Double, y1 As Double, y2 As Double, y3 As Double, y4 As Double
Dim F As Integer

F = Abs((Abs(xi - x1) < Abs(0.00001 * xi) And Abs(yi - y1) < Abs(0.00001 * yi)) Or _
(Abs(xi - x2) < Abs(0.00001 * xi) And Abs(yi - y2) < Abs(0.00001 * yi)))
If F = 0 Then
If ((Abs(x1 - x2) < (0.0000001 * x1)) And _
((yi - y1) * (yi - y2) < 0)) Or _
((xi - x1) * (xi - x2) < 0) Then F = 2
End If

If F Then
If (Abs(xi - x3) < Abs(0.00001 * xi) And Abs(yi - y3) < Abs(0.00001 * yi)) Or _
(Abs(xi - x4) < Abs(0.00001 * xi) And Abs(yi - y4) < Abs(0.00001 * yi)) Then
F = 1
End If
If F = 2 Then
If ((Abs(x3 - x4) < Abs(0.000001 * yi)) And _
((yi - y3) * (yi - y4) < 0)) Or _
((xi - x3) * (xi - x4) < 0) Then F = 1
End If
End If
End Sub
``````
I point out that the original code goes to some length to assign various values to F in its lower portion all of which are converted to =1 at line 30. This renders the jump to 30 unnecessary because the value =1 can be assigned immediately.
0

LVL 35

Expert Comment

ID: 39733798
^ You are assuming that it is uninitialised when the code snippet commences.

If the jump to line 20 is valid during the successive tests, then setting F to 1 "immediately" (at the beginning of the code snippet) may be an inappropriate assumption.
0

LVL 14

Expert Comment

ID: 39735282
That isn't what I am saying.
Since label 30 assigns F=1 and continues with label 20 any jump to label 30 can be replaced with the assignment F=1 followed by continuation at label 20.
0

LVL 35

Expert Comment

ID: 39735942
OK.  It was the wording of "immediately" that was confusing.  Thanks for clarifying what you meant.
0

LVL 43

Author Comment

ID: 39735991
Sorry for the confusion. I copied the code from the previous question and modified it. I forgot to delete the F=1 in after the label 30. I shall come back when I have tested the solutions. Apparently the first one seems good.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article describes how to use a set of graphical playing cards to create a Draw Poker game in Excel or VB6.
We live in a world of interfaces like the one in the title picture. VBA also allows to use interfaces which offers a lot of possibilities. This article describes how to use interfaces in VBA and how to work around their bugs.
How can you see what you are working on when you want to see it while you to save a copy? Add a "Save As" icon to the Quick Access Toolbar, or QAT. That way, when you save a copy of a query, form, report, or other object you are modifying, youâ€¦
Enter Foreign and Special Characters Enter characters you can't find on a keyboard using its ASCII code ... and learn how to make a handy reference for yourself using Excel ~ Use these codes in any Windows application! ... whether it is a Micrâ€¦
###### Suggested Courses
Course of the Month13 days, 14 hours left to enroll

#### 580 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.