Ir ao conteúdo
  • Cadastre-se

C A expressão deve conter tipo ponteiro para objeto


Daniel Pio
Ir à solução Resolvido por Ansi C,

Posts recomendados

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
void calc_soma(int *mat_A, int *mat_B, int *mat_C)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			mat_C[i][j] = mat_A[i][j] + mat_B[i][j];
		}
	}

	printf("Matriz C:\n");

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) 
		{
			printf("\%i", *mat_C[i][j]);
		}
		printf("\n");
	}

}

int main()
{

setlocale(LC_ALL, "pt_BR.UTF-8");
int mat_A[4][4];
int mat_B[4][4];
int mat_C[4][4];
int i = 0;
int j = 0;

for (i = 0; i < 4; i++) 
{
	for (j = 0; j < 4; j++) 
	{
		printf("Digite o valor referente a posição linha %i e coluna %i da matriz A: ", i, j);
		scanf_s("%d", &mat_A[i][j]);
		if (mat_A[i][j] < 0) 
		{
			printf("\nEncerrando programa.\n");
			exit(0);
		}
	}
	printf("\n");
}


for (i = 0; i < 4; i++)
{
	for (j = 0; j < 4; j++)
	{
		printf("Digite o valor referente a posição linha %i e coluna %i da matriz B: ", i, j);
		scanf_s("%d", &mat_B[i][j]);
		if (mat_B[i][j] < 0)
		{
			printf("\nEncerrando programa.\n");
			exit(0);
		}
	}
	printf("\n");
}


system("pause");
return 0;
}

Estou tendo dificuldade para encontrar a solução desse meu problema. Sempre que tento compilar esse code tenho esse retorno do Visual studio: A expressão deve conter tipo ponteiro para objeto. Desde já obrigado.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Daniel Pio disse:

Estou tendo dificuldade para encontrar a solução desse meu problema. Sempre que tento compilar esse code tenho esse retorno do Visual studio: A expressão deve conter tipo ponteiro para objeto. Desde já obrigado.

 

nada tem a ver com o Visual Studio. Apenas C.

 

// ...
void calc_soma(int* mat_A, int* mat_B, int* mat_C)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			mat_C[i][j] = mat_A[i][j] + mat_B[i][j];
		}
	}

 

  • Antes de tudo: nunca escreva assim. Declare as variáveis de controle do for DENTRO do for. Levou 10 anos para ser possível fazer isso. Mas isso foi há 40 anos atrás.
  • Evite void a todo custo. É um desperdício e muitas vezes um erro.
  • Uma soma de matrizes retorna uma matriz de mesma ordem, então talvez concorde que seria mais legível e controlável ter algo como um tipo Matriz que contivesse a matriz e as dimensões, e poder escrever
     
        Matriz*    soma ( Matriz* A, Matriz*  B)

    E depois usar do modo simples: 
     
        Matriz*    A;
        Matriz*    B;
    
        // ...
    
        Matriz* C = soma( A,B );

     

De volta ao programa: 

 

mat_A é o que? int*...  Só que em main()  declarou 

 

    int mat_A[4][4];

 

Em main() você pode escrever mat_A[0][0] por exemplo, e isso vai ser o que? int.

 

Mas em soma() mat_A é apenas int*, um ponteiro para int. Então não pode escrever isso usando índices na função. Apenas pode usar como ponteiro e calcular os deslocamentos. Se quer acessar os elementos assim faça as contas: C não tem matrizes na verdade, como FORTRAN. C tem apenas vetores. 

 

Exemplo

 

Preste atenção nesse exemplo abaixo e se não entender pergunte de novo. Não é comum ver esse tipo de exemplo em livros ou apostilas.

 

Considere a matriz 3x2, porque eu não quero digitar muito e também porque uma matriz quadrada geraria dúvida:

 

	0  1
	2  3
	4  5

 

E a saída 

 

ultimo valor usando [][] = 5
ultimo valor usando ponteiro para matriz = 5
ultimo valor usando ponteiro para int = 5

 

Desse programa que só tem 10 linhas de código afinal:

 

#include <stdio.h>

int main(void)
{
	int mat_A[3][2] = { { 0,1 }, { 2,3 }, { 4,5 } };
	// M é um ponteiro para int[3][2]
	int(*M)[3][2] = (int(*)[3][2]) mat_A;

	// acessando mat_A[2,1] de 3 modos
	// [1] usando a matriz com os indices
	int um =		mat_A[2][1];
	// [2] usando um ponteiro para uma matriz
	int outro =		(*M)[2][1];
	// [3] usando um ponteiro para int
	int* pInt =		(int*)( &mat_A[0][0] + (2 * 2) + 1);

	printf("ultimo valor usando [][] = %d\n", um );
	printf("ultimo valor usando ponteiro para matriz = %d\n", outro);
	printf("ultimo valor usando ponteiro para int = %d\n", *pInt );

	return 0;
}

 

E pode ver  3 maneiras de chegar até o 5. Adapte para seu caso, mas esteja certo de entender isso se pretende programar muito em C. Sim, é um 1nf3rn0.

 

Sugiro escrever como eu falei no início, usando uma estrutura.

 

 

Link para o comentário
Compartilhar em outros sites

  • Solução
Em 22/05/2021 às 22:34, Daniel Pio disse:

A expressão deve conter tipo ponteiro para objeto

São aquelas expressões com notação de array com duplo subscritor. A notação usada é de ponteiro para array.

 

Em 22/05/2021 às 22:34, Daniel Pio disse:

mat_C[i][j] = mat_A[i][j] + mat_B[i][j];

printf("\%i", *mat_C[i][j]);

 

O curioso é maneira de avisar, a menos que tenha omitido o resto da mensagem,

Pois, não diz objetivamente o que é o erro, mas sim, o que se espera, ou seja, o programador quer um   int[][T]   a partir de   int*  (ou int[]).

 

 

Em 22/05/2021 às 22:34, Daniel Pio disse:

void calc_soma(int *mat_A, int *mat_B, int *mat_C)

A resposta dessa função é bem mais que calcular, após somar imprime o resultado.

 

Em 22/05/2021 às 22:34, Daniel Pio disse:


	printf("Matriz C:\n");

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) 
		{
			printf("\%i", *mat_C[i][j]);
		}
		printf("\n");
	}

 

Com a sobrecarrega da função remove-se o significado (ou parte) do seu retorno.

 

E quando digo retorno, refiro-me a variável   mat_C   que é a SOMA.

 

 

Em 22/05/2021 às 22:34, Daniel Pio disse:


printf("\%i", *mat_C[i][j]);

 

Nesse comando o programador fica mais exigente. Essa é a notação de ponteiro para array duplo ou (int *)[T1][T2]

 

[:)]

Link para o comentário
Compartilhar em outros sites

7 horas atrás, mauro_b disse:

O curioso é maneira de avisar, a menos que tenha omitido o resto da mensagem,

Pois, não diz objetivamente o que é o erro, mas sim, o que se espera, ou seja, o programador quer um   int[][T]   a partir de   int*  (ou int[]).

 

Não é o caso. O erro está bem determinado. Em soma() mat_A é int*, e um tipo assim não admite índices, os tais colchetes.

 

E é exatamente essa a mensagem vista com o compilador gcc, com o compilador clang ou com o compilador da Microsoft. Vejam as mensagens de erro para os 3 compiladores em Windows:

 

PS C:\src\C\ch0523> clang -c -Wall tst.c
tst.c:11:12: error: subscripted value is not an array, pointer, or vector
                        mat_C[i][j] = mat_A[i][j] + mat_B[i][j];


PS C:\src\C\ch0523> gcc  -c -Wall tst.c
tst.c: In function 'calc_soma':
tst.c:11:12: error: subscripted value is neither array nor pointer nor vector
   11 |    mat_C[i][j] = mat_A[i][j] + mat_B[i][j];


C:\src\C\ch0523>cl /c tst.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29915 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

tst.c
tst.c(11): error C2109: subscript requires array or pointer type

 

Eis a tal linha 11:

			mat_C[i][j] = mat_A[i][j] + mat_B[i][j];

 

E o erro acontece no segundo colchete à esquerda porque se fosse um ponteiro poderia ter UM índice. Veja no exemplo abaixo
 

image.png.f3079590ce767ecfde3010f607106ce2.png

 

No tópico #2 deixei um exemplo compilável, com explicação e  o resultado de 3 maneiras de endereçar isso em soma(). Recomendo testar e se acostumar com a notação.

 

 

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

E o erro acontece no segundo colchete à esquerda porque se fosse um ponteiro poderia ter UM índice. Veja no exemplo abaixo
 

image.png.f3079590ce767ecfde3010f607106ce2.png

 

Sim, esse é o modo bom de avisar.  Saberia no ato que (valor) subscrito não é array, consequentemente o segundo subscritor é o errado.

[:aplausos:]

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!