2013-01-15 19 views
7

Sono nuovo di C++ e sto scrivendo il seguente codice. Avevo bisogno di iterare su tutti i componenti aggiuntivi nella mia funzione di chiamata - testFunction. So che questo funziona in C#, ma questo codice non funziona. Qualcuno può indicare il modo giusto per farlo in C++?foreach in C++ int array

#include "stdafx.h" 
#include <iostream> 
#include "resource.h" 

int testFunction(char* tester); 
int _tmain() 
{ 
    int mainProd=2; 
    int Addons[]={7,8,9,10}; 

    testFunction(mainProd,Addons); 


} 
void testFunction(int mainProd,int addons[]) 
{ 
    for(int x = 0 ; addons.length;++x) ---- Not working 
    { 
     std::cout<< addons[x]; 
    } 
} 

ho cercato di attuare vettore come di seguito i suggerimenti da voi ragazzi

#include "stdafx.h" 
#include <iostream> 
#include "resource.h" 
#include <vector> 

void testFunction(std::vector<int> addons); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    std::vector<int> Addons ; 
    for(int i = 0 ;i<10;++i) 
    { 
     Addons.push_back(i); 
    } 
    testFunction(Addons); 
} 

void testFunction(std::vector<int> addons) 
{ 
    for(int i =0 ; i<addons.size();++i) 
    { 
     std::cout<<addons.at(i); 
    } 
} 
+7

Dove ha preso l'idea che '.length' avrebbe funzionato? Forse hai bisogno di scegliere [un libro migliore] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)? –

+0

Cosa dice il tuo libro C++ preferito? –

+4

fordward dichiara anche la versione corretta di testFunction. – qPCR4vir

risposta

14

Un array (un array di prime) decade in un puntatore quando passato come argomento a una funzione, in modo che il l'array non ha informazioni sulla dimensione.

È necessario passare esplicitamente la lunghezza della matrice nella funzione per conoscerla all'interno della funzione.

In alternativa, e meglio, utilizzare uno std::vector e quindi si avrà il .size() sempre disponibile quando necessario.

+3

Oppure 'std :: array' se la dimensione è risolto in fase di compilazione. –

+0

Perché hai una funzione con un parametro 'char *' dichiarato prima del tuo principale e solo definito quello corretto dopo. http://ideone.com/2H1xX8 –

+0

o passare un array per riferimento – TemplateRex

7

Oltre ad utilizzare vettori, come suggerisce Tony, è possibile utilizzare i modelli e passa la matrice per riferimento in modo che il compilatore dedurre la dimensione della matrice:

template<int N> 
void testFunction(int mainProd,int (&addons)[N]) 
{ 
    for(int x = 0; x < N; ++x) // ---- working 
    { 
     std::cout<< addons[x]; 
    } 
} 
2

Se si sceglie di usare un std::vector o std::array, si potrebbe usare std::foreach,

std::vector<int> addons = {7,8,9,10}; 
std::array<int, 4> addons = {7,8,9,10}; // Only use one of these... 
std::foreach(addons.begin(), addon.end(), [](int i) { 
    std::cout << i 
}); 
+0

Il lambda dovrebbe prendere int, non un iteratore –

+0

@ArmenTsirunyan Errore, mi dispiace. –

+0

Potrebbe anche usare la nuova gamma, per allora. –

2

stai usando concetti di C# in C++, ma, anche se si assume che entrambe le lingue sono simili, non sono uguali.

La sintassi per una distanza-for in C++ è the following:

for (type identifier : container) // note the ':', not ';' 
{ 
    // do stuff 
} 

È possibile utilizzare questo per sapore se si dispone di un C++11 compiler.

Btw, sembra che si sta utilizzando immobili in codice:

for(int x = 0 ; addons.length;++x) // what is lenght? 
{ 
    std::cout<< addons[x]; 
} 

Non c'è nulla di simile in C++, se si desidera chiamare un metodo di oggetto è necessario chiamare come una funzione:

// assuming that the object 'addons' have a method 
// named 'length' that takes no parameters 
addons.length(); 

Ma la variabile addons non è un oggetto, è un array (date un'occhiata a this tutorial), in modo da non avere un metodo o una proprietà denominata length; se è necessario conoscerne la lunghezza per iterarlo è possibile utilizzare in alcuni contesti l'operatore sizeof (consultare il tutorial per maggiori informazioni).

Supponiamo che addons erano un contenitore:

typedef std::vector<addon> Addons; 
Addons addons; 

Se volete iterare utilizzando il C++ 11 gamma-per, si può scrivere come segue:

for (addon a : addons) 
{ 
    // do stuff with a. 
} 

Speranza aiuta.

+0

Ci sono molti refusi in questa risposta. –

+0

@AlexChamberlain potresti aiutarmi a risolverlo? non ho trovato errori di battitura, forse ti stai riferendo alla mia mancanza di abilità in inglese? –

1

codice sta lavorando con questo

for (int i = 0; i < (fine (array) - inizio (array)); i ++)

dimensione massima di ritorno

Verificare se gamma è vuoto

array::empty 

elemento dell'array

array::size 

Array dimensioni

sizeof()