|
41
|
Programación / Programación C/C++ / [Solucionado] ¿Cambia el valor de una variable dentro una funcion?
|
en: 1 Octubre 2012, 19:31 pm
|
No se si se entiende la pregunta, a ver que lo explico, por ejemplo, yo tengo una variable entera int a = 2; y una funcion cualquiera que modifica su valor, entonces antes de llamar a la funcion su valor inicial es 2, al llamar la funcion este valor cambia, la pregunta es, ¿despues de que se ejecute la funcion y se vuelva a main(), el valor de a seguira siendo 2 o habra adoptado el valor que se le da en la funcion?
No se si me he explicado correctamente.
Saludos.
|
|
|
42
|
Programación / Programación C/C++ / Duda con juego que genera numeros aleatorios
|
en: 30 Septiembre 2012, 11:36 am
|
En el libro que estoy leyendo sobre C, venia un ejemplo de un programa de como utilizar funciones, aqui el programa: la funcion main: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define SEMILLA 12345 void juego(void); int tirada(void); int main() { char respuesta = 'S'; printf("Bienvenido al juego CRAPS\n\n"); printf("Para lanzar los dados, pulsa Intro\n\n"); while (toupper(respuesta ) != 'N') { juego(); printf("\nDeseas jugar de nuevo? (S/N) "); scanf(" %c", &respuesta ); } printf("Adios, que lo pases bien"); }
la funcion juego: void juego(void) { int puntos1; int puntos2; char nada; printf("\nPor favor lanza los dados..."); puntos1 = tirada(); switch(puntos1) { case 7: case 11: printf(" - Felicidades! Ganaste a la primera tirada\n"); break; case 2: case 3: case 12: printf(" - Lo siento! Perdiste en la primera tirada\n"); break; case 4: case 5: case 6: case 8: case 9: case 10: do { printf(" - Lanza los dados de nuevo..."); puntos2 = tirada(); } while (puntos2 != puntos1 && puntos2 != 7); if (puntos2 == puntos1) printf(" - Ganas por igualar tu primera tirada\n"); else printf(" - Pierdes por no igualar tu primera tirada"); break; } return; }
la funcion tirada: int tirada(void) { float x1; float x2; int n1; int n2; n1 = 1 + (int) (6 * x1); n2 = 1 + (int) (6 * x2); return(n1 + n2); }
Entiendo todo perfectamente, pero donde me pierdo es en las funciones rand() y srand(), en la funcion tirada entiendo todas las operaciones que se hacen en ella para obtener los numeros, lo que no entiendo es para que se utiliza la funcion srand() y la constante SEMILLA, en el libro viene explicado pero no logro entenderlo, si alguien me lo puede explicar de alguna forma mas facil, gracias, Saludos
|
|
|
43
|
Programación / Programación C/C++ / Problema con funcion
|
en: 30 Septiembre 2012, 00:02 am
|
Pues en el libro que estoy leyendo he empezado con las funciones y para ir probando intente cambiar un codigo que tenia yo, usando una funcion, aqui el codigo original: #include <stdio.h> int main() { int i; char cadena [80]; for (i=0;cadena [i]!='\0';i++); printf ("\nEl texto tiene %d caracteres.\n",i ); printf ("\nPresione ENTER para salir:"); ; return 0; }
Y aqui el codigo usando una funcion: #include <stdio.h> int contador(int i, char letras){ i = 0; for (i=0;letras [i]!='\0';++i); return i; } int main() { int x; char cadena [80]; x = int contador(int i, char cadena); printf ("\nEl texto tiene %d caracteres.\n", x ); printf ("\nPresione ENTER para salir:"); ; return 0; }
Al compilarlo el segundo, me da los sigueintes errores: En la funcion 'contador': 12:19: el valor del subindice no es ni matriz ni puntero ni vector 22:9 error: expected expression before 'int' El primer fallo creo lo entiendo, se refiere al subindice de letras, letras , pero no entiendo el fallo, el segundo ya ni idea.
Saludos
|
|
|
44
|
Sistemas Operativos / GNU/Linux / Editor de codigo
|
en: 29 Septiembre 2012, 16:41 pm
|
Pues en breves ya voy a instalar Ubuntu en mi pc, junto con Windows, y queria saber que editor de codigo me recomendais para C, se que para compilar se puede hacer por consola asi que solo quiero un buen editor de texto. Yo en Windows utilizo el Sublime Text 2, estoy muy contento con el, y tambien lo hay para Linux, pero queria contar con vuestra opinion, sino instalare tambien el Sublime Text 2.
Saludos
|
|
|
45
|
Programación / Programación C/C++ / Duda con scanf
|
en: 29 Septiembre 2012, 11:23 am
|
En un ejemplo de un codigo en un libro que estoy leyendo, me he encontrado con esta linea:
La parte que no entiendo es la de "%[\n]", creo que sirve para guardar la linea de texto introducida en el array linea, pero sin incluir el salto de linea, aunque no estoy del todo seguro, queria saber exactamente para que sirve eso exactamente. Saludos
|
|
|
46
|
Programación / Programación C/C++ / [Solucionado] Forma para pausar un programa
|
en: 27 Septiembre 2012, 17:45 pm
|
Pues haciendo algunos programas tontos para coger practica me ha surgido una duda, mil veces en el foro han dicho que llamar al sistema para realizar una pausa es una mala practica:
Y yo como bueno aprendiz que soy hago caso, intento evitarla. acabo de hacer este programa desde cero yo solo, solo por aburrimiento: #include <stdio.h> int main() { int i; char cadena [80]; for (i=0;cadena [i]!='\0';i++); printf ("\nEl texto tiene %d caracteres.\n",i ); return 0; }
El programa funciona pefectamente, el problema es que al final no se para, y la unica forma que se me ocurre es poniendo dos veces la linea:
O limpiando el bufer de entrada asi:
Pero es que tambien he leido muchas veces que limpiar el bufer de esa manera tambien es una mala practica porque puede comportarse de forma erronea. Entonces queria saber la forma correcta y limpia para parar el programa, no solo ese, sino tambien otro cualquiera. Saludos
|
|
|
48
|
Sistemas Operativos / GNU/Linux / Archivo en el núcleo de Linux
|
en: 22 Septiembre 2012, 22:49 pm
|
Antes de todo, no tengo ni **** idea de programación. Estos dias voy a instalarme Ubuntu en mi PC y navegando por internert se me dio por buscar el nucleo de Linux 0.01, los descargue y lo estuve viendo, y encontré unos archivos llamados 'boot.s' y 'head.s' a parte de los archivos '.c' los heads y algunos mas, lo '.c' y los heads se que tipo de archivos son, abri los archivos 'boot.s' y 'head.s' para ver que tenian, pero no me entero de nada, supongo que seran los archivos que cargan el kernel o algo de eso, y viendo el codigo aun me entero menos porque no se que lenguaje es, supongo que será ensamblador, aqui os dejo el codigo de uno de los archivos: /* * head.s contains the 32-bit startup code. * * NOTE!!! Startup happens at absolute address 0x00000000, which is also where * the page directory will exist. The startup code will be overwritten by * the page directory. */ .text .globl _idt,_gdt,_pg_dir _pg_dir: startup_32: movl $0x10,%eax mov %ax,%ds mov %ax,%es mov %ax,%fs mov %ax,%gs lss _stack_start,%esp call setup_idt call setup_gdt movl $0x10,%eax # reload all the segment registers mov %ax,%ds # after changing gdt. CS was already mov %ax,%es # reloaded in 'setup_gdt' mov %ax,%fs mov %ax,%gs lss _stack_start,%esp xorl %eax,%eax 1: incl %eax # check that A20 really IS enabled movl %eax,0x000000 cmpl %eax,0x100000 je 1b movl %cr0,%eax # check math chip andl $0x80000011,%eax # Save PG,ET,PE testl $0x10,%eax jne 1f # ET is set - 387 is present orl $4,%eax # else set emulate bit 1: movl %eax,%cr0 jmp after_page_tables /* * setup_idt * * sets up a idt with 256 entries pointing to * ignore_int, interrupt gates. It then loads * idt. Everything that wants to install itself * in the idt-table may do so themselves. Interrupts * are enabled elsewhere, when we can be relatively * sure everything is ok. This routine will be over- * written by the page tables. */ setup_idt: lea ignore_int,%edx movl $0x00080000,%eax movw %dx,%ax /* selector = 0x0008 = cs */ movw $0x8E00,%dx /* interrupt gate - dpl=0, present */ lea _idt,%edi mov $256,%ecx rp_sidt: movl %eax,(%edi) movl %edx,4(%edi) addl $8,%edi dec %ecx jne rp_sidt lidt idt_descr ret /* * setup_gdt * * This routines sets up a new gdt and loads it. * Only two entries are currently built, the same * ones that were built in init.s. The routine * is VERY complicated at two whole lines, so this * rather long comment is certainly needed :-). * This routine will beoverwritten by the page tables. */ setup_gdt: lgdt gdt_descr ret .org 0x1000 pg0: .org 0x2000 pg1: .org 0x3000 pg2: # This is not used yet, but if you # want to expand past 8 Mb, you'll have # to use it. .org 0x4000 after_page_tables: pushl $0 # These are the parameters to main :-) pushl $0 pushl $0 pushl $L6 # return address for main, if it decides to. pushl $_main jmp setup_paging L6: jmp L6 # main should never return here, but # just in case, we know what happens. /* This is the default interrupt "handler" :-) */ .align 2 ignore_int: incb 0xb8000+160 # put something on the screen movb $2,0xb8000+161 # so that we know something iret # happened /* * Setup_paging * * This routine sets up paging by setting the page bit * in cr0. The page tables are set up, identity-mapping * the first 8MB. The pager assumes that no illegal * addresses are produced (ie >4Mb on a 4Mb machine). * * NOTE! Although all physical memory should be identity * mapped by this routine, only the kernel page functions * use the >1Mb addresses directly. All "normal" functions * use just the lower 1Mb, or the local data space, which * will be mapped to some other place - mm keeps track of * that. * * For those with more memory than 8 Mb - tough luck. I've * not got it, why should you :-) The source is here. Change * it. (Seriously - it shouldn't be too difficult. Mostly * change some constants etc. I left it at 8Mb, as my machine * even cannot be extended past that (ok, but it was cheap :-) * I've tried to show which constants to change by having * some kind of marker at them (search for "8Mb"), but I * won't guarantee that's all :-( ) */ .align 2 setup_paging: movl $1024*3,%ecx xorl %eax,%eax xorl %edi,%edi /* pg_dir is at 0x000 */ cld;rep;stosl movl $pg0+7,_pg_dir /* set present bit/user r/w */ movl $pg1+7,_pg_dir+4 /* --------- " " --------- */ movl $pg1+4092,%edi movl $0x7ff007,%eax /* 8Mb - 4096 + 7 (r/w user,p) */ std 1: stosl /* fill pages backwards - more efficient :-) */ subl $0x1000,%eax jge 1b xorl %eax,%eax /* pg_dir is at 0x0000 */ movl %eax,%cr3 /* cr3 - page directory start */ movl %cr0,%eax orl $0x80000000,%eax movl %eax,%cr0 /* set paging (PG) bit */ ret /* this also flushes prefetch-queue */ .align 2 .word 0 idt_descr: .word 256*8-1 # idt contains 256 entries .long _idt .align 2 .word 0 gdt_descr: .word 256*8-1 # so does gdt (not that that's any .long _gdt # magic number, but it works for me :^) .align 3 _idt: .fill 256,8,0 # idt is uninitialized _gdt: .quad 0x0000000000000000 /* NULL descriptor */ .quad 0x00c09a00000007ff /* 8Mb */ .quad 0x00c09200000007ff /* 8Mb */ .quad 0x0000000000000000 /* TEMPORARY - don't use */ .fill 252,8,0 /* space for LDT's and TSS's etc */
Alguien me podia aclarar que tipo de archivos son estos, cual es su funcion y que lenguaje es el que estan escritos, es solo curiosidad. Muchas gracias
|
|
|
50
|
Programación / Programación C/C++ / [SOLUCIONADO] Ayuda a configurar eclipse
|
en: 18 Mayo 2012, 16:32 pm
|
Hola a todos, hace un tiempo que estoy en la programacion de C, yo utilizaba DevC++ pero un usuario de este foro recomendo dejar de utilizarlo, y siguiendo sus recomendaciones me cambie a programar con Notepad y compilar en consola con MinGW, viendo que este lenguaje me gusta y me veo en el futuro aprendiendo a programar con liberias graficas,etc. Para compilar con distintas librerias se necesitan cambiar los parametros en la consola, entonces viendo que van a ser muchos los parametros segun las librerias utilizadas se va a hacer muy costosa la programacion, y me decidi por instalar eclipse, cuando lo instale hice mi primer codigo y al compilar y despues ejecutar me daba error, busque por google y vi que habia que hacer unas cuantas cosas con MinGW, configurar una variable de entorno o algo parecido, y los unicos tutos que encontre estaban mal explicados o yo no entendia nada, entonces queria pedir que me ayudaseis a configurar eclipse para poder programar en C/C++.
Gracias
|
|
|
|
|
|
|