• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Upper

Problemas com estruturas e apontadores

11 mensagens neste tópico

Boa tarde...

Tenho estado aqui com um problema que envolve estruturas e apontadores.

Preciso de criar uma funcao generica que ira ser utilizada noutra para inserir determinadas informacoes na estrutura

de momento tenho este rabisco de codigo

void le_nss(NUMERO *numero)
{
  
  /*int i;
     printf("Qual e o numero de serie: "); scanf(" %d", &i);
     
     le_int(&numero->num_serie, i); 
*/
}

A funcao generica e a le_int e tem como cabeçalho

int le_int(char *text, int *num)

-------------------

Alguem pode.me ajudar a resolver estes problema?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas queres guardar o i no num_serie? Se sim, então tens de ter cuidado porque têm tipos diferentes: o num_serie é string enquanto que i é int. E acho que estás a passar mal os parâmetros na le_int. O 1º não precisa do operador & porque sendo numero um apontador para a estrutura, o operador '->' já acede ao campo correctamente. No i é que precisas de indicar o endereço através do &.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

typedef struct numero
{

    int num_serie;

}NUMERO;

A estrutura e esta...esqueci de passar

Tudo bem mas agora como e que eu do le_int insiro nesta estrutura...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sendo assim, então o tipo char* na função le_int está incorrecto. Já agora, peço desculpa mas enganei-me no post anterior, tu estavas a fazer correctamente, eu é que vi mal a maneira como estavas a fazer. Aqui fica a forma como fiz:

#include <stdio.h>
#include <stdlib.h>

typedef struct numero
{
    int num_serie;

}NUMERO;

int le_int(int *num, int i) {
    if (num) {
        *num=i;
        return 1;
    }
    else
        return 0;
    }

void le_nss(NUMERO *numero)
{
    int i;
    printf("Qual e o numero de serie: ");
    scanf("%d", &i);
    le_int(&numero->num_serie,i);
}

int main(void) {
    NUMERO *n;
    n = (NUMERO*)malloc(sizeof(NUMERO));
    le_nss(n);
    printf("%d\n",n->num_serie);
    return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja vi, assim funciona mas se nao podesse utilizar o malloc como e que ficaria?

(e que assim exploro o lado mais "estupido")

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Repara que eu ao início estou a criar um apontador para a estrutura, e não a própria estrutura, isto é, estou apenas a alocar 4 bytes (apontador) que eventualmente referenciarão a estrutura (que poderá ter uma dimensão variável). De modo que me vejo obrigado a alocar espaço para a própria estrutura posteriormente através do malloc.

Caso quisesse criar logo a estrutura bastava definir: 'NUMERO n', e usava o operador '.' para aceder aos campos da mesma.

int main(void) {
    NUMERO n;
    le_nss(&n);
    printf("%d\n",n.num_serie);
    return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas eu nao posso por exemplo usar o apontador da estrutura mas em vez de reservar memoria simplesmente usala?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se não reservares memória, o apontador aponta para uma zona de memória qualquer e a estrutura em si ainda não existe. Só depois do malloc é que a estrutura é criada. Até lá só tens um mero apontador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Reparei agora uma coisa no teu le_int poseste int * num e nao char * ....

existe e claro algumas modificacoes certo»?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pus int* porque tu vais passar o endereço do inteiro pertencente à estrutura (num_serie) onde vais guardar o valor lido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora