c - C 中的错误:“函数 'packet_destroy' 的隐式声明在 C99 中无效”
问题描述
我正在尝试对这个队列进行编程。
我在第 69 行的函数 long queue_store (struct queue_t *q, struct packet_t *p) 中的函数调用 packet_destroy(p) 以及第 86 行的同一函数调用中出现错误“函数‘packet_destroy’的隐式声明是在 C99 中无效“
...现在我必须在 long queue_store (...) 中调用函数 struct packet_destroy 之前声明它吗?或者这个错误在我的代码中意味着什么?
代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
#include <string.h>
struct packet_t {
char *name;
struct queue_t *queue;
};
struct queue_t {
char *name; // Name der Warteschlange
int size; // Groesse der Warteschlange
int entries; // Anzahl gueltige Eintraege in Warteschlange
int time; // Zeitstempel (werden wir erst in P6 beoetigen)
struct packet_t **packets; // Array von Zeigern auf Pakete
int read; // Lese-Position (retrieve_packet())
int write; // Schreib-Position (store_packet())
long lost; // Anzahl aller verlorenen Pakete
};
struct queue_t *queue_create(char *name, int size) {
int i;
struct queue_t *q; /* temporaerer zeiger auf Queue */
q = malloc (sizeof(struct queue_t)); //dynamisch
if (q == NULL) {
printf("Memory allocation failed");
return 0;
}
q -> name = name;
q -> size = size;
q -> entries = 0;
q -> write = 0;
q -> read = 0;
q -> lost = 0;
return (q);
}
long queue_store(struct queue_t * q, struct packet_t * p) {
int total = 0;
p -> name = q -> name;
if (q -> entries < q -> size) {
q -> entries++;
q -> write++;
total ++;
if (q -> write > q -> size) {
q -> write = 0;
}
return total;
}
else {
packet_destroy(p);
q -> lost ++;
return 0;
}
}
struct packet_t* queue_retrieve(struct queue_t *q) {
struct packet_t *p;
p = malloc (sizeof(struct packet_t));
struct packet_t *queue = NULL;
if (q -> entries > 0) {
q -> read ++;
q -> entries --;
packet_destroy(p);
if (q -> read > q -> size ) {
q -> read = 0;
}
}
return (p);
}
int queue_destroy(struct queue_t *q) {
free(q);
}
struct packet_t* packet_create(char *p) {
struct packet_t * packet;
packet = malloc (sizeof(struct packet_t));
packet -> name = p;
return (packet);
}
int packet_destroy(struct packet_t *packet) {
free(packet);
return 0;
}
int main(void) {
long i;
struct queue_t *Q; // Zeiger auf Warteschlange
struct packet_t *P; // Zeiger auf Paket
clock_t start, ende;
start = clock();
for (i = 0; i < 1000000; i++) {
P = packet_create ("tester");
}
ende = clock();
printf("Pakete erzeugen:\n");
printf("i = %ld\n", i);
printf("T[s] = %g\n", (double) (ende - start) / CLOCKS_PER_SEC);
printf("\n");
start = clock();
for (i = 0; i < 1000000; i++) {
Q = queue_create ("test-queue mit 100 Plaetzen", 100);
}
ende = clock();
printf("Queues erzeugen:\n");
printf("i =%ld\n", i);
printf("T[s] = %g\n", (double) (ende - start) / CLOCKS_PER_SEC);
printf("\n");
start = clock();
Q = queue_create ("test, 100", 100);
// Queue halb fuellen
for (i = 0; i < 50; i++) {
P = packet_create ("nix");
queue_store (Q,P);
}
// viele Pakete erzeugen
for (i = 0; i < 1000000; i++) {
P = packet_create ("nix");
queue_store (Q,P);
P=queue_retrieve(Q);
packet_destroy(P);
}
// Vorbefuellung entfernen
for (i = 0; i < 50; i++) {
P=queue_retrieve(Q);
packet_destroy(P);
}
ende = clock();
printf("Queue erzeugen, <Paket erzeugen, speichern,laden,zerstoeren>:\n");
printf("i =%ld\n", i);
printf("T[s] = %g\n", (double) (ende - start) / CLOCKS_PER_SEC);
printf("\n");
start = clock();
Q = queue_create ("test-queue fuer 1000 Pakete", 1000);
for (i = 0; i < 900; i++) {
P = packet_create ("aha");
queue_store (Q,P);
}
for (i = 0; i < 901; i++) {
P=queue_retrieve(Q);
if (NULL == P)
printf ("kein Paket\n");
else
packet_destroy(P);
}
ende = clock();
printf("Queue erzeugen, <Paket erzeugen, speichern,lasden,zerstoeren>:\n");
printf("i =%ld\n", i);
printf("T[s] = %g\n", (double) (ende - start) / CLOCKS_PER_SEC);
printf("\n");
start = clock();
Q = queue_create ("test, 1000", 1000);
for (i = 0; i < 900; i++) {
P = packet_create ((int)i,0.0,0L,NULL);
queue_store (Q,P);
}
for (i = 0; i < 450; i++) {
P=queue_retrieve(Q);
if (NULL == P)
printf ("kein Paket\n");
else
packet_destroy(P);
}
ende = clock();
printf("Queue erzeugen, <Paket erzeugen, speichern,laden,zerstoeren>:\n");
printf("i =%ld\n", i);
printf ("Q->entries = %d\n", Q->entries);
printf("T[s] = %g\n", (double) (ende - start) / CLOCKS_PER_SEC);
printf("\n");
}
解决方案
该错误意味着您packet_destroy
在定义函数之前尝试使用该函数,因此编译器不知道应该如何调用该函数。
您可以通过packet_destroy
在使用它的任何函数之前移动或在使用它之前添加函数声明来解决此问题。
推荐阅读
- intellij-idea - IntelliJ 预览中未显示某些降价语法
- python - 我在 Python 中有一个包含 7 个元素的列表,但 len 运算符返回长度为 1
- pandas - vlookup with pandas-如何用另一个数据帧中的值填充空列
- delphi - 将 delphi SOAP 客户端绑定到特定的本地端口/范围
- javascript - TypeError:item.optional_fields.map 不是反应中的函数
- javascript - javascript将事件添加到对象类
- tensorflow - 如何提取和使用句子的 BERT 编码来实现句子之间的文本相似性。(PyTorch/张量流)
- sql - 如何将 Postgres plpgsql 用户定义函数转换为 LANGUAGE SQL 用户定义函数?
- javascript - 有没有办法让我在不使用 Express 的情况下包含 React 生产构建文件?
- javascript - React 中的用户自定义组件