返回结构的地址

时间:2016-04-19 07:58:43

标签: c

这是我正在处理的代码,在函数trace* readTrace(char* fileName)中我必须读取一个文件(填充结构),然后返回trace结构的地址。结构的时间和价值也是指针,但我不知道该怎么做。

 #include <stdio.h>
 #include <stdlib.h>
 #include <conio.h>
 #include <math.h>

 #define TMAX 1000
 #define NBPTS 2000
 #define DT 0.5

 typedef struct
 {
    char comment[40];
    int nbpts;
    float time[4096];
    float value[4096];
 } trace;

 void simuTrace(int tmax, float dt, float params[], trace *uneTrace)
 {
    printf("Shkruani emrin e eksperimentit : \n");
    scanf("%s", &uneTrace->comment);

    int i = 0;
    float v = 0, w = 0, dv = 0, dw = 0, t = 0;
    float a = params[0], d = params[1], e = params[2];

    while (t <= tmax)
    {
            dv = (a - v) * (v - 1) * v - w;
            dw = e * (0.5 * v - w - d);
            v += dv * dt;
            w += dw * dt;
            uneTrace->time[i] = t;
            uneTrace->value[i] = v;
            i++;
            t += dt;
    }
    uneTrace->nbpts = i;
 }

 void printTrace(trace uneTrace)
 {
    printf("%s\n", uneTrace.comment);
    printf("\t%d\n", uneTrace.nbpts);
    int i;
    for (i = 0; i <= NBPTS; i++) {
            printf(" t= %.1f \tv= %.4f \n ", uneTrace.time[i],uneTrace.value[i]);
    }
 }

 void saveTraceBin(char *fileTrace, trace uneTrace)
 {
    FILE *file;
    file = fopen(fileTrace, "w");
    if (fopen(fileTrace, "w") == NULL) {
            printf("\n Gabim! \n");
    } else {
            fprintf(file, "%s\n", uneTrace.comment);
            fprintf(file, "%d", uneTrace.nbpts);
            int i;
            for (i = 0; i <= NBPTS; i++) {
                    fprintf(file, "\n %.1f %.4f",uneTrace.time[i],uneTrace.value[i]);
            }
            fclose(file);
    }
 }

 void readTrace(char *fileName, trace *uneTrace)
 {
    FILE*file;
    file = fopen(fileName, "r");
    if (file != NULL) {
            fscanf(file, "%s", uneTrace->comment);
            fscanf(file, "%d", &uneTrace->nbpts);
            int i;
            for (i = 0; i <= NBPTS; i++) {
                    fscanf(file, "%f", &(uneTrace->time[i]));
                    fscanf(file, "%f", &(uneTrace->value[i]));
            }
            printf("\n Leximi perfundoi me sukses!\n");
    } else {
            printf("\n Gabim! \n");
    }
    fclose(file);
 }

 trace* readTrace(char* fileName) {
    FILE*file;
    file = fopen(fileName, "r");
    if (file != NULL) {
            fscanf(file, "%s", uneTrace->comment);
            fscanf(file, "%d", &uneTrace->nbpts);
            int i;
            for (i = 0; i <= NBPTS; i++) {
                    fscanf(file, "%f", &(uneTrace->time[i]));
                    fscanf(file, "%f", &(uneTrace->value[i]));
            }
            printf("\n Leximi perfundoi me sukses!\n");
    } else {
            printf("\n Gabim! \n");
    }
    fclose(file);
 }

 float errorTrace(trace uneTrace1, trace uneTrace2)
 {
    float sum = 0;
    int i;
    for (i = 0; i <= NBPTS; i++)
    {
            sum += (uneTrace1.value[i] - uneTrace2.value[i]);
    }
    sum /= NBPTS;
    return sqrt(fabs(sum));
 }


 int main()
 {
    float Pa[] = { 0.5, 0.01, 0.05 };
    float Pb[] = { 0.75, 0.3, 0.1 };

    float e1, e2;
    trace tracePa, tracePb, traceCell;

    simuTrace(NBPTS, DT, Pa, &tracePa);
    printTrace(tracePa);
    saveTraceBin("myfile1.txt", tracePa);

    simuTrace(NBPTS, DT, Pb, &tracePb);
    printTrace(tracePb);
    saveTraceBin("myfile2.txt", tracePb);

    readTrace("cell.txt", &traceCell);

    e1 = errorTrace(traceCell, tracePa);
    e2 = errorTrace(traceCell, tracePb);

    printf("\n Gabimi nga llogaritja e Pa : %f ", e1);
    printf("\n Gabimi nga llogaritja e Pb : %f ", e2);

    if (e1 < e2)
            printf("\n\n Rasti Pa eshte me i mire se rasti Pb \n");
    else
            printf("\n\n Rasti Pb eshte me i mire se rasti Pa \n");

    return  0;
 }

2 个答案:

答案 0 :(得分:0)

函数结构应如下所示

trace* readTrace(char* fileName)
{
    trace* traceptr;
    int no_of_elements;

    // Read the no of trace elements stored in file
    // Generally this is avaliable in a location in the start of file,
    // If not, then you have to guess and resize if it falls short.

    traceptr = malloc(sizeof(trace) * no_of_elements);

    // Read the trace elements from file

    return (traceptr);
}

在main()

中调用它
int main(void)
{
    trace *traceptr;
    // Other stuff

    traceptr = readTrace(filename);

    simuTrace(NBPTS, DT, Pa, traceptr);

}

您需要修改printTrace函数,将指向struct的指针作为输入而不是整个结构。然后它可以输入traceptr。同样适用于saveTraceBin函数。

答案 1 :(得分:0)

您可以返回trace*中分配的readTrace

trace* readTrace(char* fileName) {
    trace *tp = malloc(sizeof *tp);
    if (!tp) return NULL;
    // fill up tp from file
    ....
}
// call this in main 
trace *t = readTrace("cell.txt");
free(t); // free it when done

或者您可以为该功能提供跟踪,例如

void readTrace(char* filename, trace *tp) {
    if (!tp) return;
    // fill up tp from file
    ....
}
// call this in main 
trace t; // define trace object
readTrace("cell.txt", &t);

至于填充时间和值,请从文件中读取数组:

int i;
fscanf(file, "%d", &t->nbpts);
for (i = 0; i < t->nbpts; i++) {
    fscanf(file, "%f", &(t->time[i]));
    fscanf(file, "%f", &(t->value[i]));
}