Compilador: gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5), y a parte Visual C++ (ver nota a continuación)
Compilation flags -Wall -g
// matrix operations
#include <stdio.h>
void myPrint(int **table, int x, int y);
int main(int argc, char **argv) {
int matrix[3][3];
matrix[0][0] = 2;
matrix[0][1] = 3;
matrix[0][2] = 5;
matrix[1][0] = 1;
matrix[1][1] = 4;
matrix[1][2] = 16;
matrix[2][0] = 9;
matrix[2][1] = 28;
matrix[2][2] = 14;
myPrint(matrix, 2, 1);
return 0;
}
void myPrint(int **table, int x, int y) {
printf("%d\n", table[x][y]);
}
Compilación:
warning: passing argument 1 of ‘myPrint’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int (*)[3]’
Ejecución:
Fallo de segmentación
Nota: en Visual C++ la validación de tipos es más estricta y hay que agregar
- myPrint((int **)matrix, 2, 1); // conciliación de tipos entre parámetros formales y reales
Porque si no da error de compilación, que viene a ser justamente lo mismo que en gcc es warning.
Código 2:
Compilador Visual C++
// matrix operations
#include <stdio.h>
void myPrint(int (*table)[3], int x, int y);
int main(int argc, char **argv) {
int matrix[3][3];
matrix[0][0] = 2;
matrix[0][1] = 3;
matrix[0][2] = 5;
matrix[1][0] = 1;
matrix[1][1] = 4;
matrix[1][2] = 16;
matrix[2][0] = 9;
matrix[2][1] = 28;
matrix[2][2] = 14;
myPrint(matrix, 2, 1);
return 0;
}
void myPrint(int (*table)[3], int x, int y) {
printf("%d\n", table[x][y]);
}
Compilación: sin warnings
Ejecución:
28
Código 3:
Compilador: Por separado gcc y Visual C++ (ver nota abajo)
// matrix operations
#include <stdio.h>
void myPrint(int **table, int x, int y);
int main(int argc, char **argv) {
int *matrix[3];
matrix[0] = malloc(3*sizeof(int));
matrix[0][0] = 2;
matrix[0][1] = 3;
matrix[0][2] = 5;
matrix[1] = malloc(3*sizeof(int));
matrix[1][0] = 1;
matrix[1][1] = 4;
matrix[1][2] = 16;
matrix[2] = malloc(3*sizeof(int));
matrix[2][0] = 9;
matrix[2][1] = 28;
matrix[2][2] = 14;
myPrint(&matrix, 2, 1);
return 0;
}
void myPrint(int **table, int x, int y) {
printf("%d\n", table[x][y]);
}
Compilación: warning: passing argument 1 of ‘myPrint’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int * (*)[3]’
Ejecución:
28
Nota: en Visual C++ para Windows la validación de tipos es más estricta y hace falta las siguientes adaptaciones:
- (int*)malloc(3*sizeof(int)); // explícitamente decir el tipo de puntero con el que se va a usar lo que devuelva malloc.
- myPrint((int **)&matrix, 2, 1); // conciliar tipos entre parámetros formales y actuales Porque si no da error de compilación, que viene a ser justamente lo mismo que en gcc es warning.
No hay comentarios:
Publicar un comentario