2012-02-06 23 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]'セクションだと確信しています。 「ベクトル」は「int *」ですが、個々の要素は通常の「int」です。 –

答えて

5

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

この理由はvectorがあるということですint*ですが、vector[nElementos - 1]は通常のintです。したがって宣言

int *pFinal = vector[nElementos - 1]; 

ポインタpFinal、従ってコンパイラエラーにvectorの最後のインデックスで整数値を代入しようとしています。

は、この問題を解決するには、次のいずれかの

int *pFinal = &vector[nElementos - 1]; 
vectorの最後の要素に pFinalポイントを作る

、またはポインタ演算を使用して同じことを実現

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

を行うことをお勧めします。

あなたはC++で作業しているので、付属のstd::vectorタイプを使用して、ポインタで作業しないでください。

希望すると便利です。

+0

+1ですが、おそらく 'vector +(nElementos - 1)'と書く方が良いでしょう。(ベクトル+ nElementos + 1 - 2のようなものは未定義のビヘイビアであることに注意してください。ベクトル+ nElementos - 1は技術的には問題ありませんが、エッジに住んでいます) – ruakh

+0

@ ruakh-ああ、ありがとう!一定。 – templatetypedef

+0

@ruakh:私はC/C++の土地から移動しましたので、これを試すにはコンパイラを使いませんでしたが、 "vector + nElementos + 1 - 2"は完全に合法であるという印象を受けました。私は一般的に、ポインタと算術式の結果が、内部的に整数値にポインターに指されたオブジェクトのサイズの倍を加えたと考えました。 – Jay

2

vectorはポインタですが、vector[nElementos-1]という添字は単純にintに参照されます。何がしたいように見えることは代わりに

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

配列アクセス/添字であるあなたが持っているものであることタイプで表現された(すなわち、aが配列/ポインタであるa[i]iは整数です)アレイ。

単にポインタにアドレスを格納するアドレス演算子&を使用します。

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

あなたは&を忘れてしまいました。 vector[nElementos-1]は値ですが、pFinalのアドレスが必要です。

*pFinal = &(vector[nElementos-1])または*pFinal = vector + nElementos-1のいずれかです。

関連する問題