FabianAnarco Posted March 26, 2012 Report Share Posted March 26, 2012 Tengo el siguiente código en C #include <stdio.h> #include <stdlib.h> typedef struct _prueba { int x; int y; }prueba; int main(int argc, char** argv) { int n; int i; char test[atoi(argv[1])]; for(i=0; i<atoi(argv[1]);i++) test[i]='a'+i; printf("Pidiendo %i bytes, largo pedido %i\n",atoi(argv[1]),sizeof(test)); printf("Ingrese el largo: "); scanf("%i",&n); char test2[n]; for(i=0;i<n;i++) test2[i]='a'+i; printf("Largo de test2: %i\n",sizeof(test2)); char *test3=(char*)malloc(sizeof(char)*(n+1)); printf("Largo de test3: %i\n",sizeof(test3)); free(test3); prueba nprueba[n]; for(i=0;i<n;i++){ nprueba[i].x=i; nprueba[i].y=i+1; } printf("Largo de nprueba: %i\n",sizeof(nprueba)); return 0; } lo compilo asi: gcc -ansi asdf.c -o asdf y no se por que funciona, por lo que se no deberia funcionar. Link to comment Share on other sites More sharing options...
AshWilliams Posted March 26, 2012 Report Share Posted March 26, 2012 Y porque no debiese funcionar...expláyate más...se ve interesante, aunque a simple vista se ve bien. Saludos :krider: Link to comment Share on other sites More sharing options...
FabianAnarco Posted March 26, 2012 Author Report Share Posted March 26, 2012 Porque que yo sepa en ANSI C no se puede "pedir" memoria así: "char array[n]" Link to comment Share on other sites More sharing options...
Sting_Master Posted March 26, 2012 Report Share Posted March 26, 2012 #include <stdio.h> #include <stdlib.h> typedef struct _prueba { int x; int y; }prueba; int main(int argc, char** argv) { int n; int i; [b] char test[atoi(argv[1])];[/b] for(i=0; i<atoi(argv[1]);i++) [b] test[i]='a'+i;[/b] printf("Pidiendo %i bytes, largo pedido %i\n",atoi(argv[1]),sizeof(test)); printf("Ingrese el largo: "); scanf("%i",&n); [b] char test2[n];[/b] for(i=0;i<n;i++) [b] test2[i]='a'+i;[/b] printf("Largo de test2: %i\n",sizeof(test2)); char *test3=(char*)malloc(sizeof(char)*(n+1)); printf("Largo de test3: %i\n",sizeof(test3)); free(test3); [b] prueba nprueba[n[/b][b]][/b]; for(i=0;i<n;i++){ nprueba[i].x=i; nprueba[i].y=i+1; } printf("Largo de nprueba: %i\n",sizeof(nprueba)); return 0; } Hace tiempo que no programo en C asi que puede que este equivocado:A los vectores se les debe declarar el largo y no te permite insertarle una variable para declarar el lago, si no conoces el largo del vector debes trabajarlo con memoria dinamica como lo hiciste en test3Y no entiendo lo que haces en los for, estas ingresando en la casilla del vector la suma del valor ASCII del char a y el valor del int i, podrias decir cual es el fin del programa para entenderlo mejor.Por lo que recuerdo tampoco se puede pedir memoria para un vector de structs con una variable, lo que debes hacer es crear una lista enlazada simple por lo que deberas incluir un prueba *head.Prueba con esos cambios, en teoria deberia funcionar Link to comment Share on other sites More sharing options...
FabianAnarco Posted March 26, 2012 Author Report Share Posted March 26, 2012 (edited) #include <stdio.h> #include <stdlib.h> typedef struct _prueba { int x; int y; }prueba; int main(int argc, char** argv) { int n; int i; [b] char test[atoi(argv[1])];[/b] for(i=0; i<atoi(argv[1]);i++) [b] test[i]='a'+i;[/b] printf("Pidiendo %i bytes, largo pedido %in",atoi(argv[1]),sizeof(test)); printf("Ingrese el largo: "); scanf("%i",&n); [b] char test2[n];[/b] for(i=0;i<n;i++) [b] test2[i]='a'+i;[/b] printf("Largo de test2: %in",sizeof(test2)); char *test3=(char*)malloc(sizeof(char)*(n+1)); printf("Largo de test3: %in",sizeof(test3)); free(test3); [b] prueba nprueba[n[/b][b]][/b]; for(i=0;i<n;i++){ nprueba[i].x=i; nprueba[i].y=i+1; } printf("Largo de nprueba: %in",sizeof(nprueba)); return 0; } Hace tiempo que no programo en C asi que puede que este equivocado:A los vectores se les debe declarar el largo y no te permite insertarle una variable para declarar el lago, si no conoces el largo del vector debes trabajarlo con memoria dinamica como lo hiciste en test3Y no entiendo lo que haces en los for, estas ingresando en la casilla del vector la suma del valor ASCII del char a y el valor del int i, podrias decir cual es el fin del programa para entenderlo mejor.Por lo que recuerdo tampoco se puede pedir memoria para un vector de structs con una variable, lo que debes hacer es crear una lista enlazada simple por lo que deberas incluir un prueba *head.Prueba con esos cambios, en teoria deberia funcionar Se todo lo que me dices, lo que esta dentro de los ciclos era para ver si el programa se cae. y lo de las estructuras lo hice para probar si al igual que con vectores "normales" funcionaba con vectores de estructuras. Mi pregunta es ¿por que funciona? EDIT: como pueden ver el programa no tiene ninguna funcionalidad, solo es para preguntar por que funciona. Edited March 26, 2012 by FabianAnarco Link to comment Share on other sites More sharing options...
AshWilliams Posted March 26, 2012 Report Share Posted March 26, 2012 Porque que yo sepa en ANSI C no se puede "pedir" memoria así: "char array[n]"En esa instrucción solo estás creando un array de caracteres de largo n....el hecho de que no te lo enseñasen no significa que no se pueda hacer....es una instrucción totalmente válida. Saludos :krider: Link to comment Share on other sites More sharing options...
FabianAnarco Posted March 27, 2012 Author Report Share Posted March 27, 2012 Porque que yo sepa en ANSI C no se puede "pedir" memoria así: "char array[n]"En esa instrucción solo estás creando un array de caracteres de largo n....el hecho de que no te lo enseñasen no significa que no se pueda hacer....es una instrucción totalmente válida. Saludos :krider: Estimado, creo que estas equivocado, http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html ahi dice claramente que eso se acepta pero solo en C90 y cuando yo compilo le paso la opcion -ansi, tambien le pase la opcion -std=c89 y no hubo siquiera un warning, además por lo que recuerdo a mi me enseñaron que asi no se declaraban arrays de largo variable(me enseñaron ANSI C), si no que se hace por malloc o variantes. Quizas sea un error en el compilador que no pesca la opcion -ansi que le estoy pasando Link to comment Share on other sites More sharing options...
AshWilliams Posted March 27, 2012 Report Share Posted March 27, 2012 Porque que yo sepa en ANSI C no se puede "pedir" memoria así: "char array[n]"En esa instrucción solo estás creando un array de caracteres de largo n....el hecho de que no te lo enseñasen no significa que no se pueda hacer....es una instrucción totalmente válida. Saludos :krider: Estimado, creo que estas equivocado, http://gcc.gnu.org/o...ble-Length.html ahi dice claramente que eso se acepta pero solo en C90 y cuando yo compilo le paso la opcion -ansi, tambien le pase la opcion -std=c89 y no hubo siquiera un warning, además por lo que recuerdo a mi me enseñaron que asi no se declaraban arrays de largo variable(me enseñaron ANSI C), si no que se hace por malloc o variantes. Quizas sea un error en el compilador que no pesca la opcion -ansi que le estoy pasandoSi compila y funciona, pues, entonces el que está equivocado es otro...tal vez el compilador..o yo, o tú....tal vez puede ser un bug, del gcc, o tal vez se les bugeo el paso de argumentos....la cosa es que funciona y yo a veces también lo hice para experimentar, cuando pasamos Ansi C en la U, arreglos de largo variable....mientras la variable esté declarada y con un valor asignado, antes de la creación del array, pues, por lenguaje debiese funcionar(en ningún momento pasa a llevar al sintaxis ni nada en el código)...si todo está en regla, para C funciona....lo otro ya es compilador y estándares. Saludos :krider: Link to comment Share on other sites More sharing options...
Sting_Master Posted March 27, 2012 Report Share Posted March 27, 2012 Hay varios compiladores que te perdonan ciertas sintaxis, lo mejor es compilar los codigos en linux u ocupar el Turbo C que no te perdona niuna xd Link to comment Share on other sites More sharing options...
susodicho Posted March 27, 2012 Report Share Posted March 27, 2012 (edited) A ver, ANSI C no permite arreglos con largo desconocido en tiempo de compilación :no: (eso lo enseñan en el jardín infantil :tonto: ). Si alguien se acostumbró a que el IDE o compilador que usa no tire error, es simplemente porque el compilador no cumple con el estándar ó no está usando las opciones de compilación adecuadas ó lo está compilando como C++ ó el compilador se rige por el estándar pero le agrega algunas "extensiones" (o sea, cumple con el estándar, pero se da algunas licencias). En este caso es por lo último, es decir, al usar la opción -ansi en GCC, el compilador de todas formas agrega algunas extensiones al lenguaje (que no son compatibles con ANSI C), así que técnicamente no está cumpliendo con el estándar. La explicación está aquí. La parte importante es esta: The -ansi option does not cause non-ISO programs to be rejected gratuitously. For that, -pedantic is required in addition to -ansi. Si alguien no tiene claro por qué hablan indistintamente de ANSI e ISO, lea la sección 2.1 aquí. Así que para lograr que el compilador, por fin, mande el tan anhelado error o advertencia :tonto: habría que agregar la opción -pedantic. Por si acaso, en vez de -pedantic, se puede usar -pedantic-errors para que tire errores (y no sólo advertencias). Hasta donde recuerdo, el Turbo C++ no aceptaba programas C con largos de arreglo variables al compilar usando la opción ANSI C (también había otras opciones como K&R). Edited March 27, 2012 by susodicho Link to comment Share on other sites More sharing options...
Recommended Posts