Announcement

Collapse
No announcement yet.

Milti DIM arrays??

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • #21
    I am going to make seperate array to copy file data to sort arrays and back to file after sorted.

    Do not understand sorting sytx.

    'here is where I do not understand the sytx for sorting using tagarray
    'I want to sort col FC3() and make sure the other arrays tag along when sorting only one column
    ARRAY SORT FC3(), TAGARRAY FC1(), FC2(), <<<< error here

    Code:
    CALLBACK FUNCTION File_ColumnSort()
    LOCAL x AS LONG        'IF THIS CALLBACK IS USED AGAIN DO I NEED TO REDIM ??? SINCE TestNR MIGHT BE DIFF.
    DIM FC1(TestNR),FC2(TestNR),FC3(TestNR),FC4(TestNR),FC5(TestNR),FC6(TestNR),FC7(TestNR), REC AS TYPEE
    
    FOR x = 1 TO TestNR       'NR = number of records in file    RN = record number
    GET #5,TestRN,REC
    FC1(x)=STR$(TestRN): FC2(x)=REC.Col2: FC3(x)=REC.Col3: FC4(x)=REC.Col4: FC5(x)=REC.Col5
    FC6(x)=REC.Col6: FC7(x)=REC.Col7
    NEXT x
    
    'here is where I do not understand the sytx for sorting using tagarray
    'I want to sort col FC3 and make sure the other array tag along when sorting only one column
    ARRAY SORT FC3(), TAGARRAY FC1(), FC2(),
    
    'next sort by colum n > save back to file >  ,  add col1 = col7 buttons in main display
    END FUNCTION
    Robert

    Comment


    • #22
      I made some adjustments to your code as follows and an explanation follows
      Code:
      CALLBACK FUNCTION File_ColumnSort()
      LOCAL x AS LONG        'IF THIS CALLBACK IS USED AGAIN DO I NEED TO REDIM ??? SINCE TestNR MIGHT BE DIFF.
      DIM FC1(TestNR),FC2(TestNR),FC3(TestNR),FC4(TestNR),FC5(TestNR),FC6(TestNR),FC7(TestNR), REC AS TYPEE
      DIM index(TestNR) AS LONG
      
      FOR x = 1 TO TestNR       'NR = number of records in file    RN = record number
      GET #5,TestRN,REC         '**** you could substitue x for TestRN here GET #5,x,REC
      index(x)=x
      FC1(x)=STR$(TestRN): FC2(x)=REC.Col2: FC3(x)=REC.Col3: FC4(x)=REC.Col4: FC5(x)=REC.Col5
      FC6(x)=REC.Col6: FC7(x)=REC.Col7
      NEXT x
      
      'here is where I do not understand the sytx for sorting using tagarray
      'I want to sort col FC3 and make sure the other array tag along when sorting only one column
      ARRAY SORT FC3(), TAGARRAY index()                   ' FC1(), FC2(),
      
      'next sort by colum n > save back to file >  ,  add col1 = col7 buttons in main display
      END FUNCTION
      after the ARRAY SORT, the values in FC3(0) to FC3(TestRN) will have changed, which is what you wanted.
      the values in the index() will have changed right along with the changes in FC3()

      In the following assume that TestNR = 3 and that we are only interested in FC3(),index(),FC1() and FC2()
      and the contents are numeric FOR purposes OF clarity. Strings would work as well, but may not be as clear to a human.
      Before sorting:
      Code:
      FC1(0)=(12):FC2(0)=24:FC3(0)=89:index(0)=0
      FC1(1)=(27):FC2(1)=11:FC3(1)=16:index(1)=1
      FC1(2)=(16):FC2(2)=13:FC3(2)=67:index(2)=2
      FC1(3)=(10):FC2(3)=65:FC3(3)=97:index(3)=3
      We sort FC3() with TAGARRAY index(), FC3() and index() now look like the following:

      Code:
      FC3(0)=16:index(0)=1
      FC3(1)=67:index(1)=2
      FC3(2)=89:index(2)=0
      FC3(3)=97:index(3)=3
      We now use the index() array to get the FC1 and FC2 arrays to tag along by using index() as the subscript
      After sorting:
      Code:
      FC1(index(0))=27:FC2(index(0))=11:FC3(0)=16 'index(0)=1 after the sort so the computer reads FC1(index(0)) as FC1(1)  
      FC1(index(1))=16:FC2(index(1))=13:FC3(1)=67
      FC1(index(2))=12:FC2(index(2))=24:FC3(2)=89
      FC1(index(3))=10:FC2(index(3))=65:FC3(3)=97
      You could use index() to get all the arrays to tag along with our sort of FC3()

      Hope this clears the sort problem for you.
      Rod
      In some future era, dark matter and dark energy will only be found in Astronomy's Dark Ages.

      Comment


      • #23
        Rodney, I think you may be confusing Robert more by introducing the concept of Indexes here. Maybe not. I'm sure he understands it but he is still trying to grasp the array principles here.


        'First of all, Robert. This should be just a plain Function (or Sub), Not a CALLBACK FUNCTION. Callbacks are used to extract data from Dialogs & Controls (Sort of like the Input ruotines in DOS Basics). Not that it won't work, just not good programming practice.

        My comments to your code will be prefaced by '''

        Code:
        CallBack Function File_ColumnSort()
        Local x As Long        'IF THIS CALLBACK IS USED AGAIN DO I NEED TO REDIM ??? SINCE TestNR MIGHT BE DIFF.
         
        [B]''' Yes the arrays should be redimmed before reusing them[/B]
         
        Dim FC1(TestNR),FC2(TestNR),FC3(TestNR),FC4(TestNR),FC5(TestNR),FC6(TestNR),FC7(TestNR), REC As TYPEE
         
        [B]''' Is TestNR a Global? Otherwise the arrays will not be Dimmed.[/B]
         
        For x = 1 To TestNR       'NR = number of records in file    RN = record number
        [B]''' I think there is an error here. It will get the same record (TestRN) for each iteration of x.[/B]
        Get #5,[B]TestRN[/B],REC '[B]<<--- Should be x, not TestRN[/B]
        FC1(x)=Str$(TestRN): FC2(x)=REC.Col2: FC3(x)=REC.Col3: FC4(x)=REC.Col4: FC5(x)=REC.Col5
        FC6(x)=REC.Col6: FC7(x)=REC.Col7
        Next x
         
         
        'here is where I do not understand the sytx for sorting using tagarray
        'I want to sort col FC3 and make sure the other array tag along when sorting only one column
        Array Sort FC3(), TagArray FC1(), FC2(),
         
        [B]''' The syntax for TagArray is simpler than it sounds. [/B]
        [B]''' In the line above FC3() will be sorted and all the corresponding elements [/B]
        [B]''' of the Tag Arrays will be in the same order as FC3. [/B]
        [B]''' Say element FC3(5) getmoved to FC3(1) in the Sort, [/B]
        [B]''' then all element (5)'s in the Tag Arrays (FC1 & FC2) will get moved [/B]
        [B]''' to element (1)'s as well.[/B]
         
         
        'next sort by colum n > save back to file >  ,  add col1 = col7 buttons in main display
        End Function
        The Sort is a little more sophisticated too in that say 2 or 3 or 5 or n elements in the primary array are equal, the sort moves to the next Tag array in line and sorts by the corresponding elements in that array, and so on down all the Tag Arrays.


        ======================================
        I don't want any yes-men around me.
        I want everybody to tell me the truth
        even if it costs them their jobs.
        Samuel Goldwyn
        ======================================
        Last edited by Gösta H. Lovgren-2; 31 Jul 2008, 10:41 AM. Reason: Added erudition
        It's a pretty day. I hope you enjoy it.

        Gösta

        JWAM: (Quit Smoking): http://www.SwedesDock.com/smoking
        LDN - A Miracle Drug: http://www.SwedesDock.com/LDN/

        Comment


        • #24
          Array Sort FC3(), TagArray FC1(), FC2()
          I introduced the index concept because I have never been able to have more than one TAGARRAY. The line above gives a syntax error in my version of PB Win 8.04.

          I also left the CALLBACK thing alone because he was providing us with selected text, and one thing at a time frame of mind was operative at my computer.
          Rod
          In some future era, dark matter and dark energy will only be found in Astronomy's Dark Ages.

          Comment


          • #25
            I have never been able to have more than one TAGARRAY.
            Neither has anyone else here, because ARRAY SORT supports zero or one TAGARRAY arraynames.

            The line above gives a syntax error in my version of PB Win 8.04.
            I should sincerely hope so. Not that "syntax error" is terribly helpful text, but at least it tells you something is wrong.

            MCM
            Michael Mattias
            Tal Systems (retired)
            Port Washington WI USA
            [email protected]
            http://www.talsystems.com

            Comment


            • #26
              Michael,
              I was explaining to Gosta why I used the index, hopefully so that Robert could understand why.
              If you look at Robert's code you'll see the line that gives the error comes from there.
              If you read Gosta's post, he doesn't take issue with the line in question.
              I know and I showed why it could not be done the way he had it in his code so that Robert could see that as well. And anyone else, and I guess you did.
              Some newbies have used other languages, some are new to programming.
              Rod
              In some future era, dark matter and dark energy will only be found in Astronomy's Dark Ages.

              Comment


              • #27
                Originally posted by Rodney Hicks View Post
                I introduced the index concept because I have never been able to have more than one TAGARRAY. The line above gives a syntax error in my version of PB Win 8.04.

                ...
                My bad. I just typed without testing. No excuse. Just got carried away with "erudition". {sigh} Apologies to Robert and anyone else anyone who may have been misled. I must have been thinking of DosPlus Basic I used years ago that sorted on a() then b() then c() then ...

                I have seldom, if ever, used TagArray. In PB I usually use a TYPEd array when I sort with the first field as a large text field or use an Index array as Rodney so helpfully pointed out.


                ===============================================
                "Money doesn't make you happy.
                I now have $50 million but I was just as happy
                when I had $48 million."
                Arnold Schwarzenegger
                ===============================================
                It's a pretty day. I hope you enjoy it.

                Gösta

                JWAM: (Quit Smoking): http://www.SwedesDock.com/smoking
                LDN - A Miracle Drug: http://www.SwedesDock.com/LDN/

                Comment


                • #28
                  Well here is my attempt at sorting, this code is not complete but it has the the code to check to see what happens. Redim will be in later.

                  First problem is loading the RC arrays with the file data, that is not working right, when pressing the Col1 sort button I added in main dialog.

                  The sorting also did not work, but first have to solve the data file to array problem.

                  I will see if I can fix my sort code this weekend, if not by Monday. I will also wait for remarks on this code I wrote. Maybe someone will see something I missed.

                  Maybe need to look at index concept or other.

                  Code:
                  CALLBACK FUNCTION File_ColumnSort()
                  LOCAL x AS LONG, S AS STRING, Z AS LONG
                  DIM FC1(TestNR),FC2(TestNR),FC3(TestNR),FC4(TestNR),FC5(TestNR),FC6(TestNR),FC7(TestNR), REC AS TYPEE
                  
                  SELECT CASE CBMSG
                   CASE %WM_COMMAND AND CBCTL = %BU5
                         CONTROL GET TEXT hDlg, %BU5 TO S: Z=1
                   CASE %WM_COMMAND AND CBCTL = %BU6
                         CONTROL GET TEXT hDlg, %BU6 TO S: Z=2
                   CASE %WM_COMMAND AND CBCTL = %BU7
                         CONTROL GET TEXT hDlg, %BU7 TO S: Z=3
                   CASE %WM_COMMAND AND CBCTL = %BU8
                         CONTROL GET TEXT hDlg, %BU8 TO S: Z=4
                   CASE %WM_COMMAND AND CBCTL = %BU9
                         CONTROL GET TEXT hDlg, %BU9 TO S: Z=5
                   CASE %WM_COMMAND AND CBCTL = %BU10
                         CONTROL GET TEXT hDlg, %BU10 TO S: Z=6
                   CASE %WM_COMMAND AND CBCTL = %BU11
                         CONTROL GET TEXT hDlg, %BU11 TO S: Z=7
                  END SELECT
                  
                  
                  FOR x = 1 TO TestNR       '..NR = number of records in file    ..RN = record number
                  GET #5,TestRN,REC
                  FC1(x)=REC.Col1: FC2(x)=REC.Col2: FC3(x)=REC.Col3: FC4(x)=REC.Col4: FC5(x)=REC.Col5
                  FC6(x)=REC.Col6: FC7(x)=REC.Col7
                  NEXT x
                           MSGBOX FC2(1)                        '<<<<<<<<< FC2(1)= R6C2 SHOULD BE R1C2
                  IF Z=1 THEN ARRAY SORT FC1(),TAGARRAY FC2() ,DESCEND
                  IF Z=2 THEN ARRAY SORT FC2(),TAGARRAY FC1() ,DESCEND
                  IF Z=3 THEN ARRAY SORT FC3(),TAGARRAY FC1() ,DESCEND
                  IF Z=4 THEN ARRAY SORT FC4(),TAGARRAY FC1() ,DESCEND
                  IF Z=5 THEN ARRAY SORT FC5(),TAGARRAY FC1() ,DESCEND
                  IF Z=6 THEN ARRAY SORT FC6(),TAGARRAY FC1() ,DESCEND
                  IF Z=7 THEN ARRAY SORT FC7(),TAGARRAY FC1() ,DESCEND
                  
                  FOR x = 1 TO TestNR       'NR = number of records in file    RN = record number
                  REC.Col1=FC1(x): REC.Col2=FC2(x): REC.Col3=FC3(x): REC.Col4=FC4(x): REC.Col5=FC5(x)
                  REC.Col6=FC6(x): REC.Col7=FC7(x)
                  PUT #5,TestRN,REC
                  NEXT x
                  MSGBOX FC2(1)
                  
                  DSPRST_Test_AddEdit
                  END FUNCTION
                  Robert

                  Comment


                  • #29
                    This line
                    Code:
                    GET #5,TestRN,REC
                    because TestRN doesn't change it will read the same record over and over.
                    If you change TestRN to x, the loop variable, it will read the successive records.

                    Gosta, I liked your erudition!
                    Rod
                    In some future era, dark matter and dark energy will only be found in Astronomy's Dark Ages.

                    Comment


                    • #30
                      Code:
                      SELECT CASE CBMSG
                       CASE %WM_COMMAND AND CBCTL = %BU5
                             CONTROL GET TEXT hDlg, %BU5 TO S: Z=1
                       CASE %WM_COMMAND AND CBCTL = %BU6
                             CONTROL GET TEXT hDlg, %BU6 TO S: Z=2
                       CASE %WM_COMMAND AND CBCTL = %BU7
                             CONTROL GET TEXT hDlg, %BU7 TO S: Z=3
                       CASE %WM_COMMAND AND CBCTL = %BU8
                             CONTROL GET TEXT hDlg, %BU8 TO S: Z=4
                       CASE %WM_COMMAND AND CBCTL = %BU9
                             CONTROL GET TEXT hDlg, %BU9 TO S: Z=5
                       CASE %WM_COMMAND AND CBCTL = %BU10
                             CONTROL GET TEXT hDlg, %BU10 TO S: Z=6
                       CASE %WM_COMMAND AND CBCTL = %BU11
                             CONTROL GET TEXT hDlg, %BU11 TO S: Z=7
                      END SELECT
                      This cannot be correct.
                      Code:
                       SELECT CASE CBMSG
                           CASE %WM_COMMAND AND CBCTL = %BU5
                      I think what you mean here is "(If CBMSG = %WM_COMMAND) AND (CBCTL = %BU5)" but I have no clue how the compiler will interpret what you have coded.

                      The 'standard' way to code the situation where you want to react to the WM_COMMAND notification, but what you need to do depends on which control generated that notification would be ...

                      Code:
                       
                      
                        SELECT CASE CBMSG 
                             CASE %WM_COMMAND 
                                   SELECT CASE CBCTL 
                                          CASE %BU5 
                                               do whatever
                      
                                          CASE %BU6 
                                               do whatever
                      
                                          CASE %BU7 
                                               do whatever
                                          .....
                                           CASE other control ID 
                                               whatever
                                  END SELECT   ' of CBCTL (which control sent WM_COMMAND notification) 
                      
                        END SELECT   ' of CBMSG
                      MCM
                      Michael Mattias
                      Tal Systems (retired)
                      Port Washington WI USA
                      [email protected]
                      http://www.talsystems.com

                      Comment


                      • #31
                        Also FWIW, here's a current thread with an example of using an index array (the approach suggested by Mr. Hicks and endorsed by Mr. Lovgren)

                        http://www.powerbasic.com/support/pb...ad.php?t=38085

                        The index array ("subscript()" in linked post) is absolutely the way to go to keep multiple arrays "in synch" whilst sorting.

                        MCM
                        Michael Mattias
                        Tal Systems (retired)
                        Port Washington WI USA
                        [email protected]
                        http://www.talsystems.com

                        Comment


                        • #32
                          Fixed the routine on the "x", and it works better but some small bug is still there. I can now see that the sort only sorts the selected column and all the other array data do not follow the selected sorted array column.

                          I will check out the link on index array.

                          A good database or spread sheet program can sort a column bringing along other data columns, but PB array sort alone seems to not have that ability yet.

                          This thrread has help me understand arrays better than what I knew, now I can set my program addresses using arrays to avoid errors and using the multi arrays for screen displays replaceing many global varibles, helped.

                          Thank eveyone for your help.

                          Code:
                          'have been using this for a while, I will keep an eye on it and make a note on it for any problems
                          
                           CASE %WM_COMMAND AND CBCTL = %BU5
                                 CONTROL GET TEXT hDlg, %BU5 TO S: Z=1
                          Last edited by Robert Alvarez; 1 Aug 2008, 04:26 PM.
                          Robert

                          Comment


                          • #33
                            A good database or spread sheet program can sort a column bringing along other data columns, but PB array sort alone seems to not have that ability
                            The reason you percieve some deficiency here is not because of a deficiency or defect in ARRAY SORT, it's because your design of seven or eight separate arrays is not really your best choice for "records with columns"

                            You could use either....
                            1. A single array of delimited strings (eg each element looks like one record from a comma-separated-values files)
                            OR
                            2. An array of UDTs with separate members for each 'column"

                            You want to sort all "records" by some "column" amd have all the other columns come along? Use the single array of UDTs and it's ridiculously easy:

                            Code:
                            %SIZEOFCOLUMN   =  (some max size)
                            TYPE MyRowType 
                              Column (1: maxcolumns) AS ASCIIZ * %SIZEOFCOLUMN
                            END TYPE 
                            
                              LOCAL/STATIC/GLOBAL/THREADED  MyRow () AS MyRowType 
                              ..
                              REDIM MyRow (number of rows to load  -1 ) 
                            
                              Fill MyRow () 
                            
                              SortColumnNo =  (pick one) 
                            
                              ARRAY SORT MyRow(), _ 
                                 FROM ( (SortColumnNo-1)* %SIZEOFCOLUMN + 1) _ 
                                    TO  (SortColumnNo *  %SIZEOFCOLUMN)
                            Bingo, you're done.

                            MCM
                            Last edited by Michael Mattias; 1 Aug 2008, 05:06 PM.
                            Michael Mattias
                            Tal Systems (retired)
                            Port Washington WI USA
                            [email protected]
                            http://www.talsystems.com

                            Comment


                            • #34
                              Michael has shown you two methods, and I showed you another.
                              It can be done, and if it isn't being done in your code, it is because some other thing in your code is out of whack.

                              The compiler will not find errors where wrong variables are used, if they are of the same type, and something that minor can hold up progress for a long time.

                              In a case like that, it is not the language that is the problem, it is how the language is used. (It usually results in some foul language until solved.)
                              Rod
                              In some future era, dark matter and dark energy will only be found in Astronomy's Dark Ages.

                              Comment


                              • #35
                                > it is not the language that is the problem, it is how the language is used

                                You mean... "It's not the paintbrish, it's the artist?"

                                My Brother!
                                Michael Mattias
                                Tal Systems (retired)
                                Port Washington WI USA
                                [email protected]
                                http://www.talsystems.com

                                Comment


                                • #36
                                  Robert, in a (probably feeble) attempt to atone for my previous egregious erudition, here is yet another way to sort multiple arrays (in addition to Ron's and Mike's fine examples).

                                  '
                                  Code:
                                   
                                  Type Sort_Type
                                    Sort_Field As String * 74 '<<- can be any length long enough to hold all fields
                                    Col1  AS STRING * 10  'Cols from Robert's program
                                    Col2  As String * 30
                                    Col3  As String * 8
                                    Col4  As String * 8
                                    Col5  As String * 8
                                    Col6  As String * 10
                                  End Type
                                   
                                   
                                  Sub Sort_Columns                           
                                    Local Srt() As Sort_Type, x&
                                    Dim Srt(20) '20 used in Robert's program
                                   
                                    For x = 1 To 20             
                                      Srt(x).Col1 = RC(1, x) 'Row Column Array holding string values
                                      Srt(x).Col2 = RC(2, x) '
                                      Srt(x).Col3 = RC(3, x) '
                                      Srt(x).Col4 = RC(4, x) '
                                      Srt(x).Col5 = RC(5, x) '
                                      Srt(x).Col6 = RC(6, x) '
                                   
                                      'now place in order of sort wanted
                                      Srt(x).Sort_Field = RC(3, x) & _
                                                          RC(4, x) & _
                                                          RC(1, x) & _
                                                          RC(2, x) & _
                                                          RC(6, x) & _
                                                          RC(5, x) 
                                    Next x                      
                                   
                                    'Sort the array 
                                    Array Sort  Srt()
                                   
                                    'Now put the sorted values back in Row Column Array
                                    For x = 1 To 20
                                       RC(1, x) = Srt(x).Col1
                                       RC(2, x) = Srt(x).Col2
                                       RC(3, x) = Srt(x).Col3
                                       RC(4, x) = Srt(x).Col4
                                       RC(5, x) = Srt(x).Col5
                                       RC(6, x) = Srt(x).Col6
                                    Next x
                                   
                                  End Sub
                                  '
                                  Note this can also be used to sort numeric values via the PB Using$ function in the Sort_Field.

                                  Not a painting perhaps, but ...

                                  =======================================
                                  "The great tragedy of science
                                  the slaying of a beautiful hypothesis
                                  by an ugly fact."
                                  Thomas Huxley
                                  =======================================
                                  It's a pretty day. I hope you enjoy it.

                                  Gösta

                                  JWAM: (Quit Smoking): http://www.SwedesDock.com/smoking
                                  LDN - A Miracle Drug: http://www.SwedesDock.com/LDN/

                                  Comment


                                  • #37
                                    Of course, if you wanted to use an array of UDTs with variable-size members, sorting by one of those members is also ridiculously easy - assuming you can master 'cut and paste':

                                    CC3/Win7: ARRAY SORT UDT array on member name September 04, 2002

                                    MCM
                                    Michael Mattias
                                    Tal Systems (retired)
                                    Port Washington WI USA
                                    [email protected]
                                    http://www.talsystems.com

                                    Comment


                                    • #38
                                      It seems to me Robert (and perhaps others) are having a little difficulty grasping the concept of sorting and keeping together multiple arrays. My guess is English is not his first language and that complicates things further. He would miss some of the subtle ironies posted. Heck, I miss them myself.

                                      I posted the humble example (clearly feeble, even laughable) using a UDT (as closely as I reasonably could) with Robert's own variables in hopes that may make things clearer for *him*. Not in any way implying it is a superior method, or even equal, or even remotely in the same league, or should in any way emulated. Only as a stepping pebble on the road to the high level of coding sophistication on display in this forum.

                                      ======================================
                                      "A miser isn't much fun to live with,
                                      but he makes a wonderful ancestor. "
                                      Anonymous
                                      ======================================
                                      It's a pretty day. I hope you enjoy it.

                                      Gösta

                                      JWAM: (Quit Smoking): http://www.SwedesDock.com/smoking
                                      LDN - A Miracle Drug: http://www.SwedesDock.com/LDN/

                                      Comment


                                      • #39
                                        Until fairly deep in this thread, I did not infer that all those separate arrays were actually representing "columns of a row" or "fields of a record" and that all that sorting was being done so that ALL arrays would ALWAYS be exactly parallel.

                                        And the starting point, with its 1,280,000,000 element array only pushed me further away from that conclusion.

                                        It's a lot easier to create code given the application than to create the application given some code.
                                        Michael Mattias
                                        Tal Systems (retired)
                                        Port Washington WI USA
                                        [email protected]
                                        http://www.talsystems.com

                                        Comment


                                        • #40
                                          Robert has thanked us for the help we offered, which to me indicates that he thinks he has enough to carry on in his style.
                                          If you're right Gosta, about English not being his first language, then PB will be at least his third, and good for Robert.
                                          Michael has provided some stones to our pebbles and with all help provided here, Robert can develop himself into the kind of 'painter' he wants to be, at his own speed of course.
                                          Methinks we have done well.
                                          Rod
                                          In some future era, dark matter and dark energy will only be found in Astronomy's Dark Ages.

                                          Comment

                                          Working...
                                          X