<div dir="ltr"><div><div><div>Hola Horacio, muchas gracias por la ayuda.<br><br></div>Esos dos artículos tratan sobre arrayes unidimensionales, se entienden y no radica ahí el problema.<br><br></div>Mi problema / duda surge al intentar interpretar la forma correcta en que debería pasarle un array bidimensional a una función, ya que el compilador lo interpreta como un puntero doble (si en el prototipo declaro que es un puntero simple, da Warning) pero si lo utilizo como puntero doble da error, ya que no es un puntero a punteros sinó que apunta a direcciones contiguas de memoria con el contenido de los datos en forma ordenada, según la posición mas el índice. Es decir, a mi entender, el compilador entiende que es un puntero doble pero lo trata como uno simple y ahí aparecen mis confusiones.<br><br></div><div>La solución especificando que tipo entradas exige y haciendo casting de variables, ya sea antes o después de la función, pero estoy seguro que estoy haciendo algo mal y que hay una explicación y una solución mas elegante y correcta.<br><br></div><div>Dado:<br></div><div>float numeros[5][5];<br><br></div><div>Con el prototipo:<br></div><div>Pasar(float **numeros);<br><br></div><div>Si adentro de la función lo utilizo como un puntero a float, da warning. Para subsanarlo utilizo un cast a (float *)<br></div><div>Si adentro de la función lo utilizo como puntero doble da error (ya que no es un puntero a punteros)<br><br></div><div>Si el prototipo es:<br></div><div>Pasar(float *numeros);<br></div><div>Da warning, el compilador entiende que numeros[][] es un puntero a puntero, puedo castearlo con (float *).<br><br></div><div>El problema es que mediante las técnicas que se me ocurren, siempre tengo que castearlo para evitar errores y eso me hace pensar que estoy haciendo las cosas mal, o que tengo un error conceptual. Es así?<br></div><div><br></div><div>Saludos y gracias<br></div><div>Diego<br><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">El 11 de junio de 2015, 11:20, Horacio Peñafiel <span dir="ltr"><<a href="mailto:horacio.penafiel@donweb.com" target="_blank">horacio.penafiel@donweb.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Diego, buscando en la web, encontré
      estos dos sitios, por ahí ayude a clarificar el tema:<br>
      <br>
      <b><a href="http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c" target="_blank">http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c</a></b><b><br>
      </b><b><a href="http://www.le.ac.uk/users/rjm1/cotter/page_59.htm" target="_blank">http://www.le.ac.uk/users/rjm1/cotter/page_59.htm</a></b><b><br>
      </b><br>
      Saludos!<br>
      <br>
      ing. Horacio Peñafiel<div><div class="h5"><br>
      <br>
      <br>
      El 11/06/2015 a las 11:08 a.m., Diego escribió:<br>
    </div></div></div><div><div class="h5">
    <blockquote type="cite">
      <pre>Comento y pregunto, mas que nada, por una cuestión académica.

Lo que me llevó a pensar que se trataba de un doble puntero es que si
no paso como parámetro un float * da warning ya que entiende que
referencia[5][5] es un doble puntero y no uno simple (fácilmente se
subsana con un cast), a alguien se le ocurre porque asume que el
compilador entiende que un float [5][5] debe ser direccionado como
puntero doble según los warnings, pero es es tratado como puntero
simple?

Saludos!
Diego

El día 10 de junio de 2015, 17:48, Diego <a href="mailto:diegogeid@gmail.com" target="_blank"><diegogeid@gmail.com></a> escribió:
</pre>
      <blockquote type="cite">
        <pre>Hola, gracias a ambos. Ambos tienen razón en decir que los arrays
bidimensionales no se tratan de igual forma que punteros dobles, no
los organiza de esa forma.

El error surgió porque, tal como un array se puede direccionar como
una variable a puntero debido a su organización de memoria, asumí que
un array bidimensional se puede interpretar como un array de punteros
a punteros, NO SE ORGANIZA ASÍ EN MEMORIA, en realidad es un array de
[MxN], de esa forma, Horacio, la solución que brindas solo sirve para
los elementos de la primera fila. El parámetro a pasar, como bien
indicas Horacio es un puntero a float, y para utilizar el elemento M,
N debería usar referencia[M*5+N], creo que es la solución que indicás
Felipe, o definir el pasaje de referencia como referencia[5][5] en el
prototipo de la función, o en un tercer caso, definir como puntero a
puntero correctamente, inicializar y ahí direccionar como hice adentro
de la función. Ese caso sería mas eficiente si voy a utilizar varias
veces los índices.

Finalmente, Felipe, entiendo que puede haber diferencias en el tamaño
de datos, pero no creo que influya el tamaño de datos en el problema,
siempre que se asigne correctamente como puntero a float, mas allá de
la arquitectura, agradezco si es una aclaración, si es una confusión,
no dudes en plantearla.

Saludos y gracias a ambos!
Diego





El día 10 de junio de 2015, 17:03, Felipe Valencia <a href="mailto:anfevp@gmail.com" target="_blank"><anfevp@gmail.com></a> escribió:
</pre>
        <blockquote type="cite">
          <pre>Hola,

Esencialmente existe una diferencia entre como se organizan los dople
punteros y las matrices de dos dimensiones. Las marices de dos dimensiones
se organizan consecutivamente y los dobles punteros estan esparcidos en
memoria.

Mira este enlace
<a href="http://stackoverflow.com/questions/4470950/why-cant-we-use-double-pointer-to-represent-two-dimensional-arrays" target="_blank">http://stackoverflow.com/questions/4470950/why-cant-we-use-double-pointer-to-represent-two-dimensional-arrays</a>
(Ingles)

De hecho en la posicion test[1] esta el valor de la siguiente linea, seria
un 6 si continuaras con la inicializacion, y en la posicion referencia[1]
sera leida como la direccion de la siguiente linea.

Ademads en PC de  64 bits los punteros son de 64 bits y los float son de 32
bits. Agrega la linea printf("Size %d %d \n",sizeof(float*),sizeof(float));

Yo usualmente en estos casos uso matrices de una dimension en vez de dos
dimensiones, y calculo los indices, o solo uso punteros reservando memoria
con malloc o new.

Ademas uso como IDE eclipse el cual trae un debuggeador donde puedes vez los
valores en memoria, supongo que Code::Blocks tambien debe mostrar memoria


Chao!!




El 10 de junio de 2015, 20:17, Diego <a href="mailto:diegogeid@gmail.com" target="_blank"><diegogeid@gmail.com></a> escribió:
</pre>
          <blockquote type="cite">
            <pre>Hola, saludos a todos.

Aparentemente estoy teniendo un error conceptual. Copio el código
abajo. Alguien podría ayudarme?

Al intentar acceder a un elemento del aray desde el main no tengo
problemas, pero al intentar acceder desde una función el programa
retorna al sistema operativo un código de error (0xC0000005) y
porsupuesto que no continúa.

Según los printf, los punteros apuntan a la misma posicion de memoria
tanto en el main como en la función, que estoy haciendo mal?

PD: estoy compilando en Windows mediante Code::Blocks en Windows
mediante gcc, el error que da, según google, corresponde a una
violación de acceso a memoria.

Saludos y gracias!

----------------------------------------------

#include <stdio.h>
#include <stdlib.h> //No es necesario

void probar(float **referencia)
{

    printf("La posición de memoria donde empieza el array
multidimensional es %p\n", referencia);

//No imprime el siguiente printf y vuelve al ssitema con un error
0xC0000005

    printf("test: %f %f...!\nPuntero: %p\n", referencia[0][0],
referencia[0][1], referencia);
}

int main()
{
    float test[5][5]={1, 2, 3, 4, 5};

    printf("La posición de memoria donde empieza el array
multidimensional es %p\n", test);

    printf("test: %f %f...!\nPuntero: %p\n", test[0][0], test[0][1],
test);

    probar(test);

    return 0;
}

_______________________________________________
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a>
</pre>
          </blockquote>
          <pre>


--
Andrés Felipe Valencia P
MSc student
ALaRI - Advanced Learning and Research Institute USI - Università della
Svizzera Italiana
Via Giuseppe Buffi 13, Lugano CH-6904, Switzerland
Mobile: + 41 076 822 27 57

_______________________________________________
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a>
</pre>
        </blockquote>
      </blockquote>
      <pre>_______________________________________________
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a>
</pre>
    </blockquote>
    <br>
    <br>
    </div></div><div>-- <br>
      <u></u><u></u>
      <table style="width:100.0%;background:white;background-image:initial;background-repeat:initial" bgcolor="white" border="0" cellpadding="0" cellspacing="0" width="100%">
        <tbody>
          <tr>
            <td style="width:102.5pt;padding:0cm 10.0pt 0cm 10.0pt" width="137">
              <p class="MsoNormal" style="text-align:center" align="center"> <font face="Arial" size="1"><span style="font-size:9.0pt;font-family:Arial"> <img src="cid:part1.02050702.08050402@donweb.com" height="54" width="110"></span></font><u></u><u></u></p>
            </td>
            <td style="border:none;border-left:solid #cccccc 1.0pt;background:#f0f0f0;padding:8.0pt 8.0pt 8.0pt 8.0pt" bgcolor="#F0F0F0">
              <p style="margin-right:0cm;margin-bottom:0pt;margin-left:0cm"> <b><font face="Arial" size="1"><span style="font-size:8.5pt;font-family:Arial;font-weight:bold">Ing. Horacio
                      Peñafiel</span></font></b><br>
                <b><font face="Arial" size="1"><span style="font-size:8.5pt;font-family:Arial;font-weight:bold">Senior
                      Software Developer</span></font></b></p>
              <b><font face="Arial" size="1"><span style="font-size:8.5pt;font-family:Arial;font-weight:bold">Departamento
                    Desarrollo</span></font></b>
              <p style="margin-right:0cm;margin-bottom:7.0pt;margin-left:0cm"> <b><font face="Arial" size="1"><span style="font-size:8.5pt;font-family:Arial;font-weight:bold">DonWeb </span></font></b><font face="Arial" size="1"><span style="font-size:8.5pt;font-family:Arial"><br>
                    <u></u>La
                      Actitud Es<u></u> Todo<br>
                    <a><font color="black"><span style="color:windowtext">www.DonWeb.com</span></font></a></span></font><font size="2"><span style="font-size:10.0pt"><u></u><u></u><u></u><u></u></span></font></p>
              <div>
                <p class="MsoNormal">
                  <font face="Arial" size="1"><span style="font-size:9.0pt;font-family:Arial"><u></u> <u></u></span></font><u></u><u></u></p>
              </div>
            </td>
          </tr>
        </tbody>
      </table>
      <div>
        <div class="MsoNormal" style="text-align:center" align="center">
          <font face="Courier New" size="2"><span lang="ES-AR">
              <hr align="center" size="2" width="100%"> </span></font>
        </div>
        <p class="MsoNormal"> <font face="Arial" size="1"><span style="font-size:9.0pt;font-family:Arial" lang="ES-AR">Nota
              de confidencialidad: Este mensaje y archivos adjuntos al
              mismo son confidenciales, de uso exclusivo para el
              destinatario del mismo. La divulgación y/o uso del mismo
              sin autorización por parte de DonWeb.com queda prohibida.<br>
            </span><span style="font-size:9.0pt;font-family:Arial">DonWeb.com no se hace responsable del mensaje por
              la falsificación y/o alteración del mismo.<br>
              De no ser Ud el destinatario del mismo y lo ha recibido
              por error, por favor, notifique al remitente y elimínelo
              de su sistema.</span></font><font size="1"><span style="font-size:9.0pt"><u></u><u></u></span></font></p>
        <p class="MsoNormal"> <font face="Arial" size="1"><span style="font-size:9.0pt;font-family:Arial">Confidentiality
              Note: This message and any attachments (the message) are
              confidential and intended solely for the addressees. Any
              unauthorised use or dissemination is prohibited by
              DonWeb.com.<br>
              DonWeb.com shall not be liable  for the message if altered
              or falsified.<br>
              If you are not the intended addressee of this message,
              please cancel it immediately and inform the sender</span></font><font size="1"><span style="font-size:9.0pt"><u></u><u></u></span></font></p>
        <p class="MsoNormal"> <font face="Arial" size="1"><span style="font-size:9.0pt;font-family:Arial">Nota de
              Confidencialidade: Esta mensagem e seus eventuais anexos
              podem conter dados confidenciais ou privilegiados.<br>
              Se você os recebeu por engano ou não é um dos
              destinatários aos quais ela foi endereçada, por favor
              destrua-a e a todos os seus eventuais anexos ou copias
              realizadas, imediatamente.<br>
              É proibida a retenção, distribuição, divulgação ou
              utilização de quaisquer informações aqui contidas.</span></font><font size="1"><span style="font-size:9.0pt"><u></u><u></u></span></font></p>
        <p class="MsoNormal"> <font face="Arial" size="1"><span style="font-size:9.0pt;font-family:Arial" lang="ES-AR">Por
              favor, informenos sobre o recebimento indevido desta
              mensagem, retornando-a para o autor.</span></font><font size="1"><span style="font-size:9.0pt"><u></u><u></u></span></font></p>
        <u></u><u></u>
      </div>
    </div>
  </div>

<br>_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br></blockquote></div><br></div>