斯坦福CS106B Lexicon库foreach功能不起作用

时间:2012-06-25 04:06:08

标签: c++ debugging

我和所有图书馆玩了很长时间(可能是2个月)。

所有其他集合类(如vectorstack,队列都运行良好。

然而,当我使用Lexicon Library时。所有事情都顺利进行,除非我使用foreach函数逐个提取单词。

有一个错误,我试图找出如何解决它一整天。

Ld ./WordLadder.app/Contents/MacOS/WordLadder normal i386
    cd "/Users/leungtimothy/Desktop/106B assignment/Assignment2-xcode 3/WordLadder"
    /Developer/usr/bin/llvm-g++-4.2 -arch i386 "-L/Users/leungtimothy/Desktop/106B assignment/Assignment2-xcode 3/WordLadder" -LStanfordCPPLib "-L/Users/leungtimothy/Desktop/106B assignment/Assignment2-xcode 3/WordLadder/StanfordCPPLib" "-F/Users/leungtimothy/Desktop/106B assignment/Assignment2-xcode 3/WordLadder" -filelist /Users/leungtimothy/Library/Developer/Xcode/DerivedData/WordLadder-awuwtyghwhswlubvikhvzubfsmuw/Build/Intermediates/WordLadder.build/Debug/WordLadder.build/Objects-normal/i386/WordLadder.LinkFileList -framework Cocoa -framework Carbon -framework QuickTime -lStanfordCPPLib -o "/Users/leungtimothy/Desktop/106B assignment/Assignment2-xcode 3/WordLadder/./WordLadder.app/Contents/MacOS/WordLadder"

ld: bad codegen, pointer diff in _fe::Range::Range()to global weak symbol vtable for _fe::Rangefor architecture i386
Command /Developer/usr/bin/llvm-g++-4.2 failed with exit code 1

我知道它看起来有点乱,是否使用g ++ 4.2的问题?我已经下载了最新的cs106b库。

/*
 * File: lexicon.h
 * ---------------
 * This interface exports the <code>Lexicon</code> class, which is a
 * compact structure for storing a list of words.
 */

#ifndef _lexicon_h
#define _lexicon_h

#include <string>
#include "FOR.cpp"
#include "set.h"
#include "stack.h"

/*
 * Class: Lexicon
 * --------------
 * This class is used to represent a <i>lexicon,</i> or word list.
 * The main difference between a lexicon and a dictionary is that
 * a lexicon does not provide any mechanism for storing definitions;
 * the lexicon contains only words, with no associated information.
 * It is therefore similar to a set of strings, but with a more
 * space-efficient internal representation.  The <code>Lexicon</code>
 * class supports efficient lookup operations for words and prefixes.
 */

#include <cctype>

class Lexicon {

public:

/*
 * Constructor: Lexicon
 * Usage: Lexicon lex;
 *        Lexicon lex(filename);
 * -----------------------------
 * Initializes a new lexicon.  The default constructor creates an empty
 * lexicon.  The second form reads in the contents of the lexicon from
 * the specified data file.  The data file must be in one of two formats:
 * (1) a space-efficient precompiled binary format or (2) a text file
 * containing one word per line.  The Stanford library distribution
 * includes a binary lexicon file named <code>English.dat</code>
 * containing a list of words in English.  The standard code pattern
 * to initialize that lexicon looks like this:
 *
 *<pre>
 *    Lexicon english("English.dat");
 *</pre>
 */

   Lexicon();
   Lexicon(std::string filename);

/*
 * Destructor: ~Lexicon
 * Usage: (usually implicit)
 * -------------------------
 * The destructor deallocates any storage associated with the lexicon.
 */

   ~Lexicon();

/*
 * Method: size
 * Usage: int n = lex.size();
 * --------------------------
 * Returns the number of words contained in the lexicon.
 */

   int size() const;

/*
 * Method: isEmpty
 * Usage: if (lex.isEmpty()) . . .
 * -------------------------------
 * Returns <code>true</code> if the lexicon contains no words.
 */

   bool isEmpty() const;

/*
 * Method: clear
 * Usage: lex.clear();
 * -------------------
 * Removes all words from the lexicon.
 */

   void clear();

/*
 * Method: add
 * Usage: lex.add(word);
 * ---------------------
 * Adds the specified word to the lexicon.
 */

   void add(std::string word);

/*
 * Method: addWordsFromFile
 * Usage: lex.addWordsFromFile(filename);
 * --------------------------------------
 * Reads the file and adds all of its words to the lexicon.
 */

   void addWordsFromFile(std::string filename);

/*
 * Method: contains
 * Usage: if (lex.contains(word)) . . .
 * ------------------------------------
 * Returns <code>true</code> if <code>word</code> is contained in the
 * lexicon.  In the <code>Lexicon</code> class, the case of letters is
 * ignored, so "Zoo" is the same as "ZOO" or "zoo".
 */

   bool contains(std::string word) const;

/*
 * Method: containsPrefix
 * Usage: if (lex.containsPrefix(prefix)) . . .
 * --------------------------------------------
 * Returns true if any words in the lexicon begin with <code>prefix</code>.
 * Like <code>containsWord</code>, this method ignores the case of letters
 * so that "MO" is a prefix of "monkey" or "Monday".
 */

   bool containsPrefix(std::string prefix) const;

/*
 * Macro: foreach
 * Usage: foreach (string word in lexicon) . . .
 * ---------------------------------------------
 * Iterates over the words in the lexicon in alphabetical order.
 */

   /* The foreach macro is defined in foreach.h */

/*
 * Method: mapAll
 * Usage: lexicon.mapAll(fn);
 *        lexicon.mapAll(fn, data);
 * --------------------------------
 * Calls the specified function on each word in the lexicon.  The second
 * form of the call allows the client to pass a data value of any type
 * to the callback function.
 */

   void mapAll(void (*fn)(std::string value));

   template <typename ClientDataType>
   void mapAll(void (*fn)(std::string value, ClientDataType & data),
               ClientDataType & data);

#include "private/lexiconpriv.h"

};

#include "private/lexiconimpl.cpp"

#endif


/*
 * File: foreach.h
 * ---------------
 * This interface defines the <code>foreach</code> keyword, which is
 * used to simplify iteration.  All iterable classes import this
 * interface, so clients never need to do so explicitly.  This version
 * of the interface also supports C++ strings and arrays.
 */

#ifndef _foreach_h
#define _foreach_h

/*
 * Statement: foreach
 * Usage: foreach (type var in collection) { . . . }
 * -------------------------------------------------
 * The <code>foreach</code> statement steps through the elements in
 * a collection.  It works correctly with the collection classes in
 * both the Standard Template Library and the Stanford C++ libraries,
 * but can also be used with C++ strings and statically initialized
 * arrays.
 *
 * <p>The following code, for example, prints every element in the
 * string vector <code>lines</code>:
 *
 *<pre>
 *    foreach (string str in lines) {
 *       cout << str << endl;
 *    }
 *</pre>
 *
 * Similarly, the following function calculates the sum of the character
 * codes in a string:
 *
 *<pre>
 *    int sumCharacterCodes(string str) {
 *       int sum = 0;
 *       foreach (char ch in str) sum += ch;
 *       return sum;
 *    }
 *</pre>
 *
 * As a simplification when iterating over maps, the <code>foreach</code>
 * macro iterates through the keys rather than the key/value pairs.
 */

   /* The foreach and in macros are defined in the foreachpriv.h file */

    #include "private/foreachpriv.h"

    #endif


/*main program*/
#include <iostream>
#include "console.h"
#include "lexicon.h"
#include "queue.h"
#include "simpio.h"
#include "vector.h"

using namespace std;

int main() {
// [TODO: fill in the code]
    Lexicon eng("EnglishWords.dat");
    foreach(string word in eng)
    cout << word;
    return 0;
}

2 个答案:

答案 0 :(得分:0)

尝试使用导入字符串lib,然后尝试编译它

答案 1 :(得分:0)

简单的修复是包含“foreach.h”标题。请看这里:foreach not recognized in C++