kącik pomocy C/C++ czyli tlumaczenie przy uzyciu łopatologii

Zaczęty przez bartsob5, 09 Październik 2006, 21:50

bartsob5

---------- 19:40 09.10.2006 ----------

stwierdzilem ze dosc juz meczenie watku html i pora stworzyc nowy tylko i wylacznie o c...

a moj problem wyglada tak:

jak zapisac wynik do pliku? jesli chodzi o program do zapisu do pliku to znalazlem tylko

#include <stdio.h>
#include <stdlib.h>
/* program udający bardzo prymitywną wersję programu tee(1) */

int main (int argc, char *argv[0])
{
 FILE *fp;
 int c;
 if (argc > 1) {
   fp = fopen (argv[1], "w");
   if (!fp) {
     fprintf (stderr, "Nie mogę otworzyć pliku %s\n", argv[1]);
     exit (-1);
     }
   }
 while ( (c = fgetc(stdin)) != EOF) {
   fputc (c, stdout);
   fputc (c, fp);
   }
 fclose(fp);
 return 0;
}


ale kompletnie go nie ogarniam, bo on nawet nie dziala prawidlowo, bo sie wiesza... prosze przede wszystkim o objasnienie deklaracji plikow gdzie zostaly zadeklarowane jak te pliki sie nazywaja i czy one juz powinny byc wczesniej w tym folderze?

---------- 20:50 ----------

i jeszcze pytanie, czy jest jakis taki typ zmiennej calkowitej (lub nie), ktorej zakres bylby od 0 do praktycznej nieskonczonosci? bo long int mnie nie zadowala... (silnia dochodzi do kresu juz przy 12...)

Mchl

na drugie: double, czyli liczby zmiennoprzecinkowe podwójnej precyzji. Maksimum jeśli dobrze pamiętam w okolicach 10^39.


Pomyłka. 3,4x10^38 ma typ float. Dla double jest 1,7x10^308.
Trzeba tylko pamiętać, że typt zmiennoprzecinkoe nie są dokładne, to znaczy przchowują tylko pewną ilość cyfr znaczących liczby.
Stąd mogą być dziwne wyniki. Na przykład:
10000000000000000000000000000000000000+1=10000000000000000000000000000000000000

W nagłych wypadkach wzywać przez: mail: mchlpl[at]gmail.com | PM|mchl[a]boincatpoland.org

marcin20_21

Jesli napiszę coś, co wiesz, to nie czytaj tego, i nie miej mi za złe.

Po pierwsze musisz wiedzieć, że pliki można otwierać:
- do zapisu "w" (zostaje wtedy stworzony nowy plik, a jeśli plik o danej nazwie już istnieje, zosanie zastąpiony nowym plikiem)
- do zapisu "a" (plik nie jest mazany, dopisujesz co chcesz do istniejącego pliku)
- do odczytu "r" (do odczytywania z pliku :) )
Co ważniejsze, pliki można otworzyć w trybie tekstowym, albo binarnym wb ab rb. Tryb tekstowy służy tylko do znaków drukowalnych, używanie go ze znakami niedrukowalnymi (np Znak ENTERA) może prowadzić przy powtórnym odczycie pliku do błędu (błąd programisty). Tryb binarny stosować lepiej, gdy zapisujesz jakieś liczby (int, float, itp), oczywiście można też zapisywać wtedy zwykły tekst.

Poniższy przykładowy program pokazuje, jak można to zrobić. Nie twirdzę, że jest on najlepszy. Może jednak pokaże Ci, jak co zapisać najlepiej.


#include <stdio.h>
#include <conio.h>


int main(int argc, char* argv[])
{
FILE * fp; // fp służy do komunikacji z plikami na dysku
char nazwaPliku[20]={"plik.txt"}; //załóżmy, że chcemy dzialac na takim pliku
char napis [30];
int znak;
float pi = 3.14;
int liczba = 10;

//najpierw spróbujemy zapisac cos do pliku
fp = fopen(nazwaPliku,"w"); //otwirzamy (tworzymy plik)
//ponieważ otwarcie może się nie udac, trzeba sprawdzic, czy fp == NULL
if(fp == NULL) printf("Nie udalo sie otworzyc pliku %s do zapisu\n",nazwaPliku);
else
   {
    fputc('a',fp); //zapisanie znaku 'a' do pliku
    fputs("la ma kota\n",fp); //zapisanie ciągu znaków do pliku
    fclose(fp);    // po otwarciu pliku i uzyciu koniecznie trzeba go zamknąc
   }

//to teraz zobaczmy, co zapisalismy
fp = fopen(nazwaPliku,"r");
if(fp == NULL) printf("Nie udalo sie otworzyc pliku %s do odczytu",nazwaPliku);
else
   {
    fgets(napis,4,fp); //odczytanie z pliku 4 pierwszych znaków
    printf ("Odczytalem z pliku : %s \n\n",napis);
    fclose (fp);
   }
//dawno tego nie robiłem

// pokazę Ci ile wynosi teraz pi oraz liczba
printf("pi : %f, liczba : %d\n",pi,liczba);

//teraz użyjemy trybu binarnego:
//jesli po zakonczeniu dzialania pliku otworzysz plik.txt, znajdziesz tam troche "smieci"
//roznych znaczkow np i nazwe pliku :)
fp = fopen(nazwaPliku,"wb"); //otwirzamy (tworzymy plik)
//ponieważ otwarcie może się nie udac, trzeba sprawdzic, czy fp == NULL
if(fp == NULL) printf("Nie udalo sie otworzyc pliku %s do zapisu\n",nazwaPliku);
else
   {
    fwrite(nazwaPliku,20,1,fp); //zapisujemy calą tablice nazwaPliku, równiez tą czesc, której nie uzywam do przechowywania nazwy
    fwrite(&pi,sizeof(pi),1,fp); //zapisujemy zmienna pi (typu float)
    fwrite(&liczba,sizeof(liczba),1,fp); //zapisujemy zmienna liczba (typu int)
    fclose(fp);
   }

//zmieniamy pi oraz
pi = 3.14159;
liczba = 24;

// pokazę Ci ile wynosi teraz pi oraz liczba
printf("Po zmieanie wartosci pi : %f, liczba : %d\n",pi,liczba);

//a teraz wczytamy, to zo zapisalismy
fp = fopen(nazwaPliku,"rb"); //otwirzamy
//ponieważ otwarcie może się nie udac, trzeba sprawdzic, czy fp == NULL
if(fp == NULL) printf("Nie udalo sie otworzyc pliku %s do odczytu\n",nazwaPliku);
else
   {
    fread(nazwaPliku,20,1,fp); //odczytujemy tablice - zapisalismy 20, to tyle odczytujemy
    fread(&pi,sizeof(pi),1,fp); //odczyt pi
    fread(&liczba,sizeof(liczba),1,fp); //odczyt liczby int
    fclose(fp);
   }

// pokazę Ci ile wynosi teraz pi oraz liczba
printf("Po odczycie z pliku pi : %f, liczba : %d",pi,liczba);

getch();
return 0;
}
//------------------------------------------------  ---------------------------


Zazwyczaj w takich przypadkach wystarcza double.Jeśli jednak potrzebowałbyś policzyć silnię dokładnie, musiałbyć poszukać w internecie gotowej struktury do takich liczb. Kiedyś robiłem coś takiego, liczyłem silnię chyba z 1000. Wynik wyglądał masakrycznie :)



[/color]
1000! = a=402387260077093773543702433923003985719374864210 7146325437999104299385
12398629020592044208486969404800479988610197196058 631666872994808558901323829669
94459099742450408707375991882362772718873251977950 595099527612087497546249704360
14182780946464962910563938874378864873371191810458 257836478499770124766328898359
55735432513185323958463075557409114262417474349347 553428646576611667797396668820
29120737914385371958824980812686783837455973174613 608537953452422158659320192809
08782973084313928444032812315586110369768013573042 161687476096758713483120254785
89320767169132448426236131412508780208000261683151 027341827977704784635868170164
36502415369139828126481021309276124489635992870511 496497541990934222156683257208
08213331861168115536158365469840467089756029009505 376164758477284218896796462449
45160765353408198901385442487984959953319101723355 556602139450399736280750137837
61530712776192684903435262520001588853514733161170 210396817592151090778801939317
81141945452572238655414610628921879602238389714760 885062768629671466746975629112
34082439208160153780889893964518263243671616762179 168909779911903754031274622289
98800519544441428201218736174599264295658174662830 295557029902432415318161721046
58320367869061172601587835207515162842255402651704 833042261439742869330616908979
68482590125458327168226458066526769958652682272807 075781391858178889652208164348
34482599326604336766017699961283186078838615027946 595513115655203609398818061213
85586003014356945272242063446317974605946825731037 900840244324384656572450144028
21885252470935190620929023136493273497565513958720 559654228749774011413346962715
42284586237738753823048386568897646192738381490014 076731044664025989949022222176
59043399018860185665264850617997023561938970178600 408118897299183110211712298459
01641921068884387121855646124960798722908519296819 372388642614839657382291123125
02418664935314397013742853192664987533721894069428 143411852015801412334482801505
13996942901534830776445690990731524332782882698646 027898643211390835062170950025
97389863554277196742822248757586765752344220207573 630569498825087968928162753848
86339690995982628095612145099487170124451646126037 902930912088908694202851064018
21543994571568059418727489980942547421735824010636 774045957417851608292301353580
81840096996372524230560855903700624271243416909004 153690105933983835777939410970
02775347200000000000000000000000000000000000000000 000000000000000000000000000000
00000000000000000000000000000000000000000000000000 000000000000000000000000000000
00000000000000000000000000000000000000000000000000 000000000000000000000000000000
000000000000000000
Liczba cyfr potrzebnych do zapisania 2568
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

a znasz jakas funckje wczytujaca obrazek, i rysujaca wykres funkcji? (tj. kreske miedzy dwoma punktami?)

marcin20_21

Cytat: "bartsob5"a znasz jakas funckje wczytujaca obrazek, i rysujaca wykres funkcji? (tj. kreske miedzy dwoma punktami?)

To nie takie proste. W standardzie C/C++ nie ma (o ile mi wiadomo) takich funkcji, więc wszystko zależy tu od konkretnego środowiska, w którym piszesz. Można np użyć komponentu TShape i Canvas w Borland C++ 6.0, do rysowania w okienku windowsa, można użyć OpenGL dla jakichś bardziej zaawansowanych grafik... W czym programujesz?
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"
Cytat: "bartsob5"a znasz jakas funckje wczytujaca obrazek, i rysujaca wykres funkcji? (tj. kreske miedzy dwoma punktami?)

To nie takie proste. W standardzie C/C++ nie ma (o ile mi wiadomo) takich funkcji, więc wszystko zależy tu od konkretnego środowiska, w którym piszesz. Można np użyć komponentu TShape i Canvas w Borland C++ 6.0, do rysowania w okienku windowsa, można użyć OpenGL dla jakichś bardziej zaawansowanych grafik... W czym programujesz?

to moze ja wyjascnie, bo bartka nie bylo na lekcji....

nasz nauczyciel kazał nam wykonac zadanie na lekcji przez 45minut:
wczytujesz z pliku tekstowego 4 liczby, sa to wspolrzedne 2 punktow pomiedzy ktorymi masz narysowac prostą w pliku graficznym 480x640 16 kolorow.

W ciagu 5 minut wylozyl nam operacje na plikach, czyli wszytkie funkcje fxxx (fopen fclose itd) razem z parametrami w r wb rb itd i podal ze do przejscia w tryb grafiuczny nalezy uzyc initgraf (moze initgraph, nie wiem jak to zapisac, bo tylko to powiedzial ;] ) niekomu sie programy nie kompilowaly, szukalismy w helpach i kursach, ale nc o tym tajemniczym initgraf.

Jak sie zapytalem o to czy ta prosta jest rownolegla lub prostopadla do krawezi to otrzymalem odpowiedz ze mze byctez po skosie... troche mnie to zdziwilo, bo nie mam  pomyslu jak to zapisac, ale podobo jest funkcja ktora rysuje wektor od punktu poczatkowego do punktu (x,y) i trzeba wie pierwsze wczyta jako poczatkowy a 3 i4tą jako punkt drugi.

Jak na nasze 'umiejetnosci' to troche duzo i nie wiem jakbysmy sobie poradzili bez Twojej pomocy (btw ze spr z sortowania dostałem 75%, wiec zle nie jest)
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

InitGraph to funkcja z Pascala :P  Nie wiem, jak to można połączyć z C :) Może gość coś

A z tymi punktami to proste, jest coś takiego, jak układ współrzędnych OXY (matemtatyka się kłania), wczytuje się dwa punkty A(xa,ya) B(xb,yb) z pliku, a potem rysuje linię, szczegóły np tutaj. :

http://free.of.pl/t/tpdoodek/kurs/6.html
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"InitGraph to funkcja z Pascala :P  Nie wiem, jak to można połączyć z C :) Może gość coś

A z tymi punktami to proste, jest coś takiego, jak układ współrzędnych OXY (matemtatyka się kłania), wczytuje się dwa punkty A(xa,ya) B(xb,yb) z pliku, a potem rysuje linię, szczegóły np tutaj. :

http://free.of.pl/t/tpdoodek/kurs/6.html

takie bledy to norma u goscia.....

uklad wspolrzdnych to obejmuje, ale gorzej z tym jak to zapisac w c ;]
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

Cytat: "kshonek"
takie bledy to norma u goscia.....
To "fajnie" macie....

Cytat: "kshonek"
uklad wspolrzdnych to obejmuje, ale gorzej z tym jak to zapisac w c ;]
Mniej profesjonalne podejście : cztery int'y np xa,xb,xc,xc.
Bardziej profesjonalne podejście : stworzenie struktury (albo klasy, jeśli programujesz w C++) opisującej punkt na płaszczyźnie.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

ja ejszcze wroce do wczytywania z pliku:
co oznacza w praktyce atrybut otwierania w trybie binarnym a tekstowym?
jakie moga byc przyczyny nie otworzenia sie pliku?

marcin20_21

W praktyce, jeśli zapiszesz w trybie tekstowym dane, które powinny być zapisane w trybie binarnym, np liczby float, int, double, a potem próbujesz je wczytać, to możesz otrzymać coś zupełnie innego. Preferuję zapis i odczyt w trybie binarnym, chyba że to ma być typowo plik tekstowy, np plik NA PEWNO zawiera tekst zawierający cztery liczby i tylko tyle.
Nie wiem, czy widzisz różnicę: plik z zapisanymi czterema cyframi tekstem ma zawartość np "4 10 23 347" a plik, w którym te same liczby są zapisane binarnie, może po otwarciu np przez notatnik zawierać jakieś dziwne znaczki.

Jeśli otwierasz w albo wb, i nie otworzy się, to może np oznaczać, że plik taki istnieje, i ma atrybut "tylko do odczytu", inny program otworzył ten plik do zapisu,  albo np plik taki nie istnieje i mógłby zostać stworzony, ale brak miejsca na dysku.
Jeśli otwierasz r,rb i wystąpi błąd, to znaczyć może, że plik taki nie istnieje.
Jest jeszcze np taka możliwość, że system ma pewną maksymalną liczbę plików, które można otworzyć, stąd posiadanie naraz otwartych wielu plików nie jest dobrym rozwiązaniem.
Nic więcej nie przychodzi mi do głowy.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

Mchl

Cytat: "marcin20_21"
Nie wiem, czy widzisz różnicę: plik z zapisanymi czterema cyframi tekstem ma zawartość np "4 10 23 347" a plik, w którym te same liczby są zapisane binarnie, może po otwarciu np przez notatnik zawierać jakieś dziwne znaczki.

Konkretnie będzie zawierał szesnastkową reprezentację tych liczb.

W nagłych wypadkach wzywać przez: mail: mchlpl[at]gmail.com | PM|mchl[a]boincatpoland.org

bartsob5

a czy i jak mozna wbic do tablicy 250 zer i jedynek, tak zeby jeden znak byl w jednej komorce tablicy, i zeby to 1 i 0 bylo integerem? (to znaczy zeby bylo gotowe do dzialan matematycznych?)
domyslam sie ze fgetsem, ale wtedy jak mozna sie odwolac do konkretnej komorki tablicy? (bo jak sie odwolam normalnie a
  • to mi wyskakuje jakas dziwna, losowa liczba...

    to moj fragment programu

    FILE * fp;
    char plik[255]={"mak.txt"};
    int napis[10];
    int x;
    int y;
    int a[255];

    fp = fopen(plik,"rb");
    if(fp == NULL) printf("Nie udalo sie otworzyc pliku %s do odczytu",plik);
    else
      {
       
    //    fscanf(fp,"%i",&x);     wstawione w komentarz ze wzgledu na to ze nie potrzebuje
    //    fscanf(fp,"%i",&y);
       fgets(a,256,fp);                    //pobieram 256 znakow z pliku (chyba)
    //    printf ("Odczytalem z pliku : %i \n\n %i \n\n\n",x,y);  nie potrzebuje
       printf("\n%s \n\n\n",a);                    //   chce wyswietlic ten rzadek
       printf("%i",a[2]);                            //chce wyswietlic jedna konkretna komorke tego ciagu
       fclose (fp);
      }


    cos czuje ze to sie nie zczytuje tak jak tego oczekuje...

marcin20_21

nie wiem, czy dobrze rozumiem... mak.txt zawiera 256 cyfr wpisanych np w notatniku i chcesz je wczytać do tablicy a?
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

chce miec x cyfr wpisanych w notatniku. jak bedzie zczytywal to chce, jak bedzie np 10, to chce zeby wgral do tablicy a[0] liczbe int=1 i a[1]=0 itd... i tak dlugo az bdzie to 255 znak, koniec zadeklarowanej tablicy, albo w nottatniku znak entera...

marcin20_21

Ponieważ jesteś ograniczony liczbą znaków (konkretnie cyfr), to chyba lepiej użycz fgetc, powtórzyć wywołanie 255 razy.
FILE * fp;
char plik[255]={"mak.txt"};  //na nazwe mozna dac mniej znakow !!
char znak;
int a[255],i,L;

fp = fopen(plik,"rb");
if(fp == NULL) printf("Nie udalo sie otworzyc pliku %s do odczytu",plik);
else
  {
   for (i=0;i<255;i++)
   {
    znak = fgetc(fp); /*wczytuje jedna literkę, albo cyferkę,
                      albo znaczek z pliku */
    if ((znak < '0') || (znak >'9')) break; /*jesli nie cyfra,
                                            */koniec wczytywania
    a[i] = znak - 48; /* zero ma kod 48 dziesietnie, czyli w kodzie
                   szesnastkowym, kazda nastepna cyferka kod o 1 wiekszy*/
   }
   L = i; //zapamiętanie, ile znakow wczytano
   fclose (fp);
  }
printf("Wczytalem z pliku:\n");
for(i=0;i<L;i++)
   printf("%d",a[i]);


Na uwagę zasługuje, że cyfry są kodowane w ASCII wartościami:
'0' to 48 (30 HEX), '1' to 49(31HEX) itd. Stąd jeśli wiesz, że masz znak jakiejś cyfry, a chcesz mieć gdzieś jej wartość, wystarczy od tego znaku odjąć 48.

W petli for najpierw wczytywany jest jeden znak z pliku, jesli jest on inny niz cyfra, zachodzi wyjscie z petli for. jeśli jednak jest to cyfra, wyliczam jej wartość (znak-48 ) i wpisuję do tablicy a; ponieważ for jest ograniczony wartością 255, to nie wczyta się wiecej, niż 255 cyfr. Potem jest już tylko wyświetlanie  :lol:

Musze jeszcze o jednym napisać. Zasięgnąłem języka i kolegi (lepszy programista). InitGraph to nawet nie jest funkcja samego Pascal'a, ale kompilatora Borland Pascal, często jednak właśnie jego się używa. Być może kompilator Borland Turbo C++, czy jakoś tak się on nazywa, ma tą funkcję, więc jeśli jego używacie, to może ona tam być.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

no dobra, a teraz pytanie, jak sie tworzy wlasne biblioteki?

bo tak przejrzalem biblioteki z deva i stwierdzam, ze kompletnie nie wiem o co chodzi...

czy to wystarczy tak, jak jest w NQC, ze piszesz wszystkie funkcje normalnie tylko ze bez glownej funkcji 'main', i zapisujesz jako jakis plik *.h???

i jak sie takie funkcje definiuje? piszerz

nazwa_funkcji();
{
instrukcja;
}

czy musisz dopisac przed nazwa jakis ciag znakow?
np void albo int?
i na jakiej zasadzie sie wpisuje w te nawiasy po nazwie funkcji jakies zmienne?

kshonek

Cytat: "bartsob5"no dobra, a teraz pytanie, jak sie tworzy wlasne biblioteki?

bo tak przejrzalem biblioteki z deva i stwierdzam, ze kompletnie nie wiem o co chodzi...

czy to wystarczy tak, jak jest w NQC, ze piszesz wszystkie funkcje normalnie tylko ze bez glownej funkcji 'main', i zapisujesz jako jakis plik *.h???

i jak sie takie funkcje definiuje? piszerz

nazwa_funkcji();
{
instrukcja;
}

czy musisz dopisac przed nazwa jakis ciag znakow?
np void albo int?
i na jakiej zasadzie sie wpisuje w te nawiasy po nazwie funkcji jakies zmienne?

widze ze tez nic_nie_robisz w ten weekend ;]

wnioskuje ze jestes pod koniec prac skoro juz dodajesz funcje do bibliotek O_o ładnie, ja sie zabieralem caly dzien, ale jakos nic nie zrobilem dzisiaj :/
img]http://www.boincstats.com/signature/user_680760.gif[/img]

bartsob5

zeby ci uswiadomic na jakim jestem etapie:

zrobilem ladowanie labiryntu na podstawie wczytywania 0 i 1 z pliku, dodatkowo walnalem klilkadziesiat voidow do pliku naglowkowego, ale mimo wszystko chce sie dowiedziec o mozliwosciach tych plikow naglowkowych (bo na voidach daleko nie zajade...)

marcin20_21

Z własnymi bibliotekami funkcji to jest tak, że tworzy się, oprócz głównego pliku z main, dodatkowe pliki. Załóżmy, że tworzysz bibliotekę funkcji do odczytu z klawiatury, tworzysz wtedy nie jeden :!: ale dwa pliki, np. klawiat.c i klawiat.h. (Ważne, żeby różniły się tylko rozszerzeniem.) Jeśli programujesz w C++, wtedy możesz dać rozszerzenie cpp zamiast c.
klawiat.c powinien zawierać Twoje funkcje związane z obsługą klawiatury, ewentualne zmienne globalne, których używasz w tych funkcjach.
klawiat.h powinien zaś zawierać same deklaracje funkcji :!: Nie powinien zawierać ciała żadnej funkcji. Dodatkowo plik .h powinien mieć pewną strukturę:
#ifndef __klawiat__h__
#define __klawiat__h__

//deklaracje funkcji

#endif

To z # to derektywy preprocesora, w skrócie chodzi o to,żeby nie includować dwa razy tych samych funkcji...
W każdym razie w głównym pliku programu (tym z main) include'uje się tylko klawiat.h. (klawiat.h można też includować w klawiat.c)
Wszystko to działa bez problemu, o ile kompilator widzi te trzy pliki jako należące do jednego projektu, jeśli jednak ich tak nie traktuje, wtedy pojawiają się problemy. Zazwyczaj w kompilatorze jest jakis file manager, add to project... albo coś takiego :)
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

hmmm to dziwne...
a jak jest tylko jeden taki plik to tez chyba dziala, co nie? (tylko kompilator daje ostrzezenia?)

bo mi sie to takie skomplikowane wydaje...

kshonek

Cytat: "bartsob5"hmmm to dziwne...
a jak jest tylko jeden taki plik to tez chyba dziala, co nie? (tylko kompilator daje ostrzezenia?)

bo mi sie to takie skomplikowane wydaje...

ja mam jeden plik i nic sie nie wywala...... z tym ze ja daje include lab.c a nie lab.h
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

Może nie opisałem tego jasno, ale nie chciałem się wgłębiać. Będzie działać, jeśli się napisze funkcje w lab.c, bez używania lab.h. Nie jest to jednak ładnie zrobione. Jeśli piszecie projekt, a gość ma o tym jakiekolwiek pojęcie, to Wam to wypomni. Ja tak miałem przy pierwszym z projektów kilkuplikowych :lol:
Podejście z dwoma plikami ma taką zaletę, że jeśli napisze się raz bibliotekę (np. lab.c) i nie zmienia jej, kompilator nie kompiluje pliku lab.c za każdym razem, jak kompiluje się cały program, kompilacja trwa krócej. I jeszcze jedno - używając takiej techniki można nie udostępniać komuś ciała swoich funkcji, ale gotową bibliotekę (.lib) i plik .h z deklaracjami tych funkcji (albo np. klas). Jeśli używacie jakichś standardowych funkcji, to nie inkludujecie plików .c ale .h.
Po szczegółowe iformacje odsyłam do książek, np "Symfonia C++" str 102 i dalej.

Podkreślam: to będzie działać (choć w pewnych sytuacjach jednak nie), ale nie jest to do końca poprawnie.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"Jeśli piszecie projekt, a gość ma o tym jakiekolwiek pojęcie, to Wam to wypomni.

Uwierz, że nie ma :lol:
img]http://www.boincstats.com/signature/user_680760.gif[/img]

bartsob5

czyli jesli dobrze zrozumialem...

plik biblioteka.h

#ifndef __biblioteka__h__
#define __biblioteka__h__

#define __linia

#endif


a plik biblioteka.c

#include <biblioteka.h>
void linia()
{
line(0,0,100,100);
}


czy jak?

marcin20_21

Inaczej:) Deklaracja funkcji to zadeklarowanie, żę jakaś nazwa to funkcja (również podanie jej parametrów i tego, co zwraca). Dla podanego przykładu byłoby to:

#ifndef __biblioteka__h__
#define __biblioteka__h__

void linia();   // pierwsza linia funkcji i średnik
#endif
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

no dobra... a czy i jak sie takie biblioteki kompiluje?

bo jak mam tak na sucho te biblioteki, to mi sie sypie program (jeszcze gorzej niz gdybym mial normalnie w innym pliku wypisane je...)

marcin20_21

Cytat: "bartsob5"no dobra... a czy i jak sie takie biblioteki kompiluje?

bo jak mam tak na sucho te biblioteki, to mi sie sypie program (jeszcze gorzej niz gdybym mial normalnie w innym pliku wypisane je...)

Nie wiem, co rozumiesz, pod pojęciem "sucho".
To kompilator dba o to, że jak zmienisz plik .c, to go kompiluje, a jak go nie zmieniasz i znowu uruchamiasz kompilację, to NIE kompiluje go znowu.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Mam stosunkowo prosty problem, ale nie ma pojecia jak go rozwiazac.

Napisalem program (dokladnie zegarek), ktory sobie liczy ładnie, ale ustawiam w petli for ilosc sekund, a chce zeby mozna to bylo przerwac w dowolnym momencie poprzez nacisniecie klawisza esc. W dowolnym momencie moze byc np po kazdej sekundzie, ale problem mam taki ze nei wiem jakiej fynkcji do tego uzyc. scanf czeka za kazdym razem, wiec odpada, ale mysle ze ejst taka funkcja ktora co przebieg petli for (1sekunda) sprawdzi czy byl nacisniety esc i przerwie. Niby jest to proste, ale za nic nie wiem jak to wykonac. Pytalem sie bartka na gg to tez kombinuje jak ja [;

pozdrawiam i z gory dzieki za pomoc
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

Ja używałem funkcji kbhit

#include <conio.h>

int main(void)
{
   cprintf("Nacisnij jakis klawisz,aby kontynuowac");
   while (!kbhit()) /* Nic nie rob */ ;
   cprintf("\nNacisnales klawisz\n");
   return 0;
}


Możno też chyba użyć coś związanego z cin, ale jeszcze o tym nie czytałem.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

kshonek

Cytat: "marcin20_21"Ja używałem funkcji kbhit

#include <conio.h>

int main(void)
{
   cprintf("Nacisnij jakis klawisz,aby kontynuowac");
   while (!kbhit()) /* Nic nie rob */ ;
   cprintf("\nNacisnales klawisz\n");
   return 0;
}


Możno też chyba użyć coś związanego z cin, ale jeszcze o tym nie czytałem.

dzieki, pomogło ;)

tez walczylem z cin, ale to od cpp, czyli mnie nie urządza.
img]http://www.boincstats.com/signature/user_680760.gif[/img]

marcin20_21

Skoro czyste C, to nie widzę innego rozwiązania :)
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

jaka jest roznica miedzy C a C#??? taka sama jak miedzy C a C++ i miedzy C# a C++???

marcin20_21

Cytat: "bartsob5"jaka jest roznica miedzy C a C#??? taka sama jak miedzy C a C++ i miedzy C# a C++???

Najpierw było C, potem C++, a potem C#:)
Czyli im nowszy, tym ma więcej możliwości, bardziej rozbudowany, i takie tam:)
W C# (czyt. C szarp) jeszcze nie programowałem.
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

Mchl

C# jest jeszcze bardziej obiektowy niż C++.
Jak zwykle można poczytać w Wikipedii

W nagłych wypadkach wzywać przez: mail: mchlpl[at]gmail.com | PM|mchl[a]boincatpoland.org

bartsob5

Cytat: "Mchl"C# jest jeszcze bardziej obiektowy niż C++.


yyyyyyyyyyyyyyyyyyy aha  :oops:  :?

marcin20_21

Cytat: "bartsob5"yyyyyyyyyyyyyyyyyyy aha
Spróbuj sprecyzować, jakiej odpowiedzi potrzebujesz, to może Ci jakoś pomożemy  :wink:
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

---------- 20:06 17.11.2006 ----------

probuje sobie skonfigurowac msvc++ tak, zeby byl on zdolny do pisania aplikacji do boinca (najlepiej w c, ale nie obraze sie na c++) i powiem wam ze mnie to przerasta....

mam to zrodlo programu hello BOINC world i wszystkie biblioteki w nim zawarte juz zdobylem (czyli te wszystkie boincowe..) przy probie kompilacji mi wywala blad, ze nie moze znalezc windows.h (z tego co widze to w kodzie go nie ma, wiem musi byc w jakiejs bibliotece..) i nie wiem co z tym zrobic..
Cytatc:\program files\microsoft visual studio 8\vc\include\boinc_win.h(72) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory


edit_______

skopiowalem wszystkie mozliwe biblioteki z borlanda i wkleilem do katalogu msvc... efekt jest takui ze mam 53 ostrzezenia

Cytatwarning C4068: unknown pragma

i blad
Cytaterror C2440: '=' : cannot convert from 'LPWSTR' to 'LPSTR'
       Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

---------- 14:02 18.11.2006 ----------

teraz mam bledy w stylu:

Cytat------ Build started: Project: hello, Configuration: Debug Win32 ------
Linking...
winmm.lib : fatal error LNK1107: invalid or corrupt file: cannot read at 0x1B2E
Creating browse information file...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
BSCMAKE: error BK1506 : cannot open file '.\Build\Debug\obj\boinc_api.sbr': No such file or directory
Build log was saved at "file://c:\Program Files\Microsoft Visual Studio 8\VC\bin\hello.d\Build\Debug\obj\BuildLog.h tm"
hello - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

marcin20_21

Skopiowanie plików nagłówkowych *.h z Borlanda nie było najlepszym pomysłem -> to są tylko deklaracje (czyli zapowiedzi) różnych funkcji. Może masz za starą wersję msvc?
url=http://www.puzzlepirates.com/register/welcome.wm?from=r490404][/url]

bartsob5

wersja 2005 express edition... (moze dlatego)

ale generalnie juz chodzi, tylko teraz mam problem z tym winmm.lib i boinc_api.sbr :\