سلام دوستان عزیز
بنده در پیاده سازی circular_buffer به مشکل خوردم
کد رو پیاده سازی کردم ولی نمیدونم چطور میشه داده رو ذخیره و بازیابی کرد
این کد
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#define BUFFER_SIZE 1000
#define EXAMPLE_BUFFER_SIZE 4096
void error(const char *msg) { perror(msg); }
/*
*
*
* circular_buffer
*
*
* */
struct circular_buf_t
{
uint8_t* buffer;
size_t head;
size_t tail;
size_t max; // of the buffer
bool full;
};
/// Opaque circular buffer structure
typedef struct circular_buf_t circular_buf_t;
/// Handle type, the way users interact with the API
typedef circular_buf_t* cbuf_handle_t;
bool circular_buf_full(cbuf_handle_t me)
{
assert(me);
return me->full;
}
bool circular_buf_empty(cbuf_handle_t me)
{
assert(me);
return (!circular_buf_full(me) && (me->head == me->tail));
}
static inline size_t advance_headtail_value(size_t value, size_t max)
{
return (value + 1) % max;
}
static void advance_head_pointer(cbuf_handle_t me)
{
assert(me);
if(circular_buf_full(me))
{
me->tail = advance_headtail_value(me->tail, me->max);
}
me->head = advance_headtail_value(me->head, me->max);
me->full = (me->head == me->tail);
}
cbuf_handle_t circular_buf_init(uint8_t* buffer, size_t size)
{
assert(buffer && size);
cbuf_handle_t cbuf = malloc(sizeof(circular_buf_t));
assert(cbuf);
cbuf->buffer = buffer;
cbuf->max = size;
circular_buf_reset(cbuf);
assert(circular_buf_empty(cbuf));
return cbuf;
}
void circular_buf_free(cbuf_handle_t me)
{
assert(me);
free(me);
}
void circular_buf_reset(cbuf_handle_t me)
{
assert(me);
me->head = 0;
me->tail = 0;
me->full = false;
}
size_t circular_buf_size(cbuf_handle_t me)
{
assert(me);
size_t size = me->max;
if(!circular_buf_full(me))
{
if(me->head >= me->tail)
{
size = (me->head - me->tail);
}
else
{
size = (me->max + me->head - me->tail);
}
}
return size;
}
size_t circular_buf_capacity(cbuf_handle_t me)
{
assert(me);
return me->max;
}
void circular_buf_put(cbuf_handle_t me, uint8_t data)
{
assert(me && me->buffer);
me->buffer[me->head] = data;
advance_head_pointer(me);
}
int circular_buf_try_put(cbuf_handle_t me, uint8_t data)
{
int r = -1;
assert(me && me->buffer);
if(!circular_buf_full(me))
{
me->buffer[me->head] = data;
advance_head_pointer(me);
r = 0;
}
return r;
}
int circular_buf_get(cbuf_handle_t me, uint8_t* data)
{
assert(me && data && me->buffer);
int r = -1;
if(!circular_buf_empty(me))
{
*data = me->buffer[me->tail];
printf("here %s", data);
me->tail = advance_headtail_value(me->tail, me->max);
me->full = false;
r = 0;
}
return r;
}
int circular_buf_peek(cbuf_handle_t me, uint8_t* data, unsigned int look_ahead_counter)
{
int r = -1;
size_t pos;
assert(me && data && me->buffer);
// We can't look beyond the current buffer size
if(circular_buf_empty(me) || look_ahead_counter > circular_buf_size(me))
{
return r;
}
pos = me->tail;
for(unsigned int i = 0; i < look_ahead_counter; i++)
{
data[i] = me->buffer[pos];
pos = advance_headtail_value(pos, me->max);
}
return 0;
}
int main()
{
int i;
int error_in = 0;
int button_in = 1;
int up_in = 0;
int net_down_in = 0;
char output[20];
char machine_status[22];
char *custom_date = "";
// first where are we going to send it?
char *host = "localhost";
char *json_message = "";
char *path = "/IoT/APIs/insert/insertLog.php";
struct hostent *server;
FILE *fptr;
char * line = NULL;
size_t len = 0;
ssize_t read;
custom_date = format_time(output);
printf("\nString written on buffer = %s\n", machine_status);
printf ( "Current local time and date: %s\n", format_time());
if (error_in == 1 && button_in == 0 && up_in == 0) {
sprintf(machine_status,"MC001*1*%s\n", custom_date);
} else if (error_in == 0 && button_in == 1 && up_in == 0) {
sprintf(machine_status,"MC001*2*%s\n",custom_date) ;
} else if (error_in == 0 && button_in == 0 && up_in == 1) {
sprintf(machine_status,"MC001*3*%s\n", custom_date);
}
uint8_t * buffer = malloc(EXAMPLE_BUFFER_SIZE * sizeof(uint8_t));
cbuf_handle_t me = circular_buf_init(buffer, EXAMPLE_BUFFER_SIZE);
circular_buf_put(me, "test");
// lookup the ip address
server = gethostbyname(host);
if (/*server == NULL*/net_down_in == 1) {
error("ERROR, Internet Down or No such host");
} else {
fptr = fopen("fprintf_test.txt", "r");
circular_buf_get(me, buffer);
}
return 0;
}
مقدار test رو توسط circular_buf_put در بافر ذخیره کردم و اون رو با متد circular_buf_get میخام فراخونی کنم و نمایش بدم اما نمیدونم چطور باید اینکار رو انجام بدم
ممنون میشم کمکم کنید با تشکر