Printing problem with C

Asked

Viewed 104 times

0

Good morning. I have a problem to solve a question of a question here in the college. Follow the question.

inserir a descrição da imagem aqui

The teacher gave the source code (below)

#include<stdio.h>
#include<stdlib.h>
#include <locale.h>
#define dimencao 10

typedef struct celula{
    int *endereco;
    int cont;
    int tam;
}Celula;

void menu();
void  verifica(int *espaco);
void liberarEspaco(Celula vetor[]);
void inicializa(Celula vetor[]);
void cria_vetor(Celula vetor[], int posicao);
void insere(Celula vetor[]);
void imprime(Celula vetor[]);
void imprimirIntercalado(Celula vetor[]);
int maiorTam(Celula vetor[]);

int main(){
    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 could give me that strength, I’d appreciate it. :)

  • Option 4 = void printIntercalado(Vector cell[]);

  • Can you be more specific about what you want? What’s the problem?

  • Bigown, what’s happening is that I fill in the values and at the time I ask to print intercalated locks. Type, I did the test of printing every vector (option 3), it shows the filled value, but at the time of intercalation... I tried to check if the Cell vector is NULL before reading, but Codeblocks did not allow, saying I was comparing a pointer with integer.

  • Aren’t you comparing the address the pontriro points to instead of the value it stores? I didn’t see the code. By the way, try debug step by step, step by step, from code Blocks. So you can know which problematic line.

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 the [0] is left over.

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

One more case, probably [ic] is left over too, because NULL is pointer type, 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 it is vector[j]. address is a null or invalid address, trying to read the contents of this address with vector[j]. address[n] causes the break.

  • It helped a lot. Grateful.

Browser other questions tagged

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