2013-08-05 4 views
1

Tout d'abord, je sais que mon titre ressemble à une question fréquemment posée, mais écoutez-moi. Quand je dis «arguments d'analyse», je ne parle pas des arguments de ligne de commande qui sont transmis au programme au démarrage. J'essaye de créer un système séparé pour recevoir des commandes et les analyser dans l'exécution.Analyse des arguments en C++

principal:

int main(int argc, char *args[]) 
{ 
    cout << "Started up." << endl; 
    reloop(); 
} 
// Main execution point. Prints text to the console and moves to a void: 

void reloop() 
{ 
    char *str; 
    cin >> str; 
    parseargs(str); 
} 
// Starts waiting for inputted data, if found, move onto parseargs void. 

void parseargs(char *args) 
{ 
    char *strings[10]; 
    char delim[] = " "; 
    int i = 0; 
    strings[i] = strtok(args,delim); 

    if(strings[0] == "try") 
    { 
     cout << "WORKED!" << endl; 
     reloop(); 
    } 
    else 
    { 
     cout << "Na. Didn't work." << endl; 
     reloop(); 
    } 
} 
// Takes the arguments passed to it, splits them via a space and passes them to an array. From here, compares the first entry in the array to a command. If they equal, output success note. 

Maintenant, je suis un programmeur C# pour un certain temps et ont tout juste commencé C++ .. Qu'est-ce que je fais mal? Lorsque le programme démarre, une erreur arrive avec:

Debug Assertion Failed! 
Program: C:\Windows\system32\MSVCP110D.dll 
File: c:\program files\microsoft visual studio 11.0\vc\include\istream 
Line: 990 
Expression: Invalid null pointer 

* Note: J'ai des déclarations pour chacune des fonctions en haut du fichier RPC.

+1

Quelle est la ligne 990? –

+2

Et vous ne pouvez pas comparer les chaînes 'char *' en utilisant '=='. Utilisez 'strcmp()' ou regardez 'std :: string'. Est-ce que 'cin >> char *' fonctionne réellement? Il n'y a pas de mémoire allouée sauf si cin le fait pour vous. Regarde suss pour moi! Et puis il y a la pile. Votre pile ne cesse de grossir chaque fois que l'analyse échoue ... – John3136

+0

Vous avez bien sûr réduit le problème à la ligne qui cause l'erreur, n'est-ce pas? – JJJ

Répondre

3

Un bug que je peux trouver dans votre code est en fonction void reloop()

char *str; 
cin >> str; <---"Undefined behavior" 

Vous n'allouez pas de mémoire pour str.

corriger non plus:

  1. char str[SIZE];
  2. allouent espace Dynamiquement: char* str = new char[SIZE];

erreur suivante est:

if(strings[0] == "try") 

devrait être:

if(strcmp(strings[0], "try")!=0) 
+0

Merci! Je vais faire les changements maintenant. – Daaksin

+0

@Daaksin votre accueil! Souvenez-vous que la mémoire allouée dynamiquement doit être supprimée explicitement en utilisant 'delete'. lire à ce sujet. –

+0

Wow, c'est une nouvelle chose hahaha. Merci encore! – Daaksin

1
void reloop() { 
    char *str; /* WRONG */ 
    cin >> str; 
    parseargs(str); 
    } 

Vous devriez avoir écrit cette façon:

void reloop() { 
    char str[BUF_MAX]; /* ok but take care of buffer overflow; maybe use std::string */ 
    cin >> str; 
    parseargs(str); 
    } 
1

Même si vous connaissez C# S'il vous plaît noter que vous ne savez pas quoi que ce soit au sujet de C++ et que même si vous êtes l'intuition très intelligement vous guider dans le mauvais chemin (en fait en particulier si vous êtes très intelligent: C++ dans un certain nombre de parties est en effet "illogique", donc un esprit logique ne va pas aider du tout). La raison en est que le C++ est un mélange de raisons complexes, incluant l'effet de comité et beaucoup d'héritage historique. Peu importe à quel point vous êtes intelligent, vous n'allez pas deviner ni l'histoire ni ce qu'un comité a décidé.

Comment char * font partie de C++ est une de ces choses qui ne peuvent être comprises que si vous connaissez l'histoire (en particulier l'histoire de C). L'erreur dans votre programme est que vous ne pouvez pas écrire

char *str; 
cin >> str; 

parce que vous n'avez pas alloué la mémoire pour cela. Ce serait aussi un mauvais code car il déborde potentiellement de la mémoire que vous allouez. Si vous manquez cela alors vous allez manquer beaucoup d'autres points beaucoup plus subtils de programmation C++. Faites-vous plaisir et commencez par lire la couverture vers la couverture a good C++ book au lieu de simplement expérimenter avec un compilateur.Expérimenter n'est pas un chemin raisonnable avec C++ en raison de sa structure très complexe et parfois illogique et du fait d'un "comportement indéfini" qui signifie qu'en cas d'erreur, vous ne pouvez pas compter sur un message d'erreur clair. y compris le comportement fou le plus dangereux ... c'est-à-dire que le code fonctionnera apparemment de toute façon même lorsqu'une erreur est présente).

+0

Merci pour votre commentaire, je vais chercher dans un livre pour C++! – Daaksin