2012-02-21 3 views
1

J'essaie donc de faire fonctionner une fonction de tri. Il devrait trier par prénom, mais si les prénoms sont les mêmes, il devrait trier par nom de famille. Je continue d'obtenir une erreur dans mySort() qui dit "expression primaire inattendue avant") "jeton" sur la ligne où inOrder = arr. Qu'est-ce qui se passe à cela et comment puis-je le réparer? J'ai besoin de passer mes objets dans une fonction dans une classe séparée. Je les lierai dans pastebin.Fonction de tri C++

Voici le pilote

#include <iostream> 
#include <fstream> 
#include <string> 
#include "phoneEntry.h" 
using namespace std; 

void mySort(PhoneEntry& arr, int size) 
{ 
    bool inOrder = false; 
    for (int i = size - 1; i > 0 && !inOrder; i--) 
    { 
     inOrder = true; 
     for (int j = 0; j < i; j++) 
     { 
      inOrder = arr.alphaGreater(arr&); 
     } 
    } 
}; 

int main() 
{ 
    const int MAXNUM = 500; 
    PhoneEntry entry[MAXNUM]; 
    ifstream filezilla; 
    filezilla.open("phone.txt"); 
    int count = 0; 

    if(filezilla) 
    { 
     while(count < MAXNUM && entry[count].readEntry(filezilla)) 
     { 
      count++; 
     } 
     mySort(entry&, count); 
     for(int i = 0; i < count; i++) 
     { 
      entry[i].writeEntry(cout) << endl; 
     } 
    } 
    else 
    { 
     cout << "Four Oh Four - File Not Found" << endl; 
    } 

    return 0; 
} 

Phone Entry Header

Phone Number Header

Tri Texte (http://pastebin.com/HE8Rsmbg)

+0

Est-ce à des fins d'apprentissage?Si ce n'est pas le cas et que vous en avez besoin pour le travail/loisir, je recommande l'un des algorithmes de tri standard dédiés, qui ont des cibles différentes comme "tri complet", "top XXX, trié", "top XXX, non trié", reste reste non trié ", etc. –

Répondre

3

Vous voulez passer une référence, de sorte que le l'argument doit être défini comme appel par référence dans la définition/déclaration de la fonction, ce qui est déjà fait:

bool PhoneEntry::alphaGreater(const PhoneEntry& item) const; 

Comme vous pouvez le voir, PhoneEntry::alphaGreater prend une PhoneEntryréférence constante. Donc, il suffit d'utiliser

inOrder = arr.alphaGreater(arr); 
+0

Est-ce que tous les objets passent en référence? Je continue à courir dans les erreurs d'initialisation dans mon principal quand j'essaye de passer mon objet comme référence. Merci aussi pour l'aide, j'accepterai la réponse en 3 min quand ça me le permettra! –

+1

@JohnSmith: Voir http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29, http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29. Les objets ne seront transmis comme référence que s'ils sont utilisés dans une fonction d'appel par référence. – Zeta

+0

Je ne suis pas sûr que ce soit la bonne réponse. Je ne sais pas ce qu'il essaie de faire avec 'alf &' dans ce contexte, et je soupçonne qu'il veut passer le tableau à 'mySort', et pas seulement une seule instance. (Et bien sûr, vous ne pouvez pas passer des tableaux de style C aux fonctions, donc son tableau devrait être 'std :: vector ' Sinon, il est bloqué avec des hacks maladroits impliquant une conversion implicite en pointeur et autres.) –

0

vous pouvez passer comme pointeurs aussi

1

Il y a plusieurs choses mal avec votre code. Le premier, celui sur lequel le compilateur se plaint, est qu'il n'y a pas d'opérateur postfixe & en C++. Je ne sais pas exactement ce que vous essayez de faire avec, ou ce que vous pensez que cela signifie, mais il n'existe pas en C++. Le deuxième est que mySort prend une référence à un PhoneEntry unique; vous avez un tableau de PhoneEntry, donc vous devrez en sélectionner un pour passer le . Sauf que le nom de la fonction et le fait que vous réussissiez un nombre de suggèrent que vous voulez vraiment passer un tableau.

Et je ne peux pas comprendre ce que mySort est supposé faire. Il ne trie certainement rien; en fait, il semble fondamentalement un no-op coûteux, puisqu'il ne renvoie rien, il ne modifie pas arr, et il n'accède ni ne modifie aucun état global.

Pour le reste, vous avez besoin de plus de contrôle d'erreur sur l'entrée (le fait ouvert réussir, etc.), et vous devriez vraiment utiliser std::vector, plutôt que un tableau de style C. (Il y a des cas où les tableaux de style C sont appropriés, mais ce n'est pas l'un d'entre eux.)

Plus fondamentalement, je vous suggère d'obtenir un bon livre et de l'étudier. ( recommandons Principes de programmation de Stroustrup et de la pratique en utilisant C++.) Vous ne pouvez pas écrire un programme dans aucune langue sans connaître au moins les les bases les plus basiques et la syntaxe de base.

+0

Je ne suis pas sûr, je suis juste en train de suivre ce que mes devoirs veulent, ça va très loin pour tout. ne fait pas vraiment le tri, alphaGreater() fait le tri mais j'avais besoin de modifier une fonction de code de tri prédéfinie dans mon devoir (qui est un tri à bulles) pour passer des valeurs dans alphaGreater() qui devrait trier par ordre alphabétique. On m'a appris que le '&' operato r signifie "Passer par référence" –

+0

'alphaGreater' ne peut agir que sur ses arguments: l'objet sur lequel il est appelé et l'argument que vous lui transmettez. Dans votre code, ils sont la même chose, donc je ne vois pas comment cela peut changer l'ordre de n'importe quoi. Et en fonction du contexte: l'opérateur binaire '&' signifie au niveau du bit et l'opérateur du préfixe '&' prend l'adresse de, et il n'y a pas d'opérateur de suffixe '&' dans C++. Dans une déclaration (pas une expression), un préfixe '&' signifie une référence, mais seulement dans une déclaration, et c'est toujours un préfixe. Et encore une fois, je suggère vraiment un bon livre; il y a juste trop à couvrir dans une réponse ici. –