#2 vitamin
A nenapadá tě nějaký kompilátor, určený pro Linux? Co jsem tak hledal na internetu, tak jsem našel XC kompilátory, ale pro mikročipy. Například:
https://www.microchip.com/pagehandler/en_us/devtools/mplabxc/
#2 vitamin
A nenapadá tě nějaký kompilátor, určený pro Linux? Co jsem tak hledal na internetu, tak jsem našel XC kompilátory, ale pro mikročipy. Například:
https://www.microchip.com/pagehandler/en_us/devtools/mplabxc/
Ahoj,
setkal jsem se s modulem, který nemá klasickou koncovku *.c, ale *.xc. Nevíte někdo o co se jedná? Klasická kompilace kompilátorem gcc skončí chybou (collect).
Jedná se o tento soubor:
https://github.com/xcore/sc_ethernet/tree/master/module_ethernet_smi/src
Děkuji za radu.
Ahoj,
mám problém s kompilací *.c souboru, který v sobě obsahuj ASM kód.
typedef unsigned long long u64;
u64 rdtsc() {
u64 tsc;
__asm__ __volatile__("rdtsc" : "=A" (tsc));
return tsc;
}
Překladač mi vyhazuje chybu:
root@expbone:~/Desktop# gcc soubor.c
soubor.c: In function 'rdtsc':
soubor.c:20:5: error: impossible constraint in 'asm'
Jedná se o soubor realfeel.c zde http://brain.mcmaster.ca/~hahn/realfeel.c
Budu rád za jakoukoliv pomoc či radu. Děkuju
Ahoj,
prosím neporadili byste mi, jak vyřešit tyto chybové hlášky? Děkuji
root@blackbone:~/Desktop/Cache Calibrator# gcc calibrator.c
/tmp/ccCtO0fw.o: In function `analyzeCache':
calibrator.c:(.text+0x2300): undefined reference to `log10'
calibrator.c:(.text+0x2338): undefined reference to `log10'
/tmp/ccCtO0fw.o: In function `analyzeTLB':
calibrator.c:(.text+0x3170): undefined reference to `log10'
calibrator.c:(.text+0x31a8): undefined reference to `log10'
calibrator.c:(.text+0x33a0): undefined reference to `log'
calibrator.c:(.text+0x33d8): undefined reference to `log'
calibrator.c:(.text+0x3430): undefined reference to `log'
calibrator.c:(.text+0x3468): undefined reference to `log'
calibrator.c:(.text+0x34ec): undefined reference to `log'
/tmp/ccCtO0fw.o:calibrator.c:(.text+0x351c): more undefined references to `log' follow
collect2: ld returned 1 exit status
Zdrojový soubor calibrator.c je na adrese http://homepages.cwi.nl/~manegold/Calibrator/src/calibrator.c
#2 z
Tak soubor realtime v adresáři kernel není. Našel jsem tam akorát soubor vmcoreinfo, ve kterém je uložena hodnota 5e0c90 1000 (když zadám příkaz uname, tak mi to vypisuje PREEMPT). Je to ale divný, mělo by se jednat o hard-realtime OS...
Ahoj.
Dostal se mi do ruky projekt, který by měl představovat RTOS Linux (realtime Linux). Chtěl bych tedy ověřit, že je to opravdu RTOS a ne jen klasický OS. Existuje pro to nějaký jednoduchý příkaz, či metoda/postup?
Děkuji za jakýkoliv nápad.
#15 Kit
No v materiálech je, že by objekt, který volá sám sebe měl vypadat takto:
class TestClass {
public static $counter = 0;
public $id;
public function __construct() {
$this->id = self::$counter++;
}
}
$pom = new TestClass();
//funkce vola sama sebe
class TestClass {
public $id;
public function __construct() {
$this->id = self::$id;
}
}
Ale moc tomu teda nerozumim.. hlavně nechápu, co má dělat to self
#4 Kit
<?
class trida
{
var $atribut;
function__construct ($atribut)
{
$this->atribut=$atribut;
}
function metoda ()
{
$this->atribut=$atribut;
echo $atribut;
}
}
$pokus = new Trida('ahoj');
$pokus->metoda();
?>
Chápu správně, že konstruktor mi jakoby zpřístupní ten atribut a díky tomu už v metoda() nemusím atribut dávat do vstupního paramatru?
Ahoj
Nevíte, jak se pomocí JavaScriptu mohu odkázat na nějaké ID (stačí obecně)?
Ahoj,
prosím nenašel by se tu někdo, kdo by mi pomohl se základní ulohou v PHP? Teprve se PHP učím a nevím (nebo spíše nechápu) vzorové zadání této ulohy:
Vytvořte v PHP třídu s jedním atributem, konstruktorem a metodou. Následně vytvořte instanci této třídy a zavolejte její funkci.
Zdarvím,
pomohli byste mi s jedním záludným příkladem na fork()? Je to spíš na zamyšlení. Příklad zní:
Co bude obsahovat výstupní soubor, jestliže vstupní soubor obsahuje znaky "1234"? Uveďte všechny možnosti.
int fdr, fdw;
char c;
main()
{
fdr=open(„vstup“, O_RDONLY);
fdw=open(„vystup“, O_WRONLY);
fork();
rw();
exit(0);
}
rw()
{
for(;;)
{
if (read(fdr,&c,1)!=1)
return;
write(fdw,&c,1);
}
}
Zdravím,
chtěl bych se zeptat, zda nevíte jak v Debianu sloučit dva oddíly do jednoho? Pokud se podíváte na obr. níže, tak mi jde o ten oddíl "/dev/mmcblk0p1". Dočetl jsem se, že ideální pro takvéto věci je gparted, qtparted apd. Problém je, že žádný takový nástroj tam nemohu doinstalovat - málo místa :-(. Nevíte tedy jak např. za pomocí nástroje fdsik a mkfs sloučit tyto dva oddíly v jeden?
Ahoj,
snažím se o program v PROLOGu, který by uměl derivovat funkce. Pro začátek jsem napsal jen kód pro derivaci x a konstanty.
% derivace x podle x
derive(X,X,1).
%derivace konstanty podle x
derive(N,X,0) :- integer(N).
Když se chci programu zeptat jaký je výsledek, tedy:
?- derive(N,X,Nevim).
Dostanu ale nesmyslnou odpověď.
N = H126
X = H126
Nevim = 1
Nevíte, kde je chyba?
Ahoj,
začínám s PROLOGem a nějak mi nefunguje dotazování. Vytvořil jsem si nový projekt a potom i nový soubor, do kterého jsem vypsal následující fakt (používám Amz! Prolog).
divka(monika).
Pokládám tedy dotaz:
?- divka(monika).
Program mi ale stále vypisuje "no". Nechápu proč...
Ahoj,
nevíte jestli existuje nějaká metoda (funkce) pro zprůměrování jasů pixelů v obrázku (nemusí to být přímo v 3D MAXu... )?
Ahoj,
chtěl bych se zeptat, jestli byste mi nepomohli s vytvořením obrázku podle histogramu. Mám napsaný program, který by měl ošetřit případ, kdy histogram vypadá nějak takhle:
Pokud má obrázek takovýto histogram, je velice obtížné určit práh (pro segmentaci). Můj program by měl z tohoto histogramu udělat bimodální histogram (prostě místo jednoho "kopce" udělat dva "kopce"). Problém je, že obrázek, který by měl histogram podobný tomu co je výše nemůžu nikde najít.. Měl bych tedy prosbu na Vás, zda byste takový obrázek uměli např. uměle vytvořit v Photoshopu? Děkuji za každou radu
Ahoj,
pomohli byste mi s návrhem algoritmu pro kvantování? Problém je následující:
Mám pole A, které obsahuje například tyto hodnoty [0,63][0,92][0,33][0,66]...[n]
Předpokládejme, že maximální hodnota v poli je například [1]
Já bych potřeboval rozložit tyto hodnoty do rozmezí 0-200 a uložit do pole B. Takže chci v podstatě z rozmezí 0-1 získat rozmezí 0-200.
Vymyslel jsem tento algortimus, ale bohuže nefunguje.. V poli B jsou furt jen samé nuly a já už jsem bezradný.. Zde je algoritmus..
int[] B = new int[A.Length];
for (int i = 0; i < A.Length; i++)
{
for (int j = 0; j <= 200; j++)
{
if ((A[i] >= ((1 / 200) * j)) && (A[i] < ((1 / 200) * (j + 1))))
{
B[i] = j + 1;
}
}
}
Ahoj, prosím pomohli by jste mi s tímto příkladem?
int main (int argv, char **argc)
{
unsigned char c, i;
c = 0;
for (i = 10; i > 0; i--)
{
if ((i&3)==0)
{
c++;
}
}
printf("%i %i", c, i);
}
Proč se při výpisu zobrazí, že c je 2? Já to chápu tak, že pokud je třetí bit u prom. i roven 0, tak se c inkementuje. V tom případě by ale c mělo být 6.
#2 ingiraxo
Děkuju moc! Jen bych měl ještě dotaz..
Calloc a podobné funkce ještě moc neznám (jsem začátečník). Proto bych se chtěl zeptat, jestli je možné výše uvedený postup použít i pro klasickou deklaraci matice (matrix [vyska] [sirka])? Chtěl jsem postup s callocem zakomponovat do mého kódu, ale při zadání prvního prvku program spadne...
static int** first_matrix = NULL;
void create_first_matrix (int f_height, int f_width)
{
first_matrix = (int **)calloc(f_height, sizeof(int *));
int i;
char help [MAX_ELEMENT];
for (i = 0; i < f_height; i++)
{
int j;
for (j = 0; j < f_width; j++)
{
(void) gets(help);
first_matrix [i][j] = atoi(help);
help[0] = '\0';
}
}
printf("=%i=\n", first_matrix[0][0]);
printf("=%i=\n", first_matrix[0][1]);
printf("=%i=\n", first_matrix[1][0]);
printf("=%i=\n", first_matrix[1][1]);
}
Ahoj, chtěl bych se zeptat na níže uvedený zdrojový kód. Mám problém, že když udělám "předefinování" matice z rozměru 0x0 na 2x2, tak se mi vypisují špatné hodnoty. Pokud nastavím rovnou v glob. pr., že chci 2x2, tak je vše v pořádku.. Nevíte, proč se tak děje? Případně, jak by toto šlo odstranit?
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT 0
#define MAX_ELEMENT 1000
int first_matrix [0][0];
int main(void)
{
int f_height = 2;
int f_width = 2;
first_matrix [f_height][f_width];
#2 KIIV
Chápu správně, že doučit snadno se lze databáze, Javu.. tedy "Software"? Řeší se v praxi hodně, jakou specializaci (obor) daný člověk má? Např. kdybych měl vystudovaný "Hardware", jestli by nebyl problém s uplatněním v čistě softwarové firmě? Nebo je možné že to může být bráno jako výhoda, že bych znal i tu nižší uroven?
Ahoj,
studuji informatiku a nyní mám možnost zvolit si specializaci buď přímo na software či na harware. Obor "Software" v podstatě nabízí podrobnější výuku programovacího jazyku Java, databáze a nějaké prvky z umělé inteligence (např. v PC hrách). Obor "Hardware" je zase o programování v jazyku C/C++, programování mikrokontrolérů (procesor ARM, ...), pohled do elektroniky a architektury PC (automatizace).
Baví mě v podstatě věci z obou oborů, ale já si mohu vybrat jen jeden (nechci studovat dva obory zároveň, či si druhý obor časem dodělat). Rozhoduji se tedy podle budoucího uplatnění. Chtěl bych se Vás tedy zeptat, jaký obor je z hlediska finančního ohodnocení v praxi lepší? Programování jednočipů asi moc lidí neumí, takže by v tom mohla být určitá výhoda, ale na druhou stranu, když se podívám na webové stránky nabízející práci, tak s největším platem všude vede programátor Java. Budu rád, když se se mnou podělíte o zkušenosti. Děkuji Honza
Zdravím,
učím se MatLabem a narazil jsem na tyto dva příkazy:
ss = size(temp);
x = 1 : ss(1);
Dočetl jsem se, že size by mělo mít buď dva vstupní parametry, nebo dva výstupy (ne jeden vstup a výstup). Proč to tedy lze zapsat i takto? Co mi funkce zjistí? A u toho druhýho příkazu nechápu to ss(1)?
Děkuji předem za rady.
Tak ještě problém... Když program spustím s argumentem, tak podmínka proběhne a výpočet probíhá dál.. Pokud ale argument nezadám, tedy podmínka neproběhne, tak se program v té podmínce zacyklí
if ((strcmp(argc[1], "-control") || strcmp(argc[1], "--c")) && !(strlen(transfer_form) == 0))
printf("* Vysledek algoritmu = {%s} *\n", transfer_form);
Ahoj,
snažím se udělat podmínku, která by vypsala určitou větu, pokud by byl program spuštěn s argumentem -control nebo --c.
int main (int argv, char **argc)
{
fce(argc);
}
void fce (char **argc)
{
if ((argc[1] == "-control" || argc[1] == "--c") && !(strlen(transfer_form) == 0))
printf("* Vysledek algoritmu = {%s} *\n", transfer_form);
}
Při překladu mi to hází warning na řádek s podmínkou (comparison with literal results).. Nevíte kde je chyba? Lze to takto porovnávat?
Ahoj,
Nepochopitelně se mi přepisuje znak "B" na znak " ". Stane se tak, když kopíruji jeden řetězec do druhýho (který ale nemá vůbec nic společného s daným znakem... Nevíte, kde by mohla být chyba?
char *left_factorization (char *result, char *rules, int accord, char substitute)
{
int i;
int j;
int k;
int counter = 0;
int size = strlen(result);
bool empty_string = false;
char temp [size];
char *token;
char *next_token;
char working_rules [size];
result[0] = '\0';
temp[0] = '\0';
working_rules[0] = '\0';
printf("Sustituce {%c}\n", substitute); // vytiskne B - spravne
strcpy(working_rules, rules);
printf("Sustituce {%c}\n", substitute); // vytiskne znak mezery - chybne
Tak jsem to nakonec udělal takto:
int accord;
int last;
int length = strlen(buffer)+1;
int shift = 0;
bool computation;
char temp_buffer [length];
char help [length];
char used_rules [length];
help[0] = '\0';
used_rules[0] = '\0';
strcpy(temp_buffer, buffer);
for (token_b = strtok_r(temp_buffer, " ", &next_token_b); token_b; token_b = strtok_r(NULL, " ", &next_token_b))
{
char working_buffer [length];
strcpy(working_buffer, buffer);
for (token_c = strtok_r(working_buffer, " ", &next_token_c); token_c; token_c = strtok_r(NULL, " ", &next_token_c))
{
if (strstr(used_rules ,token_b)) computation = false;
else
{
accord = 0;
for (int i = 2; token_b[i] && token_c[i] && token_b[i] == token_c[i]; i++)
{
accord = i;
}
if (strlen(help) == 0)
{
strcpy(help, token_b);
strcat(help, " ");
}
if (accord >= 2 && !strstr(help, token_c))
{
strcat(help, token_c);
strcat(help, " ");
last = accord;
}
computation = true;
}
}
strcat(used_rules, help);
if (computation == true)
{
printf("Vysledek: {%s}{%i}{%c}\n", help, last, elements[shift]);
shift++;
}
help[0] = '\0';
}
Potřeboval jsem ještě aby mi to v jednom kroce vypsalo všechny shodné slova (takže třeba i tři - ne jen vždy dvě)..
#10 zlz
Ok :-) No kód jsem zkopíroval, takže by to mělo být stejné.
Buffer = {A:bxc A:yc A:bxzd A:yzd}
char temp_buffer [strlen(buffer)+1];
char working_buffer [strlen(buffer)+1];
strcpy(temp_buffer, buffer);
strcpy(working_buffer, buffer);
for (token_b = strtok_r(temp_buffer, " ", &next_token_b); token_b; token_b = strtok_r(NULL, " ", &next_token_b))
{
for (token_c = strtok_r(working_buffer, " ", &next_token_c); token_c; token_c = strtok_r(NULL, " ", &next_token_c))
{
if (!strcmp(token_b, token_c))
continue;
int shoda = 0;
for (int i = 2/*0*/; token_b[i] && token_c[i] && token_b[i] == token_c[i]; i++)
{
shoda = i;
}
if (shoda >= 2)
{
printf("{%s}{%s}{%d}\n", token_b, token_c, shoda + 1);
}
}
}
#8 zlz
Jojo děkuju. To testování všechno se vším bych mohl udělat tak, že bych ty shodný ukládal do pomocného pole a pak prorovnával obsah...
Akorát teď když testuju ten kód, tak vypisuje jen:
{A:bxc}{A:bxzd}{4}
{A:bxzd}{A:bxc}{4}
Něvíte, kde by mohla být chyba?
No myslel jsem jako procházení slovem po znacích tak dlouho, dokud jsou znaky stejné.
Pro vstup: {A:bxc A:yc A:bxzd A:yzd} by to tedy mělo vytisknout:
{A:bxc}{A:bxzd}{4}
{A:yc}{A:yzd}{3}
Momentálně to vypisuje toto:
S tím, že kód jsem upravil o ten for cyklus s podmínkou
int N;
char temp_buffer [strlen(buffer)+1];
char working_buffer [strlen(buffer)+1];
strcpy(temp_buffer, buffer);
strcpy(working_buffer, buffer);
for (token_b = strtok_r(temp_buffer, " ", &next_token_b); token_b; token_b = strtok_r(NULL, " ", &next_token_b))
{
N = strlen(token_b);
for (token_c = strtok_r(working_buffer, " ", &next_token_c); token_c; token_c = strtok_r(NULL, " ", &next_token_c))
{
int shoda = 0;
for (int i = 2/*0*/; i < N-1 && token_b[i] && token_c[i] && token_b[i] == token_c[i]; i++)
{
shoda = i;
}
if (shoda > 2)
{
printf("{%s}{%s}{%d}\n", token_b, token_c, shoda);
}
}
}
Ahoj,
prosím o pomoc - potřeboval bych vymyslet s jednou funkcí v jazyku C. Jedná se v podstatě o algoritmus představující substituci.
Mám buffer, který má například tyto prvky: {S:aS S:a}
Já potřebuji provést substituci na {S:aA A:S A:@} (S se přepíše na A, tudíž v dalším řádku je A = S, v dalším řádku se A nemá na co přepsat, tak se tam dá symbol @)
Příklady substitucí:
{A:bxc A:yc A:bxzd A:yzd} -> {A:bxB A:yC B:c B:zd C:c C:zd}
{A:aB A:aCB} -> {A:aX A:bBB X:B X:CB}
{X:a X:abCa C:c C:cBC} -> {X:aD D:@ D:bCa C:cF F:@ F:BC}
Co se týče písmenek, které mají nahradit původní, je na ně pouze požadavek, aby byla velká a nebyla stejná jako ty které už jsou použita.
Děkuji
#9 vitamin
Jazyk C a překladače... máme to jako takovou větší semestrálku, už na tom sedím skoro dva měsíce (z toho jsem nějaký funkce několikrát smazal a napsal znovu, protože jsem třeba zvolil špatný systém). V podstatě nikdy jsem neprogramoval, tak jsem si dal radši velkou rezervu a i tak mam co dělat, abych to stihnul včas...
To co se teď snažim udělat je levá faktorizace http://www.algoritmy.net/…rmace-na-LL1
Potřebuji vymyslet nějaký systém, který ty pravidla bude takto transformovat...
S tou funkcí či makrem je problém, že v dalším postupu mam asi 20x použitou podmínku isupper a musel bych to vše předělávat.. pokud by to takto nešlo, tak spíš použiji např X, Y, Z, .. a napíši, že to se ze vstupu zadávat nesmí... (což může být)
Ok, děkuji.
Jěště takový dotaz - potřebuji do pole uložit velké písmena, které jsou například s háčkem či čárkou. Chtěl bych třeba z ASCII tabulky použít http://sorry.vse.cz/…ii/index.htm
char znak = 143;
a to pak uložit do pole.. ale za prvý nevím jak to z "nepointeru" udělat a za druhé - myslíte, že tento znak, i když je velké písmeno, projde podmínkou isupper?
#5 zlz
Jojo, takhle to funguje, děkuji. Akorát znaky na třetí pozici mohou být všechny krom velkých písmen (např i lomítko třeba). Takže podmínku islower předělám na !isupper.
Ten for cyklus takhle zapsaný jakoby nahrazuje konstrukci s while? Jinak je pro mě novinkou, že mohu pracovat s indexem u klasického char*.. já si všude kopíroval data z charu* do pole char[], abych mohl procházet jednotlivé indexy pole..
Ahoj,
nevím si rady s postupem, jak napsat v jazyku C následující věc:
Mám vstupní pole, ve kterém jsou obsaženy nějaká slova, formát je následující
input = "S:aS S:a D:b E:TA"
Já potřebuji napsat funkci, které by našla slova, která nemají za znakem ":" velké písmeno a zároveň jsou tyto znaky obsaženy alespoň dvakrát ve slově (prostě z pole výše by to bylo S:aS a S:a). Všechny tyto slova by pak uložila do nějakého pole.
Já se v tom zamotal a nejsem schopnej vymyslet nic funkčního. Myslel jsem, že bych mohl použít counter, který, když by byl větší jak 1, tak by indikoval že je na vstupu více slov, které splňují podmínku výše...
void fce (char *input)
{
int size = strlen(input)+1;
char *token;
char *next_token;
char working_input [size];
char help [size];
buffer[0] = '\0';
strcpy(working_input, input);
token = strtok_r(working_input, " ", &next_token);
while (token != NULL)
{
strcpy(help, token);
if (isupper(help[2]) == 0)
{
char detect [strlen(help)];
detect[0] = help[0];
detect[1] = help[1];
detect[2] = help[2];
detect[3] = '\0';
int counter = 1;
int last_size = 0;
char *token_a;
char *next_token_a;
char current_input [size];
char temp [size];
char buffer [size];
strcpy(current_input, input);
token_a = strtok_r(current_input, " ", &next_token_a);
while (token_a != NULL)
{
strcpy(temp, token_a);
int i;
for (i = 0; temp[i] != '\0'; i++)
{
if (temp[i] == detect[0] && temp[i + 1] == detect[1] && temp[i + 2] == detect[2])
{
printf("Detekoval jsem slovo {%s}{%i}\n", temp, counter);
strcat(buffer, temp);
counter++;
}
}
token_a = strtok_r(NULL, " ", &next_token_a);
}
}
token = strtok_r(NULL, " ", &next_token);
}
}
Tak SUPER, použil jsem odkaz od Crazyho a už se to "točí"
Vysvětlil by mi tu ještě někdo, proč to tak vlastně funguje? V podstatě jsem jen přidal prázdnej char a už to funguje, nechápu moc to kouzlo, díky kterému strtok_r funguje a strtok ne?
Tak jsem to zkusil jen čistě s strtok_r a opět Error
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link
failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
make: *** [matice] Error 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char puvodniPole[50];
puvodniPole[0] = 'a';
puvodniPole[1] = 'b';
puvodniPole[2] = 'C';
puvodniPole[3] = '|';
puvodniPole[4] = 'v';
puvodniPole[5] = 'C';
puvodniPole[6] = 'd';
puvodniPole[7] = '|';
puvodniPole[8] = 'd';
puvodniPole[9] = 'f';
puvodniPole[10] = 'F';
puvodniPole[11] = '\0';
char poleA[10];
poleA[0] = 'd';
poleA[1] = 'd';
poleA[2] = '|';
poleA[3] = 'a';
poleA[4] = 'a';
poleA[5] = '|';
poleA[6] = 'd';
poleA[7] = '\0';
char *token;
char *dalsiToken;
token = strtok_r(puvodniPole, "|", &dalsiToken);
char detekce [strlen(token)+1];
while (token != NULL){
printf("Token: %s\n", token);
token = strtok_r(NULL, "|", &dalsiToken);
}
return 0;
}
Mám to udělaná make, ve kterým mam klasicky gcc abc.c -o abc
ale v cmd, mi to zobrazí jen cc ab.c -o abc ?není to chyba?
Jinak to gcc jsem stáhnul v rámci MinGW
To mě napadlo jako první, ale string.h tam právě že mám.
Takhle vypadá celý kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char puvodniPole[50];
puvodniPole[0] = 'a';
puvodniPole[1] = 'b';
puvodniPole[2] = 'C';
puvodniPole[3] = '|';
puvodniPole[4] = 'v';
puvodniPole[5] = 'C';
puvodniPole[6] = 'd';
puvodniPole[7] = '|';
puvodniPole[8] = 'd';
puvodniPole[9] = 'f';
puvodniPole[10] = 'F';
puvodniPole[11] = '\0';
char poleA[10];
poleA[0] = 'd';
poleA[1] = 'd';
poleA[2] = '|';
poleA[3] = 'a';
poleA[4] = 'a';
poleA[5] = '|';
poleA[6] = 'd';
poleA[7] = '\0';
char vstupniPole [strlen(puvodniPole)+1];
strcpy(vstupniPole, puvodniPole);
char *token;
char *dalsiToken;
token = strtok_r(vstupniPole, "|", &dalsiToken);
char detekce [strlen(token)+1];
while (token != NULL){
printf("Token: %s\n", token);
strcpy(detekce, token);
if (isupper(detekce[2]) != 0){
char dalsiPole [strlen(poleA)+1];
strcpy(dalsiPole, poleA);
printf("Proslo: %s\n", token);
char *token2;
//token2 = strtok(dalsiPole, "|"); // pokud toto zakomentuji, vse funguje jak ma
}
token = strtok_r(NULL, "|", &dalsiToken);
}
return 0;
}
Změnil jsem to na strtok_r a furt to vyhazuje error...
undefined_reference to strtok_r ... pak něco s bad reloc address 0x20 in section ".eh_frame"
final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
Error 1
#13 vitamin
Pokud použiju to co je v příkladu, tak mi to nejde ani přeložit (collect2.exe: error: ld returned 1 exit status undefined reference strtok_s)
int main(void){
char puvodniPole[50];
puvodniPole[0] = 'a';
puvodniPole[1] = 'b';
puvodniPole[2] = 'C';
puvodniPole[3] = '|';
puvodniPole[4] = 'v';
puvodniPole[5] = 'C';
puvodniPole[6] = 'd';
puvodniPole[7] = '|';
puvodniPole[8] = 'd';
puvodniPole[9] = 'f';
puvodniPole[10] = 'F';
puvodniPole[11] = '\0';
char poleA[10];
poleA[0] = 'd';
poleA[1] = 'd';
poleA[2] = '|';
poleA[3] = 'a';
poleA[4] = 'a';
poleA[5] = '|';
poleA[6] = 'd';
poleA[7] = '\0';
char vstupniPole [strlen(puvodniPole)+1];
strcpy(vstupniPole, puvodniPole);
char *token;
char *dalsiToken;
token = strtok_s(vstupniPole, "|", &dalsiToken);
char detekce [strlen(token)+1];
while (token != NULL){
printf("Token: %s\n", token);
strcpy(detekce, token);
if (isupper(detekce[2]) != 0){
char dalsiPole [strlen(poleA)+1];
strcpy(dalsiPole, poleA);
printf("Proslo: %s\n", token);
char *token2;
//token2 = strtok(dalsiPole, "|"); // pokud toto zakomentuji, vse funguje jak ma
}
token = strtok_s(NULL, "|", &dalsiToken);
}
return 0;
}
#11 zlz
No protože jsem ten kód moc nepochopil a popravdě moc nechápu ani teď. Použil jsem ten Váš poslední kód a funguje tak jak má.. ale nechápu toto:
char help [] = {number, 0};
Vytvořím pole o n prvků - tím zajistím, že tam bude i ukončovací 0 (to pole by si jí tam mělo automaticky přidat). Dále přidám nulu, kterou zase odečtu, abych se dostal na původní number? Chápu to správně?
tak jsem to vymyslel takto:
char *number = &matrix[x_coordinate][y_coordinate];
char help [strlen(number)+1];
strcpy(help, number);
help[1] = '\0';
int result = atoi(help);
return result;
Je mi jasné, že u řetězce musí být i ukončovací nula.. ale u matice mě nenapadá, jak to udělat. Pokud jí mám pevně definovanou třeba na 3x5, tak nevím, na jakou pozici bych ty ukončovací znaky připsal..
Ten kód výše jsem moc nepobral. Chápu, že bude vracet jen 0,1,2,3,4,5,6,7,8,9 ale mě se do toho i nakopírují i jiná čísla: třeba 126 FGf a15 af..
#3 zlz
Jojo, takto už to funguje, děkuji.
Ještě bych se zeptal na jednu věc ohledně převodu stringu na int - používám k tomu funkci atoi(). Zkusil jsem kód zapsat takto a u funkce atoi to vyhodilo chybu (chce to jako vstupní parametr pointer).
int x_coordinate = x_i + y_i;
int y_coordinate = x_j + y_j;
char number = matrix[x_coordinate][y_coordinate];
int n = atoi(number);
Tak jsem kód předělal tak, aby mi bez warningů šel přeložit
int x_coordinate = x_i + y_i;
int y_coordinate = x_j + y_j;
char *number = &matrix[x_coordinate][y_coordinate];
int n = atoi(number);
Ale teď mi ta proměnná number vypisuje chybný znaky...
Snažím se nacpat matici do void funkce, ale pokaždé mi to vyhodí warning:
"warning: expected 'char **' but argument is of type 'char (*)[5]'"
Dočetl jsem se, že je důležité uvést alespoň sloupce, tudíž v druhé hranaté závorce mít nějakou hodnotu... ale furt mi to nebere
//Prototyp
void funct (char **matrix[][5], int a, int b);
//Volání fce
funct(matrix, a, b);
//Vlastní fce
void funct (char **matrix[][5], int a, int b){}
Požívám správnou syntaxi, nebo se to zadává jinak?
Tak jsem kód rozjel, ale asi se tam někde ukládá navíc znak mezera.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void)
{
int c, priznak, i, j;
int radku = 0;
int znaku = 0;
int **pRadky;
FILE *fr = fopen("mnoziny.txt", "r"); //zjednodusene, neresi neuspech otevreni souboru
while((c = getc(fr)) != EOF)
{ //projdu soubor, zaznamenam delku radku a pocet radku
switch (c) {
case '\n': //<LF>
radku++;
priznak = 0;
case ' ': //mezera se ignoruje
break;
default: //jiny znak
if (radku == 0) znaku++; //pocita delku jen prvniho radku
priznak = 1;
break;
}
}
radku += priznak;
rewind(fr);
//alokace poli a naplneni poli
pRadky = (int **) malloc(radku * sizeof(int*));
for (i = 0; i < radku; i++) {
pRadky[i] = (int *) malloc(znaku*sizeof(int));
for (j = 0; j < znaku; j++) {
while ((c = getc(fr)) == ' ');
pRadky[i] [j] = c;
}
}
//zavrit soubor, vypis
fclose(fr);
int a;
int b;
printf("Matice:\n");
for(a = 0; a < radku ; a++)
{
for (b = 0; b < znaku; b++)
{
printf("%c\t", pRadky[a][b]);
}
//printf("\n");
}
return 0;
}
Tak jsem použil Váš úsek kódu a přidal ten return.. Warning žádnej, ale asi to špatně detekuje konec řádky - jede to jen do třetího znaku a pak se to odentruje...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char c;
int pocetMnozin= 0;
int PocetMnozin(FILE * fr)
{
int priznak = 0;
while((c = getc(fr)) != EOF)
{
if(c == '\n')
{
pocetMnozin++;
priznak = 0;
}
else
{
priznak = 1;
}
}
return (pocetMnozin + priznak);
}
int main (void)
{
FILE *fr;
if((fr = fopen("mnoziny.txt","r")) == NULL)
{ //test otevreni
printf("Soubor se nepodarilo otevrit.\n");
system("pause");
return 1;
}
int i=0;
PocetMnozin(fr);
printf("pocet mnozin (radku) %d\n",pocetMnozin);
int *velikostiMnozin; //jednorozmerne pole
velikostiMnozin= (int*) calloc( pocetMnozin , sizeof(int));
//printf("dadadad\n");
rewind(fr);
while((c = getc(fr)) != EOF)
{
if (c == '\n')
{
velikostiMnozin[i]++;
i++;
}
else
{
if(c == ' ' )
{
velikostiMnozin[i]++;
}
}
}
char **mnozinyPole; //matice pro mnoziny
mnozinyPole = (char **)calloc( pocetMnozin , sizeof(int *)); //zde si alokuju kolik ma mit matice radku
int j = 0;
rewind(fr);
for(i= 0; i< pocetMnozin ; i++)
{
mnozinyPole[i] = (char *)calloc( velikostiMnozin[i] , sizeof(int)); //tady alokuju sloupecky kazdeho radku
for(j=0; j<velikostiMnozin[i]; j++)
{
fscanf(fr, "%c", &mnozinyPole[i][j]); //tady matici plním
}
}
printf("\n\n\n\n");
for(i = 0; i < pocetMnozin ; i++)
{ //vypis finalni matice
for (j = 0; j < velikostiMnozin[i]; j++)
printf("%c ", mnozinyPole[i][j]);
printf("\n");
}
if (fclose(fr) == EOF)
{ /* test zavření souboru*/
printf("Soubor se neporadilo zavrit\n");
return 1;
}
system("PAUSE");
return 0;
}
Tak sem upravil kód tak, aby mi bral obecně znaky a ne jen čísla a pro vstup
M + ( ) d *
S 1 1 - - 2
A 5 3 5 - -
B 4 - - - 4
se mi vypsalo jen toto:
Špatně to detekuje i konce řádků a vypíše jich 6... nechápu (jen jsem změnil int na char)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char c;
int pocetMnozin= 0;
int PocetMnozin(FILE * fr)
{
while((c = getc(fr)) != EOF)
{
if(c == '\n'){pocetMnozin=pocetMnozin+2;}
}
return pocetMnozin;
}
int main (void)
{
FILE *fr;
if((fr = fopen("mnoziny.txt","r")) == NULL)
{ //test otevreni
printf("Soubor se nepodarilo otevrit.\n");
system("pause");
return 1;
}
int i=0;
PocetMnozin(fr);
printf("pocet mnozin (radku) %d\n",pocetMnozin);
int *velikostiMnozin; //jednorozmerne pole
velikostiMnozin= (int*) calloc( pocetMnozin , sizeof(int));
rewind(fr);
while((c = getc(fr)) != EOF)
{
if (c == '\n')
{
velikostiMnozin[i]++;
i++;
}
else
{
if(c == ' ' )
{
velikostiMnozin[i]++;
}
}
}
char **mnozinyPole; //matice pro mnoziny
mnozinyPole = (char **)calloc( pocetMnozin , sizeof(int *)); //zde si alokuju kolik ma mit matice radku
int j = 0;
rewind(fr);
for(i= 0; i< pocetMnozin ; i++)
{
mnozinyPole[i] = (char *)calloc( velikostiMnozin[i] , sizeof(int)); //tady alokuju sloupecky kazdeho radku
for(j=0; j<velikostiMnozin[i]; j++)
{
fscanf(fr, "%c", &mnozinyPole[i][j]); //tady matici plním
}
}
printf("\n\n\n\n");
for(i = 0; i < pocetMnozin ; i++)
{ //vypis finalni matice
for (j = 0; j < velikostiMnozin[i]; j++)
printf("%c ", mnozinyPole[i][j]);
printf("\n");
}
if (fclose(fr) == EOF)
{ /* test zavření souboru*/
printf("Soubor se neporadilo zavrit\n");
return 1;
}
system("PAUSE");
return 0;
}
S tím jedním while cyklem máte pravdu, takhle to funguje taky a nemusím to komplikovaně projíždět dvakrát.. Každopádě ten chybějící řádek nebyl problém ve funkci main, ale v tý PocetMnozin - už tato funkce mi to vypíše chybně:
Přitom vstup je:
1 2 3 4
5 6 7 8
9 10 11 12
Protože podmínka u funkce PocetMnozin má být:
if(c == '\n'){pocetMnozin=pocetMnozin+2;}
Pak už to funguje jak má. Ale je pravda, že to zase může způsobit přičtení řádku navíc (nebo ne?)...
Jinak ano, překladači se ta funkce moc nelíbí.. návratovou hodnotu přidám
Aha.. přidal jsem do toho posledního while podmínku
if (c == EOF){break;}
a už se to necyklí.. akorát to teda načte o jeden řádek míň.. ale na to snad už přijdu :-)
Ahoj,
mám soubor "temp.txt", kam ukládám matici v následujícím formátu:
M + ( ) d *
S 1 1 - - 2
A 5 3 5 - -
B 4 - - - 4
Jedná se tedy o matici různých znaků (ne jen intů). Já bych tuto matici chtěl načíst do dvourozměrného pole.
Našel jsem si tady na fóru, že už se to řešilo, použil jsem tedy kód, který tu byl k dispozici - ovšem nefunguje a já se už tři hodiny snažím najít chybu... pokud byste mi pomohli, byl bych rád :-)
Zjistil jsem, že chyba (zacyklení) je způsobena druhým while cyklem v tomto úseku kódu:
while((c = getc(fr)) != EOF) /* přečtení souboru */
{
printf("1. while\n");
while((c =getc(fr)) != '\n')
{
printf("2. while\n");
if(c == ' ' ) //mezer je vzdy o 1 min nez cisel , nekde pridat +1
{
velikostiMnozin[i]++;
}
}
velikostiMnozin[i]++; // zde pridavam tu +1
i++;
}
Chápu, že v prvním while cyklu se jede až na konec souboru, v druhém pak na konec řádky - tím se dostanou řádky i sloupce z matice.. ale nechápu, proč se to cyklí.. (2. while se vypisuje do nekonečna)
Zde je celý kód:
#include <stdio.h>
#include <stdlib.h>
char c;
int pocetMnozin= 0;
int PocetMnozin(FILE * fr)
{ // kvuli poctu mnozin(radku) matice
while((c = getc(fr)) != EOF)
{
if(c == '\n'){pocetMnozin++;}
}
}
int main (void)
{
FILE *fr;
if((fr = fopen("mnoziny.txt","r")) == NULL)
{ //test otevreni
printf("Soubor se nepodarilo otevrit.\n");
system("pause");
return 1;
}
int i=0;
PocetMnozin(fr);
printf("pocet mnozin (radku) %d\n",pocetMnozin);
int *velikostiMnozin; //jednorozmerne pole
velikostiMnozin= (int*) calloc( pocetMnozin , sizeof(int));
printf("dadadad");
rewind(fr);
while((c = getc(fr)) != EOF) /* přečtení souboru */
{
printf("1. while\n");
while((c =getc(fr)) != '\n')
{
printf("2. while\n");
if(c == ' ' ) //mezer je vzdy o 1 min nez cisel , nekde pridat +1
{
velikostiMnozin[i]++;
}
}
velikostiMnozin[i]++; // zde pridavam tu +1
i++;
}
printf("faafaffa");
int **mnozinyPole; //matice pro mnoziny
mnozinyPole = (int **)calloc( pocetMnozin , sizeof(int *)); //zde si alokuju kolik ma mit matice radku
int j = 0;
rewind(fr);
for(i= 0; i< pocetMnozin ; i++)
{
mnozinyPole[i] = (int *)calloc( velikostiMnozin[i] , sizeof(int)); //tady alokuju sloupecky kazdeho radku
for(j=0; j<velikostiMnozin[i]; j++)
{
fscanf(fr, "%d", &mnozinyPole[i][j]); //tady matici plním
}
}
printf("\n\n\n\n");
for(i = 0; i < pocetMnozin ; i++)
{ //vypis finalni matice
for (j = 0; j < velikostiMnozin[i]; j++)
printf("%i ", mnozinyPole[i][j]);
printf("\n");
}
if (fclose(fr) == EOF)
{ /* test zavření souboru*/
printf("Soubor se neporadilo zavrit\n");
return 1;
}
system("PAUSE");
return 0;
}
Chápu, že první while jede dokud nenarazí na konec souboru. Ten druhý dokud nenarazí na konec řádky. A právě v tom druhém while se to zacyklí.. neni problém operačního systému? Jestli se to třeba pod Win nechová jinak, než pod Linuxem (myslim, že to řádkování je trochu odlišné)
Potřebuji také, aby se mi vastupní data ze souboru načetla do matice. Vypůjčil jsem si proto zdrojoý kód výše, ale nefunguje - dojde k zacyklení. Přišel jsem na to, že je problém v tomoto úseku kódu:
rewind(fr);
while((c = getc(fr)) != EOF){ /* přečtení souboru */
while((c =getc(fr)) != '\n'){
if(c == ' ' ){ //mezer je vzdy o 1 min nez cisel , nekde pridat +1
velikostiMnozin[i]++;
}
}
velikostiMnozin[i]++; // zde pridavam tu +1
i++;
}
ale nevidim, proč to nefunguje. Nevěděli byste?
#11 vitamin
OK, koukám na ten strtok_s, ale moc ho nechápu ... má tři parametry, první je řetězec, ze kterého chci dostat ty tokeny, druhý parametr je oddělovací znak a třetí by mělo být k uložení pozice.. ten třetí moc nechápu.. jak by to vypadalo, kdybych tuhle funkci použil na muj kod?
Upravil jsem zdrojový kód tak, aby bylo přehlednější, jaký mám problém. Po spuštění programu by mi měl vypsat
Token abC
Proslo abC
Token vCd
Token dfF
Proslo dfF
Ovšem vypíše mi pouze
Token abC
Proslo abC
Co se týče strtok_s, tak to by stačilo pouze nahradit za současný strtok, či jak?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char puvodniPole[50];
puvodniPole[0] = 'a';
puvodniPole[1] = 'b';
puvodniPole[2] = 'C';
puvodniPole[3] = '|';
puvodniPole[4] = 'v';
puvodniPole[5] = 'C';
puvodniPole[6] = 'd';
puvodniPole[7] = '|';
puvodniPole[8] = 'd';
puvodniPole[9] = 'f';
puvodniPole[10] = 'F';
puvodniPole[11] = '\0';
char poleA[10];
poleA[0] = 'd';
poleA[1] = 'd';
poleA[2] = '|';
poleA[3] = 'a';
poleA[4] = 'a';
poleA[5] = '|';
poleA[6] = 'd';
poleA[7] = '\0';
char vstupniPole [strlen(puvodniPole)+1];
strcpy(vstupniPole, puvodniPole);
char *token;
token = strtok(vstupniPole, "|");
char detekce [strlen(token)+1];
while (token != NULL){
printf("Token: %s\n", token);
strcpy(detekce, token);
if (isupper(detekce[2]) != 0){
char dalsiPole [strlen(poleA)+1];
strcpy(dalsiPole, poleA);
printf("Proslo: %s\n", token);
char *token2;
token2 = strtok(dalsiPole, "|"); // pokud toto zakomentuji, vse funguje jak ma
}
token = strtok(NULL, "|");
}
return 0;
}
Při výpisu je vidět, že while cyklus proběhne tak jak má JEN když neskočí do podmínky.. ta podmínka ho jakoby breakne...
puvodniPole je vstupni parametr a pamět už má alokovanou (funkce je delší, vytáhl jsem jen ten usek, který nefunguje). Předpokládejme, že poleA je už naplněné.. takhle jak to mám napsané, by se mi druhý token samozřejmě nevypsal, protože poleA nic neobsahuje...
Ahoj, používám funkci strtok ve while cyklu pro oddělování jednotlivýcj tokenů. Vím, že funkce strtok "vycucává" z původního řetězce její obsah - proto všechny pole překopíruju do jiných (viz kód). Problém mám ale s tím, že "Token" se vypíše pouze jednou... pokud ale zakomentuju určitý řádek v kódu (viz kód), vše proběhne jak má... netušíte, kde je chyba?
char poleA [F_LENGTH];
char vstupniPole [strlen(input)+1];
strcpy(vstupniPole, puvodniPole);
char *token;
token = strtok(vstupniPole, "|");
char detekce [strlen(token)+1];
while (token != NULL){
printf("Token: %s\n", token);
strcpy(detekce, token);
if (isupper(detekce[2]) != 0){
char dalsiPole [strlen(poleA)+1];
strcpy(dalsiPole, poleA);
char *token2;
token2 = strtok(dalsiPole, "|"); // pokud toto zakomentuji, vse funguje jak ma
}
token = strtok(NULL, "|");
}