2012-02-06 160 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

相关问题