Предупреждение: несовместимые типы указателей, присвоенные 'node_t *' (он же 'struct node *') из 'mode_t' (он же 'unsigned int *')

Наш проект посвящен созданию фильма с использованием робота и программного обеспечения, разработанного одним из наших профессоров в нашем колледже. Библиотека называется MyroC, и роботы используют эту библиотеку для многих функций. В идеале у нас есть робот, который делает несколько кадров (изображений), которые вводит пользователь. У пользователя также будет возможность вставлять «сцены» или небольшие подфильмы в основной фильм.

Я начинающий программист, изучаю язык C. В моем последнем школьном проекте у нас с партнером было много проблем при работе с указателями и связанными списками в C. Мы понимаем самые основные идеи присвоения значений узлам в списках и изменении адресов, но мы не можем кажется, выясняют, откуда берутся наши предупреждения. Мы искали различные онлайн-источники и тексты, чтобы сравнить синтаксис нашего кода, и мы не видим, где мы могли бы сделать что-то неправильно.

Вот наш код:

//This part is contained in a separate header file called "movie.h"

    struct node { /* Singly-linked list nodes contain a Picture and point to next */
      Picture frame;
      node_t * next;
    };

    typedef struct node node_t;   /* Shorthand type for nodes in the picture list */

    typedef struct {     /* Wrapper struct for the movie as a linked list */
      node_t * first;
      node_t * last;
    } movie_t;

// This part is contained in a separate file called "movie.c" 
// An appropriate reference is made to movie.h
// #include "movie.h"

    movie_t
    create (void)
    {
      movie_t movie = {NULL, NULL}; // initially create an empty movie
      return movie;
    } // movie

    size_t
    size (movie_t * movie)
    {
      unsigned int count = 0;
      node_t * current = movie->first;
      while (current != NULL) {
        count++;
        current = current->next;
      }
        return count;
    } // size

    bool
    is_empty (movie_t * movie)
    {
      if (size(movie)==0) // movie contains no frames
        return true;
      else
        return false; // movie contains frames
    } // empty


    bool
    add (movie_t * movie, Picture frame) // add a frame to the end of the movie
    {
      int before_size = size(movie);

      node_t * new_node;
      new_node = malloc(sizeof(node_t));

      if (new_node == NULL) {
        printf("Error, malloc failed.\n");
        exit(EXIT_FAILURE);
      }

      node_t * cursor = movie->first;
      while(cursor->next != NULL) {
        cursor=cursor->next;
      }
      cursor->next = new_node;
      movie->last = new_node;
      new_node->frame = frame;

      if (before_size < size(movie) && (is_empty(movie)==false))
        return true;
      else
        return false;
    } // add


    void // insert a frame before index
    insert (movie_t * movie, movie_t * scene, unsigned int index)
    {
      node_t *insertion;
      insertion = malloc(sizeof(node_t));
      if (insertion == NULL) {
        printf("Error, malloc failed.\n");
        exit(EXIT_FAILURE);
      }

      insertion = movie->first;

      for (unsigned int i = 0; i < index; i++) {
        if (insertion != NULL) 
          insertion = insertion->next;
      }
      scene->last = insertion->next;
      insertion->next = scene->first;

    } // insert

Выходы терминала

error: unknown type name 'node_t'; did you mean 'mode_t'?
node_t * next;
^~~~~~
mode_t   
/usr/include/x86_64-linux-gnu/sys/types.h:70:18: note: 'mode_t' declared here    

person Alicia Ledesma    schedule 28.04.2019    source источник
comment
относительно: movie_t create (void) { movie_t movie = {NULL, NULL}; // initially create an empty movie return movie; } маловероятно, что вся структура может быть возвращена. Поэтому настоятельно рекомендуется использовать calloc() (или аналогичный) для помещения экземпляра movie_t в кучу, чтобы функция возвращала указатель на этот экземпляр.   -  person user3629249    schedule 29.04.2019
comment
среди других проблем, опубликованный код не компилируется! Одна из причин, по которой он не компилируется, заключается в том, что в нем отсутствуют необходимые операторы #include для необходимых файлов заголовков.   -  person user3629249    schedule 29.04.2019
comment
Опубликуйте минимальный воспроизводимый пример, чтобы мы могли воспроизвести проблему и помочь вам отладить ее.   -  person user3629249    schedule 29.04.2019
comment
относительно: struct node { Picture frame; node_t * next; }; Внутри структуры всегда указывайте полное имя. поэтому node_t * next; должно быть: struct node * next;   -  person user3629249    schedule 29.04.2019
comment
размещенный код НЕ совпадает с сообщениями об ошибках/предупреждениями от компилятора! Исправьте это, опубликовав минимально воспроизводимый пример кода, который вы фактически используете.   -  person user3629249    schedule 29.04.2019
comment
относительно: make CFLAGS=-g -fsanitize=address movie Это очень плохой способ установки макроса CFLAGS. Предложение: make -DCFLAGS="-Wall -Wextra -Wconversion -pedantic -std=c99 -g" movie Обратите внимание на -D перед CFLAGS   -  person user3629249    schedule 29.04.2019
comment
Большое спасибо user3629249 за совет! Я вернулся и понял, что основная проблема была в том, что мне нужно было сначала поставить typedef struct node node_t;   -  person Alicia Ledesma    schedule 29.04.2019


Ответы (1)


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

Вещи должны быть объявлены/определены до того, как они будут использованы.

Так что двигайся...

typedef struct node node_t;   /* Shorthand type for nodes in the picture list */

Так становится...

typedef struct node node_t;   /* Shorthand type for nodes in the picture list */

//This part is contained in the header file "movie.h"
struct node { /* Singly-linked list nodes contain a Picture and point to next */
   Picture frame;
    node_t * next;
};
person TimBrownlaw    schedule 28.04.2019