Ir para conteúdo
Fórum Script Brasil
  • 0

Cannot convert ‘char (*)[100]’ to ‘char**’


Inufelipe

Pergunta

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 é:

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

  • 0

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 = &Nome

A 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

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...