|
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. void ingreso( char *ptrFrases );
void ingreso( char ptrFrases[] );
int main( void ){ char *ptrFrases = NULL; ingreso( ptrFrases ); ordenar( ptrFrases ); mostrar( ptrFrases ); return 0; }
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. - tmp = (char*)realloc( ptrFrases +i , CARACTERES * sizeof(char) ); if( tmp!=NULL ){ strcpy( ptrFrases [i -1], tmp ); }
#include <stdio.h> #include<stdlib.h> #include<string.h> #define CARACTERES 21 #define safeFree(p) saferFree((void**)&(p)) void ingreso( char *ptrFrases ); void vaciarBuffer( char tmp[] ); void ordenar( char *ptrFrases ); void mostrar( char *ptrFrases ); void saferFree( void **pp ); int main( void ){ char *ptrFrases = NULL; ingreso( ptrFrases ); ordenar( ptrFrases ); mostrar( ptrFrases ); return 0; } void ingreso( char *ptrFrases ){ int i = 0, ok, opc; char tmp[CARACTERES], ch; while( 1 ){ printf( "\n Ingrese una palabra(maximo %d caracteres).....:", CARACTERES -1 ); fgets( tmp , CARACTERES , stdin ); vaciarBuffer( tmp ); do{ printf( "\n 1 - Ingresa otra frase\n 0 - Finalisa\n Ingrese opcion...: " ); ok = scanf( "%d", &opc ) == 1 && opc >= 0 && opc <=1; while ((ch = getchar()) != EOF && ch != '\n'); }while( !ok ); if( opc == 0){ break; } i++; tmp = (char*)realloc( ptrFrases +i , CARACTERES * sizeof(char) ); if( tmp!=NULL ){ strcpy( ptrFrases [i -1], tmp ); } else{ safeFree( ptrFrases ); puts( "Error (re)allocating memory" ); } } } void vaciarBuffer( char tmp[] ){ char *p = NULL; size_t ch; *p='\0'; } else{ while((ch = getchar()) !='\n' && ch !=EOF ); } } void saferFree(void **pp) { if (pp != NULL && *pp != NULL) { *pp = NULL; } } void ordenar( char *ptrFrases ){ printf( "\n No desarrollado" ); } void mostrar( char *ptrFrases ){ printf( "\n No desarrollado" ); }
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:
¿no debería reservar un espacio más? 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).- #include <stdio.h> #include<string.h> #include<stdlib.h> #define MAX 51 void ingreso( char origUno[], char origDos[] ); void limpiarBuffer( char cadena[] ); char *concatenar( char *origUno, char *origDos ); int main( void ){ char origUno[MAX] = "", origDos[MAX] = "", *ptrConc = NULL; ingreso( origUno, origDos ); ptrConc = concatenar( origUno, origDos ); return 0; } void ingreso( char origUno[], char origDos[] ){ printf( "\n Ingrese una frase(maximo %d caracteres)............:", MAX -1 ); fgets(origUno , MAX , stdin ); limpiarBuffer( origUno ); printf( "\n Ingrese frase a concatenar (maximo %d caracteres)..:", MAX -1 ); fgets(origDos , MAX , stdin ); limpiarBuffer( origDos ); } void limpiarBuffer( char cadena[] ){ char *p = NULL; size_t ch; *p='\0'; } else{ while((ch = getchar()) !='\n' && ch !=EOF ); } } char *concatenar( char *origUno, char *origDos ){ size_t totCarac = strlen( origUno ) + strlen( origDos ) + 1; char *arr = ( char* )malloc( totCarac * sizeof(char) ); arr = strcat( origUno , origDos ); return arr; }
Saludos y desde ya muchas gracias. -
|
|
|
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. - /* matriz de punteros de una dimensión. */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX 5 int main(void) { int *arr[MAX], i; for( i=0; i<MAX; i++ ){ *(arr +i ) = (int*)malloc(sizeof(int)); **(arr +i ) = rand() % 100; } for( i=0; i<MAX; i++ ){ } return 0; }
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.-
|
|
|
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. - #include <stdio.h> void vector_(int *vt ); int main(void) { int vector[] = {1, 2, 3, 4, 5}, *vt = vector; vector_(vt); vector_(vector); return 0; } void vector_(int *vt ){ size_t i; for( i=0; i<5; i++){ } }
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. - #include <stdio.h> #include <stdlib.h> #define safeFree(p) saferFree((void**)&(p)) void ingreso( void ); void imprimir( int numeros[], size_t contador ); void saferFree( void **pp ); int main( void ){ ingreso(); return 0; } void ingreso( void ){ size_t contador=0, ingreso, ch, ok; int *numeros=NULL, *tmpNumeros=NULL; do{ do{ printf( "\n Ingrese un numero [0 para finalizar]....:"); ok = scanf( "%lu", &ingreso ) == 1 && ingreso >=0; while( (ch = getchar()) != '\n' && ch != EOF ); }while( !ok ); contador++; tmpNumeros = (int *)realloc( numeros , contador * sizeof(int) ); if( tmpNumeros != NULL ){ numeros = tmpNumeros; numeros[contador-1] = ingreso; } else{ safeFree( numeros ); puts( "Error en asignar memoria....." ); } }while( ingreso >= 1 ); imprimir( numeros, contador ); safeFree( numeros ); } void imprimir( int numeros[], size_t contador ){ size_t i; for(i=0; i<contador-1; i++){ printf( "\n %d", numeros [i ] ); } } void saferFree(void **pp) { if (pp != NULL && *pp != NULL) { *pp = NULL; } }
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. - #include <stdio.h> int Valor(int); int Referencia(int*); int main(void) { int array[30]; array[4] = 33; printf("Posicion 5, Valor: %d\r\n", Valor (array [4])); printf("Posicion 5, Valor: %d\r\n", array [4]); printf("Posicion 5, Referencia %d\r\n", Referencia (&array [4])); printf("Posicion 5, Referencia %d\r\n", array [4]); return 0; } int Valor(int v) { return v; } int Referencia(int *r) { return (*r)++; }
Saludos.
|
|
|
|
|
|
|