Historias
Slashboxes
Comentarios
 
Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
Mostrar opciones Umbral:
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
  • -ansi -pedantic

    (Puntos:1)
    por CarlosGarcia (15288) el Lunes, 13 Diciembre de 2004, 21:33h (#404572)
    ( http://carlos.garciaargos.com/ | Última bitácora: Domingo, 02 Junio de 2013, 06:20h )
    carlos@wongfeihung:~$ gcc -ansi -pedantic test.c
    test.c: En la función `main':
    test.c:11: aviso: ISO C90 prohíbe la matriz `a' de tamaño variable
    test.c:11: aviso: ISO C89 prohíbe las declaraciones mezcladas y código

    Por cierto, para que se vean en tu entrada en bitácora los archivos include, tienes que escribir &gt; para mostrar > y &lt; para mostrar <
    --

    --
    Carlos García [garciaargos.com]
  • o_O

    (Puntos:1)
    No sé si algún compilador permitirá eso, pero desde luego GCC no, porque no es estándar. En C la memoria dinámica no es tan sencilla de gestionar. Lo correcto sería algo así:

    nt main()
    {
    int n;
    int *a;
     
                printf("Nro. de elementos: ");
                scanf("%d", &n);
                a = malloc (sizeof(int)*n);
                memset(a, 0, sizeof(int)*n);
                // También podrías hacer esto
                // a = calloc (n, sizeof(int));
                return 0;
    }
    --

    Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn!

    • Re:o_O de pezezin (Puntos:1) Lunes, 13 Diciembre de 2004, 23:26h
      • Re:o_O de muzaraque (Puntos:2) Martes, 14 Diciembre de 2004, 17:01h
    • Re:o_O de Gringo Desconocido (Puntos:1) Martes, 14 Diciembre de 2004, 06:08h
      • Re:o_O de pezezin (Puntos:1) Martes, 14 Diciembre de 2004, 10:12h
  • Lo que me sale a mí

    (Puntos:3, Informativo)
    por DanielSan (10124) el Lunes, 13 Diciembre de 2004, 23:40h (#404681)
    ( http://guslibu.awardspace.com/ | Última bitácora: Viernes, 18 Marzo de 2011, 08:29h )
    $ gcc --version
    gcc (GCC) 3.3.2 (Mandrakelinux 10.0 3.3.2-7mdk)
    ...
    $ gcc -pedantic tt.c
    tt.c: In function `main':
    tt.c:10: warning: ISO C90 forbids variable-size array `a'
    tt.c:10: warning: ISO C89 forbids mixed declarations and code


    Eso deja claro que, aunque el compilador lo permite, este código entra en conflicto con todos los estándares de C, pero no veo por qué no deba utilizarse, según en qué casos...

    Esto hace uso de dos características posiblemente conflictivas:

    Primero, se avisa de insertar una declaración en medio del código, porque en el ANSI C las declaraciones sólo se pueden hacer al principio de un bloque. Esto en el nuevo estándar C sí que está soportado (así como en C++) y en ocasiones ayuda a clarificar el código (al declarar las variables más cerca del lugar donde se utilizan), pero complica un poco la portabilidad del programa a versiones antiguas (MUY antiguas) del compilador o a otros compiladores posiblemente igual de antiguos.

    Segundo, como se puede ver, el GCC (y otros compiladores también), permiten ahí la declaración de arrays normales pero de una forma dinámica (emitiendo un aviso si se lo pides con -pedantic), y parece que él se encarga de la liberación de la memoria cuando el programa deja la ejecución del bloque donde se definió la variable (por tanto la dirección de este vector no podría ser utilizada del mismo modo que las direcciones devueltas por malloc). Esto es ante todo, MUY cómodo, ya que permite declarar un array con tipo de forma dinámica sin necesidad de considerar la posibilidad de usar punteros ni de liberar la memoria, e imagino que generaciones futuras (que son las que no ponen pegas a las innovaciones) apreciarán tener una característica de tan alto nivel en el compilador de un lenguaje de nivel medio como C.

    Sin embargo, no está en el último estándar de C y por tanto un compilador estándar no está obligado a implementarlo, por esto rompe totalmente la portabilidad a versiones antiguas (aunque versiones antiguas de GCC ya permitían hace mucho la declaración cuando el tamaño se pasaba a una función que definía el array como variable local), y dificultaría también portar el programa a otros compiladores.

    Cuáles de esas dos prácticas deban utilizarse y en qué casos ya queda a decisión del programador (aunque yo considero que es una buena práctica resaltar con comentarios en el código aquellas partes que usen ese tipo de "facilidades", por si acaso). Mi opinión es que debe intentarse programar de acuerdo con el estándar más antiguo, pero si esto entra en conflicto con el tiempo disponible y la claridad del código, puede optarse por incluir este tipo de opciones, siempre en función de las exigencias del compilador y el "cliente" que pide el programa, y siempre señalando qué construciones salen del estándar básico.
  • ¿C standard?

    (Puntos:2)
    por Draco (3721) el Martes, 14 Diciembre de 2004, 07:24h (#404757)
    ( Última bitácora: Lunes, 22 Febrero de 2016, 07:16h )

    "Lo bueno de los estándares es que hay muchos para elegir". Ése código es perfectamente válido en C99:

    $gcc -std=c99 test.c
    $

    --

    Programs should be written for people to read, and only incidentally for machines to execute

  • int a[n];

    (Puntos:1)
    por ilwy (15707) el Martes, 14 Diciembre de 2004, 07:47h (#404763)
    ( http://nodiario.wordpress.com/ | Última bitácora: Jueves, 04 Mayo de 2006, 07:11h )
    n si es auntomatica (puesto que no la declaras como static ni como nada (asi que solo esta donde la declaras) pero no es con las variables automaticas con las que se puede hacer ese tipo de declaración, sino con las const.
    Tendrías que hacer esto para hacer una declaración asi:

    main(){
    const int n=8;
    int i[n];
    }

    La verdad es que no le veo mucha utilidad a esto, pero bueno. Supongo que esto no te resuelve la duda, pero ya he visto que te antes te han dicho como hacer la reserva dinamica de memoria, asi que...

    Saludos
    --

    Mi blog [wordpress.com]

    • Re: int a[n]; de muzaraque (Puntos:2) Martes, 14 Diciembre de 2004, 21:08h
  • 1 respuesta por debajo de tu umbral de lectura actual.