Printing problem with C

0

Good morning. I have a problem solving a question of an issue here in college. Here's the question.

Theteachergavethesourcecode(following)

#include<stdio.h>#include<stdlib.h>#include<locale.h>#definedimencao10typedefstructcelula{int*endereco;intcont;inttam;}Celula;voidmenu();voidverifica(int*espaco);voidliberarEspaco(Celulavetor[]);voidinicializa(Celulavetor[]);voidcria_vetor(Celulavetor[],intposicao);voidinsere(Celulavetor[]);voidimprime(Celulavetor[]);voidimprimirIntercalado(Celulavetor[]);intmaiorTam(Celulavetor[]);intmain(){setlocale(LC_ALL,"Portuguese");
    Celula vetor[dimencao];
    int opcao;
    inicializa(vetor); // Inicializa todo o vetor com valor NULL
    menu();
    scanf("\n%d", &opcao);
    while(opcao != 0){
        system("PAUSE");
        system("cls");
            switch(opcao){
                case 1: insere(vetor); break;
                case 2: liberarEspaco(vetor); break;
                case 3: imprime(vetor); break;
                case 4: imprimirIntercalado(vetor);
                default: printf("\nValor inválido!\n"); break;
            }
        menu();
        scanf("\n%d", &opcao);
    }
    return 0;
}


void menu(){
    printf("********************* MENU *************************");
    printf("\n*\tDigite uma das opções abaixo:              *");
    printf("\n*\tDigite 1 para inserir elementos no vetor.  *");
    printf("\n*\tDigite 2 para liberação de espaço no vetor.*");
    printf("\n*\tDigite 3 para imprimir todo o vetor.       *");
    printf("\n*\tDigite 4 Imprimir intercalado inicial     *");
    printf("\n*\tDigite 0 para SAIR.                        *");
    printf("\n----------------------------------------------------\n");
    printf("Digite AQUI -> ");
}

void liberarEspaco(Celula vetor[]){
    int espaco;
    printf("Informe o vetor que deseja liberar: Faixa entre 1 - 10:");
    printf(" -> ");
    scanf("\n%d", &espaco);
    verifica(&espaco);
    if (vetor[espaco].endereco == NULL){
        printf("\nVetor %d VAZIO não é possível liberar espaço !!!\n\n", espaco);
    } else{
        int i = 0;
        for(i = 0; i < vetor[espaco-1].tam; i++)
            free (vetor[espaco-1].endereco[i]);
    }
}

void inicializa(Celula vetor[]){
    int i;
    for (i=0; i<dimencao; i++){
        vetor[i].endereco = NULL;
    }
}

void cria_vetor(Celula vetor[], int posicao){

    int size;
    printf("\nInforme o tamanho do vetor na posição %d: ", posicao);
    scanf("\n%d",&size);
    while(size <= 0){
        printf("\nTamanho deve ser maior que zero !!! ");  // validar a faixa
        printf("\nInforme novamente -> ");
        scanf("\n%d",&size);
    }
    vetor[posicao-1].endereco = (int *) malloc(size*sizeof(int));
    vetor[posicao-1].cont = 0;
    vetor[posicao-1].tam = size;
}

void insere(Celula vetor[]){

    int posicao, num;
    printf("\nQual posição você deseja inserir? Faixa entre 1 - 10: ");  // validar a faixa
    printf("-> ");
    scanf("\n%d",&posicao);
    verifica(&posicao);
    if(vetor[posicao-1].endereco == NULL){
        cria_vetor(vetor, posicao);
    }
    if(vetor[posicao-1].cont == vetor[posicao-1].tam)    //verificar se o vetor endereço está cheio
        printf("\nVetor %d está CHEIO !!! \n\n", posicao);
    else{
        printf("\nInforme o elemento: ");
        printf("-> ");
        scanf("\n%d",&num);
        vetor[posicao-1].endereco[vetor[posicao-1].cont] = num;
        vetor[posicao-1].cont++;
        printf("\n");
    }
}

void imprime(Celula vetor[]){

    int i, j;
     for(i=0; i<dimencao; i++){
        if (vetor[i].endereco != NULL){
            printf("\n------------");
            printf("\nVetor %d", i+1);
            printf("\n____________");
            for(j=0; j<vetor[i].cont; j++)
                printf("\n%d", vetor[i].endereco[j]);
            printf("\n\n");
        }else
          printf("\nVetor %d VAZIO", i+1);
     }
     printf("\n\n");
}

void verifica(int *espaco){
    while(*espaco < 1 || *espaco > 10){
        printf("\nPosição do vetor não corresponde! Faixa entre 1 - 10: ");  // validar a faixa
        printf("\nInforme novamente -> ");
        scanf("\n%d", &(*espaco));
    }
}

int maiorTam(Celula vetor[]) {
    int i = 0;
    int maior = 0;

    for(i = 0; i < dimencao; i++)
        if(vetor[i].tam > maior)
            maior = vetor[i].tam;

    return maior;
}

void imprimirIntercalado(Celula vetor[]) {
    int maior = maiorTam(vetor);
    int i, ic = 0, j;

    for(i = 0; i < maior; i++) {
        for(j = 0; j < dimencao; j++)
            if(vetor[j].endereco[0] != NULL)
                if(vetor[j].endereco[ic] != NULL)
                    printf("%d ", vetor[j].endereco[ic]);
        ic++;
    }

}

Every time I try to run option 4, the program hangs.

If you can give me this strength, thank you. :)

    
asked by anonymous 31.08.2015 / 16:24

1 answer

1

Just try to compile to find the errors effortlessly by solving point b:

free (vetor[espaco-1].endereco[i]);

This is trying to release an integer as if it were an address. Probably the correct one would be to remove the vector suffix [i].

if(vetor[j].endereco[0] != NULL)

Another case where an integer is being looked at as an address, probably [0] is left over.

if(vetor[j].endereco[ic] != NULL)

One more case, probably [ic] is also left over, because NULL is of type pointer, so the intention should be to compare with pointer.

Each of these errors can cause the program to break. In the specific case of the question, it is the second problem that causes the break, because if vector [j] .jar is a null or invalid address, try to read the contents of this address with vector [j].

    
01.09.2015 / 06:08