Pasar matriz como parámetro

Started by HaCkZJuaNN, February 20, 2009, 06:51:42 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

HaCkZJuaNN

Si no me equivoco, para pasar una matriz como parámetro, hay que pasar un puntero al primer elemento y la longitud de la matriz, no?

Se pueden pasar matrices de más de una dimensión de este modo?

Es que tengo lo siguiente
[code language="bennu"]
function jmath_media_ponderada(jmath_numero numeros, int longitud, jmath_numero resultado) //numeros = jmath_numero[longitud][2], con numeros
  • [1] = valor y numeros
  • [2] = ponderacion
    begin
       for(numero_actual = 1; numero_actual++; numero_actual <= longitud)
          jmath_producto(numeros[numero_actual][1],numeros[numero_actual][2],resultado_numero_actual)
          jmath_suma(resultado_actual,resultado_numero_actual,resultado_actual);
          jmath_suma(numeros[numero_actual][2],denominador_actual,denominador_actual);
       end
       jmath_division(resultado_actual,denominador_actual,resultado);
    end
    [/code]

    Y me da el siguiente error en la línea después del for: ")" expected (1)

    numeros es un puntero puesto que los tipos definidos siempre se pasan como punteros.

    Gracias por todo y un saludo.

SplinterGU

no se los prototipos de las otras funciones... pero acostumbrate a usar &
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

Con todos los punteros y follones que manejo, el código se haría ilegible, pero ya lo hablé contigo y entendí que mientras tenga claro qué son punteros y qué no lo son no hay problema...

Con respecto al problema en sí, dónde está el fallo?

SplinterGU

es que no siempre por mas que sea una matriz si pasas el elemento se pasa como puntero

si yo tengo esto

int a[10];

y paso

a o &a

entonces paso el puntero

ahora si paso

a[0] o a[1]

entonces paso su valor...

pero si paso

&a[0] o &a[1]

entonces si paso el puntero
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

#4
Ya, pero es que mi matriz no es de ints, sino de jmath_numero, por lo que cada elemento se pasa como puntero también. No obstante, voy a probar lo que dices y ahora te digo.

EDIT: No funciona. Por cierto, el error que me da es de compilación, no hay ninguna llamada a esa función todavía, sólo estaba probando si compilaba.

[code language="bennu"]function jmath_media_ponderada(jmath_numero pointer numeros, int longitud, jmath_numero resultado) //numeros = jmath_numero[longitud][2], con numeros
  • [1] = valor y numeros
  • [2] = ponderacion
    begin
       for(numero_actual = 1; numero_actual++; numero_actual <= longitud)
          jmath_producto((*numeros)[numero_actual][1],(*numeros)[numero_actual][2],resultado_numero_actual)
          jmath_suma(resultado_actual,resultado_numero_actual,resultado_actual);
          jmath_suma((*numeros)[numero_actual][2],denominador_actual,denominador_actual);
       end
       jmath_division(resultado_actual,denominador_actual,resultado);
    end[/code]

    Falla también

laghengar

creo que estás fallando en el "*numeros", al ser "numeros" ya un puntero por declararle como "pointer", solo tendrías que poner "numeros".
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

HaCkZJuaNN

También lo he probado, y falla en el 1, la primera dimensión la tolera, pero la segunda parece que no...

HaCkZJuaNN

Por las pruebas que he hecho, estoy casi seguro de que el problema es que la matriz tiene 2 dimensiones. Se trata de un bug, de una limitación lógica, o para utilizar matrices de varias dimensiones hay que hacerlo de otra manera???

HaCkZJuaNN

Otra cosa más, el for tenía una cosa al revés xD pero eso no era lo que causaba el error. Al final lo estoy haciendo separando la matriz en varias matrices unidimensionales, porque en este caso no importa, pero me gustaría saber si se puede hacer con matrices de más de una dimensión para otros posibles casos. De nuevo gracias.

SplinterGU

1) la linea despues del for te falta el ";" ?
2) claro, esta mal como lo estas usando...
"numeros" =  "jmath_numero pointer"

al hacer "numeros[numero_actual]" o "(*numeros)" ya consumiste el pointer... por ende no podes luego hacer un "[1] y mucho menos un "[numero_actual][1]"...

no va, esta mal usado...

EDIT: perdon pero antes no habia prestado mucha atencion al codigo, solo al texto... seria bueno tambien que pongas la declaracion del tipo, aunque en este caso no hace al problema.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

Bueno, entonces cómo tengo que usarlo? no he puesto aquí todas las combinaciones que he probado, y parece que lo más que logra es entender la primera dimensión, pero la segunda no.

Se puede o no se puede utilizar una matriz de 2 dimensiones como parámetro??

SplinterGU

#11
si, claro que si...

suponiendo que queremos direccionar por [ a ][ b ] es...

numeros[(a)*ancho_del_array+(b)]
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

:O, ancho es la longitud de la segunda dimensión según lo entiendo no?

Nunca se me hubiera ocurrido. Para tres dimensiones, si queremos ir a [code language="bennu"]
[a][c], siendo [a] largo, ancho y [c] alto(por ejemplo) habría que hacer lo siguiente, no?

matriz[(a)*ancho*alto+(b)*alto+(c)]

[/code]
no??

Perdón pero es que quiero tener esto claro :) y gracias de nuevo.

SplinterGU

toda matriz es un vector...

de otra forma...

[dimension1] [dimension2] [dimension3]

matriz[(dimension1)*size_dimension2*size_dimension3+(dimension2)*size_dimension1+dimension1]
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

pero igual no es aconsejable trabajar de esta forma... las operaciones significarian un consumo bastante importante.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2