Ir ao conteúdo
  • Cadastre-se

Warning de ponteiro


rafaelrrf
Ir à solução Resolvido por Ansi C,

Posts recomendados

Pessoal,

 

Estou usando este codigo:

    char v1[10000], v2[8];    ptr1 = &v1;    ptr2 = &v2;            printf("PTR1: %li\n", ptr1);    printf("PTR2: %li\n", ptr2);

Quando eu compilo ele, ocorre este erro:

 

progc.h:16:7: warning: assignment from incompatible pointer type [enabled by default]
  ptr1 = &v1;
       ^
progc.h:17:7: warning: assignment from incompatible pointer type [enabled by default]
  ptr2 = &v2;
       ^
progc.h:19:2: warning: format ‘%li’ expects argument of type ‘long int’, but argument 2 has type ‘char *’ [-Wformat=]
  printf("PTR1: %li\n", ptr1);
  ^
progc.h:20:2: warning: format ‘%li’ expects argument of type ‘long int’, but argument 2 has type ‘char *’ [-Wformat=]
  printf("PTR2: %li\n", ptr2);
 

 

Alguem saberia resolver esses warnings?

Link para o comentário
Compartilhar em outros sites

Deu certo tirando o &. Valeu!

 

@olliver.soul, O que pretendo é pegar os endereço dos dois ponteiros, subtrair para obter o valor de um dos vetores (v1 e v2).

 

Quando altero para %s da esse warning:

 

progc.h:23:2: warning: format ‘%s’ expects argument of type ‘char *’, but argume                                      nt 2 has type ‘long int’ [-Wformat=]
  printf("RESULTADO: %s\n", ptr1-ptr2);
 

Link para o comentário
Compartilhar em outros sites

Sim, exato. E como eu faria isso?

 

Neste codigo:

char *pont1, *pont2;    char v1[33270], v2[10];    pont1 = v1; // pont1 = &v1[0]    pont2 = v2;			printf("PTR1: %li\n", pont1);	printf("PTR2: %li\n", pont2);	printf("RESULTADO: %li\n", pont1-pont2);

o RESULTADO da 1296, sendo que teria que dar 10. Compilei esse codigo no Windows e funcionou, portanto estou usando o Ubuntu, não sei se isso interfere.

Link para o comentário
Compartilhar em outros sites

Por exemplo:

 

Eu tenho um vetor char vet[1000], e outro char atributo[10].

 

Eu queria passar o endereço de cada um para ponteiros diferentes para fazer uma subtração dos dois.

 

Neste caso eu poderia obter o valor 1000 ou 10.

 

É o que ocorre neste cod:

    char *ptr1, *ptr2, *aux;    char v1[8], v2[33270];    ptr1 = &v1[0];    ptr2 = &v2[0];    printf("%d\n", ptr1);    printf("%d\n", ptr2);    printf("%d\n", ptr1-ptr2);

Ele roda no windows certo, mas no linux o valor da subtração não bate com o tamanho em bytes do vetor v1 e v2.

Link para o comentário
Compartilhar em outros sites

Acontece que você não está subtraindo esses valores, pois eles são apenas o tamanho do vetor e você está fazendo uma operação com o endereço deles.

Se você quiser fazer uma operação com base no tamanho dos vetores, deve usar sizeof e não há necessidade de usar ponteiro nesse caso.

Mas aparentemente você quer apenas efetuar uma operação matemática entre dois números, é isso?

Link para o comentário
Compartilhar em outros sites

Deu certo aquele codigo agora. Mas causou outro problema aqui, quando executa esse codigo:

 

ptr = &buffer[0];
strncpy(v1, ptr, 5);

ptr = &buffer[10)];
 strncpy(v2, ptr, 5);

ptr = &buffer[20];
strncpy(v3, ptr, 5);

 

Estou copiando do buffer alguns bytes para v1, v2, v3 usando ptr para determinar a posição. Mas quando dou um printf em v1,v2 e v3. V1 fica concatenado com v2, e v2 fica concatenado com v3. Saberia me dizer onde esta o erro?

Link para o comentário
Compartilhar em outros sites

Aquele código pode ter dado certo agora, mas pode acontecer problemas aleatórios.

Sobre o sistema operacional, isso não tem influência quando há portabilidade no código como é o caso aí.

Eu ainda não entendi o que você quer fazer, mas sobre a questão da concatenação tente atribuir o caractere '\0' na última posição dos vetores antes de imprimir.

Link para o comentário
Compartilhar em outros sites

Sim. Não funcionou colocando o caracter \0, eu fiz v1[9]  = '\0' antes de imprimir que é a ultinha posição no final :(

 

Ta fazendo isso:

 

V1: AAAAABBBBBCCCCC
V2: BBBBBCCCCC
V3: CCCCCC


Se eu dou um printf em baixo de cada strncat, ele faz a impressão correta. Mas quando faço dps dos três strncat faz isso, concatena todos ><

Link para o comentário
Compartilhar em outros sites

Exato, este exemplo não esta completo. v1, v2 e v3 fazem parte de um struct externa.

 

Fiz testes criando v1, v2 e v3 local e deu certo. O problema esta em alguma coisa na struct :s


struct teste {char v1[5];char v2[5];char v3[5];}teste;void main() {char *buffer = "AAAAABBBBBCCCCC";char *ptr;ptr = &buffer[0];strncpy(teste.v1, ptr, 5);ptr = &buffer[10)]; strncpy(teste.v2, ptr, 5);ptr = &buffer[20];strncpy(teste.v3, ptr, 5);}
Link para o comentário
Compartilhar em outros sites

  • Solução

Agora sim!

Faz assim, modifique para;

1.

struct Teste {

char v1[6];

char v2[6];

char v3[6];

}teste = { 0 };

Depois.

ptr = &buffer[0];

strncpy(teste.v1, ptr, 5);

ptr = &buffer[5];

strncpy(teste.v2, ptr, 5);

ptr = &buffer[9];

strncpy(teste.v3, ptr, 5);

Teste ai por favor que estou longe de casa

Link para o comentário
Compartilhar em outros sites

Claro! Porém eu não sou bom em explicar.
Vou tentar, então observe:

First nós trocamos 5 por 6 porque?
Pense estamos falando de strings que na verdade e apenas um vetor com um elemento extra que e o zero ('\0' ou 0 ).
Se eu sei que vou gravar uma palavra com 5 letras em C esse vetor não pode ter 5 de tamanho haja vista que precisamos colocar zero no final para C entender que se trata de um string. OK!

Logo depois fizemos:
teste = { 0 };
O compilador nos entende que queremos que o primeiro vetor o primeiro byte dentro dele seja iniciado com 0 que é o mesmo que '\0' como nao sinalizei mais nada alem disto o copilador estende nosso comando para os demais bytes desta struct. Com isso ela fica novinha e prontinha com todos vetores zerados somente a guardando o resto. OK!


:)
Esse é o código que fiz agora.

Observe que fiz as mudanças e adicionei mais algumas coisas legais.
 

Código:

//<Software - Simple Code> Clube do Hardware#include<stdio.h>#include<string.h>//Types Structurestruct Teste{char vector_a[ 6 ];char vector_b[ 6 ];char vector_c[ 6 ];} teste = { 0 };//Prototype Function Declarationchar* find_end( char*, char );//Prime func...int main( void ){char *string = "AAAAACCCCCBBBBB";char *index;index = find_end( string,'A' );strncpy( teste.vector_a, index, 5 );index = find_end( string,'B' );strncpy( teste.vector_b, index,5 );index = find_end( string,'C' );strncpy( teste.vector_c, index, 5 );printf( "Imprima\n" );printf( "Somente %c: %s\n",teste.vector_a[0],teste.vector_a );printf( "Somente %c: %s\n",teste.vector_b[0],teste.vector_b );printf( "Somente %c: %s\n",teste.vector_c[0],teste.vector_c );return(0x0);}//Prototype Function Definitionchar* find_end( char *str, char sh ){int search = 0;while( str[search] )// se for igual a '\0' ou zero terminará{if( str[search] == sh )return( &str[search] ); //Achou retorna o ponteirosearch++;}return (char*)0;}

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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