matriz de estructuras

Iniciado por codX, 6 Abril 2019, 01:23 AM

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

codX

Hola que tal?, tengo el siguiente código


#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
#include <pthread.h>
struct casillas{
WINDOW *casilla;
};

void iniVideo();
struct casillas panel();
void mostrar(struct casillas casillero[10][10], int, int, int);
void fin();


int main()
{
iniVideo();
int x = 2;
int y = 3;
struct casillas casillero[10][10];
casillero[10][10] = panel();
mostrar(casillero[10][10], 69, x, y);
fin();
return 0;
}


void iniVideo()
{
initscr();
start_color();
init_pair(1, 0, 7); //letras, fovdo. menu
init_pair(2, 7, 0); // panel números
init_pair(3, 0, 2); // casilla x
init_pair(4, 0, 6);
cbreak();
noecho();
keypad(stdscr, true);
curs_set(0);
refresh();
}


struct casillas panel()
{
struct casillas casillero[10][10];
int k, i, y, x;

y = 5;
x = 16;

//casillas
for(i = 0; i < 10; i++)
{
for(k = 0; k < 10; k++)
{
casillero[i][k].casilla = newwin(3, 6, y, x);
box(casillero[i][k].casilla, 0,0);
wbkgd(casillero[i][k].casilla, COLOR_PAIR(2));
wrefresh(casillero[i][k].casilla);
x+=6;
}
y+=3;
x = 16;
}
return casillero[10][10];
}

void mostrar(struct casillas casillero[10][10], int num, int x, int y)
{

mvwprintw(casillero[x][y].casilla, 2, 1, "%i",num);
wrefresh(casillero[x][y].casilla);
}

void fin()
{
getch();
endwin();
exit(0);
}


El cual en la línea del mani casillero[10][10] muestra la matriz creada, pero cuando invoco la funcion que sigue 'mostrar(casillero[10][10], 69, x, y);' me da el siguiente error: note: expected 'struct casillas (*)[10]' but argument is of type 'struct casillas'
void mostrar(struct casillas casillero[10][10], int, int, int);

Alguien podría ayudarme por favor?
Gracias.

K-YreX


mostrar(casillero[10][10], 69, x, y);

El error está ahí porque como te dice el propio error, la función está esperando un puntero de arrays (es decir, una matriz) y tú le estás pasando un elemento concreto de esa matriz (la casilla [10][10] de la matriz, la cual además se sale de los límites). La opción correcta sería:

mostrar(casillero, 69, x, y);
Código (cpp) [Seleccionar]

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

codX

Hola, gracias por tu tiempo. Por qué dices que la matriz se pasa de los límites?

K-YreX

Porque si tienes una matriz de 10x10, su último elemento es matriz[9][9]. Entonces aparte de que está mal pasado el parámetro, solo he comentado que esa posición además no es válida. Era solo un comentario extra que no era necesario para solucionar el problema, pero nunca está de más :-X
Código (cpp) [Seleccionar]

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

codX

Entiendo. Muchísimas gracias por tu ayuda. Buen finde!  :D

codX

Hola YreX-DwX, volví. Cómo podría hacer, teniendo en cuenta el código anterior para que al llamar a la funcion
void mostrar(struct casillas casillero[10][10], int num, int x, int y)
anote en el casillero dado (x,y) el valor dado(num). ya que no logro cambiar los valores iniciales de la matriz. gracias y disculpá la molestia

K-YreX

Tu matriz <casillero> es una matriz donde cada celda es un objeto de tipo <casillas>. Y cada objeto de tipo <casillas> sólo contiene un puntero de tipo <WINDOW>.
Nunca he trabajado con ello pero por lo que veo en tu código anterior parece que se inicializa usando <newwin(a, b, x, y) donde no sé que es a y b pero si uno de esos dos valores es el que quieres sustituir por <num> simplemente pasa <num> como parámetro.

Sin embargo <newwin()> ya lo usas en la función <panel()> por lo que estarías creando el doble de objetos.
Además en la línea 21 de tu primer código tienes un error, no puedes asignar <panel()> (función que devuelve una casilla) a <casillero[10][10]> por lo que te comenté de que esa posición se sale de los límites de tu matriz.

Si me comentas que hacen las funciones que estás usando y que representan los parámetros quizás pueda ayudarte más.
Código (cpp) [Seleccionar]

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

codX

YreX-DwX, to logré hacer que el programa funcione, pero el código no es el que prefiero hacer.
declaré la estructura casillas casillero[10][10] como variable global.
la funcion struct casillas panel() devuelve una matriz que en realidad son 10x10 ventanas enlas que quiero ingresar un valor x pasado por parámetro.
Mi idea es usar ese panel en otra parte del codigo parte del codigo y asignarle valores ingresados por teclado
Por eso en la funcion ing_resp_mostrar_result(struct casillas casilleros_panel[10][10], int x, int y, int producto, int mov) es la responsable de llenar la matriz con valores ingresados por el usuario

K-YreX

A lo que me refiero es que qué función de las que ya existen o que método hay para asignar un valor a un <WINDOW *> ya que desconozco su uso, entonces no puedo ayudarte más específicamente.
Código (cpp) [Seleccionar]

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

codX

te entiendo perfectamente YreX-DwX. El problema es que sería demasiado rollo pasarte todo el código. Igualmente vuevlo a agradecer mucho tu tiempo y disposición a ayudar. Que tengas un lindo fin de semana. !!