Discussion:
como controlar el numero de caracteres escritos en pantalla al scanear una variable
(demasiado antiguo para responder)
HADES
2004-01-06 03:12:42 UTC
Permalink
hola, estoy haciendo una especie de formulario, y quisiera que cuando
pide el valor de una variable, solo me permita escribir un número
determinado de caracteres, ya que mi formulario está compuesto por
cajitas, de las cuales no quiero que se salga el texto. no estoy
hablando del valor de la variable (eso ya lo tengo resuelto ) solo
quiero que cuando escriba por teclado solo me deje teclear un numero
determinado de caracteres.

si puede ser acompañar de un ejemplillo ;)

GRACIAS
Fernando Arbeiza
2004-01-06 09:01:01 UTC
Permalink
Post by HADES
hola, estoy haciendo una especie de formulario, y quisiera que cuando
pide el valor de una variable, solo me permita escribir un número
determinado de caracteres, ya que mi formulario está compuesto por
cajitas, de las cuales no quiero que se salga el texto. no estoy
hablando del valor de la variable (eso ya lo tengo resuelto ) solo
quiero que cuando escriba por teclado solo me deje teclear un numero
determinado de caracteres.
Eso no puede hacerse con C. Tiene que utilizarse alguna librería
exterior o servicios del sistema operativo.

Si tienes acceso a alguna librería curses en tu sistema, puedes utilizar
algo parecido a esto:

/**********************/
#include <ncurses.h>

#define LONGITUD 10

int main(void) {
char frase[LONGITUD + 1];
size_t i;

initscr();

printw("Escribe: ");
refresh();

for (i = 0; LONGITUD > i; i++) { frase[i] = getch(); }
frase[LONGITUD] = '\0';

noecho();
while (getch() != '\n') { ; }

printw("\n<<%s>>", frase);
refresh();
getch();

endwin();

return 0;
}
/**********************/

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
jakala
2004-01-07 00:02:34 UTC
Permalink
buenas noches:

no estoy del todo de acuerdo, fernando. Si bien es cierto que se necesita
usar
una libreria externa, existen funciones que te permiten crear ventanas (en
el caso
de <dos.h>) con la funcion window, y existe otra funcion que lee un numero
de
caracteres indicado, y no se sale de la ventana actual.

creo recordar que es cgets <-- los parametros no los recuerdo.

asi que doy otra "posible" solucion :P

si utilizas la libreria <dos.h> (creo recordar que es esa) mira las
funciones
window() y cgets(). Puede que te ayuden.

Jakala
Post by Fernando Arbeiza
Post by HADES
hola, estoy haciendo una especie de formulario, y quisiera que cuando
pide el valor de una variable, solo me permita escribir un número
determinado de caracteres, ya que mi formulario está compuesto por
cajitas, de las cuales no quiero que se salga el texto. no estoy
hablando del valor de la variable (eso ya lo tengo resuelto ) solo
quiero que cuando escriba por teclado solo me deje teclear un numero
determinado de caracteres.
Eso no puede hacerse con C. Tiene que utilizarse alguna librería
exterior o servicios del sistema operativo.
Si tienes acceso a alguna librería curses en tu sistema, puedes utilizar
/**********************/
#include <ncurses.h>
#define LONGITUD 10
int main(void) {
char frase[LONGITUD + 1];
size_t i;
initscr();
printw("Escribe: ");
refresh();
for (i = 0; LONGITUD > i; i++) { frase[i] = getch(); }
frase[LONGITUD] = '\0';
noecho();
while (getch() != '\n') { ; }
printw("\n<<%s>>", frase);
refresh();
getch();
endwin();
return 0;
}
/**********************/
Un saludo.
--
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2004-01-07 07:22:43 UTC
Permalink
Post by jakala
no estoy del todo de acuerdo, fernando. Si bien es cierto que se
necesita usar una libreria externa, existen funciones que te permiten
crear ventanas (en el caso de <dos.h>) con la funcion window, y existe
otra funcion que lee un numero de caracteres indicado, y no se sale de
la ventana actual.
Sí, pero son funciones que no pertenecen al C. En mi sistema no podría
utilizar esas funciones, así que deberías especificar el sistema en el
que pueden utilizarse (por el nombre, en el DOS).

P.S. Por cierto, Deberías contestar debajo del artículo al que
respondes y sólo dejar el trozo de artículo al que respondes. Contestar
encima (top-posting) es mucho más incómodo y no recortar el artículo es
un desperdicio de sitio.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Loco
2004-01-06 11:27:52 UTC
Permalink
Post by HADES
hola, estoy haciendo una especie de formulario, y quisiera que cuando
pide el valor de una variable, solo me permita escribir un número
determinado de caracteres, ya que mi formulario está compuesto por
cajitas, de las cuales no quiero que se salga el texto. no estoy
hablando del valor de la variable (eso ya lo tengo resuelto ) solo
quiero que cuando escriba por teclado solo me deje teclear un numero
determinado de caracteres.
si puede ser acompañar de un ejemplillo ;)
GRACIAS
implementa esta función...

char *PedirCadena(int fila, int columna, int digitos, char cadena[]){
char buf[128]="";
int i,j,seguir;
strcpy(buf,cadena);
gotoxy(columna,fila);
cputs (cadena);
do{
for (i=0,seguir=1;
i < digitos && seguir;
i++){
gotoxy(columna+i,fila);
tecla=PedirTeclaFuncion(fila,columna+i,COLOR_DEFECTO);
switch (tecla){
case DEL:{
if (i==(strlen(buf))&&i!=0){
buf[i-1]='\0';
gotoxy(columna+i-1,fila);
cputs(" ");
i-=2;
}
else{
i--;
}
break;
}
case ESCAPE:{
seguir = 0;
break;
}
case INTRO:{
seguir = 0;
i--;
break;
}
case CURIZQ:{
if (i==0){
i--;
}
else{
i-=2;
}
gotoxy(columna,fila);
cputs(buf);
break;
}
case CURDER:{
if (i==(strlen(buf))){
i--;
}
else{
gotoxy(columna,fila);
cputs(buf);
}
break;
}
case CURARR:{
seguir = 0;
i--;
break;
}
case CURABA:{
seguir = 0;
i--;
break;
}
default:{
// if (tecla<1000 && (isalpha(tecla)||(tecla==' '))){ // en caso que
s¢lo se quieran espacios y letras
if (tecla<1000 && isascii(tecla)){ // admite caracteres ascii de 0 a
127
buf[i]=tecla;
}
else{
i--;
gotoxy(columna,fila);
cputs(buf);
for (j=strlen(buf);j<digitos;j++){
gotoxy(columna+j,fila);
cputs(" ");
}
}
}
}
}
if (tecla==ESCAPE){
i=0;
}
else{
if (tecla != '\r'&& tecla<1000 ){ // esto se cumple cuando se completa
tecla=1000; // el campo, ya que se ha salido del
buf[digitos]='\0'; // bucle sin esc, return ni tecla de
funcion
seguir =0;
}
else{
buf[strlen(buf)]='\0';
seguir =0;
}
}
}while (seguir);
return buf;
}

y la llamada sería...

strcpy(variable,PedirCadena(fila,columna,nºdigitos,cadena_por_defecto));

Loco.
Fernando Arbeiza
2004-01-06 12:03:45 UTC
Permalink
Post by Loco
gotoxy(columna,fila);
^^^^^^
Post by Loco
cputs (cadena);
^^^^^

Esto no es C ;-) Indícanos, por lo menos, la librería o sistema al que
pertenece.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2004-01-07 12:59:37 UTC
Permalink
Post by Fernando Arbeiza
Esto no es C ;-) Indícanos, por lo menos, la librería o sistema al que
pertenece.
Yo me atrevería a afirmar que sí es C, ya que seguramente (99% seguro) se
trata de funciones escritas en dicho lenguaje. Lo que seguramente quieres
indicar es que no se trata de ANSI C.
Puesto que el estándar que define el lenguaje C es el de ANSI/ISO,
cuando se habla de C, uno se refiere a ese lenguaje. Es cuando se habla
de otros dialectos y extensiones (GNU C, VISUAL C...) cuando debería
especificarse.

Una vez dicho esto, estoy 99.998% seguro ;-) que tales funciones no
pueden escribirse en C; sino que hay que utilizar las extensiones,
servicios del sistema operativo o librerías externas que ya no
pertenecen al lenguaje (aunque se utilicen desde él).

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2004-01-07 13:35:43 UTC
Permalink
Post by Fernando Arbeiza
Post by Fernando Arbeiza
Esto no es C ;-) Indícanos, por lo menos, la librería o sistema al que
pertenece.
Yo me atrevería a afirmar que sí es C, ya que seguramente (99% seguro) se
trata de funciones escritas en dicho lenguaje. Lo que seguramente quieres
indicar es que no se trata de ANSI C.
Puesto que el estándar que define el lenguaje C es el de ANSI/ISO,
cuando se habla de C, uno se refiere a ese lenguaje. Es cuando se habla
de otros dialectos y extensiones (GNU C, VISUAL C...) cuando debería
especificarse.
Una vez dicho esto, estoy 99.998% seguro ;-) que tales funciones no
y está claro que ese 0.002% restante es pura modestia ;-)
Por si acaso, por si acaso :-)
Lógicamente, estoy de acuerdo. No obstante, también es cierto que la
expresión "esto no es C", sobre todo en un contexto más informal y
teniendo en cuenta a newbies, puede despistar. Casi mejor "esto no es
C standard (o estándar, al gusto)"
Quizá podamos llegar a un acuerdo con algo intermedio. Con su parte
categórica para que no haya confusión, seguida de una parte informativa
para que no haya confusión ;-)

"Eso no es C. C es un lenguaje definido en una norma internacional
(ISO); puesto que tal función no figura en esa norma, pertenece a
una extensión, dialecto o librería externa."
Por cierto, saludos, y tal
Y tal también de mi parte.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2004-01-07 19:00:49 UTC
Permalink
Hombre !! mi intención no era generar un debate que salga de tópico !!
No, hombre, que el debate es sano.
Post by Fernando Arbeiza
"Eso no es C. C es un lenguaje definido en una norma internacional
(ISO); puesto que tal función no figura en esa norma, pertenece a
una extensión, dialecto o librería externa."
Aún así, tengo la corazonada de que la "extensión, dialecto o librería
externa" que dices, fue programada en lenguaje ANSI/C y luego incluida como
librería del sistema operativo.
El problema es que las funciones de las que se está hablando en este
hilo (por su propia naturaleza) *no* han podido ser escritas en C.
Si yo programo una función "cascar_nueces()" en ANSI/C y luego la incluyo
como una librería del S.O., estará disponible para ser utilizada por otros
programas. La función "cascar_nueces()" evidentemente no es parte del
ANSI/C, pero _definitivamente es C_.
Les pido disculpas no haberme expresado mejor la vez anterior.
Eso no es así. Si coges una librería, un sistema operativo o un
compilador y me dices: aquí tienes la función cascar_nueces() que hace
esto y puedes utilizar de esta forma. Puesto que la función
cascar_nueces() no aparece en el estándar, sino que es una interfaz para
utilizar una librería o un servicio del sistema operativo (que puede
estar escrito en C o en lo que sea), esa función _no_ pertenece al C
(sino a la librería o sistema operativo).

Ahora, si coges y me dices, toma la función cascar_nueces:

void cascar_nueces(void) {
printf("Estoy cascando nueces");
}

Pues yo la miro y digo, esta función sí es C.

Con esto quiero decir que el punto de vista cambia. Desde el punto de
vista del desarrollador de la librería, si la está escribiendo en C
utilizando las funciones estándar, pues la librería está escrita en C, y
punto.

Desde el punto de vista del programador que va a utilizar la librería
(enlazándola), una vez la librería está compilada; esa función no es C,
sino que pertenece a una librería externa al lenguaje.

Espero que se me entienda, que a veces me lío sólo.
"La función cascar_nueces() no forma parte del ANSI/C, pertenece a una
extensión, dialecto o librería externa"
Eso es, si la cosa es que, cuando aparece una función que no pertenezca
al C, se avise de su no portabilidad. Por ejemplo:

Las funciones initscr(), noecho() y echo() no son C, sino que
pertenecen a la librería curses.

P.S. En todo momento, el C al que alude este mensaje es el definido en
la norma internacional de ISO (y anteriormente por el ANSI) ;-P

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
jakala
2004-01-07 19:16:27 UTC
Permalink
dos cosas:

primera, disculparme por lo del hilo, se me fue el raton y conteste donde no
debia.. :P
segunda: despues de leer todo el hilo sobre el debate "C no es !C", acabais
de demostrarme que
no tengo ni idea de lo que hablo... con el ejemplo de cascar_nueces() se
entiende bien la
diferencia.

asi que sorry otra vez!!!


P.D.: esta vez si que borro el mensaje que viene despues... :P

Jakala
Fernando Arbeiza
2004-01-07 20:35:46 UTC
Permalink
Post by jakala
primera, disculparme por lo del hilo, se me fue el raton y conteste
donde no debia.. :P segunda: despues de leer todo el hilo sobre el
debate "C no es !C", acabais de demostrarme que no tengo ni idea de lo
que hablo... con el ejemplo de cascar_nueces() se entiende bien la
diferencia.
Tampoco hay que autofustigarse tanto;-) , intentaste ayudar y eso
siempre es de agradecer. Sea como sea, lo bueno es que hayamos aprendido
todos.
Post by jakala
asi que sorry otra vez!!!
Que no es para tanto, que no has insultado a nadie.
Post by jakala
P.D.: esta vez si que borro el mensaje que viene despues... :P
Mucho mejor, así ya no hay que leer hasta abajo para ver si has escrito
más. Pero queda todavía más claro si dejas la parte del mensaje anterior
a la que contestas (más o menos, como he hecho yo, es una sana
costumbre, creo yo).
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
JL
2004-01-07 20:01:31 UTC
Permalink
más claro, agua

gracias Fernando :-p

Salu2

JL
Loco
2004-01-09 01:08:10 UTC
Permalink
A ver cómo lo hago para !meter_la_pata()...

Esa funcioncilla utiliza una serie de librerias precompiladas (conio.h para
entrada y salida de consola y stdio.h para algo de salida y entrada
estándar, creo).
La utilizo con el BorlandC++, pero uso extensiones .c en mis fuentes, aparte
de las susodichas librerias.

Como yo también estoy empezando, no quiero atribuirme el mérito de haberla
hecho, sino que me han ayudado a crearla (más bien la hizo otra persona y yo
la carroñeé... se dice así?).

Supongo que para sustituir cosas como "gotoxy()" y "cputs()" se podrían
escoger varias alternativas y para quedar bien diré que lo hice a propósito
para no ponerlo fácil (no se lo cree ni el yuyu)...

Pos eso, cartón con queso, y tal por supuesto...

Loco.

PD: para las correcciones dejo un sitio entre los asteriscos...

* *
(nótese que sólo dejo UN espacio en blanco y se define como "static"... ea!)
JL
2004-01-07 18:20:58 UTC
Permalink
Hombre !! mi intención no era generar un debate que salga de tópico !!
Post by Fernando Arbeiza
"Eso no es C. C es un lenguaje definido en una norma internacional
(ISO); puesto que tal función no figura en esa norma, pertenece a
una extensión, dialecto o librería externa."
Aún así, tengo la corazonada de que la "extensión, dialecto o librería
externa" que dices, fue programada en lenguaje ANSI/C y luego incluida como
librería del sistema operativo.
Si yo programo una función "cascar_nueces()" en ANSI/C y luego la incluyo
como una librería del S.O., estará disponible para ser utilizada por otros
programas. La función "cascar_nueces()" evidentemente no es parte del
ANSI/C, pero _definitivamente es C_.
Les pido disculpas no haberme expresado mejor la vez anterior.

La definición quedaría así:

"La función cascar_nueces() no forma parte del ANSI/C, pertenece a una
extensión, dialecto o librería externa"

Saludos ;)

JL
znôrt
2004-01-07 13:06:39 UTC
Permalink
Post by Fernando Arbeiza
Post by Fernando Arbeiza
Esto no es C ;-) Indícanos, por lo menos, la librería o sistema al que
pertenece.
Yo me atrevería a afirmar que sí es C, ya que seguramente (99% seguro) se
trata de funciones escritas en dicho lenguaje. Lo que seguramente quieres
indicar es que no se trata de ANSI C.
Puesto que el estándar que define el lenguaje C es el de ANSI/ISO,
cuando se habla de C, uno se refiere a ese lenguaje. Es cuando se habla
de otros dialectos y extensiones (GNU C, VISUAL C...) cuando debería
especificarse.
Una vez dicho esto, estoy 99.998% seguro ;-) que tales funciones no
y está claro que ese 0.002% restante es pura modestia ;-)

Lógicamente, estoy de acuerdo. No obstante, también es cierto que la
expresión "esto no es C", sobre todo en un contexto más informal y
teniendo en cuenta a newbies, puede despistar. Casi mejor "esto no es
C standard (o estándar, al gusto)"

Por cierto, saludos, y tal

znôrt
Martin J. Sanchez
2004-01-09 11:20:50 UTC
Permalink
Post by Fernando Arbeiza
Puesto que el estándar que define el lenguaje C es el de ANSI/ISO,
cuando se habla de C, uno se refiere a ese lenguaje. Es cuando se habla
de otros dialectos y extensiones (GNU C, VISUAL C...) cuando debería
especificarse.
Una vez dicho esto, estoy 99.998% seguro ;-) que tales funciones no
pueden escribirse en C; sino que hay que utilizar las extensiones,
servicios del sistema operativo o librerías externas que ya no
pertenecen al lenguaje (aunque se utilicen desde él).
Joe, ya estamos como siempre.
Fernando tu puedes estar muy convencido de lo que planteas, pero solo
aportas confusion con estas aseveraciones, ademas de no ser correctas.

Primero, dices que ANSI C es el unico C. (Lo de K&R no debia ser C).
El estandar recogido en "ISO/IEC 9899" o en "ISO/IEC 9899:1990" con
las correcciones dadas en "ISO/IEC 9899/COR1:1994", "ISO/IEC
9899/COR2:1995" y "ISO/IEC 9899/AMD1:1995" define un estandar del
lenguaje C, pero nunca puede pretender ser el unico C existente, de
hecho ya habia otros C antes de su publicacion. Y ademas segun tus
apreciaciones, que no es C?, el antiguo estandar o el nuevo?

Segundo, el unico que dice que el codigo que usa funciones que no son
de la libreria ANSI C, no es C, eres tu. El propio estandar especifica
lo que es un programa conforme o estrictamente conforme. En ambos
casos observa el "conforme". Y ademas dice:
"A conforming implementation may have extensions
(including additional library functions), provided
they do not alter the behavior of any strictly conforming
program."

Esto ya lo hemos discutido antes, y tu sigues r que r. No deja de
sorprenderme ;-)

Un saludo,
Martin.
Fernando Arbeiza
2004-01-09 15:43:53 UTC
Permalink
On Fri, 09 Jan 2004 12:20:50 +0100, Martin J Sanchez
Post by Fernando Arbeiza
Puesto que el estándar que define el lenguaje C es el de ANSI/ISO,
cuando se habla de C, uno se refiere a ese lenguaje. Es cuando se
habla de otros dialectos y extensiones (GNU C, VISUAL C...) cuando
debería especificarse.
Una vez dicho esto, estoy 99.998% seguro ;-) que tales funciones no
pueden escribirse en C; sino que hay que utilizar las extensiones,
servicios del sistema operativo o librerías externas que ya no
pertenecen al lenguaje (aunque se utilicen desde él).
Joe, ya estamos como siempre. Fernando tu puedes estar muy convencido
de lo que planteas, pero solo aportas confusion con estas
aseveraciones, ademas de no ser correctas.
Primero, dices que ANSI C es el unico C. (Lo de K&R no debia ser C).
Eih, quieto parao ;-) , no he dicho eso (a veces me expreso mal, si lo
ha parecido, lo siento). Mi frase ha sido:

"cuando se habla de C, uno se refiere a ese lenguaje [C definido en
la norma ISO]"

Lo de K&R era C, pero ahora debería especificarse como K&R C, ya que
cuando se normalizó, se abandonaron algunas de sus prácticas.
El estandar recogido en "ISO/IEC 9899" o en "ISO/IEC 9899:1990" con
las correcciones dadas en "ISO/IEC 9899/COR1:1994", "ISO/IEC
9899/COR2:1995" y "ISO/IEC 9899/AMD1:1995" define un estandar del
lenguaje C, pero nunca puede pretender ser el unico C existente, de
hecho ya habia otros C antes de su publicacion. Y ademas segun tus
apreciaciones, que no es C?, el antiguo estandar o el nuevo?
El C99 es una nueva edición del estándar, tras un periodo de revisión.
Ha habido cosas que han quedado obsoletas y otras que se han
normalizado. El C también tiene que evolucionar.

Cualquier término técnico que se utilice debe tener una definición
precisa. Si cada vez que se nombre el C uno se va a referir a todas las
librerías, dialectos, extensiones y lenguajes parecidos, íbamos
arreglados. Y por eso surgió la norma (que ya tiene 13 años), para que
no hubiese duda de a qué nos referíamos.

Una vez se negoció la norma, todo lo demás pasaron a ser dialectos o
extensiones.
Segundo, el unico que dice que el codigo que usa funciones que no son
de la libreria ANSI C, no es C, eres tu.
Juraría que no he dicho que el código no es C. Lo que sí he dicho es que
las funciones utilizadas no son C, lo que hace que el programa no sea
portable (y que se deba indicar en qué sistema se pueden utilizar). Es
decir, que se está utilizando el C para llamar a funciones que no son C
(sino servicios de un sistema operativo o funciones de una librería
externa).
Esto ya lo hemos discutido antes, y tu sigues r que r. No deja de
sorprenderme ;-)
Lo que pasa es que creo que en la enseñanza de C se empieza demasiado
pronto con el <conio.h> sin especificar qué pertenece al lenguaje y qué
son funciones no portables; con lo que la gente llega a pensar tales
funciones son de C de toda la vida. Sólo intento poner énfasis para que
no haya confusión.

Pero tienes razón que a ves me lío yo sólo (lo mío no es la palabra). Si
de verdad crees que sólo confundo, no haré más apreciaciones de este
tipo.

Un saludo :-)
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Mikel Irazabal
2004-01-09 16:02:59 UTC
Permalink
Post by Fernando Arbeiza
Pero tienes razón que a ves me lío yo sólo (lo mío no es la palabra). Si
de verdad crees que sólo confundo, no haré más apreciaciones de este
tipo.
Mi granito de arena:

En mi opinión, advertir de que eso no es estándar ni portable esta bién.
Otro cantar es decir que eso no es C y que es off-topic y eso...
De todos modos, cuando se mandan posts con código que usa librerías no
estándar, creo que se debería indicarlo (cosa que no todos hacen).

Saludos de un lurker,

Mikel
Martin J. Sanchez
2004-01-09 17:39:26 UTC
Permalink
Fernando Arbeiza escribió en mensaje ...
Post by Fernando Arbeiza
On Fri, 09 Jan 2004 12:20:50 +0100, Martin J Sanchez
....
Cualquier término técnico que se utilice debe tener una definición
precisa. Si cada vez que se nombre el C uno se va a referir a todas las
librerías, dialectos, extensiones y lenguajes parecidos, íbamos
arreglados. Y por eso surgió la norma (que ya tiene 13 años), para que
no hubiese duda de a qué nos referíamos.
Es que para eso se usa el termino "Estandar ISO/IEC del lenguaje C" (o
tradicionalmente ANSI-C).

Pero lo que yo pretendo es dejar claro que el uso de una libreria que
no es ANSI-C, no significa que el codigo no es "conforme" con ANSI-C.
El estandar define como "conforme" cualquier codigo que (usando
librerias externas o no, e incluso ciertas extensiones) no va en
contra sintactica o semanticamente con la definicion del lenguaje tal
y como lo plantea la especificacion.
Post by Fernando Arbeiza
Una vez se negoció la norma, todo lo demás pasaron a ser dialectos o
extensiones.
Eso si que no se de donde lo sacas. El estandar simplemente define un
estandar al que pone apellidos (estandar ISO/IEC), no se apropia para
nada del termino "C", aunque evidentemente pretenda homogeneizar el
uso de un lenguaje tan popular a partir de una especificacion formal.

De todas formas cuando yo hablo de C (como todos creo), habitualmente
nos referimos a un programa que es conforme con la especificacion
ANSI-C.
Post by Fernando Arbeiza
....
Post by Martin J. Sanchez
Segundo, el unico que dice que el codigo que usa funciones que no son
de la libreria ANSI C, no es C, eres tu.
Juraría que no he dicho que el código no es C. Lo que sí he dicho es que
las funciones utilizadas no son C, lo que hace que el programa no sea
portable (y que se deba indicar en qué sistema se pueden utilizar).
Pues bien, aqui es donde creo que te expresas mal. Lo logico seria
decir que esas funciones no son de la libreria estandar ANSI C, o que
el programa no es "estrictamente conforme con ANSI-C" (termino
definido en el estandar). Pero fijate que el programa podria ser
simplemente "conforme" (tambien definido en el estandar). Incluso las
funciones no definidas por el estandar, pueden formar parte de una
implementacion conforme con el mismo:
"A conforming implementation may have extensions
(including additional library functions), provided
they do not alter the behavior of any strictly conforming
program."
Lo que viene a decir que un compilador y/o libreria es conforme
mientras su comportamiento no vaya en contra de lo definido por el
estandar.
Post by Fernando Arbeiza
...
Lo que pasa es que creo que en la enseñanza de C se empieza demasiado
pronto con el <conio.h> sin especificar qué pertenece al lenguaje y qué
son funciones no portables; con lo que la gente llega a pensar tales
funciones son de C de toda la vida. Sólo intento poner énfasis para que
no haya confusión.
En eso te doy toda la razon. Y por eso me parece muy apropiado que lo
hagas notar.
Post by Fernando Arbeiza
Si de verdad crees que sólo confundo, no haré más apreciaciones de
este tipo.
No me interpretes mal. Eres uno de los pocos que haceis una labor muy
notable en este grupo. En ningun caso pretendo que te sientas
coaccionado en tus respuestas o apreciaciones, que por cierto habran
ayudado a entender C a muchas personas. Simplemente me parece mas
correcto y claro usar el termino "no esta definido en ANSI-C" o algo
parecido, a un simple "eso no es C".

Un saludo ;-) (y aunque tarde: feliz año!)
Martin.
Fernando Arbeiza
2004-01-09 19:08:10 UTC
Permalink
On Fri, 09 Jan 2004 18:39:26 +0100, Martin J Sanchez
Post by Martin J. Sanchez
Post by Fernando Arbeiza
Una vez se negoció la norma, todo lo demás pasaron a ser dialectos o
extensiones.
Eso si que no se de donde lo sacas. El estandar simplemente define un
estandar al que pone apellidos (estandar ISO/IEC), no se apropia para
nada del termino "C", aunque evidentemente pretenda homogeneizar el
uso de un lenguaje tan popular a partir de una especificacion formal.
Una norma llega (debería llegar) a serlo tras pasar un período de
discusión entre todas las partes implicadas. Y en esta norma se trata de
definir, de una vez, el lenguaje de programación C, para que se sepa lo
que significa ese término. Si todas las partes llegaron a este consenso:

[#1] This International Standard specifies the form and
establishes the interpretation of programs written in the C
programming language.

El ejemplo típico que se me ocurre es la alta tensión. Tú podías llamar
alta tensión al voltaje que te diese la gana. Una vez llegó la norma de
alta tensión, la alta tensión se definió a partir de X voltios.

Yo creo que decidieron llamar a lo definido ahí C. Y lo que vaya
aparte, habrá que especificarlo (sintaxis K&R, extensiones GNU,
extensiones VISUAL C...).
Post by Martin J. Sanchez
De todas formas cuando yo hablo de C (como todos creo), habitualmente
nos referimos a un programa que es conforme con la especificacion
ANSI-C.
Cuando yo hablo de C, me refiero a un lenguaje de programación, que se
decidió se definiría en la norma anterior (lo sé, soy muuuuy polilla,
pero ya soy muy mayor para cambiar ;-)
Post by Martin J. Sanchez
Post by Fernando Arbeiza
....
Post by Martin J. Sanchez
Segundo, el unico que dice que el codigo que usa funciones que no son
de la libreria ANSI C, no es C, eres tu.
Juraría que no he dicho que el código no es C. Lo que sí he dicho es que
las funciones utilizadas no son C, lo que hace que el programa no sea
portable (y que se deba indicar en qué sistema se pueden utilizar).
Pues bien, aqui es donde creo que te expresas mal. Lo logico seria
decir que esas funciones no son de la libreria estandar ANSI C, o que
el programa no es "estrictamente conforme con ANSI-C" (termino
definido en el estandar).
[ ... ]
Lo que viene a decir que un compilador y/o libreria es conforme
mientras su comportamiento no vaya en contra de lo definido por el
estandar.
Estoy completamente de acuerdo con que el código ese será conforme (no
estrictamente conforme). Pero las funciones no pertenecen (no son) C.

Ejemplo:

/* ... */
#include <stdio.h>
#include <unistd.h>
#include <curses.h>

void funcion(void) { return; }

int main(void) {

initscr();
endwin();

sleep(3);

printf("hola");

funcion();
return 0;
}
/* ... */

Este es un programa conforme. El código (programa) es C. Y la función
funcion() aparece definida, es C.

La función printf() es (pertenece a) C porque la norma define la función
y su resultado.

La función sleep() no es (no pertenece a) C. No está definida en la
norma. Es una llamada al sistema operativo (utilizando C para realizar
la llamada); el resultado de la llamada lo definirá el sistema
operativo.

Las funciones initscr(), endwin() no son (no pertenecen a) C. No están
definidas en la norma. Son funciones de una librería externa cuya
documentación definirá su resultado.

Ya sé que que es una pequeña distinción semántica (no son C <-> no
pertecen a la librería de C), y como tal puede que no merezca más
discusión. Yo sólo digo que la función que no aparezca definida en la
norma ni en el programa, no es C por eso mismo. Si es una llamada al
sistema operativo está muy claro (la función sólo es una interfaz hacia
una llamada al sistema -que podría hacerse en cualquier lenguaje-). Si
es una librería externa, puede estar menos claro, pero tampoco es C,
puesto que el resultado de la llamada a tal función no aparece
especificada en la norma (a no ser que incluyas el código fuente en el
tuyo, con lo que sí estaría especificada (a no ser que incluyas el
código fuente en el tuyo, con lo que sí estaría especificada).

Pero, cómo digo más abajo, intentaré cambiar mis palabras, para no tener
discusiones de este tipo.
Post by Martin J. Sanchez
Post by Fernando Arbeiza
Si de verdad crees que sólo confundo, no haré más apreciaciones de
este tipo.
No me interpretes mal. Eres uno de los pocos que haceis una labor muy
notable en este grupo. En ningun caso pretendo que te sientas
coaccionado en tus respuestas o apreciaciones, que por cierto habran
ayudado a entender C a muchas personas. Simplemente me parece mas
correcto y claro usar el termino "no esta definido en ANSI-C" o algo
parecido, a un simple "eso no es C".
Tienes razón. Utilicé la frase "Eso no es C" y no era lo correcto. Tenía
que haber puesto "Esas funciones no son C".

Pero me gusta el término medio. Pongamos "Tales funciones no están
definidas en la norma de C" (ni pa ti, ni pa mí :-).
Post by Martin J. Sanchez
Un saludo ;-) (y aunque tarde: feliz año!)
Igualmente, y próspero :-)
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2004-01-09 19:56:49 UTC
Permalink
On Fri, 09 Jan 2004 18:39:26 +0100, Martin J Sanchez
En ningun caso pretendo que te sientas coaccionado en tus respuestas o
apreciaciones,
Una cosa, para nada me iba a sentir coaccionado porque tengamos este
pequeño debate. Lo que quería decir es que si hago algún comentario
(quizá demasiado extremo) para intentar que se distinga mejor la
frontera de lo que es C de lo que no y lo único que hago es liar más la
cosa, pues dejo que lo haga otro con mejor verbo y santas pascuas :-)

Aunque creo que valdrá con más moderación en mis aseveraciones.

Más saludos.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
JL
2004-01-07 11:23:55 UTC
Permalink
Post by Fernando Arbeiza
Esto no es C ;-) Indícanos, por lo menos, la librería o sistema al que
pertenece.
Yo me atrevería a afirmar que sí es C, ya que seguramente (99% seguro) se
trata de funciones escritas en dicho lenguaje. Lo que seguramente quieres
indicar es que no se trata de ANSI C. Ahora, mucha gente esto ya lo sabe,
pero en honor a los principiantes que tenemos en el grupo creo que vale
hacer la aclaración (para evitarles confusiones) ;-)

Saludos :-)

JL
Loading...