 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
tyloya Master

Registrado: 20 Ago 2002Mensajes: 175
|
Publicado: Vie 25 Oct, 2002 11:12 am Asunto: No sé declarar funciones que devuelvan vectores |
|
|
Hola otra vez,
Este es un problemilla que tengo haaaaaaaace muuuuucho tiempo y que no he conseguido averiguar.
A mi me parece una tontería, pero cada vez que quiero declarar una función que devuelva un vector, me da error de sintaxis....Sabéis porqué es?
Ej.
long int [8][8](long int 1D[64])
{
return m;
} |
|
| Volver arriba |
|
 |
WinMan Invitado
|
Publicado: Vie 25 Oct, 2002 8:14 pm Asunto: |
|
|
necesitas devolver un ** o sea
long int **test(){...}
debes de manejarlo como apuntadores y controlar los indices.
Suerte.
WinMan |
|
| Volver arriba |
|
 |
Andrés Lt JG


Registrado: 30 Ago 2002Mensajes: 62Ubicación: Ramos Mejía
|
Publicado: Vie 25 Oct, 2002 9:04 pm Asunto: |
|
|
Claro, un array es una constante mientras que un puntero es una variable.
La dirección del array no se puede cambiar (hacerle un ++ por ejemplo), mientras que sí a un puntero.
Además, en esa línea no hay ni nombre de función!
long **funcion(long m1D[64])
{
long m2d[8][8];
for (int i = 0; i < 64; i++)
m2d[0][i] = m1D[i];
return m2d;
}
1) El nombre de las variables no puede empezar con número.
2) Como las filas de las matrices se guardan adyacentemente en la memoria, hacer la asquerosidad que hice ahí funciona igual (acceder a m2d[0][63] es lo mismo que a m2d[7][7]). _________________ "Todo es posible si Ud. no sabe de qué está hablando" |
|
| Volver arriba |
|
 |
tyloya Master

Registrado: 20 Ago 2002Mensajes: 175
|
Publicado: Sab 26 Oct, 2002 9:18 am Asunto: Entendido |
|
|
[quote="Andrés"]Claro, un array es una constante mientras que un puntero es una variable.
La dirección del array no se puede cambiar (hacerle un ++ por ejemplo), mientras que sí a un puntero.
Gracias a los dos por la aclaración,porque no sabía cómo hacerlo...por eso pregunte..jejeje
Una cosa, yo tenía pensado, que cuando declaras un vector....
p.e: int v[3], el nombre de la variable es un puntero, es decir
tenemos la dirección de comienzo del vector, de forma que podemos
acceder a los demás elementos incrementando su valor...
El problema esta al tener un array bidimensional....que no sé cómo se guarda en memoria para acceder a sus elementos..
Probaré con lo que me habéis dicho.
Hasta pronto y gracias por todo. |
|
| Volver arriba |
|
 |
KAYETANO Ens

Registrado: 04 Sep 2002Mensajes: 37
|
Publicado: Lun 28 Oct, 2002 3:44 pm Asunto: |
|
|
Hola
| Cita: | | Claro, un array es una constante mientras que un puntero es una variable. |
¡¿COMO?! que significa esa espresion ??? desde cuando un array es una constante ??? estoy alucinando con este post !!!
Y lo peor de todo es que sigue ...
| Cita: | | La dirección del array no se puede cambiar (hacerle un ++ por ejemplo), mientras que sí a un puntero. |
mi fustracion ha llegado a niveles historicos ¿¿ que significa esta otra frase ?? por mas que la leo no termino de entenderla, intento darle algun sentido y me es imposible.
Lo peor del tema es que si se tienen estas expresiones con un simple array, como explicaria el amigo Andrés un doble puntero ?? o mejor aun un doble puntero a una estructura?? y la definicion de objeto ??? tie que ser un flipe. _________________ Salu2
KAYETANO |
|
| Volver arriba |
|
 |
KAYETANO Ens

Registrado: 04 Sep 2002Mensajes: 37
|
Publicado: Lun 28 Oct, 2002 3:59 pm Asunto: |
|
|
Hola tyloya
me he quedado tan flipado con las explicaciones que se me ha olvidado contestarte.
Un array bidimiensional es un doble puntero, dando una explicacion basica un array de dos dimensiones o tabla ( yo lo suelo llamar asin ) se compone de un doble puntero que es el inicio de un array de punteros y cada uno de ellos es el inicio de un "array de datos" (por llamarlo de alguan forma). _________________ Salu2
KAYETANO |
|
| Volver arriba |
|
 |
WinMan Invitado
|
Publicado: Mar 29 Oct, 2002 12:06 am Asunto: |
|
|
Tomemos el dicho "Una imagen vale mas que mil palabras" y transformemoslo a nuestro lenguaje y queda "Un fragmento de codigo dice mas que mil palabras"
| Código: |
#define MAXI 5
#define MAXJ 10
int v[MAXI][MAXJ];
int ** const pv = v;
int i = 3, j = 7;
int u,w;
u = v[i][j]; /* expr 1 */
w = *(pv + (i * MAXJ + j)); /* expr 2*/
|
como ves v[i][j] es equivalente a *(pv + (i * MAXJ + j)), prueba el siguiente programa para confirmar, esta en C:
| Código: |
#include <stdio.h>
int indice(int i, int j, int JMax)
{
return (i * JMax) + j;
}
void main(void)
{
#define IMAX 5
#define JMAX 10
int v[IMAX][JMAX];
int ** const pv = v;
int i, j;
i = 3;
j = 9;
printf("\ni = %d, j = %d\n", i, j);
printf("(i * JMAX) + j = %d\n", indice(i, j, JMAX));
if(&v[i][j] == (pv + indice(i, j, JMAX))){
printf("Ok, el valor es el mismo\n");
}else{
printf("ERROR, el valor NO es el mismo\n");
}
getch();
}
|
Espero que con esto haya quedado claro.
Suerte
WinMan |
|
| Volver arriba |
|
 |
WinMan Invitado
|
Publicado: Mar 29 Oct, 2002 1:17 am Asunto: |
|
|
Un detalles que no puedo dejar en el tintero.
Cuando devuelvas un apuntador, ten cuidado de que ese apuntador no este apuntando a una arreglo estatico que se encuentre dentro de la función que regresa dicho valor, es un error clasico y que da muchos dolores de cabeza.
Ejemplo:
| Código: |
int *func(void)
{
int p[10];
.... /* operaciones con p */
.... /* operaciones con p */
return p; /* GRAVE ERROR, p va a desaparecer al salir */
}
int main(void)
{
int *q;
q = func();
q[5] = 1; /* Error, el arreglo a donde apunta q ya no existe */
}
|
Bueno, espero haber ayudado
Suerte.
WinMan |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|