como inicializar una matriz char**

Iniciado por sebapoli00, 1 Abril 2019, 22:21 PM

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

sebapoli00

hola, quisiera saber como inicializar una matriz char ** cuando me pasan por parametro filas y columnas, gracias.

K-YreX

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 (cpp) [Seleccionar]

int **matriz;
int filas = 4, columnas = 4;

matriz = new int* [filas]; // reservamos memoria en el puntero para tantos punteros como filas tenga la matriz
for(int i = 0; i < filas; ++i) // por cada fila
    matriz[i] = new int [columnas]; // reservamos espacio para x columnas

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

sebapoli00

Hola, he probado como tu dices, asi:

Código (cpp) [Seleccionar]

char **matriz;
int filas = 3;
int columnas = 5;
matriz = new char*[filas];
for (int i = 0; i < filas; i++)
matriz[i] = new char[columnas];


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

K-YreX

Coloca el resto de tú código para que pueda ver el problema
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

sebapoli00

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 (cpp) [Seleccionar]

char **ordenarVectorStrings(char **vectorStr, int largoVectorStr) {
if(largoVectorStr > 0) {
char **matriz;
int filas = 1;
matriz = new char*[filas];
matriz[0] = new char[largoVectorStr]; // reservamos espacio para x columnas
char * aux = *vectorStr;
for (int i = 0; i < largoVectorStr; i++) {
for (int j = 0; j < largoVectorStr; j++) {
if (j + 1 < largoVectorStr) {
if (comparar(vectorStr[j], vectorStr[j + 1])) {
aux = vectorStr[j];
}
else {
aux = vectorStr[j + 1];
}
}
else {
aux = vectorStr[j];
}
}
matriz[0][i] = *aux;
}
return matriz;
}
else {
return NULL;
}

}

int comparar(char* a, char* b) {
while (*a != '\0' && *b != '\0') {
if (*a != *b) {
return *a - *b;
}
a++;
b++;
}
return *a - *b;
}


K-YreX

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:

// 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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;