Ir ao conteúdo

C A expressão deve conter tipo ponteiro para objeto


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado
#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.

Postado
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.

 

 

  • Solução
Postado
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]

 

[:)]

Postado
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.

 

 

 

 

Postado
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:]

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!