Prvdepodobne mas vypnuty pc speaker - ten pistiaci hnusny mali repacik schovany niekde v tvojom pc. O zvukovu vystrahu z reproduktorov sa tu nejedna...
Příspěvky odeslané z IP adresy 195.91.54.–
Pole a indexovanie som pouzil len koli prehladnosti a jednoduchosti. A ak chceme pouzit incrementovanie a zachovat podmienku ze pri zadani F dostaneme naspat F, da sa to spravit aj bez min() (mozno teraz trepnem sprostost), ktora imo vnutorne podmienky vyuziva...
Staci prepisat ok_func a to pole smazat:
void ok_func(unsigned char zn)
{
unsigned char inc = ((zn+1) | (zn+1)==0x6) & ~(((zn+1)==0x6) << 1);
printf("Znamka je : %c\n", 'a'+inc);
}
Pravdaze keby znamky nesli za sebou (ak by mali niekde system A,B,C,D,F, napr. ako tu niekto poznamenal) tak by som si riesenie bez pola predstavit nevedel...
Nie ze by tato diskusia bola na nieco dobra, ale ked som uz zacal...
Nejako tam nevidim nepouzitie podmienok...a navyse prechadzat to v cykli ;/
Co tak takto:
#include <stdio.h>
typedef void (*handler_t)(unsigned char num);
char znamky[] = {'b','c','d','e','f','f'};
void ok_func(unsigned char zn)
{
printf("Znamka je : %c\n", znamky[zn]);
}
void bad_func(unsigned char zn)
{
printf("znamky musia byt a..f\n");
}
handler_t funcs[] = {bad_func, ok_func};
int main()
{
unsigned char index=0,x=0; /*unsigned lebo _chcem_ aby to v pripade chyby pretieklo*/
printf("Znamka[a,b,c,d,e,f]: ");
scanf("%c",(char*)&index);
index= (index - 'a'); /*tu to moze pretiect, a to v pripade chyby chcem*/
x = (~(index / 6) + 1) == (index / 6) ;
(*funcs[x])(index);
return 0;
}
Tento sposob obchadzania if/switch mam obvzlast rad ;)
To AdamHlavatovic : Ale programator, ktory mysli na vsetko by if imho aj tak pozuil: co ak zada uzivatel F ? Dostane odpoved G co je neziaduce a uz ani nehovorim o pripade ak by bolo pouzite pole a vracal by sa i+1 index - segfault jak vysity.
Iba ak by bolo pole zadane {'B','C','D','E','F','F'} ale aj tak nejaky bfu (v tom nepeknom vyzname) moze zadat 'G' a ked sa to nijako neotestuje a nejakym sposobom prevedie na cislo zas nam tu hrozi segfault...
EDIT: pravdaze if/switch mam na mysli len na kontrolovnie kritickych podmienok ;)
Nepoviem ti viac ako je toho na wiki...
Ale ako som kukal tie bern. cisla mam taky pocit ze by bolo o dost jednoduchsie (aj rychlejsie) poratat priblizne hodnoty sin x a cos x a potom to vydelit...
Sinus/kosinus sa tu uz raz riesil, skus pohladat...
Hodit na forum post ze ozvite sa mi na ICQ a pomozte mi je imho znakom neoslnivej inteligencie autora. Takze ak nemas nejaku poruchu osobnosti tak sem napises cely svoj problem a navyse by sa mali ludia naucit pista nazvy threadov tak aby aspon trochu popisovali problem...
Tu http://en.wikipedia.org/wiki/Taylor_series#List_of_Taylor_series_of_some_common_functions mas par funkcii rozlozenych na mocninovy rad.
Staci uz iba aby si si spravil nejake f-cie pre mocninu, faktorial a Bernouliho cisla...
Zdravim. Mam taky nepekny problem: mam 2 disky jeden je SATA a 2 ide. Na tom sata mam system (debian) no a ked pripojim ten ide disk (je na nom zaloha ;( ) tak sa mi uz moj debian pekny nenabootuje...
Posledna hlaska co vypise pri bootovani: "Waiting for root file system..." (alebo nieco take) a uz sa dalej nepohne...
Problem je pravdepodobne v tom, ze system sa nainstaloval na /dev/sda no lenze ked tam pripojim tento druhy sunt tak to tam narobi bordel a /dev/sda je ten ide-ckovy (preco je ide disk sda to nechapem...) a /dev/sdb je moj hlavny (teda aspon tak som si to vsimol pri boote ked napisal meno a velkost disku...). Ked aj v grube donutim cez prikazovu riadku aby to bootovalo z /dev/sdb zasekne sa to trosku dalej (pri kontrolovanie filesystemov - stale to kontroluje /dev/sda...)
Neviem si s tym rady... HELP pls!
tu:
if (pole[jaja])
{
fero=jaja;
do{
fero += jaja; //<=====
pole[fero] = 0;//<==== Tu lezies nad rozsahy pola
}while(fero<=Novy);//<==
}
Pristupujes do pola skor ne zistujes ci je index platny...
Prepis napr. takto:
if (pole[jaja])
{
fero=2*jaja;
while(fero<=Novy){
pole[fero] = 0;
fero += jaja;
}
}
...ale je. Mozes pouzit standartnu time() ak to tam bude aspon sekundu ;). Potom mozes pouzit kadejake systemove timre s rozlisenim na milisekundy niektore dokonca az nanosekundy ale tu sa uz pouzitie lisi system od systemu...
A ak mas ten program dostatocne komplikovany aby ta ratanie sekund pri kazdej funkici dostatocne nasieralo tak pouzi nejaky schopny nastroj na profilovanie...
V tom kuse kodu co si sem dal chybu nevidim (a nezbadal ju ani kompilator ;) ), takze je dost mozne, ze tam neni ;). Ak ti to pada tak je chyba niekde inde...
http://xkcd.org/371/ ;)
He, no necakaj ze v knizkach s nazvom "Naucte sa XXX za YY dni" (kde YY je cislo pod 50 ;) bude nieco poriadne vysvetlene ;)
Ale aj tak som nepochopil co sa vlastne pytas... Ale odkazy sa pouzivaju aby si nezasieral stack tym ze tam a z neho budes tie objekty kopirovat, nehovoriac o tom ze to zerie cas ked je ta trieda vacsia...
Ak mozes tak pouzi standartnu C kniznicu... napr. takto:
.section .data
read_text:
.ascii "%d %d"
print_text:
.ascii "Sucet je: %d\n"
a1: .long 0
a2: .long 0
.section .text
.globl main
.type main, @function
main:
push %ebp
mov %esp, %ebp
pushl $a1
pushl $a2
pushl $read_text
call scanf
mov a1, %eax
add a2, %eax
push %eax
push $print_text
call printf
mov $0, %eax
mov %ebp, %esp
pop %ebp
Kurna, toto sa tu preberalo uz milion krat.
Ludia sakra skuste hladat alebo si prejdite aspon poslednych par vlakien k tej-ktorej teme. Potom tu slusnym obcanom spamujtete rss citacku...
(p.s. mohol by niekto s nadanim pre polopatisticke pisanie napisat nieco ako FAQ a slahnut to bud sem na forum a oznacit to ako dolezite alebo medzi clanky...)
To Zelenáč : jakze ne ? Sak potom by ti ten had nezatacal ;) Prevod na ascii zo scancode je uz len brnkacka...
EDIT: k tomu buffru... toto je este len taka prdprodukcna vzorka na test typu "funguje to vobec ?" Bezpecnostne opatrenia idem urobit az teraz (ani len nekntrolujem ci nepreteka... tfuj!)
Zdravim. Mam takyto kod:
struct _key_buffer {
unsigned int size;
unsigned char buffer[256];
} key_buffer;
char getc()
{
while(key_buffer.size == 0); /*<<<===========cez toto to neprejde*/
return key_buffer.buffer[--key_buffer.size];
}
/*rutina pre obsluzenie IRQ1*/
void IRQ1_Keyboard_isr(struct reg_struct non)
{
unsigned char scancode = inb(0x60);
switch(scancode)
{
case 0x2a: /*stisknutie shiftu*/
shift = 1;
case 0xaa: /*pustenie shiftu*/
shift = 0;
default:
if(scancode & 0x80) { /*zdvihnuty klaves*/
break;
} else {
if(shift)
key_buffer.buffer[key_buffer.size++] = asciiShift[scancode];
else
key_buffer.buffer[key_buffer.size++] = asciiNonSh[scancode];
}
}
}
Problem je v tom, ze cez cyklus while(key_buffer.size == 0) v getc() sa to nikdy nedostane.
IRQ1_Keyboard_isr() je volana asynchonne(prerusenie) a na 100% funguje tak ako ma (skusane) no getc() si akosi nevsima zmenu key_buffer.size....
Vobec neviem ze preco... Neviete niekdo ze v com je chyba ?
Su to vsetko hovadiny. Cely den klikas dakde jak fretka a zarobis kolko ? 0.5$ Sorry ale <15Sk za neviemkolko zabitych hodin ani nahodou... To uz radsej pojdem umyvat podlahu to najpondiatejsej krcmi na zemeguli a aj tak budem zarabat 5-krat tolko na jednotku casu...
To ospaly.stanislav : No, tak potm mas 2 moznosti:
Bud sa na bootsecotr totalen vys---es a zaciaok kernelu len opises (tu je zopar veci , ktore su dost dolezite) v asm su navyse aj niektore pokroilejsie veci, takze tuto variantu nedoporucujem
Alebo sa na svo os zatial vytoto a budes sa pekne ucit assembler
No, tak to ti drzim palce .... A ked ti nejde o grafiku alebo nemas nejake specialne zaujmy alebo _nie si_ assemblerovy fetisista TAK BOOTSECTOR NEPIS.Spravit entry kernelu tak aby to nabootoval grub je zalezitost asi na 15 riadkov asm - zopar magickych cisel ktore len okopirujes z dajakeho tutorialu... tu sa numusis hanbit kopirovat, tu niet co pochopit, je to cista magia ;).
A s grubom mas omnoho pohodlnejsi zivot... mozes mat fs na diskete => jednoduchsie vymeny kernelov pri testovani a mnoho ineho...
Velmi, skutocne velmi zaujimavy tvar slova...bootace ;) A ano, da sa to. Dalsi clovek co si chce spravit vlastny OS ;) ?
http://www.osdever.net/tutorials/brunmar/tutorial_01.php
EDIT: ej, teraz som si spomenul... toto ti mozno bude uzitocnejsie
http://www.root.cz/clanky/piseme-operacni-system-boot/
To tmi : g++ pri nerozlisitelnych hadze pokial viem error (lebo oni aj ked su pretazene sa po prelozeni nevolaju rovnako a treba zistit co sa ma zavolat...)
A ked nema prototyp? No neviem, c++ kompilator to zatrhne hned a v C-cku som pretazene funkcie este nevidel. Ale ak to myslis tak ze su dostupne 2 rozne prototypy tak sa pouzije posledny pokial viem...
Co sa ti nepaci na SDL ? Potom tu uz iba zostavaju skor gui-toolkity ako GTK, Qt atd...
Alebo este WinAPI a Xlib ale tieto 2 by som jednoduchsimi nenazival ;)
Ale skus sa pozret na ClanLib, som pocul ze je to celkom puzitelne ale vela tutorialov som na to nevidel ani som s tym nikdy nerobil...
http://www.clanlib.org/
To tmi : Je mi jasne ze podla standartov to na 99% neprejde, ja som len chcel poznamenat ze z technickej stranky moze byt deklaracia funkcie compileru viac-menej ukradnuta...
To Tom@sQo : Kniznice, ako napr. iostream, su vo vsetkych modernych os vacsinov linkovane dynamicky, t.z. v pamati sa tato kniznica nachadz iba raz aj ked ju vyuziva 20 programov. To ze je v nej vela tried funkcii a ja neviem coho ktore nevyuzivas ta trapit nemusi, lebo tvoj vysledny program obshuje len odkaz na tuto kniznicu a ty ked zavolas nejaku metodu napr. objektu cout, tak sa len zisti kde dana kniznica je a metoda sa zavola stade...
Da sa donutit aby to bolo vsetko napchcate v tom tvojom programe, to sa vola staticke linkovanie.
A na koniec: kompiler prelozi len to co mu povies a linker zlinkuje len to co mu povies (+ nejake std kniznice, ale da sa donutit aby ani to). Napriklad mas funkciu xyz() v subore xyz.c a pouzivas ju v abc.c. Subor abc.c v pohode prelozis ale ak vysledny objektovy kod budes chcet zlinkovat a nepovies linkeru nech sa pozre aj do (uz skompilovaneho) xyz.c tak ta posle do ... s hlaskou "undefined reference" alebo nieco take, co znamena v podstate ze nevie co ma na tom mieste v programe zavolat...
To bukaj : Pozor, na to aby si mohol vyuzivat dajaku funkciu nemusis ju mat deklarovanu. Compiler vacsinov vyhodi nejaky nechutny warning ale skompiluje to a ak to linker dokaze vyriesit tak je vsetko v poriadku. Skus skompilovat napr. toto:
int main()
{
printf("aaa\n");
return 0'
}
GCC povie nieco taketo: warning: incompatible implicit declaration of built-in function ‘printf’ ale program sa da skompilovat a pustit.
Deklaracie funkcii su "len" na to kontrolovanie parametrov. Praca prekladacu je nahradit "printf(x)" za "push x; call printf" ;)
(striktnejsie kompilery to mozno uplne zatrhnu, ale v prncipe by toto malo kompileru uplne satcit...)
To Tom@sQo : Hovori ti nieco oddeleny preklad ? Pravdaze mozes naincludovat aj *.c subor (drektiva #include funguje s hocijakym suborom (mozno ze aj s binarnym ale to som si neni isty, kedze uzitocnost includovat bin. subor je absolutne nulova ;) )
No ked naincludujes vsetky zdrojaky tak to asi moc oddelene neprelozis... A to nehovorim o definiciach vsetkych struktur, konstant a ja neviem coho...
A navyse, ako by si chcel includovat napr. zdrojak z dajakej kniznice ? Napr. WinAPI ? Ak sa ti to podari tak mi daj vedet ... ;)
hh, haluz to je ta hra... ;)
Ako som pozeral tie zdojaky tak som tam nikde nevidel linker script aj ked ho ld predavas (-T text). A co robi 0x1000 ?
Mne tie tvoje zdrojaky skompilovat v pohode idu (nic som nemenil v tom skripte)...
A tak mimo misu: preco nepouzivas Makefile ? ;)
Na generovanie skutocne nahodnych cisel imo algoritmus neexistuje. Pre pseudonahodne je jeden popisany na wiki
http://en.wikipedia.org/wiki/Linear_congruential_generator
A ked chces _skutocne_ nahodne cisla tak pouzi /dev/random ak si pod linuxom, problem je, ze ten subor sa rychlo minie ;). Pouziva to udaje z prakticky nahodnych zdrojov - pohyby mysi, pid procesov a pod.
Pod wine ide vsetko pekne(aj pisma).
V na linuxe skompilovanej vezii nejdu ziadne pisma (ani menu) okrem fps meraca. Rozlisenie mam 1440x900 ale ak si dobre pamatam, ak ma sdl problem so zmenou rozlisenia tak posle cely program do hajan a navyse oboch hadov vidim jasne a zretelne ;)
Nehral si sa s nastavenim bootloadera pri instalacii ? Po precitani fedorackeho instal manualu mam pocit, ze nemas grub v mbr a ten windowsacky ho odignoruje...
Vygoogli som totok: http://linuxhelp.blogspot.com/2005/11/how-to-repair-corrupt-mbr-and-boot.html
Je to dokonca s fedorou a windowsom a nejak moc som to nestudoval...
Som sa kukol na to GetRandomDouble() - ono je to dobre le to cislo (asi je to SHRT_MAX, ze ?;) ) ktroym to nakoniec delis nahrad RAND_MAX - to ma v sebe na vsetkych systemoch max. moznu navratovu hodnotu rand().
A inac mi nejdu fonty ;((( a chybove hlasky to nedava ziadne... zaujimave je, ze fps ukazovac ide.
Po rekompilacii to ide aj mne rychejsie (+- 80 fps), ide to rychlejsie, lebo ja a asi aj tommz9 sme to pustal cez emulator -Wine
Nebolo treba tam toho vela menit, v podsate len nacitas cisla zo zasifrovaneho suboru do toho unionu do long cisla[] a vypisujes cez char text[].
#include <stdlib.h>
#include <stdio.h>
#define POCET_CISEL 5
#define POCET_BAJTU sizeof(long)*POCET_CISEL
/* unie - kryptovani souboru */
union sifra
{
char text[POCET_BAJTU];
long cisla[POCET_CISEL];
};
void vypln(char *, int);
int main(int argc, char *argv[])
{
union sifra data;
FILE *uvstup, *uvystup;
int pocet, i;
char znak;
if(argc == 3)
{
uvystup = fopen(argv[2], "w");
if((uvstup = fopen(argv[1], "r")) != NULL)
{
pocet = 0;
vypln(data.text, POCET_BAJTU);
do
{
fscanf(uvstup,"%i", &data.cisla[pocet++]);
if((pocet == POCET_CISEL) || feof(uvstup))
{
i = 0;
do
fprintf(uvystup, "%c", data.text[i++]);
while(i<POCET_BAJTU);
pocet = 0;
vypln(data.text, POCET_BAJTU);
}
}
while(!feof(uvstup));
fclose(uvstup);
fclose(uvystup);
}
}
else
printf("Chybny pocet parametru.\n");
return 0;
}
void vypln(char *bajty, int pocet)
{
int i;
for(i=0; i<pocet; i++)
bajty[i] = 0;
};
A nabuduce svoj kod obal do tagu "code" a by to bolo citatelnejsie a zislo by sa aj trochu komentarov...
Na
#include <stdio.h>
#include <stdlib.h>
#define MAXM 100
#define MAXN 100
int main(int argc, char *argv[])
{
char ch;
int konec=0;
int i;int prvek;int min=0, max=0;
int P=0;
float *T=NULL;
while(konec!=1){
system("clear");
printf("\n\n\n\n\n\n******** Program pro zpracovani termobronchoskopickeho vysetreni *********\n\n");
printf("\nMOZNOSTI:");
printf("\n[a] ..... Zadani poctu hodnot, aktualne je nastaveno: %i", P);
printf("\n..... Nacteni jednotlivych teplot z klavesnice");
printf("\n[c] ..... Vypis jednotlivych teplot na obrazovku");
printf("\n[d] ..... Vypocet a vypsani pozice a hodnoty minima a maxima");
printf("\n[q] ..... konec");
printf("\n\nStiskem pismenka zvolte cinnost:");
ch=fgetc(stdin);
switch(ch) {
case 'a': system("clear");
printf("\nZadani poctu hodnot\n");
puts("\nzadej pocet mereni ");
scanf("%i",&P);
printf("\n");
fgetc(stdin);
fgetc(stdin);
break;
case 'b': system("clear");
free(T);
printf("%d \n", P);
printf("\nNacteni jednotlivych teplot z klavesnice\n");
T=malloc(sizeof(float)*P); // definuje pole "T[]" o délce P
if(T==NULL)
exit(-1);
printf("\nzadej namerene teploty ");
for(i=0;i<P;i++) // cyklus pro nacteni poctu prvku
scanf("%f", &T[i]); // načte "prvek"
printf("\n");
fgetc(stdin);
fgetc(stdin);
break;
case 'c': system("clear");
printf("\nVypis jednotlivych teplot na obrazovku\n");
for(i=0;i<=(P-1);i++)
printf("Na %d. pozici - %.2f\n",(i+1),T[i]);
fgetc(stdin);
fgetc(stdin);
break;
case 'd': system("clear");
printf("\nVypocet a vypsani pozice a hodnoty minima a maxima\n");
min=T[0],max=T[0]; // deklaruje nejmenší a největší číslo jako první prvek pole
for(i=0; i<(P-1); i+=1) // cykl pro porovnávaní čísel , "(P-1)" - počet měření -1 protože nebudu porovnavat první číslo samo se sebou
{
if (min>T[i+1]) // v cyklu se nejprve porovna hodnota "min" (pole"T[]" s indexem "0") s hodnotou pole T[i+1] (index má v prvním cyklu hodnotu 1)
min=T[i+1]; // pokud je "min" vetší než hodnota pole "T[i+1]" v proměnné "min" není nejmenší číslo a
// přiřadí do "min" hodnotu "T[i+1]"
if (max<T[i+1]) // v cyklu se nejprve porovna hodnota "max" (pole"T[]" s indexem "0") s hodnotou pole
// T[i+1] (index má v prvním cyklu hodnotu 1)
max=T[i+1]; // pokud je "max" menší než hodnota pole "T[i+1]" v proměnné "max" není největší číslo a
// přiřadí do "max" hodnotu "T[i+1]"
}
printf("nejmensi cislo je %i\n",min); // vypíše minimalní hodnotu
printf("nejvetsi cislo je %i\n",max); // vypíše maximální hodnotu
fgetc(stdin);
fgetc(stdin);
break;
case 'q': konec=1; break;
default: system("clear");
printf("\nNeznama cinnost !");
printf("\n");
fgetc(stdin);
fgetc(stdin);
break;
}
}
printf("\nKONEC\n");
return 0;
}
system("clear") si zmen na system("cls") ak robis pod widlami.
Co bolo zle:
for(P=0;P<=(P-1);P++) - to snad ani neptrebuje komentar ;)
for (;;) - ma byt while(konec!=1)... for(;;;) ti zvysoka serie na to ci si si nastavil dakde konec na 1 alebo nie...
float T[P]; // definuje pole "T[]" o délce P => TAKTO SA DYNAMICKE POLE NEROBI!!!!!!!!!!!!!!!!!!! Ak ti to nahodou funguje tak spoliehanim sa na to zapredavas svoju dusu satanovi ktroy si raz pride vybrat svoju dan v podobe nevysvetlitelnych segfaultov vsetkych tvojich programov!
A este getch som si zmenil na fgec(stdin) (aj u system("pause")) lebo po prilinkovani curses s mi to sralo a nechcelo sa mi v tom hrabat ale ak ti to funguje ozes pouzivat to....
To AdamHlavatovic : Ctrl-C Ctrl-V do <tvoj oblubeny editor> a ide to aj bez emocii ;)
Aha ty to bootujes ;)
No, ak si dobre pamatam tak to nejak tak ze pomocou dd a /dev/zero si urobis subor velky ako disketa, ten sa sformatuje (pomocou mke2fs) mountne a potom tam ponahravas co stes a malo by sa to spravat ako img diskety... ak nema mat fs tak vynechas formatovanie....
Len sa mi nedari nejak vygooglit presny postup.....
EDIT: to cat je uzitocne ked zliepas grub stage1 a stage2 ;)
Neni zac.
K tym podmienkam:
float k;
/*...nacitanie koeficientov...*/
k = (float)a2/a1;
if(k==(float)b2/bi) { /*tu som si neni isty, kedze k moze byt aj iracionalne (sqrt(2) a pod. a to sa do float nezmesti) ci to bude fungovat vzdy, ale asi ano*/
if(k==c2/c1) {
/*nekonecne vela rieseni*/
return volaco;
}
/*nula rieseni*/
return volaco;
}
/*..zvysok tvojho kodu...*/
Neskusane ale hadam som sa neskol...
Rovnicu o 2 neznamych mozes chapat aj ako analyticke vyjadrenie priamky v rovine (vseobecna rovnica priamky).
Takze sustava ma nekonecne vela rieseni ak 2 rovnice vyjadruju tu istu priamku, cize existuje k z R tak ze a2=k*a1, b2 = k*b1, c2=k*c1. Ak rovnice splnaju tieto podmienky, sustava ma nekoecne vela rieseni.
Nema riesenie ak 2 priamky v rovine nemaju spolcny bod, tj. su rovnoezne. To su vtedy, ak sa ich rovnice lisia iba o konstantny clen - c.
Takze ak a2=k*a1, b2=k*b1 a sucasne c2 != k*c1, kde k je z R
Ak ziadna z tychto podmienok neplati tak ratas tak ako to uz mas.