2010-11-15 98 views
1

我是训练中的新代码猴,我目前遇到了使用数组和结构的问题。 目前我有一个主要文件,我有一个声明数组。我将该数组传递给外部函数,在该函数中对记录中的字段执行快速排序。主要是名字。我遇到了一些问题,我将记录数组中的元素复制到排序算法的临时数组中。我知道C++内置了一个qsort函数,但对于我现在正在处理的内容,我需要将算法写出来。我能够让这个工作只使用任何数组。将数组记录传递给临时数组记录的问题

尝试使用make文件进行编译时出现以下错误。

make 
g++ -c -o main2.o main2.cpp 
g++ -c externArray2.cpp -o externArray2.o 
externArray2.cpp: In function ‘void copytemp(EmployeeRecord*, EmployeeRecord*, int, int)’: 
externArray2.cpp:52: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:53: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:54: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:55: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:56: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:57: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:58: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:59: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
externArray2.cpp:60: error: cannot convert ‘float’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’ 
make: *** [externArray2.o] Error 1 

make文件

test1: main.o ExternArray.o 
     g++ main.o ExternArray.o -o test1 

externArray.o: ExternArray.cpp 
     g++ -c ExternArray.cpp -o ExternArray.o 

main.o: main.cpp 
     g++ -c main.cpp -o main.o 

Header.h

#ifndef _INCL_GUARD 
#define _INCL_GUARD 
const int maxEmployee =10; 
const int NAMES = 5; 
const int LENGTH = 15; 


typedef struct EmployeeRecord 
{ 
char first[10]; 
char last[10]; 
float reghours; 
float ovrhours; 
float pay; 
float gross; 
float defer; 
float state; 
float fed; 
float ssi; 
float net; 
} EmployeeRecord; 
#endif 

的main.cpp

#include <iostream> 
#include <cstring> 
using namespace std; 
#include "./Header2.h" 

void showArray(EmployeeRecord employees[], int, const char*); //Function Prototype 3.1 

extern void qsortArray(EmployeeRecord employees[], int, int);  //Funvtion Prototype  3.2 

int main(void) 
{ 
    EmployeeRecord myEmployee[maxEmployee]; 
    strcpy(myEmployee[0].first,"John"); 
    strcpy(myEmployee[0].last,"Doe"); 
    strcpy(myEmployee[1].first,"Ed"); 
    strcpy(myEmployee[1].last, "Whittle"); 
    strcpy(myEmployee[2].first, "Louise"); 
    strcpy(myEmployee[2].last, "Marion"); 
    strcpy(myEmployee[3].first,"Paula"); 
    strcpy(myEmployee[3].last, "Prentiss"); 
    strcpy(myEmployee[4].first, "Carl"); 
    strcpy(myEmployee[4].last, "Davidson"); 


    showArray(myEmployee, NAMES, "Before Sort"); 
    qsortArray(myEmployee, 0, 4); 
    showArray(myEmployee, NAMES, "After Sort"); 

return 0;    
} 



void showArray(EmployeeRecord employees[], int emp, const char *message) 
{ 
cout << message << endl; 
for (int test = 0; test < emp; test++) 
    { 
    cout << "First Name: " << employees[test].first << endl; 
    cout << "Last Name: " << employees[test].last << endl; 

    } 
} 

ExternArray.cpp

#include <cstring> 
#include <iostream> 
#include <iomanip> 
#include <stdio.h> 
using namespace std; 
#include "./Header2.h" 

void qsortArray(EmployeeRecord employees[], int, int);  //Funvtion Prototype   3.2 

void copytemp(EmployeeRecord tmpEmp[], EmployeeRecord emp[], int, int); 

void qsortArray(EmployeeRecord employees[], int start, int finish) 
{ 

int left=start, 
    right=finish; 
char pivot[15]; 
strcpy(pivot, employees[(start+finish)/2].first); 
    while (left < right) { 
    cout << pivot << " pivot " << endl; 
    cout << "outer loop" << endl; 
    // find left candidate 
    while (strcmp(employees[left].first,pivot) <0) left++; 
    // find right candidate 
    cout << "First Inner Loop" << endl; 
    while (strcmp(employees[right].first,pivot) > 0)right--; 
    cout << "Inner Loop" << endl; 
    if (left <= right) 
     { 
     EmployeeRecord tmpEmployee[1]; 
     cout << "Create new struct" << endl; 
     copytemp(tmpEmployee, employees, 0, left); 
     cout << "copy to temp" << endl; 
     copytemp(tmpEmployee, employees, 1, right); 
     copytemp(employees, tmpEmployee, left, 1); 
     copytemp(employees, tmpEmployee, right, 0); 

     left++; 
     right--; 
     cout << "All copy done" <<endl; 
     } 
    } // while left < right 
    cout << "Back out of outer Loop" << endl; 
    if (start < right) qsortArray(employees,start,right); 
    if (left < finish) qsortArray(employees,left,finish); 
} 

void copytemp(EmployeeRecord tmpEmp[], EmployeeRecord emp[], int first, int secound) 
{ 
memcpy(tmpEmp[first].first, emp[secound].first, sizeof(emp[secound].first)); 
memcpy(tmpEmp[first].last, emp[secound].last, sizeof(emp[secound].last)); 
memcpy(tmpEmp[first].reghours, emp[secound].reghours, sizeof(emp[secound].reghours)); 
memcpy(tmpEmp[first].ovrhours, emp[secound].ovrhours, sizeof(emp[secound].ovrhours)); 
memcpy(tmpEmp[first].pay, emp[secound].pay, sizeof(emp[secound].pay)); 
memcpy(tmpEmp[first].gross, emp[secound].gross, sizeof(emp[secound].gross)); 
memcpy(tmpEmp[first].defer, emp[secound].defer, sizeof(emp[secound].defer)); 
memcpy(tmpEmp[first].state, emp[secound].state, sizeof(emp[secound].state)); 
memcpy(tmpEmp[first].fed, emp[secound].fed, sizeof(emp[secound].fed)); 
memcpy(tmpEmp[first].ssi, emp[secound].ssi, sizeof(emp[secound].ssi)); 
memcpy(tmpEmp[first].net, emp[secound].net, sizeof(emp[secound].net)); 
} 
+0

+1表示问题。欢迎来到SO :-) – pmg 2010-11-16 00:15:10

回答

2

C你可以用一个简单的任务

tmpElm[first] = emp[secound]; 

复制整个struct这仅仅是有问题的,如果结构包含的成员是指针,这是不是你的情况。

+1

+1,你也可以用C++来做到这一点。 – 2010-11-15 23:57:14

+0

我已经做出了您所建议的更改,现在该程序已经解决了问题。现在问题似乎是我运行该程序时。我现在正在收到中止陷阱错误消息。 “退出外部循环中止陷阱” – JoshP 2010-11-16 00:31:36

+0

我第一次看到该消息...但我不做C++。也许你最好问一个新问题 – pmg 2010-11-16 00:33:23

2

尝试:

memcpy(&(tmpElm[first].first, &(emp[second].first), sizeof(emp[second].first)); 

不同的是,你需要通过一个浮动,而不是浮点值的一个地址。

您可能会发现,使用C++,你需要转换的浮动指针运算符(&)地址给你一个空白,因为C++有更强的类型规则,而不是C.

memcpy((void *)&(tmpElm[first].first, (void *)&(emp[second].first), sizeof(emp[second].first)); 

有一个在涉及数组时,很少有其他方法可以获得某些东西的地址,但这对于新程序员来说是最简单的。