Dev - C++ - un resultado raro

 
Vista:
sin imagen de perfil

un resultado raro

Publicado por Bryan (1 intervención) el 17/09/2015 06:32:46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <conio.h>
#include <stdio.h>
int tabla(num1,num2)
{
int res=1, *v;
v= new int[num2];
for(int i=1;i<=num2;i++)
{
  v[i]=num1*i;
  }
  return *v;
}
void main ()
{
int a,b, *x;
printf("este programa permite mostrar la tabla de multiplicacion de un numero hasta el numero que usted desee");
printf("\n ingrese un numero: ");
scanf("%d",&a);
printf("\n ingrese cuantos numeros va a multiplicar en la tabla: ");
scanf("%d",&b);
x= new int[b];
*x=tabla(a,b);
for(int i=1;i<=b;i++)
{
printf("\n %d",x[i]);
}
getch();
}



al hacer este programa que permite crear una tabla de multiplicar en una funcion, me aperece unn resultado raro, muchos numeros sin sentido, por que??
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

un resultado raro

Publicado por aguml (522 intervenciones) el 18/09/2015 01:57:34
V es creada dentro de la función y ¿donde liberas esa memoria? V tiene que ser creada en main y ser pasada como parámetro a la función y no necesitas retornar ni su puntero.
Un ejemplo para que lo entiendas.
1
2
3
4
5
6
7
8
9
10
11
12
int main (){
   int *v, x=10;
   v=new[x];
   Funcion (v,x);
   deleite []v;
   retiro 0;
}
 
void Funcion (int *v, int size){
   for (int i=0;i <size;i++)
      *v [x]=i;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

un resultado raro

Publicado por Hector (45 intervenciones) el 18/09/2015 19:55:21
El único problema que tienes es en el manejo de los punteros, veras, si quieres devolver un array de datos por medio de una función le tendrías que agregar en el encabezado de la función el asterisco.

1
2
int funcion(int a, int b) // Esta funcion devolvera el valor de un solo entero.
int* funcion_2(int a, int b) // Mientras que esta devolvera la direccion de memoria de un entero

Aunque puedes usar ambas funciones si quieres devolver un solo elemento, la segunda funcion te puede devolver array de elementos, ahora, como devolver un array en una función?, fácil, simplemente escribes el array sin index, el computador enviara la dirección de memoria del primer elemento del array, y como un array es un conjunto de punteros conectados, te devolverá todos los elementos de este.

1
return array;

Por ultimo, ya lo que queda es asignar el puntero del array al que tienes en el main

1
array = funcion_que_devuelve_un_puntero_de_entero(int a, int b);

Aqui te dejo el codigo que hiciste con los cambios:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <conio.h>
#include <stdio.h>
 
// Los int de las funciones
// Se agrego asterisco al int de la funcion
int* tabla(int num1, int num2)
{
    int res=1, *v;
 
    v = new int[num2];
 
    for(int i=1;i<=num2;i++)
    {
        v[i]=num1*i;
    }
    // Se removio el asterisco de la funcion
    return v;
}
 
int main ()
{
    int a,b, *x;
 
    printf("este programa permite mostrar la tabla de multiplicacion de un numero hasta el numero que usted desee");
 
    printf("\n ingrese un numero: ");
    scanf("%d",&a);
 
    printf("\n ingrese cuantos numeros va a multiplicar en la tabla: ");
    scanf("%d",&b);
 
    x= new int[b];
 
    // Se removio el asterisco del x
    x=tabla(a,b);
 
    for(int i=1;i<=b;i++)
    {
        printf("\n %d",x[i]);
    }
 
    getch();
 
    return 0;
}

Te recomiendo leer articulos sobre array y punteros en c, de aqui yo obtuve la info.

http://pdosnew.csail.mit.edu/6.828/2014/readings/pointers.pdf

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

un resultado raro

Publicado por aguml (522 intervenciones) el 20/09/2015 05:41:12
Tu código esta mal Héctor. Usas dos veces new y dentro de la función no liberas la memoria, algo que no es recomendable y tampoco lo haces en el main y aunque liberases en el main solo literarias una de las dos quedando la otra en el limbo sin poderla usar. El new del main sobraría en tu código aunque sigo creyendo que es más correcto pasarme como parámetro el puntero y el tamaño.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

un resultado raro

Publicado por Hector (45 intervenciones) el 20/09/2015 17:11:20
Tienes razón sobre los 2 new, nada mas es necesario tener el new de la función tabla, sobre liberar la memoria, se puede hacer dentro del main ya que estas manipulando la misma dirección del array que esta en la función.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <conio.h>
#include <stdio.h>
 
// Los int de las funciones
// Se agrego asterisco al int de la funcion
int* tabla(int num1, int num2)
{
    int res=1, *v;
 
    v = new int[num2];
 
    for(int i=1;i<=num2;i++)
    {
        v[i]=num1*i;
    }
    // Se removio el asterisco de la funcion
    return v;
}
 
int main ()
{
    int a,b, *x;
 
    printf("este programa permite mostrar la tabla de multiplicacion de un numero hasta el numero que usted desee");
 
    printf("\n ingrese un numero: ");
    scanf("%d",&a);
 
    printf("\n ingrese cuantos numeros va a multiplicar en la tabla: ");
    scanf("%d",&b);
 
    // Se elimino el x = new int
 
    // Se removio el asterisco del x
    x=tabla(a,b);
 
    for(int i=1;i<=b;i++)
    {
        printf("\n %d",x[i]);
    }
 
   // Se libera la memoria
    delete []x;
    getch();
 
    return 0;
}

Tanto por referencia como por valor pueden ser validos, en mi opinión, depende mas de la necesidad que tengas, y del uso que le vayas a dar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar