QUẢNG CÁO ĐẦU TRANG

Collapse

Thông báo

Collapse
No announcement yet.

phát sinh biến động trong delphi

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • phát sinh biến động trong delphi

    Tôi đã thử viết đoặn code tổ hợp nội lực như của thằng Sap2000 nhưng khi tạo các tổ hợp thì vướng phải chuyện phát sinh biến động (dynamic array) và đang bí chổ này,bác nào đã từng xem xét vấn đề này thì có thể chỉ giáo cho đệ vài điều.Thanks

  • #2
    Ðề: phát sinh biến động trong delphi

    Tôi chưa rõ lắm về ý của bạn, nhưng trong hầu hết các ngôn ngữ lập trình thì biến mảng (array) cần phải xác định được rõ kích thước khi khởi tạo(cần phân biệt khái niệm khởi tạo với khai báo), kích thước mảng là những thông tin cần thiết để hệ điều hành cấp phát bộ nhớ (để...hold data) cho các giá trị của các phần tử mảng.
    Nếu bạn muốn sử dụng những cấu trúc động nhưng gần với mảng hơn... bạn lên sử dụng những cấu trúc thông minh hơn như ArrayList trong NET framework. Bạn cũng có thể Override Array - Class của ngôn ngữ bạn đang dùng theo thiết kế Array bạn mong muốn, đây là cách làm thông dụng và quen thuộc nhất.

    Ghi chú


    • #3
      Ðề: phát sinh biến động trong delphi

      nếu nói về biến mảng trong tất cả các nn thì tui cũng đã nghiên cứu rất kỹ từ khá lâu,tuy nhiên ở đây là vấn đề mình muốn tìm một thuật tóan để code lại như kiểu th thằng sap nó đã làm,có nghĩa là có thể phát sinh các cặp tổ hợp trong quá trình tính tóan mà ko phải ngắn mặc định ngay từ ban đầu. Tạm phân tích như sau:
      Khởi tạo một bản ghi : (M,N,Q,Mặt cắt,h,b...)
      mỗi bản ghi lấy kết quả nội lực và mặt cắt tương ứng của từng trường hợp tải.

      type

      Joints = Record
      ID:integer;
      x,y,z:Real;
      end;

      Combs = Record
      Rel,P,V2,V3,T,M2,M3:Real;
      end;

      Segs = Record
      Comb:Combs;
      end;

      Frames = Record
      ID:integer;
      L:real;
      Kind:Boolean;
      jF,jS,nSeg:integer;
      Jxyz1,Jxyz2:Joints;
      Seg:array of Segs;
      h,b,J,Ih,Ib,Ang:Real;
      sec:string;
      end;

      SectionKind=Record
      ID:integer;
      NAME,MAT:string;
      SH:string;
      h,b,A,J,Ih,Ib:real
      end;

      LoadKind = Record
      ID:integer;Name,Kind:String
      end;
      Load=Record
      Name:string;
      scale:real;
      P,V2,V3,T,M2,M3:Real;
      end;
      Combo = Record
      Name:string;
      design:Boolean;
      comb:array of Load;
      end;

      .............


      Trong quá trình tổ hợp ta ko thể xác định được bao nhiêu cặp tổ hợp nội lực phát sinh,tức là ko biết bao nhiêu record (kiểu như trên) được phát sinh (tạm thời).Để làm được điều này ta phải khai báo 1 mảng động kiểu bản ghi...
      Mình đang vướng chổ này đấy,ko biết pác có hiểu ý mình ko nhĩ?

      Ghi chú


      • #4
        Ðề: phát sinh biến động trong delphi

        Vấn đề của bạn dùng ArrayList của .NET là thích hợp nhất(cũng có thể sử dụng Colection). Tôi nói qua về ArrayList: Các thành phần trong một ArrayList không bắt buộc phải có cùng một kiểu, số lượng phần tử không phải khai báo trước, truy cập đến các phần tử tương tự như với mảng.
        Tôi ví dụ:
        ArrayList myArraylist = new Arraylist();
        myArraylist.Add(int 6);
        myArraylist.Add(string "test");
        Console.WriteLine(myArrayList[1]);// Output will be "test"
        Console.Writeline(myArrayList[0]);//Output will be 6
        ////
        Như bạn thấy mỗi khi một phần tử được Add vào ArrayList nó sẽ được cấp phát một chỉ số(theo thứ tự tăng dần - mặc định); cũng có thể chỉ định add phần tử này vào vị trí được chỉ định sẵn trong ArrayList. Sau đó các phần tử được truy cập thông qua chỉ số, các phần tử vẫn có kiểu đặc trưng ban đầu(không cần phải cùng kiểu với các phần tử khác.
        Để có những điều này bạn phải làm việc với Microsoft .NET Framework.

        Ghi chú


        • #5
          Ðề: phát sinh biến động trong delphi

          ...Nói thêm,kiểu của mỗi phần tử trong ArrayList có thể là những kiểu có sẵn hoặc là bất kỉ đối tượng người dùng định nghĩa nào khác(Mapping các Table trong database thành các Object...sau đó xử lý, thao tác trong ArrayList ==> lưu lại thay đổi về database... )

          Ghi chú


          • #6
            Ðề: phát sinh biến động trong delphi

            ở đây ko phải sử dụng cấu trúc gì để code mà tôi đang kẹt ở chổ phát sinh biến động khi chạy ctrình
            Last edited by sunhero; 18-11-2005, 05:26 PM.

            Ghi chú


            • #7
              Ðề: phát sinh biến động trong delphi

              Bạn nói thế là ý gì? Từ việc hiểu kỹ về ngôn ngữ mình dùng (bao gồm cả khả năng, hạn chế...) bạn sẽ kiểm soát được những gì sẽ thực thi(run time). Tôi minh họa đoạn code trên(bằng C#) ý muốn nói, ArrayList của Microsoft.NET Framework có khả năng như một "mảng động". Ngôn ngữ ở đây là dựa trên framework cụ thể (.NET), nếu bạn dùng ngôn ngữ khác(ngôn ngữ ko hỗ trợ .NET) thì bạn không có ArrayList để sử dụng. Khi đó bạn phải xây dựng một YourArrayClass theo mục đích của bạn(cái này cần kiến thức, tư duy về Class design. Nhưng theo chủ quan tôi, tự tạo một Class "mảng động" không đơn giản).

              Ghi chú


              • #8
                Ðề: phát sinh biến động trong delphi

                tôi đang thử làm cái đó trên Delphi 7.0 nhưng chưa được,tòan bộ tôi code trên delphi. Ms.Net tôi có biết tuy nhiên nếu sử dụng.Net dể code về kt tính tóan theo ngu ý của tôi là ko phù hợp lắm

                Ghi chú


                • #9
                  Ðề: phát sinh biến động trong delphi

                  Ban thu neu vai ly do ban cho la khong hop ly cua .NET xem nao(dung qua chu quan ve ...nhung gi minh ko biet). Neu ban chi quen thuoc voi delphi va van muon su dung ArrayList cua .NET ===> dung phien ban Delphi co ho tro .NET.
                  C# la mot ngon ngu het suc tu nhien, huong doi tuong, nhat quan...do do co the duoc su dung trong nhieu linh vuc, van de ...

                  Ghi chú


                  • #10
                    Ðề: phát sinh biến động trong delphi

                    Ko hiểu ý bác sunhero lắm, bác hỏi cái "phát sinh biến động" là thế nào? Nếu bác muốn hỏi việc sử dụng biến động thì như sau:
                    1: Khai báo
                    Var MyArr: Array of baseType
                    2: Khi sử dụng, muốn dùng bao nhiêu phần tử thì dùng hàm SetLength:
                    SetLength(MyArr, 100)
                    Delphi sẽ cấp phát 1 mảng MyArr 100 phần tử từ 0-99
                    3: Khi ko dùng nữa thì giải phóng mảng:
                    MyArr:=nil
                    4: Nếu sau này bác lại cần 500 phần tử thì lại Setlength lại 500, sử dụng xong lại gán nó bằng Nil...
                    Cứ thế có sao đâu nhỉ ???

                    Ghi chú


                    • #11
                      Ðề: phát sinh biến động trong delphi

                      To babaTQ: Thực ra mình hiểu thì sunhero không hỏi thế đâu. Có phải là cách xử lý mảng động mà thành phần của nó cũng động không? Mảng động trong Delphi thực chất vẫn là sử dụng con trỏ mà.

                      Ghi chú


                      • #12
                        Ðề: phát sinh biến động trong delphi

                        Có thể đặt câu hỏi theo cách khác. Là làm thế nào để viết code tổ hợp tải trọng. Các bác xử lý giúp.

                        Ghi chú


                        • #13
                          Ðề: phát sinh biến động trong delphi

                          Nếu khó khăn quá thì bác dùng đối tượng collection đi. Nhưng cái này chạy với dữ liệu lớn thì ko biết có ổn ko

                          Ghi chú


                          • #14
                            Ðề: phát sinh biến động trong delphi

                            Thày Linh ơi! Nghe các thày nói em chẳng hiểu gì cả . Hay là thày cứ cho cái input và output cụ thể đi, em code bằng Turbo Pascal nhé

                            Ghi chú


                            • #15
                              Ðề: phát sinh biến động trong delphi

                              Nguyên văn bởi babaTQ
                              Ko hiểu ý bác sunhero lắm, bác hỏi cái "phát sinh biến động" là thế nào? Nếu bác muốn hỏi việc sử dụng biến động thì như sau:
                              1: Khai báo
                              Var MyArr: Array of baseType
                              2: Khi sử dụng, muốn dùng bao nhiêu phần tử thì dùng hàm SetLength:
                              SetLength(MyArr, 100)
                              Delphi sẽ cấp phát 1 mảng MyArr 100 phần tử từ 0-99
                              3: Khi ko dùng nữa thì giải phóng mảng:
                              MyArr:=nil
                              4: Nếu sau này bác lại cần 500 phần tử thì lại Setlength lại 500, sử dụng xong lại gán nó bằng Nil...
                              Cứ thế có sao đâu nhỉ ???
                              Ý của bạn sunhero đâu phải thế, như bạn nói ở trên thì đâu có gì gọi là..."động" đâu. Vấn đề là trong một mảng, các phần tử của nó có thể thêm vào - bỏ ra trong khi vẫn còn "một số phần tử khác" (không phải làm Null mảng...rồi set lại kích thước ---> điều này thực sự như việc tạo một mảng mới rồi.)
                              Bác tnling nói mảng được khởi tạo qua pointer....vậy thì lúc khởi tạo cần phải có pointerTable để giữ chỗ cho nó (nghĩa là vẫn phải biết kích thước). Tôi muốn nói các Array - Class cơ bản trong hầu hết các ngôn ngữ đều...không động (theo cách nói ở trên). Nên nếu muốn có Array động ta phải sử dụng (hay tự tạo ) các cấu trúc phức tạp hơn như ArrayList (của .NET). Một minh họa quen thuộc về mảng động với người biết về MFC là các đối tượng ListBox.

                              Ghi chú

                              Working...
                              X