Anonymní profil Sprinter – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Sprinter – Programujte.comAnonymní profil Sprinter – Programujte.com

 

Příspěvky odeslané z IP adresy 147.228.209.–

Anonym
C / C++ › Moduly s koncovkou *.xc
8. 3. 2014   #187997
Anonym
C / C++ › Moduly s koncovkou *.xc
8. 3. 2014   #187992
Anonym
Assembler › Hláška typu - Impossible con…
21. 2. 2014   #187572

#6 z
Přiznám se, že moc nerozumím, k čemu přesně mi to poslouží. Jsou tam konstrukce jen pro ARMv6 (nejvyšší). Nebo to je jedno?

Anonym
Assembler › Hláška typu - Impossible con…
20. 2. 2014   #187552

#4 z
Pro ARM11.

Anonym
C / C++ › Problém s kompilací - collect2
20. 2. 2014   #187545

#2 KIIV
Děkuji, už to funguje :-)

Anonym
Assembler › Hláška typu - Impossible con…
20. 2. 2014   #187543

#2 z
Děkuju za pomoc, ale při překladu mi to teď bohužel skočí do #error a vypíše:

root@expbone:~/Desktop# gcc soubor.c 
soubor.c:35:2: error: #error "tak tady ti rdtsc nerozchodim"

Nešlo by to ještě nějak "opravit"?

Anonym
Assembler › Hláška typu - Impossible con…
20. 2. 2014   #187537

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

Anonym
C / C++ › Problém s kompilací - collect2
20. 2. 2014   #187536

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

Anonym
OS - GNU / Linux › Detekce RTOS (realtime Linux)
3. 2. 2014   #187031

#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...

Anonym
OS - GNU / Linux › Detekce RTOS (realtime Linux)
2. 2. 2014   #186972


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.

Anonym
PHP › Základy v PHP
13. 1. 2014   #186340

#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

Anonym
PHP › Základy v PHP
13. 1. 2014   #186336

#13 Kit
To self je tam uvedeno v nápovědě, takže ho tam máme využít..

Anonym
PHP › Základy v PHP
13. 1. 2014   #186334

#11 Kit
Bohužel to přeskočit nejde :-( Musím splnit určité ulohy, aby se mi odemkla další skupina uloh (mamo na to takovy portal).

Nešlo by spíš jen nějak obecně poradit jak to řešit?

Anonym
PHP › Základy v PHP
13. 1. 2014   #186332

#9 Anonym
Mohl bych se ještě zeptat na jednu ulohu? Tady nevím jak začít, protože nechápu co se po mě vlastně chce, tak jestli by to šlo říct trošku víc selsky.. :-)

Vytvořte v PHP objekt, který bude volat sám sebe.

Anonym
PHP › Základy v PHP
13. 1. 2014   #186331

#8 Kit
Ok, děkuju za pomoc

Anonym
PHP › Základy v PHP
13. 1. 2014   #186328

#6 Kit
 

<?
class trida
{
	var $atribut;
	function __construct ($atribut)
	{
		$this->atribut = $atribut;
	}
	function metoda ()
	{
		echo $this->atribut;
	}
}
$pokus = new Trida('ahoj');
$pokus->metoda();
?>

No řekl bych, že takhle...
 

Anonym
PHP › Základy v PHP
13. 1. 2014   #186326

#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?

Anonym
PHP › Základy v PHP
13. 1. 2014   #186324

#2 Kit
Chápu správně, že řešení ulohy by mohlo vypadat takto?

<?
class trida
{
	var $atribut;
	function trida ($atribut)
	{
		$this->atribut=$atribut;
	}
	function metoda ()
	{
		echo "ahoj"
	}
}
$pokus = new trida;
$pokus->metoda();
?>
Anonym
JavaScript, AJAX, jQuery › Odkázání se na nějaké ID (Ja…
13. 1. 2014   #186322

Ahoj

Nevíte, jak se pomocí JavaScriptu mohu odkázat na nějaké ID (stačí obecně)?

Anonym
PHP › Základy v PHP
13. 1. 2014   #186321

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.

Anonym
C / C++ › Záludný příklad na fork()
6. 1. 2014   #186018

#2 hlucheucho
A co to pro mě znamená? Já chápu fork() jako funkci pro rozdělení dílčího procesu na dva (vytvoření 2 potomků).

Anonym
C / C++ › Záludný příklad na fork()
5. 1. 2014   #186005

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);
	}
}
Phobos
OS - GNU / Linux › Sloučení dvou oddílů (Debian)
19. 11. 2013   #184130

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?

Připojen obrázek.

Sprinter
Funkcionální programování › Dotazování - PROLOG
17. 11. 2013   #184041

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?

Sprinter
Funkcionální programování › Základy v PROLOGu
17. 11. 2013   #184037

#1 Sprinter
Tak problém vyřešen. Soubor, který jsem vytvořil neměl příponu *.pro :-)

Sprinter
Funkcionální programování › Základy v PROLOGu
17. 11. 2013   #184020

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č...

Snitter
Photoshop › Vytvoření obrázku podle hist…
20. 6. 2013   #178259

#2 JoDiK
Jo to vypadá dobře. Mohl bys mi celý ten obrázek někam upnout prosím? Zkusil bych ho otestovat v tom mém programu. Děkuji

Snitter
3D Studio MAX › Průměrování jasů
20. 6. 2013   #178253

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... )?

Snitter
Photoshop › Vytvoření obrázku podle hist…
19. 6. 2013   #178230

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

Holden
.NET › Návrh algoritmu pro kvantování
18. 6. 2013   #178149

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;
                }
        }
}
Holden
C / C++ › Binární operace
28. 5. 2013   #176906

#2 vitamin
Jooo takhle to funguje :-) Děkuju

Holden
C / C++ › Binární operace
28. 5. 2013   #176901

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.

Hover
C / C++ › Předefinování matice
7. 5. 2013   #175928

#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]);
}
Hover
C / C++ › Předefinování matice
7. 5. 2013   #175926

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];
KervilH
Vzdělání › HW programátor vs SW program…
8. 3. 2013   #172459

#6 KIIV
Mohl bych se zeptat, proč se vyhýbáš Javě? Přijde mi, že jí cpou studentům na jakýkoliv informatický univerzitě..

KervilH
Vzdělání › HW programátor vs SW program…
7. 3. 2013   #172447

#4 KIIV
Ok. Ještě dotaz - když mám na výběr zvolit si programovací jazyk, který je v dnešní době nejlepší umět?

KervilH
Vzdělání › HW programátor vs SW program…
7. 3. 2013   #172439

#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?

KervilH
Vzdělání › HW programátor vs SW program…
7. 3. 2013   #172434

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

Volumer
Matematika › Syntaxe MatLabu
23. 1. 2013   #170572

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.

Sprinter
C / C++ › Porovnávání argumentu ze vst…
21. 1. 2013   #170481

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);
Sprinter
C / C++ › Porovnávání argumentu ze vst…
21. 1. 2013   #170480

#2 vitamin
Jasně, děkuju. Už funguje.

Sprinter
C / C++ › Porovnávání argumentu ze vst…
21. 1. 2013   #170476

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?

Sprinter
C / C++ › Přepisování znaku
21. 1. 2013   #170452

#5 hlucheucho
Pravda, bylo to tím. Neuvědomil jsem si že musim přidávat 1. Děkuju

Sprinter
C / C++ › Přepisování znaku
21. 1. 2013   #170423

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
Sprinter
C / C++ › Algoritmus pro substituci
21. 1. 2013   #170420

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ě)..

Sprinter
C / C++ › Algoritmus pro substituci
20. 1. 2013   #170418

#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);
			}
		}	
	}
Sprinter
C / C++ › Algoritmus pro substituci
20. 1. 2013   #170415

#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?

Sprinter
C / C++ › Algoritmus pro substituci
20. 1. 2013   #170400

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);
		}
	}	
}
Sprinter
C / C++ › Algoritmus pro substituci
20. 1. 2013   #170396

#4 Sprinter
Jo jasný, délka slova :-)

Sprinter
C / C++ › Algoritmus pro substituci
20. 1. 2013   #170395

#3 zlz
A k čemu je tam to N? Nepochopil jsem jakou hodnotu mám za něj dosadit..

Sprinter
C / C++ › Algoritmus pro substituci
17. 1. 2013   #170292

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

Sprinter
C / C++ › Pomoc s návrhem algoritmu
16. 1. 2013   #170236

#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)

Sprinter
C / C++ › Pomoc s návrhem algoritmu
16. 1. 2013   #170233

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?

Sprinter
C / C++ › Pomoc s návrhem algoritmu
16. 1. 2013   #170228

#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.. 

Sprinter
C / C++ › Pomoc s návrhem algoritmu
15. 1. 2013   #170224

#2 vitamin
O něčem takovém jsem uvažoval, ale problém je, že jedna ze zásad pro tento projekt je nepoužívat struktury (máme zadávány ulohy postupně a v každé můžeme použít další datový typ či nějakou funkci)...

Sprinter
C / C++ › Pomoc s návrhem algoritmu
15. 1. 2013   #170220

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);
	}
}
MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
10. 1. 2013   #170068

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?

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
10. 1. 2013   #170064

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;
}
MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
10. 1. 2013   #170062

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

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
10. 1. 2013   #170060

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;
}
MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
10. 1. 2013   #170058

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

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
10. 1. 2013   #170055

#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;
}
Sprinter
C / C++ › Matice jako vstupní parametr…
9. 1. 2013   #170036

#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ě?

Sprinter
C / C++ › Matice jako vstupní parametr…
9. 1. 2013   #170028

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;
Sprinter
C / C++ › Matice jako vstupní parametr…
9. 1. 2013   #170022

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..

Sprinter
C / C++ › Matice jako vstupní parametr…
8. 1. 2013   #169991

#5 KIIV
No vlastně jo.. první znak je ok, ten zbytek už ne..

Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169988

#26 hlucheucho
Funguje, děkuju

Sprinter
C / C++ › Matice jako vstupní parametr…
8. 1. 2013   #169987

#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...

Sprinter
C / C++ › Matice jako vstupní parametr…
8. 1. 2013   #169960

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?

Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169950

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;
}
Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169949

#22 hlucheucho
Děkuji. Akorát jsem začátečník a asi jsem uplně nepochopil ten tápis funkce _tmain _TCHAR* to je nějaká struktura?

Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169947

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;
}
Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169944

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;
}
Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169943

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

Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169936

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 :-)

Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169932

#4 cibule
no v tom while odentrování mám - pojede dokud nenarazí na konec řádky, nebo jak jste to myslel?

Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169931

#3 hlucheucho
No Windows by to tak mělo být - CRLF = "\n".. ale jak se zdá, tak to moc nefunguje.. Když dám kontrolní výpis znaků, tak se mi vše načte, ale pak už to jede s prázdnýma znakama do nekonečna...

Sprinter
C / C++ › Načtení znaků ze souboru do…
8. 1. 2013   #169930

#2 zlz
Bodům 1-3 rozumím, ale moc jsem nepobral tu poslední větu - jak nemám přeskakovat první znak? A že tam mám hodit int, tím je myšleno jako změnit char c na int c?

Sprinter
C / C++ › Načtení znaků ze souboru do…
7. 1. 2013   #169918

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;
}
Sprinter
C / C++ › načtení matice ze souboru
7. 1. 2013   #169917

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é)

Sprinter
C / C++ › načtení matice ze souboru
7. 1. 2013   #169911

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?

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
7. 1. 2013   #169908

#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?

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
7. 1. 2013   #169902

#9 vitamin
OK. A takhle zapsaný to teda nemůže být? Nemůžu prostě použít víckrát strtok, i když se jedná o dvě jiná pole?

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
7. 1. 2013   #169899

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;
}
MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
7. 1. 2013   #169893

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...

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
7. 1. 2013   #169892

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...

MucoVerde
C / C++ › Nefunkční cyklus s funkcí st…
7. 1. 2013   #169886

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, "|");
}

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý