2013-11-23 38 views
1

我現在搜索了很多,但我仍然無法找到任何解決方案......事情是,我試圖製作一個程序,將不同的點存儲在座標系中,並將它們顯示在屏幕上(稍後會變成一種圖形,但我還沒有完成)。但不幸的是,我已經受夠了這一些問題...
我決定把所有的點,存儲地址後,對方字符串類型,像這樣:int類型的指針在C++中不能正確配合

string p; 
string * pointer = &p; 
p = "5, 3"; 
*(&p+1) = "6, 4"; 
*(&p+2) = "7, 5"; 
cout << *pointer << *(pointer+1) << *(pointer+2); 

或者這樣:

string p; 
string * pointer = &p; 
p = "5, 3"; 
*(pointer+1) = "6, 4"; 
*(pointer+2) = "7, 5"; 
cout << *pointer << *(pointer+1) << *(pointer+2); 

但每當我去排隊4或5,我得到在裝配的memcpy該行的錯誤:

mov  [edi],al  ;U - write second byte to destination 

因此很明顯,這不工作...
我開始懷疑它與指針指向字符串類型的地址的事實有關,它由char數組組成,但我不知道爲什麼以及如何...如果它現在是像這樣,爲什麼甚至有可能使用字符串指針?

無論如何,任何解決方案/解釋真的很感激。我過去並沒有真正使用過指針,所以如果我錯過了一些明顯的東西,請原諒我。但正如所說,我試圖尋找這一點,我什麼都找不到。

回答

4

你的第一個代碼甚至不會編譯。

你的第二代碼試圖值存儲到大概位於存儲器pstd::string對象。但內存中p後面沒有std::string個對象。任何將任何東西「存儲」到那些不存在的對象中的嘗試都會導致未定義的行爲。

如果你的聲明作爲p數組

string p[3]; 
string * pointer = p; 

*pointer = "5, 3";  // same as `p[0] = "5, 3"` 
*(pointer+1) = "6, 4"; // same as `p[1] = "6, 4"` 
*(pointer+2) = "7, 5"; // same as `p[2] = "7, 5"` 

cout << *pointer << *(pointer+1) << *(pointer+2); 

那麼代碼的第二個版本將安全存儲的字符串成數組的連續元素。

但是你現在只是沒有意義。目前還不清楚你想要做什麼。

+0

好的,我明白你的意思了。現在當我想到它時,我所做的很愚蠢。非常感謝,真的。 – Max

0

你爲什麼不只是這樣做:

string p1 = "5, 3"; 
string p2 = "6, 4"; 
string p3 = "7, 5"; 
cout << p1 << p2 << p3; 

如果你有更多的點,你可以使用一個這樣的載體:

vector<string> points; 
points.push_back("5, 3"); 
points.push_back("6, 4"); 
points.push_back("7, 5"); 
cout << points[0] << points[1] << points[2]; 

順便說一句,你爲什麼要將座標存儲在字符串中而不是浮點數組中?

+0

這只是爲了調試我的代碼。其餘部分與指針非常吻合。不過謝謝。 – Max

1

不要使用指針,它們很難,並且你對它們的工作方式有一些嚴重的(和奇怪的)誤解。只需使用一個矢量。

#include <vector> 

struct Point 
{ 
    Point(int xx, int yy) : x(xx), y(yy) {} 
    int x; 
    int y; 
}; 

std::vector<Point> p; 

p.push_back(Point(5,3)); 
p.push_back(Point(6,4)); 
p.push_back(Point(7,5)); 

我已經定義了一個簡單的Point類,因爲這也似乎是合理的,如果你正在寫一本關於積分計劃。但是,如果您真的想將您的積分存儲爲字符串,請將std::vector<Point>替換爲std::vector<std::string>

+0

我知道指針是如何工作的,即使我沒有和他們合作過。不管怎樣,我不認爲避免困難的事情是要走的路(這樣,我永遠不會學習它)。我在代碼中通過引用傳遞了很多其他的東西,所以在這種情況下,我需要指針。不過謝謝。 **編輯:** _實際上,我應該提到這部分只是爲了調試的目的... _ – Max

+0

爲此目的使用矢量比使用指針更簡單。沒有一點使用複雜的方法時,有一個更簡單,更優越。如果你還沒有使用指針,我懷疑你是否知道它們有多少陷阱,無論你有什麼理論上的理解。 – john

+0

我明白了。但在這種情況下,我的代碼或多或少是基於指針的,所以這意味着現在有很多工作要改變它(除此之外,它甚至不是一個嚴肅的項目,主要用於教育目的)。儘管如此,我會確保在將來注意矢量。 – Max

0

首先,你需要一個std :: string對象的地址,然後你增加它--std :: string不是(w)char[]。它確實連續存儲數據,但它也以實現定義的方式存儲一些元數據。所以你覆蓋了正好在內存中的東西 - 而且你用一些與它的類型不匹配的東西覆蓋它,所以它甚至不會編譯。

當操縱std :: strings時,可以使用operator []來讓你訪問字符串的實際數據。

這就是說,我很確定你不想存儲隨機指向字符串。理想情況下,使用T x, y;數據成員創建類Point<T>以存儲座標。