2011-11-24 24 views
7

thể trùng lặp:
length of array in function argumentsizeof một mảng thông qua như là đối số chức năng

Hi đang làm bài tập về nhà và tôi hoàn toàn bối rối. Chúng tôi đã cho rằng để có được mọi thứ tự của danh sách một loạt các số nguyên vì vậy tôi đã viết đoạn mã này, dựa tắt của giả giáo viên của tôi:

void permute(int v[], int curr,char letters[]) 
{ 
    if(curr >= sizeof(v)/sizeof(int)) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < sizeof(v)/sizeof(int); i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 

Điều duy nhất tôi không chắc chắn của là nếu sizeof(v)/sizeof(int) là quyền con đường để đi.

+3

Nếu câu hỏi của bạn là duy nhất về 'sizeof (v)/sizeof (int) ', tôi sẽ đề nghị chỉnh sửa tiêu đề câu hỏi của bạn, bởi vì nó không có gì để làm với "đệ quy cho hoán vị" ... –

Trả lời

9

sizeof(v)/sizeof(int) không phải là cách để đi. Chức năng của bạn là chính xác tương đương với:

void permute(int *v, int curr, char *letters) 
{ 
    ... 
} 

ví dụ v là không thực sự một mảng, đó là một con trỏ. Bạn không thể truyền mảng trong C hoặc C++.

Giải pháp là một trong những cách sau (không đầy đủ):

  • thêm một đối số bổ sung mà mô tả một cách rõ ràng theo chiều dài của mảng
  • thêm một đối số bổ sung mà chỉ ở yếu tố cuối cùng của mảng
  • sử dụng một container thích hợp (ví dụ std::vector), mà bạn có thể gọi size() trên
  • giải pháp mẫu mà @sehe gợi ý
+0

1 cho container, mặc dù cho bài tập ở nhà đôi khi họ không cho phép bạn làm điều đó "đúng" cách. – Anthony

+0

Tôi nghĩ bạn có thể - permute (int n [5]) là tốt? Mảng không được truyền theo giá trị. Nhưng nó là một mảng –

+1

@Adrian: Một mảng phân rã thành một con trỏ khi nó được sử dụng như một tham số hàm. –

5

Một trong Peeves vật cưng của tôi: bạn có thể nhận được C++ để suy ra kích thước mảng cho bạn

template <size_t N> 
void permute(int (&v)[N], int curr,char letters[]) 
{ 
    if(curr >= N) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < N; i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 
+0

Cảm ơn rất nhiều vì câu trả lời đó! –

0

Ngoài câu trả lời Oli của: cách điển hình trong C++ là phải vượt qua một con trỏ đến đầu và một con trỏ đến kết thúc chuỗi mà bạn muốn tính toán. Theo quy ước con trỏ bắt đầu được bao gồm, con trỏ kết thúc là độc quyền.

void permute(int *v, int *begin, int *end, char *letters) { 
    if (begin == end) { 
    checkit(v, end, letters); 
    } else { 
    ... 
    permute(v, begin + 1, end, letters); 
    ... 
    } 
} 
Các vấn đề liên quan