好的,我想在问题代码之前解释一下我要做的事情。我正在创建一个学生记录系统。我试图将文本文件中的信息提取到记录系统中。我试图在堆上使用数组存储信息。
我最关心的是前几个错误,因为我认为这些错误会导致以下错误。任何帮助将不胜感激,因为我已经浏览了很多论坛,他们没有引导我朝着正确的方向前进。提前谢谢!
代码:
#include "address.h"
#include "student.h"
#include "date.h"
#include "record.h"
#include "name.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#define pArray
#define students
#define Request
using namespace :: std;
enum {sNUMBER=50};
//Function Prototypes
void tPrint(string*,student pArray);
void sPrint(string*,student pArray);
void alpha(string*,student pArray);
int generate();
//Function Definitions
void tPrint(string*,student pArray, alpha)
{
if (alpha != 0)
{
alpha(pArray);
}//end if
int i;
for (i=0; i<sNUMBER;i++)
{
pArray->tPrint();
pArray+=1;
}//end for
};//end tPrint
void sPrint(string*,student pArray)
{
if (alpha != 0)
{
alpha(pArray);
}//ennd if
int i;
for (i=0; i<sNUMBER;i++)
{
pArray->sPrint();
pArray+=1;
}//end for
};//end sPrint
void alpha(string*,student pArray)
{
int i;//counter
int j;//counter
for (i=0;i<sNUMBER-1;i++)
{
for (j=0;j<sNUMBER-1-i;j++)
{
//combine first and last names into full names
if (strcmp((pArray->GetsName().GetfName())+=" " +=(pArray->GetsName().GetlName()),((pArray+1)->GetsName().GetfName())+=" "+=((pArray+1)->GetsName().GetlName()))>0)
{
swap(pArray[j],pArray[j+1]);
}
}//end for
}//end for
};//end alpha
int generate ()
{
srand(sNUMBER);
ofstream data;
data.open ("data.txt");
if (data.is_open())
{
int i; // counter
int j; // counter
//Name info
string new fName[sNUMBER];
string new lName[sNUMBER];
//Address info
string new add1[sNUMBER];
string new add2[sNUMBER];
//variables to generate names
string new fName1[5] = {"Alfred","Robert","Ryan","Hank","Richard"};
string new fName2[5] = {"Hannah","Lacie","Crystal","Kayce","Susan"};
string new lName1[5] = {"Smith","Jones","Allison","Johnson","Moore"};
string new lName2[5] = {"Howard","Williams","Pinkston","Cooley","Vernon"};
string new fNames[2] = {fName1,fName2};
string new lNames[2] = {lName1,lName2};
// variables to generate addresses
string new adds1[5] = {"159 faternity st.","399 Dorm Blvd.","222 faternity st.", "777 Dorm Blvd", "82 Canal street"};
string new adds2[10] = {"Apartment A", "Apartment B", "Apartment C", "Apartment D", "Apartment E","Apartment F", "Apartment G", "Apartment H", "Apartment I"};
for (i=0;i<sNUMBER;i++)
{
for (j=0; j<5; j++)
{
strCopy(fName[i],fNames[i>25][j]);
strCopy(lName[i],lNames[i>25][j + floor(i/5)-(i>25)*(floor(i/5)-6)- 4*((j+i/5)>5)]);
}
}
for (i=0;i<sNUMBER;i++)
{
for (j=0; j<10; j++)
{
strCopy(add1[i],adds1[j]);
strCopy(add2[i],adds2[j + floor(i/10)-(i>25)*(floor(i/10)-11)- 4*((j+i/10)>10)]);
}
}
//deallocate unneeded variables
delete [] fName1;
delete [] fName2;
delete [] lName1;
delete [] lName2;
delete [] fNames;
delete [] lNames;
for (i=0; i<sNUMBER;i++)
{
// name info
Data << fName[i] << "\n"; // first name
Data << lName[i] << "\n"; // last name
// address info
Data << add1[i] <" \n"; // add 1
Data << add2[i] <" \n"; // add 2
Data << "Indianapolis \n"; // city
Data << "IN \n"; // state
Data << "46168 \n"; // zip
// birthdate
Data << rand()%28 + 1 << " \n"; //day
Data << rand()%12 + 1 << " \n";//month
Data << 2011 -(rand()%49 + 12)<< "\n";//year
//graddate
Data << rand()%28 + 1 << " \n";//day
Data << rand()%12 + 1 << " \n"; // month
Data << 2011 + (rand()%6+2)<< " \n"; // year
//performance info
Data << (rand()%16)/(float rand()%4)<<" \n"; //gpa
Data << (rand()%300)<< " \n"; //credits
}
//Deallocate rest of memory
delete [] fName;
delete [] lName;
delete [] add1;
delete [] add2;
data.close();
}
else
{
cout << "Your file did not open. Sorry \n";
}
return 0;
}//end generate}
以下是错误:
C:\Users\main.cpp||In function ‘void tPrint(std::string*, student)’:|
C:\Users\main.cpp|25|error: too few arguments to function ‘void alpha(std::string*, student)’|
C:\Users\main.cpp|32|error: at this point in file|
C:\Users\main.cpp|37|error: expected primary-expression before ‘->’ token|
答案 0 :(得分:1)
1)代码中的三个#defines可能只是错误的
#define pArray
#define students
#define Request
特别是“pArray”,因为您稍后会将其用作参数名称。
2)你将一个函数与零进行比较。这没有意义,因为测试总会成功。
if (alpha != 0)
{
alpha(pArray);
}//end if
编辑:等等,我看,有一个(错误声明的)参数“隐藏”全局名称“alpha”。好吧,这显然也无法工作,因为参数没有名称(“alpha”实际上是类型)。
3)正如David Thornley的评论中所述,你试图用一个参数调用该函数,这显然是行不通的,因为你用两个参数声明了它。 (实际上你根本就没有参数调用它,因为pArray #define将“扩展”为空字符串)
4)你试图用来声明变量的语法是完全错误的
string new fName[sNUMBER];
我甚至不知道所谓的是什么意思。
可能还有更多......
答案 1 :(得分:0)
您真的需要获得有关C ++的教程或介绍性文本。有很多错误,我不知道从哪里开始...文件开头的#define
没有意义(你打算用它做什么?真正的效果是预处理器将丢弃这些单词),你不应该通过指针处理字符串(传递引用,如果可能的常量引用),你是声明一个带有两个参数的tPrint
函数和定义一个不同的tPrint
重载,其中三个最后一个是不正确的,因为alpha
不是一个类型。第一个和第二个参数(在预处理器替换之后)是未命名的,因此无法使用它们......
在获得第一行实际代码之前所有这些......
答案 2 :(得分:0)
错误是:函数void alpha(std::string*, student)
的参数太少。
当我们在您键入的代码中查找时:alpha(pArray);
。
但函数签名是:void alpha(string*,student pArray);
所以传递一个字符串作为参数将修复错误但是你的代码中还有很多其他错误的东西:
string* name = new fName[sNUMBER];
什么是fName? 也许C ++教程更适合您:see here
答案 3 :(得分:0)
你的大问题是#define
。你正在做的是将标识符定义为字面上没有。哪里有pArray
,现在什么都没有。在C ++中,以#
开头的任何行都是预处理程序命令,这意味着它对程序的文本进行操作。为了实际定义一个标识符,你只需要描述它。
您正在使用pArray
作为函数参数,这意味着它的出现都不在外部作用域。如果预处理器的行为与C ++的任何其他部分一样,那么它将是无害的,但它只是进行文本替换。您可能希望让编译器在您未能定义内容时告诉您。
另一个问题是“论据太少”。您将alpha
声明为两个参数,但只在tPrint
早期调用它时才传递一个。
在你修复你所得到的东西之前,我不会经历其余的错误。删除#define
后,自己仔细阅读其他错误。