Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Khai báo biến local, thế mà dùng được cả global, thế này là sao?

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Mặc định Khai báo biến local, thế mà dùng được cả global, thế này là sao?

    Đoạn code sau:
    PHP Code:
    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    #include<math.h>

    int j,dem=0;


    int ktngto(int);
    void Nhap();
    void Xuat();

    int main()
    {
        
    Nhap();
        
    Xuat();
        
    getch();
        return 
    0;
    }
    void Nhap()
    {
        
    int *mang,i=0,n;
        
    mang=(int*)malloc(100*sizeof(int));
        do
        {
            
    printf("Nhap vao so thu %d: ",i+1);
            
    scanf("%d",&n);
            
    i++;
        if(
    ktngto(n))
        {
            
    mang[j++]=n;
            
    dem+=1;
        }
        }
        while(
    n>=0);
        
    }
    int ktngto(int n)
    {
        if(
    n<=1)
            return 
    0;
        if(
    n==2)
            return 
    1;
        
    int bienchay=2,canbachai=0,phandu=0;
        
    canbachai=int(sqrt(n));
        
    int ktnguyento=1;
        do
        {
            
    phandu=n%bienchay;
            if(
    phandu==0)
              
    ktnguyento=0;
        }while(
    ktnguyento==1&&bienchay++<=canbachai);
           return 
    ktnguyento;
    }
    void Xuat()
    {
        
        
    int *array;
        
    printf("\n\nCac so nguyen to la:\n");
        for(
    int k=0;k<j;k++)
        
    printf("%d ",array[k]);
        
    printf("\n\nCo %d so nguyen to trong day ban vua nhap.",dem);

    Bạn thấy đấy, *mang trong hàm nhập được khai báo local, thế mà đem qua hàm Xuat thì lại chạy được. Rinh 2 hàm này vào hàm main thì cũng chạy tuốt mà chả cần khai báo một mảng trong hàm main.
    Thế này là sao, nhờ các bạn giải thích!
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  2. #2
    Ngày gia nhập
    04 2008
    Nơi ở
    HCMC
    Bài viết
    251

    Không hiểu sao bạn lại chạy dc.Bạn dùng IDE gì vậy.
    Mình dùng Visual Studio 6.0 không chạy được.
    warning *array chưa được khởi tạo.
    C++ Code:
    1. for(;;){cout<<"Busy"<<endl;}
    2. system("cls");
    Hãy ủng hộ cho quỹ phát triển cộng đồng C Việt
    http://congdongcviet.com/quyphattrien-congdongcviet.cpp

  3. #3
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật có thể nói mồm, nhưng code thì không!
    Tôi nghĩ khi bạn nói câu này thì bạn phải nắm chắc giải thuật lắm chứ, ko lẽ kiến thức về con trỏ và cấp phát động bạn lại ko hiểu?

  4. #4
    Ngày gia nhập
    04 2007
    Bài viết
    134

    Chắc do stack làm cho 2 biến array của 2 hàm vô tình trùng nhau.

  5. #5
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi Loveanygirls Xem bài viết
    Đoạn code sau:
    PHP Code:
    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    #include<math.h>

    int j,dem=0;


    int ktngto(int);
    void Nhap();
    void Xuat();

    int main()
    {
        
    Nhap();
        
    Xuat();
        
    getch();
        return 
    0;
    }
    void Nhap()
    {
        
    int *mang,i=0,n;
        
    mang=(int*)malloc(100*sizeof(int));
        do
        {
            
    printf("Nhap vao so thu %d: ",i+1);
            
    scanf("%d",&n);
            
    i++;
        if(
    ktngto(n))
        {
            
    mang[j++]=n;
            
    dem+=1;
        }
        }
        while(
    n>=0);
        
    }
    int ktngto(int n)
    {
        if(
    n<=1)
            return 
    0;
        if(
    n==2)
            return 
    1;
        
    int bienchay=2,canbachai=0,phandu=0;
        
    canbachai=int(sqrt(n));
        
    int ktnguyento=1;
        do
        {
            
    phandu=n%bienchay;
            if(
    phandu==0)
              
    ktnguyento=0;
        }while(
    ktnguyento==1&&bienchay++<=canbachai);
           return 
    ktnguyento;
    }
    void Xuat()
    {
        
        
    int *array;
        
    printf("\n\nCac so nguyen to la:\n");
        for(
    int k=0;k<j;k++)
        
    printf("%d ",array[k]);
        
    printf("\n\nCo %d so nguyen to trong day ban vua nhap.",dem);

    Bạn thấy đấy, *mang trong hàm nhập được khai báo local, thế mà đem qua hàm Xuat thì lại chạy được. Rinh 2 hàm này vào hàm main thì cũng chạy tuốt mà chả cần khai báo một mảng trong hàm main.
    Thế này là sao, nhờ các bạn giải thích!
    *mang trong hàm Xuat() của bạn đâu chỉ cho tôi nào, tôi không nhìn thấy nó đâu cả

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Mặc định Khai báo biến local, thế mà dùng được cả global, thế này là sao?

    @huynguyen: Cái này sai là do mình chưa nắm vững ngôn ngữ C, ý tưởng giải thuật thì không có vấn đề. Hơn nữa, giải thuật này cũng chẳng phải là của mình mà là do mình học được (được dạy!).
    Bằng chứng chạy được trên DevC++ của đoạn code trên. Chắc mình phải dẹp thằng DevC++ này quá! Nó không bắt lỗi nghiêm ngặt bằng Turbo C, khai báo kiểu bool gì cũng chạy ráo!
    Code:
    http://rapidshare.com/files/222289040/Khaibaomang.rar
    Mirror: http://www.mediafire.com/?g11md5enwzv
    *mang trong hàm Xuat() của bạn đâu chỉ cho tôi nào, tôi không nhìn thấy nó đâu cả
    Mình cố ý khai báo *mang và *array trong 2 hàm với 2 tên khác nhau nhưng nó vẫn chạy được.
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  7. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    @Loveanygirls :
    1. thật ra ko phải là "dùng" được đâu

    2. Điều thắc mắc này xuất phát từ 1 nguyên nhân cực kì đơn giản.


    Đúng như huy nguyen nói chỉ có mỗi việc cấp phát bộ nhớ thôi.
    Bạn hãy nghiên cứu thêm các cấp phát bộ nhớ. đặc biệt là với các con trỏ.

    mình chỉ giải thích sơ bộ chỗ này thôi.
    giả sử hàm main của bạn ko có biến con trỏ nào thì:
    trong các hàm con, bạn khai báo con trỏ cùng dạng thì toàn bộ nó khi chưa sử dụng sẽ được trỏ vào cùng 1 địa chỉ.
    ví dụ :
    PHP Code:
    #include<stdio.h>
    #include<conio.h>
    #include<malloc.h>
    #include<math.h>


    void test1(void)
        {
            
    int *x;
    printf("%x  " x);
        }

    void test2(void)
        {
            
    int *aaaa;
    printf("%x " ,aaaa);
        }
    void main(void)
        {
            
    clrscr();
            
    test1();
            
    test2();
            
    getch();

        } 
    thì tất cả chúng đều trỏ vào 1 địa chỉ.



    Còn rất nhiều trường hợp khác nữa( vì khi có nhiều biến thì cách phân địa chỉ lại khác đi, trong hàm main có biến thì nó lại khác đi.......) nhưng để bài viết ko bị loãng và bạn tự tìm hiểu thì tôi sẽ ko trình bày ở đây

    (mấy cái này biết cũng chả để làm gì vì chả ai lại dùng như thế, con trỏ => cấp phát và giải phóng. ct của bạn có malloc mà lại ko có free......)

    3. tôi mạn phép update hàm kiểm tra nguyên tố của bạn :
    hàm ktnt của bạn quá loằng ngoằng và khó hiểu ( chắc tôi gà quá nên đọc ko hiểu )
    PHP Code:
    char nguyento(unsigned n)
        {
            if (
    n<2) return 0;
            for (
    int i=2;i<=sqrt(n);i++)
                if (
    n%i==0) return 0;
            return 
    1;
        } 
    Đã được chỉnh sửa lần cuối bởi langman : 18-04-2009 lúc 11:44 AM.
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Bằng chứng chạy được trên DevC++ của đoạn code trên. Chắc mình phải dẹp thằng DevC++ này quá! Nó không bắt lỗi nghiêm ngặt bằng Turbo C, khai báo kiểu bool gì cũng chạy ráo!
    Lại đổ thừa cho IDE, kiến thức về chuẩn ANSI ISO chưa vững mà dám bảo Dev C++ bắt lỗi ko nghiêm ngặt bằng Turbo C.
    Chính vì bạn quá coi trọng các IDE nên mới dẫn đến câu nói để đời trên chữ ký, chừng vài năm nữa khi bạn đã kinh qua các IDE, các chuẩn ngôn ngữ thì bạn sẽ hiểu câu nói của bạn bây giờ chỉ là trò hề.
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.
    Đoạn đầu thì đúng, đoạn sau nói xin lỗi chứ nói ra biết "nhu" rồi. Có bản thiết kế nhưng còn phải xem xây nhà bằng gỗ, bằng gạch hay mái lá nữa. Nếu ko có bản thiết kế thì anh có xây bằng kim cương tôi vẫn có thể đập vỡ nhà anh.
    Đã được chỉnh sửa lần cuối bởi huynguyen : 18-04-2009 lúc 09:54 AM.

  9. #9
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Mingw không bắt lỗi nghiêm ngặt thì còn thứ gì hơn đây !?
    Đem ISO98/2003 mà so với 90 thì hơi bị ... kì cục !

  10. #10
    Ngày gia nhập
    04 2009
    Nơi ở
    một căn hộ nhỏ trên trái đất
    Bài viết
    372

    Trích dẫn Nguyên bản được gửi bởi huynguyen Xem bài viết
    Lại đổ thừa cho IDE, kiến thức về chuẩn ANSI ISO chưa vững mà dám bảo Dev C++ bắt lỗi ko nghiêm ngặt bằng Turbo C.
    Chính vì bạn quá coi trọng các IDE nên mới dẫn đến câu nói để đời trên chữ ký, chừng vài năm nữa khi bạn đã kinh qua các IDE, các chuẩn ngôn ngữ thì bạn sẽ hiểu câu nói của bạn bây giờ chỉ là trò hề.

    Đoạn đầu thì đúng, đoạn sau nói xin lỗi chứ nói ra biết "nhu" rồi. Có bản thiết kế nhưng còn phải xem xây nhà bằng gỗ, bằng gạch hay mái lá nữa. Nếu ko có bản thiết kế thì anh có xây bằng kim cương tôi vẫn có thể đập vỡ nhà anh.
    Khi đọc bài viết của Loveanygirls, mình đã nghĩ ngay đến khả năng biến con trỏ. Vì với khai kiểu mang=(int*)malloc(100*sizeof(int))nằm trong một hàm thì kiểu gì sau khi hàm đó chạy xong, biến con trỏ bị xóa mất, nhưng vùng nhớ gồm 100 ô dành cho biến kiểu int chưa được xóa bằng hàm free() nên mới có chuyện đó. Nhưng còn việc bạn ấy dung biến int *array mà tình cờ vẫn truy cập vào được vùng nhớ trên, thì mình hoàn toàn toàn có cơ sở để nói rằng có khả năng do IDE. Mình dung IDE là Visual Studio 2005, khi bạn chạy ở chế độ debug, những con trỏ được khai báo mà chưa khởi tạo luôn được gán giá trị ô nhớ có địa chỉ 0xcccccccc, vùng địa chỉ cấm được đọc nếu dùng toán tử * để tham chiếu. Tuy nhiên, khi chạy những hàm kiểu như malloc thì luôn luôn con trỏ đó sẽ được trỏ đến vùng nhớ khác. Chẳng hạn
    Code:
    int *i=(int *)malloc(100*sizeof(int));//chắc chắn trỏ đến ô nhớ khác
    int *j;//trỏ đến ô nhớ bất kì. Nhưng nếu chạy chế độ debug thì nó luôn là 0xcccccccc. Ở đây hoàn toàn có khả năng i==j nhưng xác suất rất (vô cùng) thấp.
    Điều trên luôn luôn đúng với Visual Studio, kể cả khi chạy ở chế độ Build.
    Vì vậy đoạn mã của bạn Loveanygirls sẽ không thể chạy với Visual Studio được. Còn nếu bạn đã biên dịch đoạn mã trên bằng một IDE khác. Mà lần nào chạy cũng thành công thì chắc do IDE đám nhận công việc cấp phát bộ nhớ không giống với VS.
    Đã được chỉnh sửa lần cuối bởi icttrack : 20-04-2009 lúc 09:07 AM.

Các đề tài tương tự

  1. Lập trình C++0x [global declaration] cách khai báo và sử dụng biến global?
    Gửi bởi quano1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 17-08-2013, 05:30 PM
  2. taị sao các biến static khi khai báo để dùng được lại phải khai báo lại trước hàm main ? ?
    Gửi bởi anhnpson trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 15-06-2011, 08:18 PM
  3. Hiểu khai báo biến khi dùng dll như thế nào?
    Gửi bởi vutranhung trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 10
    Bài viết cuối: 19-02-2011, 07:43 PM
  4. phần biệt biến toàn cục và biến cục cộ (local and global)
    Gửi bởi fanmaytinh trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 14-10-2009, 10:25 PM
  5. Nên dùng biến toàn cục hay local
    Gửi bởi aMember trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 06-08-2008, 03:30 PM

Quyền hạn của bạn

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