2017-02-12 43 views
0

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

Я получаю сообщение об ошибке из строки 38 (наименьшая сигнатура функции) в vector_test.c, ошибка читается «», «ожидается (получена« * »)». Это мой первый опыт работы в C, поэтому я думаю, что я должен делать что-то неправильно в отношении того, как я настроил typedef в types.h или что-то в этом роде, просто не совсем уверен и думал, что получу дополнительные мнения. Все, что вы могли бы указать на то, что я делаю неправильно, было бы полезно, спасибо!

Вот код:

vector_test.c

#include "types.h" 

int smallest(const Vector3t, int); 

void main (int argc, char *argv[]) { 
    unsigned int N = 0; 

    printf ("Number of elements ===>"); 
    scanf ("%u", &N); 
    struct Vector3t points[N]; 

    for (int i = 0; i < N; i++) 
    { 
     scanf("%d,%d,%d", &points[i].x, &points[i].y, &points[i].z); 
    } 

    for (int p = 0; p < N; p++) 
    { 
     printf("%i", points[p].x); 
     printf("%i", points[p].y); 
     printf("%i\n\n", points[p].z); 
    } 

    int result = smallest(points, N); 

    printf("%s", "The point closest to the origin is ("); 
    printf("%i", points[result].x); 
    printf("%s", ", "); 
    printf("%i", points[result].y); 
    printf("%s", ", "); 
    printf("%i", points[result].z); 
    printf("%s", ")"); 
} 

int smallest(const Vector3t* pts, int n) 
{ 
    int shortest = 99999999; 
    int shortIndex = -1; 

    for (int i = 0; i < n; i++) 
    { 
     int distance = pts[i].x + pts[i].y + pts[i].z; 
     if (distance < shortest) 
     { 
      shortest = distance; 
      shortIndex = i; 
     } 
    } 

    return shortIndex; 
} 

types.h

#ifndef types_H 
#define types_H 

struct vec3 { 
    int x; 
    int y; 
    int z; 
}; 

typedef struct Vector3t { 
    int x; 
    int y; 
    int z; 
} vec3; 

#endif 

Вот инструкции присваивания для этой конкретной части, так что вы можете увидеть, что я пытаюсь do:

1. Create a header file called “types.h” (with a macro guard) 
    a. In this header file, create a struct type called vec3 with int types: x, y, and z 
    b. Create a typedef to the struct vec3 above and call it Vector3t 
2. Create a C source file called “vector_test.c” 
    a. This file should include “types.h” and any other C system includes you may need 
    b. Create a main function that does the following: 
     i. Prompts the user “Number of elements ===> “ 
     ii. Read an unsigned int from the user – this variable will be referred to as N 
     iii. Create an array of Vector3t of size N and call it points 
     iv. Read in triples of int (comma separated) from the user to populate the entire array 
     v. Using the function signature: int smallest(const Vector3t* pts, int n), implement a 
     function that returns the index of the point that is the closest to the point (0, 0, 0) 
     vi. Call this function and store the index into an int called result 
     vii. Print out to the user “The point closest to the origin is (<x>, <y>, <z>)” where <x>, <y>, and <z> 
      correspond to the values of points[result] 
     viii. Free all allocated data 
+1

У вас нет типа 'Vector3t'. У вас есть 'struct vec3',' struct Vector3t', а ваш typedef последнего - 'vec3'. Вы не можете просто использовать имя типа struct без 'struct' впереди. – Dmitri

+0

У вас первая точка вашего назначения неправильно. Таким образом, вторая часть недействительна. – DeiDei

+0

Изменение моего кода typedef, чтобы выглядеть так, казалось, это трюк: typedef struct vec3 Vector3t; Спасибо за помощь! – Nyoxide

ответ

0

Ваша функция вперед декларация:

int smallest(const Vector3t, int);

В то время как ваше определение функции говорит:

int smallest(const Vector3t* pts, int n)

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

+3

В любом случае у него нет типа 'Vector3t'. – Dmitri

+0

Правда. В этом коде есть несколько ошибок, но я считаю, что это причина конкретной жалобы компилятора, о которой он спрашивал. – Caleb

+0

Я бы сказал, что его ошибка вызвана компилятором, пытающимся обработать его (несуществующее) имя типа как имя параметра вместо его типа, а затем встретить тарабарщину вместо запятой, разделяющей параметры ... – Dmitri

0

Вы ошибетесь в первых шагах:

  1. Создание заголовка файла с именем "types.h" (с макро-охранником)

    В этом заголовочном файле, создать тип структуры под названием vec3 с int типов: x, y и z

    Создать typedef к вышеупомянутому и struct vec3 называют его Vector3t

Для первого,

struct vec3 { 
    int x; 
    int y; 
    int z; 
}; 

является правильным.Затем определить typedef, сначала дают фактический тип, то тип псевдоним:

typedef struct vec3 Vector3t; 

Альтернативно, эти два могут быть объединены в одну ЬурейеЕ:

typedef struct vec3 { 
    int x; 
    int y; 
    int z; 
} Vector3t; 

Кроме того, декларация smallest не соответствует определению (не должны ли они выглядеть одинаково?) И the return type of main must be int.

 Смежные вопросы

  • Нет связанных вопросов^_^