Autor Tema: ¿Qué características son recomendable para programar en C?  (Leído 16309 veces)

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
¿Qué características son recomendable para programar en C?
« Respuesta #10 en: 16 de Abril de 2004, 04:25:33 pm »
...pues si amigo, la verdad es que lo de punteros es algo complicado, pero es muy sencillo si siempre recuerdas liberar la memoria "cojida"...sobre la memoria dinamica si que he tenido problemas pero con el realloc en estruct, porque con malloc no he tenido problemas aun...ademas veamos C como un primer paso...para aprender bien los conceptos y funcionalidad...mas adelante veremos como C++ trae muchas mejoras y ademas que es muy pero muy vacano para programar...a mi me encanata programar en C++, pero como dices C me encanta...primero camino y luego corro... :wink: ...vamos amigo...asi necesitamos gente... :wink: ....
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
punteros
« Respuesta #11 en: 16 de Abril de 2004, 11:00:00 pm »
respecto a lo que comentáis de los punteros... no pienso que sea algo tan terrorífico. Trabajo siempre con memoria dinámica y hasta la fecha no he tenido problemas graves. Por supuesto a cualquiera se le escapa un puntero en alguna ocasión... pero con un poco de disciplina... no hay problema. El C es tremendamente flexible y te permite hacer cualquier cosa, sólo es cuestión de que tengas claro lo que estás haciendo. Si se te complica algo, piensa (como dicen los adictos a PERL), que siempre hay otras formas de hacerlo.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado Dabo

  • Administrator
  • *
  • Mensajes: 15344
    • https://www.daboblog.com
¿Qué características son recomendable para programar en C?
« Respuesta #12 en: 17 de Abril de 2004, 12:46:45 am »
Fats, no dejas de sorprenderme  :wink:  no sabia esa faceta tuya, bienvenido al foro amigo ALP, otro mas para la causa, espero que encuentres sitio aqui, este foro , el de programacion, solo lleva una semana o asi pero creo que sera muy transitado

Citar
como dicen los adictos a PERL


digo publicamente que es lo proximo con lo que me voy a poner, lo empiezo y lo intento y lo dejo por falta de tiempo pero...

lo acabare pillando  :lol:

seguir  :!:
Hacking, computing, are in my blood, are a part of me, a part of my life...Debian GNU/Linux rules.

Twitter; https://twitter.com/daboblog
Instagram: @daboblog


www.daboblog.com | www.debianhackers.net | www.caborian.com | www.apachectl.com | www.davidhernandez

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
¿Qué características son recomendable para programar en C?
« Respuesta #13 en: 18 de Abril de 2004, 12:28:13 am »
...ALP...hola amigo...has probado el realloc con estructuras y no te da problema...me gustaria ver eso amigo...te confieso que el realloc si es un problema para mi cuando trabajo con estructuras...pense que era error y eso se habia mejorado con el new en C++...

...PERL...PERL...PERL...eso me suena cada vez mas... :twisted:  :twisted:  :twisted:  :twisted:  :twisted: ...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
realloc
« Respuesta #14 en: 18 de Abril de 2004, 05:20:55 am »
jirho... ante todo un saludo.
¿A qué te refieres con el realloc con estructuras? ¿un array de estructuras... o quizás estructuras que contienen punteros a memoria dinámica?
Que yo sepa... new no sirve para modificar el tamaño de la memoria reservada, ni puedes combinar la utilización de malloc/realloc/free con new/delete.
¿Pudiera ser que no actualizas tus punteros con el valor que devuelve realloc? Ten en cuenta que puede mover tus datos a otra zona de la memoria en caso de que no tenga espacio suficiente para alojar el nuevo tamaño, con lo cual, el valor original del puntero que pasas a realloc no serviría, ya que apunta a una zona de memoria "libre" (aunque siga conteniendo los datos, ya que cuando se libera la memoria no se limpia)

Podrías poner un ejemplo?

Un saludo y ánimo con el foro!
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
¿Qué características son recomendable para programar en C?
« Respuesta #15 en: 19 de Abril de 2004, 12:04:21 am »
jirho...hola

creo que anoche se me fue un poco la olla (...demasiados gin-tonics...)  :lol:

de todos modos... no te entiendo del todo.. podrías poner un ejemplo?

(creo que deberías abrir un nuevo hilo, ya que nos estamos desviando del tema un pelín)
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
¿Qué características son recomendable para programar en C?
« Respuesta #16 en: 19 de Abril de 2004, 06:33:33 pm »
...claro amigo...supon una estructura de X campos...

int main()
{
struct X *x;

while (Res!=s)
 {
x=(X *)realloc((X *)x,(N+1)*sizeof(X));
}
}

...poco despues de esto, asi se libere la memoria dentro del ciclo...se nukea...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
¿Qué características son recomendable para programar en C?
« Respuesta #17 en: 19 de Abril de 2004, 10:28:16 pm »
a ver... prueba esto

Código: [Seleccionar]

#include <stdlib.h>
#include <stdio.h>

struct X {
int uno;
float dos;
char tres[10];
};

int main()
{
   struct X *x = NULL;
   int n = 0;

   for (n = 0; n < 100000; n++) {
      x = (X*)realloc(x, (n+1)*sizeof(X));

      if (n%1000 == 0)
         printf("%5i\t", n);
      if (x == NULL) {
         printf("\nError:  n = %li\n", n);
         perror("Error asignando memoria");
         exit(1);
      }
   }

   if (x)
      free(x);

   return (0);
}


en borland 5.02 funciona correctamente.
¿Es posible que no inicialices el puntero a NULL antes de la primera llamada a realloc()? La documentación dice que el puntero que le pasas debe ser un puntero válido proveniente de malloc() o con valor NULL, y así realloc() se comporta como malloc().

Otra cosa: la sentencia...
Código: [Seleccionar]
x = (X*)realloc(x, (n+1)*sizeof(X));
...no es segura, puesto que si realloc() devuelve NULL,  por que no haya memoria disponible, el puntero que le pasas sigue siendo válido (no se libera ni se mueve)

Una forma más segura de hacer esto sería:
Código: [Seleccionar]

x2 = (X*)realloc(x, (n+1)*sizeof(X));
if (x2 != NULL)
   x = x2;


Por otro lado puede surgir un error si x se  libera con free() y no se le asigna el valor NULL, con lo que apuntaría a una zona de memoria libre, y por lo tanto no accesible, con lo que la siguiente llamada a realloc() fallaría.

Si incrementas el tamaño de la estructura, se vuelve más lento, pero sigue funcionando. Prueba a cambiar char tres[10]; por char tres[100];  o por char tres[1000];

Espero que esto te ayude.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
¿Qué características son recomendable para programar en C?
« Respuesta #18 en: 20 de Abril de 2004, 04:40:38 pm »
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


struct Persona{
    char Nombre[10];
    int Edad;
    };
   
int main()
     {
     Persona *Pers=NULL;
     char Res='s'
     ;
     int Tam=0;
     int i=0;
     
     while(Res=='s')
          {
          Pers=(Persona *)realloc((Persona *)Pers,(Tam+1)*sizeof(Persona));
          if(Pers==NULL)
            {
            cout<<"ERROR...";
            return 0;
            }
          cout<<"INGRESE NOMBRE: ";
          cin>>Pers.Nombre;
          cout<<"INGRESE EDAD: ";
          cin>>Pers.Edad;
          i++;
          cout<<"DESE SEGUIR INGRESANDO REGISTROS?...";
          Res=getche();
          }
     getch();
     }
/************************************************************/

 :oops: solo era inicializar en NULL :oops: ...confiezo publicamente que me deshice del realloc en un progrma solo por eso...bien gracias amigo...la verdad es que si un punto muy importante al igual que las variables locales, es INICIALIZAR...bien, tal parece que tengo que volver un poco mas al C, es que desde que estoy con C++, siempre lo manejo y me vuelvo al C solo para el tuto...gracias amigo...aveces hay cosas tan pequeñas que te joden y no te das cuenta que la solucion esta ahi...

...ALP..espero que te pases mucho por aqui...veo que sabes bien sobre C...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
¿Qué características son recomendable para programar en C?
« Respuesta #19 en: 20 de Abril de 2004, 07:26:59 pm »
Una última cosilla....

No olvides nunca LIBERAR la memoria reservada dinámicamente. Aunque en teoría el sistema libera la memoria que has reservado cuando el programa termina, es una buena costumbre liberar siempre la memoria reservada cuando ya no te sirva (aunque sea un programa de prueba).

Imagina que el ejemplo que has puesto es una función que pide los datos, y al terminar los guarda en un fichero. Si no liberas la memoria cuando ya no la necesitas, tu función se convertirá en un "gusano" que irá comiendo memoria sin parar. Al final, el programa podría fallar en otro lado por falta de memoria. Estas fugas de memoria son muy difíciles de encontrar, y son más habituales de lo que puedas creer.

De hecho, en linux hay multitud de herramientas para detectar estas fugas de memoria, como dmalloc, electric-fence, memprof,  memwatch, etc.

Esto no quiere decir que no la utilices, si no que mantengas cierta disciplina cuando trabajes con punteros dinámicos.

Yo la utilizo para casi todo, de forma que no tienes que implantar límites artificiales, ni desperdiciarás memoria que no utilices (por ejemplo declarando arrays muy grandes).

Si tomas las debidas precauciones cuando trabajes con la memoria dinámica,  no tendrás que pasar horas depurando un programa que aparentemente es correcto. Te lo digo por experiencia...
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License