我已经发现了如何做到这一点。也许我表达错了,但我已经达到的这个解决方案解决了我的问题:
源文件:
#include "Fila.h"
#include <string.h>
#include <stdio.h>
void Fila_Init(Fila_t * fila, const uint32_t qtdLinhas, const uint32_t qtdColunas, char ** buffer)
{
fila->qtdLinhas = qtdLinhas;
fila->qtdColunas = qtdColunas;
fila->head = 0;
fila->tail = 0;
fila->tamanho = 0;
fila->linhas = buffer;
uint32_t i;
for(i = 0; i < fila->qtdLinhas; i++)
memset(fila->linhas[i], FILA_CARACTERE, FILA_COLUNAS);
}
void Fila_Enfileira(Fila_t * fila, int tamDado, const char * dado)
{
if(tamDado > FILA_COLUNAS)
tamDado = FILA_COLUNAS;
if (FILA_TAIL == FILA_HEAD && (fila->tamanho + 1) > fila->qtdLinhas)
fila->head++;
memset(fila->linhas[FILA_TAIL], FILA_CARACTERE, FILA_COLUNAS);
fila->linhas[FILA_TAIL][tamDado] = '\0';
memcpy(fila->linhas[FILA_TAIL_INC], dado, tamDado);
if(fila->tamanho < fila->qtdLinhas)
fila->tamanho++;
}
char * Fila_Desenfileira(Fila_t * fila)
{
if(Fila_TemProximo(fila))
fila->tamanho--;
return fila->linhas[FILA_HEAD_INC];
}
inline char * Fila_Primeiro(Fila_t * fila)
{
return fila->linhas[FILA_HEAD];
}
inline bool Fila_TemProximo(Fila_t * fila)
{
return (fila->tamanho > 0);
}
void Fila_Imprime(Fila_t * fila)
{
int tamanho = fila->tamanho;
int cabeca = fila->head;
while(tamanho > 0)
{
printf("%s\n", fila->linhas[(cabeca++ % fila->qtdLinhas)]);
tamanho--;
}
}
头文件:
/*
* Fila.h
*
* Created on: 18/06/2013
* Author: Leandro
*/
#ifndef FILA_H_
#define FILA_H_
#include "types.h"
#include <stdint.h>
#define FILA_COLUNAS (fila->qtdColunas)
#define FILA_CARACTERE 0xff
#define FILA_TAIL (fila->tail % fila->qtdLinhas)
#define FILA_HEAD (fila->head % fila->qtdLinhas)
#define FILA_TAIL_INC (fila->tail++ % fila->qtdLinhas)
#define FILA_HEAD_INC (fila->head++ % fila->qtdLinhas)
typedef struct {
uint32_t qtdLinhas;
uint32_t qtdColunas;
uint32_t head;
uint32_t tail;
uint32_t tamanho;
char ** linhas;
} Fila_t;
void Fila_Init(Fila_t * fila, const uint32_t qtdLinhas, const uint32_t qtdColunas, char ** buffer);
void Fila_Enfileira(Fila_t * fila, int tamDado, const char * dado);
char * Fila_Desenfileira(Fila_t * fila);
bool Fila_TemProximo(Fila_t * fila);
char * Fila_Primeiro(Fila_t * fila);
void Fila_Imprime(Fila_t * fila);
#endif /* FILA_H_ */
还有,测试文件:
#include "Fila.h"
#include <stdio.h>
#include <string.h>
Fila_t testeStatic()
{
static char ele[8][512];
const int c = sizeof(ele[0])/sizeof(ele[0][0]);
const int l = sizeof(ele)/c;
printf("Tamanho da matriz: %d bytes.\n", c*l*sizeof(char));
char* ele2[c];
int i = 0;
for (i = 0; i < l; i++)
ele2[i] = ele[i];
Fila_t fila;
Fila_Init(&fila, l, c, ele2);
printf("Tamanho da matriz de ponteiros na fila: %d bytes.\n", sizeof(fila) - 5*sizeof(uint32_t));
printf("Tamanho da fila: %d bytes.\n", sizeof(fila));
printf("Tamanho final de uma fila [8][512]: %d\n", c*l*sizeof(char)+sizeof(fila));
printf("Overhead de apenas 24 bytes ou %f por cento.\n", (float)((sizeof(fila) * 100))/(c*l*sizeof(char)));
return fila;
}
void testaFila(Fila_t * fila)
{
char texto[20];
int i;
for (i = 0; i < 50; i++)
Fila_Enfileira(fila, sprintf(texto, "Entrada [%d]", i), texto);
while (Fila_TemProximo(fila))
printf("%s\n", Fila_Desenfileira(fila));
}
int main()
{
Fila_t fila = testeStatic();
testaFila(&fila);
return 0;
}
对不起,它是葡萄牙语,但我相信即使是我的语言也会有所帮助。特别感谢@Doug Currie 的帮助和耐心。如果有人需要帮助理解这段代码,很高兴解释。我还在谷歌代码上创建了这个项目,很高兴收到你的想法和批评!