Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 14 Enero 2014, 22:00 pm



Título: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: NOB2014 en 14 Enero 2014, 22:00 pm
Hola.
Esto debe ser sencillo pero no logro resolverlo, el caso es que no  me acepta esta línea de código.-

Código
  1. //for(i=longitud; i>=0; i--,j++)

Me da el siguiente error, no al compilar sino al ejecutar.-

(http://i43.tinypic.com/3444gle.jpg)

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void){
  5. unsigned int enteros[]={15,12,28,18,05,33,21},i=0, longitud=0, copia[7], j=0;
  6. longitud = sizeof enteros / sizeof *enteros;
  7.  
  8. printf("\n Original....:");
  9. for(i=0; i<longitud; i++){
  10. printf("%d ", enteros[i]);
  11. }
  12.  
  13. //for(i=longitud; i>=0; i--,j++){
  14. for(i=longitud; i>0; i--,j++){
  15. copia[j] = enteros[i];
  16. }
  17.  
  18. printf("\n\n Invertido...:");
  19. for(i=0; i<longitud; i++){
  20. printf("%d ", copia[i]);
  21. }
  22.  
  23. return 0;
  24. }

Bueno espero de vuestra ayuda.-       
Saludos.


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: do-while en 14 Enero 2014, 22:07 pm
¡Buenas!

En el segundo bucle, el primer índice es longitud, que está fuera de rango. Debería ser longitud - 1, y la condición de continuidad del for debería ser i >= 0

Cámbialo y nos cuentas como va.

¡Saludos!


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: ivancea96 en 14 Enero 2014, 22:13 pm
El problema es que pusiste unsigned int.

¿Qué número POSITIVO no es mayor o igual a 0?
O pones i<longitud+1 o pones int en vez de unsigned int.


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: amchacon en 14 Enero 2014, 22:24 pm
El problema es que pusiste unsigned int.

¿Qué número POSITIVO no es mayor o igual a 0?
O pones i<longitud+1 o pones int en vez de unsigned int.
Un consejo NOB2014, no uses variables unsigned si tienes que hacer condiciones. Puede provocar errores extraños si te despistas.


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: NOB2014 en 14 Enero 2014, 22:55 pm
Hola.

Citar
¿Qué número POSITIVO no es mayor o igual a 0?
O pones i<longitud+1 o pones int en vez de unsigned int.

De acuerdo, inocente error el mío, i<longitud+1 no me funciona.
Quitando unsigned si.-

Gracias a los tres.- 
Saludos.


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: NOB2014 en 14 Enero 2014, 23:12 pm
Hola.
Una consulta más, ¿tiene sentido hacer este mismo código con punteros teniendo en cuenta que el nombre de un arreglo es un apuntador, o el nombre de un arreglo es la dirección del primer elemento que contiene el arreglo?.-
Si esto es conveniente necesitaría toda la teoría posible porque estoy estudiando apuntadores y nunca pude resolver esta incógnita, y además ¿sería más conveniente con arreglos de punteros?.- 

Saludos y gracias.-


Título: Re:
Publicado por: ivancea96 en 14 Enero 2014, 23:14 pm
I<longitud*
Es la forma q veo para usar unsigned.

Enviado desde mi ST21i mediante Tapatalk


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: rir3760 en 15 Enero 2014, 02:09 am
¿tiene sentido hacer este mismo código con punteros
Ya los estas utilizando. El operador "[]" es uno binario y requiere que uno de sus operandos (no importa cual) sea un puntero.

teniendo en cuenta que el nombre de un arreglo es un apuntador, o el nombre de un arreglo es la dirección del primer elemento que contiene el arreglo?
No exactamente.

El identificador de un array usualmente resulta en la dirección en memoria de (un puntero a) su primer elemento, por ejemplo al utilizar los operadores "[]" y "*". En tu caso:
Código
  1. copia[j] = enteros[i];
  2.  
  3. /* La forma equivalente utilizando el operador "*": */
  4. *(copia + j) = *(enteros + i);

Una de las excepciones es el operador sizeof, en tu caso:
Código
  1. longitud = sizeof enteros / sizeof *enteros;
Da el resultado correcto porque la primera instancia de "enteros" denota (referencia) al array y resulta en el numero de bytes utilizados para almacenarlo.

Un saludo


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: leosansan en 15 Enero 2014, 20:30 pm
Hola.
.............................
¿tiene sentido hacer este mismo código con punteros?
.............................................................

Como apunto rir3760 ya lo estas haciendo.

Pero para que quede todo como punteros en lugar de declarar la variable copia como un array, tal vez sería más propio, que no obligatorio, declarala como como puntero directamente.

Vamos que en lugar de :


Código
  1.    int .....copia[7]...
  2.  

hacerlo como:

Código
  1.    .......................................
  2.    int  *copia;
  3.    longitud = sizeof enteros / sizeof (enteros[0]);
  4.    copia = malloc(longitud*sizeof (int));
  5.    ....................................
  6.        *(copia + j) = *(enteros + i);
  7.    .....................................
  8.    free(copia);
  9.    return 0;
  10. }
  11.  

Lo del enteros[0] es por complementar.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: NOB2014 en 16 Enero 2014, 00:33 am
Hola.
Muchas gracias a ambos, que lastima que todavía no llegué a estudiar memoria dinámica, creo que viene más allá de los apuntadores.-

Saludos.


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: NOB2014 en 16 Enero 2014, 14:17 pm
Ya los estas utilizando. El operador "[]" es uno binario y requiere que uno de sus operandos (no importa cual) sea un puntero.

Tengo una duda:
¿Cuando el identificador de un array puede no ser un puntero?(el apuntador constante a el primer elemento del array).-
Si me la pudieras aclarar me seria de mucha utilidad.-

Saludos


Título: Re: Invertir un arreglo de enteros en lenguaje C.-
Publicado por: rir3760 en 19 Enero 2014, 17:53 pm
Tengo una duda:
¿Cuando el identificador de un array puede no ser un puntero?(el apuntador constante a el primer elemento del array).-
Si me la pudieras aclarar me seria de mucha utilidad.
Los dos casos usuales son cuando este es el operando de los operadores "sizeof" y "&", el otro es cuando una cadena literal es utilizada para inicializar un array.

Un ejemplo con "sizeof" lo tienes en mi mensaje anterior y la explicación en detalle pero en ingles en la pagina 6.3 So what is meant by the ``equivalence of pointers and arrays'' in C? (http://c-faq.com/aryptr/aryptrequiv.html) parte de la comp.lang.c FAQ (http://c-faq.com/index.html).

Un saludo