首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Storm数据程序中读取Makefile需要解决的问题

在Storm数据程序中读取Makefile需要解决的问题
EN

Stack Overflow用户
提问于 2015-10-07 00:40:51
回答 1查看 52关注 0票数 1

我必须创建一个程序来读取Storm.dat文件(包含海洋风暴并生成简短的报告)。我已经制作了必要的文件,但是我在Makefile中遇到了一些问题。

下面是我的代码:

storm.h

代码语言:javascript
运行
复制
#ifndef STORMS_H
#define STORMS_H

class Storm
{
private:
    char where; // A, E, C
    char name[11]; // recall '\0'
    int seq; // sequence num 1...
    int year;
    int max_wind; // knots
    int min_press; // millibars or 10000 //
    char type; // H, S, D
public:
    Storm() ;// default constructor
    void print() const ;

    //5 accessors are code next..
    int get_seq() const;
    int get_year() const;
    int get_max_wind() const;
    int get_min_press() const;
    char get_type() const;

} ;

#endif

storm.cc

代码语言:javascript
运行
复制
#include <iostream>
#include <iomanip> // re. setw, etc...
#include <cstring> // re. strcpy( dest, sorc ); etc... //
#include <cstdlib> // re. atoi

#include "storm.h"

using std::cout;
using std::endl;
using std::setw;
using std::left;
using std::right;

 const char* BASINS[] = { " ", "Atlantic", "Eastern Pacific", "Central Pacific" };

int i_basin( char c )
{
    if( c == 'A' ) return 1;
    if( c == 'E' ) return 2;
    if( c == 'C' ) return 3;
    return 0;
}

const char* TYPES[] = { " ", "Hurricane", "Storm", "Depression" };

int i_type( char c )
{
    if( c == 'H' ) return 1;
    if( c == 'S' ) return 2;
    if( c == 'D' ) return 3;
    return 0;
}

Storm::Storm() // default constructor
: where('N'), seq(0), year(0), max_wind(0), min_press(0), type('N')
{ strcpy( name, "None" ); }

void Storm::print() const
{   
    cout << left << setw(17) << BASINS[i_basin(where)]
         << setw(19) << TYPES[i_type(type)]
         << setw(11) << name
         << right << setw(2) << seq
         << '/' << year
         << setw(8) << max_wind;
    if( min_press )
        cout << setw(6) << min_press;
    cout << endl;
}

//5 accessors are coded here...
int Storm::get_seq() const { return seq; }
int Storm::get_year() const { return year; }
int Storm::get_max_wind() const { return max_wind; }
int Storm::get_min_press() const { return min_press; }
char Storm::get_type() const { return type; }

assign3_class_storm.cc

代码语言:javascript
运行
复制
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

#include "storm.h"

using std::cout;
using std::endl;
using std::flush;
using std::cin;
using std::ios;

const char* HEADER =
    "Storm                               Name         Date     Wind  mbar\n"
    "--------------------------------------------------------------------\n";

const char* FNAME_BIN = "storm.dat";


typedef std::vector< Storm > Storms;

bool loadBinFile( const char* fname, Storms& vStorms ) ;
void showStorms( const Storms& vStorms );

template< typename T, typename Cmp >
void sel_sort( std::vector< T >& data, Cmp myCmp  );

// re. sort by increasing dates & seq...
int cmpByYear( const Storm& a, const Storm& b );
// re. sort by decreasing wind speed.
int cmpByWind( const Storm& a, const Storm& b );
// re. sort by increasing air pressure.
int cmpByPress( const Storm& a, const Storm& b );


int main() 
{
    Storms sList;
    if( loadBinFile( FNAME_BIN, sList ) )
    {
        cout << "Now showing sList loaded from file "
             << FNAME_BIN << endl;
        showStorms( sList );


        sel_sort( sList, cmpByYear);
        cout <<"\nSorted by dates ... \n";
        //showStorms( sList );

        sel_sort( sList, cmpByWind );
        cout <<"\nSorted by decreasing wind speed ... \n";
        //showStorms( sList );

        sel_sort( sList, cmpByPress );
        cout <<"\nSorted by increasing air pressure ... \n";
        //showStorms( sList );
    }


    cout << "Press 'Enter' to continue/exit ... " << flush;
    cin.get();

}

void showStorms( const Storms& vStorms )
{
    cout << "Total storms here is: " << vStorms.size() << endl;
    cout << HEADER;
    size_t i = 0;
    while(  i < vStorms.size()  )
    {
        vStorms[i].print();
        ++i;
        if( i % 20 == 0 )
        {
            cout << endl;

            cout << "Press 'Enter' to continue ... " << flush;
            cin.get();

            if( i != vStorms.size() )
                cout << HEADER;
        }
    }
}

bool loadBinFile( const char* fname, Storms& vStorms )
{
    fstream fs ;
    fs.open( fname, ios::in | ios::binary );
    if( fs )
    {
        Storm tmp;
        while( fs.read( (char*)&tmp, sizeof(Storm) ) )
            vStorms.push_back( tmp );
        fs.close();
        return true;
    }
    cout << "\nThere was a problem opening file "
              << fname << endl;
    return false;
}


template< typename T, typename Cmp >
void sel_sort( std::vector< T >& data, Cmp myCmp  )
{
    int len = data.size();
    int lenMinusOne = len-1;
    for( int j = 0; j <  lenMinusOne; ++ j )
    {
        int index_min = j;
        for( int i = j+1; i < len; ++ i )
            if(  myCmp(data[i], data[index_min] ) < 0 )
                index_min = i;
        // now swap ...
        T tmp = data[j];
        data[j] = data[index_min];
        data[index_min] = tmp;
    }
}


// re. sort by increasing dates & seq...
int cmpByYear( const Storm& a, const Storm& b )
{
    int cmp = a.get_year() - b.get_year();
    if( cmp == 0 )
        return a.get_seq() - b.get_seq();
    return cmp;
}

// re. sort by decreasing wind speed.
int cmpByWind( const Storm& a, const Storm& b )
{
    return b.get_max_wind() - a.get_max_wind();
}
// re. sort by increasing air pressure.
int cmpByPress( const Storm& a, const Storm& b )
{
    return a.get_min_press() - b.get_min_press();
}

如果有人能帮我找出我在创建Makefile时遇到的这些错误:

这是我的Makefile

代码语言:javascript
运行
复制
output: assign3_class_storm.o storm.o
    g++ -o assign3_class_storm assign3_class_storm.o
    g++ -o storm storm.o

storm.o: storm.cc storm.h
    g++ -c storm.cc

assign3_class_storm.o: assign3_class_storm.cc storm.h
    g++ -c assign3_class_storm.cc

clean:
    -rm *.o assign3_class_storm storm

我所犯的错误:

代码语言:javascript
运行
复制
g++ -c assign3_class_storm.cc
g++ -c storm.cc
g++ -o assign3_class_storm assign3_class_storm.o
assign3_class_storm.o: In function `showStorms(std::vector<Storm, std::allocator<Storm> > const&)':
assign3_class_storm.cc:(.text+0x1a2): undefined reference to `Storm::print() const'
assign3_class_storm.o: In function `loadBinFile(char const*, std::vector<Storm, std::allocator<Storm> >&)':
assign3_class_storm.cc:(.text+0x2db): undefined reference to `Storm::Storm()'
assign3_class_storm.o: In function `cmpByYear(Storm const&, Storm const&)':
assign3_class_storm.cc:(.text+0x3d6): undefined reference to `Storm::get_year() const'
assign3_class_storm.cc:(.text+0x3e4): undefined reference to `Storm::get_year() const'
assign3_class_storm.cc:(.text+0x3fd): undefined reference to `Storm::get_seq() const'
assign3_class_storm.cc:(.text+0x40b): undefined reference to `Storm::get_seq() const'
assign3_class_storm.o: In function `cmpByWind(Storm const&, Storm const&)':
assign3_class_storm.cc:(.text+0x438): undefined reference to `Storm::get_max_wind() const'
assign3_class_storm.cc:(.text+0x446): undefined reference to `Storm::get_max_wind() const'
assign3_class_storm.o: In function `cmpByPress(Storm const&, Storm const&)':
assign3_class_storm.cc:(.text+0x46e): undefined reference to `Storm::get_min_press() const'
assign3_class_storm.cc:(.text+0x47c): undefined reference to `Storm::get_min_press() const'
collect2: error: ld returned 1 exit status
Makefile:12: recipe for target 'output' failed
make: *** [output] Error 1

如果有人能帮我解决这个问题,我真的很感激你的帮助。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-07 03:00:45

生成文件被设置为构建两个可执行文件,即stormassign3_class_storm。这是没有意义的;您不能构建storm,因为storm.cc中没有main(),而且不能单独从assign3_class_storm.cc构建assign3_class_storm,因为它依赖于在storm.cc中定义的Storm类的函数。

首先,让我们纠正中心问题:

代码语言:javascript
运行
复制
output: assign3_class_storm.o storm.o
    g++ -o storm assign3_class_storm.o storm.o

一旦完成了(*),您就可以通过将产品的名称作为规则的名称来改进它(这样Make就会知道,当文件已经存在并且是最新的时,规则就不需要执行了):

代码语言:javascript
运行
复制
storm: assign3_class_storm.o storm.o
    g++ -o storm assign3_class_storm.o storm.o

一旦这个规则完美地工作了,您就可以在自动变量中减少这个规则的冗余。

代码语言:javascript
运行
复制
storm: assign3_class_storm.o storm.o
    g++ -o $@ $^

然后,如果您愿意,可以使输出更加简洁:

代码语言:javascript
运行
复制
storm: assign3_class_storm.o storm.o
    @echo building $@...
    @g++ -o $@ $^

(*)您可能必须更正assign3_class_storm.cc中的一个小遗漏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32981956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档