Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AXA en 25 Octubre 2021, 07:03 am



Título: como declaro una variable en un void para que varie?
Publicado por: AXA en 25 Octubre 2021, 07:03 am
en pascal procedure uno(var c:integer)
todo lo que pasa en el procedure sobre c se devuelve el cambio en el main
en c
void uno(int c)
{c=19}
main(){
int d;
d=8;
uno(d);
//d ahora sigue valiendo 8 y quiero que se asigne en uno 19}
}
como hago?
seguro que ETERNAL IDOL firme me dara la posta.


Título: Re: como declaro una variable en un void para que varie?
Publicado por: Eternal Idol en 25 Octubre 2021, 09:57 am
Te lo dije en el otro hilo, con un ejemplo y un enlace que lo explica detalladamente. Tenes que pasar el parametro por referencia y no por valor.

Código
  1. void uno(int *c)
  2. {
  3.  *c=19;
  4. }
  5. ...
  6. uno(&d);


Título: Re: como declaro una variable en un void para que varie?
Publicado por: AXA en 25 Octubre 2021, 12:06 pm
Esto no lo hiba a descubrir nunca. Otra vez graciacias.



Me surgio un problema con el struct. Lo resolvi usando variables glovales, pero no es la idea. es molesto asignar antes de llamar.

struct st{ int i1 }

void uno(st *i2){
       int i3;
       i3=20;
       *i2.i1=i3;//esto no se puede! =&i3 tampoco. pruebo no?
}
void main()
st i;
uno(&i);
}


Título: Re: como declaro una variable en un void para que varie?
Publicado por: MAFUS en 25 Octubre 2021, 13:51 pm
Usa etiquetas GeSHi para insertar el código. Están en la barra de herramientas, en un desplegable, cuando estás escribiendo un post o una respuesta. (Para moderadores y webmaster: Sería mejor cambiar el texto Código GeSHi por algo más intuitivo como 'Elige lenguaje...' o 'Color syntax...'.

AXA, ¿qué estás usando para aprender C?

Veo main sin tipo o main con tipo void... Normalmente un libro o tutorial (de C moderno, no el pre-ansi) te dice que main es de tipo int y hay que marcarlo explícitamente.

También debes tener en cuenta la precedencia de operadores:
Código:
*i2.i1=i3;
estás dereferenciando i1, no i2.
Una pequeña prueba de ello:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct st {
  5. int *miembro;
  6. };
  7.  
  8. int main() {
  9. struct st mi_estructura;
  10. mi_estructura.miembro = malloc(sizeof(int));
  11. *mi_estructura.miembro = 20;
  12.  
  13. printf("%d\n", *mi_estructura.miembro);
  14.  
  15. free(mi_estructura.miembro);
  16. }
Por tanto debería ser así:
Código:
(*i2).i1=i3;
Aunque en C tienes el operador flecha que te limpia el código:
Código:
i2->i1=i3;

Por tanto el código último que has puesto, solucionados estos pequeños fallos y poniendo nombres representativos en los identificadores, quedaría algo así:
Código
  1. #include <stdio.h>
  2.  
  3. struct st {
  4. int miembro;
  5. };
  6.  
  7. void inicializa_a_20(struct st *una_estructura) {
  8. una_estructura->miembro = 20;
  9. // alternativa:
  10. // (*una_estructura).miembro = 20;
  11. }
  12.  
  13. int main() {
  14. struct st mi_estructura;
  15. inicializa_a_20(&mi_estructura);
  16. printf("%d\n", mi_estructura.miembro);
  17. }