• Jueves 25 de Abril de 2024, 05:47

Autor Tema:  Matrices  (Leído 2487 veces)

Pacoqui

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Matrices
« en: Martes 25 de Mayo de 2004, 12:23 »
0
Vamos a ver, un asunto curioso.
Defino una matriz, con filas 1..2, y columnas 1..13.
Mediante una rutina, la cargo con valores, desde el elemento 1/1 al 1/13, y desde el 2/1 al 2/13. No utilizo para nada fila 0 ni columna 0.
Trabajo con estos elementos y el programa no me da un solo problema.
Por otro motivo, me pongo a revisar el programa, hecho con DEV Pascal (FreePascal), con el Insight (Debuger, valido tanto para Pascal como para C/C++) y veo que la matriz solo tiene 2 filas, la 0 y la 1, y 13 columnas, de la 0 a la 12.
Mi programa hace referencia a coordenadas que estan fuera de este rango, e incluso tengo puesta la directiva del compilador para controlar esto, y sin embargo no dice ni pio.
Ademas, en la matriz, indudablemente, no aparece ningun dato relacionado con la fila 2 de la misma, ya que para Insight no existe.
Y repito, el programa funciona perfectamente.
Entiendo es un problema del Insight, que se "trabuca" entre C y Pascal a la hora de manejar las matrices.

A la vista de esto, defino la matriz como 1..3 y 1..14, para filas y columnas, respectivamente, y entonces si que veo en el Insight 3 filas, 0,1 y 2, y catorce columnas, de la 0 a la 14. Y sin ningun otro cambio, el programa sigue funcionando como antes.

Alguien me confirma el fallo del Insight?
Si no fallara el Insight, pensaria en que el compilador, a pesar de la directiva, no me ha controlado en el primer caso los rangos minimo y maximo de la matriz, y que al ejecutar el programa, los datos han quedado en memoria, al estar manejados por punteros, y que el programa funciona de chiripa.

Perdon por el ladrillo.

Pacoqui.-

Soy nuevo, asi que saludos para todos.

FSR

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Matrices
« Respuesta #1 en: Martes 25 de Mayo de 2004, 12:59 »
0
A mi parecer, la disminución en una unidad de los límites de la Matriz son sólo para manejo Interno. Lo importante es que puedas utilizar los índices establecidos en la declaración sin problemas. Saludos ;)

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Matrices
« Respuesta #2 en: Martes 25 de Mayo de 2004, 16:44 »
0
Cita de: "Pacoqui"
Alguien me confirma el fallo del Insight?
No existe fallo de ningún tipo. Es mejor que te acostumbres a usar matrices cuya primera fila/columna es 0.

En pascal tienes la comodidad de comenzar tus vectores y matrices de valores distintos de 0, pero siempre ten en mente que internamente, por sobradas razones (ya te darás cuenta), siempre comenzarán de 0 al igual que en C. Por eso es que nunca tendrás problemas de índices fuera de rango ya que al hacer referencia en pascal a la posición [3,3] de una matriz cuya primera fila y columna son [1,1], en realidad el código máquina generado hace referencia a la posición [2,2] en una matriz cuya primera fila y columna son [0,0]

A medida que eleves tu nivel de programación te irás dando cuenta de las ventajas que tienes al comenzar de 0. El 0 es el primero. Como sabemos la idea de comenzar por 1 es culpa de la herencia romana que eran ignorantes de la existencia del 0 y tenían el más ridículo de los sistemas de numeración que no sirve ni para sumar menos para multiplicar.

Pacoqui

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Matrices
« Respuesta #3 en: Martes 25 de Mayo de 2004, 21:27 »
0
Vamos a ver.:
No te digo que no a lo que expones, porque el programa funcionaba, tal y como te dije.
Observa.:
type
matriz=array [1..2,1..13] of integer;
var
cadena : matriz;

tratada por ejemplo como sigue.:

     cadena[1,1]:=13;
     cadena[2,1]:=10;
     cadena[1,2]:=14;
     cadena[2,2]:=10;
     cadena[1,3]:=15;
     cadena[2,3]:=10;
     cadena[1,4]:=16;
     cadena[2,4]:=10;
     cadena[1,5]:=17;
     cadena[2,5]:=10;
     cadena[1,6]:=18;
     cadena[2,6]:=10;
     cadena[1,7]:=19;
     cadena[2,7]:=10;
     cadena[1,8]:=20;
     cadena[2,8]:=10;
     cadena[1,9]:=21;
     cadena[2,9]:=10;
     cadena[1,10]:=22;
     cadena[2,10]:=10;
     cadena[1,11]:=23;
     cadena[2,11]:=10;
     cadena[1,12]:=24;
     cadena[2,12]:=10;
     cadena[1,13]:=25;
     cadena[2,13]:=10;

     for x:=1 to 2 do
         begin
              for y:=1 to 13 do
                  begin
                       Write(cadena[x,y], ' ');
                  end;
              WriteLn;
         end;

La impresion funciona, indudablemente

       
Hasta aqui todo bien, matriz de 2x13.

Se supone que si empieza por cero, es decir, hace una matriz de 0,1 filas, 0..12 columnas, al acceder a sus elementos, segun tengo escrito, o bien el compilador es inteligente de cojones y rebaja en 1 esas coordenadas, o bien se pasa por el forro lo de los rangos.
La cosa es que el programa, curiosamente, funciona.

Y sigue la cosa, lo ejecuto con Insight, y dejo a continuacion un archivito, donde se ve la matriz una vez cargada con los valores iniciales antes descritos.

La fila 0 esta vacia.
La fila 1 esta cargada. indudablemente, aunque con 12 columnas rellenas.
La fila 2 no existe.

Y repito, el programa funciona.

Insisto que el Insight no trabaja bien con las matrices y que seguramente el programa, internamente, esta haciendo lo que tu dices. No veo otra explicacion.

Ciao.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Matrices
« Respuesta #4 en: Lunes 31 de Mayo de 2004, 07:19 »
0
hmmm... Ya veo.

Es probable que el  Insight definitivamente fué programado y verificado sólo con matricies estilo C, que siempre comienzan de 0 y por eso que da problemas cuando la matriz aparentemente comienza de 1: Internamente comienza de 0 (lo que explica que la fila 2 no existe), pero luego erroneamente anula la posición 0, (en ese caso considera que se comienza por 1) y el resultado es tener la fila 0 toda vacía.

blannasa

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Matrices
« Respuesta #5 en: Martes 1 de Junio de 2004, 02:38 »
0
holap andaba por aqui y me econtre con esta cosilla asi que vi he intente ver que pasaba asi que esto si funciona y no tengo ningun error al mostrar :whistling:

program matriz(input,output);
type
matriz=array [1..2,1..13] of integer;
var
cadena : matriz;
x,y:integer;
begin
     cadena[1,1]:=13;     cadena[2,1]:=10;
     cadena[1,2]:=14;     cadena[2,2]:=10;
     cadena[1,3]:=15;     cadena[2,3]:=10;
     cadena[1,4]:=16;     cadena[2,4]:=10;
     cadena[1,5]:=17;     cadena[2,5]:=10;
     cadena[1,6]:=18;     cadena[2,6]:=10;
     cadena[1,7]:=19;     cadena[2,7]:=10;
     cadena[1,8]:=20;     cadena[2,8]:=10;
     cadena[1,9]:=21;     cadena[2,9]:=10;
     cadena[1,10]:=22;     cadena[2,10]:=10;
     cadena[1,11]:=23;     cadena[2,11]:=10;
     cadena[1,12]:=24;     cadena[2,12]:=10;
     cadena[1,13]:=25;     cadena[2,13]:=10;
     for x:=1 to 2 do
     begin
          for y:=1 to 13 do
               Write(cadena[x,y], ' ');
          WriteLn;
     end;
     readln
end.  

asi que no se cual es el problema  :huh:  chau  :hola: