elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [17] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ... 37
161  Programación / Programación C/C++ / Pasar vector de puntero a char a las funciones[C] en: 20 Junio 2016, 16:14 pm
Hola.
Tengo una duda que deseo evacuarla ahora porque me impide seguir estudiando y es: como se pasan los vectores de punteros a las funciones.

Código
  1. void ingreso( char *ptrFrases );
Código
  1. void ingreso( char ptrFrases[] );
Código
  1. int main( void ){
  2. char *ptrFrases = NULL;
  3.  
  4. ingreso( ptrFrases );
  5. ordenar( ptrFrases );
  6. mostrar( ptrFrases );
  7.  
  8. return 0;
  9. }
  10.  
Dejo el programa por si les hace falta para interpretar mejor la duda, luego tengo que continuar consultándolos porque la siguiente linea sé que estoy haciendo todo mal pero es la primera vez que lo intento y realmente no logro solucionarlo, hacer lo mismo con números me funciona a la perfección, en cambio, con cadenas no. -

Código
  1. tmp = (char*)realloc( ptrFrases+i, CARACTERES * sizeof(char) );
  2. if( tmp!=NULL ){
  3. strcpy( ptrFrases[i-1], tmp );
  4. }
  5.  

Código
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define CARACTERES 21
  6. #define safeFree(p) saferFree((void**)&(p))
  7.  
  8. void ingreso( char *ptrFrases );
  9. void vaciarBuffer( char tmp[] );
  10. void ordenar( char *ptrFrases );
  11. void mostrar( char *ptrFrases );
  12. void saferFree( void **pp );
  13.  
  14. int main( void ){
  15. char *ptrFrases = NULL;
  16.  
  17. ingreso( ptrFrases );
  18. ordenar( ptrFrases );
  19. mostrar( ptrFrases );
  20.  
  21. return 0;
  22. }
  23.  
  24.  
  25. void ingreso( char *ptrFrases ){
  26. int i = 0, ok, opc;
  27. char tmp[CARACTERES], ch;
  28.  
  29. while( 1 ){
  30. printf( "\n Ingrese una palabra(maximo %d caracteres).....:", CARACTERES-1 );
  31. fgets( tmp, CARACTERES, stdin );
  32. vaciarBuffer( tmp );
  33.  
  34. do{
  35. printf( "\n 1 - Ingresa otra frase\n 0 - Finalisa\n Ingrese opcion...: " );
  36. ok = scanf( "%d", &opc ) == 1 && opc >= 0 && opc <=1;
  37. while ((ch = getchar()) != EOF && ch != '\n');
  38. }while( !ok );
  39. if( opc == 0){
  40. break;
  41. }
  42. i++;
  43. tmp = (char*)realloc( ptrFrases+i, CARACTERES * sizeof(char) );
  44. if( tmp!=NULL ){
  45. strcpy( ptrFrases[i-1], tmp );
  46. }
  47. else{
  48. safeFree( ptrFrases );
  49. puts( "Error (re)allocating memory" );
  50. exit(1);
  51. }
  52. }
  53.  
  54. }
  55.  
  56. void vaciarBuffer( char tmp[] ){
  57. char *p = NULL;
  58. size_t ch;
  59.  
  60. if((p=strchr(tmp, '\n'))){
  61. *p='\0';
  62. }
  63. else{
  64. while((ch = getchar()) !='\n' && ch!=EOF);
  65. }
  66. }
  67.  
  68. void saferFree(void **pp) {
  69. if (pp != NULL && *pp != NULL) {
  70. free(*pp);
  71. *pp = NULL;
  72. }
  73. }
  74.  
  75. void ordenar( char *ptrFrases ){
  76. printf( "\n No desarrollado" );
  77. }
  78. void mostrar( char *ptrFrases ){
  79. printf( "\n No desarrollado" );
  80. }
  81.  
Saludos y gracias. -
162  Programación / Programación C/C++ / Re: Doble free. en: 19 Junio 2016, 19:11 pm
Hola, Alberto. -
Muchas gracias amigo funciona a la perfección, pero igual me queda una duda y es que al tener un espacio creado con:
Código
  1. strcat( arr, " ");
¿no debería reservar un espacio más?  
Código
  1. size_t totCarac = strlen( origUno ) + strlen( origDos ) + 1;
Un abrazo.
163  Programación / Programación C/C++ / Concatenar cadenas con memoria dinámica en lenguaje C. en: 19 Junio 2016, 14:33 pm
Hola, gente.
Les quito un poco de tiempo porque si bien estoy leyendo que es lo que causa el doble free no logro solucionarlo por mí mismo y si lo lograra me quedarían dudas en la función concatenar, les digo esto porque si bien logre que no me diera error en la compilación lo hice a fuerza de prueba/error/solución pero no teniendo claro que es lo que estaba haciendo. -
Las cosas que no me quedan claras:

1): Porque debo hacer que la función se declare como un puntero a función.
2): Porque el error del doble free.
3): Como se hace para poner un espacio entre las dos frases (por programación, claro).-
  
Código
  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4.  
  5. #define MAX 51
  6.  
  7. void ingreso( char origUno[], char origDos[] );
  8. void limpiarBuffer( char cadena[] );
  9. char *concatenar( char *origUno, char *origDos );
  10.  
  11. int main( void ){
  12. char origUno[MAX] = "", origDos[MAX] = "", *ptrConc = NULL;
  13.  
  14. ingreso( origUno, origDos );
  15. ptrConc = concatenar( origUno, origDos );
  16.  
  17. printf("\n %s", ptrConc);
  18.  
  19. free(ptrConc);
  20.  
  21. return 0;
  22. }
  23.  
  24. void ingreso( char origUno[], char origDos[] ){
  25.  
  26. printf( "\n Ingrese una frase(maximo %d caracteres)............:", MAX-1 );
  27. fgets(origUno, MAX, stdin);
  28. limpiarBuffer( origUno );
  29.  
  30. printf( "\n Ingrese frase a concatenar (maximo %d caracteres)..:", MAX-1 );
  31. fgets(origDos, MAX, stdin);
  32. limpiarBuffer( origDos );
  33. }
  34.  
  35. void limpiarBuffer( char cadena[] ){
  36. char *p = NULL;
  37. size_t ch;
  38.  
  39. if((p=strchr(cadena, '\n'))){
  40. *p='\0';
  41. }
  42. else{
  43. while((ch = getchar()) !='\n' && ch!=EOF);
  44. }
  45. }
  46.  
  47. char *concatenar( char *origUno, char *origDos ){
  48. size_t totCarac = strlen( origUno ) + strlen( origDos ) + 1;
  49. char *arr = ( char* )malloc( totCarac * sizeof(char) );
  50. arr = strcat( origUno, origDos );
  51.  
  52. return arr;
  53. }
  54.  

Saludos y desde ya muchas gracias. -
164  Programación / Programación C/C++ / Re: matriz de punteros de una dimensión - liberar memoria[C] en: 10 Junio 2016, 23:10 pm
Hola. -
Tiene toda la razón, lo que ocurre es que el tema que estoy estudiando es matriz de punteros de una dimensión. y para el caso me parece que vale el Ej. que saque del libro, igual me viene de maravilla porque no se si me hubiera dado cuenta por mí mismo de tu alternativa, una muy buena aclaración. -

Saludos.
165  Programación / Programación C/C++ / matriz de punteros de una dimensión - liberar memoria[C] en: 10 Junio 2016, 21:28 pm
Hola, gente.
Tengo una pequeña duda con él programara que dejo a continuación y es si esta bien liberada la memoria. -

Código
  1. /*
  2.  matriz de punteros de una dimensión.
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8.  
  9. #define MAX 5
  10.  
  11. int main(void) {
  12. int *arr[MAX], i;
  13. srand(time(NULL));
  14.  
  15. for( i=0; i<MAX; i++ ){
  16. *(arr+i) = (int*)malloc(sizeof(int));
  17. **(arr+i) = rand() % 100;
  18. printf( "\n %d", **(arr+i) );
  19. }
  20. for( i=0; i<MAX; i++ ){
  21. free(*(arr+i));
  22. }
  23.  
  24.  
  25. return 0;
  26.  
  27. }
Si tienen tiempo y lo desearían necesitaría un poco de teoría al respecto si esta mal como si estuviera bien. -
Saludos y desde muchas gracias como siempre.-
166  Programación / Programación C/C++ / Re: Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero en: 9 Junio 2016, 16:03 pm
Hola, geeke.
Muchas gracias por ocuparte, las dudas que me quedan ahora son las siguientes:
Si recibo en a la función el arreglo de esta manera
Código
  1.         void vector_(int vector[] );
¿En la función se crearía una copia de todo el arreglo?
Y la otra es, si tendrían un arreglo con 1000 elementos, ¿de qué manera llamarían a la función y como lo recibirían?.-

Saludos.
167  Programación / Programación C/C++ / Re: Matriz de punteros, duda al liberar memoria[C] en: 9 Junio 2016, 03:04 am
Hola, fary.
Muchas gracias por ocuparte.-

Saludos.
168  Programación / Programación C/C++ / Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero en: 9 Junio 2016, 03:02 am
Hola, gente.
Les dejo un ejemplo de lo que digo en el enunciado y la pregunta es ¿hay alguna diferencia en hacerlo de una manera u otra?, los consulto porque me parece que en ningún Ej. vi como lo hago en la segunda llamada a la función. -

Código
  1. #include <stdio.h>
  2.  
  3. void vector_(int *vt );
  4.  
  5. int main(void) {
  6. int vector[] = {1, 2, 3, 4, 5}, *vt = vector;
  7.  
  8. vector_(vt);
  9. printf( "\n" );
  10. vector_(vector);
  11.  
  12. return 0;
  13.  
  14. }
  15.  
  16.  
  17. void vector_(int *vt ){
  18. size_t i;
  19. for( i=0; i<5; i++){
  20. printf("\n %d", *(vt+i));
  21. }
  22. }
  23.  
Saludos.
169  Programación / Programación C/C++ / Matriz de punteros, duda al liberar memoria[C] en: 8 Junio 2016, 02:51 am
Hola, amigos. -
La duda es ¿debo liberar la memoria con un bucle o simplemente liberar el primer puntero?, lo que me sucede es que no me da ningún error, pero no tengo manera de comprobar si esto es correcto, por lo menos por mis escasos conocimientos de memoria dinámica desconozco cómo podría comprobarlo. -   
Con el barullo que tengo de tantas cosas nuevas no sé si logro hacerme entender, valga el intento. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define safeFree(p) saferFree((void**)&(p))
  5.  
  6. void ingreso( void );
  7. void imprimir( int numeros[], size_t contador );
  8. void saferFree( void **pp );
  9.  
  10. int main( void ){
  11.  
  12. ingreso();
  13.  
  14. return 0;
  15. }
  16.  
  17.  
  18. void ingreso( void ){
  19. size_t contador=0, ingreso, ch, ok;
  20. int *numeros=NULL, *tmpNumeros=NULL;
  21.  
  22. do{
  23. do{
  24. printf( "\n Ingrese un numero [0 para finalizar]....:");
  25. ok = scanf( "%lu", &ingreso ) == 1 && ingreso >=0;
  26. while( (ch = getchar()) != '\n' && ch != EOF );
  27. }while( !ok );
  28.  
  29. contador++;
  30. tmpNumeros = (int *)realloc( numeros, contador * sizeof(int) );
  31. if( tmpNumeros != NULL ){
  32. numeros = tmpNumeros;
  33. numeros[contador-1] = ingreso;
  34. }
  35. else{
  36. safeFree( numeros );
  37. puts( "Error en asignar memoria....." );
  38. exit(1);
  39. }
  40.  
  41. }while( ingreso >= 1 );
  42.  
  43. imprimir( numeros, contador );
  44. safeFree( numeros );
  45. }
  46.  
  47. void imprimir( int numeros[], size_t contador ){
  48. size_t i;
  49.  
  50. for(i=0; i<contador-1; i++){
  51. printf( "\n %d", numeros[i] );
  52. }
  53. }
  54.  
  55. void saferFree(void **pp) {
  56. if (pp != NULL && *pp != NULL) {
  57. free(*pp);
  58. *pp = NULL;
  59.        }
  60. }
Debo aclarar que el código es casi todo mío por eso no puedo averiguarlo en el libro con el que estoy estudiando. -
Saludos.


170  Programación / Programación C/C++ / Re: ¿Las matrices se pasan a las funciones por valor o referencia? [C] en: 6 Junio 2016, 14:51 pm
Hola, mucha gracia a ambos por ocuparse. -
Me queda todo muy claro, el identificador del array se pasa por valor y como la función llamada recibe una copia exacta de la dirrección del primer elemento del array, toda modificación que se efectúe en dicha función se ve reflejada en el array original. -
Voy a agregar que los elementos del array individualmente se pasan por valor, les dejo este Ej. de Eternal Idol (que encontré en el foro) para pasarlos por referencia. -

Código
  1. #include <stdio.h>
  2.  
  3. int Valor(int);
  4. int Referencia(int*);
  5.  
  6. int main(void)
  7. {
  8.    int array[30];
  9.    array[4] = 33;
  10.  
  11.    printf("Posicion 5, Valor: %d\r\n", Valor(array[4]));
  12.    printf("Posicion 5, Valor: %d\r\n", array[4]);
  13.    printf("Posicion 5, Referencia %d\r\n", Referencia(&array[4]));
  14.    printf("Posicion 5, Referencia %d\r\n", array[4]);
  15.  
  16.    return 0;
  17. }
  18.  
  19. int Valor(int v)
  20. {
  21.  return v;
  22. }
  23.  
  24.  
  25. int Referencia(int *r)
  26. {
  27.  return (*r)++;
  28. }

Saludos.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [17] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ... 37
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines