Dev - C++ - Ayuda con punteros en C

 
Vista:

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 21/09/2020 22:13:00
Hola, estoy realizando un ejercicio y me he quedado atascado, no consigo avanzar.

Tengo esta estructura:

1
2
3
4
5
typedef struct {
    tPartner *client;
    tWorkspace *workspace;
    tContract *totalContract;
} tCoworking;

Lo que quiero es crear una funcion para inicializar, pero no consigo acceder a las variables.

1
2
tCoworking c;
init_coworking (&c);

1
void init_coworking (tCoworking *a) {

Si quiero darle valor a la variable a->client->idClient como seria? no se acceder a ella.

Gracias
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 21/09/2020 23:51:04
Cuando defines una estructura lo que haces es definir una estructura de datos, una organización de la memoria. No sé si es eso lo que no tienes claro o es el uso de punteros. Para lo primero, igual te vale ver un ejemplo más sencillo.
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
typedef struct
{
    int IdClient;
    int c;
}tPartner;
 
typedef struct
{
    tPartner client;
 } tCoworking;
 
 
tPartner p;
tCoworking c;
 
void init_coworking(tCoworking &a)
{
    a.client.IdClient = 100;
    a.client.c = 1;
}
 
void main()
{
    c.client = p;
    init_coworking(c);
}
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 08:51:45
La cosa es que con tanto puntero en la estructura no me quedaba claro como asignar el valor a las variables de cada estructura, ya que la estructura tCoworking tiene 3 punteros.

Lo he logrado de esta forma que no se si es la correcta:

1
2
3
4
5
void init_coworking (tCoworking *c) {
 
    c=(tCoworking *) malloc(sizeof(tPartner));
    c->client=(tPartner *)malloc(sizeof(tPartner));
    c->client->idClient=10;
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
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con punteros en C

Publicado por Rodrigo (539 intervenciones) el 22/09/2020 08:54:43
Cambia

1
c=(tCoworking *) malloc(sizeof(tPartner));

por
1
c=(tCoworking *) malloc(sizeof(tCoworking));
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 22/09/2020 10:36:20
Si pones tPartner client; estás ya reservando memoria en cantidad suficiente para que quepan los datos declarados en la estuctura tPartner. Si pones tPartner *client; estás reservando memoria sólo para contener un puntero a esa estructura. Tienes que ser tú el que reserve la memoria y se la asigne al puntero. Eso sí, tienes que reservar la cantidad de memoria del tamaño de la estructura y asignarla a un puntero del tipo correcto con el cast correcto.
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 13:40:03
Perdonar mi ignorancia pero es que estoy perdido... los punteros me llevan de cabeza.

Hasta ahora tengo:

1
2
3
4
5
6
7
8
9
10
11
void init_coworking (tCoworking *c) {
 
    c=(tCoworking *) malloc(sizeof(tCoworking));
 
    c->client=(tPartner *)malloc(sizeof(tPartner));
 
    c->client->idClient=60;
 
    printf("El valor de idCli es: %i \n", c->client->idClient);
 
  }

Yo lo que quiero es inicializar la estructura para darle valores, pero esto no me funciona:

1
c->client->idClient=60;
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 22/09/2020 13:58:37
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
typedef struct
{
    int IdClient;
}tPartner;
 
typedef struct
{
    tPartner *client;
 } tCoworking;
 
tCoworking* c;
 
 
void init_coworking(){
    c = (tCoworking*)malloc(sizeof(tCoworking));
    c->client = (tPartner*)malloc(sizeof(tPartner));
    c->client->IdClient = 60;
    printf("El valor de idCli es: %i \n", c->client->IdClient);
}
 
 
 
void main()
{
    init_coworking();
}

Así con todas las estructuras que quieras meter en tCoworking.
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 14:18:26
Me da error cuando lo ejecuto, me hacen llamar a la función de este modo:

1
2
3
4
5
6
int main (void)
 
{
  tCoworking c;
 
  init_coworking (&c);


y cuando ejecuto la funcion me da error, me dice :

C:\Users\hhh\Desktop\main.c In function 'init_coworking':
80 14 C:\Users\hhh\Desktop\main.c [Error] incompatible types when assigning to type 'tPartner' from type 'struct tPartner *'
82 11 C:\Users\hhh\Desktop\main.c [Error] invalid type argument of '->' (have 'tPartner')
84 52 C:\Users\hhh\Desktop\main.c [Error] invalid type argument of '->' (have 'tPartner')
28 C:\Users\hhh\Desktop\Makefile.win recipe for target 'main.o' failed
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 22/09/2020 14:24:06
Sí, no es eso lo que he puesto yo. Si pones tCoworking c; dentro del main
1
2
3
4
5
6
7
8
9
10
11
12
void init_coworking(tCoworking* c){
    c = (tCoworking*)malloc(sizeof(tCoworking));
    c->client = (tPartner*)malloc(sizeof(tPartner));
    c->client->IdClient = 60;
    printf("El valor de idCli es: %i \n", c->client->IdClient);
}
 
void main()
{
    tCoworking c;
    init_coworking(&c);
}
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 15:26:37
Vale, ahora si que me funciona, mil gracias por la ayuda a todos, en especial a Nacho.
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 15:51:09
¿Si quisiera meter datos en el siguiente puntero de la estructura lo podría hacer así? : (Me funciona pero no se si es lo correcto)

1
2
3
4
5
6
7
8
9
10
11
12
13
void init_coworking (tCoworking* c) {
 
    tCoworking* b;
 
    c=(tCoworking *) malloc(sizeof(tCoworking));
    c->client=(tPartner *)malloc(sizeof(tPartner));
    c->client->idClient=0;
    c->client->descuento=0;
    strcpy(c->client->nameClient,"");
 
    b=(tCoworking *) malloc(sizeof(tCoworking));
    b->workspace=(tWorkspace *)malloc(sizeof(tWorkspace));
    b->workspace->idWorkspace=25;
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 22/09/2020 16:05:42
Noooooo. Con eso estás creando otra estructura tCoworking. El tCoworking tiene que ser el mismo de antes, c, y al puntero a la estructura workspace del tCoworking c le asignas memoria.

1
2
c->workspace=(tWorkspace *)malloc(sizeof(tWorkspace));
c->workspace->idWorkspace=25;
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 16:12:18
Sería algo así? :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void init_coworking (tCoworking* c) {
 
 
    c=(tCoworking *) malloc(sizeof(tCoworking));
    c->client=(tPartner *)malloc(sizeof(tPartner));
    c->client->idClient=0;
    c->client->descuento=0;
    strcpy(c->client->nameClient,"");
 
    c->workspace=(tWorkspace *)malloc(sizeof(tWorkspace));
    c->workspace->idWorkspace=56;
 
 
    printf("El valor de idWor es: %i \n", c->workspace->idWorkspace);
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 22/09/2020 16:15:57
Casi, a ver.

void *malloc(size_t size)

Malloc reserva memoria del tamaño que le digas. Si reservas memoria para una estructura workspace tienes que pasarle el tamaño de la estructura workspace, no la de cualquier otra.

c->workspace=(tWorkspace *)malloc(sizeof(workspace));
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 16:18:53
Así es, he visto el fallo después de publicar el comentario.

Me estás sirviendo de gran ayuda porque estaba bastante estancado, mil gracias.
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 22/09/2020 16:47:57
No sé por qué os liáis tanto con los punteros.
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 18:03:20
Me surge un nuevo problema con otra funcion: Si quiero meter clientes tengo este codigo y no me funciona, imagino que se está machacando la misma variable todas las llamadas

1
new_partner (&c, 125, "Juan Lopez", 11);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void new_partner (tCoworking* c, int id, char name[], int des) {
 
    c=(tCoworking *) malloc(sizeof(tCoworking));
    c->client=(tPartner *)malloc(sizeof(tPartner));
 
 
 
    if (c->client->idClient == id){
        printf("ERROR: Partner %d is already in the list of partners \n", id);
    }
    else {
        c->client->idClient=id;
        c->client->descuento=des;
        strcpy(c->client->nameClient,"name");
    }
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
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con punteros en C

Publicado por Rodrigo (539 intervenciones) el 22/09/2020 19:22:14
Pon mas contexto, por ejemplo, donde estas definiendo y usando la funcion.

Por otro lado, si estas creando una struct, pidiendo memoria para ella, que valor esperas encontrar en el campo idClient en la linea 8 del codigo anterior? No parece razonable pedirle que tenga un valor a una variable que estas creando recien con malloc.
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

Ayuda con punteros en C

Publicado por Pepe (21 intervenciones) el 22/09/2020 19:35:36
Tengo estas dos structuras;

1
2
3
4
5
6
7
8
9
10
11
typedef struct {
    tPartner *client;
    tWorkspace *workspace;
    tContract *totalContract;
} tCoworking;
 
typedef struct {
    int idClient;
    int descuento;
    char nameClient[];
} tPartner;

y lo que quiero con la funcion new_partner es añadir clientes

llamandola asi:

1
new_partner (&c, 25, "Juan Lopez", 25);

y llega a esta funcion que es la que no me funciona:

1
void new_partner (tCoworking* c, int id, char name[], int des) {

No se como manejar la estructura para meterle diferentes clientes.

En la función init_coworking he inicializado así:

1
2
3
4
5
6
7
8
9
10
11
void init_coworking (tCoworking* c) {
 
 
 
    c=(tCoworking *) malloc(sizeof(tCoworking));
    c->client=(tPartner *)malloc(sizeof(tPartner));
 
c->client->idClient=0;
...
...
..
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
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con punteros en C

Publicado por Rodrigo (539 intervenciones) el 22/09/2020 20:16:28
Aun te falta contexto, pero por lo que escribes SUPONGO que c fue definido como tCoworking asi:

1
tCoworking c;

por lo que ya tienes un tCoworking ahi.

Si le pasas la direccion de memoria de un objeto existente (lo que esta bien) a la funcion init_coworking para inicializarlo, no tienes que pedir memoria de nuevo para ese objeto (lo que haces en la linea 5 del ultimo codigo).
Elimina esa linea de ahi.

Alternativa a esto?
No recibas ningun parametro. Define la variable tCoworking* c; dentro de la funcion y retornala.

Quien invoca la funcion recibe la direccion de memoria de un objeto nuevo y recien inicializado.

Sino, para que entiendas mas:
remueve el malloc que te indico mas arriba

Define 2 variables distintas

1
tCoworking c1, c2;

e invoca la funcion con ellas 2

1
2
init_coworking(&c1);
init_coworking(&c2);

luego puedes espiar o cambiar el contenido de ellas independientemente.
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

Ayuda con punteros en C

Publicado por Nacho (181 intervenciones) el 22/09/2020 20:58:32
Algo así querrás, y no te líes tú solo.
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
typedef struct
{
    int idClient;
    int descuento;
    char nameClient[];
}tPartner;
 
typedef struct
{
    int count;
    tPartner* client;
 } tCoworking;
 
//tCoworking* c;
 
 
tCoworking* Crear()
{
    tCoworking* c = (tCoworking*)malloc(sizeof(tCoworking));
    c->client = (tPartner*)malloc(sizeof(tPartner) * 100);
    c->count = 0;
    return c;
}
 
 
void new_partner(tCoworking* c, int id, char name[], int des) {
 
    int i;
    c->client[c->count].idClient = id;
    c->client[c->count].descuento = des;
    strcpy(c->client[c->count].nameClient, name);
    c->count++;
}
 
void main()
{
    tCoworking* c=Crear();
    new_partner(c, 60, "Pepe", 10);
    new_partner(c, 61, "Lui", 20);
 
}
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