C ++ ішіндегі массаны қайтарады

Мен C ++-ның жалпы нобаймын және менің әдістерімнен массивді қайтаратын қиындықтарым бар. Менде келесі әдіс декларациясымен тақырып файлдары бар:

virtual double[]
echoDoubleArray(double[] doubleArray, int arraySize) throw (RemoteException);

Бұл маған келесі қатені береді:

../common/EchoService.h: At global scope:
../common/EchoService.h:25: error: expected unqualified-id before ‘[’ token

Жиынды қайтарудың дұрыс жолы қандай?

1
Ерекше ерекшеліктер ресми түрде ескерілмегенін есте сақтаңыз.
қосылды автор StackedCrooked, көзі
Екі еселенген массивді қайтаратын функцияның дұрыс синтаксисі double foo() [5] болады. Дегенмен, C де, C ++ де функциялар массивтерді қайтаруға мүмкіндік береді.
қосылды автор Kerrek SB, көзі
Ерекше ерекшеліктерді пайдаланбаңыз, олар адамдардың көпшілігі ойлағандарын жасамайды. Олар C ++ 11-де жойылды.
қосылды автор K-ballo, көзі

6 жауаптар

C++ doesn't play nice with non-local arrays, more likely you should be using an actual container like std::array or std::vector. I don't think it's possible to return an array from a function.

6
қосылды

You'll better use std::vector or if you really want to return a plain array, return a pointer (to such an array) dynamically allocated with e.g.

double* arr = new double[arrSize];
// fill arr appropriately
return arr;

But I'll recommend returning a std::vector instead.

2
қосылды

Көрсеткілерге емес ыдырататын массивтерді өткізу әдістемесі бар. Төмендегі синтаксисті пайдаланып, массив сілтемесі бойынша өтеді. Қажетті «қосымша» паренс - бұл синтаксистік соқыр, және, мүмкін, бұл пайдалану неғұрлым кең таралмайды. Оған артықшылықтары ескеріле отырып, оны тез үйренеді.

void sub(double (&foo)[4])
{
    cout << sizeof(foo) << endl;
}

Басып шығару 32, өлшемі емес (қос *), өйткені foo түрін шын мәнінде 4 4 данадағы массивке сілтеме болып табылады. Үлгілерді пайдаланып, массивтің кез-келген өлшемімен жұмыс істеу үшін қорытуға болады:

template  sub(double (&foo)[N])
 {
    cout << sizeof(foo) << endl;
 }

 double bar[5];
 double zot[3];
 sub(bar);//==> 40
 sub(zot);//==> 24

Кез-келген өлшемді массивтерді өңдеу үшін қайтадан қорытуға болады:

template void sub(T(&foo)[N])
    {
        cout << sizeof(foo) << endl;
    }

double bar[5];
char zot[3];
sub(bar);//==> 40
sub(zot);//==> 3

және сіз қазірдің өзінде өтіп жатқан массаның түріне немесе өлшеміне қарамастан, «суб» дерексіз идеясын басып шығаратын нәрсе бар.

1
қосылды

The C++ syntax for arrays is: std::vector instead of double[]. It also requires you to put #include near the top of your source file. Other than that they work very similar to C-arrays.

0
қосылды
бұл жауап өте қате.
қосылды автор JosephH, көзі
how дегенді түсіндіру үшін std :: vector - бұл олардың орнына емес, алаптарға балама. C ++ әлі күнге дейін C-стилі массивтеріне қарамастан олардың барлық шатастыратын көрсеткіш тәуелді даңқы бар.
қосылды автор Keith Thompson, көзі
C ++ массивтерінің синтаксисі емес std :: vector болып табылады.
қосылды автор Marlon, көзі

Сұрағыңызға тікелей жауап беру үшін, егер сіз екі есе көп массивтерді жарияласаңыз:

double doubleArray[] = {1.0, 2.0, 3.0};

келесі әдісті жариялай аласыз:

virtual double *
echoDoubleArray(double* doubleArray, int arraySize) throw (RemoteException);

Массивдер көрсеткіштер ретінде беріледі. C ++-нің шынайы күшін пайдаланғыңыз келсе, онда басқа жауаптарда берілген кеңесті орындаңыз.

0
қосылды

Өкінішке орай, сіздердің сұрақтарыңызға жауап берудің орнына заманауи STL түріндегі бағдарламалауды пайдалану туралы айтады. Олар дұрыс. Бірақ сіз қалай жұмыс істейтінін түсінуіңіз керек. Қайтарылатын массивтермен байланысты мәселе функцияңызда жасалған массивтердің үстінде болады. Сіз өзіңіздің функцияңызды қалдырсаңыз, олар енді жоқ болады. Не істей аласың, Хабта массивке көрсеткішті қайтарады. Түсіну үшін жинақ пен үйме туралы біразырақ зерттеуге тырысыңыз. Бірақ төменде - қарапайым C ++ функциясы, Хабта бөлінген массаны қайтарады.

#include 

double * MakeArray()
{
   double *mydouble = new double[5]; 
   mydouble[1]=1.1;
   mydouble[1]=2.2;
  return mydouble;
}

int main()
{

  double *d=MakeArray();
  std::cout<

өңдеу:

Бұл туралы ойланудың тағы бір жолы - оны STLсіз орындаудың тағы бір жолы оның құрамында құрылымды қайтару еді. Көптеген компиляторлар құрылымды мәнмен қайтарады (сіздің ендірілген бағдарламамен жұмыс жасамасаңыз).

Probably the best simple way: Pass your array into the function. It is like passing a reference because you are really just passing a pointer.

#include 

void MakeArray(double d[5])
{
  d[0] = 0.0; d[1] = 1.1;
  d[2] = 2.2; d[3] = 3.3; d[4] =4.4;
}

int main()
{
  double dub[5];
  MakeArray(dub);
  std::cout<

Барлығын қалай жұмыс істейтінін түсінгеннен кейін. STL пайдалану керек.

0
қосылды
Параметрлер декларациясындағы 5 параметрі еленбейді. void MakeArray (double * d), void MakeArray (double d []) және void MakeArray (double d [5]) .
қосылды автор Keith Thompson, көзі
Мәселе бұл массивтердің стекке тиесілі емес. Сіздің функцияңыздағы динамикалық массивке көрсеткішті қоса алғанда қайтарылатын басқа нәрсе де. Mooing Duck-тегі проблема «C ++ жергілікті емес массивтермен жақсы ойнайды емес» дегенді білдіреді, себебі кез-келген басқа конструкция құндылығы бойынша қайтарылуы мүмкін және көшірме жасалады. Бірақ массивтер мүмкін емес.
қосылды автор Benjamin Lindley, көзі
@JoeMcGrath: Мен айтқанымдай, олар кез-келген басқа конструкцияның көп болуы мүмкін болса да, оларды құндылықтармен қайтаруға болмайды (егер ол қоғамдық көшірмесі бар болса). Немесе маған неге мәнін қайтаруға болмайды?
қосылды автор Benjamin Lindley, көзі
@JoeMcGrath: Мен білмеймін, бұл мені қызықтырмайтын тарихи нәрсе.
қосылды автор Benjamin Lindley, көзі
@Benjamin Lindely: Неге ол жақсы ойнайды?
қосылды автор Joe McGrath, көзі
@BenjaminLindley: неге құндылығы бойынша қайтарылмайды?
қосылды автор Joe McGrath, көзі