2012-06-10 4 views
1

Для домашнего задания: я должен создавать рандомизированные алфавитные клавиши, печатать их в файле и затем хэш каждого из них в хеш-таблицу, используя функцию «goodHash», найденную в моей ниже кода.Функция C++ не найдена во время компиляции

Когда я пытаюсь запустить приведенный ниже код, он говорит, что мой идентификатор «goodHash» не найден ». Что случилось с моим кодом?

#include <iostream> 
#include <vector> 
#include <cstdlib> 
#include "math.h" 
#include <fstream> 
#include <time.h> 
using namespace std; 

// "makeKey" function to create an alphabetical key 
// based on 8 randomized numbers 0 - 25. 
string makeKey() { 
    int k; 
    string key = ""; 
    for (k = 0; k < 8; k++) { 
     int keyNumber = (rand() % 25); 
     if (keyNumber == 0) 
      key.append("A"); 
     if (keyNumber == 1) 
      key.append("B"); 
     if (keyNumber == 2) 
      key.append("C"); 
     if (keyNumber == 3) 
      key.append("D"); 
     if (keyNumber == 4) 
      key.append("E"); 
     if (keyNumber == 5) 
      key.append("F"); 
     if (keyNumber == 6) 
      key.append("G"); 
     if (keyNumber == 7) 
      key.append("H"); 
     if (keyNumber == 8) 
      key.append("I"); 
     if (keyNumber == 9) 
      key.append("J"); 
     if (keyNumber == 10) 
      key.append("K"); 
     if (keyNumber == 11) 
      key.append("L"); 
     if (keyNumber == 12) 
      key.append("M"); 
     if (keyNumber == 13) 
      key.append("N"); 
     if (keyNumber == 14) 
      key.append("O"); 
     if (keyNumber == 15) 
      key.append("P"); 
     if (keyNumber == 16) 
      key.append("Q"); 
     if (keyNumber == 17) 
      key.append("R"); 
     if (keyNumber == 18) 
      key.append("S"); 
     if (keyNumber == 19) 
      key.append("T"); 
     if (keyNumber == 20) 
      key.append("U"); 
     if (keyNumber == 21) 
      key.append("V"); 
     if (keyNumber == 22) 
      key.append("W"); 
     if (keyNumber == 23) 
      key.append("X"); 
     if (keyNumber == 24) 
      key.append("Y"); 
     if (keyNumber == 25) 
      key.append("Z"); 
    } 
    return key; 
} 

// "makeFile" function to produce the desired text file. 
// Note this only works as intended if you include the ".txt" extension, 
// and that a file of the same name doesn't already exist. 
void makeFile(string fileName, int n) { 
    ofstream ourFile; 
    ourFile.open(fileName); 
    int k; // For use in below loop to compare with n. 
    int l; // For use in the loop inside the below loop. 
    string keyToPassTogoodHash = ""; 
    for (k = 1; k <= n; k++) { 
     for (l = 0; l < 8; l++) { // For-loop to write to the file ONE key 
     ourFile << makeKey()[l]; 
     keyToPassTogoodHash += (makeKey()[l]); 
     } 
     ourFile << " " << k << "\n";// Writes two spaces and the data value 
     goodHash(keyToPassTogoodHash); // I think this has to do with the problem 
     makeKey(); // Call again to make a new key. 
    } 
} 

// Primary function to create our desired file! 
void mainFunction(string fileName, int n) { 
    makeKey(); 
    makeFile(fileName, n); 
} 

// Hash Table for Part 2 
struct Node { 
    int key; 
    string value; 
    Node* next; 
}; 
const int hashTableSize = 10; 
Node* hashTable[hashTableSize]; 

// "goodHash" function for Part 2 
void goodHash(string key) { 
    int x = 0; 
    int y; 
    int keyConvertedToNumber = 0; 
    // For-loop to produce a numeric value based on the alphabetic key, 
    // which is then hashed into hashTable using the hash function 
    // declared below the loop (hashFunction). 
    for (y = 0; y < 8; y++) { 
     if (key[y] == 'A' || 'B' || 'C') 
      x = 0; 
     if (key[y] == 'D' || 'E' || 'F') 
      x = 1; 
     if (key[y] == 'G' || 'H' || 'I') 
      x = 2; 
     if (key[y] == 'J' || 'K' || 'L') 
      x = 3; 
     if (key[y] == 'M' || 'N' || 'O') 
      x = 4; 
     if (key[y] == 'P' || 'Q' || 'R') 
      x = 5; 
     if (key[y] == 'S' || 'T') 
      x = 6; 
     if (key[y] == 'U' || 'V') 
      x = 7; 
     if (key[y] == 'W' || 'X') 
      x = 8; 
     if (key[y] == 'Y' || 'Z') 
      x = 9; 
     keyConvertedToNumber = x + keyConvertedToNumber; 
    } 
    int hashFunction = keyConvertedToNumber % hashTableSize; 
    Node *temp; 
    temp = new Node; 
    temp->value = key; 
    temp->next = hashTable[hashFunction]; 
    hashTable[hashFunction] = temp; 
} 

// First two lines are for Part 1, to call the functions key to Part 1. 
int main() { 
    srand (time(NULL));   // To make sure our randomization works. 
    mainFunction("sandwich.txt", 5); // To test program 
    cin.get(); 
    return 0; 
} 

Я понимаю, что мой код громоздкий в некоторых разделах, но я нуб в C++ и многое делать это лучше не знать.

Я угадываю другой способ, которым я мог бы это сделать: ПОСЛЕ того, как писать алфавитные ключи в файл, читать их из файла и хешировать каждый ключ, как я это делаю, но я не знаю, как идти о кодировании что.

+1

Один совет, который работает для Символ ASCII устанавливает не менее: 'if (keyNumber> = 0 && keyNumber <= 25) key.append ('A' + keyNumber);'. Кроме того, вы можете подумать о том, чтобы изменить заголовок вопроса на что-то вроде «функции, не найденной во время компиляции», поскольку этот вопрос не имеет ничего общего с хэшированием и т. Д. –

+1

Святый, если заявление бэтмен! –

+0

«Святой, если заявление бэтмен!«Возможно, вы ноб на C++, но я догадываюсь, что вы уже должны знать инструкцию' switch', правильно? –

ответ

3

C++ ожидать все, чтобы быть объявлены в порядке, так что ничего не используется, прежде чем он объявлен. Если вам нужно обратиться к функции выше в файле, чем там, где она определена, вам нужно иметь прототип функции в верхней части файла, объявляющего функцию. (Написание прототипов для всех функций является стандартной практикой в ​​результате этого.)

В верхней части файла (после #include с) просто добавить

void goodHash(string key); 

Определения

Объявление функции: то, что объявляет имя функции и типы, которые выполняет функция.

Определение функции: то, что указывает фактический код функции.

+0

Я просто переместил всю функцию goodHash на сверху, и, похоже, это w Это должно быть хорошо, верно? Или, если я просто положил 'void goodHash (строковый ключ)' сверху и оставил все остальное, он должен дать тот же результат, правильно? – forthewinwin

+0

Да, это сработает, но вы должны знать об условностях за прототипами функций. –

+0

Вам нужно указать точку с запятой в прямом объявлении: 'void goodHash (строковый ключ);'. –

3

если вставить

void goodHash(string key); 

в строке под «использованием имен ...» он будет работать

+0

Спасибо. Исправлена ​​проблема. – forthewinwin

+0

, но не принимается как ответ: P –

2

Вопрос заключается в том, что вы должны передать объявить goodHash или определить goodHash до того makeFile если вы хотите для использования goodHash в makeFile. В противном случае, когда компилятор находится в makeFile, он видит токен goodHash и не выяснил, что это значит, поэтому вы получаете ошибку времени компиляции.

EDIT: Here is a good resource on forward declarations

+0

Спасибо. Исправлена ​​проблема. – forthewinwin

0

Вы забыли прототип функции просто добавьте это в верхней части:

void goodHash(string key); 

и кстати ваш makeKey() слишком долго вы можете попробовать это вместо:

string makeKey() { 
    int k; 
    string key = ""; 
    for (k = 0; k < 8; k++) { 
     int keyNumber = (rand() % 25); 
     char app[2]; 
     app[0] = keyNumber + 'A'; 
     app[1] = 0; 
     key.append(app); 
     } 
    return key; 
} 
Смежные вопросы