2011-03-18 41 views
6

Tôi đã gợi ý sử dụng con trỏ để thêm một vectơ mà tôi muốn chuyển từ một số hàm hiện có sang một hàm khác. Tôi thực sự bị mắc kẹt về cách để có được thông tin trở lại ra của con trỏ đó mặc dù. Tôi đã thử một số điều tôi đã đọc ở đây và vì vậy hãy để tôi chứng minh những gì tôi đang nói về.truyền một vector giữa các hàm thông qua con trỏ

chương trình tiểu học:

std::vector<float> * dvertex=NULL; 

track.calculate(irrelevant stuff, dvertex) 

chương trình trung học (theo dõi, tính toán)

track::caclulate(irrelevant stuff, vector<float> * dvertex) 
{ 
... 
vector<float> pos; 
... pos filled after some calculations 
if(! (dvertex==NULL)) 
{ 
    dvertex = &pos1; 
} 

trở lại tiểu học, trừ khi tôi sai lầm gì đó ở trên, đây là một số những điều tôi đã cố gắng

(*dvertex).at(0) 
float z = (*dvertex).at(0) 
(*dvertex)[0] 

và một loạt nội dung đơn giản không biên dịch. Tôi khá khó khăn vì tôi không chắc chắn làm thế nào để có được các giá trị cụ thể trong số đó vector trong chương trình chính. Tôi thậm chí nghĩ rằng nó có thể là nếu (! (Dvertex == NULL)) bit, vì vậy tôi đã thay đổi nó nếu (dvertex == NULL) nhưng vẫn không có niềm vui. Mọi sự trợ giúp sẽ rất được trân trọng.

* Chỉnh sửa/cập nhật * Cảm ơn rất nhiều vì đã giúp đỡ, nhưng tôi sợ rằng tôi vẫn đang làm sai.

Vì vậy, sau khi gợi ý rằng tôi chỉ cần vượt qua một tài liệu tham khảo: Tôi đã làm điều này:

chính

std::vector<float> dvertex; 
track.calculate(foo, &dvertex); 

thứ vẫn không thay đổi (với kiểm tra Null!)

chính

std::cout<<dvertex[0]<<std:endl; 

(trong số các nỗ lực khác để thực sự sử dụng dữ liệu)

Cảm ơn rất nhiều vì bất kỳ suy nghĩ nào về những gì tôi vẫn đang làm không đúng cách. Tất cả mọi thứ biên dịch, chương trình chỉ đóng băng khi nó được đến một điểm mà dữ liệu từ dvertex được sử dụng.

Chỉnh sửa: Final sửa chữa

trong chương trình trung học tôi cần

*dvertex = pos1; 

thay vì

dvertex = &pos1; 
+3

Không được đưa thêm đề xuất vào bạn, nhưng bạn nên chuyển nó ở dạng tham chiếu . Sau đó, không cần phải dereference bất cứ điều gì, và bạn sẽ có được tất cả những lợi ích tương tự. – jonsca

+0

@jonsca là đúng, bạn nên làm một cái gì đó như track :: caclulate (công cụ không liên quan, vector & dvertex), sau đó chỉ đơn giản là xử lý dvertex như một vectơ bình thường và công việc thực hiện với nó vẫn sẽ có sẵn bên ngoài phương pháp. –

+1

Đôi khi tôi thích chuyển qua con trỏ nếu vùng chứa sẽ được sửa đổi. Tại trang web cuộc gọi thường yêu cầu sử dụng toán tử địa chỉ: 'func (& my_vertor);' Đây là lời nhắc nhở nhỏ rằng hàm thực sự sửa đổi vùng chứa. Nếu bạn luôn chuyển qua tham chiếu, bạn không thể phân biệt giữa các cuộc gọi sửa đổi và không sửa đổi mà không nhìn vào khai báo hàm. Tuy nhiên, đây hoàn toàn là vấn đề về phong cách, không có lợi ích về hiệu suất. – dappawit

Trả lời

10

Tôi không chắc chắn lý do tại sao những không biên dịch cho bạn, bởi vì chúng hợp lệ miễn là con trỏ hợp lệ và không rỗng:

void f(std::vector<int>* v) 
{ 
    if(v != 0) { 
     int n = (*v)[0];  // ok 
     int m = (*v).at(0); // ok 
     int o = v->at(0); // ok 
    } 
} 

Nhưng đừng bận tâm đến điều đó. Sử dụng tham chiếu nếu bạn phải thay đổi vectơ và tham chiếu const nếu bạn không phải. Có rất ít khi cần một container bằng con trỏ.

Ngoài ra, tôi khuyên bạn nên kiểm tra con trỏ trên 0, không NULL, vì đôi khi NULL được định nghĩa là (void*)0 theo trình biên dịch C. Nhưng một số người có thể tranh cãi ở đây.

+0

Trình biên dịch C có thể định nghĩa NULL là '(void *) 0', nhưng trình biên dịch C, trình biên dịch C++. Trình biên dịch C++ phù hợp phải định nghĩa NULL là "hằng số con trỏ null C++ được xác định thực hiện" (C++ 03 standard §18.1/4). Vì 0 cũng là một hằng số null hợp lệ, không có lý do kỹ thuật nào để thích 0 hoặc NULL - sự lựa chọn hoàn toàn là kiểu cách. Cá nhân tôi thích NULL vì nó chuyển tải một cách rõ ràng rằng bạn đang xử lý một con trỏ, trong khi với 0 nó không phải luôn luôn rõ ràng từ ngữ cảnh cho dù bạn đang xử lý một số nguyên hay một con trỏ. –

+0

Tôi thích kiểm tra cho NULL nó là trực quan đặc biệt hơn (chờ nullptr) –

+0

@AdamRosenfield Nếu 0 không được thực hiện được xác định và 'NULL', không phải là một lý do kỹ thuật đủ tốt để chọn 0 trên' NULL'? – wilhelmtell

2

Xin xem chú thích của tôi ở trên, nhưng đối với kịch bản của mình để làm việc, bạn cần std::vector<float> * dvertex=NULL;std::vector<float> * dvertex = new std::vector<float>();

3

Nếu bạn đang đi để thay đổi vector, có lẽ bạn chỉ muốn vượt qua nó bằng cách tham khảo. Tuy nhiên, nếu bạn sử dụng con trỏ, bạn cần phải xác định vectơ trong chính và sau đó chuyển địa chỉ của vectơ đó:

void calculate(std::vector<float> *vertex_array) { 
    vertex_array->pushback(1.0f); 
    vertex_array->pushback(2.0f); 
} 

int main() {  
    std::vector<float> vertexes; 
    calculate(&vertexes); 

    std::copy(vertexes.begin(), vertexes.end(), 
     std::ostream_iterator<float>(std::cout, "\n")); 
    return 0; 
} 
Các vấn đề liên quan