Inufelipe Postado Janeiro 22, 2008 Denunciar Share Postado Janeiro 22, 2008 Olá galera do Script Brasil.Eu estou com um problema,na parte que eu tenho maisdificuldade que é a deponteiros sempre dá algumerro mais depois que eufaço funcionar fica umabeleza, que é:main.cpp:137: error: cannot convert ‘char (*)[100]’ to ‘char**’ for argument ‘1’ to ‘void spaceless(char**)’ o codigo fonte é: #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <SDL/SDL_ttf.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 2842 TTF_Font *cotaba; SDL_Color BLACK = {0,0,0}; SDL_Event event; void spaceless(char **spaced){ int i=sizeof(spaced); int j=0; int k=0; while(1){ if(k = (i-j)){ spaced[j] = ''; } if(k > (i-j)){ free(spaced[j]); } else{ if(spaced[j][0] == ' '){ k++; spaced[j] = spaced[j+k]; } } if(i==j){ break; } j++; } printf("%s",spaced); } class NIN_button{ public: void clicked(){ if(event.button.y > 545 && event.button.y < 590 && event.button.x > 10 && event.button.x < 100){ printf("OK\n"); } } }; class NIN{ public: NIN_button button; }; SDL_Surface *load_image(char *file){ SDL_Surface *loaded; SDL_Surface *optimized; loaded = IMG_Load(file); optimized = SDL_DisplayFormat(loaded); SDL_FreeSurface(loaded); return optimized; } void show(int x, int y, SDL_Surface *source, SDL_Surface *dest){ SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface(source,NULL,dest,&offset); } int main(int argc, char **argv){ int client,numbits,msgk=0; char buf[100]; struct hostent *he; struct sockaddr_in server; bool quit=0,conn=0; SDL_Surface *background; SDL_Surface *message; SDL_Surface *screen; if(SDL_Init(SDL_INIT_EVERYTHING)==-1){ printf("SDL INIT ERROR\n"); exit(1); } if(TTF_Init()==-1){ printf("SDL TTF INIT ERROR\n"); exit(1); } if((cotaba = TTF_OpenFont("img/cotaba.ttf",14))==NULL){ printf("COTABA FONT INIT ERROR\n"); exit(1); } if((screen = SDL_SetVideoMode(800,600,32,SDL_SWSURFACE))==NULL){ printf("SDL VIDEO MODE SET ERROR\n"); exit(1); } SDL_WM_SetCaption("NIn - Nible In",NULL); background = load_image("img/background.png"); show(0,0,background,screen); if((he = gethostbyname("127.0.0.1"))==NULL){ printf("SOCKET GETHOSTBYNAME ERROR\n"); exit(1); } if((client = socket(PF_INET,SOCK_STREAM,0))==-1){ printf("SOCKET FUNCTION ERROR\n"); exit(1); } server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr = *((struct in_addr*)he->h_addr); memset(server.sin_zero,'',sizeof server.sin_zero); NIN NIn; SDL_Flip(screen); while(quit == 0){ while(SDL_PollEvent(&event)){ switch(event.type){ case SDL_QUIT: quit=1; break; case SDL_MOUSEBUTTONDOWN: NIn.button.clicked(); } } if(conn==0){ if(connect(client,(struct sockaddr*)&server,sizeof server) ==-1){ msgk = 2; printf("ka\n"); } else{ msgk = 1; printf("ks\n"); } if ((numbits=recv(client, buf, 100-1, 0)) == -1) { perror("recv"); exit(1); } spaceless(&buf); printf("%d",numbits); buf[numbits] = ''; printf("Received: %s",buf); conn=1; } switch(msgk){ case 0: message = TTF_RenderText_Solid(cotaba,"Conectando...",BLACK); break; case 1: message = TTF_RenderText_Solid(cotaba,"Servidor_Pronto",BLACK); break; case 2: message = TTF_RenderText_Solid(cotaba,"Nao_foi_possivel_conectar_ao_servidor",BLACK); break; } show(140,555,message,screen); SDL_Flip(screen); } SDL_FreeSurface(background); SDL_FreeSurface(message); SDL_Quit(); return 0; };Se alguém souber um bomsite que tenha algo muitoesclarecedor sobre ponteiroseu aceito!!!E se alguém quiser colaborarajudando-me a desvendar "O Segredo do Ponteirosde Meu codigo" eu fico muitograto. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 24, 2008 Denunciar Share Postado Janeiro 24, 2008 Veja se seu problema não é apenas com a declaração no cabeçalho da procedure spaceless. Observe que você chama ela passando o endereço da sua variável buf (char buf[100] - que é um array de caracteres com tamanho 100): spaceless(&buf);Ou seja, você passa o endereço da primeira posição do array para a sua procedure, logo, o que você deveria esperar receber na procedure seria o ponteiro para esta primeira posição: void spaceless(char *spaced)A declaração do modo como você fez inicialmente, equivale a dizer que você estaria recebendo o endereço de uma variável, que conteria o endereço do buffer alocado. Mais ou menos isto se não me engano. :unsure: Vamos imaginar uma variável declarada da seguinte forma: char Nome[10]seu endereço em memória (definido pelo compilador) ficaria entre &1001 a &100A, e quando inicializada com meu nome ^_^, ficaria mais ou menos assim:&1001['M']&1002['I']&1003['C']&1004['H']&1005['E']&1006['U']&1007['S']&1009[x/0]&100A[x/0]quando você chama a procedure passando &Nome, estará na verdade passando ao procedimento o endereço &1001.logo, na procedure, você deve indicar que o parâmetro é um ponteiro (ou seja, o endereço) de uma lista de caracter.Agora, vamos supor que você tenha uma variável que guarde o endereço desta área onde está a lista de caracter (muito comum, quando se usa alocação dinâmica). Vamos chamar esta variável de ptrNome e, como ela armazena um endereço de memória, ela seria declarada como um ponteiro para esta área de memória. Assim, sua declaração seria: char *ptrNome;De modo a apontar para nosso array Nome, nos inicializaríamos ela da seguinte maneira: *ptrNome = &NomeA título de fazer uma analogia (não sei se muito boa), veja como ficaria a impressão do texto em Nome utilizando as duas variáveis:printf("%s\n", *ptrNome); (imprime o conteúdo do endereço apontado por prtNome (&Nome)printf("%s\n", &Nome); (imprime o conteúdo do endereço da variável Nome)Isto posto, a sua procedure como definida inicialmente (void spaceless(char **spaced)), equivale a você esperar que seja passada para ela o endereço de uma variável que armazene o endereço de um array de caracter. Deste modo, utilizando as variáveis do meu exemplo, seria o caso de chamá-la passando ptrNome e não Nome: spaceless(&prtNome);Espero que tenha lhe ajudado e não complicado ainda mais...E caso eu tenha escrito alguma bobagem, por favor alguém me corrija. :D Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Inufelipe
Olá galera do Script Brasil.
Eu estou com um problema,
na parte que eu tenho mais
dificuldade que é a de
ponteiros sempre dá algum
erro mais depois que eu
faço funcionar fica uma
beleza, que é:
o codigo fonte é:Se alguém souber um bom
site que tenha algo muito
esclarecedor sobre ponteiros
eu aceito!!!
E se alguém quiser colaborar
ajudando-me a desvendar
"O Segredo do Ponteiros
de Meu codigo" eu fico muito
grato.
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.