Файл заголовка Vector.h (с использованием библиотеки Stanford C) поврежден или не может быть использован - PullRequest
0 голосов
/ 11 ноября 2010

Ошибки появляются только с файловыми потоками
После удаления файла vector.h программа работает правильно
Я хочу использовать vector.h в будущих программах

    // Using Stanford CS106B Library    

        #include "genlib.h"
        #include "vector.h"  // After removing this file, the program runs but i cannot use vector
        #include <fstream>
        #include <iostream>
        #include <simpio.h>

        const int ALPHABET_SIZE=26;

    void CountLetters(string filename){

        ifstream in;  // line 22
        in.open(filename.c_str());  // line 23  
        if(in.fail()) Error("Error opening file or File does not exist"); // line 24

        int letters[ALPHABET_SIZE];
        string line;

        for(int i=0;i<ALPHABET_SIZE;i++)
            letters[i]=0;



        while(true){
            getline(in,line); // line 35
            if(in.fail()) break;  // line 36
            for(int i=0;i<line.length();i++){
                char c= line.at(i);
                if( c >= 'a' && c <= 'z')
                    letters[c-'a']++;
                if( c >= 'A' && c <= 'Z')
                    letters[c-'A']++;
            }
        }

        for(int i=0;i<ALPHABET_SIZE;i++)
            cout<<char('A'+i)<<" "<<letters[i]<<endl;
    }


    int main(){
            cout << "Enter the filename: ";
            string filename = GetLine();
            CountLetters(filename); 
        return 0;
    }

CompileC build / section1.build / Debug / assn-0-narcissism.build / Objects-normal / i386 / vectorcountletters.o vectorcountletters.cpp normal i386 c ++ com.apple.compilers.gcc.4_2 cd "/ Пользователи / rishi / Загрузки / ms-cs / cs106b / code / section1" setenv LANG en_US.US-ASCII /Developer/usr/bin/gcc-4.2 -x c ++ -arch i386 -fmessage-length = 0 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -isysroot / Developer /SDKs/MacOSX10.5.sdk -mfix-and-continue -fvisibility-inlines-hidden -mmacosx-version-min = 10,5 -gdwarf-2 "-I / Пользователи / rishi / Загрузки / ms-cs / cs106b / code / section1 / build / section1.build / Debug / assn-0-narcissism.build / blank-project.hmap "-Wall -Wno-sign-сравнить -F. -Ics106 -Включить "-I / Пользователи / rishi / Загрузки / ms-ss / cs106b / code / section1 / build / section1.build / Debug / assn-0-narcissism.build / DerivedSources / i386" "-I / Users / rishi / Загрузки / ms-ss / cs106b / code / section1 / build / section1.build / Отладка / assn-0-narcissism.build / DerivedSources "-fstack-check -c" / Пользователи / rishi / Загрузки / ms-ss / cs106b / code / section1 / vectorcountletters.cpp "-o" / Пользователи / rishi / Загрузки / ms-ss / cs106b / code / section1 / build / section1.build / Debug / assn-0-narcissism.build / Objects-normal / i386 / vectorcountletters.o "

/ Users / rishi / Downloads / mscs / cs106b / code / section1 / vectorcountletters.cpp: в функции 'void CountLetters (std :: string)': / Users / rishi / Downloads / mscs / cs106b / code / section1 / vectorcountletters.cpp: 22: ошибка: ожидаемый неквалифицированный идентификатор перед токеном '=' / Users / rishi / Downloads / ms-cs / cs106b / code / section1 / vectorcountletters.cpp: 23: ошибка: ожидаемое первичное выражение перед маркером '=' / Users / rishi / Downloads / mscs / cs106b / code / section1 / vectorcountletters.cpp: 23: ошибка: ожидаемое первичное выражение перед '.' знак / Users / rishi / Downloads / mscs / cs106b / code / section1 / vectorcountletters.cpp: 24: ошибка: ожидаемое первичное выражение перед токеном =. / Users / rishi / Downloads / mscs / cs106b / code / section1 / vectorcountletters.cpp: 24: ошибка: ожидаемое первичное выражение перед '.' знак / Users / rishi / Downloads / ms-cs / cs106b / code / section1 / vectorcountletters.cpp: 35: ошибка: ожидаемое первичное выражение перед маркером '=' / Users / rishi / Downloads / ms-cs / cs106b / code / section1 / vectorcountletters.cpp: 35: ошибка: ожидаемое первичное выражение перед символом ',' / Users / rishi / Downloads / mscs / cs106b / code / section1 / vectorcountletters.cpp: 36: ошибка: ожидаемое первичное выражение перед токеном =. / Users / rishi / Downloads / mscs / cs106b / code / section1 / vectorcountletters.cpp: 36: ошибка: ожидаемое первичное выражение перед '.' лексема

Ответы [ 5 ]

1 голос
/ 18 сентября 2014

Сегодня я столкнулся с этой же проблемой и выяснил, что переменная типа if in in не может быть названа in при использовании библиотеки Stanford vector.h. Я не стал тратить время на изучение этого вопроса, но, похоже, где-то в библиотеке другая переменная также должна быть названа «in», и компилятор смешивает их. Итак, измените имя вашей переменной ifstream на что-то кроме «in», и это позаботится об ошибке.

1 голос
/ 22 августа 2014

Вероятно, уже слишком поздно отвечать на вопрос, но я сейчас изучаю материалы курса CS106B Стэнфордского университета и столкнулся с той же проблемой. Я нашел простое решение этой проблемы, поэтому подумал, что стоит упомянуть, если кто-то наткнется на ту же проблему.

Я использую версию начального кода linux для заданий. В этом случае вам дается Makefile вместе с начальным кодом, который генерирует статическую библиотеку библиотеки Stanford C ++, и вы можете использовать ее в своем коде. Makefile работает нормально. Вы должны открыть терминал, перейти в каталог, скажем, 0-разминка (каталог самого первого назначения), который содержит файлы Makefile, warmup.cpp, spl.jar и StanfordCPPLib. Уarmup.cpp есть две ошибки (исправление является назначением), исправьте эти две ошибки. Затем вы можете набрать «make» в терминале, чтобы собрать исполняемые файлы и запустить их. Это будет работать нормально.

Проблема возникает, когда вы включаете заголовок vector.h в свой код, где vector.h определен в каталоге StanfordCPPLib. Теперь ваш файл cpp генерирует ошибку во время компиляции, говоря, что он не может найти файл "vector.h", даже если он может найти "simpio.h", который также определен в библиотеке Stanford c ++. Это происходит не только с "vector.h", но и с другими заголовочными файлами, для которых нет соответствующего cpp-файла в каталоге StanfordCPPLib, такими как foreach.h, graph.h, grid.h и т. Д.

Решение очень простое. Не включайте просто "vector.h", включайте относительный путь к файлу vector.h. Поскольку он находится в каталоге StanfordCPPLib текущего каталога, включите в файл cpp файл "StanfordCPPLib / vector.h" (#include "StanfordCPPLib / vector.h"). Теперь введите «make», чтобы выполнить Makefile, и он должен сгенерировать исполняемый файл без ошибок.

0 голосов
/ 11 ноября 2010

Кажется, я не могу получить весь источник вектора, я вижу только Doxygen, но если Doxygens не удаляет константы, похоже, что ни один из методов этого векторного класса не является const, и я действительно не вижу причин для кого-либо чтобы переписать части стандартной библиотеки, я не вижу, какая польза от этого класса.

0 голосов
/ 11 ноября 2010

Сообщения об ошибках указывают на то, что в строке 22 есть «=», а в строке «.»и '=' каждая в строках 23 и 24.

Не является частью перечисленного кода, где это происходит.

Хуже: ошибка в строке 35 сообщает о ',' (запятая),В вашей программе две запятые: одна в комментарии вверху, другая в getline(in,line); на полпути.Также сбивает с толку.

Таким образом, ваши ошибки не соответствуют вашему коду!

Лучшее, что я могу сделать, это что-то в вашем кодебыл #определен для чего-то совершенно другого.Может быть, где-то в одном из заголовков есть строка #define in (some mess)?

0 голосов
/ 11 ноября 2010

Как бы глупо это не звучало, попробуйте поставить пустую строку после #include для vector.h

Кроме того, обратите внимание на документацию по vector.h. Это означает, что вам нужно добавить несколько дополнительных файлов в ваш источник.

Try #include "genlib.h"
#include "strutils.h"
#include cstdlib

...