vector/dynamic queue segmentation failure

Asked

Viewed 58 times

1

Hello, the following code is in segmentation failure. Basically I can’t scan this entrance:

ISCOD4 2 3 10 20
1 10.1.1.151 10.1.2.151 10240 1
2 10.1.1.153 10.1.4.152 12288 2
3 10.1.1.156 10.1.4.153 14336 3
4 10.1.1.156 10.1.2.150 2048 1
5 10.1.1.157 10.1.3.150 2048 2
6 10.1.1.158 10.1.4.150 2048 3
7 10.1.1.158 10.1.4.150 2048 3
8 10.1.1.157 10.1.4.150 2048 2
9 10.1.1.158 10.1.4.150 2048 3
10 10.1.1.158 10.1.4.150 2048 3
-1

Follow the entire code below:

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

typedef struct {
    void* *vetor;
    int tamanho;
    int ocupacao;
} VD;

typedef struct{
    void* *vetor;
    int tamanho;
    int ocupacao;
} VDFila;

typedef struct {
    char id[7];
    int cap_enlace;
    int priori;
    int tam_inicial;
    int prop;
    VD filas;
} TypeRouter;

typedef struct {
    int tempo_chegada;
    char ip_origem[15];
    char ip_destino[15];
    int tamanho;
    int priori;
} Pacote;

VD criarVetor(){
    VD vetor;
    vetor.tamanho = 2;
    vetor.ocupacao = 0;
    vetor.vetor = malloc(sizeof(void*)*vetor.tamanho);

    return vetor;
}

void inserirVD(VD *vetor, void* fila){

    if (vetor->ocupacao == vetor->tamanho){
        vetor->tamanho = vetor->tamanho*2;
        vetor->vetor = realloc(vetor->vetor, sizeof(void*)*vetor->tamanho);
    }
    vetor->vetor[vetor->ocupacao] = fila;
    vetor->ocupacao++;
}

VDFila criarFila(){
    VDFila fila;
    fila.tamanho = 2;
    fila.ocupacao = 0;
    fila.vetor = malloc(sizeof(void*)*fila.tamanho);

    return fila;
}

void enfileirar(VDFila *fila, void* elemento){
    if (fila->tamanho == fila->ocupacao){
        fila->tamanho = fila->tamanho*2;
        fila->vetor = realloc(fila->vetor, sizeof(void*)*fila->tamanho);
    }
    fila->vetor[fila->ocupacao] = elemento;
    fila->ocupacao++;
}

void desenfileirar(VDFila *fila){
    int i;
    for (i = 0; i < (fila->ocupacao - 1); i++){
        fila->vetor[i] = fila->vetor[i+1];
    }
    fila->ocupacao--;
}

short vazia(VDFila *fila){
    short vazia = 0;
    if(fila->ocupacao == 0){
        vazia = 1;
    }
    return vazia;
}

TypeRouter gerarRouter(){
    TypeRouter router;
    VDFila fila;
    int i;
    scanf("%s", router.id);
    scanf("%d%d%d%d", &router.cap_enlace, &router.priori, &router.tam_inicial, &router.prop);

    router.filas = criarVetor();

    for (i = 0; i < router.priori; i++){
        fila = criarFila();
        inserirVD(&router.filas, &fila);
    }

    return router;
}

Pacote* ler(int tempo){
    Pacote *pckt;
    Pacote pacote;

    pckt = malloc(sizeof(Pacote));

    pacote.tempo_chegada = tempo;
    scanf("%s %s", pacote.ip_origem, pacote.ip_destino);
    scanf("%d%d", &pacote.tamanho, &pacote.priori);

    *pckt = pacote;

    return pckt;
}

void receberPacote(TypeRouter *router, int prioridade, Pacote *pacote){
    VDFila *fila;
    fila = router->filas.vetor[prioridade-1];
    enfileirar(fila, pacote);
}

void main(){
    TypeRouter router = gerarRouter();
    Pacote* pacote;
    int tempo;

    scanf("%d", &tempo);

    while(tempo >= 0){

        pacote = ler(tempo);

        receberPacote(&router, pacote->priori, pacote);

        scanf("%d", &tempo);
    }   
}

I tried to see the read and router function, but always after the second line of the scanf the crash program.

  • Can explain the format of the input?

  • Typerouter and Package Type

  • char is used and integer in the first input and then whole char char is used in the second integer, which comes in a loop until the first integer is -1.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.