2012-02-06 179 views
2

我得到一個編譯器錯誤:編譯錯誤:從'int'無效轉換爲'int *'[-fpermissive] |

main.cpp|59|error: invalid conversion from 'int' to 'int*' [-fpermissive]|

出錯行是

int *pComienzo = vector, *pFinal = vector[nElementos-1]; 

爲什麼有錯誤?有人能幫我嗎?

下面是我的代碼:

#include <iostream> 
#include <ctype.h> 

using namespace std; 
const unsigned short int MAX_VAL = 10; 

int LongitudCadena(char*); 

int BuscarCaracter(char *cadena, char caracter); 

void Ordenar(int *vector, int nElementos, bool ascendente); 

int main() 
{ 
    char *cadena = "asdasd"; 

    cout << LongitudCadena(cadena) << endl; 

    cout << BuscarCaracter(cadena, 'a') << endl; 

    int iArray[] = {5,4,3,2,1}; 

    Ordenar(iArray, 5, 1); 

    cout << iArray << endl; 

    return 0; 
} 

int LongitudCadena(char *cadena) 
{ 
    char *c = cadena; 
    for(int i = 0; i < MAX_VAL; i++) 
    { 
     if (c[i] == 0) break; 
     cadena++; 
    } 

    return cadena - c; 
} 

int BuscarCaracter(char * cadena, char caracter) 
{ 
    char *pCadena = cadena; 
    for (int i = 0; i < MAX_VAL; i++) 
    { 
     pCadena++; 
     if (toupper(cadena[i]) == toupper(caracter)) 
     return pCadena- cadena; 
    } 

    return -1; 
} 

void Ordenar(int *vector, int nElementos, bool ascendente) 
{ 


    int *pComienzo = vector, *pFinal = vector[nElementos-1]; 

    if (ascendente) 
    { 
     for (int i = 0; i < nElementos; i++) 
     { 
      for (; pComienzo < pFinal; pComienzo++, pFinal--) 
      { 
       if (*pComienzo > *pFinal) 
       { 
        *pComienzo += *pFinal; 
        *pFinal -= *pComienzo; 
        *pComienzo -= *pFinal; 
       } 
      } 
     } 
    } 
} 

我學習......

+1

我很確定它是'* pFinal = vector [nElementos-1]'節。請記住,雖然「vector」是一個「int *」,但它的單個元素是常規的「int」。 – 2012-02-06 21:55:06

回答

5

你的錯誤是在這一行:

int *pComienzo = vector, *pFinal = vector[nElementos-1]; 

這樣做的原因是,vectorint*,但vector[nElementos - 1]是一個正規的int。因此,該聲明

int *pFinal = vector[nElementos - 1]; 

試圖整數值的vector最後索引在分配給指針pFinal,因此編譯錯誤。

要解決這個問題,你可能想要做的任何

int *pFinal = &vector[nElementos - 1]; 

這使得pFinal點的vector最後一個元素,或者

int *pFinal = vector + (nElementos - 1); 

其完成使用指針運算同樣的事情。

這就是說,既然你在C++中工作,爲什麼不使用提供的std::vector類型,並避免使用指針呢?

希望這會有所幫助!

+0

+1,但我認爲寫'vector +(nElementos - 1)'可能會更好。(注意像'vector + nElementos + 1 - 2'這樣的東西會是不確定的行爲,'vector + nElementos - 1'在技術上很好,但是活在邊緣!) – ruakh 2012-02-06 21:57:33

+0

@ ruakh-啊,是的,謝謝!固定。 – templatetypedef 2012-02-06 21:58:05

+0

@ruakh:我已經移出了C/C++版本,所以我沒有一個編譯器可以方便地嘗試,但我的印象是「vector + nElementos + 1-2」是完全合法的。我認爲一般來說,一個指針加上一個算術表達式會導致內部的整數值加上指向該指針的對象的大小。 – Jay 2012-02-06 22:06:53

2

vector是一個指針,但將其下標爲vector[nElementos-1]將它解引用爲簡單的int。它是什麼樣子,你要的是不是

int *pComienzo = vector, *pFinal = &(vector[nElementos-1]); 
0

訪問數組/標(即a[i]其中a是一個數組/指針和i爲整數)與類型的表達式是您在擁有的東西陣列。

只需使用地址的運營商&的地址存儲在指針:

int *pComienzo = vector, *pFinal = &vector[nElementos-1]; 
0

你忘了&vector[nElementos-1]是價值,而您需要的地址爲pFinal

可以是*pFinal = &(vector[nElementos-1])*pFinal = vector + nElementos-1

相關問題