Announcement

Collapse
No announcement yet.

[HELP] Chỉ số trong mảng?

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

  • [C++] [HELP] Chỉ số trong mảng?

    Vào thẳng vấn đề luôn , chỉ số trong mảng có nhất thiêt phải bắt đầu từ 0 không ạ, vì tình hình là em toàn cho chạy từ 1 cho tiện, và vẫn chạy ngon lành không thấy lỗi phải gì cả
    Không có gì mà ta không biết:boss:
    Chỉ có những điều ta chưa biết

  • #2
    Originally posted by 12520436 View Post
    Vào thẳng vấn đề luôn , chỉ số trong mảng có nhất thiêt phải bắt đầu từ 0 không ạ, vì tình hình là em toàn cho chạy từ 1 cho tiện, và vẫn chạy ngon lành không thấy lỗi phải gì cả
    PHP Code:
        int a[5];
        
    int i;
        for (
    1<= 5; ++i)
            
    a[i] = i;
        for (
    1<= 5; ++i)
            
    printf("%d\n"a[i]); 
    Bạn thử test xem nó có lỗi hay không là biết ngay mà.
    Top Best Online - The Best Products Review Website

    Comment


    • #3
      Tất nhiên là chỉ số mảng luôn đc đánh từ [0 ... n-1] với n là số phần tử của mảng.

      Còn bạn xài thì miễn nằm trong khoảng đó thì OK,không lỗi.
      Nhưng không nên thế . viết Code để sau này dễ bảo trì , phát triển, để người khác còn tiếp thu nữa chứ.

      Im a british accent lover

      Comment


      • #4
        nguyên nhân cái này có lẽ do Pascal . ...tốt nhất là nên tập dần...

        Comment


        • #5
          Nên xét từ 0 đi bạn, vì nếu xét từ 1 sẽ phí một ô nhớ mà việc phí phạm vùng nhớ sau này sẽ gây hậu quả nặng nề đó bạn. Sau này code các phần mềm lớn thì cần phải tiết kiệm tối đa vùng nhớ nên bạn hãy tập dần đi bạn..:sogood:

          Comment


          • #6
            nếu như bạn xét trong khoảng từ 0..n-1 thì k ảnh hưởng gì(như anh Tuấn Anh đã nói),nhưng hãy xem đoạn code sau:
            Code:
            int a[5]
            for(int i=1;i<=5;i++)
            a[i]=i;
            đoạn code này tuy chạy bình thường nhưng thực tế đã có lỗi,do mảng được đánh từ 0...n-1,ở đây sẽ là 0..4,như vậy nếu bạn lưu a[5]=i thì đã vượt khỏi chỉ số của mảng,lúc này nó sẽ lấy một ô nhớ free bất kỳ để dùng tạm,chẳng may nếu có việc gì cần đến ô nhớ này thì sẽ bị mất dữ liệu,mặc dù IDE k bắt lỗi nhưng tránh dùng như thế để đảm bảo an toàn dữ liệu đồng thời tiết kiệm bộ nhớ với những phần mềm lớn.

            Comment


            • #7
              Originally posted by 11520154 View Post
              nếu như bạn xét trong khoảng từ 0..n-1 thì k ảnh hưởng gì(như anh Tuấn Anh đã nói),nhưng hãy xem đoạn code sau:
              Code:
              int a[5]
              for(int i=1;i<=5;i++)
              a[i]=i;
              đoạn code này tuy chạy bình thường nhưng thực tế đã có lỗi,do mảng được đánh từ 0...n-1,ở đây sẽ là 0..4,như vậy nếu bạn lưu a[5]=i thì đã vượt khỏi chỉ số của mảng,lúc này nó sẽ lấy một ô nhớ free bất kỳ để dùng tạm,chẳng may nếu có việc gì cần đến ô nhớ này thì sẽ bị mất dữ liệu,mặc dù IDE k bắt lỗi nhưng tránh dùng như thế để đảm bảo an toàn dữ liệu đồng thời tiết kiệm bộ nhớ với những phần mềm lớn.
              Đính chính cho em một tí là nó sẽ lấy ô nhớ ngay kế bên ô a[4] để dùng chứ không phải ô bất kỳ. Nếu ô này chưa được dùng thì chương trình sẽ chạy tiếp bình thường, nhưng nếu ô này được dùng bởi chương trình khác đang chạy trong máy thì em sẽ gặp lỗi access violation, lỗi này chạy khi gặp khi không, thoắt ẩn thoắt hiện biến hóa khôn lường nên tốt nhất là đừng để chạm trán nó.

              Dĩ nhiên nếu các bạn khai báo mảng 5 phần tử nhưng chỉ xài 4 phần từ từ 1->4 thay vì 5 phần tử từ 0->4 cũng không gặp lỗi phải gì cả. Chương trình vẫn chạy, nhưng cái đó không tiện chỗ nào cả. Thứ nhất là nó lãng phí 1 ô nhớ, nhưng cái nghiên trọng hơn là làm vậy nó không giống ai, người ngoài nhìn vào sẽ khó hiểu.

              Tại sao không dùng phần tử thứ 0 ? Có gì đặc biệt ở chỗ đó ? Lỡ ghi vào đó thì có chuyện màu nhiệm gì xảy ra không? Sau này các bạn viết chương trình chung với rất nhiều người, code phải để cho nhiều người cùng đọc chứ đừng làm mọi người có cớ nghi ngờ trình độ lập trình của bạn vì những cái kỳ quặc không đáng như vầy.
              Last edited by sinhvien.uit; 23-12-2012, 21:01.

              Comment


              • #8
                Sau một hồi tra bác google có nhiều đáp án, bạn thấy cái nào thuyết phục thì get nó zìa, đi kèm là ví dụ A[5] -> mảng A có 5 phần tử
                • A[0] -> index ở đây cho biết số bước mà mình phãi trỏ tới bộ nhớ, số 0 ư -> ko cần phãi di chuyển đi đâu cả, cứ nằm yên ở vị trị bắt đầu mảng, A[1] -> số 1 ư -> nhảy 1 bước, tính từ vị trị bắt đầu mảng là tới nó. Nếu ko bắt đầu từ 0 -> oke, ko sao, nhưng lảng phí hết vài byte cho vị trí bắt đầu của mảng -> chống lãng phí.

                • Tại sao lại là 0 mà ko phãi 1 -> oke hãy xét vòng lặp for đi kèm với mảng "(for int i = 0 ; i< count(array); i++ )" -> câu lệnh kinh điển của dân IT, hãy xét 2 trường hợp:
                  • (for int i = 0 ; i< count(array); i++ ) -> i bắt đầu từ 0 tương ứng là 000 -> 3 số 0 tượng trưng cho 3 dòng điện có Volt thấp
                  • (for int i = 1 ; i< count(array); i++ ) -> i bắt đầu từ 1 tương ứng là 001 -> 2 số 0 và 1 số 1 tượng trưng cho 2 dòng điện có Volt thấp và 1 dòng điện có Volt cao

                  -> chống lãng phí điện năng

                • Xét tiếp vòng for -> Máy tính của chúng ta có một đặc điểm rất vui là nó luôn bắt đầu từ 0, ví dụ khi khai báo int i = 1 thì tương đương 2 câu lệnh nhỏ sau đây
                  • int i = new int();
                  • i = 1;

                • Còn nếu khai báo int i = 0 thì tương đương zới 1 câu lệnh nhỏ sau đây
                  • int i = new int();


                  -> Có thể tối ưu hóa tốc độ
                Last edited by 09520147; 24-12-2012, 00:05.

                Comment


                • #9
                  Originally posted by 09520147 View Post
                  [/list][*] Tại sao lại là 0 mà ko phãi 1 -> oke hãy xét vòng lặp for đi kèm với mảng "(for int i = 0 ; i< count(array); i++ )" -> câu lệnh kinh điển của dân IT, hãy xét 2 trường hợp:
                  • (for int i = 0 ; i< count(array); i++ ) -> i bắt đầu từ 0 tương ứng là 000 -> 3 số 0 tượng trưng cho 3 dòng điện có Volt thấp
                  • (for int i = 1 ; i< count(array); i++ ) -> i bắt đầu từ 0 tương ứng là 001 -> 2 số 0 và 1 số 1 tượng trưng cho 2 dòng điện có Volt thấp và 1 dòng điện có Volt cao

                  -> chống lãng phí điện năng
                  Tôi không thấy sự hợp lý trong cách giải thích này? Từ nguồn nào em có được thông tin đó?

                  [*] Xét tiếp vòng for -> Máy tính của chúng ta có một đặc điểm rất vui là nó luôn bắt đầu từ 0, ví dụ khi khai báo int i = 1 thì tương đương 2 câu lệnh nhỏ sau đây
                  • int i = new int();
                  • i = 1;

                  [*]Còn nếu khai báo int i = 0 thì tương đương zới 1 câu lệnh nhỏ sau đây
                  • int i = new int();


                  -> Có thể tối ưu hóa tốc độ [/LIST]
                  Tôi thấy cái này không có vẻ gì giống C/C++ cả, nguồn đâu em?

                  Comment


                  • #10
                    Xét tiếp vòng for -> Máy tính của chúng ta có một đặc điểm rất vui là nó luôn bắt đầu từ 0, ví dụ khi khai báo int i = 1 thì tương đương 2 câu lệnh nhỏ sau đây

                    int i = new int();
                    i = 1;
                    [*]Còn nếu khai báo int i = 0 thì tương đương zới 1 câu lệnh nhỏ sau đây

                    int i = new int();


                    -> Có thể tối ưu hóa tốc độ
                    int i=1; // nằm trên stack
                    int i =new int(); i=1; // vãi cả code . vãi cả tương đương

                    Im a british accent lover

                    Comment


                    • #11
                      lâu lâu chém tý à, ko ngờ ăn gạch nhiều ghê :sexy:
                      Last edited by 09520147; 24-12-2012, 12:10.

                      Comment


                      • #12
                        Mãng thì nên bắt đầu từ 0. Đơn giản vì trong toán học, tin học,... khi nói về mảng, ma trận, đều xuất phát từ 0. Nó tạo ra một sự đồng bộ khi làm việc nhóm...

                        Comment

                        LHQC

                        Collapse
                        Working...
                        X