Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sebapoli00 en 1 Abril 2019, 22:21 pm



Título: como inicializar una matriz char**
Publicado por: sebapoli00 en 1 Abril 2019, 22:21 pm
hola, quisiera saber como inicializar una matriz char ** cuando me pasan por parametro filas y columnas, gracias.


Título: Re: como inicializar una matriz char**
Publicado por: K-YreX en 1 Abril 2019, 22:27 pm
Imagino que te refieres a usando memoria dinámica. En ese caso el proceso es el siguiente, tanto en una función con parámetros como en el <main>:
Código
  1. int **matriz;
  2. int filas = 4, columnas = 4;
  3.  
  4. matriz = new int* [filas]; // reservamos memoria en el puntero para tantos punteros como filas tenga la matriz
  5. for(int i = 0; i < filas; ++i) // por cada fila
  6.    matriz[i] = new int [columnas]; // reservamos espacio para x columnas
  7.  
También se podría hacer al revés y crear punteros para cada columna y luego reservar filas pero se suele hacer así.
No olvides luego liberar toda la memoria dinámica que hemos reservado... Suerte :-X


Título: Re: como inicializar una matriz char**
Publicado por: sebapoli00 en 2 Abril 2019, 00:36 am
Hola, he probado como tu dices, asi:

Código
  1. char **matriz;
  2. int filas = 3;
  3. int columnas = 5;
  4. matriz = new char*[filas];
  5. for (int i = 0; i < filas; i++)
  6. matriz[i] = new char[columnas];
  7.  

Pero me da errores, "Error al leer los caracteres de la cadena"
"No se puede leer la memoria"
¿que será?


Título: Re: como inicializar una matriz char**
Publicado por: K-YreX en 2 Abril 2019, 00:45 am
Coloca el resto de tú código para que pueda ver el problema


Título: Re: como inicializar una matriz char**
Publicado por: sebapoli00 en 2 Abril 2019, 00:58 am
Lo que busco es retornar un nuevo char ** ordenado segun la tabla ascii, recibo el vector y su largo

Entrada: (["ola","terremoto","area"], 3)
Retorno: (["area","ola","terremoto"])

Código
  1. char **ordenarVectorStrings(char **vectorStr, int largoVectorStr) {
  2. if(largoVectorStr > 0) {
  3. char **matriz;
  4. int filas = 1;
  5. matriz = new char*[filas];
  6. matriz[0] = new char[largoVectorStr]; // reservamos espacio para x columnas
  7. char * aux = *vectorStr;
  8. for (int i = 0; i < largoVectorStr; i++) {
  9. for (int j = 0; j < largoVectorStr; j++) {
  10. if (j + 1 < largoVectorStr) {
  11. if (comparar(vectorStr[j], vectorStr[j + 1])) {
  12. aux = vectorStr[j];
  13. }
  14. else {
  15. aux = vectorStr[j + 1];
  16. }
  17. }
  18. else {
  19. aux = vectorStr[j];
  20. }
  21. }
  22. matriz[0][i] = *aux;
  23. }
  24. return matriz;
  25. }
  26. else {
  27. return NULL;
  28. }
  29.  
  30. }
  31.  
  32. int comparar(char* a, char* b) {
  33. while (*a != '\0' && *b != '\0') {
  34. if (*a != *b) {
  35. return *a - *b;
  36. }
  37. a++;
  38. b++;
  39. }
  40. return *a - *b;
  41. }
  42.  
  43.  


Título: Re: como inicializar una matriz char**
Publicado por: K-YreX en 3 Abril 2019, 17:44 pm
Mientras que la función de <comparar()> es correcta, la de <ordenarVectorStrings()> no lo es. Tienes un lío bien montado ahí cuando la función es mucho más sencilla.
Además no necesitas devolver nada, puedes reordenar el array que pasas como parámetro simplemente.

Antes de nada si tienes errores hay que asegurarse de que el error no está en la entrada de datos. Por lo que te dejo aquí una forma de pedir las palabras y un algoritmo para ordenarlas. No te lo voy a dar hecho en C++ para no dártelo todo hecho, pero te servirá para guiarte:
Código:
// almacenar palabras
reservarFilas(palabras, cantidad_palabras)
para i := 0 hasta cantidad_palabras-1
    nueva_palabra := pedirPalabra()
    longitud := longitud(nueva_palabra)
    reservarColumnas(palabras[i], longitud)
    palabras[i] := nueva_palabra
fin para

// ordenar palabras
para i := 0 hasta cantidad_palabras-2
    para j := i+1 hasta cantidad_palabras-1
        si compararPalabras(palabras[i], palabras[j] > 0)
            intercambiar(palabras[i], palabras[j])
        fin si
    fin para
fin para

Espero que te sirva y si tienes alguna duda más o problema no olvides dejar tú código para poder corregir esos errores. :-X :-X