Наш проект посвящен созданию фильма с использованием робота и программного обеспечения, разработанного одним из наших профессоров в нашем колледже. Библиотека называется 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
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#include
для необходимых файлов заголовков. - person user3629249   schedule 29.04.2019struct node { Picture frame; node_t * next; };
Внутри структуры всегда указывайте полное имя. поэтомуnode_t * next;
должно быть:struct node * next;
- person user3629249   schedule 29.04.2019make -DCFLAGS="-Wall -Wextra -Wconversion -pedantic -std=c99 -g" movie
Обратите внимание на-D
передCFLAGS
- person user3629249   schedule 29.04.2019typedef struct node node_t;
- person Alicia Ledesma   schedule 29.04.2019