2010-11-15 10 views
1

Je suis un nouveau singe de code à l'entraînement, et j'ai actuellement des problèmes avec les tableaux et les structures. Actuellement, j'ai un fichier principal où j'ai un Array of Records déclaré. Je passe ce tableau à une fonction externe, où un tri rapide est effectué sur le avec des champs dans l'enregistrement. Principalement le prénom. J'ai un problème où je copie des éléments dans le tableau d'enregistrements, à un tableau temporaire pour l'algorithme de tri. Je sais que C++ a une fonction qsort intégrée, mais pour ce sur quoi je travaille en ce moment, j'ai besoin de faire écrire l'algoritm tel qu'il est. J'ai réussi à faire fonctionner cela en n'utilisant que des tableaux.Problèmes de passage d'un tableau d'enregistrements à un tableau temporaire d'enregistrements

Je reçois l'erreur suivante lors de la tentative de compilation avec le fichier 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 

Créer un fichier

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 pour une question bien présentée. Bienvenue à SO :-) – pmg

Répondre

2

En C vous pouvez copier un ensemble struct avec une mission simple

tmpElm[first] = emp[secound]; 

C'est seulement problématique si le struct contient des membres qui sont des pointeurs, ce qui est votre cas.

+1

+1, et vous pouvez le faire aussi en C++. –

+0

J'ai fait le changement que vous avez suggéré, et maintenant le programme est conforme aux problèmes. Maintenant, les problèmes semblent être lorsque je cours le programme. Je reçois maintenant un message d'erreur de piège d'abandon. "Retour du piège Loop Abort externe" – JoshP

+0

Première fois que j'ai vu ce message ... mais je ne fais pas de C++. Peut-être que vous feriez mieux de poser une nouvelle question – pmg

2

Essayez:

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

La différence est que vous devez transmettre une adresse d'un flotteur plutôt que d'une valeur flottante.

Vous trouverez peut-être que C++ vous devez lancer le pointeur de flotteur que l'adresse de l'opérateur (&) vous donne un vide, car C++ a des règles de frappe plus fort que C.

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

Il y a peu d'autres façons d'obtenir l'adresse de quelque chose quand les tableaux sont impliqués, mais c'est le plus simple pour un nouveau programmeur.