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

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

    Thấy các bác tranh luận lung tung quá, đang từ cái này lại nhảy sang cái nọ, để xem yêu cầu cụ thể của bài toán là cái gì, rồi xác định phương pháp cho phù hợp. Chứ ko nhất thiết phải dùng những thứ quá cao siêu vội.
    Last edited by ThangNT; 22-11-2005, 11:52 AM.

    Ghi chú


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

      ThangNT ơi, vấn đề hay đấy chứ. Đây là thuộc về kỹ thuật tin học mà, nếu giải quyết được thì sẽ rất thuận tiện cho việc code các vấn đề khác. Mình sẽ thử dùng Delphi để làm đã.

      Ghi chú


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

        Tôi không dùng Delphi mà lại dùng C++, thì trong C++ (hay C) có hàm malloc() (tức là ban cho một bộ nhớ động), rồi thì dùng pointer (con trỏ) mà đọc từng phần tử. Ðến khi nhỡ đọc hay ghi đến cái cuối cùng thì chỉ có nước mở một bộ nhớ động khác, chuyển dữ liệu vào, trong C có hàm realloc() cho phép tăng bộ nhớ mà vẫn giữ dữ liệu cũ.
        Bạn hãy tìm hàm tương đương như vậy đi. Delphi giống C lắm.

        Ghi chú


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

          Nguyên văn bởi sunhero
          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ĩ?
          Hi,

          Tôi không xem hết toàn bộ đoạn code của bạn, riêng phần Combo ma bạn hỏi thì để tạo một danh sách động trong DELPHI, cách đơn giản nhất là dùng TList, cách khai báo như sau:

          Combo = Record
          Name:string;
          design:Boolean;
          comb:Tlist;
          end;

          aloadcase : ^load
          Khi sử dụng cần khởi động biến comb
          comb := TList.Create;
          alo
          Mỗi khi cần chèn vào một tổ hợp mới,
          New(aloadcase) // cấp phát bộ nhớ cho một trường hợp tải
          comb.Add(aloadcase) ; // them một trường hợp tải vào danh sách để lưu trữ.

          Bạn tìm hiểu thêm về Tlist thì sẽ rõ, ngoài ra cũng nên vào sourceForge.net để download bộ VLC của Systool về mà dùng. Trong đó có rất nhiều kiểu dữ liệu container.

          Chúc thành công.
          Casa

          Ghi chú


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

            Nếu bạn sunhero chỉ viết một đoạn code thôi thì dùng VB6 trở lên là dễ nhất. Chỉ cần khai báo trước một mảng (không cần định kích thước) rồi thay đổi lại bất cứ lúc nào mình muốn bao nhiêu lần cũng được. VB.NET càng dễ hơn.

            Code cho VB6:
            Dim arrSample() As ...
            ReDim [preserve] arrSample(m,n,q)

            Hoặc
            ReDim arrSample(m,n,q) As ...
            ReDim [preserve] arrSample(m',n',q')

            Nếu dùng từ khóa [preserve] thì khi mảng bị thu bé hay làm to kích thước phần nội dung tương ứng trong mảng cũ sẽ được vẫn được giữ nguyên.
            Last edited by morpheus; 31-03-2006, 12:57 PM.

            Ghi chú


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

              Nguyên văn bởi sunhero
              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
              Tôi cũng đồng ý với ý kiến của Kidsmart1981 Visual Studio luôn là một bộ PM lập trình xuất sắc. Không có gì mà các ngôn ngữ khác làm được mà VS lại không làm được chỉ có điều ngược lại là không đúng thôi. Đây là công cụ mà hầu khắp dân chuyên đều lựa chọn. Bằng chứng là MIDAS cũng được lập bằng VC++ đấy thôi. Còn .NET thì vô địch . Tôi xin trích dẫn yêu cầu tuyển dụng của Midas :

              Software development : Visual C++, Visual Basic, ASP, JAVA, DB, structural analysis and design
              Specialization : bridge and/or building structural engineering and geotechnical engineering
              Technical marketing and user support

              Ghi chú


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

                Nguyên văn bởi morpheus
                Nếu bạn sunhero chỉ viết một đoạn code thôi thì dùng VB6 trở lên là dễ nhất. Chỉ cần khai báo trước một mảng (không cần định kích thước) rồi thay đổi lại bất cứ lúc nào mình muốn bao nhiêu lần cũng được. VB.NET càng dễ hơn.

                Code cho VB6:
                Dim arrSample() As ...
                ReDim [preserve] arrSample(m,n,q)

                Hoặc
                ReDim arrSample(m,n,q) As ...
                ReDim [preserve] arrSample(m',n',q')

                Nếu dùng từ khóa [preserve] thì khi mảng bị thu bé hay làm to kích thước phần nội dung tương ứng trong mảng cũ sẽ được vẫn được giữ nguyên.
                VC++ có làm được kiểu như VB này không các bác ơi! Nếu có thì nó hơn Delphi ở chỗ này đấy.
                Midas hình như chỉ dùng VC++ làm giao diện thôi (tôi dùng hình như ở đây vì k tìm thấy chữ C++ trong file exe của nó, k biết có nhầm k). Còn phần chạy chắc chắn vẫn dùng Fortran mà.
                Last edited by hien nghiem; 31-03-2006, 03:15 PM.

                Ghi chú


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

                  Nguyên văn bởi hien nghiem
                  VC++ có làm được kiểu như VB này không các bác ơi! Nếu có thì nó hơn Delphi ở chỗ này đấy.
                  Midas hình như chỉ dùng VC++ làm giao diện thôi (tôi dùng hình như ở đây vì k tìm thấy chữ C++ trong file exe của nó, k biết có nhầm k). Còn phần chạy chắc chắn vẫn dùng Fortran mà.
                  VC++ đi từ cái gốc của nó là C thì có hàm realloc() cho phép ta tạo mãng mới lớn hơn mà vẫn giữ nguyên nội dung cũ.

                  Ghi chú


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

                    Nguyên văn bởi morpheus
                    ..Bằng chứng là MIDAS cũng được lập bằng VC++ đấy thôi. Còn .NET thì vô địch . Tôi xin trích dẫn yêu cầu tuyển dụng của Midas :

                    Software development : Visual C++, Visual Basic, ASP, JAVA, DB, structural analysis and design
                    Specialization : bridge and/or building structural engineering and geotechnical engineering
                    Technical marketing and user support
                    Các phiên bản mới của MIDAS giao diện viết bằng VS.NET, tổ chức giao diện cũng như một IDE luôn, lõi phân tích kết cấu vẫn bằng FORTRAN, khi chạy thỉnh thoảng thấy mấy chữ... . Đồ họa không dùng của Vector Draw nữa mà dùng thư viện OpenGL. Có thể thấy điều này ở bản Gen, Civil 2006 và GTS 1.5.

                    Ghi chú


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

                      Trong Delphi, để phát sinh biến động thì tôi thường dùng hàm Getmem().
                      Còn làm như VB thi chịu, thay đổi kich thước mảng cũng dùng Getmem() nhưng nội dung cũ thì mất.

                      Ghi chú


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

                        Nguyên văn bởi hien nghiem
                        Trong Delphi, để phát sinh biến động thì tôi thường dùng hàm Getmem().
                        Còn làm như VB thi chịu, thay đổi kich thước mảng cũng dùng Getmem() nhưng nội dung cũ thì mất.
                        VC++ thì không làm đơn giản như VB được. Nhưng có rất nhiều cách để tạo 1 mảng động mà sau khi resize nội dung cũ sẽ không mất. Getmem mà anh hien nghiem làm có tác dụng tương tự như cấp phát malloc của VC++ tức là allocate 1 mem block mới. Nhưng VC++ còn cung cấp thêm realloc để reallocate cái mem block đã được tạo. Có những cách khác để tạo mảng động nhưng chung quy lại thì là tạo 1 lớp đóng vai trò của một mảng, trong lớp đó sẽ cung cấp phương thức resize. Trong MFC cũng cung cấp 1 lớp gọi là "OLE SAFEARRAY" cũng có phương thức resize. Không biết là cái OLE SAFEARRAY này hoạt động thế nào nhưng tôi cũng thử đua đòi tạo 1 lớp với trình độ thiếu nhi là khi resize sẽ tạo 1 temparray có kích thước như yêu cầu rồi gán lại giá trị của mảng hiện thời, với kích thước mảng vừa phải thì chạy cũng tốt.
                        Theo ý kiến của tôi thì dùng realloc như anh Thu là hay nhất, không biết là có gì khác hơn dễ dùng hơn không? Tôi xin phép được post 1 đoạn code do mấy thằng tây viết làm ví dụ bằng C++ sử dụng realloc:

                        #include <stdlib.h>
                        #include <string.h>
                        #include <stdio.h>

                        int main(void)
                        {
                        char* array;

                        array = (char*) malloc(sizeof(char)*6);
                        // allocate 5 chars for "Hello" + 1 char for null termination = 6 chars

                        /*
                        The malloc function allocates a number of bytes.
                        So if you for example want an array of integers, use sizeof(int) instead.
                        It returns a void-pointer (void*), which you must typecast to the pointer you are using.
                        */

                        strcpy(array,"Hello"); // fill the array with data

                        printf("%s\n",array);

                        array = (char*) realloc(array, sizeof(char)*11); // change the size
                        /*
                        This works the same way as malloc, except that you put in the array as parameter too.
                        */

                        strcat(array," World"); // add more data

                        printf("%s\n",array);

                        free(array); // Deallocate memory. Must be done!
                        getchar();
                        return 0;
                        }

                        Ghi chú


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

                          Nguyên văn bởi tnlinh
                          Các phiên bản mới của MIDAS giao diện viết bằng VS.NET, tổ chức giao diện cũng như một IDE luôn, lõi phân tích kết cấu vẫn bằng FORTRAN, khi chạy thỉnh thoảng thấy mấy chữ... . Đồ họa không dùng của Vector Draw nữa mà dùng thư viện OpenGL. Có thể thấy điều này ở bản Gen, Civil 2006 và GTS 1.5.
                          Hì hì, xin lỗi anh Linh nhé. Anh là đại sứ truyền bá MIDAS sang việt Nam thì dĩ nhiên là anh sẽ nắm rõ tình hình rồi. Tôi sẽ tìm hiểu kỹ vấn đề này vậy.

                          Ghi chú


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

                            Đúng là phần nhân tính toán của MIDAS vẫn được viết bằng FORTRAN thật. Tôi vừa cập nhật lại thông tin chính thức từ một đồng chí Midas user support xong. Thành thật xin lỗi bà con lối xóm.

                            Ghi chú


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

                              Nguyên văn bởi morpheus
                              Đúng là phần nhân tính toán của MIDAS vẫn được viết bằng FORTRAN thật. Tôi vừa cập nhật lại thông tin chính thức từ một đồng chí Midas user support xong. Thành thật xin lỗi bà con lối xóm.
                              Có thể liệt kê một số phần mềm có phần giao diện và phần chạy như sau (xin lỗi các bác hơi lạc đề một chút):
                              SAP2000: giao diện VB + chạy fortran
                              Plaxis: Giao diện Delphi + chạy fortran
                              STAADPro: ngày trước C++, bây giời k rõ, hình như vẫn C++
                              Geo-Slope: C++
                              Risa3D: VC++
                              Sage Crisp: Giao diện VB, chạy Fortran
                              LS-Dyna: Giao diện C++, chạy Fortran
                              Còn Ansys, Abaqus, Larsa tôi k được rõ.
                              Như vậy C++ làm giao diện và chạy bằng fortran chiếm đa số

                              Ghi chú


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

                                Hi all!

                                Để giải quyết vấn đề mảng động này thì đơn giản bạn nên nghĩ tới việc dùng danh sách liệt kê kiểu biến con trỏ là được thôi!
                                Trong ngôn ngữ lập trình nào cũng vậy đều có cơ chế này hết!

                                Còn vấn đề tính toán kỹ thuật thì đương nhiên có thể viết bằng ngôn ngữ nào cũng được. Tuy nhiên để tính toán số cho các phương trình phức tạp thì hiện nay Fortran làm kernel cho các bài toán kỹ thuật nhúng vào các ngôn ngữ lập trình khác rất tốt vì chạy nhanh hơn MATLAB v.v (mà anh chàng này lại bắt đầu chuyển hướng sang dùng kernel Java vốn tương đối chậm).

                                Chào thân ái!
                                Last edited by nntien; 06-10-2006, 04:35 PM.

                                Ghi chú

                                Working...
                                X