arreglo de punteros y funciones

Iniciado por m@o_614, 27 Agosto 2013, 00:58 AM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

saludos

tengo declarado un arreglo de punteros por ejemplo: char* a[N], y para ingresarle los datos tengo que asignarle memoria a cada uno de los punteros con malloc, una vez que ya hice eso tengo que enviar cada uno de los punteros a una funcion x, y es ahi donde tengo el problema que no se si tengo que enviar: funcion(a) o tambien tengo que enviarle la posicion o sea : *a[1],*a[2],*a[3]

gracias

rir3760

Por lo que comentas no puedes pasar a la función "a" porque seria (en la llamada) de tipo "char **" como tampoco "*a[1]" porque es de tipo "char". Debes utilizar "a[0]", "a[1]", etc.

Pero para estar seguros habría que revisar el programa completo.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Alien-Z

#2
Código (cpp) [Seleccionar]
Punto tabla[3]; //Array con semántica valor | Contenido con semántica valor
Punto* tabla[3]; //Array con semántica valor | Contenido con semántica referencia
Punto* tabla[3] = new Punto[3]; //Array con semántica referencia | Contenido con semántica valor
Punto** tabla[3];//Array con semántica referencia | Contenido con semántica referencia


Saludos.

m@o_614

saludos

el programa es algo como esto:

int main()
{
    char B[TAM],*array[N];
    int i;
    for(i=0;i < N;i++)
    {
        printf("Dame el %d dato: ",i+1);
        gets(B);
        *(array+i) = (char*)malloc((strlen(B)+1)*sizeof(char));
        strcpy(array[i],B);
        nombre_funcion(array,i);
    }
    return 0;
}
int nombre_funcion(char *a[],int i)
{
    int c[TAM];
    for(????;????';????)
    return 0;
}


en nombre_funcion tengo que pasarle por parametro cada uno de los punteros a los que le asigne memoria en la funcion main, y en el for tengo que recorrer la cadena para hacer un X procedimiento, es ahi donde tngo el problema

gracias por sus respuestas

Alien-Z

Los punteros a arrays se utilizan como un array en si, creo que esto es lo que preguntas:

Código (cpp) [Seleccionar]
int nombre_funcion(char *a[], int n)
{
  for (int i = 0; i < n; i++)
   cout << a[i] << endl;
  return 0;
}


Un par de cosas:

Código (cpp) [Seleccionar]
*(array+i) = (char*)malloc((strlen(B)+1)*sizeof(char));

¿Te das cuenta de que lo que haces es reservar en cada posición de la tabla un byte más que en la posición anterior?, es decir, si array[3] ocupa 3 bytes (y solo caben 3 caracteres), array[4] va a ocupar 4 bytes y caben 4 caracteres, por tanto no todas las posiciones tienen el mismo tamaño.

Además debes añadir la marca fin "\0" a las cadenas de tipo char.

No es correcto el uso de gets, en su lugar utiliza fgets: http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Un saludo.

m@o_614

saludos Alien-Z yo pense que con:

*(romano+i) = (char*)malloc((strlen(B)+1)*sizeof(char));

strlen(B)+1 ya le estaba agregando el fin de cadena \0.

Alien-Z

#6
Cita de: m@o_614 en 29 Agosto 2013, 05:12 AM
saludos Alien-Z yo pense que con:

*(romano+i) = (char*)malloc((strlen(B)+1)*sizeof(char));

strlen(B)+1 ya le estaba agregando el fin de cadena \0.

La función strlen(B) lo que hace es devolver el tamaño en bytes de la cadena B sin contar el byte que ocupa '\0', pero no la modifica ni le asigna nada, ni si quiera la marca fin.

Es luego con strcpy() donde copias el contenido de B en array['i] incluyendo '\0', pero si no tiene suficiente tamaño se queda fuera.

Lo que yo te quería decir es que esto "(strlen(B)+1)" es lo mismo que la constante "TAM", y que debes controlar que la entrada no sea más grande que dicha constante, cosa que no se hace con la función "gets" y por tanto debes incluir tú manualmente la marca fin '\0'.

Saludos.

rir3760

Cita de: m@o_614 en 27 Agosto 2013, 21:38 PMel programa es algo como esto:

int main()
{
    char B[TAM],*array[N];
    int i;
    for(i=0;i < N;i++)
    {
        printf("Dame el %d dato: ",i+1);
        gets(B);
        *(array+i) = (char*)malloc((strlen(B)+1)*sizeof(char));
        strcpy(array[i],B);
        nombre_funcion(array,i);
    }
    return 0;
}

int nombre_funcion(char *a[],int i)
{
    int c[TAM];
    for(????;????';????)
    return 0;
}


en nombre_funcion tengo que pasarle por parametro cada uno de los punteros a los que le asigne memoria en la funcion main, y en el for tengo que recorrer la cadena para hacer un X procedimiento
En ese caso debes modificar la función ya que no tienes porque pasar la dirección del array (como tampoco se necesita el segundo parámetro).

Con los cambios para que solo imprima los caracteres que componen la cadena:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAM  10
#define N    10

int fn(char *a);

int main(void)
{
   char B[TAM],*array[N];
   int i;
   
   for(i = 0; i < N; i++){
      printf("Dame el %d dato: ",i + 1);
      gets(B);
      array[i] = malloc((strlen(B) + 1));
      strcpy(array[i], B);
      fn(array[i]);
   }
   
   return 0;
}

int fn(char *a)
{
   int i;
   
   for (i = 0; a[i] != '\0'; i++)
      putchar(a[i]);
   putchar('\n');
   
   return 0; /* Hay que devolver un valor util */
}


Otro detalle que te falta en tu programa es liberar la memoria reservada.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

m@o_614

saludos rir3760 con las correcciones que hiciste ahora el programa funciona perfectamente, ahora solo me queda una duda, por ejemplo si tengo un puntero int *p;

y le quiero asignar memoria con malloc, tendria que hacer esto:

p = (int *) malloc(10*sizeof(int));

pero me pregunto por que al hacer esto, esta mal

*p = (int*) malloc(10*sizeof(int));




rir3760

Porque:
1) "p" es la variable que puede almacenar una dirección de memoria.
2) "*p" es el objeto en la dirección indicada por "p".

En otras palabras "p" es la dirección y "*p" el objeto apuntado.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language