Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 2 de 2
Ir a la página Anterior  1, 2
 
Comparar Dos Arrays Dinámicos O Nativos
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
Cada dato ocupa una celda de memoria, y cada celda de memoria tiene su propia dirección. Pero los datos, que pertenecen a un único grupo (de mismo o de diferentes tipos), son guardados en memoria en manera [i]continua[/i].

 


esto no es rigurosamente cierto en el caso de arrays de estructuras , en este caso cada estructura tiene su propia direccion de memoria y no necesariamente son contiguas
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
Private Extern memcmp(__s1 As Pointer, __s2 As Pointer, __n As Long) As Integer

  Dim ii1, ii2 As Integer[]
  Dim i As Integer
  
   ii1 = [1111, 222222]
   ii2 = [1111, 222223]
  
   i = memcmp(ii1.Data, ii2.Data, (ii1.Count * SizeOf(gb.Integer)))
 


Esto me ha dado ideas de como hacer funciones que no estan presentes en G3 para Struct.
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
tercoIDE escribió: [Ver mensaje]
esto no es rigurosamente cierto en el caso de arrays de estructuras, en este caso cada estructura tiene su propia direccion de memoria y no necesariamente son contiguas

Exactamente, porque se trata de un tipo complejo, constituido por una propia area de memoria, reservada para contener tipos atomicos y complejos.
Pero, en el array de Estructuras (y tambien en una Estructura contenente Estructuras), las direcciones de memoria de cada elemento-Estructura están guardadas - en aquel area de memoria - sin embargo de manera contigua.

Vamos a ver lo que resulta desde este codigo:
#include <stdio.h>
#include <stdlib.h>


struct Terziaria {
        unsigned char uc;
        short sh;
        int in;
};

struct Secondaria {
        unsigned char uc;
        short sh;
        int in;
};


struct Principale {
        struct Secondaria *se;
        struct Secondaria *te;
};


int main () {

        int i;

        struct Principale *pr = malloc(sizeof(struct Principale));

        pr->se = malloc(sizeof(struct Secondaria));
        pr->te = malloc(sizeof(struct Terziaria));

        for (i=0; i<16; i++)
                printf("%d  =  %.2x\n", i, *((unsigned char *) pr + i) );

       free(pr->te);
       free(pr->se);
       free(pr);

        return (0);

}


Usando en Gambas el array de tipo Variant[ ], la organización de los valores en su área de memoria reservada es muy particular; y es posible verla en el achivo fuente " .../main/share/gambas.h ".
En este archivo hay la Estructura, escrita en C, llamada "GB_VARIANT", costituida:
a) por un valor de tipo Long (y por eso ocupa 8 byte de memoria), que identifica el tipo de valor que lo sigue. En particular el tipo está identificado por el correspondiente número presente arriba por aquel archivo en las definiciones llamadas "gambas datatypes identifiers".
b) los datos del valor (que ocupa 8 byte por la "union" que es el 2° miembro de la Estructura fuente del Variant)

Por lo que el área de memoria - donde están guardados los valores de un array de tipo Variant[ ] - está asì organizada:
número-tipo
datos-que-constituyen-el-valor
número-tipo
datos-que-constituyen-el-valor
....etc
....etc

Public Struct PRIMA
  b As Byte
  c As Short
End Struct

Public Struct SECUNDA
  c As Short
  i As Integer
End Struct


Public Sub Main()

  Dim var As Variant[]
  Dim pr As New PRIMA
  Dim se As New SECUNDA
  Dim i As Integer
  Dim b, c As Short
  
   var = [pr, se]
  
   For i = 0 To var.count * SizeOf(gb.Variant)
     Print i, Hex(Byte@(var.Data + i), 2)
   Next
  
   Print "\n----------------------\n"

   b = 99
   c = 128
  
   var = [b, c]
  
   For i = 0 To var.count * SizeOf(gb.Variant)
     Print i, Hex(Byte@(var.Data + i), 2)
   Next

End


Si el tipo es un array o una Estructura, en el miembro - que arriba yo he llamado datos-que-constituyen-el-valor - nosotros tendremos una dirección de memoria.


De todas formas está claro que la dirección del area de memoria de un array de Estructuras es un " Puntero de Punteros ": es decir el "Puntero" apunta a un área de memoria (más precisamente a la primera celda de aquel area) contenente direcciones de areas de memoria de aquellas Estructuras (cada dirección apunta a un especifica área de memoria; y más precisamente cada dirección apunta a la primera celda de cada área).
 



 
última edición por vuott el Lunes, 19 Marzo 2018, 16:05; editado 7 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
...otro ejemplo:

Public Sub Main()

  Dim arr As String[] = [&H7F, &H7F, &H04, &H01, 0, 0]
  Dim i As Integer

   c = (SizeOf(gb.Pointer) * arr.Count) - 1
 
   For i = 0 To c
     If i Mod 8 == 0 Then Write "------------ elem. índice " & CStr(i \ SizeOf(gb.Pointer)) & Chr(&0A)
     Print i, Hex(Byte@(arr.Data + i), 2)
   Next
  
   Print "=============="
  
   For i = 0 To c
     Print i, String@(Pointer@(arr.Data + i))
   Next

End

 



 
última edición por vuott el Miercoles, 21 Marzo 2018, 17:17; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Acerca De Arreglos Dinámicos De Clases De... santijav Controles/Librerías/Componentes 1 Lunes, 30 Diciembre 2013, 22:28 Ver último mensaje
jsbsan
No hay nuevos mensajes Leer Md5 De Gamba Y Comparar Con Md5 De Php nelsondiaze Aplicaciones/Fragmentos de Código 1 Martes, 13 May 2014, 22:04 Ver último mensaje
jsbsan
No hay nuevos mensajes Mostrar Arrays Dentro De Otro Arrays Shell General 9 Domingo, 07 Diciembre 2014, 20:30 Ver último mensaje
Shell
No hay nuevos mensajes Comparar Coordenadas En Un GridView Guizans General 7 Martes, 18 Agosto 2015, 21:22 Ver último mensaje
vuott
 

Publicar nuevo tema  Responder al tema  Página 2 de 2
Ir a la página Anterior  1, 2

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario