나는 그것을하는 방법을 발견했습니다. 어쩌면 내가 표현했습니다 그것이 잘못하지만 내가 도달 한이 솔루션은 내 문제 해결 :
소스 파일 :
#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에게 특별한 감사를드립니다. 누군가이 코드를 이해하는 데 도움이 필요하면 설명하는 것이 즐겁습니다. 또한 Google 코드에이 코드 project을 만들었으며 아이디어와 비평을받는 것이 큰 기쁨입니다.
C++에서는 템플릿 클래스를 만들 수 있습니다. –
하지만 C에서 이것을하고 싶습니다. –
행운을 빈다. :-))) –