Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

No sé declarar funciones que devuelvan vectores

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: No sé declarar funciones que devuelvan vectores Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

necesitas devolver un ** o sea

long int **test(){...}

debes de manejarlo como apuntadores y controlar los indices.

Suerte.

WinMan
Volver arriba
Mensaje    Asunto: Responder citando

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 Very Happy 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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Entendido Responder citando

[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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Mensaje    Asunto: Responder citando

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
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.