Ayuda asignacion de memoria dinámica palabras en c

Iniciado por newfag, 18 Mayo 2010, 16:30 PM

0 Miembros y 2 Visitantes están viendo este tema.

.:BlackCoder:.

Ya que hablas de hacerlo en un solo puntero y sin saber la cantidad de palabras, yo lo estoy intentando con c++ y no me sale  :( Yo crei que ya entendia el tema xD, pero me toco usar un poco de variables auxiliares, y a la final no me muestra nada... Como lo harias tu??...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




nicolasblues86

y una forma es como te mostré recién usando fgets y utilizando un variable auxiliar...

de ultima si tenes problemas con el nuevo codigo que estas haciendo postealo y nos fijamos porque no imprime nada


Saludos Coridiales :D
       
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no

.:BlackCoder:.

Estoy con C++, no con C... Y aca ta el codigo... El problema es que no sale del bucle, de resto creo que funciona, pero sobrecargado de codigo  :-\:

Código (cpp) [Seleccionar]
    char *cad,aux[20]="",*caux;
    int x=0;

    while (aux != "bye"){
        x=x+strlen(aux)+1;
        aux[strlen(aux)+1]=' ';
        caux=cad;
        cad=new char [x];
        cad=caux;
        int z=0;
        for (int i=x-strlen(aux)-1;i<x;i++){
            cad[i]=aux[z];
            z++;
            }
        cin>>aux;
    }
    cout<< cad <<endl;
    delete[] caux;
    delete[] cad;

Bueno espero alguien me pueda ayudar... Y pes que a quien no le moleste expongan un mejor algoritmo...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




Eternal Idol

Cita de: nicolasblues86 en 19 Mayo 2010, 04:19 AM
no entiendo para que haces que 'vect' sea un puntero de puntero si lo que queres hacer es reserva la cantidad justa de memoria para la cantidad de palabras ingresadas, se puede hacer que vect sea tan solo un puntero a char :

Es lo logico, un array bidimensional es un doble puntero. Mostranos en tu caso como leerias las palabras y accederias a ellas posteriormente ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

newfag

#14
@nicolasblues86:
tienes razón con lo de calloc, el orden está mal puesto, pero si no supiera de antemano las palabras que voy a meter se podría usar la función  realloc para que fuera modificando el tamaño de vect.
EDIT: tal que asi



vect=(char **)calloc(1,sizeof(char*));
do {
  printf("palabra: ");
  __fpurge(stdin);
  scanf("%s" ,aux);
  if(strcmp(aux,"fin")
    {
     vect[i]=(char*)malloc(sizeof(char)*(strlen(aux)+1));
     strcpy(vect[i],aux);
     n++;
     i++;
     vect=(char**)realloc(vect,sizeof(char*)*(n+1));
    }
}while(strcmp(aux,"fin"));


nicolasblues86

#15
Cita de: Eternal Idol en 19 Mayo 2010, 08:12 AM
Cita de: nicolasblues86 en 19 Mayo 2010, 04:19 AM
no entiendo para que haces que 'vect' sea un puntero de puntero si lo que queres hacer es reserva la cantidad justa de memoria para la cantidad de palabras ingresadas, se puede hacer que vect sea tan solo un puntero a char :

Es lo logico, un array bidimensional es un doble puntero. Mostranos en tu caso como leerias las palabras y accederias a ellas posteriormente ...

sigo sin entender, ya se que un array bidimensional es un doble puntero, lo que no entiendo es para que sirve en este ejercicio en particular es complicarse la vida, si con un solo array dinámico se puede hacer tranquilamente el problema no exige mas que eso, salvo que yo lo alla entendido mal  :-\ pero hasta donde se es guardar palabras o mejor dicho una cadena en una array cuyo tamaño definimos en tiempo de ejecución, por eso digo que seria mas facil usar un array de una dimencion y extenderlo tanto como sea necesario de ultima lo que se puede hacer por cada linea que se escribe una fila diferente ahí si hace falta recurrir a la  bidimensionalidad    :



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10

void entrada (char* cd[])

{

char aux[120];
int j, tam;

printf ("escribe %d linea de texto \n", N );
for (j = 0; j < N; j++)
{
fgets (aux, 120, stdin);
tam = ((strlen(aux) +1) * sizeof(char)  );
cd[j] =  (char*) malloc (tam);
sscanf (aux, "%s", cd[j]);
}
}


int main(int argc, char** argv)
{

char * cad[N];

entrada (cad);



return 0;
}











Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no

Eternal Idol

#16
Cita de: nicolasblues86se puede hacer que vect sea tan solo un puntero a char :

Un puntero a char es lo que el tenia originalmente:
char *vect;

Vos ahora diste este ejemplo que es otra cosa:
char * cad[N];

Cita de: nicolasblues86 en 19 Mayo 2010, 17:04 PMsigo sin entender, ya se que un array bidimensional es un doble puntero, lo que no entiendo es para que sirve en este ejercicio en particular es complicarse la vida, si con un solo array dinámico se puede hacer tranquilamente el problema no exige mas que eso, salvo que yo lo alla entendido mal

En el ejemplo que das usas un array bidimensional de N punteros a caracter totalmente estatico, la solucion de newfag permite reservar la cantidad de punteros que quiera el usuario.

http://decsai.ugr.es/~jfv/ed1/c/cdrom/cap8/cap810.htm
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

nicolasblues86

#17
obvio que estoy usando un array bidimensional, solo di ejemplo de como se podria llegar hacer usando ese método, sigo pensando que la manera mas sencilla  es con un array unimecional dinámico :



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

int main(int argc, char** argv)
{
char* pt;
int tam;
char b[120];

fgets (b, 120, stdin);
tam =  ((strlen (b) + 1 ) * sizeof(char) ) ;
pt = (char*) malloc (tam);

/* Apartir de aca se treta a pt como si fuese un array normal */

return 0;

}




OJO!!! yo no digo que esta sea la manera mas optima de hacerlo, solo digo que es la mas simple obviamente estamos limitados por 120 caracteres y tenemos reservado ese espacio estatico,  se puede profundizar mucho más pero la pregunta inicial iba a esto

Saludos Cordiles  

Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no

Eternal Idol

#18
Cita de: nicolasblues86 en 19 Mayo 2010, 19:16 PMobvio que estoy usando un array bidimensional, solo di ejemplo de como se podria llegar hacer usando ese método

No entiendo muy bien para que ... eso ya lo hizo newfag ... yo te habia pedido que dieras el ejemplo de lo que vos aconsejabas hacer.

Cita de: nicolasblues86 en 19 Mayo 2010, 19:16 PMsigo pensando que la manera mas sencilla  es con un array unimecional dinámico :

/* Apartir de aca se treta a pt como si fuese un array normal */

Esa parte es la que me gustaria ver, como lees digamos 300 palabras (o lineas que es en realidad lo que se planteaba en el codigo desde el principio, con un bucle para ello) y despues podes acceder a ellas. Ese codigo por lo pronto lee una sola palabra linea.

Cita de: nicolasblues86 en 19 Mayo 2010, 19:16 PMOJO!!! yo no digo que esta sea la manera mas optima de hacerlo, solo digo que es la mas simple obviamente estamos limitados por 120 caracteres y tenemos reservado ese espacio estatico,  se puede profundizar mucho más pero la pregunta inicial iba a esto

Yo no lo entendi esa manera y mucho menos despues de leer el codigo donde no se trataba de una cadena de X tamaño sino X numero de cadenas ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

nicolasblues86

#19
CitarEsa parte es la que me gustaria ver, como lees digamos 300 palabras y despues podes acceder a ellas. Ese codigo por lo pronto lee una sola palabra.


Heee?¿?¿?¿?¿?
que lee una sola palabra???... no capo! lee una cadena que es muy diferente en ella puede aver una palabra de 120 caracteres (la cual no existe) como tambien puede haber 50 palabras o 20 o una sola por eso uso fgets !!!  

a ver vamos por por partes aca ta el codigo:

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

int main(int argc, char** argv)
{
char* pt;
int tam;
char b[120];

fgets (b, 120, stdin);
tam =  ((strlen (b) + 1 ) * sizeof(char) ) ;
pt = (char*) malloc (tam);

/* Apartir de aca se treta a pt como si fuese un array normal */

return 0;
}



digamos que nosotros ingresamos "hola!! a todos com andan?? espero que bien.. chau"

el codigo reserva memoria para alamacenar esa cantidad de caracteres en pt

ahora si nosotros queremos ingresar esos caracteres en pt podriamos hacer por ejemplo:



strcpy(pt, b);
puts (pt); //muestra en contenido de pt








EI: juntando mensajes.

Citarbuenas, tengo un problemilla, quiero hacer un programa que acepte un numero indeterminado de palabras y las imprima por pantalla(esto último solo para ver si funciona), había pensado algo así pero no va, una ayudita por favor

decime porfavor en que parte dice lo de numero indeterminado de lineas yo no lo veo
la propuesta inicial era esta que despues se haya deformado es otra cosa

Saludos!
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no