Dziwny problem ...

Odpowiedz Nowy wątek
2004-07-13 19:40
0

Witam!!

Oto kod źródłowy:

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
main()
{
FILE *fp;
fp=fopen("pierwszy.txt","r");
char bufor[9999];
fgets(bufor,9999,fp);
for(int a=0;a<=strlen(bufor);a++)
if(bufor[a]=='|')
{
cout << bufor[a] << bufor[a++] << endl;
}
getch();
}

Plik "pierwszy.txt" zawieza:

|1mam|2masz|3

Wfekt jest taki, że pokazuje się :
1|
2|
3|

Ale jeżli linijkę :

cout << bufor[a] << bufor[a++] << endl;

zamienie na:

cout << bufor[a] << bufor[a] << endl;

To mi się pokaże:

Czemu tak jest??


Ja tu byłem, i zniszczyłem i się przy tym ubawiłem :)

Zrobiłem wam konkurencje :) - www.malish4rk.prv.pl

Pozostało 580 znaków

2004-07-13 20:29
0

a++ wskazuje po prostu na kolejny znak w tablicy, a po | jest liczba tak wiec wszystko jest dobrze, a wyswietla odwrotnie poniewaz uzywasz strumienia...


Pozostało 580 znaków

2004-07-13 20:57
0

odrobine poprawie cepe
mianowicie nie jest "od tylu" dlatego ze uzywasz strumieni, tylko dlatego ze.. to jest normalne

wezmy przykladowy program

#include<stdio.h>

int
main( void )
{
  int i = 1;
  printf( "%i %i %i %i\\n", i++, i++, i++, i++ );
  return 0;  
} 

co to pokaze?
powinno 1 2 3 4.. a pokazuje

20:39:39 LiTeStEp >gcc asdf.c
20:39:45 LiTeStEp >a
4 3 2 1
20:39:45 LiTeStEp >

dlaczego tak sie dzieje? z paru przyczyn parametry sa analizowane, tj wyliczane/wstawiane na stos od tylu...
tj powyzszy kod bedzie przetlumaczony na pseudoasmowy kod tak:

mov i, 1
push i   // i == 1, 4rty parametr
inc i     // i == 1+1
push i   // i == 2, 3ci parametr
inc i     // i == 2+1
push i   // i == 3, 2gi parametr
inc i     // i == 3+1
push i   // i == 4, 1szy parametr
inc i     // i == 4+1
call printf
ret

a jako ze parametry byly wrzucane od tylu, to rzeczywiscie
"%i %i %i %i" zamieni sie na "4 3 2 1"
dlaczego takie udziwnienie?
a zeby funkcje( cos, ... ) dzialaly dobrze... tam sie w sumie zadna magia nie dzieje, np

void func( int ile, ... )
{
  int *p = (&ile) + 1;
  while( ile-- ) printf( "%i ", *p++ );
}

func( 4, 1, 2, 3, 4 );

czyli po prostu w pamieci argumenty sa po sobie
a dlaczego wiec sa wrzucane na stos od tylu ?
bo stos "rosnie" w strone zera, tj kazde wrzucenie powoduje ze adres nastepnego elementu bedzie MNIEJSZY... wiec musza byc od tylu wrzucane ;p

w przypadku << i >> jest podobnie, ale na innej zasadzie, wkoncu
a << b
oznacza a przesuniente o b (niewazne ze przeciazone w cout jest), a wyrazenie
a << b << c << d
kompilator zrozumie jako a przesuniente o b << c << d, czyli
a << ( b << c << d ), idac dalej a << ( b << ( c << ( d ) ) )
i liczone najpierw bedzie c << d (ktore z tej dwojki najpierw? nie wiem ;p),
potem b a potem a...
czyli nasze "na wspak" ;>

mam nadzieje ze mnie nie wylogowalo, ze za duzo nie naklamalem i ze za duzo nie pokrecilem i ze cos mozna z tego zrozumiec

</cpp>


peace,
gynvael.coldwind//vx

"Imagination is more important than knowledge..." Albert Einstein

Pozostało 580 znaków

2004-07-14 10:29
0

Cosik z tego rozumiem, no ale jak zrobić, żeby w moim przykładowym programie int m=a++; tak żeby m równała się o jeden więcej - może, jak mówi Gynvael Coldwind liczby "rosną do zera" to mam zamias a++ dać a-- . To właśnie o to chodzi?


Ja tu byłem, i zniszczyłem i się przy tym ubawiłem :)

Zrobiłem wam konkurencje :) - www.malish4rk.prv.pl

Pozostało 580 znaków

2004-07-14 11:40
0

A co chcesz uzyskac ?
najlepiej uzyj i+1 i i zamiast i++, a potem zrob jakies dodatkowe i++

tj
cout << costam[ i ] << costam[ i+1 ] << endl;
i++;


peace,
gynvael.coldwind//vx

"Imagination is more important than knowledge..." Albert Einstein

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0