Punteros en C

Primero agradecer al profesor de Lenguaje de programación de la PUCP: Miguel Guanira!!! Ahora estoy aprendiendo punteros genéricos, punteros a funciones y argumentos en líneas de comando para lograr codear quicksort en C, utilizando estos conceptos. Verlos aquí.         A modo de práctica empiezo indicando que se tendra que de acuerdo al primer parámetro ingresado ‘n’ o ‘f’, el puntero vptr apuntará al tipo de dato según corresponda:

#include <stdio.h>
#include <stdlib.h>

int main (int numArg, char ** arg) {           // principal
   int x = 1;
   float r = 1.0;
   void* vptr;

   while(--numArg > 0){
	switch (arg[1][0]) {
		case 'n':
		{      vptr = &x;           // apuntando a int x
		       *(int *) vptr = 2;  // modifica el valor de x
		       printf("%d\n",*(int*) (vptr));
		} break;

		case 'f':
		{
		       vptr = &r;            //  apuntando a float r
		       *(float *)vptr = 1.1;//modifica el valor de r
		       printf("%f\n",*(float*) (vptr));
		} break;
	}
   }
   return (EXIT_SUCCESS);
}

Si se apunta a un arreglo estático, se puede codear algo así:

#include <stdio.h>
#include <stdlib.h>

int main (int numArg, char ** arg) {              // =============
   int x[6] = {1,2,3,4,5,6};
   float r[6] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
   void* vptr[6];

   while(--numArg > 0){
	switch (arg[1][0]) {
		case 'n':
		{
		       int i=0;
		       while (i<6) {
		       vptr[i] = &(x[i]);
                       printf("%d\n",*(int*) (vptr[i]));
		       i++;}
		} break;

		case 'f':
		{
		       int i=0;
		       while (i<6) {
  		       vptr[i] = &(r[i]);
                       printf("%f\n",*(float*) (vptr[i]));
		       i++;}
		} break;
	}
   }
   return (EXIT_SUCCESS);
}

Si se apunta a un arreglo dinámico, se presenta esta alternativa para leer e imprimir:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
void **leer(int, char); 
void imprimir(void **, int, char);
int intComp(const void *v1, const void* v2); 
int floatComp(const void *v1, const void* v2);
int strComp(const void *v1, const void* v2); 
void **leer(int num, char tipo) {
    int* pInt;
    float* pFloat;
    char* pCad;
    char buffer[500];
    void **v;
    int i;
    v = malloc(num * sizeof (void*));
    for (i = 0; i < num; i++) {
        printf("Ingrese dato %d: ", i + 1);
        switch (tipo) { 
            case 1:
                pInt = (int*) malloc(sizeof (int));
                scanf("%d", pInt);
                v[i] = pInt;
                break;
            case 2:
                scanf("%s", buffer);
                pCad = (char*) malloc(strlen(buffer) + 1);
                strcpy(pCad, buffer);
                v[i] = pCad;
                break;
            case 3:
                pFloat = (float*) malloc(sizeof (float));
                scanf("%f", pFloat);
                v[i] = pFloat;
                break;
        }
    }
    return v;
}
void imprimir(void **datos, int num, char tipo) {
    int i;
    for (i = 0; i < num; i++) {
        switch (tipo) {
            case 1:
                printf("%d\n", *((int*) datos[i]));
                break;
            case 2:
                printf("%s\n", (char*) datos[i]);
                break;
            case 3:
                printf("%f\n", ((float*) datos[i])[0]);
                break;
        }
    }
}
int intComp(const void *v1, const void* v2) {
    return ((int**) v1)[0][0] - ((int**) v2)[0][0];
}
int floatComp(const void *v1, const void* v2) {
    float aux1 = ((float**) v1)[0][0], aux2 = ((float**) v2)[0][0];
    float r = aux1 - aux2;
    return r > 0 ? 1 : (r < 0 ? -1 : 0);
}
int strComp(const void *v1, const void* v2) {
    return strcmp(((char**) v1)[0], ((char**) v2)[0]);
}
int main(int numArg, char **arg) {
    int num;
    int tipo;
    void ** datos;
    printf("Ingrese el número de valores: ");
    scanf("%d", &num);
    printf("Ingrese el Tipo de dato por ordenar\n(1)Entero, (2)Texto y (3)Decimal: ");
    scanf("%d", &tipo);
    datos = leer(num, tipo);
    switch (tipo) {
        case 1:
            qsort(datos, num, sizeof (void *), intComp);
            imprimir(datos, num, tipo);
            break;
        case 2:
            qsort(datos, num, sizeof (void *), strComp);
            imprimir(datos, num, tipo);
            break;
        case 3:
            qsort(datos, num, sizeof (void *), floatComp);
            imprimir(datos, num, tipo);
            break;
    }
    return 0;
}

About Julita Inca

Ingeniero de Sistemas UNAC, Magíster en Ciencias de la Computación PUCP, OPW GNOME 2011, Miembro de la GNOME Foundation desde el 2012, Embajadora Fedora Perú desde el 2012, ganadora del scholarship of the Linux Foundation 2012, experiencia como Admin Linux en GMD y Especialista IT en IBM, con certificaciones RHCE, RHCSA, AIX 6.1, AIX 7 Administrator e ITILv3. Experiencia académica en universidades como PUCP, USIL y UNI. HPC researcher, a simple mortal, like you!
This entry was posted in Programming and tagged , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s