como declaro una variable en un void para que varie?

Iniciado por AXA, 25 Octubre 2021, 07:03 AM

0 Miembros y 1 Visitante están viendo este tema.

AXA

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.

Eternal Idol

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.

void uno(int *c)
{
  *c=19;
}
...
uno(&d);
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

AXA

#2
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);
}

MAFUS

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:
*i2.i1=i3;
estás dereferenciando i1, no i2.
Una pequeña prueba de ello:
#include <stdio.h>
#include <stdlib.h>

struct st {
int *miembro;
};

int main() {
struct st mi_estructura;
mi_estructura.miembro = malloc(sizeof(int));
*mi_estructura.miembro = 20;

printf("%d\n", *mi_estructura.miembro);

free(mi_estructura.miembro);
}

Por tanto debería ser así:
(*i2).i1=i3;
Aunque en C tienes el operador flecha que te limpia el 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í:
#include <stdio.h>

struct st {
int miembro;
};

void inicializa_a_20(struct st *una_estructura) {
una_estructura->miembro = 20;
// alternativa:
// (*una_estructura).miembro = 20;
}

int main() {
struct st mi_estructura;
inicializa_a_20(&mi_estructura);
printf("%d\n", mi_estructura.miembro);
}