Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Lập trình C++ | Giá trị của Struct trong lập trình C?

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

    Mặc định Lập trình C++ | Giá trị của Struct trong lập trình C?

    Mấy bác cho tui hỏi:

    Giả sử mình có một struct như sau:

    PHP Code:
    #include <stdio.h>

    struct time_t {
      
    char day [2];
      
    int  month;
    };
    //--------------------------
    int main ()
    {
      
    time_t    time;

       
    time.day[0] = 0xF1;
       
    time.day[1] = 0xF2;
       
    time.month 3;

    time_t array[3] = {time,time,time} ;

    printf("size time= %d, time= 0x%x\n",sizeof(time),time); // in trực tiếp struct  time
    printf("size aray= %d, array[0] = 0x%x\n"sizeof(array), array[0]); // in ra 1 phần tử của aray, là 1 struct.
    }; 
    kết quả in ra của time là một giá trị "ko bít từ đâu ra"

    tôi muốn hỏi là khi mình muốn lấy giá trị của time (như đã in ra ở trên) thì trình biên dịch nó lấy giá trị của time như thế nào ?.
    lấy từng phần tử của time thì ai cũng bít, nhưng nếu mình lấy cả time tui ko bít là nó tính kiểu gì, lúc thử thì "có vẻ" nó lấy giá trị của 4 byte đầu của struct ??

    Thanks
    Đã được chỉnh sửa lần cuối bởi thavali : 13-04-2009 lúc 11:06 AM.

  2. #2
    Ngày gia nhập
    01 2009
    Nơi ở
    Hà Nội
    Bài viết
    205

    Theo mình thì struct không có giá trị trả về, nó chỉ là 1 biến lưu lại các trường trong nó thôi. Struct thì chỉ có địa chỉ chứ không phải là giá trị cụ thể nào đó. Còn bạn in ra thì đó có thể là máy in ra trong bộ nhớ đệm của chương trình khi dịch. Mình đoán vậy.

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

    thanks bạn.
    kết quả của việc in ra một struct là như sau:
    ở dòng:
    PHP Code:
    printf("size time= %d, time= 0x%x\n",sizeof(time),time); 
    mình thấy kết quả của time in ra là 3, bằng với time.month. Nếu mình sửa time.month = 5 thì nó in ra kết quả là 5. tức nó in ra giá trị của time.month.
    còn ở dòng:
    PHP Code:
    printf("size aray= %d, array[0] = 0x%x\n"sizeof(array), array[0]); 
    mình thấy kết quả của aray[0] in ra là 0xf2f1 , bằng với time.day[0] và time.day[1] ghép lại.
    điểm chung của 2 kết quả trên là điều lấy 4 byte, ko biết có đúng ko nữa ?

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

    Thế này:
    + Bạn truyền struct time_t làm tham số trong hàm printf thì nó cũng sẽ truyền giống như bình thường, ở đây là pass by value (hình như gọi là truyền trị hay gì đó), tức là value của cái struct (nguyên 1 cục 8 byte) sẽ dc pass cho hàm printf chạy.
    + Thứ 2 là printf xử lý những tham số này như thế nào là tùy vào format string (hình như tên là vậy, ở trường hợp này là "size time= %d, time= 0x%x\n"). Ở đây có thể tạm hình dung cái format specifier %x sẽ dc printf hiểu là tham số thứ 2 là 1 thằng int (nhưng thật ra là thằng time_t do trường hợp này bạn dùng printf sai), kết quả là nó cắt 4 byte đầu của time_t và hiển thị như int.

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

    cảm ơn bác,
    nhưng sao array[0] và time là bằng nhau, nhưng 2 dòng printf nó lại cho ra kết quả khác nhau. với aray[0] thì nó in ra : 0xf2f1 , bằng với time.day[0] và time.day[1] ghép lại.
    vậy làm thế nào để biết được là khi mình lấy time thì mình sẽ nhận được nguyên xi 8 byte của struct time lun ?
    Đã được chỉnh sửa lần cuối bởi thavali : 13-04-2009 lúc 07:13 PM.

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

    Mặc định Cho mình hỏi chút về cấu trúc (struct) trong C++

    Mình viết một cái struct nhân viên, tìm và in thông tin nhân viên có mức lương cao nhất. Nhưng khi in ra nó không ra kết quả như mình mong muốn. Mình mới học mong các bạn giúp đỡ.
    Code:
    #include "stdafx.h"
    #include<iostream>
    
    using namespace std;
    typedef struct{
    	int ngay;
    	int thang;
    	int nam;
    }NgayThang;
    
    typedef struct{
    	char ten[20];
    	NgayThang sinhnhat;
    	char chucvu[30];
    	float luong;
    }NhanVien;
    
    //Nguyen mau ham
    void ThongTinNV(NhanVien *ptrNhanVien, int dodai);
    NhanVien MaxLuong(NhanVien *ptrNhanVien,int dodai);
    NhanVien MinLuong(NhanVien *ptrNhanVien,int dodai);
    void HienThiThongTin(NhanVien myNhanVien);
    
    //Dinh nghia cac ham
    
    void ThongTinNV(NhanVien *ptrNhanVien,int dodai)
    {
    	ptrNhanVien=new NhanVien[dodai];
    	
    	for(int i=0;i<dodai;i++)
    	{
    		cin.ignore(1);
    		cout<<"nhan vien thu "<<i+1<<endl;
    		cout<<"ten nhan vien:";
    		cin.getline(ptrNhanVien[i].ten,20);		
    		cout<<"sinh nhat"<<endl;
    		cout<<"ngay sinh:";
    		cin>>ptrNhanVien[i].sinhnhat.ngay;
    		cout<<"thang sinh:";
    		cin>>ptrNhanVien[i].sinhnhat.thang;
    		cout<<"nam sinh:";
    		cin>>ptrNhanVien[i].sinhnhat.nam;
    		cin.ignore(1);
    		cout<<"chuc vu:";
    		cin.getline(ptrNhanVien[i].chucvu,30);
    		cout<<"luong($):";
    		cin>>ptrNhanVien[i].luong;
    	}
    }
    
    NhanVien MaxLuong(NhanVien *ptrNhanVien,int dodai)
    {
    	int vitri=0;
    	ptrNhanVien=new NhanVien[dodai];
    	float maxluong=ptrNhanVien[0].luong;
    	for(int i=1;i<dodai;i++)
    	{
    		if(ptrNhanVien[i].luong>maxluong)
    		{
    			maxluong=ptrNhanVien[i].luong;
    			vitri=i;
    		}		
    	}
    	return ptrNhanVien[vitri];
    }
    
    NhanVien MinLuong(NhanVien *ptrNhanVien,int dodai)
    {
    	int vitri=0;
    	ptrNhanVien=new NhanVien[dodai];
    	float minluong=ptrNhanVien[0].luong;
    	for(int i=1;i<dodai;i++)
    	{
    		if(ptrNhanVien[i].luong<minluong)
    		{
    			minluong=ptrNhanVien[i].luong;
    			vitri=i;
    		}
    	}
    	return ptrNhanVien[vitri];
    }
    
    void HienThiThongTin(NhanVien myNhanVien)
    {
    	cout<<"Ho ten:"<<myNhanVien.ten<<endl;
    	cout<<"ngay thang nam sinh:"<<myNhanVien.sinhnhat.ngay<<"-"<<myNhanVien.sinhnhat.thang<<"-"<<myNhanVien.sinhnhat.nam<<endl;
    	cout<<"chuc vu:"<<myNhanVien.chucvu<<endl;
    	cout<<"luong hien tai:"<<myNhanVien.luong<<endl;
    }
    void main()
    {
    	NhanVien *ptrNhanVien;	
    	int dodai=0;
    	cout<<"nhap vao so nhan vien:";
    	cin>>dodai;
    	ptrNhanVien=new NhanVien[dodai];
    	//khi tao danh sach nhan vien
    	ThongTinNV(ptrNhanVien,dodai);
    
    	//tim nhan vien co luong cao nhat
    	NhanVien maxNhanVien;	
    	maxNhanVien=MaxLuong(ptrNhanVien,dodai);
    	HienThiThongTin(maxNhanVien);
    	delete [] ptrNhanVien;
    }

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

    Trích dẫn Nguyên bản được gửi bởi thavali Xem bài viết
    cảm ơn bác,
    nhưng sao array[0] và time là bằng nhau, nhưng 2 dòng printf nó lại cho ra kết quả khác nhau. với aray[0] thì nó in ra : 0xf2f1 , bằng với time.day[0] và time.day[1] ghép lại.
    vậy làm thế nào để biết được là khi mình lấy time thì mình sẽ nhận được nguyên xi 8 byte của struct time lun ?
    array[0] và time là bằng nhau, mình chạy thử thấy ko khác nhau.Còn câu kia mình ko hiểu.

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

  1. Gửi struct thông qua socket có khác nhau giữa gửi từng field và gửi cả struct?
    Gửi bởi bptvip_pro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 12-05-2013, 02:35 AM
  2. Bài tập C++ làm sao truy xuất biến của struct lồng trong struct
    Gửi bởi quangnam.tamky trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 10-04-2013, 05:22 PM
  3. Lập trình C++ Giúp đỡ về điểm khác nhau giữa struct và typedef struct
    Gửi bởi huydang2410 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 27-02-2013, 10:30 AM
  4. Khác nhau giữa struct trong c và struct trong c++
    Gửi bởi nhutlv01 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 17-02-2012, 09:12 AM
  5. Lỗi không xử lý giá trị struct (trong if else)
    Gửi bởi duyanh_28 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 25-05-2011, 12:13 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