gpt4 book ai didi

c++ - 需要解决 Makefile 读取 Storm 数据程序的问题

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:05 25 4
gpt4 key购买 nike

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

下面是我的代码:

Storm .h

#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

#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

#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 时遇到的这些错误:

这是我的生成文件

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

我遇到的错误:

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

如果有人能帮我解决这个问题,我将不胜感激。

谢谢

最佳答案

您的 makefile 已设置为构建两个 可执行文件,stormassign3_class_storm。这是没有意义的;您无法构建storm,因为storm.cc 中没有main(),您也无法构建assign3_class_storm 单独来自 assign3_class_storm.cc,因为它依赖于 Storm 类的函数,该类在 storm.cc 中定义。

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

output: assign3_class_storm.o storm.o
g++ -o storm assign3_class_storm.o storm.o

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

storm: assign3_class_storm.o storm.o
g++ -o storm assign3_class_storm.o storm.o

一旦完美运行,您可以使用 automatic variables 减少此规则的冗余度:

storm: assign3_class_storm.o storm.o
g++ -o $@ $^

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

storm: assign3_class_storm.o storm.o
@echo building $@...
@g++ -o $@ $^

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

关于c++ - 需要解决 Makefile 读取 Storm 数据程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com