C/Visual C - Explicacion de los warning y notas

 
Vista:
sin imagen de perfil

Explicacion de los warning y notas

Publicado por Diego (150 intervenciones) el 11/05/2014 18:43:52
Buen dia, tengo un problema en que al parecer funciona, pero a la hora de compilarlo se generan varias notas y warnings:

El enunciado es el siguiente:
Realizar un programa que dado un arreglo de enteros lo muestre ordenado de menor a mayor.
No es necesario leer el arreglo desde el teclado, use arreglos de prueba.

Lo resolví con este código:

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
#include <stdio.h>
void sumar_arreglos(int *vec1, int *vec2, int * vec3, int dim);
void main(void){
	int dim = 10, i, *a, *b, *c;
	int vec1[] = {5,3,8,12,65,0,-9,3,10,-3};
	int vec2[] = {-4,-6,10,9,88,97,-1,3,0,3};
	int vec3[dim];
	sumar_arreglos(&vec1, &vec2, &vec3, dim);
	for (i = 0; i<dim ; i++){
		printf(" %3d ", vec1[i]);
	}
	printf("\n");
	for (i = 0; i<dim ; i++){
		printf(" %3d ", vec2[i]);
	}
	printf("\n--------------------------------------------------\n");
	for (i = 0; i<dim ; i++){
		printf(" %3d ", vec3[i]);
	}
}
void sumar_arreglos(int *vec1, int *vec2, int * vec3, int dim)
{
	int i;
	for (i = 0; i<dim ; i++){
		*(vec3+i) = *(vec1+i) + *(vec2+i);
	}
}

las advertencia y notas que se generan son las siguientes:

C:\Users\diego\Documents\Seminario lenguaje C\Ejercicios\práctica 3\5.c In function 'main':
lineas/columnas
8 2 [Warning] passing argument 1 of 'sumar_arreglos' from incompatible pointer type [enabled by default]
2 6 [Note] expected 'int *' but argument is of type 'int (*)[10]'
8 2 [Warning] passing argument 2 of 'sumar_arreglos' from incompatible pointer type [enabled by default]
2 6 [Note] expected 'int *' but argument is of type 'int (*)[10]'
8 2 [Warning] passing argument 3 of 'sumar_arreglos' from incompatible pointer type [enabled by default]
2 6 [Note] expected 'int *' but argument is of type 'int (*)[(sizetype)(dim)]'


No comprendo bien el porque de los warnings y notes.

Hace poco que empezé con C así que les agradezco.
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
sin imagen de perfil

Explicacion de los warning y notas

Publicado por Pico (37 intervenciones) el 11/05/2014 21:03:31
Una cosa es un int * y otra un int[].

vect lo declaras como int vec[]
la función sumar_arreglos como sumar_arreglos(int *vec1, int *vec2, int * vec3, int dim);
luego la llamas sumar_arreglos(&vec1, &vec2, &vec3, dim);, lo que es pasar un puntero a una tabla entera.

O sea, o pones sumar_arreglos(vec1, vec2, vec3, dim); o sumar_arreglos(&vec1[0], &vec2[0], &vec3[0], dim);

Y si sumar_arreglos lo declaras como sumar_arreglos(int vec1[], int vec2[], int vec3[], int dim); y la llamas como sumar_arreglos(vec1, vec2, vec3, dim);, mejor. Ten en cuenta que si pasas un parámetro a una función que no cabe en una palabra se manda un puntero siempre, no tienes que pensar tú en poner & ni nada.
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

Explicacion de los warning y notas

Publicado por Diego (150 intervenciones) el 11/05/2014 22:41:16
Muchas gracias, pude comprenderlo un poco mejor y ya no aparecen los warnings.
pero para comprobar lo que entendí voy a probarlo bien.

Entonces según entendí toda variable que sea de mayor a una letra se envia su dirección;
Ejemplo:
"a" requieriria el &; &a.
"asd" no requiere el &; basta con mandar el nombre.

¿Esto es independientemente del tipo de variable que sea?.
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

Explicacion de los warning y notas

Publicado por Pico (37 intervenciones) el 11/05/2014 23:59:28
Con palabra me refiero a lo que es una palabra del ordenador. En una máquina en 32 bits una palabra son 32 bits, en 16 son 16 y en 64, 64. Entonces si en un sistema en 32 bits mandas a una función un int, de 32 bits, se manda el int, pero un double, que ocupa el doble y no cabe en un int, se manda un puntero a ese double. Y con una tabla pasa lo mismo. Si tienes una tabla de 10 int, si la mandas a una función se mandará un puntero a esa función, sin que ni siquiera lo notes.

Lo que sucede es que a una función en 32 bits sólo se pueden mandar parámetros que quepan en un int. Así que si no caben se manda un puntero a ese parámetro.
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

Explicacion de los warning y notas

Publicado por Diego (150 intervenciones) el 12/05/2014 18:39:58
Muchas gracias, ya lo comprendí.
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