Ver la versión completa : C Paso de matrices a funciones
AJMurphy
16/06/2017, 13:42
Hola, buenos dias,
¿ Alguien podría indicarme que estoy haciendo mal en el siguiente código ? Obtengo resultados diferentes y no veo el fallo. Muchas gracias de antemano.
void multiply(int a[], int b[]){
printf("\nTamaño de a = %d\n", (int)(sizeof(a)/sizeof(int)));
printf("Tamaño de b = %d\n", (int)(sizeof(b)/sizeof(int)));
}
int main(int argc, const char * argv[]) {
int a[] = { 9, 2, 3, 4, 5, 6, 7, 8 };
int b[] = { 4, 3, 2, 1 };
printf("sizeof(int)=%lu\n", sizeof(int));
printf("Tamaño de a = %d\n", (int)(sizeof(a)/sizeof(int)));
printf("Tamaño de b = %d\n", (int)(sizeof(b)/sizeof(int)));
multiply(a,b);
return 0;
}
SplinterGU
16/06/2017, 14:39
porque lo que recibe multiply como parametro son punteros no una matriz/array...
el compilador ya te lo esta diciendo
array.c: In function ‘multiply’:
array.c:4:45: warning: ‘sizeof’ on array function parameter ‘a’ will return size of ‘int *’ [-Wsizeof-array-argument]
printf("\nTamaño de a = %d\n", (int)(sizeof(a)/sizeof(int)));
-----Actualizado-----
tienes que incluir el tamaño como parametro... algo asi
void multiply(int a[], int sza, int b[], int szb)
....
multiply(a,sizeof(a)/sizeof(int),b,sizeof(b)/sizeof(int))
(aunque yo usaria sizeof(a[0]) en lugar de sizeof(int))
akualung
16/06/2017, 15:31
Para empezar, podrías decir cual es el fallo en vez de decir solamente "da un fallo". qué es lo que esperas que salga como resultado? La longitud de los arrays -a- y -b- que estás pasando a la función multiply?
Yo he probado el código aquí: https://www.jdoodle.com/c-online-compiler y, en la función main, los printf arrojan que la longitud de -a- y -b- valen 8 y 4 respectivamente (hasta ahí correcto,no?).
Pero los printf de dentro de multiply sacan que la longitud de -a- y -b- vale 2 cada uno (WTF?)
Lo siento, hace como 12 o 13 años que no toco C y ni me acuerdo ya de cómo se trabajaba con arrays en esa basura caduca de lenguaje. Supongo que es un trabajo de ciclo formativo o algo. Si no, te recomendaría que te olvidases de C y pasases a programación orientada a objetos. Los punteros y demás métodos de tortura satánicos mejor dejarlos como lo que son, algo del pasado que ya no tiene razón de ser.
SplinterGU
16/06/2017, 15:34
"caduca"???!!! WTF?
akualung
16/06/2017, 15:39
"caduca"???!!! WTF?
Hombre, no me dirás que el ansi C no es del año de la catapúm. Casi toda la programación en C actual es C#, no?
^MiSaTo^
16/06/2017, 15:43
cojo palomitas sobre todo por la última frase xDDD
SplinterGU
16/06/2017, 15:47
Hombre, no me dirás que el ansi C no es del año de la catapúm. Casi toda la programación en C actual es C#, no?
del año que quieras, pero decir "caduca" es mucho...
lo demas, ve y decilo a Linus...
akualung
16/06/2017, 15:47
cojo palomitas sobre todo por la última frase xDDD
Hombre, yo me refiero a los que programan en visual studio. O usas VB o C#. Si haces juegos o otras cosas que se salga del habitual desarrollo de aplicaciones web, entonces sí.
Bueno, si he ofendido a alguien, lo siento, pasemos página. Respecto al tema principal del post, en esta web hay un ejemplo en C de paso de array a una función y no incluyen el tamaño del array (aunque en este caso es un array de float, no de ints): https://www.programiz.com/c-programming/c-arrays-functions
JoJo_ReloadeD
16/06/2017, 15:49
akualung, no me seas hereje...
saboteur
16/06/2017, 15:49
Esperad que pongo el índice TIOBE. Otra de palomitas.
https://www.tiobe.com/tiobe-index/
^MiSaTo^
16/06/2017, 15:56
Hombre, yo me refiero a los que programan en visual studio. O usas VB o C#. Si haces juegos o otras cosas que se salga del habitual desarrollo de aplicaciones web, entonces sí.
Bueno, si he ofendido a alguien, lo siento, pasemos página. Respecto al tema principal del post, en esta web hay un ejemplo en C de paso de array a una función y no incluyen el tamaño del array (aunque en este caso es un array de float, no de ints): https://www.programiz.com/c-programming/c-arrays-functions
Lo dices como si el 99% de los programadores usaran visual studio, VB y C#. Como si no hubiera nada más en este mundo xDDDDDDD
No me ofendo tío, pero incluso para programar aplicaciones web (cosa que he hecho durante 6 años de mi vida) no hace falta usar eso. Es más, yo nunca lo he usado xD Y llevo casi 15 años programando profesionalmente.
SplinterGU
16/06/2017, 15:56
Hombre, yo me refiero a los que programan en visual studio. O usas VB o C#. Si haces juegos o otras cosas que se salga del habitual desarrollo de aplicaciones web, entonces sí.
Bueno, si he ofendido a alguien, lo siento, pasemos página. Respecto al tema principal del post, en esta web hay un ejemplo en C de paso de array a una función y no incluyen el tamaño del array (aunque en este caso es un array de float, no de ints): https://www.programiz.com/c-programming/c-arrays-functions
vale, ahora veo que AJMurphy, esta programando paginas webs...
por otro lado, no me has ofendido... solo que tal afirmacion es erronea...
y el link que pasaste esos codigos son de listillo, ahi ya sabe el tamaño dentro de la funcion, que gracia tiene eso? no es el caso que pregunta arriba, que por cierto ya respondi que es lo que pasa y como solucionarlo...
akualung
16/06/2017, 16:04
vale, ahora veo que AJMurphy, esta programando paginas webs...
por otro lado, no me has ofendido... solo que tal afirmacion es erronea...
y el link que pasaste esos codigos son de listillo, ahi ya sabe el tamaño dentro de la funcion, que gracia tiene eso? no es el caso que pregunta arriba, que por cierto ya respondi que es lo que pasa y como solucionarlo...
Tienes razón, no me había fijado en el bucle donde el tío ha metido ahí, hardcodeado, el tamaño del array que recibe esa función. Pero pregunto, y de ahí lo que he dicho antes de "caduco". si en C le pasas un array a una función (un array que se supone que viene ya con una serie de valores dentro y por lo tanto, ya tendrá un tamaño determinado) por qué has de pasar el tamaño del array como otro parámetro adicional en vez de simplemente sacarlo de alguna manera similar como se hace en programación orientada a objetos con un sencillo arrayQueAcabamosDeRecibir.length()?
Sí, lo sé: programación orientada a objetos != programación estructurada... Pero aún así. Encuentro muy fuerte que, en C, si pasas un array a una función, "pierdas" su tamaño y por lo tanto lo tengas que enviar como un parámetro adicional porque el sizeof() ya no funciona dentro de la función multiply (cuando en main sí que devuelve bien lso tamaños de -a- y -b-).
Edito: por si aca, para no ofender más a nadie, que ya veo que están los ánimos caldeados (debe ser el calor, jejeje) he buscado yo mismo https://stackoverflow.com/questions/2950332/why-does-a-c-array-have-a-wrong-sizeof-value-when-its-passed-to-a-function
SplinterGU
16/06/2017, 16:08
Esperad que pongo el índice TIOBE. Otra de palomitas.
https://www.tiobe.com/tiobe-index/
por cierto, caramba! gracias por el link...
50366
Por cierto... ¿qué es lo que quieres que haga el código? Supongo que hacer algun tipo de multiplicación entre dos arrays... pero ¿como los quieres multiplicar exactamente?
akualung
16/06/2017, 16:24
Por cierto... ¿qué es lo que quieres que haga el código? Supongo que hacer algun tipo de multiplicación entre dos arrays... pero ¿como los quieres multiplicar exactamente?
Tal parece un ejercicio típico de ciclo formativo para habituarse con el uso de arrays. A nosotros nos hicieron hacer uno que calculase la regla de Cramer de dos arrays que pasábamos como argumento.
SplinterGU
16/06/2017, 16:41
Tienes razón, no me había fijado en el bucle donde el tío ha metido ahí, hardcodeado, el tamaño del array que recibe esa función. Pero pregunto, y de ahí lo que he dicho antes de "caduco". si en C le pasas un array a una función (un array que se supone que viene ya con una serie de valores dentro y por lo tanto, ya tendrá un tamaño determinado) por qué has de pasar el tamaño del array como otro parámetro adicional en vez de simplemente sacarlo de alguna manera similar como se hace en programación orientada a objetos con un sencillo arrayQueAcabamosDeRecibir.length()?
Sí, lo sé: programación orientada a objetos != programación estructurada... Pero aún así. Encuentro muy fuerte que, en C, si pasas un array a una función, "pierdas" su tamaño y por lo tanto lo tengas que enviar como un parámetro adicional (si es que he entendido bien el error que le está pasando a OP).
como dices, es diferente, en C no hay objetos...
tiene su logica, aunque es un poco complejo de explicar, veamos...
partamos de la base de que sizeof se resuelve en tiempo de compilacion, no hay una funcion sizeof como tal, sino que el compilador la resuelve y coloca el valor constante en ese lugar del codigo. entonces, C no necesita almacenar el tamaño del array para ser accedido en runtime, asi que no hay forma de saber el tamaño del array en una funcion.
tambien decir que no son objetos, lo que pasas es el dato en si, en el caso de arrays, se pasa el puntero (tampoco se pasa el array por valor, solo por referencia), aunque podrias si quieres pasar una estructura del tipo [ int size; int * array ], tendrias casi un objeto...
#include <stdio.h>
typedef struct {
int sz;
int * array;
} blah;
void multiply(blah a, blah b){
printf("\nTamaño de a = %d\n", a.sz);
printf("Tamaño de b = %d\n", b.sz);
printf("a[0]=%d\n", a.array[0]);
printf("b[1]=%d\n", b.array[1]);
}
int main(int argc, const char * argv[]) {
int a[] = { 9, 2, 3, 4, 5, 6, 7, 8 };
int b[] = { 4, 3, 2, 1 };
int a1[] = { 13, 53, 44, 1 };
int b1[] = { 99, 33 };
blah blah_a, blah_b;
printf("sizeof(int)=%lu\n", sizeof(int));
blah_a.sz = sizeof(a)/sizeof(*a); blah_a.array = a;
blah_b.sz = sizeof(b)/sizeof(*b); blah_b.array = b;
printf("Tamaño de a = %d\n", (int)(sizeof(a)/sizeof(int)));
printf("Tamaño de b = %d\n", (int)(sizeof(b)/sizeof(int)));
multiply(blah_a,blah_b);
printf ("------------\n");
blah_a.sz = sizeof(a1)/sizeof(*a1); blah_a.array = a1;
blah_b.sz = sizeof(b1)/sizeof(*b1); blah_b.array = b1;
printf("Tamaño de a1 = %d\n", (int)(sizeof(a1)/sizeof(int)));
printf("Tamaño de b1 = %d\n", (int)(sizeof(b1)/sizeof(int)));
multiply(blah_a,blah_b);
return 0;
}
resultado:
sizeof(int)=4
Tamaño de a = 8
Tamaño de b = 4
Tamaño de a = 8
Tamaño de b = 4
a[0]=9
b[1]=3
------------
Tamaño de a1 = 4
Tamaño de b1 = 2
Tamaño de a = 4
Tamaño de b = 2
a[0]=13
b[1]=33
despues podriamos decir que una funcion donde hace uso de sizeof (resuelto en tiempo de compilacion) de sus parametros arrays, carece de reutilidad para arrays de diferentes sizes...
el ejemplo es una tonteria, pero bueno, para ejemplificar opciones...
-----Actualizado-----
veo que AJMurphy solo tiene un mensaje, seguramente entro al foro para consultar y puso esta consulta en cientos de sitios, y tal vez ya le respondieron en otro lugar...
Hombre, no me dirás que el ansi C no es del año de la catapúm. Casi toda la programación en C actual es C#, no?
Cabrito, esos chistes no se dicen sin avisar que casi me atraganto con la coca cola... toda la programación con C# ... juarfs juarfs juarfs...
akualung
16/06/2017, 21:07
Cabrito, esos chistes no se dicen sin avisar que casi me atraganto con la coca cola... toda la programación con C# ... juarfs juarfs juarfs...
Me refería a programación de aplicaciones web, .NET y toda esa pesca, hombre. Pero lo comprendo, no lo dejé del todo claro en mi anterior post.
Cuando pasas un puntero a un array a una función en C, es mejor pasar el tamaño como entero, porque es más seguro y no se puede saber el tamaño en la función. Recuerda que un puntero a un array es la dirección de su primer elemento. Es decir, algo parecido a esto:
int sumar(int *array, int size)
{
//....
}
Y se llamará así, aquí puedes hacer sizeof porque el llamador conoce el array:
int total = sumar(array, sizeof(array) / sizeof(int));
P.D. Ahora que lo veo, lo he hecho de forma parecida a SplinterGU, pero sin estructuras, más manual. Con su solución lo tienes todo más ordenado, cada array con su tamaño como si fuera un objeto. :brindis:
AJMurphy
17/06/2017, 01:23
Hola
Lo que intento hacer es implementar un algoritmo eficiente para multiplicar dos numero grandes, de unas 200 cifras cada uno.
El algoritmo de basa en ir dividiendo los números en mitades hasta que queden unas mitades con valores abordables, y esto se realiza mediante recursividad.
Una especie de algoritmo de Karatsuba.
Y efectivamente, estoy viendo que la única manera es pasando el tamaño de las matrices.
La primera vez, desde la función main() se llamaría de la siguiente forma
multiply(a, (unsigned short)(sizeof(a)/sizeof(unsigned short)), b, (unsigned short)(sizeof(b)/sizeof(unsigned short)));
y en la función
void multiply(unsigned short *a, unsigned short x, unsigned short *b, unsigned short y)
{
unsigned short lMaxima = (x > y) ? x : y;
unsigned short lDcha = lMaxima/2;
unsigned short lIzda = lMaxima - lDcha;
...
...
unsigned short x0[lIzda]; for (int i = 0; i < lIzda; i++) x0[i]=0;
unsigned short x1[lDcha]; for (int i = 0; i < lDcha; i++) x1[i]=0;
unsigned short y0[lIzda]; for (int i = 0; i < lIzda; i++) y0[i]=0;
unsigned short y1[lDcha]; for (int i = 0; i < lDcha; i++) y1[i]=0;
...
...
...
...
x0y0 = multiply(x0, lIzda, y0, lIzda);
x1y1 = multiply(x1, lDcha, y1, lDcha);
}
Muchas gracias por la ayuda
SplinterGU
17/06/2017, 03:53
Cuando pasas un puntero a un array a una función en C, es mejor pasar el tamaño como entero, porque es más seguro y no se puede saber el tamaño en la función. Recuerda que un puntero a un array es la dirección de su primer elemento. Es decir, algo parecido a esto:
int sumar(int *array, int size)
{
//....
}
Y se llamará así, aquí puedes hacer sizeof porque el llamador conoce el array:
int total = sumar(array, sizeof(array) / sizeof(int));
P.D. Ahora que lo veo, lo he hecho de forma parecida a SplinterGU, pero sin estructuras, más manual. Con su solución lo tienes todo más ordenado, cada array con su tamaño como si fuera un objeto. :brindis:
es correcto, como lo puse en mi primer respuesta
porque lo que recibe multiply como parametro son punteros no una matriz/array...
el compilador ya te lo esta diciendo
array.c: In function ‘multiply’:
array.c:4:45: warning: ‘sizeof’ on array function parameter ‘a’ will return size of ‘int *’ [-Wsizeof-array-argument]
printf("\nTamaño de a = %d\n", (int)(sizeof(a)/sizeof(int)));
-----Actualizado-----
tienes que incluir el tamaño como parametro... algo asi
void multiply(int a[], int sza, int b[], int szb)
....
multiply(a,sizeof(a)/sizeof(int),b,sizeof(b)/sizeof(int))
(aunque yo usaria sizeof(a[0]) en lugar de sizeof(int))
-----Actualizado-----
Hola
Lo que intento hacer es implementar un algoritmo eficiente para multiplicar dos numero grandes, de unas 200 cifras cada uno.
El algoritmo de basa en ir dividiendo los números en mitades hasta que queden unas mitades con valores abordables, y esto se realiza mediante recursividad.
Una especie de algoritmo de Karatsuba.
Y efectivamente, estoy viendo que la única manera es pasando el tamaño de las matrices.
La primera vez, desde la función main() se llamaría de la siguiente forma
multiply(a, (unsigned short)(sizeof(a)/sizeof(unsigned short)), b, (unsigned short)(sizeof(b)/sizeof(unsigned short)));
y en la función
void multiply(unsigned short *a, unsigned short x, unsigned short *b, unsigned short y)
{
unsigned short lMaxima = (x > y) ? x : y;
unsigned short lDcha = lMaxima/2;
unsigned short lIzda = lMaxima - lDcha;
...
...
unsigned short x0[lIzda]; for (int i = 0; i < lIzda; i++) x0[i]=0;
unsigned short x1[lDcha]; for (int i = 0; i < lDcha; i++) x1[i]=0;
unsigned short y0[lIzda]; for (int i = 0; i < lIzda; i++) y0[i]=0;
unsigned short y1[lDcha]; for (int i = 0; i < lDcha; i++) y1[i]=0;
...
...
...
...
x0y0 = multiply(x0, lIzda, y0, lIzda);
x1y1 = multiply(x1, lDcha, y1, lDcha);
}
Muchas gracias por la ayuda
de nada
Ñuño Martínez
19/06/2017, 13:46
También puede usarse lo que yo llamo el "modo Pascal implementado en C", que consiste en usar el primer elemento de la lista para contener el tamaño de la misma (razón por la que en los Pascal los STRING empiezan en el 1 y no en el 0, y son como máximo de 255 caracteres).
Y decir que C está caduco... Madredelamorhermosa...
masteries
19/06/2017, 20:08
Hombre, yo me refiero a los que programan en visual studio. O usas VB o C#. Si haces juegos o otras cosas que se salga del habitual desarrollo de aplicaciones web, entonces sí.
Quizá no sea tan habitual el desarrollo de aplicaciones web, quizá haya un "pelotón" de personas que programan, sí, pero otras cosas... y no son pocos precisamente.
Otra cosa es que no se conozcan esos campos de trabajo, pero están ahí y no son raros ni bizarros; todo el campo de la mecatrónica (automóviles, aviones, trenes, electrodomésticos, internet de las cosas...) por no ir más lejos, es C y con suerte los elementos de más bajo nivel estarán integrados en Simulink y/o LabView, con lo que la parte más difícil de algoritmia la podrás programar de una forma mucho más sencilla y abstracta.
akualung
21/08/2017, 00:53
Quizá no sea tan habitual el desarrollo de aplicaciones web, quizá haya un "pelotón" de personas que programan, sí, pero otras cosas... y no son pocos precisamente.
Otra cosa es que no se conozcan esos campos de trabajo, pero están ahí y no son raros ni bizarros; todo el campo de la mecatrónica (automóviles, aviones, trenes, electrodomésticos, internet de las cosas...) por no ir más lejos, es C y con suerte los elementos de más bajo nivel estarán integrados en Simulink y/o LabView, con lo que la parte más difícil de algoritmia la podrás programar de una forma mucho más sencilla y abstracta.
Ya no recordaba este post. Madre mía, la que armé por no saberme explicar bien, jejejeje.
vickeykumar
25/08/2019, 19:04
please use www.gorepl.com/ for quickly checking your code snippets.
Ya ni siquiera en dos fases, spam directo a la yugular :D, vivan los bots...
He terminado de ver Cannon Busters y me ha encantado.
52756
Recomendadísima. Está detrás de ella gente ha trabajado en Korra y Hora de Aventuras, por ejemplo. Eso sí, no es una serie para niños.
Porque es demasiado técnica y va del paso de matrices a funciones, ¿no?
romeroca
26/08/2019, 12:53
Porque es demasiado técnica y va del paso de matrices a funciones, ¿no?
Hilo equivocado!!!! Ya lo he movido, sorry.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.