Что не так с моими структурами? - PullRequest
0 голосов
/ 03 сентября 2011

Хорошо, я пишу здесь.Компилирование в mingw gcc.

Я пытаюсь сделать что-то действительно простое.создайте векторную структуру, содержащую 3 числа с плавающей точкой x, y, z.

, затем я хочу иметь возможность поработать с ними.

Это моя короткая программа тестирования:

#ifndef _PHYSICS_C_
#define _PHYSICS_C_


    #define SUCCESS  0
    #define FAILURE  1


    typedef struct {
        float x;
        float y;
        float z;
    }vector;

    int add ( vector* a, vector* b, vector* destination ){
        (*destination).x = (float)( ((*a).x) + ((*b).x) );
        (*destination).y = (float)( ((*a).y) + ((*b).y) );
        (*destination).z = (float)( ((*a).z) + ((*b).z) );      
        return SUCCESS;
    }

    int main(int argc, char** argv){

        printf("creating vectors\n\n");
        vector a = {1.0f,5.0f,3.0f};
        vector b = {2.0f,3.0f,6.0f};
        vector destination;

        printf("adding vectors\n\n");
        if(add(&a, &b, &destination) == SUCCESS){       
            printf("result: (%d, %d, %d)\n\n",destination.x,destination.y,destination.z);
        } else {
            printf("the program failed somehow...\n\n");
        }

        printf("Press any key to continue...\n");
        getchar();

        return SUCCESS;
    }

#endif

Когда я компилирую и запускаю его, он должен вернуть (3, 8, 9) сумму векторов a и b.

вместо этого он возвращает (0, 1074266112, 0) ...

Я не могу понять, что не так.

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

Ответы [ 4 ]

4 голосов
/ 03 сентября 2011

x, y, z являются числами с плавающей точкой, но вы пытаетесь напечатать их как целые числа.

попробовать:

        printf("result: (%f, %f, %f)\n\n",destination.x,destination.y,destination.z);

проверьте man printf или вашу документацию, чтобы увидеть все спецификации для printf.

0 голосов
/ 03 сентября 2011

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

Включите охрану (#ifndef _PHYSICS_C_ ...) для заголовочных файлов, а не для .c файлов.

printf требуется #include <stdio.h>.

Вы возвращаете значение SUCCESS из main(). Это нормально, поскольку SUCCESS оказывается равным 0, но было бы понятнее использовать либо EXIT_SUCCESS (объявлено в <stdlib.h>, либо просто return 0;.

Функция You add всегда возвращает SUCCESS. Это также может быть функция void (и проверка ее значения в main бесполезна). Если вы не планируете добавить проверку ошибок позже.

Приведения в вашей функции add не нужны; выражение уже имеет тип float. И (*foo).bar лучше записать как foo->bar. Например, первое назначение может быть упрощено до destination->x = a->x + y->x;.

Настоящая проблема (которая уже была указана) заключается в том, что вы используете формат "%d" для значений типа float.

Обычно используется double вместо float. Он обладает большей точностью, а современное оборудование часто оптимизируется для операций с двойной точностью.

Если вы включите предупреждения в своем компиляторе, он, вероятно, расскажет вам о некоторых из этих проблем.

0 голосов
/ 03 сентября 2011

Вы печатаете float с указателем формата %d, который предназначен для signed int. Вместо этого используйте %f или %g или %e.

Кроме того, почему бы вам не сделать:

    destination->x = a->x + b->x;

Это намного проще для глаз. (хотя и не проблема).

0 голосов
/ 03 сентября 2011

%d ожидает int. Используйте %f или %g для чисел с плавающей запятой / двойных чисел.

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