Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: $i$tr0 en Abril 11, 2013, 07:26:43 pm

Título: tipos en conflicto en C
Publicado por: $i$tr0 en Abril 11, 2013, 07:26:43 pm
hola foro HxC++

les agradezco me ayuden a resolver este error
lo que pienso es que no estoy realizando bien el uso de funciones

 
Código: [Seleccionar]
funcionTest.c:27:6: error: tipos en conflicto para ‘intercambio’
funcionTest.c:2:6: nota: la declaración previa de ‘intercambio’ estaba aquí
funcionTest.c:36:6: error: tipos en conflicto para ‘imprimir’
funcionTest.c:3:6: nota: la declaración previa de ‘imprimir’ estaba aquí


este es el codigo del programa
Código: [Seleccionar]
#include<stdio.h>
void intercambio(int mitad, int vectorUno, int vectorDos);
void imprimir(int mitad, int vectorUno, int vectorDos);

int main(){
int i,num,mitad;
printf("ingrese el tamaño del vector : ");
scanf("%d",&num);

mitad=num/2;
int vectorNumeros[num];
int vectorUno[mitad];
int vectorDos[mitad];

for(i=0; i<num; i++){
    vectorNumeros[i]=i+1;
}
for(i=0; i<mitad; i++){
    vectorUno[i]=vectorNumeros[i];
    vectorDos[i]=vectorNumeros[i+mitad] ;
}
intercambio(mitad,  vectorUno[mitad], vectorDos[mitad]);
imprimir( mitad,  vectorUno[mitad],  vectorDos[mitad]);
printf("\n");
}
void intercambio(int mitad, int vectorUno[mitad], int vectorDos[mitad]){
int i,auxUno,auxDos;
     for(i=0; i<mitad; i++){
        auxUno=vectorUno[i];
        auxDos=vectorDos[i];
        vectorUno[i]=auxUno;
        vectorDos[i]=auxDos;
     }
}
void imprimir(int mitad, int vectorUno[mitad], int vectorDos[mitad]){
int i;
    for(i=0; i<mitad; i++){
       printf("[%d",vectorUno[i]);
       printf("] vs [");
       printf("%d]",vectorDos[i]);
       printf("\n");
    }
}


Título: Re:tipos en conflicto en C
Publicado por: JAG en Abril 11, 2013, 07:42:29 pm
Antes de nada voy a decirte que corrijas por favor el título de tu post por algo más descriptivo, algo así como "tipos en conflicto en C".
Lo que le ocurre a tu código es que estás definiendo arriba dos funciones las cuales reciben 3 enteros cada una, luego le pasas a alguno de esos enteros de las funciones un valor de un vector, lo cual acepta porque estás pasando un valor de un vector de enteros en concreto... pero luego no pretendas recorrer ese vector en esa función xD No te va a dejar... ahí está el problema.

Saludos!!
Título: Re:ayuda prog C
Publicado por: $i$tr0 en Abril 11, 2013, 08:05:46 pm
hola te agradecería que me recomendaras un tema especifico para estudiar y poder resolver mi problema

la definición de las funciones original y los errores que se me presentaban son los siguientes :


Código: [Seleccionar]
void intercambio(int mitad, int vectorUno[mitad], int vectorDos[mitad]);
Código: [Seleccionar]
void imprimir(int mitad, int vectorUno[mitad], int vectorDos[mitad]);
con el código  de la función main igual al publicado hace un rato me daba este error:

Código: [Seleccionar]
funcionTest.c: En la función ‘main’:
funcionTest.c:22:1: aviso: el paso del argumento 2 de ‘intercambio’ crea un puntero desde un entero sin una conversión [activado por defecto]
funcionTest.c:2:6: nota: se esperaba ‘int *’ pero el argumento es de tipo ‘int’
funcionTest.c:22:1: aviso: el paso del argumento 3 de ‘intercambio’ crea un puntero desde un entero sin una conversión [activado por defecto]
funcionTest.c:2:6: nota: se esperaba ‘int *’ pero el argumento es de tipo ‘int’
funcionTest.c:23:1: aviso: el paso del argumento 2 de ‘imprimir’ crea un puntero desde un entero sin una conversión [activado por defecto]
funcionTest.c:3:6: nota: se esperaba ‘int *’ pero el argumento es de tipo ‘int’
funcionTest.c:23:1: aviso: el paso del argumento 3 de ‘imprimir’ crea un puntero desde un entero sin una conversión [activado por defecto]
funcionTest.c:3:6: nota: se esperaba ‘int *’ pero el argumento es de tipo ‘int’

sin saber lo que hacia decidí colocar el *  a los vectores vectorUno y vectorDos y el código compilo sin error

aqui el code

Código: [Seleccionar]
#include<stdio.h>
void intercambio(int mitad, int vectorUno[mitad], int vectorDos[mitad]);
void imprimir(int mitad, int vectorUno[mitad], int vectorDos[mitad]);

int main(){
int i,num,mitad;
printf("ingrese el tamaño del vector : ");
scanf("%d",&num);

mitad=num/2;
int vectorNumeros[num];
int *vectorUno[mitad];
int *vectorDos[mitad];

for(i=0; i<num; i++){
    vectorNumeros[i]=i+1;
}
for(i=0; i<mitad; i++){
    vectorUno[i]=&vectorNumeros[i];
    vectorDos[i]=&vectorNumeros[i+mitad] ;
}
intercambio(mitad,  vectorUno[mitad], vectorDos[mitad]);
imprimir( mitad,  vectorUno[mitad],  vectorDos[mitad]);
printf("\n");
}
void intercambio(int mitad, int vectorUno[mitad], int vectorDos[mitad]){
int i,auxUno,auxDos;
     for(i=0; i<mitad; i++){
        auxUno=vectorUno[i];
        auxDos=vectorDos[i];
        vectorUno[i]=auxUno;
        vectorDos[i]=auxDos;
     }
}
void imprimir(int mitad, int vectorUno[mitad], int vectorDos[mitad]){
int i;
    for(i=0; i<mitad; i++){
       printf("[%d",vectorUno[i]);
       printf("] vs [");
       printf("%d]",vectorDos[i]);
       printf("\n");
    }
}

ahora al ejecutarlo
inicia el programa pidiendo el tamaño del vector y termina
Código: [Seleccionar]
ingrese el tamaño del vector : 10
Violación de segmento (`core' generado)
Título: Re:tipos en conflicto en C
Publicado por: JAG en Abril 11, 2013, 08:21:32 pm
Sigues sin hacerme caso... cambia el título por el que yo estoy poniendo...
Mira tu código tiene más fallos a parte de pasar los vectores a las funciones y eso pero te explicaré por lo alto esto... Puedes ampliarlo con la innumerable colección de manuales que hay tanto en HxC como por la red...

Para pasar a una función un vector puedes hacerlo así:
Código: [Seleccionar]
void intercambio(int mitad, int vectorUno[], int vectorDos[]){
int i,auxUno,auxDos;
     for(i=0; i<mitad; i++){
        auxUno=vectorUno[i];
        auxDos=vectorDos[i];
        vectorUno[i]=auxDos;
        vectorDos[i]=auxUno;
     }
}

Luego para declarar en el main un vector (sin usar memoria dinámica) lo haces así:
Código: [Seleccionar]
int vectorUno[mitad];Sin poner punteros ni historias...

Y luego para llamar a la función dentro del main haces como sigue:
Código: [Seleccionar]
intercambio(mitad,  vectorUno, vectorDos);
Sencillo verdad... Te recomiendo que te mires en profundidad estos temas porque te veo muy verde, sobre punteros tienes uno de los cuadernos de HxC, míratelo, te será de utilidad.
Saludos!!
Título: Re:ayuda prog C
Publicado por: $i$tr0 en Abril 11, 2013, 08:25:01 pm
gracias JAG lo resolvimos al tiempo;

estoy bastante crudo en funciones
Título: Re:tipos en conflicto en C
Publicado por: coco en Abril 11, 2013, 10:59:14 pm
Bueno viendo que el  tema esta solucionado paso a cerrar el tema saludos.