PDA

Ver la Versión Completa : Enumerado raro raro


Guillermo80
08-03-2008, 14:34:39
Hola, no soy muy dado a usar los tipos enumerados, pero recientemente me encontré con lo siguiente: un enumerado (hasta aquí bien), y una "función" a la cual se le pasa como entrada FLAC__StreamEncoderInitStatus. Mi pregunta es que no sé como funciona, y qué devuelve exactamente la función (¿un puntero a carácter, por qué?)


typedef enum {

FLAC__STREAM_ENCODER_OK = 0,
FLAC__STREAM_ENCODER_UNINITIALIZED,
FLAC__STREAM_ENCODER_OGG_ERROR,
FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR,
FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA,
FLAC__STREAM_ENCODER_CLIENT_ERROR,
FLAC__STREAM_ENCODER_IO_ERROR,
FLAC__STREAM_ENCODER_FRAMING_ERROR,
FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR

} FLAC__StreamEncoderState;typedef enum {
FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0,
FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR,
FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER, FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION, FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER,
FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE,
FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA,
FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED

} FLAC__StreamEncoderInitStatus;FLAC_API const char * const FLAC__StreamEncoderStateString[] = {
"FLAC__STREAM_ENCODER_OK",
"FLAC__STREAM_ENCODER_UNINITIALIZED",
"FLAC__STREAM_ENCODER_OGG_ERROR",
"FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR",
"FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA",
"FLAC__STREAM_ENCODER_CLIENT_ERROR",
"FLAC__STREAM_ENCODER_IO_ERROR",
"FLAC__STREAM_ENCODER_FRAMING_ERROR",
"FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR"
};En el programa ppal hace el siguiente uso de la función:

FLAC__StreamEncoderInitStatus init_status; //declara la vble
...
.. carga algún valor para init_status, y...

if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
fprintf(stderr, "ERROR: initializing encoder: %s\n", FLAC__StreamEncoderInitStatusString[init_status]);
ok = false;
}

¿Me podría ayudar alguien a comprender mejor el uso de esta función?

Lepe
08-03-2008, 15:40:53
Aquí hay un truco importante, esa declaración, en realidad es esta:

typedef enum {

FLAC__STREAM_ENCODER_OK = 0,
FLAC__STREAM_ENCODER_UNINITIALIZED = 1,
FLAC__STREAM_ENCODER_OGG_ERROR = 2,
FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR = 3,
FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA = 4,
FLAC__STREAM_ENCODER_CLIENT_ERROR = 5,
FLAC__STREAM_ENCODER_IO_ERROR = 6,
FLAC__STREAM_ENCODER_FRAMING_ERROR = 7,
FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR = 8

} FLAC__StreamEncoderState;
Es un tipo enumerado, y cada elemento tomará el valor numérico que tiene al lado. Empezando en cero y aumentando en uno por cada elemento.

Esto es un array de string:
FLAC_API const char * const FLAC__StreamEncoderStateString[]

y contiene lo mismo que el tipo enumerado, pero en tiras de caracteres para mostrar en el printf.

Declara el init_status como enumerado, teniendo en cuenta que en realidad cada elemento se convierte en un entero, y dicho valor será el índice del array.

Saludos

Guillermo80
08-03-2008, 18:55:48
Gracias Lepe por tu ayuda, pero hay un detalle que no sé si viste, y es que la función está cargándose con el valor init_status, que es del tipo FLAC__StreamEncoderState:

FLAC__StreamEncoderInitStatusString[init_status]..cuando resulta que init_status no es un valor del enumerado FLAC__StreamEncoderInitStatus, sino de FLAC__StreamEncoderState, lo cual no entiendo.

Otra pregunta, ¿cómo podría poner la cabecera de esta función en Delphi?

const char * const FLAC__StreamEncoderStateString[]¿Lo que devuelve sería un char * o un array de strings o un string normal?

Guillermo80
08-03-2008, 19:28:27
Sorry, me equivoqué, es cierto, recibe el tipo enumerado adecuado. Con tanto nombre parecido ya me hice un lío, pero está bien puesto. Finalmente creo que para delphi voy a pasar de referenciar a la API y me declaro yo mismo tanto las cabeceras como los contenidos y referencias de los enumerados, que casi tardo menos :p

Saludos y gracias¡¡

escafandra
08-03-2008, 23:21:51
Una aclaración esto no es una función sino la declaración de un array
de punteros de tipo char* (que normalmente se una para definir cadenas, es decir, un array de cadenas)

const char * const FLAC__StreamEncoderStateString[]

Saludos.

Guillermo80
08-03-2008, 23:34:29
Es verdad Escafandra, es un array, me di cuenta después de dejar el post, pero gracias por la aclaración.

Finalmente he definido mi propio enumerado como se suele hacer en Delphi, no ha habido problema.

Gracias y un saludo¡