[C con Clase] mas dudas sobre matrices y punteros
Steven Davidson
steven en conclase.net
Vie Feb 9 04:08:45 CET 2007
Hola Francesc,
El pasado 2007-02-08 19:29:36, Francesc Cabecerans escribió:
FC> Hola de nuevo!
[CORTE]
FC> char *puntero;
FC> char cadena_de_caracteres[30]="";
FC> char matriz1[50][10][30]={"UNO", "DOS","TRES", etc....};
FC> char matriz2[50][10][30]={"UNObis", "DOSbis","TRESbis", etc....};
FC> ...
FC> char matrizn[50][10][30]={"UNOn", "DOSn","TRESn", etc....};
FC> ////////
FC> en la funcion main, mediante switch, hago
FC> puntero=matrizx[0][0]; (donde x es en cada caso del switch 1, 2 o lo que sea)
FC> funcion(void) //funcion que maneja la matriz elegida
FC> .....
FC> el problema que tengo es que ahora en la función tengo un puntero a una matriz bidimensional y aunque "hago las operaciones necesarias para acceder a la casilla que deseo", por ejemplo
FC> si la casilla deseada és (pos_x,pos_y)
FC> puntero [10*pos_x+pos_y];
FC> no puedo utilizar las funciones strcpy, strcat y similares.
FC> strcpy(cadena_de_caracteres,puntero[10*pos_x+pos_y]); //me da error!! POR QUÉ???
FC> que alternativas tengo? dónde me equivoco?
El error está en que 'puntero' no es una matriz bidimensional. Miremos la declaración:
char *puntero;
Por lo tanto, al acceder al elemento apuntado obtenemos un elemento de tipo 'char'; o sea, un carácter. Haces la siguiente invocación:
strcpy( cadena_de_caracteres, puntero[10*pos_x+pos_y] );
Veámosla de otra manera:
strcpy( char[], char );
Obviamente esto va en contra del prototipo de 'strcpy()':
char *strcpy( char *, char * );
Como no existe lingüísticamente una conversión de 'char' a 'char *', el compilador te da un error ya que los tipos no concuerdan y no existe una conversión implícita.
Según he entendido, para hacer lo que propones, tienes que usar las variables 'pos_x' y 'pos_y' al asignar el puntero. Esto es,
puntero = matrizx[pos_x][pos_y];
Ahora puedes hacer la copia de la cadena apuntada:
strcpy( cadena_de_caracteres, puntero );
Espero que esto te ayude.
Steven
Más información sobre la lista de distribución Cconclase