Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

guilhoto

guardar uma string numa lista duma estrutura

Mensagens Recomendadas

guilhoto

boas pessoal

main(){
      int numLinhas,i;
      box* cu;
      lista* pila;
      char aux[1025];
      scanf("%d", &numLinhas);
      getchar();
      fgets(aux,1025,stdin);
      cu=novaBox();
      pila=novaLista();
      insereListaVazia(cu,pila);
      strcpy(pila->last->l,aux);//o erro esta aqui
      printf("%s", cu->l);
      system("pause");

   }

eu gostava de saber o que posso fazer para que consiga passar a string de aux para o l...

passo as estruturas (se precisarem das funcoes digam que ponho tambmem :) )

typedef char linha;
typedef struct box {
       box* next;
       linha* l;
       int linhaa;
} box;
typedef struct lista {
       box* first;
       box* last;       
}lista;

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

happy, mudei para:

main(){
      int numLinhas,i;
      box* cu;
      lista* pila;
      char aux[1025];
      scanf("%d", &numLinhas);
      getchar();
      fgets(aux,1025,stdin);
      pila=novaLista();
      cu=novaBox();    
      insereListaVazia(cu,pila); 
      strcpy(pila->last->l,aux);
      printf("%s\n", pila->last->l);
      system("pause");
      }

typedef struct box {
       box* next;
       char l[1025];
       int linhaa;
} box;
typedef struct lista {
       box* first;
       box* last;       
}lista;

o programa ja imprime bem mas explode a seguir ao printf...

Editado por pmg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg
typedef struct box {
       box* next;

Suponho que estás a usar um compilador de C++.

Se queres aprender C, aconselho-te que uses um compilador de C (ou que configures o teu compilador para C).

Se estás de facto a usar um compilador de C, então olha bem para as mensagens de erro e resolve os erros.

De qualquer maneira (com erros, sem erros, com compilador de C ou C++), aumenta o nível de warnings do teu compilador e faz compilações limpas, sem erros nem warnings.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

estás a dizer que se tirares o system("pause") o programa corre bem ?

altera as definições para :

struct box {
 struct box* next;
 char l[1025];
 int linhaa;
};
struct lista {
 struct box* first;
 struct box* last;       
};

typedef struct box box;
typedef struct lista lista;
// prefiro esta porque o código e torna mais claro (dentro do âmbito dos typedefs)

ou

typedef struct box {
 struct box* next;
 char l[1025];
 int linhaa;
};
typedef struct lista {
 box* first;
 box* last;       
};


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o que esta de errado ai pmg?

typedef struct box {
       box* next; // <--- o tipo de dados "box" não se encontra ainda definido


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Em C, o typedef só introduz o novo nome para o tipo que define depois do ponto-e-virgula (;).

/* novo_nome nao existe */
typedef /* novo_nome nao existe */ <tipo> /* novo_nome nao existe */ <novo_nome>;
/* novo_nome agora já existe */

Eu não sei bem as regras de C++, mas, aparentemente, o teu código compila sem erro, por isso as regras de C++ devem contemplar a situação e compilar o código errado em C.

Ao fazeres

typedef struct box {
       box* next;
       /* ... */
} box;

o tipo box não existe dentro da definição da struct box.

Excepto em casos particulares (como definição de tipos de funções) eu acho que o typedef causa mais danos que beneficios.

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

struct box {
       struct box* next;
       char l[1025];
       int linhaa;
};
struct lista {
       struct box* first;
       struct box* last;       
};
typedef struct box box;
typedef struct lista lista;

deixando assim penso que estara mais correcto :) ?

Editado por pmg
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Excepto em casos particulares (como definição de tipos de funções) eu acho que o typedef causa mais danos que beneficios.

existe um caso em o typedef é mais do que útil, é obrigatório : dados abstractos

//-------------
// stack.h
//-------------
typedef struct Stack Stack

Stack * stack_create();

int stack_destroy(Stack ** stack);

int stack_quantity(Stack * stack, size_t * quantity);

int stack_push(Stack * stack, void * elem);

void * stack_pop(Stack * stack);

int stack_clear(Stack * stack);

//-------------
// stack.c
//-------------
struct StackElem {
 struct StackElem * prev;
 void * elem;
}

struct Stack {
 size_t quantity;
 struct StackElem * top;
}

// implementação das funções ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se tiveres Windows e só programares para Windows, o Visual Studio. eu não uso mas sei dar a mão à palmatória.

caso contrário, Netbeans ou Eclipse são excelentes IDE's mas tenho vindo a ouvir que é demasiado complexo para iniciantes.

Ouvi dizer que o Geany ou o CodeBlocks é bom para iniciantes

ps : o @psweo referenciou num outro tópico recentemente que o Pelles C também será uma boa opção

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

estou a usar o pelles C mas estou a ter uns warnings que penso ser da configuraçao...podes me passar o link desse topico ou dizer onde posso procurar sff :) ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

faz copy-paste dos warnings para aqui

(e todo o código também daria jeito)

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAXLINESIZE 1025
struct box {
 struct box* next;
 char l[1025];
 int linhaa;
};
struct lista {
 struct box* first;
 struct box* last;	
};
typedef struct box box;
typedef struct lista lista;
lista* novaLista(void) {
 lista* list = (lista*)malloc(sizeof(lista));
 list->first = NULL;
 list->last = NULL;
 return list;
}
void mataLista(lista* list) {
 free(list);
}
box* novaBox(void){
 box* caixa = (box*)malloc(sizeof(lista));

 caixa->next = NULL;	
 return caixa;
}
void insereListaVazia(box* caixa, lista* list) {
 list->first = caixa;
 list->last = caixa;
}
void insereLista(box* caixa, lista* list) {
 list->last->next = caixa;
 list->last = caixa;
}
int main(void){
 int numLinhas,i=0;
 box line;
 box* cu;
 lista* pila;
 char aux[1025];
 scanf("%d", &numLinhas);
 getchar();
 fgets(aux,1025,stdin);
 pila=novaLista();
 cu=novaBox();	
 insereListaVazia(cu,pila);
 strcpy(pila->last->l,aux);
 line.linhaa=i;

 for(i=1;i<numLinhas;i++){
		 fgets(aux,1025,stdin);
		 cu=novaBox();
		 insereLista(cu,pila);
		 strcpy(pila->last->l,aux);
		 line.linhaa=i;
 }
//para imprimir todas as strings introduzidas como devo fazer?
}
mataLista(pila);
 return 0;
}

warning #2203: Function 'main' can't be __stdcall, changed to __cdecl.

ja agora como e que posso imprimir todas as strings armazenadas? duvido que as esteja a armanezar correctamente...

basicamente o utilizador introduz o numero de strings que vai meter, e eu quero guardar cada string numa box

Editado por guilhoto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

existe um caso em o typedef é mais do que útil, é obrigatório : dados abstractos

Não concordo.

Repara que, no ficheiro header, só tens pointers (para pointers) para struct Stack

//-------------
// stack.h
//-------------
struct Stack *stack_create();

int stack_destroy(struct Stack **stack);

int stack_quantity(struct Stack *stack, size_t *quantity);

int stack_push(struct Stack *stack, void * elem);

void *stack_pop(struct Stack *stack);

int stack_clear(struct Stack *stack);

//-------------
// stack.c
//-------------
struct StackElem {
 struct StackElem * prev;
 void * elem;
};

struct Stack {
 size_t quantity;
 struct StackElem * top;
};

// implementação das funções ...

PS: não te esqueças dos ponto-e-virgulas :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

warning #2203: Function 'main' can't be __stdcall, changed to __cdecl.

estás a tentar compilar uma aplicação Win32.

deverias ter criado um projecto para consola

ja agora como e que posso imprimir todas as strings armazenadas? duvido que as esteja a armanezar correctamente...

basicamente o utilizador introduz o numero de strings que vai meter, e eu quero guardar cada string numa box

se estás a gravar correctamente, verás depois de tentar imprimir todas as string armazenadas

box * iter = lista->first;
while (iter != NULL) {
 printf("%s\n", iter->l);
 iter = iter->next;
}

Não concordo.

Repara que, no ficheiro header, só tens pointers (para pointers) para struct Stack

mas conheces outra maneira de ter ADT's minimamente seguros do programador ?

PS: não te esqueças dos ponto-e-virgulas :)

pois ... mas para isso tenho os warnings/erros do compilador :D


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

mas conheces outra maneira de ter ADT's minimamente seguros do programador ?

O que fizeste está correcto, mas o typedef não é necessário.

Só que em vez de escreveres Stack * escreves struct Stack * e não usas o typedef.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

sim mas isso compila e executa :) . depois mudo isso.

box * iter = pila->first;
while (iter != NULL) {
 printf("%s\n", iter->l);
 iter = iter->next;
}

assim nao e :) ?

eu introduzi:

andre guilhoto

pedro grilo

output:

andre gu(um losangolo)

pedro grilo

penso que estou perto...talvez seja por nao limpar o aux?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

O que fizeste está correcto, mas o typedef não é necessário.

Só que em vez de escreveres Stack * escreves struct Stack * e não usas o typedef.

engraçado, estava convicto que o compilador necessitava da definição do struct Stack antes do seu uso no protótipo de uma função ...

mas agora pensando bem, até faz sentido. de outro modo o typedef também não deveria dar por não haver a definição do struct Stack :D

obrigada


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

basicamente a excepçao da ultima linha guardada, ele nao imprime do 9 elemento para a frente pondo um losangolo no 9 elemento

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
guilhoto

nope, andre guilhoto

mas abocado meti:

5

andre guilhoto

pedro grilo

manel oliveira

antonio saio

ola joaquim

output:

andre gu* //o * e o losangolo

pedro gu*

manel ol*

antonio *

ola joaquim

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

guilhoto, numa mensagem anterior tens (acho que na funcao createBox() ou parecido)

box* caixa = (box*)malloc(sizeof(lista));

o que me parece francamente mal.

Se estás a fazer uma box, para que queres o tamanho duma lista? ??!?!?!?!???

Para evitar esses deslizes, eu costumo usar o objecto propriamente dito (em vez do tipo) como operando do sizeof.

box *caixa = malloc(sizeof *caixa);

Assim, se mudar o tipo de caixa, só preciso de alterar o código uma vez

box_grande *caixa = malloc(sizeof *caixa);
// box_grande *caixa = (box_grande*)malloc(sizeof(box_grande));

PS: em C, o cast ao valor devolvido pelo malloc() não é necessário. Se o teu compilador se queixa sem o cast, deve ser porque estás a usar um compilador de C++. A presença do cast é redundante e pode esconder um erro que o compilador apanharia se o código estivesse correcto e não tivesse o cast.

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.