[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