получение предупреждения : приведение указателя к целому числу разного размера при преобразовании строки в массив целых чисел и печати несвязанных чисел

#arrays #c

Вопрос:

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

typedef struct arrays {

    char air[28];
    char water[28];
    char land[28];
    char c9[28];
    char c11[28];
    char c13[28];
}arr;

int main()
{
    FILE* fp = fopen("ass6file.csv", "r");
    if (!fp)  {
        printf("Can not open file");
        return 0;
    }
    char buff[1024];
    int row = 0;
    int col = 0;
    int i = 0;
    arr value[999];

    while (fgets(buff, 1024, fp))  {
        col = 0;
        row  ;
        if (row == 1)
            continue;

        char* column = strtok(buff, ",");
        while (column)  {
            if (col == 1)
                strcpy(value[i].air, column);
            if (col == 2)
                strcpy(value[i].water, column);
            if (col == 3)
                strcpy(value[i].land, column);
            if (col == 4)
                strcpy(value[i].c9, column);
            if (col == 5)
                strcpy(value[i].c11, column);
            if (col == 6)
                strcpy(value[i].c13, column);
            column = strtok(NULL, ",");
            col  ;
        }
        i  ;
    }
    fclose(fp);
    int sum1[28];
    /*char sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,sum6=0,k;
    int var1,var2,var3,var4,var5,var6;
    int m1,m2,m3,m4,m5,m6;
    int s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;*/
    for (int k = 0; k < 28; k  )
        sum1[k] = (int)value[k].air;
    for (int k = 0; k < 28; k  )
        printf("%dn", sum1[k]);

    return 0;
}
 

Предупреждение, которое я получаю, это:

 filh.c: In function ‘main’:

filh.c:62:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   62 |  sum1[k]= (int)value[k].air;
      |           
 

Я новичок в C. Может ли кто-нибудь помочь напечатать большие числа, которых нет в файле?

Нравится—

 1966677344

1966677512

1966677680

1966677848

1966678016

1966678184

1966678352

1966678520

1966678688

1966678856

1966679024

1966679192

1966679360

1966679528

1966679696

1966679864

1966680032

1966680200

1966680368

1966680536

1966680704

1966680872

1966681040

1966681208

1966681376

1966681544

1966681712

1966681880
 

Комментарии:

1. разберитесь со своими типами правильно.

2. не могли бы вы, пожалуйста, уточнить, уважаемый сэр, я новичок в этом языке и в самом кодировании.

3. приведение работает только для простых типов, таких как int, float. air представляет собой массив символов.

Ответ №1:

Вы читаете столбцы из .csv файла в виде char массивов.

Но, делая свою сумму, вы [вероятно] захотите преобразовать их в an int .

Просто приведение их к int (например, использование (int) ) не сработает.

Когда вы говорите: arr[i].air это указатель на символьные данные, хранящиеся в air поле.

По счастливой случайности компилятор отметил это, потому что вы находитесь на 64-разрядной машине, и размер int переменной составляет 32 бита, а указатель-64 бита

Чтобы преобразовать строковое представление числа в фактическое число (например, нам нужно int значение), нам нужно использовать функцию atoi [или strtol ] вместо приведения.

Изменить:

 sum1[k] = (int) value[k].air;
 

В:

 sum1[k] = atoi(value[k].air);
 

Обновить:

я хочу выполнить арифметические операции над элементами массива , найти среднее значение, дисперсию и т. Д. Соответствующих столбцов, файл связан с наукой о данных

Хорошо. Итак, я предполагаю, что все входные данные-это числа. Мы можем провести рефакторинг struct , чтобы использовать целые числа. Это означает, что мы можем [с помощью atoi et. al.] хранить данные в виде чисел один раз, а затем работать с ними несколько раз без необходимости их повторного преобразования для каждой операции.

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

ваша программа работает, но она преобразует числа с десятичными дробями в целые числа, которые не дадут мне точных результатов, так как я хочу рассчитать среднее значение и другие вещи, и данные не останутся точными

Это легко решается с помощью переменных с плавающей запятой для суммы, среднего значения, дисперсии и т. Д. Это будет работать независимо от того, хранятся ли входные данные в виде целого числа или числа с плавающей запятой

Вот несколько переработанных кодов для вычисления суммы и среднего значения air столбца. Вы можете добавить аналогичный код для других полей/столбцов. Или любые значения, которые вам нужно вычислить:

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

#ifdef INPUT_IS_FLOAT
typedef double data_t;
#else
typedef long long data_t;
#endif

typedef struct arrays {
    data_t air;
    data_t water;
    data_t land;
    data_t c9;
    data_t c11;
    data_t c13;
} arr;

int
main()
{
    FILE *fp = fopen("ass6file.csv", "r");

    if (! fp) {
        printf("Can not open file");
        return 0;
    }

    char buff[1024];

    int count = 0;
    int col;
    arr value[999];

    arr *acur;

    // skip over column headers
    fgets(buff, sizeof(buff), fp);

    while (fgets(buff, sizeof(buff), fp)) {
        acur = amp;value[count  ];

        col = 0;
        char *column = strtok(buff, ",");

        while (column) {
#ifdef INPUT_IS_FLOAT
            data_t curval = strtod(column,NULL,10);
#else
            data_t curval = strtoll(column,NULL,10);
#endif

            switch (col) {
            case 1:
                acur->air = curval;
                break;
            case 2:
                acur->water = curval;
                break;
            case 3:
                acur->land = curval;
                break;
            case 4:
                acur->c9 = curval;
                break;
            case 5:
                acur->c11 = curval;
                break;
            case 6:
                acur->c13 = curval;
                break;
            }

            column = strtok(NULL, ",");
            col  ;
        }
    }
    fclose(fp);

    // sum all 'air' elements
    double sum = 0;
    for (acur = amp;value[0];  acur < amp;value[count];    acur)
        sum  = acur->air;
    printf("sum of air: %gn",sum);

    double mean = sum / count;
    printf("mean of air: %gn",mean);

    return 0;
}
 

Комментарии:

1. Это решает вашу непосредственную проблему. Но что ты хочешь сделать? Вы храните данные в sum1 массиве, но на самом деле не суммируете их. С исправленным кодом вы просто напечатаете air значения для каждой записи. Пожалуйста, отредактируйте свой вопрос и опишите подробнее, что вы хотите сделать с данными. После этого вы можете отправить мне комментарий здесь, и я смогу обновить свой ответ, чтобы помочь в дальнейшем.

2. Вы справились с ответом на этот вопрос гораздо лучше, чем я, и вам удалось использовать его по счастливой случайности . 1.

3. @AdrianMole На самом деле, я комментировал ваш ответ о atoi том, что и другие вещи, которые вы могли бы добавить, но вы слишком быстро нажали на «триггер удаления» 😉

4. @CraigEstey я хочу выполнить арифметические операции над элементами массива , найти среднее значение, дисперсию и т. Д. Соответствующих столбцов, файл связан с наукой о данных

5. Я знаю Адриана по предыдущим вопросам на SO [и он очень компетентный программист]. Обладая достаточной привилегией [которой я обладаю], я [все еще] могу видеть его ответ. Он удалил его , потому что он просто исправил код, чтобы избавиться от предупреждения, изменив типы с int на intptr_t , чтобы компилятор не жаловался на приведение. (например) Он изменил две строки: intptr_t sum1[28]; sum1[k] = (intptr_t)value[k].air; затем он понял, что atoi вместо этого необходимо использовать. Но для него исправить свой ответ было полной перепиской.