C/Visual C - Ayuda punteros en C

 
Vista:
sin imagen de perfil

Ayuda punteros en C

Publicado por Victor (17 intervenciones) el 14/08/2016 00:02:49
Hola buenas, tengo la siguiente duda en mi codigo: mi problema es que no se porque el valor de suma dentro de la funcion de tipo void no me cambia, me explico. En el metodo main he creado una variable suma, inicializada a cero,y la cual le he pasado la direccion de memoria cuando he llamado a la funcion ya que en los parametros de la funcion de tipo void hay un puntero (int *suma). Yo cuando pase como parametro a suma_divisores(a,&suma) en este momento cuando va a la funcion de tipo void le paso la direccion de memoria, por lo tanto, la variable suma del metodo main y la variable suma de la funcion de tipo void son la misma,es decir, comparten el mismo espacio de memoria, por lo que no entiendo porque no me cambia el valor de *suma que hay dentro de la funcion void.

PD:poner el modo debug para darse cuenta de que el valor de suma de la funcion void no cambia.


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
//Ejercicio 17
//Programa que determina si dos enteros positivos son amigos
 
 
#include <stdio.h>
 
void suma_divisores(int numero, int *suma);
 
int main (){
 
	int a, b;
	int suma;
 
	suma = 0;
 
	printf("\t ***Numeros amigos *** \t \n");
 
	printf("Introduce un entero a: ");
	scanf("%i",&a);
 
	printf("Introduce un entero b: ");
	scanf("%i",&b);
 
	suma_divisores(a,&suma);
 
 
	if(suma == b){
 
		suma_divisores(b,&suma);
 
		if(suma == a){
			printf("Los numeros %i y %i son amigos!! \n",a,b);
		}
		else{
			printf("Los numeros %i y %i NO son amigos :( \n",a,b);
		}
 
	}
	else {
		printf("Los numeros %i y %i NO son amigos :( \n",a,b);
	}
 
 
 
	system("pause");
	return 0;
}
 
void suma_divisores(int numero, int *suma){ //numero = b; suma = &suma;
 
	int i;
 
	*suma = 0;
 
	for(i = 1; i < 1000; i++){
 
		if(numero % i == 0){
 
			*suma += i;
 
		}
 
	}
}
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 Dionicio
Val: 91
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ayuda punteros en C

Publicado por Dionicio (22 intervenciones) el 14/08/2016 01:27:29
Tu ejercicio está bien, aunque un poco mal planteado pues lo he probado(con algunas correcciones) y funciona. El primer problema que encontré fue que en la función de tipo void en el bucle llega hasta el numero 1000 primer error la comparación correcta sería
1
for(i = 0; i < numero; i++)
porque la regla de los números amigos es "se dividirá el número sin incluir el mismo" por lo que si llega a mil el número será dividido entre sí mismo dando un resultado no deseado o por si el contrario pones números más grandes como lo son 17,296 y 18,416.

Una corrección menor es que la comparación dentro del if del bucle estaría mejor si la pones entre parentesís pues te evitarías cualquier error que eventualmente pueda surgir.
1
if( (numero%i) == 0)

Espero te sea de ayuda. Un saludo Victor.
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
sin imagen de perfil

Ayuda punteros en C

Publicado por Victor (17 intervenciones) el 14/08/2016 12:35:45
Muchas gracias tio ahora funciona el programa pero una cosa. Sigo sin entender porque cuando paro la ejecucion dentro de la funcion de tipo void, la variable suma no tiene ningun valor, mira:


lwp
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
Imágen de perfil de Dionicio
Val: 91
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ayuda punteros en C

Publicado por Dionicio (22 intervenciones) el 14/08/2016 16:44:20
La explicación lógica según yo es que no presenta ningún valor ya que no es una variable sino una dirección de memoria y por lo tanto te muestra a la dirección a la que apunta que es a la variable suma del main.

Si quieres ver el proceso sin tener que depurar bastaría con poner un printf dentro del if de la función.
1
2
3
4
if( (numero%i) == 0){
    *suma += i;
    prinf("*suma tiene = %i",*suma);//Mostrará los valores que vaya acumulado suma
}

Espero te sirva.
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