Duvidas Ponteiros [RESOLVIDO]

1. Duvidas Ponteiros [RESOLVIDO]

Eduardo Antonio
hatosco

(usa Outra)

Enviado em 31/03/2013 - 15:53h

Estou com algumas duvidas sobre ponteiros, segue o codigo:

/* Teste de Ponteiros */

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

int * aloca(unsigned int quantidade)
{
return (int *)malloc(sizeof(int)*quantidade);
}

int main(void)
{

int (*a)[3]; // Um ponteiro para vetores de 3 posicoes
int n, m;

a = aloca(2*3);//aloca matriz 2x3

a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;
a[1][0] = 4;
a[1][1] = 5;
a[1][2] = 6;

printf("Valor de a[0][0] eh %d\n", a[0][0]);
printf("Valor de a[0][1] eh %d\n", a[0][1]);
printf("Valor de a[0][2] eh %d\n", a[0][2]);
printf("Valor de a[1][0] eh %d\n", a[1][0]);
printf("Valor de a[1][1] eh %d\n", a[1][1]);
printf("Valor de a[1][2] eh %d\n", a[1][2]);

/* Teste de Caracteres */

char (*palavras)[4] = {"Cachorro", "Gato" "Peixe", "Coelho", "Lagartixa"};

for(n = 0; n<10; n++)
{
printf("O nome é: %s\n", palavras[n]);
}
return 0;
}



- Ao compilar com o gcc resulta em:
teste_forum.c: In function ‘main’:
teste_forum.c:17: warning: assignment from incompatible pointer type
teste_forum.c:35: warning: initialization from incompatible pointer type
teste_forum.c:35: warning: excess elements in scalar initializer
teste_forum.c:35: warning: (near initialization for ‘palavras’)
teste_forum.c:35: warning: excess elements in scalar initializer
teste_forum.c:35: warning: (near initialization for ‘palavras’)
teste_forum.c:35: warning: excess elements in scalar initializer
teste_forum.c:35: warning: (near initialization for ‘palavras’)

Executando:
Valor de a[0][0] eh 1
Valor de a[0][1] eh 2
Valor de a[0][2] eh 3
Valor de a[1][0] eh 4
Valor de a[1][1] eh 5
Valor de a[1][2] eh 6
O nome é: Cachorro
O nome é: orro
O nome é:
O nome é: ome é: %s

O nome é: é: %s

O nome é: %s

O nome é: ,
O nome é: ,
O nome é:
O nome é:&#65533;&#65533;&#65533;H

- Compilando no g++:
teste_forum.c: In function ‘int main()’:
teste_forum.c:17: error: cannot convert ‘int*’ to ‘int (*)[3]’ in assignment
teste_forum.c:35: error: scalar object ‘palavras’ requires one element in initializer

Duvidas:
1) Como seria a correta declaração de retorno da função 'aloca' e como seria a correta conversão de tipo (cast) dentro da função 'aloca'? Preciso de uma solução utilizando int (*a)[3] porque é apenas um ponteiro para vetores de 3 posições. Tentei utilizar o cast e o retorno da função como int (*)[3] mas não dá certo também!

2) Na parte de strings porque é impresso um trecho do código?

Muito obrigado e Feliz Páscoa a todos!!!






  


2. Re: Duvidas Ponteiros [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 31/03/2013 - 17:37h

Não sei porque vc "reinventou a roda" criando a funcao (aloca) ...

Veja esse exemplo bem simples:




#include <stdio.h>
#include <malloc.h>


int *a [3]; // na verdade aqui esta alocado 3 automaticamente
int x, y;

// Uma pratica BOA eh sempre colocar um NULL no final da matriz
//
char *palavras[] = {"Cachorro", "Gato" "Peixe", "Coelho", "Lagartixa", NULL};

int main()
{
a[0] = (int*) malloc ( sizeof (int) * 3 );
a[1] = (int*) malloc ( sizeof (int) * 3 );
a[2] = (int*) malloc ( sizeof (int) * 3 );

a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;

a[1][0] = 4;
a[1][1] = 5;
a[1][2] = 6;

a[2][0] = 7;
a[2][1] = 8;
a[2][2] = 9;

for (x=0; x < 3; x++)
for (y=0; y < 3; y++)
printf ("a[%d][%d]: %d\n", x, y, a[x][y]);

/*
// ISSO VAI CAUSAR UM GRAVE ERRO ... VC ULTRAPASSOU O TAMANHO DA MATRIZ ...

for(n = 0; n<10; n++)
{
printf("O nome é: %s\n", palavras[n]);
}
*/

// mude para esse método ... e lembre-se de sempre colocar um NULL no final da matriz.

int i = 0;
while (palavras[i]) {
printf ("palavras[%d] = %s\n", i, palavras[i]);
i++;
}

printf ("saindo com sucesso\n");

return 0;
}



Espero que ajuda .



3. Re: Duvidas Ponteiros [RESOLVIDO]

Eduardo Antonio
hatosco

(usa Outra)

Enviado em 31/03/2013 - 17:42h

na verdade eu quero utilizaz int (*a)[3]; que é um ponteiro para vetor de 3 posições de int e não int *a[3]; que é um vetor de ponteiros para int. Na verdade eu dei um exemplo simples e a função também foi pra exemplificar. A questão é vomo converteria um ponteiro void* para int (*a)[3]; e como é declarada uma função que retorna int (*a)[3];. Obrigado pela atenção!


4. Re: Duvidas Ponteiros [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/03/2013 - 18:20h

Tentei fazer isso outro dia e não consegui.

Suponha que você tenha alocado nove posições com malloc().

O que você consegue é usar índice simples nesse malloc() que é o que C permite.

a = aloca(9);

a[4] = ...;


Não consegui fazer esse malloc() trabalhar como se fosse 3x3, mesmo porque o sistema não sabe até que número vai um dos índices.

Agora, se fosse o caso de

 int a[3][3];

a[4] = ...;


Isso eu havia conseguido fazer, porque o sistema não vê necessariamente um quadrado 3x3. Está mais para um segmento tamanho 9.


5. Re: Duvidas Ponteiros [RESOLVIDO]

Eduardo Antonio
hatosco

(usa Outra)

Enviado em 31/03/2013 - 18:40h

Ai é q ta, para ele reconhecer "precisaria" de um cast. "Precisaria" pq no ANSI C nao é necessario converter void* para qualquer outro tipo de tipo* , embora apareça alguns warning. Da forma que eu fiz ha a necessidade de declarar pelo menos o retorno da funcao. Do jeito que ta, compilando no gcc funciona, mas nada melhor do q um codigo sem warnings. Obrigado!


6. Re: Duvidas Ponteiros [RESOLVIDO]

Eduardo Antonio
hatosco

(usa Outra)

Enviado em 01/04/2013 - 15:26h

Depois de muito procurar a resposta acabei acertando o codigo:



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


int (* alocar(unsigned int qtde))[3]

{

return (int (*)[3])malloc(sizeof(int)*qtde);

}


int main(void)
{

int (*x)[3];
int i, j, a;

x = alocar(2*3);

for(i = 0, a = 0; i<2; i++)
{
for(j = 0; j<3; j++)
x[i][j] = ++a;
}

for(i = 0; i<2; i++)
{
for(j = 0; j<3; j++)
printf("x[%d][%d] = %d\n", i, j, x[i][j]);
}

return 0;
}



Obrigado a todos pela ajuda!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts