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ố 14 kết quả

Đề tài: Dùng con trỏ hàm để gọi hàm tại 1 địa chỉ cụ thế

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    18

    Mặc định Dùng con trỏ hàm để gọi hàm tại 1 địa chỉ cụ thế

    Cho mình hỏi cách gọi hàm từ 1 địa chỉ cụ thể :

    ví dụ như
    Code:
            int anumber = 10;
    	int *apointer;
    	int *p;
       
    	p = &anumber;
    	apointer = &anumber;
            int c=(int)apointer;
    
    	p=(int*)c;
    
    	printf("%p %p",&anumber,p); // 2dia chi nay giong nhau
    ví dụ trên để trỏ về 1 địa chỉ của biến.Mình có làm tương tự với con trỏ hàm nhưng không thể cho con trỏ hàm trỏ về địa chỉ của hàm được.Các bạn giúp mình 1 tay với.Có code mẫu thì hay quá

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    18

    Ai giúp mình với,mình đang cần kiến thức này mà google mãi vẫn chưa ra

  3. #3
    Ngày gia nhập
    12 2010
    Nơi ở
    Hà Nội
    Bài viết
    137

    Kiểu thế này hả?
    C Code:
    1. #include <stdio.h>
    2.  
    3. void Func();
    4.  
    5. int main()
    6. {
    7.     void (*p)() = Func;
    8.     p();
    9.     return 0;
    10. }
    11.  
    12. void Func()
    13. {
    14.     printf("Hi");
    15. }
    Freelancer, free coder, free tester.
    Nhận hợp tác viết app, viết midlet khi free time.
    Tình trạng: Siêu bận!

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    18

    không phải rồi bạn ơi

    Ví dụ bạn có hàm

    C Code:
    1. int sosanh(int a,int b)
    2. {
    3.      ....
    4.      return ...;
    5. }
    6.  
    7. int main(){
    8.      printf("ham sosanh co dia chi la",&sosanh);      
    9.     //hàm sosanh sẽ có địa chỉ trên bộ nhớ như trên.giả sử nó có địa chỉ là 00210006 đi thì
    10.     // làm sao ta cho con trỏ hàm trỏ về địa chỉ này rồi thực thi hàm,trả về kết quả là 1 số int
    11.     // hoặc cách khác cũng được
    12.     ...
    13.  
    14. }

  5. #5
    Ngày gia nhập
    01 2010
    Nơi ở
    Hà Nội
    Bài viết
    128

    chưa nghe khái niệm địa chỉa của hàm bao giờ chỉ nghe thấy địa chỉ của biến . Nếu bạn muốn thực hiện hàm đó thì chỉ cẩn gọi nó thôi
    exp:
    C Code:
    1. #include<stdio.h>
    2. int sosanh(int a,int b)
    3.   {
    4.       // Định nghĩa hàm
    5.   }
    6. int main()
    7.   {
    8.       sosanh(3,4);// lời gọi hàm sao lại phải dùng con trỏ để gọi hàm :S
    9.   }

  6. #6
    Ngày gia nhập
    12 2010
    Nơi ở
    Hà Nội
    Bài viết
    137

    Mặc định Dùng con trỏ hàm để gọi hàm tại 1 địa chỉ cụ thế

    Thế này thì sao?
    C Code:
    1. #include <stdio.h>
    2. using namespace std;
    3.  
    4. int anumber()
    5. {
    6.     printf("Helli\n");
    7.     return 0;
    8. }
    9.  
    10. int main()
    11. {
    12.     anumber();
    13.     int (*apointer)();
    14.     int (*p)();
    15.     p = anumber;
    16.     apointer = anumber;
    17.    
    18.     int c = ( int) apointer;
    19.    
    20.     p = (int(*)())c;
    21.     printf("%p %p",&anumber,p); // 2dia chi nay giong nhau
    22.  
    23.     return 0;
    24. }
    Freelancer, free coder, free tester.
    Nhận hợp tác viết app, viết midlet khi free time.
    Tình trạng: Siêu bận!

  7. #7
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    đọc bài này:

    http://forums.congdongcviet.com/showthread.php?t=25204

    @admin: công cụ tìm kiếm trên diễn đàn dở ẹc, đều phải dùng google.

  8. #8
    Ngày gia nhập
    07 2011
    Bài viết
    18

    Thank bạn DinhPhonh nhé.
    Nhân tiện cho mình hỏi luôn
    Mình có code như sau mà không hiểu sao nó không thực thi được :

    Đầu tiên chạy đoạn code sau trước(trong file a.cpp) :

    C Code:
    1. #include "stdio.h"
    2.  
    3. int test(int foo){
    4.     return foo;
    5. }
    6. int main(int argc,char* argv[])
    7. {
    8.     int (*apointer)(int);
    9.     int (*p)(int);
    10.     p = test;
    11.     apointer = test;
    12.    
    13.     int c = ( int) apointer;
    14.    
    15.     p = (int(*)(int))c;
    16. // c là địa chỉ của hàm test
    17.     printf("%d ",c);
    18.  
    19.     return 0;
    20. }

    khi chạy thì thu được địa chỉ chẳn hạn như là 20385957=> đây là địa chỉ của hàm test
    Khi mình chạy tiếp đoạn code tiếp theo (trong file b.cpp):

    C Code:
    1. #include "stdio.h"
    2.  
    3. int main(int argc,char* argv[])
    4. {
    5.         int (*p)(int);
    6.         p = (int(*)(int))20385957;// la dia chi cua ham test khi bien dich file a.cpp nhu tren co duoc
    7.     printf("%d",p(3));
    8.  
    9.     return 0;
    10. }

    thì không chạy được.Nhưng gom vào 1 file thì chạy OK ??
    Mình nghĩ là do mỗi ứng dụng chạy nó có mỗi phân vùng riêng cho nó,là các loại segment như code segment,data segment ... vậy có cách nào CALL hàm từ 1 ứng dụng được nạp vào bộ nhớ không các bạn ?
    Đã được chỉnh sửa lần cuối bởi prefix : 31-07-2011 lúc 12:33 PM.

  9. #9
    Ngày gia nhập
    12 2010
    Nơi ở
    Hà Nội
    Bài viết
    137

    Mặc định DingPhonh

    Vì tồn tại hàm test(int) thì khi chạy chương trình, máy mới cấp phát bộ nhớ chứ. Chứ hàm nó có ở trên bộ nhớ mãi đâu. Tắt chương trình a.exe thì máy giải phóng bộ nhớ cho đỡ lãng phí mà
    Freelancer, free coder, free tester.
    Nhận hợp tác viết app, viết midlet khi free time.
    Tình trạng: Siêu bận!

  10. #10
    Ngày gia nhập
    07 2011
    Bài viết
    18

    Không,mình biên dịch ông a.cpp ra rồi mới chạy,khi đang chạy mình biên dịch tiếp b.cpp rồi chạy tiếp.nhưng b khi lấy địa chỉ hàm từ a.exe đang chạy thì vẫn không thực hiện hàm được.
    Tuy nhiên nếu viết 2 code trên cùng 1 file c.cpp rồi biên dịch ra chạy thì hoàn toàn ok ?

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

  1. Upload file dùng Ajax mà ko dùng Method Post của Form như thế nào?
    Gửi bởi hieupxd2cntt trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 8
    Bài viết cuối: 14-09-2014, 10:23 PM
  2. Thẻ ưu đãi tiêu dùng quanh năm tiết kiệm tới 60% nhu cầu tiêu dùng nào!
    Gửi bởi chuyengia_td trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 15-08-2013, 12:24 PM
  3. Trả lời: 5
    Bài viết cuối: 15-11-2012, 09:43 PM
  4. Trả lời: 5
    Bài viết cuối: 22-02-2012, 06:20 PM
  5. Chuyển hệ thập phân sang nhị phân chỉ dùng vòng for không dùng mảng
    Gửi bởi zodjac1990 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 24-02-2009, 06:16 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