View Full Version : duvida em C


MPalhas
22-12-2007, 11:28
comecei a pouco tempo a aprender a linguagem C, e estava hoje a ler um tutorial que tenho seguido. terminei a secção de ponteiros e estava a fazer um exercicio que lá tinha, que consiste em, numa matriz bidimensional 10x10, colocar todos os valores a 0, depois preencher a matriz com números de um a 100, e depois mostrar esses mesmos valores, tudo isto usando ponteiros.

aqui está o código que eu fiz para o exercicio
#include <stdio.h>
int main()
{
int mtz[10][10], *p, x;

/* poe a zero todos os valores da matriz */
p=mtz[0];
for (x=0;x<100;x++)
{
*p=0;
p++;
}

/* preenche a matriz com nºs de 1 a 100 */
p=mtz[0];
x=0;
for(x=0;x<100;x++)
{
*p=x+1;
p++;
}

/* mostra os nºs da matriz (5 por linha) */
p=mtz[0];
for(x=0;x<20;x++)
{
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d", *(p++));
printf("%5d\n", *(p++));
}
}e aqui está um printscreen do resultado ao executar este programa:
http://img156.imageshack.us/img156/3778/resultado1xj9.th.jpg (http://img156.imageshack.us/my.php?image=resultado1xj9.jpg)

ora como talvez já tenham reparado, no ultimo ciclo FOR eu tenho 5 vezes seguidas a função printf. eu sei que posso juntar tudo isso num só printf, mas ai e que está o problema. se fizesse isso, então era só substituir todos esses printfs por isto:
printf("%4d %4d %4d %4d %4d\n", *(p++), *(p++), *(p++), *(p++), *(p++));mas ao por assim, vejma o que acontece ao resultado:
http://img156.imageshack.us/img156/9112/resultado2pv6.th.jpg (http://img156.imageshack.us/my.php?image=resultado2pv6.jpg)

porque é que da segunda maneira, cada linha fica na ordem inversa? não percebo mesmo...

Mr. Brightside
22-12-2007, 12:09
Porque a ordem com que cada argumento de uma função é avaliada não é determinística.

MPalhas
22-12-2007, 12:52
não percebi muito bem a tua resposta, mas pesquisei um bocado, e pelo que percebi os parametros são avaliados da direita para esquerda, certo?

então quer dizer que tenho mesmo que usar a primeira forma que mostrei, com os 5 printfs?

Mr. Brightside
22-12-2007, 12:54
não percebi muito bem a tua resposta, mas pesquisei um bocado, e pelo que percebi os parametros são avaliados da direita para esquerda, certo?

então quer dizer que tenho mesmo que usar a primeira forma que mostrei, com os 5 printfs?
Mais ou menos isso. O compilador assume que a ordem dos argumentos é irrelevante e optimiza o códiga tendo isso em conta. ;)

Sim, tens de usar os cinco printfs.

Tyran
22-12-2007, 14:46
Boas
No extremo, se quiseres mesmo tudo numa linha poderias fazer algo desta maneira

printf("%4d %4d %4d %4d %4d\n", *(p++)-4, *(p++)-2, *(p++), *(p++)+2, *(p++)+4);
Deste modo, ele à direita avança no *p e dá mais 4 ao valor (sem interferir no valor apontado) de modo a conseguires os 5 ( 1 + 4 = 5) que queres ter à direta, depois no penúltimo como ele já antes tinha feito um *p++ e faz agora um novo somas apenas 2, isto é, (4-2), e assim sucessivamente...

cumpzz