Jump to content
Sign in to follow this  
ricardoaux

Erro com tipo de dados (ponteiros)

Recommended Posts

ricardoaux

Dá me o seguinte erro:

incompatible types when assigning to type ‘float[2000][2000]’ from type ‘float (*)[2000]’

O meu código é:

#define SQUARE_DIMENSION 2000

typedef struct{
    int num_cores, nsteps;
    sem_t sem_mutex1, sem_mutex2;
    float m1[sQUARE_DIMENSION][sQUARE_DIMENSION], m2[sQUARE_DIMENSION][sQUARE_DIMENSION];
    char flag[sQUARE_DIMENSION];
}mem_struct;

...
...

(na funçao do processo filho)

float **temp;

temp=sh_mem->m1;
sh_mem->m1=sh_mem->m2;
sh_mem->m2=temp;

A estrutura está em memória partilhada

Se puderem ajudar, agradecia

Share this post


Link to post
Share on other sites
HappyHippyHippo

a maravilha da linguagem C é que os dados é aquilo que disses que são, isto é ... se tu dizes que são batatas o compilador vai acreditar mesmo que sejam frigoríficos.

temp=(float **)sh_mem->m1;
sh_mem->m1=(float **)sh_mem->m2;
sh_mem->m2=(float **)temp;

a solução está em fazer cast dos dados ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
ricardoaux

continua a dar estes erros...

main.c:128: error: incompatible types when assigning to type ‘float[2000][2000]’ from type ‘float **’

main.c:129: error: incompatible types when assigning to type ‘float[2000][2000]’ from type ‘float **’

Share this post


Link to post
Share on other sites
HappyHippyHippo

já experimentas-te fazer cast ao tipo que pede ?

(float[2000][2000])xpto


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

Em C não é possível assignar valores a arrays.

Ou fazes memmove (ou memcpy) ou um ciclo para copiar elemento a elemento


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
bubulindo

Em C não é possível assignar valores a arrays.

Em Português não é possível assignar nada a nada... mas eu percebo o erro. :(


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
pmg

Em Português não é possível assignar nada a nada... mas eu percebo o erro. :(

hehehe ... e o goto é uma instrução de controle (controlo?) de fluxo :D

Já agora, em Português, como é que dirias o que eu quis dizer?

Em C não é possível ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
ricardoaux

o memcpy ou o memmove é  ineficiente para uma matriz 2000*2000, aumenta uns segundos ainda a execução do programa. há mais sugestões?

Share this post


Link to post
Share on other sites
pmg

o memcpy ou o memmove é  ineficiente para uma matriz 2000*2000, aumenta uns segundos ainda a execução do programa. há mais sugestões?

Já reparaste que 2000 * 2000 floats equivalem (provavelmente) a 16 Mega?

A cópia desses valores vai sempre demorar algum tempo.

A minha sugestão é não copiares. Usa um algoritmo diferente.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo
typedef struct{
    int num_cores, nsteps;
    sem_t sem_mutex1, sem_mutex2;
    float *** m1, *** m2;
    char * flag;
}mem_struct;

...
mem->m1 = (float ***)malloc(sizeof(float)*2000*2000); // ou "allocação" de memória partilhada
mem->m2 = (float ***)malloc(sizeof(float)*2000*2000); // ou "allocação" de memória partilhada
mem->flag = (char *)malloc(sizeof(char)*2000); // ou "allocação" de memória partilhada
...

float *** temp = mem->m1;
mem->m1 = mem->m2;
mem->m2 = temp;


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
ricardoaux

o malloc mete na heap, e depois os processos filhos não vão ter acesso à memória uns dos outros

Share this post


Link to post
Share on other sites
bubulindo

hehehe ... e o goto é uma instrução de controle (controlo?) de fluxo ;)

Não percebi a ironia.

Fluxo é uma palavra correcta e é também a tradução directa para flow. Creio que é controlo e não controle.

O goto é uma instrução que altera direcção do código logo também faz controlo de fluxo. A diferença está na perspectiva que cada um tem da programação. Para ti controlo de fluxo será algo como if, while, for, ?... No entanto, na sua forma mais básica todas essas instruções envolvem um ou mais goto (como saberás se já tiveste de programar em assembly).


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
HappyHippyHippo

desculpa ... isto de trabalhar e responder ao mesmo tempo não dá para pensar a 100%

não há necessidade de serem ponteiros para ponteiros para ponteiros ;)

typedef struct{
    int num_cores, nsteps;
    sem_t sem_mutex1, sem_mutex2;
    float * m1, * m2;
    char * flag;
}mem_struct;
...
mem->m1 = (float *)malloc(sizeof(float)*2000*2000); // ou "allocação" de memória partilhada
mem->m2 = (float *)malloc(sizeof(float)*2000*2000); // ou "allocação" de memória partilhada
mem->flag = (char *)malloc(sizeof(char)*2000); // ou "allocação" de memória partilhada
...
float * temp = mem->m1;
mem->m1 = mem->m2;
mem->m2 = temp;
..
float f_998_999 = m1[(2000*998)+999];


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
ricardoaux

portanto, vou ter se usar a aritmética de ponteiros para os posteriores cálculos, certo?

Share this post


Link to post
Share on other sites
pmg

Não percebi a ironia.

Eu concordo que se use português mas não gosto nem um bocadinho de "controlo de fluxo" (não tenho queixas quanto a "atribuir").

Só usei esse exemplo porque, na tentativa de encontrar uma forma correcta do "assignar", não me ocorreu nenhuma expressão válida que eu gostasse.

["fluxo" invoca-me imagens que não tem nada a ver com programação]


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

ps: eu acho que o ricardoaux mesmo assim percebeu ... ficando essa discusão como "chamar os bois" ou pelo nome ou pela alcunha, um pouco off-topic ..


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.