c – 如何将全局函数包含在单独的文件中
发布时间:2020-12-16 09:47:19 所属栏目:百科 来源:网络整理
导读:我试图通过在单独的头/源文件中分组函数来组织我的代码.我已经#include了我的主.cpp中的头文件,但编译器没有看到convertTypes.cpp中的函数.是什么赋予了?如何全局使用我的’key’typedef(在分离的函数源中也是如此)?很多代码,抱歉. /* * NoteMaker.cpp * *
我试图通过在单独的头/源文件中分组函数来组织我的代码.我已经#include了我的主.cpp中的头文件,但编译器没有看到convertTypes.cpp中的函数.是什么赋予了?如何全局使用我的’key’typedef(在分离的函数源中也是如此)?很多代码,抱歉.
/* * NoteMaker.cpp * * Created on: Sep 4,2013 * Author: edwinrietmeijer */ typedef struct { int keyNum; int keyType; } key; #include <iostream> #include <string> #include <iomanip> #include "convertTypes.h" using namespace std; const int KEYSET[ ] = { 0,2,4,5,7,8,9 }; int* generateNotes( int,key ); void echoNoteList( const int*,const int,const key ); string getKeyStringFromUser(); int main() { key keyStruct; int octave; int nrOfNotes; string firstNoteName; // Get inputs cout << "What key would you like to generate notes in? ( f,cis,es,etc.)" << endl; firstNoteName = getKeyStringFromUser(); cout << "In what octave would you like to generate notes? (-1 / 9)" << endl; cin >> octave; octave += 1; cout << "How many notes do you wish to generate?" << endl; cin >> nrOfNotes; // create a key data struct from input string keyStruct = convertKeyStringToKeyStruct( firstNoteName ); // add the starting octave nr to the keyStruct keyStruct.keyNum += octave * 12; // generate note list int* noteList = new int[ nrOfNotes ]; noteList = generateNotes( nrOfNotes,keyStruct ); // echo note list to terminal echoNoteList( noteList,nrOfNotes,keyStruct); cin.get(); } int* generateNotes( int notes,key keyStruct) { int* newList = new int [notes]; int currNote = keyStruct.keyNum + keyStruct.keyType; int currDist = 0; newList[0] = currNote; for (int i=1; i < notes; i ++) { currDist = i % 7; if ( currDist == 0 || currDist == 3 ) // half step or whole step? { currNote = currNote + 1; } else { currNote = currNote + 2; } newList[ i ] = currNote; } cout << "Generated list." << endl; return newList; } void echoNoteList( const int* noteList,const int nrOfNotes,const key thisKeyStruct ) { int currNote; for (int i = 0; i < nrOfNotes ; i ++) { currNote = noteList[ i ] % 12; if ( currNote < 0 ) currNote += 12; cout << left; cout << setw(5) << noteList[ i ] << setw( 5 ) << convertToNoteName( currNote,thisKeyStruct.keyType ) << endl; } } string getKeyStringFromUser() { bool correctInput = false; string getKeyName; int keyNum; while ( ! correctInput ) { cin >> getKeyName; cout << endl; keyNum = getKeyName[ 0 ]; if ( keyNum > 96 && keyNum < 104 ) { correctInput = true; } else { cout << "Wrong input. Try again." << endl; } } return getKeyName; } convertTypes.h #ifdef CONVERTTYPES_H #define CONVERTTYPES_H std::string convertToNoteName( int,int ); key convertKeyStringToKeyStruct( std::string ); #endif convertTypes.cpp /* * convertTypes.cpp * * Created on: Sep 5,2013 * Author: edwinrietmeijer */ #include <string> #include "convertTypes.h" using namespace std; typedef struct { int keyNum; int keyType; } key; key convertKeyStringToKeyStruct( string firstNote ) { int stringSize; int keyType = 0; char keyChar; key thisKey; keyChar = firstNote[ 0 ]; // get key type (flat,sharp,normal) stringSize = firstNote.size( ); if (stringSize > 1 ) { switch( firstNote[ 1 ] ) { case 'e': keyType = -1; break; case 's': keyType = -1; break; case 'i': keyType = 1; break; default: keyType = 0; break; } } // convert key char to ascii code int ASkey = keyChar; thisKey.keyNum = KEYSET[ ASkey - 99 ]; thisKey.keyType = keyType; return thisKey; } string convertToNoteName( int thisNote,int thisKeyType = 0) { string noteName; char addKeyType; switch( thisKeyType ) { case -1: addKeyType = 'b'; break; case 0: addKeyType =' '; break; case 1: addKeyType = '#'; break; } switch( thisNote ) { case 0: noteName = "C"; break; case 1: if( thisKeyType == 1) noteName = string ("C") + addKeyType; else noteName = string("D") + addKeyType; break; case 2: noteName = "D"; break; case 3: if( thisKeyType == 1) noteName = string ("D") + addKeyType; else noteName = string("E") + addKeyType; break; case 4: noteName = "E"; break; case 5: noteName = "F"; break; case 6: if( thisKeyType == 1) noteName = string ("F") + addKeyType; else noteName = string("G") + addKeyType; break; case 7: noteName = "G"; break; case 8: if( thisKeyType == 1) noteName = string ("G") + addKeyType; else noteName = string("A") + addKeyType; break; case 9: noteName = "A"; break; case 10: if( thisKeyType == 1) noteName = string ("A") + addKeyType; else noteName = string("B") + addKeyType; break; case 11: noteName = "B"; break; default: noteName = "!"; break; } return noteName; } 解决方法
更改:
#ifdef CONVERTTYPES_H 至: #ifndef CONVERTTYPES_H 您正在有效地编译您的定义. 至于你的第二点,请移动: typedef struct { int keyNum; int keyType; } key; 进入头文件(在它首次使用之前). 但是我会警告不要使用像key这样的名称,因为它通常用作变量名.我会去key_t或MySpecialKeyForStuffImDoing(或某些). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |