Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Enumerado raro raro (https://www.clubdelphi.com/foros/showthread.php?t=54080)

Guillermo80 08-03-2008 14:34:39

Enumerado raro raro
 
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é?)


Cita:

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;
Cita:

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;
Cita:

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...

Cita:

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:
Código:

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

hay más
 
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:

Cita:

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?

Cita:

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)

Código:

const char * const FLAC__StreamEncoderStateString[]
Saludos.

Guillermo80 08-03-2008 23:34:29

cierto
 
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¡


La franja horaria es GMT +2. Ahora son las 07:47:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi