Как я могу передать массив структур в другую функцию - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь передать массив структур в качестве указателя в другой функции. Но компилятор просто отказывается.

Я создаю этот код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Values{
    char timestamp[21];
    char temperature[2];
    int tmp;
};

char *readString(char out[], FILE *fp){// Reading and storing the input values, out = the string that this func returns
    int ch, i;
    while(EOF!=(ch=fgetc(fp)))
        if(ch == '"') break;

    for(i=0;EOF!=(ch=fgetc(fp));++i){
        if(ch == '"') break;
        out[i] = ch;
    }

    out[i]='\0';
    return out;
}

void printValues(struct Values * v, int i){ //just a printing method, for printing the values, i = the amount of values I have
    int j;
    for(j=0; j<i; j++){
        printf("%s \t : \t %s \t :\t %d \n\n", v[j]->timestamp, v[j]->temperature, v[j]->tmp);
    }
}

void makeTmpIntegers(struct Values values[], int i){ //making temperatures integers so I can use them in sorts, i = the amount of values I have
    int j;
    for(j=0; j<i;j++){
        values[j].tmp = atoi(values[j].temperature);
    }
}

int main(void){ //The beginning of the programm, what did you expect?
    struct Values values[8223];
    FILE *file = fopen("hum.txt", "r" );
    int i=0; //the number of every stored value (for the timestamps)
    int k=0; //the number of every stored value (for the temperatures)

    if (file != NULL ){
        char tempString [21];
        int flag = 1;
        while(*readString(tempString, file)){ //if the readStrinf outputs "/0" == "" (end of FILE)
            if(flag == 1){strcpy(values[i].timestamp, tempString); flag++; i++;}
            else if(flag == 2){strcpy(values[k].temperature, tempString); flag--; k++;}
        }
        fclose(file);
    }

    makeTmpIntegers(values, i);

    printValues(&values, i);

    return 0;
}

Я точно знаю, что могу передать структуру из функции в другую (она прекрасно работает таким образом), но я хочу передать указатели (причины памяти).

Я пытался сделать это с помощью функции printValues ​​()

В этом случае компилятор не компилируется. Это сообщение, которое я получаю:

In function 'printValues':
24  46  [Error] invalid type argument of '->' (have 'struct Values')
24  63  [Error] invalid type argument of '->' (have 'struct Values')
24  82  [Error] invalid type argument of '->' (have 'struct Values')
In function 'main':
53  17  [Warning] passing argument 1 of 'printValues' from incompatible pointer type
21  6   [Note] expected 'struct Values *' but argument is of type 'struct Values (*)[8223]'


Плюс, если я инициализирую функцию следующим образом: void printValues(struct Values * v[], int i) Она компилируется, но не печатает значения вообще

I знаю, что правильный способ чтения целого числа из текстового файла, не так, но я не мог понять что-то еще

1 Ответ

1 голос
/ 21 апреля 2020

Это нормально:

struct Values{
    char timestamp[21];
    char temperature[2];
    int tmp; };

Итак, эти две функции подписи:

void printValues(struct Values * v, int i) { ... }

void makeTmpIntegers(struct Values values[], int i) { ... }

Это НЕПРАВИЛЬНО:

v[j]->timestamp, v[j]->temperature, ...

Замена:

v[j].timestamp, v[j].temperature, ...

ТАКЖЕ:

Измените printValues(&values, i); на printValues(values, i);

Я не тщательно проверял другие ошибки, но это должно заставить вас двигаться в правильном направлении. ..


ADDENDUM:

В обоих приведенных выше примерах printValues(struct Values * v, int i) и makeTmpIntegers(struct Values values[], int i) вы УЖЕ «проходите указателем». Вам просто нужно исправить свой синтаксис, как в моих примерах.

Как сказал Оппен ниже:

Также обратите внимание, что передача аргумента массива в C функционально эквивалентна передаче указатель, копия не используется, поэтому я не уверен, какие причины памяти мешают вам просто передать массив структур напрямую ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...