Char matrix reference error

Asked

Viewed 75 times

-1

I’m trying to make a code for questions, however he error, I believe it’s time to pass the matrix by reference.

Code to follow:

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


//Troca os valores de 2 variaveis
void trocaValor(float *a,float *b){
    float aux;
    aux = *a;
    *a = *b;
    *b = aux;
}
//Essa void ? uma confirma??o para o programa ficar na pagina dos resultados e n sair para o menu principal
void prosseguir(){
    printf("\n\nDigite qualquer caracter para prosseguir para a proxima atividade");
    getch();
    system("cls");
}
//verifica o maior e o menor valor de um vetor
void verificarMaiorMenor(float *menor, float *maior, int n, float valor[]){
    for(int i=0;i<n;i++){
        scanf("%f", &valor[i]);
   if(i==0){
       *maior = valor[i];
       *menor = valor[i];
   }
        //caso o vetor seja maior q o maior valor antigo, o maior recebe a posi??o atual do vetor
        if(valor[i]>*maior){
            *maior = valor[i];
        }
        //caso o vetor seja menor q o menor valor antigo, o menor recebe a posi??o atual do vetor
        if(valor[i]<*menor){
            *menor = valor[i];
        }
        system("clear");
    }
}
// transforma minutos em horas e minutos
void transfMinHrs(int x, int *minfinal, int *hrs){
    *hrs = x / 60;
    *minfinal = x % 60;
}
//Descreve qual foi a atividade selecionada no menu principal
void atvds(int i){
    printf("Atividade %d\n", i);
    printf("De enter para continuar\n");
    getch();
    system("clear");
}
//atividade 1
void atvd1(){
    int k = 1;
    atvds(k);
    float a, b;
    printf("Digite um valor: ");
    scanf("%f", &a);
    printf("Digite outro valor ae tiu: ");
    scanf("%f", &b);
    trocaValor(&a, &b);
    printf("a = %f\nb = %f", a, b);
    prosseguir();
}
//atividade 2
void atvd2(){
    int n, k = 2;
    atvds(k);
    printf("Digite a quantidade de valores a serem digitados: ");
    scanf("%d", &n); //l? o tamanho do vetor de valores
    float valor[n], menor, maior;
    system("clear");
    verificarMaiorMenor(&menor, &maior, n, valor);
    printf("O maior valor ?: %f\nO menor valor ?: %f", maior, menor);
    prosseguir();
}
//atividade 3
void atvd3(){
    int k = 3, min /*minutos passados ao longo do dia*/, minfinal, hrs;
    atvds(k);
    printf("Digite o tempo em minutos: ");
    scanf("%d", &min);
    transfMinHrs(min, &minfinal, &hrs);
    printf("%d horas e %d minutos", hrs, minfinal);
    prosseguir();
}
//le os nomes e verifica as condicoes
void lerNome(char *nomes[10][50], int *tamNome[]){
    char nome[50];
    for(int i=0;i<10; i++){
     printf("Digite o %d nome:\n", i);
          scanf("%s", &nome);
     *tamNome[i] = strlen(nome);
     strcpy(*nomes[i], nome);
   }
}
//atividade 4
void atvd4(){
   char nomes[10][50];
   int tamNome[10];
    lerNome(&nomes, &tamNome);
}
main(){
    int opc;
    opc = 10; // declara opc com o valor 10, para entrar no while
    while(opc != 0){
        // mostra as op??es
        printf("1 --> Atividade 1\n");
        printf("2 --> Atividade 2\n");
        printf("3 --> Atividade 3\n");
        printf("4 --> Atividade 4\n");
        printf("0 --> Sair\n");
        scanf("%d", &opc); //l? o opc
        //de acordo com o valor do opc ele mostra uma atividade diferente ou fecha o programa
        switch(opc){
            case 1:
                system("clear");
                atvd1();
                opc = 10;
            break;
            case 2:
                system("clear");
                atvd2();
                opc = 10;
            break;
            case 3:
                system("clear");
                atvd3();
                opc = 10;
            break;
            case 4:
                system("cls");
                atvd4();
                opc = 10;
            break;
            case 0:
                system("cls");
                printf("Obrigado por ver professora <3\n\n");
            break;
        }
    }
}

Error is on line 100:

//le os nomes e verifica as condicoes
void lerNome(char *nomes[10][50], int *tamNome[]){ // O ERRO PODE ESTAR RELACIONADO COM A PASSAGEM DA MATRIZ nomes[][] PARA A FUNÇÃO lerNome
    char nome[50];
    for(int i=0;i<10; i++){
     printf("Digite o %d nome:\n", i);
          scanf("%s", &nome);
     *tamNome[i] = strlen(nome);
     strcpy(*nomes[i], nome);
   }
}
//atividade 4
void atvd4(){
   char nomes[10][50];
   int tamNome[10];
    lerNome(&nomes, &tamNome); //--> LINHA 100
}

Erro

1 answer

1

The types you used in the function parameters are not right, and there are more things in that function that are also not right. At the end I think you need to review the pointer part in some detail.

Change your job description lerNome for:

void lerNome(char nomes[10][50], int tamNome[10]){ //sem * nos parametros
    char nome[50];
    for(int i=0;i<10; i++){
         printf("Digite o %d nome:\n", i);
         scanf("%s", nome); //sem &
         tamNome[i] = strlen(nome); //sem *
         strcpy(nomes[i], nome); //sem *
    }
}

The call goes like this:

void atvd4(){
    ...
    lerNome(nomes, tamNome);  //sem &
}

This already guarantees that the code compiles without errors.

The idea that is escaping you is that when you pass an array to a function, that array will become a pointer to the first element. That is, if you create an array of integers:

int arr[] = {1, 2, 3, 4};

To pass it to a function you can use one of two notations:

void func (int arr[]);

Or

void func (int *arr);

Now you can’t do:

void func (int *arr[]);

Because this is already a different thing, it is already an array of pointers, which does not correspond to the type of arr declared out of office.

  • Thank you I will try, for 2 dimensions is the same logic?

  • @Arisbardelotto Yes to 2 dimensions is the same logic. If you repair the correction I proposed in my answer is actually about 2 dimensions.

Browser other questions tagged

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