Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 15
  1. #1
    Tham gia
    23-05-2007
    Bài viết
    684
    Like
    0
    Thanked 5 Times in 4 Posts

    Tạo mảng có n phần tử bất kì - khó với C

    Có lẽ đọc đề bài ai cũng nghĩ đến việc dùng scanf để đọc 1 số bất kì nhập từ bán phím sau đó tạo mảng arr[n] nhưng trong turboC 3.0 không được làm như vậy. Ai có giải pháp thay thế không ? (dùng cho C nhé, không phải C++ vì C++ em biết cách rồi).

    Cụ thể như sau, nếu ta dùng các lệnh sau máy sẽ báo lỗi " Constant ... "


    #include<stdio.h>
    main()
    {
    int n;
    printf("Nhap n = ");scanf("%d",&n);
    int a[n] // => Lỗi ngay lập tức ở đây, nếu thay n= số cụ thể, vd const int n=2; thì không sao.
    for (i=0;i<n;i++) scanf("%d",&arr[n];
    }

    Em thường thấy trong các bài tập họ đường cho sắn arr[n] ví dụ a[100] sau đó nhập 1 số từ bàn phím <100 thì chạy ok, nhưng >100 thì nó chỉ chạy đến 100 thôi.
    Mong đàn anh chỉ giáo ???
    Quote Quote

  2. #2
    Tham gia
    11-09-2009
    Location
    TP HCM
    Bài viết
    292
    Like
    0
    Thanked 1 Time in 1 Post
    C hay C++ chả có j khó cả
    pác học tới con trỏ và bộ nhớ động thì sẽ thấy điều này bình thường

  3. #3
    Tham gia
    05-05-2008
    Bài viết
    183
    Like
    0
    Thanked 8 Times in 6 Posts
    Code bạn đưa lên ko tuân theo chuẩn C.

    phải viết thế này :
    Code:
    #include<stdio.h>
    
    #define MAX 100
    
    int main()
    {
      int n;
      int a[MAX];
      printf("Nhap n = ");scanf("%d",&n); 
      for (i=0;i<n;i++) scanf("%d",&arr[n];
    }
    C ko cho phép dùng biến để khai báo array, nếu muốn mảng động thì bạn dùng malloc rồi sau đó free con trỏ đi.
    Code:
    #include<stdio.h>
    #include<malloc.h>
    
    #define MAX 100
    
    int main()
    {
      int n;
      int *a;
      int *tmp;
      printf("Nhap n = ");scanf("%d",&n); 
      a = (int*)malloc(n*sizeof(int));
      tmp = a;
      for (i=0;i<n;i++) scanf("%d",tmp++);
      free(a);
    }

  4. #4
    Tham gia
    23-05-2007
    Bài viết
    684
    Like
    0
    Thanked 5 Times in 4 Posts
    Tại sao C nó không chấp nhận cái này nhỉ ?
    Em thấy C++ tạo mảng như thế được và Visual Basic hình như cũng được ...
    Không có giải pháp nào cho mảng 1 chiều ư ???

  5. #5
    Tham gia
    11-09-2009
    Location
    TP HCM
    Bài viết
    292
    Like
    0
    Thanked 1 Time in 1 Post
    làm sao mà bạn có thể làm được điều này trong C++ vậy

  6. #6
    Tham gia
    05-05-2008
    Bài viết
    183
    Like
    0
    Thanked 8 Times in 6 Posts
    Quote Được gửi bởi masterdark116 View Post
    Tại sao C nó không chấp nhận cái này nhỉ ?
    Em thấy C++ tạo mảng như thế được và Visual Basic hình như cũng được ...
    Không có giải pháp nào cho mảng 1 chiều ư ???
    C và C++ khác nhau bạn ạ, C++ là 1 superset của C.
    Trong Specification của C nói rằng compiler cần xác định rõ size của array khi compile, do vậy biến không được dùng để xác định size khi khai báo array.

    Thêm 1 điều nữa là khi bạn khai báo int a[10] thì toàn bộ 10 phần tử của mảng a được lưu ở Stack và sẽ bị giải phóng khi mảng a vượt Scope.
    Ngược lại khi dùng malloc thì các phần tử mảng a lại được lưu ở heap, trên stack chỉ có con trỏ 4 byte đến vùng nhớ của mảng a trên heap, heap thì bạn phải tự free lấy.

    C++ cùng cấp từ khóa new và bạn có thể dùng nó để khai báo array động, nhưng thực chất new đồng nghĩa với malloc, do vậy mới có từ khóa delete trong C++, giống với free.
    Được sửa bởi littleNeo lúc 16:26 ngày 04-11-2009

  7. #7
    Tham gia
    07-08-2007
    Bài viết
    239
    Like
    0
    Thanked 1 Time in 1 Post
    Cái này hình như cũng tùy thuộc compiler hay sao ý.

    Nếu dùng Dev C, với GCC thì viết
    PHP Code:
     int a***91;n***93; 
    được

  8. #8
    Tham gia
    18-02-2009
    Bài viết
    19
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi tranngoclan1987 View Post
    Cái này hình như cũng tùy thuộc compiler hay sao ý.

    Nếu dùng Dev C, với GCC thì viết
    PHP Code:
     int a***91;n***93; 
    được
    ngôn ngữ mà cũng phụ thuộc compiler à???????

  9. #9
    Tham gia
    06-06-2008
    Bài viết
    102
    Like
    0
    Thanked 1 Time in 1 Post

    Nói nhỏ nè !

    Quote Được gửi bởi masterdark116 View Post
    #include<stdio.h>
    main()
    {
    int n;
    printf("Nhap n = ");scanf("%d",&n);
    int a[n] // => Lỗi ngay lập tức ở đây, nếu thay n= số cụ thể, vd const int n=2; thì không sao.
    for (i=0;i<n;i++) scanf("%d",&arr[n];
    }
    TRong C và C++
    Mảng ban đầu là 1 dữ liệu có size dạng tĩnh. CHo khi khai báo thì phải khai báo rõ ràng kích thước khởi tạo nó là bao nhiêu vd a[50], b[4]. CHứ ko dc khai báo 1 kích thước chưa xác định như n: a[n].
    Cái thứ 2 là kích thước đã khai báo cho mảng thì khi sử dụng (vd nhập, xuất,...) không dc vượt quá. Vd a[50] thì chỉ có thể sử lí tối đa 50 phân tử thôi. Đến cái 51 thì sẽ ko chạy dc vì a[51] chưa được khai báo.
    -Sau này để giải quyết vấn đề trên, các chuyên gia đã tạo thêm mãng động. Không cần phải xác định rõ size khi khởi tạo. Nó tương tự như stack hay Queue vậy. Vì thế khi khai báo thì phải cấp phát bộ nhớ (malloc, allloc, new) cho nó như littleNeo đã nói, khi kết thúc thì phải giải phóng bộ nhớ (free, delete) cho nó.

  10. #10
    Tham gia
    02-09-2009
    Bài viết
    321
    Like
    0
    Thanked 2 Times in 2 Posts
    Quote Được gửi bởi dotaall View Post
    ngôn ngữ mà cũng phụ thuộc compiler à???????
    đúng rồi. Trừ phần code phần lớn là giống nhau thì mỗi compiler khác nhau chủ yếu ở directives. Chẳng hạn như lập trình ngắt cho 8051, trên Keil C mình ghi là void intx() interrupt a using b, còn trong reads51 thì ghi là void interrupt(0x13) Isr(void), còn HEW dịch code CPU H8 thì ghi là #pragma interrupt jj đó

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •