Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Percorrendo Listas


Renato Piazza Fermi

Pergunta

Olá Caros,

Escrevi um programa em C que realiza uma rotina de tratamentos de dados vindos do Shell, em seguida esses dados são salvos numa struct.

Estou cometendo algum erro, mas não consigo encontrá-lo.

Muito grato.

Renato

A definição de t_stHd no Header(pegadados.h):

typedef struct stHd {
  int iCpu_Key;
  char szHd_Size[12];
  struct stHd *pstHd_Next;
}t_stHd;
Global (pegadados.c):
t_stHd *gstHd;
No Main(pegadados.c):
gstHd = (t_stHd *)malloc(sizeof(t_stHd));
  vHd();
A procedure vHd() que popula a struct(pegadados.c):
void vHd(void){
  FILE *pfResult;
  char szHdQty[8];          // Quantidade de HD's
  char *pch;
  char szLine[1024];
  int iI = 0;
  strcpy(szRequest, "fdisk -l | grep \"Disk /dev\" | wc -l");
  pfResult = popen(szRequest, "r");
  fgets(szHdQty, sizeof(szHdQty), pfResult);
  szHdQty[strlen(szHdQty) - 1] = 0;
  gstCpu.iHd_Qty = atoi(szHdQty);
  pclose(pfResult);
  char szHdSize[atoi(szHdQty)][16];  // Tamanho dos HD's
  strcpy(szRequest, "fdisk -l | grep \"Disk /dev\"");
  pfResult = popen(szRequest, "r");
  while( (fgets(szLine, sizeof(szLine), pfResult) != NULL) && (iI < atoi(szHdQty)) ){
    strcpy(szHdSize[iI], (strstr(szLine, ": ")+2));
    pch = strtok(szHdSize[iI], "\n");
    strcpy(szHdSize[iI], pch);
    pch = strstr(szHdSize[iI], ",");
    *pch = 0;
    strcpy(gstHd->szHd_Size, szHdSize[iI]);
    iI++;
    gstHd = gstHd->pstHd_Next;
  }
  gstHd->pstHd_Next = NULL;
  pclose(pfResult);
  return;
}

Ao compilar recebo as seguintes mensagens de erro

pegadados: In function `_start':

(.text+0x0): multiple definition of `_start'

/usr/lib/gcc/i486-slackware-linux/4.2.4/../../../crt1.o:(.text+0x0): first defined here

pegadados:(.rodata+0x0): multiple definition of `_fp_hw'

/usr/lib/gcc/i486-slackware-linux/4.2.4/../../../crt1.o:(.rodata+0x0): first defined here

pegadados: In function `_fini':

/glibc-tmp-b75955b10861dacaae44bdced9fc4b9c/glibc-2.7/build-glibc-2.7/csu/crti.S:41: multiple definition of `_fini'

/usr/lib/gcc/i486-slackware-linux/4.2.4/../../../crti.o:/glibc-tmp-b75955b10861dacaae44bdced9fc4b9c/glibc-2.7/build-glibc-2.7/csu/crti.S:41: first defined here

pegadados: In function `vDevices':

(.text+0x80c): multiple definition of `vDevices'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x76b): first defined here

pegadados: In function `vSerial':

(.text+0xcfb): multiple definition of `vSerial'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0xc5a): first defined here

pegadados:(.rodata+0x4): multiple definition of `_IO_stdin_used'

/usr/lib/gcc/i486-slackware-linux/4.2.4/../../../crt1.o:(.rodata.cst4+0x0): first defined here

pegadados: In function `__data_start':

(.data+0x0): multiple definition of `__data_start'

/usr/lib/gcc/i486-slackware-linux/4.2.4/../../../crt1.o:(.data+0x0): first defined here

pegadados: In function `__data_start':

(.data+0x4): multiple definition of `__dso_handle'

/usr/lib/gcc/i486-slackware-linux/4.2.4/crtbegin.o:(.data+0x0): first defined here

pegadados: In function `vTimeNow':

(.text+0xea8): multiple definition of `vTimeNow'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0xe07): first defined here

pegadados: In function `vLocalUser':

(.text+0x1202): multiple definition of `vLocalUser'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x1161): first defined here

pegadados: In function `vKernelVers':

(.text+0x1126): multiple definition of `vKernelVers'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x1085): first defined here

pegadados: In function `vMem':

(.text+0x4d4): multiple definition of `vMem'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x433): first defined here

pegadados: In function `vSoVersion':

(.text+0xf16): multiple definition of `vSoVersion'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0xe75): first defined here

pegadados: In function `vProc':

(.text+0x306): multiple definition of `vProc'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x265): first defined here

pegadados: In function `vCpuName':

(.text+0x1194): multiple definition of `vCpuName'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x10f3): first defined here

pegadados: In function `main':

(.text+0x84): multiple definition of `main'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x0): first defined here

pegadados: In function `_init':

/glibc-tmp-b75955b10861dacaae44bdced9fc4b9c/glibc-2.7/build-glibc-2.7/csu/crti.S:15: multiple definition of `_init'

/usr/lib/gcc/i486-slackware-linux/4.2.4/../../../crti.o:/glibc-tmp-b75955b10861dacaae44bdced9fc4b9c/glibc-2.7/build-glibc-2.7/csu/crti.S:15: first defined here

pegadados: In function `vHd':

(.text+0xdc): multiple definition of `vHd'

/tmp/ccqQzCsC.o:pegadados.c:(.text+0x3f): first defined here

Editado por Renato Piazza Fermi
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

você deve estar chamando o

#include "pegadados.h"

Em vários arquivos, por isso deve estar dando esse monte de "multiple definition"

Tente colocar tudo o que deve ser definido apenas uma vez no seu arquivo pegadados.h dentro do ifndef, assim:

#ifndef _PEGADADOS_H_

#define _PEGADADOS_H_

typedef struct stHd {
  int iCpu_Key;
  char szHd_Size[12];
  struct stHd *pstHd_Next;
}t_stHd;

void func1(a, b, c, ..., z);
void func2(a, b, c, ..., z);
void func3(a, b, c, ..., z);
.
.
.


#endif

Editado por GABRIEL_LOGAN
Link para o comentário
Compartilhar em outros sites

  • 0

Valeu logan, Eu tava compilando com o gcc e tava dando include 2 vezes no header..

Agora estou com outro problema..

Vamos ver se alguém consegue me ajudar nessa:

for( gstHd = stHdOK; fgets(szLine, sizeof(szLine), pfResult); /*stHdOK = stHdOK->pstHd_Next*/ ){  <--- O erro está aqui ...
    strcpy(stHdOK->szHd_Size, (strstr(szLine, ": ")+2));
    pch = strtok(stHdOK->szHd_Size, "\n");
    strcpy(stHdOK->szHd_Size, pch);
    pch = strstr(stHdOK->szHd_Size, ",");
    *pch = 0;    
    printf("sizeHD[%s]\n", stHdOK->szHd_Size);   
  }

Quando eu populo a struct stHdOK primeira vez o dado vem correto, na segunda iteração do for eu encontro um segmentation fault...

Pra quem quizer saber, buffer de entrada é o resultado de um arquivo com 2 linhas.

gstHd é uma struct global que recebe o endereço para o primeiro nó da lista formada pela struct stHdOK.

Abraços..

Editado por Renato Piazza Fermi
Link para o comentário
Compartilhar em outros sites

  • 0

Do que mais você precisa saber??

Vou escrever os structs e mostrar os escopos.:

typedef struct stHd {
  int iCpu_Key;
  char szHd_Size[32];
  struct stHd *pstHd_Next;
}t_stHd;

gstHd - Struct Global

stHdOK - Struct local da procedure vHd(); que é chamada no main.

Minha Ideia é usar a struct local stHdOK para tratar os dados e no fim da procedure vHd atribuí-los a struct global gstHd

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, mesmo sem alguma resposta, lá vai a solução que descobri depois de algum tempo:

Ao popular a struct gstHd, bem como todas as outras, é necessario alocar memoria dinamicamente, tantas quantas forem as vezes necessárias para isso.

Na linha:

gstHd = gstHd->pstHd_Next;
O que estava fazendo de errado era inserir um novo elemento vazio na lista, porém sem alocação de memoria, o que pode ser resolvido com:
gstHd->pstHd_Next = (t_stHd *)malloc(sizeof(t_stHd));

Obrigado. E até mais

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...