PDA

Ver la versión completa : Programación C: Dudas generales



Kurraudo
10/06/2009, 15:02
Buenas, aquí un servidor que está dando sus primeros pasos para programar en C. Por ahora estoy con lo básico, aprendiendo la sintaxis y haciendo equivalencias con lo ya aprendido (Java). Tengo pensado machacarme C porque puede caer en el final de IP2 (Introducción a la Programación 2, aunque tal vez me libre de hacerlo si saco buena nota en el último parcial) y porque seguramente se nos exigirá en el año que viene. Me surgen entonces las siguientes dudas:

1- Bibiografía recomendada, sean libros físicos o tutoriales por internet.

2-C orientado a videojuegos ¿Recomendable? ¿Fácil? ¿Es preferible el uso de C++?

3-Teniendo Eclipse para C/C++ (Eclipse IDE for C/C++ developers (http://www.eclipse.org/downloads/?tab=packages)) ¿Alguna forma de configurar este programa para usar SDL y programar así para GP2X/Wiz? He visto este hilo (http://www.gp32spain.com/foros/showthread.php?t=23811), pero explica cómo hacerlo desde cero con el Eclipse a secas y no se si funcionará con el Eclipse específico de C/C++ (Supongo que habrá que saltarse el paso del CDT, pero no quiero equivocarme y cagarla)

4- Sabiendo ya Java: tiempo medio para dominar C con algo de soltura. Facilidad para pasar a C++ sabiendo Java y C

5- Anarchy: Pon ya un subforo genérico sobre programación [wei5]

Por el momento eso es todo, conforme vaya resolviendo dudas haré más preguntas para saciar mi curiosidad ;)

efegea
10/06/2009, 15:17
2-C orientado a videojuegos ¿Recomendable? ¿Fácil? ¿Es preferible el uso de C++?
5- Anarchy: Pon ya un subforo genérico sobre programación [wei5]


2-Mucho más preferible C++, ten en cuenta que en un juego estás tratando con objetos. En el mundo profesional se usa C++ casi siempre.

5- mas uno. Cuántas veces habré abierto un hilo sobre programación y no he sabido dónde postearlo..

^MiSaTo^
10/06/2009, 15:29
1- Curso de C/C++ de Ceballos. Thinking in C++ de Eckel. Ambos están en amazon no muy caros y en pdf no son dificiles de encontrar.

2- C++ es lo que se usa ;)

3- Nunca he probado, pero te lo puedo mirar.

4- Te va a costar los punteros, porque en java no hay y si nunca lo has visto... También te va a costar asumir que si pones un objeto a NULL no se lo lleva el garbage collector XD

5- MASUNO!

pakoito
10/06/2009, 15:45
A mi el de Ceballos que no me gustó...me parecía muy poco claro :confused:

Hay un par en wikilibros y lawebdelprogramador bastante decentes.

ChUKii
10/06/2009, 15:53
1 - C++ Con clase (http://c.conclase.net/), lo empece y me estaba gustando pero me he liado con otro proyecto javero y ando justo de tiempo jeje.

:brindis::brindis:

^MiSaTo^
10/06/2009, 15:53
A mi el de Ceballos que no me gustó...me parecía muy poco claro :confused:

Hay un par en wikilibros y lawebdelprogramador bastante decentes.

Juer pues a mi me parece de lo mejorcito ;)
Es más, ese me le compré en "papel" por tenerlo de referencia.
Sino hay otro que también me gustó mucho que es de Paco Aylagas creo.

jcom
10/06/2009, 15:56
Mi aportación al tema:


1 - Los libros de Herbert Schildt son buenos y son un clásico
2 - Aunque ahora se usa C++, C tiene nichos como la NDS (y la GP2X ;)). Además, no recuerdo cuándo se cambió John Carmack a C++, pero el Quake III está hecho en C.
3 - No puedo ayudarte en esto.
4 - No debería serte muy complicado, de hecho C es un subconjunto de Java. A lo bruto puedes pensar en C como un Java sin clases. C++ es tan amplio que dominarlo es muy complicado, pero saber C y sobre todo Java es algo que te ayuda a empezar.

^MiSaTo^
10/06/2009, 16:05
Mi aportación al tema:


1 - Los libros de Herbert Schildt son buenos y son un clásico
2 - Aunque ahora se usa C++, C tiene nichos como la NDS (y la GP2X ;)). Además, no recuerdo cuándo se cambió John Carmack a C++, pero el Quake III está hecho en C.
3 - No puedo ayudarte en esto.
4 - No debería serte muy complicado, de hecho C es un subconjunto de Java. A lo bruto puedes pensar en C como un Java sin clases. C++ es tan amplio que dominarlo es muy complicado, pero saber C y sobre todo Java es algo que te ayuda a empezar.

Errr... yo estoy programando ahora mismo en C++ para la NDS. [wei]
El resto de consolas tb se programan en C++ (al menos con los kits oficiales). De hecho a mi me pidieron conocimientos de POO y concretamente de C++.:brindis:

Jonazan2
10/06/2009, 16:31
Yo el libro de ceballos lo tengo y me encanta, ahora que ya he acabado todo me voy a poner en serio con el, es muy claro ;)

Kurraudo
10/06/2009, 16:41
4- Te va a costar los punteros, porque en java no hay y si nunca lo has visto... También te va a costar asumir que si pones un objeto a NULL no se lo lleva el garbage collector XD
El concepto de puntero lo tengo asimilado por eso del Stack Pointer de Fundamentos / Estructuras de Computadores (Señala la posición de un objeto en memoria), pero ¿Qué uso se le da en C? ¿Un acceso directo a un objeto?

^MiSaTo^
10/06/2009, 16:43
El concepto de puntero lo tengo asimilado por eso del Stack Pointer de Fundamentos / Estructuras de Computadores (Señala la posición de un objeto en memoria), pero ¿Qué uso se le da en C? ¿Un acceso directo a un objeto?
Depende de qué tipo sea el puntero. Si es un puntero a un int, es la dirección de memoria donde está ese int. (Apunta al int).
Si es a un objeto, pues la dir de ese objeto, etc.

Kurraudo
10/06/2009, 16:52
Depende de qué tipo sea el puntero. Si es un puntero a un int, es la dirección de memoria donde está ese int. (Apunta al int).
Si es a un objeto, pues la dir de ese objeto, etc.
Sí, justo eso. Por ejemplo se declara int i, j, *p;
En i está un número int, p es un puntero que apunta a i (p=&i) y contiene su dirección, y j accede a lo apuntado en p (j=*p), el número int.
Lo que me pregunto es ¿Qué utilidad práctica tienen? ¿Tener un acceso directo a i en p?

pakoito
10/06/2009, 16:56
http://i91.photobucket.com/albums/k315/chadw1013/Promotions/HeadBlowUpCSPAdd.jpg

Punteros

Danielo515
10/06/2009, 17:24
Yo la única dificultad que veo de pasar de java a c es, que seguramente estarás muy mal acostumbrado.

Que si java tiene strings, que si java tiene métodos de ordenamiento, que si java aumenta el solito el tamaño de la tabla,del string, que si hace comparaciones fáciles....

cosa que en c, nada de nada, es el lenguaje más inutil que hay (con perdon de ensamblador, claro), le tienes que explicar como hacer todo. Pero bueno, para eso están las libs no?
Mucha suerte.


El tema de los punteros, no se porqué lo ve la gente tan complicado, si solo son un tío con un dedo tieso XD

^MiSaTo^
10/06/2009, 17:27
Yo la única dificultad que veo de pasar de java a c es, que seguramente estarás muy mal acostumbrado.

Que si java tiene strings, que si java tiene métodos de ordenamiento, que si java aumenta el solito el tamaño de la tabla,del string, que si hace comparaciones fáciles....

cosa que en c, nada de nada, es el lenguaje más inutil que hay (con perdon de ensamblador, claro), le tienes que explicar como hacer todo. Pero bueno, para eso están las libs no?
Mucha suerte.


El tema de los punteros, no se porqué lo ve la gente tan complicado, si solo son un tío con un dedo tieso XD

Sobre lo de que es inutil, mira en qué año apareció C y en cuál apareció Java XDDDD
Y lo de los punteros suele ser porque no se le ve la utilidad a la primera :brindis:

Ñuño Martínez
10/06/2009, 17:39
Ahí van mis consejos, Kurraudo:


1- Bibiografía recomendada, sean libros físicos o tutoriales por internet. Buscate "Manual de C" de Herbert Schildt. Me ayudó a corregir muchas malas costumbres por haber aprendido C malamente.


2-C orientado a videojuegos ¿Recomendable? ¿Fácil? ¿Es preferible el uso de C++? C++ es lo que se usa, pero en mi opinión es mejor Object Pascal (menos críptico, menos propenso a errores de compilación, menos propenso a errores de ejecución, mejor modelo de objetos más parecido al de Java, más estructurado, etc). Es más, no recomendaría C++ para ningún trabajo, y menos desde que conozco Objective C (modelo de objetos casi idéntico al de Small-Talk, multitarea implícita, compila programas C sin cambios, etc.).


3-Teniendo Eclipse para C/C++ (...) No utilices Eclipse, y menos para programar C. Te recomiendo casi cualquier cosa (Visual tampoco lo recomiendo).


4- Sabiendo ya Java: tiempo medio para dominar C con algo de soltura. Facilidad para pasar a C++ sabiendo Java y C Ni idea. Yo tardé en dominar C menos de un mes sabiendo QuickBASIC, algo de COBOL y ensamblador Z-80. Eso sí, no me convertí en un verdadero experto hasta cinco o seis años después, tras la lectura del libro de Shildt.


El concepto de puntero lo tengo asimilado por eso del Stack Pointer de Fundamentos / Estructuras de Computadores (Señala la posición de un objeto en memoria), pero ¿Qué uso se le da en C? ¿Un acceso directo a un objeto?

Un puntero es una variable que contiene una dirección de memoria. Así de simple. El uso más común que se le da en C es el manejo de memoria dinámica. También suele utilizarse para optimizar a mano algoritmos que usen la memoria de forma intensiva.

Si realmente quieres saber cómo funcionan los punteros tienes que saber como funciona la memoria de un ordenador a la perfección y a nivel de microprocesador. De lo contrario te harás un lío enorme.

Y repito: en mi opinión. Lo que digan las modas, los ingenieros y los empresarios es otra cosa.

Ya está.

Malenko
10/06/2009, 17:42
C++ es lo que se usa, pero en mi opinión es mejor Object Pascal
Por fin!!!! Estabamos todos esperando a ver cuanto tardabas en soltarlo xD

^MiSaTo^
10/06/2009, 17:45
Por fin!!!! Estabamos todos esperando a ver cuanto tardabas en soltarlo xD

Dios venía a poner exactamente lo que has puesto tú.


Es más, no recomendaría C++ para ningún trabajo
Nada eso díselo a los que hacen cosas de visión artificial, IA, etc
También se lo iré comentando a mis jefes xD

Ñuño Martínez
10/06/2009, 17:46
Por fin!!!! Estabamos todos esperando a ver cuanto tardabas en soltarlo xD

Lo sé, pero es que cuanto más experimentaba con C++, más amaba Object Pascal. Y ahora, cuanto más experimento con Objective C, entiendo menos por qué C++ es como es pudiendo ser como es Objective C.

^MiSaTo^
10/06/2009, 17:48
Lo sé, pero es que cuanto más experimentaba con C++, más amaba Object Pascal. Y ahora, cuanto más experimento con Objective C, entiendo menos por qué C++ es como es pudiendo ser como es Objective C.

A mi también me gusta mucho Obj-C pero también hay que ver la eficiencia y rapidez del lenguaje, que hay ciertos proyectos que lo requieren.

Ñuño Martínez
10/06/2009, 17:49
Nada eso díselo a los que hacen cosas de visión artificial, IA, etc Pero, ¿esos no tienen sus propios lenguajes de programación, como Lisp y tal?

^MiSaTo^
10/06/2009, 17:50
Pero, ¿esos no tienen sus propios lenguajes de programación, como Lisp y tal?
Depende de lo que estén haciendo que el campo de la IA es muy amplio.

Ñuño Martínez
10/06/2009, 17:52
Depende de lo que estén haciendo que el campo de la IA es muy amplio. Ahí me has pillado.

De todas formas, C es (también en mi opinión) el mejor lenguaje para hacer cosas de bajo nivel, y algunas cosas de no tan bajo nivel también, así que apréndelo bien, Kurraudo.

Uncanny
10/06/2009, 18:35
1. Si es un libro impreso en papel, te recomiendo "C++ Estandar: Programación con el Estándar ISO y la Biblioteca de Plantillas (STL)" de Enrique y José Hernández Orallo y Mª Carmen Juan Lizandra. La verdad, hasta que empezé a leerlo nunca habría llegado a pensar que me encontraría un libro sobre C++ tan ameno, completo y encima escrito por autores españoles (concretamente los autores son profesores de la Universidad Politécnica de Valencia) y cuando digo completo digo que no se limita solo a hablar de C++ como lenguaje de una forma abstracta y directa como hacen otros libros, de hecho ni siquiera presuponen que tenga que tener conocimientos en C o algún que otro lenguaje sea estructurado u orientado a objetos (es más, te enseñan a usar C++ en programación estructurada y luego en programación orientada a objetos), sino que además van más allá de eso y se meten en cuestiones prácticas del uso de C++ en proyectos de software (hacen una introducción al UML incluso) y tratan la programación genérica en C++, no solo la OO, haciendo uso de la biblioteca de plantillas STL. En esta (http://www.paraninfo.es/servlet?txtsearchtitulo=&module_pk=10001&operation_pk=base_action_detail&obj_pk=8497320409&current_page=&txtautor=&txtsearchmercado_id=&txtisbn=&txttexto=&txttitulo=&txtsearchtema_id=&txtsearchmateria_id=&txt_autor_id=215) web puedes bajarte el código fuente de los ejemplos así como acceder a otros recursos online relacionados con C++ y en esta (http://users.dsic.upv.es/~jorallo/libro_c++/) otra tienes todo el indice y un capitulo en PDF de ejemplo. No soy de los que se entusiasman con los libros de programación, pero cuando uno lo consigue, debo dejar claro que me ha encantado y recomendarlo :D

Si quieres libros SOLO de C, "Guia de Autoenseñanza de C" de Herbert Schildt y "Lenguaje C. Edición revisada 2006" de Francisco Javier Moldes. Este ultimo libro lo bueno que tiene es que es barato (de 10 a 12 lerus) por ser de la colección Guia Práctica de Anaya Multimedia a pesar de ser muy completo y muy bien escrito (otra cosa es la edición en si misma, que puede gustar más o menos).

2. Puedes programar perfectamente juegos y prácticamente cualquier cosa que se te ocurra en C (siempre que sepas como hacerlo o estes dispuesto a investigar claro xD), a pesar de ser defensor del C por su simpleza como lenguaje, C++ tiene recursos de sobra para abarcar y hacerle la vida más facil (si se programa y documenta correctamente) al programador a la hora de desarrollar un proyecto. Si tienes nociones o has programado con un lenguaje en el paradigma de orientación a objetos, C++ debería ser mejor elección para ti, porque con C no vas a poder programar nativamente con dicho paradigma (no posee mecanismos de POO, otra cosa es que se simule o se usen bibliotecas como GLib para conseguirlo). Además el C actual, el C99, no es el ANSI propiamente dicho, tiene muchas cosas adaptadas del C++ (como los comentarios //, las funciones inline, etc), y todo eso y más podrás usarlo en C++.

3. No he usado Eclipse para programar en C/C++, aunque lo tengo configurado con el CDT, supongo que no será muy complicado hacer uso de la biblioteca SDL y configurarlo para usar el GCC de compilación cruzada para ARM para compilar programas para la GP2X / Wiz.

4. Si sabes Java, gracias a que es un lenguaje orientado a objetos, te será bastante sencillo adaptarte a C++ y si sabes C pues mejor, porque la sintaxis es prácticamente la misma. En el libro de C++ que te he recomendado antes hay un apartado comparando diversos lenguajes y sus diferencias, lo que da una buen resumen para la gente que sabe programar en dichos lenguajes (uno de ellos es Java) y saber en que se parece y en que no, lo que ayuda a la adaptación.

5. Hombre, aunque no sea para GP2X o Wiz, siempre está su subforo de programación, pero si, puede ser una buena idea tener un foro de programación en general.



1 - Los libros de Herbert Schildt son buenos y son un clásico.El de "Guia de Autoenseñanza de C" me parece un libro genial e ideal para el que quiere empezar a aprender C, pero otros libros de Schildt tiene fallos a punta pala en muchos ejemplos (hace tiempo encontré alguna página que otra que se dedicaba a recopilar fallos de sus libros y no eran pocos precisamente) y sus libros de C++, con alguna excepción, no son los primeros que recomendaría precisamente por detalles como ese.
De todas formas, C es (también en mi opinión) el mejor lenguaje para hacer cosas de bajo nivel, y algunas cosas de no tan bajo nivel también, así que apréndelo bien, Kurraudo.Hombre, prácticamente todo lo que tienes en C lo tienes en C++, desde sus operadores de bits hasta los (odiados por incomprendidos xD) punteros o el ASM inline para usar ensamblador "en linea", puedes hasta evitar el mangling/planchado de nombres y hacer una función "a lo C" para reutilizar bibliotecas de funciones en C para reutilizar código en proyectos de C++ y no es porque C++ sea un superconjunto de C (que no lo es, propiamente dicho, es otro lenguaje basado en C altamente compatible con este) sino porque C++ es un lenguaje multiparadigma, un todoterreno que se adapta a la situación si sabes como hacer que el lenguaje trabaje y se amolde a lo que buscas, de ahí que C++ sea tan complejo (que no dificil), al contrario de C, cuya belleza (para mi) reside en su sencillez, una sencillez que puedes usarla para hacer el programa más simple y sencillo (y vicevesa) o el más grande y complicado (y vicevesa), por algo C es uno de los lenguajes favoritos en las competiciones de código ofuscado :)

Kurraudo
11/06/2009, 15:17
Muchas gracias :brindis: Miraré en la biblioteca de mi facultad a ver si encuentro alguno de los libros que me habéis recomendado.


Y lo de los punteros suele ser porque no se le ve la utilidad a la primera :brindis:
Debe ser eso XD Entonces ¿Que uso tienen? ¿O es algo dificil de explicar?

sirlol
11/06/2009, 15:55
Pues sin tener mucha experiencia con C te diría que se usan mucho con las
peticiones de memoria dinamica (malloc,realloc...) y paso de parametros a funciones.

En C,si no me equivoco solo tienes paso por valor (el dato tal cual) y referencia (pasas el puntero al dato para poder modificarlo).

En cierto modo (aunque a bajo nivel no es asi) es como los in out de ada

^MiSaTo^
11/06/2009, 15:57
Muchas gracias :brindis: Miraré en la biblioteca de mi facultad a ver si encuentro alguno de los libros que me habéis recomendado.


Debe ser eso XD Entonces ¿Que uso tienen? ¿O es algo dificil de explicar?

Se usan principalmente para memoria dinámica ;)

saucjedi
11/06/2009, 16:11
Lo sé, pero es que cuanto más experimentaba con C++, más amaba Object Pascal. Y ahora, cuanto más experimento con Objective C, entiendo menos por qué C++ es como es pudiendo ser como es Objective C.

Si no lo entiendes es porque no entiendes en qué contexto y circunstancias nació C++

Por otra parte hoy por hoy las cosas han cambiado y es difícil de decir con certeza pero hasta hace cuatro días C++ le daba una paliza en rendimiento a cualquier otra cosa (salvo C plano).

< - >


Debe ser eso XD Entonces ¿Que uso tienen? ¿O es algo dificil de explicar?

No hay ninguna otra arma más poderosa que el puntero y lógicamente cuando te sale el tiro por la culata...

En mi caso sin ellos no puedo vivir. Lo último que hice para GBA lo hice con C plano y simulé la orientación a objetos usando un mix de estructuras más punteros a funciones.

Por que los punteros no sólo apuntan a datos... :p

¡Suerte!

juanvvc
11/06/2009, 16:27
Sí, justo eso. Por ejemplo se declara int i, j, *p;
En i está un número int, p es un puntero que apunta a i (p=&i) y contiene su dirección, y j accede a lo apuntado en p (j=*p), el número int.
Lo que me pregunto es ¿Qué utilidad práctica tienen? ¿Tener un acceso directo a i en p?

Hombre, en ese ejemplo no parece muy efectivo. Veamos otro. Supongamos que quieres un array de enteros de... no sabes cuánto :D No lo sabes, por ejemplo, porque no sabes si el usuario usará una resolución de 320x240 o de 1024x768.

Solución sin punteros: en tiempo de compilación usas la resolución máxima:



unsigned int pantalla[1024*768];


Y si el usuario escoge 320x240, desperdicias 2MB de memoria en una máquina de 32bits con la tontería.

Dinámicamente:



unsigned int *pantalla;
pantalla = malloc(sizeof(unsigned int) * width * height ));


Y así solo usas la cantidad de memoria exacta ¡Nada desperdiciado!

En realidad en Java estás usando punteros constantemente, en cada una de esas llamadas a "new" lo que de verdad te devuelven es un puntero pero no te enteras porque te da igual. Solo que en Java no tienes punteros a enteros o flotantes. También recuerda que en Java hay un recolector de basuras que se encarga de liberar la memoria de los objetos cuando ya no los usas. En C no hay recolector de basuras, así que tienes que hacer:



free(pantalla);


cuando no la uses más, o su memoria quedará en el limbo (nadie podrá usar esa memoria, que queda desperdiciada)

Diferencia entre "paso por valor" y "paso por referencia" (como hace Java con los objetos). En el paso por referencia puedes modificar el valor de la variable de vuelta. En C usando punteros puedes pasar por referencia todo tipo de cosas. Como Java solo tiene punteros para los objetos, solo pasa por referencia los objetos.

Otro ejemplo, este más complejo pero servirá para hacerte una idea de optimizaciones de velocidad. Suponte que nuestro programa con una pantalla 1024x768 ó 320x240 tienen estas dos funciones para poner la pantalla en negro (memset(x, 0, s) pone a cero s posiciones de memoria a partir de x):



void negro_1024(int *pantalla){
memset(pantalla, 0, 1024*768);
}

void negro_320(int *pantalla){
memset(pantalla, 0, 320*240);
}


¿Qué crees que es más rápido para hacer 60 veces por segundo, un puntero directo a la función exacta correspondiente?



void (*negro)(int*) = (width==320?negro_320:negro_1024);
for(60FPS){
negro(pantalla);
}


¿O hacer el if 60 veces por segundo?



for(60FPS){
if(width==320)
negro_320(pantalla)
else
negro_1024(pantalla);
}


Y finalmente, aritmética del puntero. Si quieres copiar 256 posiciones del array src en dst, puedes hacerlo de dos maneras:



// EN C CON ARITMËTICA DEL PUNTERO
i=256; while(i--) *(dst++) = *(src++);

// SE CONVIERTE EN (gcc 4.3.2 con Intel64, solo la parte dentro del while)
movq -24(%rbp), %rax
movl (%rax), %edx
movq -16(%rbp), %rax
movl %edx, (%rax)
addq $4, -16(%rbp)
addq $4, -24(%rbp)


Mientras que directamente con arrays (míralo bien: ambas expresiones en C son totalmente equivalentes)



// EN C DIRECTAMENTE CON ARRAYS
i=256; while(i--) dst[i] = src[i];

// SE CONVIERTE EN (gcc 4.3.2 con Intel64, solo la parte dentro del while)
movl -4(%rbp), %eax
cltq
salq $2, %rax
movq %rax, %rdx
addq -16(%rbp), %rdx
movl -4(%rbp), %eax
cltq
salq $2, %rax
addq -24(%rbp), %rax
movl (%rax), %eax
movl %eax, (%rdx)


¿Ves? Casi el doble de líneas de código ensamblador, lo que significa que casi el doble de lento por no usar aritmética del puntero :)

hardyx
11/06/2009, 19:28
Un ejemplo sencillo de la utilidad de los punteros, para recorrer cadenas. Vamos a cambiar todos los espacios de la cadena por comas.

Ejemplo sin punteros:


char cadena[100];
strcpy(cadena, "uno dos tres");

for (int i=0; i<strlen(cadena); i++) {
if (cadena[i] == ' ')
cadena[i] = ',';
}Ejemplo con punteros:


char cadena[100];
strcpy(cadena, "un dos tres");

for (char *p=cadena; *p; p++) {
if (*p == ' ')
*p = ',';
}La versión con punteros es más profesional y más rápida cuando se ejecuta en la CPU. Porque la instrucciones indexadas son más lentas.


Otro uso de los punteros, para crear objetos o estructuras dinámicas. La SDL por ejemplo, al iniciarse crea un objeto pantalla que se usa para pintar.



SDL_Surface *screen;
screen = SDL_SetVideoMode (320, 240, 16, SDL_SWSURFACE);

sirlol
11/06/2009, 19:46
Un ejemplo sencillo de la utilidad de los punteros, para recorrer cadenas. Vamos a cambiar todos los espacios de la cadena por comas.

Ejemplo sin punteros:


char cadena[100];
strcpy(cadena, "uno dos tres");

for (int i=0; i<strlen(cadena); i++) {
if (cadena[i] == ' ')
cadena[i] = ',';
}Ejemplo con punteros:


char cadena[100];
strcpy(cadena, "un dos tres");

for (char *p=cadena; *p; p++) {
if (*p == ' ')
*p = ',';
}La versión con punteros es más profesional y más rápida cuando se ejecuta en la CPU. Porque la instrucciones indexadas son más lentas.


Otro uso de los punteros, para crear objetos o estructuras dinámicas. La SDL por ejemplo, al iniciarse crea un objeto pantalla que se usa para pintar.



Respecto al ejemplos de recorridos, entiendo que la traduccion directa cadena[i] supone
el calculo de la posicion con base + desplazamiento ( en vez de tener la dirección efectiva).
Sin embargo me surge la duda de la optimización en compilación.
No se si se daria cuenta de que accede a posiciones consecutivas y optimizaria el codigo
eliminando el calculo de indexación y dejando las direcciones efectivas.

Jedive
12/06/2009, 13:19
Otro uso típico de los punteros es para manejar estructuras de datos. Suponte que cada elemento de tu juego tiene una estructura de C con sus datos. Si el objeto no va a ser local (es decir, se va a usar en un contexto diferente a la función actual), Entonces con malloc() reservas memoria para ese objeto y devuelves el puntero. Ahora manejaremos la estructura a través del puntero.

Ejemplo:


typedef struct {
void* imagen;
int x, y;
int angle;
} sprite;

sprite* newSprite( const char* imagen ) {
sprite* s = (sprite*) malloc( sizeof( sprite ) );
s->imagen = newImage( imagen ); // Supongamos que esto está definido en otro sitio...
s->x = s->y = 0;
s->angle = 0;
return s;
}

void drawSprite( sprite* s ) {
// ...
}

void deleteSprite( sprite* s ) {
deleteImage( s->imagen );
free( s );
}

int main( int argc, char* argv[] ) {
sprite* misprite = newSprite( "nave.jpg" );
misprite->y = 320;
for ( misprite->x = 0; misprite->x < 480; misprite->x++ )
drawSprite( misprite );
deleteSprite( misprite );
}

Kurraudo
12/06/2009, 15:11
Muchas gracias a todos :brindis: Ahora entiendo eso de por qué los punteros sean complicados XD Bueno, todo se arregla con un poco de práctica.

PD: Ya he encontrado en mi facultad los manuales de Ceballos y Schildt. Los leeré estas semanas a ver que tal ;)