Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 18
Guillermo80 Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 08-03-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 08-03-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 18
Guillermo80 Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 08-03-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 18
Guillermo80 Va por buen camino
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

Saludos y gracias¡¡
Responder Con Cita
  #5  
Antiguo 08-03-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #6  
Antiguo 08-03-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 18
Guillermo80 Va por buen camino
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¡
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
xp - interbase - raro Patricio Conexión con bases de datos 10 06-07-2007 18:44:25
muy raro Patricio Varios 12 09-04-2007 22:22:38
Algo raro..... mjjj Varios 2 04-04-2007 23:50:27


La franja horaria es GMT +2. Ahora son las 16:25:39.


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
Copyright 1996-2007 Club Delphi