Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Ghio97 en 13 Agosto 2019, 03:18 am



Título: Aparecen numeros ramdon en mi array
Publicado por: Ghio97 en 13 Agosto 2019, 03:18 am
Alguien me podria ayudar con mi codigo en C , lo que quiero es que mediante el motodo "ingresar" asigne un valor a una posicion espesifica a un arreglo y las demas posiciones las marque como vacias pero a la hora de ejecutar aparacen numeros de la nada...... alguien sabe como solucionarlo????

#include<stdio.h>

void ingresar(int ar[],int val, int pos);
void mostrar(int a[], int f);


int main (){
   int b[30];
   ingresar(b,123,5);
   mostrar(b,30);
   return 0;
   
}
void ingresar(int ar[],int val, int pos){
   int i;
   int tamanoDelArreglo=sizeof(ar);
   int tamanioDelPrimerDato=sizeof(ar);
   int longitud=tamanoDelArreglo/tamanioDelPrimerDato;
   if (0<pos<=longitud){
      ar[pos]=val;
   }
   
   
   return ;
   }
   
   
   
   void mostrar(int a[], int f){
    for(int i=1;i<=f; i++){
        printf("%i \t ",i);
        if(a!=0){
        printf("%i",a);
        printf("\n");
        }else{
            printf("Vacio");
            printf("\n");
        }
    }
}


Título: Re: Aparecen numeros ramdon en mi array
Publicado por: EdePC en 13 Agosto 2019, 07:47 am
Saludos,

- Primero tienes que saber que los Array se pasan por Referencia (puntero) a las funciones, por esto no te a ha ser posible hallar el tamaño del Array dado con sizeof() ya que ahora es un puntero, y este devolverá siempre el tamaño en bytes del tipo de variable base, en tu caso un int que suele valer 4 bytes. Luego tu cálculo falla ya que 4 / 4 = 1, entonces nunca alcanza a llegar a la posición 5 que especificas en: ingresar(b, 123, 5);

-- Solución sencilla: Ya que en C se deben especificar los tamaños de los Array (longitud en tu caso), no tiene mucho sentido hallarlos de nuevo XD. O puedes hacerlo fuera de una función.

- Segundo, en C se tiene que declarar las variables y de preferencia también inicializarlas, ya que estas se crean en memoria y tienen como contenido lo que tenga esos espacios de memoria en ese momento, por esto es que te salen números random en tu Array.

- Tercero, revisa tu función mostrar, tu For usa i a 1, y usas ese mismo i tal cual para leer los valores de tu Array, pero el Array empieza en 0. También revisa como guardas tu Valor en la Posición de tu Array.

- De momento esto me funciona a mí:

Código
  1. #include <stdio.h>
  2.  
  3. void ingresar(int ar[], int longitud, int val, int pos);
  4. void mostrar(int a[], int f);
  5.  
  6. int main() {
  7.  int b[30];
  8.  
  9.  // Calcula longitud del Array b
  10.  int longitud = sizeof(b) / sizeof(b[0]);
  11.  
  12.  // Inicializa los valores del Array b a 0
  13.  for ( int i = 0; i < longitud; i++ ) {
  14.    b[i] = 0;
  15.  }
  16.  
  17.  ingresar(b, longitud, 123, 5);
  18.  mostrar(b, longitud);
  19.  return 0;
  20. }
  21.  
  22. void ingresar(int ar[], int longitud, int val, int pos) {
  23.  int i;
  24.  if ( 0 < pos && pos <= longitud ) {
  25.    ar[pos - 1] = val;
  26.  }
  27.  return ;
  28. }
  29.  
  30. void mostrar(int a[], int f) {
  31.  for ( int i = 0; i < f; i++) {
  32.    printf("%i \t ", i + 1);
  33.    if (a[i] != 0) {
  34.      printf("%i", a[i]);
  35.      printf("\n");
  36.    } else {
  37.      printf("Vacio");
  38.      printf("\n");
  39.    }
  40.  }
  41. }

Citar
C:\Users\EdSon\Desktop>gcc ghio.c -o ghio.exe && ghio.exe
1        Vacio
2        Vacio
3        Vacio
4        Vacio
5        123
6        Vacio
7        Vacio
8        Vacio
9        Vacio
10       Vacio
11       Vacio
12       Vacio
13       Vacio
14       Vacio
15       Vacio
16       Vacio
17       Vacio
18       Vacio
19       Vacio
20       Vacio
21       Vacio
22       Vacio
23       Vacio
24       Vacio
25       Vacio
26       Vacio
27       Vacio
28       Vacio
29       Vacio
30       Vacio

C:\Users\EdSon\Desktop>


Título: Re: Aparecen numeros ramdon en mi array
Publicado por: MAFUS en 13 Agosto 2019, 17:26 pm
Si necesitas que un array local se inicialice a 0 puedes usar la propiedad de C que dice que en la definición de un array inicializa los primeros elementos a valores explícitos y el resto a 0 hasta rellenarlo.

Esto quiere decir que si escribes
Código:
int b[30] = {0};
el array se definirá con todos sus valores a 0. Mucho mejor que tener que usar un bucle.