2010-04-01 7 views
0

En essayant de créer un tableau de structures tm *, puis de les retourner à la fin de la fonction. Voilà ce que j'ai en ce moment:Renvoyer un tableau de structures tm * à partir d'une fonction

struct tm* BusinessLogicLayer::GetNoResponceTime() 
{ 
    struct tm* time_v[3]; 
    struct tm* time_save; 
    int s = 3; 
    time_save = LastSavedTime(); 
    time_v[0] = time_save; 
    sleep(5); 
    time_save = LastSavedTime(); 
    time_v[1] = time_save; 
    sleep(5); 
    time_save = LastSavedTime(); 
    time_v[2] = time_save; 

    return time_v; 
} 

Je comprends qu'étant donné le code que j'ai maintenant il ne sera pas possible de retourner le tableau, car il sera détruit lorsque la fonction se termine. Quelqu'un peut-il m'aider en ce qui concerne la façon dont je serais en mesure d'accéder au tableau de la valeur retournée après la fin de la fonction?

Cordialement

Paul

+0

Voulez-vous dire « un tableau de' tm' struct » ou « un tableau de 'tm * 'pointeurs à structs"? – MSalters

+0

un tableau de tm * – paultop6

Répondre

4

Soit allouer le tableau sur le tas, mais vous aurez besoin de se rappeler de delete[] le tableau lorsque vous avez fini de l'utiliser.

tm* time_v = new tm[3]; 

Ou, comme cela est C++, une meilleure option serait d'utiliser un vector

std::vector<tm> time_v(3); 

Le vecteur lui-même est alloué sur la pile, mais il contient un tableau qui est alloué sur le tas. Lorsque vous copiez le vecteur (par exemple en le renvoyant), le contenu du tableau sous-jacent est également copié.

Vous pouvez également simplifier la fonction par ne pas utiliser la variable temp time_save

time_v[0] = *LastSavedTime(); 
sleep(5); 

time_v[1] = *LastSavedTime(); 
sleep(5); 

time_v[2] = *LastSavedTime(); 

Les déclarations de struct de style C ne sont pas tenus en C++

struct tm* time_v[3]; 

//should be 
tm* time_v[3]; 
+0

Cela n'aurait pas dû être 'std :: vector time_v (3);' et idem pour la variante 'new'? –

+0

cela me semble correct – Elemental

+0

@Andreas Cela dépend de beaucoup plus que l'échantillon de code donné, mais je soupçonnerais du fait qu'il semble être un moment où il ne devrait pas être un problème de ne pas utiliser de pointeurs. – Yacoby

4

Créer une copie et revenir qu'au lieu:

vector<tm> ret; 
struct tm* time_save; 

time_save = LastSavedTime(); 
ret.push_back(*time_save); 

Sleep(5); 
time_save = LastSavedTime(); 
ret.push_back(*time_save); 

Sleep(5); 
time_save = LastSavedTime(); 
ret.push_back(*time_save); 

return ret; 

Vous aurez évidemment besoin de changer la signature.

0

Désolé Paul, une légère pressé, essayez mais cela ...

struct tm* time_v = new struct tm[ 3 ]; 

Ce allouera les structures pour vous, et vous puis cela les initialiser et revenir selon le code fourni dans la fonction .

Je voudrais cependant vous rappeler qu'une fois qu'il est pas nécessaire, s'il vous plaît libérer la mémoire en utilisant « supprimer »

Hope this helps - Neil

Questions connexes