Dev - C++ - Como acceder a los campos de un estructura que tiene apuntadores** hilo

 
Vista:

Como acceder a los campos de un estructura que tiene apuntadores** hilo

Publicado por carlos alberto (1 intervención) el 12/09/2016 07:08:21
Hola buenas noches

Mi duda es la siguiente he creado un programa en que recibe un valor de n y con ese valor crea 2 matrices de nxn para poder ser multiplicadas, estoy usando hilos cada hilo harauna operacion para multiplicar la matriz uno una fila otro una columna y así , su prototipo es void* multiplica( void¨* ) entonces como parametro de funcion estoy enviando un apuntador a struct en ella inicializado los datos pero no puedo acceder a ellos, alguna sugerencia ?

Gracias amigos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
 
typedef struct {
 
	int *** ptr;
	int ***ptr2;
	int fila;
	int colum;
	int num;
 
}datos;
 
// int** ptr, int** ptr2, int fila, int colum, int num 
 
void* multiplica ( void* args);
 
int main(){
 
	int n;
	int fil,col;
 
	datos *aptdatos, a1;
	aptdatos = &a1;
 
	printf("\n\n Se crearan 2 matricez de nxn \n\n");
	printf("valor de n --> ");
	scanf("%d", &n);
 
	pthread_t hilos[n];
 
 
	/* Inicializamos las matrices  */
 
	int **mat1=(int **)malloc(sizeof(int *)*n);
	int **mat2=(int **)malloc(sizeof(int *)*n);
	for(int i=0; i<n; i++)
	{
		mat1[i]=(int *)malloc(sizeof(int )*n);
		mat2[i]=(int *)malloc(sizeof(int )*n);
 
	}
	 //                                                    0 1
	// Le damos valores empezadon de 0 ejemplo si n = 2    2 3
	int cont=0;
	for( int i=0; i<n; i++ ) {
	for( int j=0; j<n; j++ ) {
	mat1[i][j] = cont;
	mat2[i][j] = cont;
	cont++;
    }
    }
 
 
 
	// De esta forma llamamos a los hilos donde i y j es la fila y columna correspondiente que les Toca
    for( int i=0; i<n; i++ ) {
	for( int j=0; j<n; j++ ){
 
//inicializo los datos de la estructura
		aptdatos->fila = i;
		aptdatos->num = n;
		aptdatos->colum = j;
		aptdatos->ptr = &mat1;
		aptdatos->ptr2 = &mat2;
 
		pthread_create(&hilos[i], NULL, multiplica, aptdatos );
 
		pthread_join(hilos[i],NULL);
	    pthread_exit(NULL);
	}
	printf( "\n" );
	}
 
     free(mat1);
     free(mat2);
 
   return 0;
}
 
void* multiplica ( void* args ){
 
 
	int cont=0;
 
		for(int j=0; j< args.num ; j++){  //AQUI ES DONDE ESTA EN ERROR DE ESTA FORMA LO INTENTE
 
			cont = ptr[fila][j] * ptr2[j][colum] + cont;
 
		}
 
	printf( " %d ", cont );
 
    return cont;
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Como acceder a los campos de un estructura que tiene apuntadores** hilo

Publicado por vangodp (23 intervenciones) el 13/09/2016 00:23:46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
 
typedef struct {
    int *** ptr;
    int ***ptr2;
    int fila;
    int colum;
    int num;
} datos;
 
void multiplica ( void* args );
 
int main() {
    datos *aptdatos, a1;
    a1.num = 10;
 
    aptdatos = &a1;
 
 
    multiplica(  (void*)aptdatos);
 
    return 0;
}
 
 
 
void multiplica ( void* args ) {
    datos* d = (datos*)args;
 
    printf ( "%d\n", d->num );
    printf ( "%d\n", ((datos*)args)->num );
}

No entiendo nada de hilos, me limito a responder "...no puedo acceder a ellos, alguna sugerencia ?" que creo que es la pregunta principal.
No creo factible usar puntero a void, porque dentro vas a tener que o hacer un cast al tipo de datos o asignarlo a un puntero del tipo datos, si no el programa no va a saber como es la estructura interna de los datos y por ese motivo no podrás acceder a ellos, eso echa por alto el puntero "genérico" que has creado.

En C++ hay algo chamado templates que sí permite eso que quieres, también están las funciones sobrecargadas, existe varios mecanismos para ese problema que pueden ser empleados.

suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar