Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2011, 00:57   #1
Fallart
 
Регистрация: 12.05.2011
Сообщений: 9
По умолчанию External function

Народ, помогите пожалуйста
Вопрос наитупейший...
Как переделать функцию Qsort из internal в external?
Гугл, стена, бубен не помог, вся надежда на вас.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 

#define ... //срезал фор-ие для места
#define MAX 15

extern void CalculateTaxes(float gross,float defr, float *ft,float *st,float *ssit);
extern float calcGross(float h, float pr); // pass by value
void getTheData(char *ln, char *fn,float *h, float *p,float *d);

typedef struct EmployeeData
{
char lastname[15+1];
char firstname[10+1];
float pr;
float rh;
float theGross;
float fedtax;
float ssitax;
float net;
float oh;
float statetax;
float defer;
}EmployeeData;

void qsort(EmployeeData worker[], int left, int right);//ATTN!!

     
int main(void)
{
  int i = 0;
	EmployeeData worker[MAX];
   int counter=0;
   float totpr=0,totrh=0,totoh=0,totgross=0,totft=0,totssi=0,totnet=0,totst=0,totdef=0;
   float avpr=0,avrh=0,avoh=0,avgross=0,avft=0,avssi=0,avnet=0,avst=0,avdef=0;
   float h;
   char answer;
   FILE * reportFile; // 1) declare a FILE * variable

   reportFile = fopen("./report.txt","wt");
   // 2) open a report file with access mode "write-text"
   if (reportFile == NULL)
   {
     printf("  Report file open failed ...\n");
     fflush(stdin);
     getchar();
     exit(-10); // terminate w/ failure code -10; reqs <stdlib>
   }
   fprintf(reportFile,REPORTHEADS1);
   fprintf(reportFile,REPORTHEADS2);
   fprintf(reportFile,REPORTHEADS3);
   do {
     getTheData(worker[i].lastname,worker[i].firstname,&h,&worker[i].pr,&worker[i].defer);
     worker[i].theGross = calcGross(h,worker[i].pr); // call 3.4
     CalculateTaxes(worker[i].theGross,worker[i].defer,&worker[i].fedtax,&worker[i].statetax,&worker[i].ssitax); // 3.5
		// float rh, oh, net;
		 if (h <= 40)
		 {worker[i].rh=h;
		 worker[i].oh=0;}
		 else
		 { worker[i].rh=40;
		 worker[i].oh=h-40;}

	 worker[i].net= worker[i].theGross-worker[i].defer-worker[i].fedtax-worker[i].ssitax-worker[i].statetax;

    
	
	totpr=totpr+worker[i].pr;
	totrh=totrh+worker[i].rh;
	totoh=totoh+worker[i].oh;
	totgross=totgross+worker[i].theGross;
	totft=totft+worker[i].fedtax;
	totssi=totssi+worker[i].ssitax;
	totnet=totnet+worker[i].net;
	totst=totst+worker[i].statetax;
	totdef=totdef+worker[i].defer;

	counter++;
i++;

     printf("  Do you have another employee(Y/N) ==> ");
     while (getchar() != '\n'); // same as fflush(stdin);
     answer = getchar();
     getchar(); // removes '\n' from response
   } while (answer == 'y' || answer == 'Y');

qsort(worker, 0, counter-1);//ATTN!!
   int k=0;
do
{
 fprintf(reportFile,REPORTFORMAT1,worker[k].lastname,worker[k].pr,worker[k].rh,worker[k].theGross,worker[k].fedtax,worker[k].ssitax,worker[k].net);
     fprintf(reportFile,REPORTFORMAT2,worker[k].firstname,worker[k].oh,worker[k].statetax,worker[k].defer);
	 k++;
} while (k<i);

   	avpr=totpr/counter;
	avrh=totrh/counter;
	avoh=totoh/counter;
	avgross=totgross/counter;
	avft=totft/counter;
	avssi=totssi/counter;
	avnet=totnet/counter;
	avst=totst/counter;
	avdef=totdef/counter;

	fprintf(reportFile,REPORTFORMAT3,"Totals",totpr,totrh,totgross,totft,totssi,totnet);
	fprintf(reportFile,REPORTFORMAT4,totoh,totst,totdef);
	fprintf(reportFile,REPORTFORMAT5,"Averages",avpr,avrh,avgross,avft,avssi,avnet);
	fprintf(reportFile,REPORTFORMAT6,avoh,avst,avdef);
	
   fclose(reportFile); // 4) close the file
   while (getchar() != '\n'); // same as fflush(stdin);
   printf(" Press any key ... ");
   getchar();  return 0;
}

void getTheData(char *ln, char *fn,float *h, float *p,float *d)
{
  printf(" Enter last name ==> ");
  scanf("%s",ln);
  printf(" Enter first name ==> ");
  scanf("%s",fn);
  printf(" Enter hours ==> ");
  scanf("%f",h);
  printf(" Enter payrate ==> ");
  scanf("%f",p);
  printf(" Enter deferred earnings ==> ");
  scanf("%f",d);
}

void qsort(EmployeeData worker[], int left, int right)//ATTN!!
{
  int a, b;
  EmployeeData x;
  EmployeeData temp;

  a = left;
  b = right;
  x = worker[(left+right)/2];

  do {
    while((strcmp(worker[a].lastname,x.lastname) < 0) && (a < right)) {
       a++;
    }
    while((strcmp(worker[b].lastname,x.lastname) > 0) && (b > left)) {
        b--;
    }
    if(a <= b) {
	
	temp=worker[a];
	worker[a]=worker[b];
	worker[b]=temp;

      a++;
      b--;
   }
  } while(a <= b);

  if(left < b) {
     qsort(worker, left, b);
  }
  if(a < right) {
     qsort(worker, a, right);
  }
}

Последний раз редактировалось ACE Valery; 12.05.2011 в 01:13.
Fallart вне форума Ответить с цитированием
Старый 12.05.2011, 01:42   #2
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Dll что ли сделать?
Lingua c++ non penis caninus est.
Dayman вне форума Ответить с цитированием
Старый 12.05.2011, 02:21   #3
Fallart
 
Регистрация: 12.05.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Dayman Посмотреть сообщение
Dll что ли сделать?
Да я же говорю, все намного проще, нужно сделать Qsort функцию так же как и:

extern void CalculateTaxes(float gross,float defr, float *ft,float *st,float *ssit);
extern float calcGross(float h, float pr); // pass by value

Эти две без проблем получились, а та уперлась, там толи какой-то нюанс связанный со структурами, толи у меня от недосыпания мозг размагнитился... Мне ее через несколько часов сдавать, а получить ниже оценку мз-за ерунды как-то не очень...
Fallart вне форума Ответить с цитированием
Старый 12.05.2011, 02:55   #4
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Вынесите структуру в отдельный файл и добавляйте к .cpp файлам
Lingua c++ non penis caninus est.
Dayman вне форума Ответить с цитированием
Старый 12.05.2011, 03:10   #5
Fallart
 
Регистрация: 12.05.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Dayman Посмотреть сообщение
Вынесите структуру в отдельный файл и добавляйте к .cpp файлам
Вынести вынес, а вот как саму связь прописать, не пойму в чем подвох. По аналогии с другими двумя функциями не получается.


Мне по сути надо отредактировать строки:
void qsort(EmployeeData worker[], int left, int right);//ATTN!!

qsort(worker, 0, counter-1);//ATTN!!
Вот это у меня и не получается...
Fallart вне форума Ответить с цитированием
Старый 12.05.2011, 03:33   #6
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Код:
void qsort(EmployeeData worker[], int left, int right) {...}
вместе с телом выкидываете в другой cpp файл.
В этом файл (где main) пишите
Код:
extern void qsort(EmployeeData worker[], int left, int right);
Цитата:
Сообщение от Fallart Посмотреть сообщение
qsort(worker, 0, counter-1);//ATTN!!
Это редактировать не надо.
Lingua c++ non penis caninus est.
Dayman вне форума Ответить с цитированием
Старый 12.05.2011, 04:00   #7
Fallart
 
Регистрация: 12.05.2011
Сообщений: 9
По умолчанию

/tmp/ccvry2Hc.o: In function `main':
main3.cpp: (.text+0x66b): undefined reference to `qsort(EmployeeData*, int, int)'
collect2: ld returned 1 exit status


Ошибка при компиляции в Linux'е, сам пробовал точно так же...
Fallart вне форума Ответить с цитированием
Старый 12.05.2011, 04:09   #8
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

На windows с mingw собралось
h.h
Код:
#ifndef H_H_INCLUDED
#define H_H_INCLUDED

typedef struct EmployeeData {
    char lastname[15+1];
    char firstname[10+1];
    float pr;
    float rh;
    float theGross;
    float fedtax;
    float ssitax;
    float net;
    float oh;
    float statetax;
    float defer;
} EmployeeData;

#endif // H_H_INCLUDED
1.cpp
Код:
#include "h.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void qsort ( EmployeeData worker[], int left, int right ) { //ATTN!!
    int a, b;
    EmployeeData x;
    EmployeeData temp;

    a = left;
    b = right;
    x = worker[ ( left+right ) /2];

    do {
        while ( ( strcmp ( worker[a].lastname, x.lastname ) < 0 ) && ( a < right ) ) {
            a++;
        }

        while ( ( strcmp ( worker[b].lastname, x.lastname ) > 0 ) && ( b > left ) ) {
            b--;
        }

        if ( a <= b ) {

            temp = worker[a];
            worker[a] = worker[b];
            worker[b] = temp;

            a++;
            b--;
        }
    }
    while ( a <= b );

    if ( left < b ) {
        qsort ( worker, left, b );
    }

    if ( a < right ) {
        qsort ( worker, a, right );
    }
}
main.cpp
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "h.h"


#define MAX 15

extern void qsort ( EmployeeData worker[], int left, int right ); //ATTN!!


int main ( void ) {
    int i = 0;
    EmployeeData worker[MAX];
    int counter = 0;
    float totpr = 0, totrh = 0, totoh = 0, totgross = 0, totft = 0, totssi = 0, totnet = 0, totst = 0, totdef = 0;
    float avpr = 0, avrh = 0, avoh = 0, avgross = 0, avft = 0, avssi = 0, avnet = 0, avst = 0, avdef = 0;
    float h;
    char answer;
    FILE* reportFile;  // 1) declare a FILE * variable

    reportFile = fopen ( "./report.txt", "wt" );

    // 2) open a report file with access mode "write-text"
    if ( reportFile == NULL ) {
        printf ( "  Report file open failed ...\n" );
        fflush ( stdin );
        getchar();
        exit ( -10 ); // terminate w/ failure code -10; reqs <stdlib>
    }


    do {
        if ( h <= 40 ) {
            worker[i].rh = h;
            worker[i].oh = 0;
        }
        else {
            worker[i].rh = 40;
            worker[i].oh = h - 40;
        }

        worker[i].net = worker[i].theGross - worker[i].defer - worker[i].fedtax - worker[i].ssitax - worker[i].statetax;



        totpr = totpr + worker[i].pr;
        totrh = totrh + worker[i].rh;
        totoh = totoh + worker[i].oh;
        totgross = totgross + worker[i].theGross;
        totft = totft + worker[i].fedtax;
        totssi = totssi + worker[i].ssitax;
        totnet = totnet + worker[i].net;
        totst = totst + worker[i].statetax;
        totdef = totdef + worker[i].defer;

        counter++;
        i++;

        printf ( "  Do you have another employee(Y/N) ==> " );

        while ( getchar() != '\n' ); // same as fflush(stdin);

        answer = getchar();
        getchar(); // removes '\n' from response
    }
    while ( answer == 'y' || answer == 'Y' );

    qsort ( worker, 0, counter - 1 ); //ATTN!!
    int k = 0;

    do {
        /*fprintf ( reportFile, REPORTFORMAT1, worker[k].lastname, worker[k].pr, worker[k].rh, worker[k].theGross, worker[k].fedtax, worker[k].ssitax, worker[k].net );
        fprintf ( reportFile, REPORTFORMAT2, worker[k].firstname, worker[k].oh, worker[k].statetax, worker[k].defer );*/
        k++;
    }
    while ( k < i );

    avpr = totpr / counter;
    avrh = totrh / counter;
    avoh = totoh / counter;
    avgross = totgross / counter;
    avft = totft / counter;
    avssi = totssi / counter;
    avnet = totnet / counter;
    avst = totst / counter;
    avdef = totdef / counter;

    /*fprintf ( reportFile, REPORTFORMAT3, "Totals", totpr, totrh, totgross, totft, totssi, totnet );
    fprintf ( reportFile, REPORTFORMAT4, totoh, totst, totdef );
    fprintf ( reportFile, REPORTFORMAT5, "Averages", avpr, avrh, avgross, avft, avssi, avnet );
    fprintf ( reportFile, REPORTFORMAT6, avoh, avst, avdef );*/

    fclose ( reportFile ); // 4) close the file

    while ( getchar() != '\n' ); // same as fflush(stdin);

    printf ( " Press any key ... " );
    getchar();  return 0;
}

void getTheData ( char* ln, char* fn, float* h, float* p, float* d ) {
    printf ( " Enter last name ==> " );
    scanf ( "%s", ln );
    printf ( " Enter first name ==> " );
    scanf ( "%s", fn );
    printf ( " Enter hours ==> " );
    scanf ( "%f", h );
    printf ( " Enter payrate ==> " );
    scanf ( "%f", p );
    printf ( " Enter deferred earnings ==> " );
    scanf ( "%f", d );
}
Часть комментариев спилил.
Вы случаем не вручную комплилируете? Может не все .cpp файлы gcc передаете?
Lingua c++ non penis caninus est.
Dayman вне форума Ответить с цитированием
Старый 12.05.2011, 04:21   #9
Fallart
 
Регистрация: 12.05.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Dayman Посмотреть сообщение
Вы случаем не вручную комплилируете? Может не все .cpp файлы gcc передаете?

Походу в этом и заключается, ошибка... Я баран.
Надо идти сдавать, оставил без extern.

Все равно спасибо большое! Переделаю потом, может прокатит пересдать.
Fallart вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Unresolved external Alex54 C++ Builder 0 15.03.2011 00:21
External Interface Юлия_utcit JavaScript, Ajax 1 03.01.2011 23:24
unresolved external symbol Эрин Общие вопросы C/C++ 3 22.03.2010 15:32
unresolved external symbol... LukS Общие вопросы C/C++ 2 16.04.2009 11:41
unresolved external symbol IgorKr Общие вопросы C/C++ 3 20.12.2008 15:01