Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 03. 12. 2011 00:19

Palice
Zelenáč
Příspěvky: 9
Reputace:   
 

Definice datového typu - jazyk C

Ahojte, pokouším se definovat datový typ pro zápis komplexních čísel a poté jich 5 potřebuju vložit do pole. Měl by uchovávat 2 hodnoty float - pro reálnou a imaginární jednotku. Nevím proč, ale pořád mi to nějak nefunguje, napsané to mám takhle:

#include <stdio.h>
main() {
  typedef struct{
      float rj;
      float ij;
    } complex;

  complex n1, n2, n3, n4, n5;

    n1.rj = 1;  n1.ij = 1;
    n2.rj = 1;  n2.ij = 2;
        n3.rj = 1;  n3.ij = 3;
    n4.rj = 2;  n4.ij = 1;
    n5.rj = 2;  n5.ij = 1;

  complex numbers[] = {n1, n2, n3, n4, n5};     /* pole komplexních čísel */

return 0;
}
Debugger:
error C2275: 'complex' : illegal use of this type as an expression
error C2146: syntax error : missing ';' before identifier 'numbers'
error C2065: 'numbers' : undeclared identifier
error C2109: subscript requires array or pointer type

Moc díky za každou radu, jestli někdo vidíte, co je špatně.

Offline

 

#2 03. 12. 2011 01:36

cStP
Příspěvky: 39
Reputace:   
Web
 

Re: Definice datového typu - jazyk C

Mě to popravdě přeložit i spustit jde...  Co používáš za překladač  a jaký standard ? ( já používám gcc; zkus to přeložit s přepínačem -std=c99).

A bokem trochu teorie...před funkcí main() bys měl mít napsáno "int", protože pak na konci vracíš integer - "return 0". A taky, když nic nepřijímáš žádné parametry, tak bys měl mít v závorkách "void". Takže: int main(void) ;-)

Offline

 

#3 03. 12. 2011 10:10

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Definice datového typu - jazyk C

Navíc ten typedef se dává na globál - tedy buď do hlavičkáče, nebo (u takto krátkého kódu) alespoň před main()

S tím intem má kolega pravdu, implicitní int by Céčkové překladače neměly podporovat a měly by řvát - pokud neřvou, tak je něco špatně. Ten jako seznam argumentů už být tak nemusí, někdo ho tam píše, někdo ne (já ne, já líný, a napřípadá mi to důležité - hodí se to (IMHO) pokud píšeš funkce s proměnlivým seznamem argumentů (přes výpustku (...), nebo s implicitními hodnotami ( int cSomeFunct(int arg1 = 5, int arg2 = 45, double arg3 = 0.33) ) - pak tím voidem říkáš, že argumenty nejsou, když ho tam nedáš, tak říkáš, že je odmítáš předat)..

No, zda void ano či ne je na delší diskusi a polemiku, ale že main musí být deklarovaná jako int rozhodně ano, a to je syntaktická chyba jak hrom :) (fakt se divím, proč překladač neřve)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#4 03. 12. 2011 15:09

Palice
Zelenáč
Příspěvky: 9
Reputace:   
 

Re: Definice datového typu - jazyk C

Díky za rychlé odpovědi. To mě mohlo napadnout, že zapomenu něco TAK zásadního jako je int před main. Když to teď pustím bez dosazení těch complex čísel do pole, tak to jde. Ale pokud přidám ten řádek s polem tak 5-krát vyjede:
error C2440: 'initializing' : cannot convert from 'complex' to 'float'.
Vůbec nevím, v čem je problém :( a bohužel nevím ani co je překladač a standard, natož které používám, jsem začátečník:). Píšu ve Visual studiu do obyčejného file.c

#include <stdio.h>

  typedef struct {
         float rj;
         float ij;
  } complex;

int main()
{
   complex n1, n2, n3, n4, n5;
   complex numbers[] = {n1, n2, n3, n4, n5};   /* pole komplexních čísel */
   return 0;
}

Vděčná za každou radu:)

Offline

 

#5 03. 12. 2011 15:42

jindra
Příspěvky: 78
Reputace:   
 

Re: Definice datového typu - jazyk C

Zkoušel jsem ten kod a mě funguje dobře.

Překladač je něco co z tvého kódu udělá program. Přeloží ho do řeči, které rozumí počítač a ví co má dělat.
Standard je něco jako verze jazyka. Tzn.že v některé verzi Cčka něco funguje a v jiné se to samé dělá trochu jinak.

Například já jsem zkoušel ten tvůj kod na operačním systému ubuntu v programu Netbeans a překládal jsem to v překladači GCC. (standard z hlavy nevím, mám to ve virtuálním počítači)

Offline

 

#6 03. 12. 2011 15:52 — Editoval cStP (03. 12. 2011 15:57)

cStP
Příspěvky: 39
Reputace:   
Web
 

Re: Definice datového typu - jazyk C

↑ frank_horrigan: máš pravdu, to že je typedef ve funkci main() jsem úplně přehlídl, asi musím chodit dřív spát :))

ve Visual Studio jsem nikdy nedělal, ale mě to funguje - zvláštní... zkus samostatně deklarovat pole a pak do něho něco hodit (ačkoliv rozdíl oproti tvojemu řešení prakticky žádný není).

int main()
{
   complex n1, n2, n3, n4, n5;
   complex numbers[4];
   numbers[0] = n1;
   return 0;
}

Popravdě nevím, proč to vypisuje takovouhle chybu - snad někdo jiný bude vědět co s tím ?

btw. to děláš ve škole nebo se o to zajímáš jen tak ? Volba Visual Studio je tvoje (prostě sis ho vybrala) nebo ti někdo řekl, že v tom máš dělat ? (Ne že bych proti němu něco měl... :D)

EDIT: no musím zrychlit psaní svých příspěvků :)) když to funguje aj jindrovi, tak bych to viděl buď na úpravu tvého nastavení nebo na změnu programu a překladače. Třeba právě NetBeans a GCC a netrápil bych se s tím VisualStudiem. Chyba bude nejspíš v (ne)nastavení tvého překladače - prostě se mu něco nelíbí :))

Offline

 

#7 03. 12. 2011 15:56 — Editoval frank_horrigan (03. 12. 2011 16:01)

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Definice datového typu - jazyk C

Já to zkoušel hodit taky do svého visual studia, hází to warny, C4700 (unitialized local variable nX used), ale přes ty warny se samozřejmě dá přejít...

no, když zkusíš ty proměnný inicializovat, podobně jako jsi to měla nahoře, tak to přeložit jde, a bez warnů.. (--> i spustit)

Zkus v každém případě jiný kompilátor (překladač)

V čem to píšeš? verze toho VS?

EDIT: přijde mi, že máš nějakou hodně starou verzi toho VS, a nebo opravdu blbě nastavený překladač.. Už jenom ten implicitní int mi nejde do hlavy...

jsem to pro zajímavost zkusil, tady je výsledek... řve:

1>c:\users\ivanp\documents\visual studio 2010\projects\test1\test1\test1.cpp(9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#8 03. 12. 2011 19:27

Palice
Zelenáč
Příspěvky: 9
Reputace:   
 

Re: Definice datového typu - jazyk C

Takže, záhada se záhadně vyřešila, když jsem deklaraci pole přesunula nad(doslova) definice čísel (n1, ..., n5), přitom deklarace pole může být jak ve funkci main tak i před main. Taky jsem rozdělila deklaraci a inicializaci pole, takže takto to funguje: (ať se mě nikdo neptá proč^^)

typedef struct {
      float rj;
      float ij;
} complex;

int main()
{    complex numbers[5];
    complex n1, n2, n3, n4, n5;
    n1.rj = 1;        n1.ij = 1;
    n2.rj = 1;        n2.ij = 2;
    n3.rj = 1;        n3.ij = 3;
    n4.rj = 2;        n4.ij = 1;
    n5.rj = 2;        n5.ij = 1;
    numbers[0] = n1;
    numbers[1] = n2;
    numbers[2] = n3;
    numbers[3] = n4;
    numbers[4] = n5;

return 0;
}

@cStP: je to samozřejmě do školy:), VS vybral učitel, nic jiného ani nedoporučil. Vzhledem k tomu, že už mi chybí jen poslední úkol, tak o změně neuvažuju a můžu tě ujistit, že pokud dostanu zápočet tak velmi pravděpodobně přijde VS okamžitě odinstalovat :D
@frank_horrigan (Einstein) : tak nějak nevím, jak zkusit jiný kompilátor, pro VS je jen jeden nebo ne? aj aj, fakt nic nevím:).
Píšu ve VS C++ 2010 Express, stažen v říjnu. Ta zastaralost asi bude v tom, že píšeme do obyčejnýho .c souboru ne .cpp (tak jako jsi to psal ty). Třeba další věc, co se mu nelíbí je scanf nebo system("pause") (každopádně aspoň fungují).

Jinak díky za rychlou pomoc! Jdu pokračovat:)

Offline

 

#9 03. 12. 2011 21:59 — Editoval frank_horrigan (05. 12. 2011 16:12)

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Definice datového typu - jazyk C

↑ Palice:

zkusit jiný kompilátor znamená si jiný opatřit, a příslušně nastavi VS, aby použivalo jej (a nebo přes příkazáč, jak se to běžně dělá - jinými slovy: vyvíjet můžeš v čemkoli, co má třeba i podpůrné nástroje a různé "vychytávky", a překládat a linkovat můžeš v něčem úplně jiném :)

ale VS10 mám taky, mám teda verzi Ultimate (zakoupenou, nekradu software, vím, kolik je na tom práce, potu a krve vyvinout pořádný pěkný program, živím se tím), a přes standardní kompilátor tohle normálně prošlo...

"zastaralost" - myslím, že by to nemělo vadit, i když, máš možná pravdu v tom, že zakládám projekty jako C++, proto taky zdrojáky mají extenzi .cpp ... Jinak je to jedno, zdroják může mít koncovku klidně .txt

system("pause") bych nepoužíval, stejnou práci pro tebe udělá nekonečná smyčka (budeme-li se držet opravdu čistého C)

Code:

 while(getchar() != '\n')
   {}

se scanf ti takhle nepomůžu, musel bych vidět co řve (nechce se mi to programovat), ale velice častá chyba bývá asi tato:

Code:

int input;
scanf("%d", input);

Co potřebuješ, předat funkci skutečnou proměnnou (tedy její adresu, ne kopii), takže si proměnnou nareferencuješ a předáš... kód: scanf("%d", &input);  ..

Nebo si pomož (můžeš-li) C++ třídou istream, a jejím objektem cin - tam se nedá udělat chyba... Sám nemám C++ moc rád, jsem stará struktůra a nenaučil jsem se pořádně programovat objektově, ale tohle hodně pomáhá.. výstupním ekvivalentem je objekt cout, který poslouží místo printf.. všechno dostaneš k dispozici, když si includneš iostream.h
U konzolovek užitečné, u okenních aplikací už tolik ne, ale ty píšeš konzolovku :)

A ještě mám návrh na zjednodušení práce:

stejný výsledek, s mnohem méně psaní, a i rychlejší dostaneš, když:

Code:

 complex numbers[5];
for(int i = 0; i < 5; i++)
{
   numbers[i].rj = 0;
   numbers[i].ij = 0;
}

Samozřejmě, nenainicializuješ celé pole struktur jinými hodnotami, ale když mulvíš o scanf, tak předpokládám, že si stejně to pole struktur komplexních čísel chceš naplnit sama skrz připravený soubor a nebo přes klávesnici... tedy jenom pro účely inicializace (nulama) tento kód postačí... představ si, kdybys měla takto inicializovat třeba 200, nebo 500 prvků pole - celý kód bys měla zaneřáďený nějakýma inicializacema prvků pole


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#10 04. 12. 2011 12:52

Palice
Zelenáč
Příspěvky: 9
Reputace:   
 

Re: Definice datového typu - jazyk C

Dobré jitro,
děkuji za poučení. Co se týká kradeného softwaru, tak tě můžu potěšit, že v tom si já rozhodně nelibuju :) (čímž se bohužel řadím k menšině ve společnosti^^)

Tady je to co řve:
warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
warning C4013: 'system' undefined; assuming extern returning int
Hádám, že o nic nejde vzhledem k tomu, že všechno funguje tak, jak má.

Mimochodem, ve tvém kódu se scanf vidím chyby dvě :P :D což je matoucí:) 

A moc díky za tohle, nevěděla jsem jak zavolat jen jednu část z některé pozice pole (např pro printf).
numbers[i].rj = 0;
numbers[i].ij = 0;

Offline

 

#11 04. 12. 2011 20:17

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Definice datového typu - jazyk C

o scanf připomíná, že existuje lepší varianta, která za argument bere velikost bufferu (pole) do kterého se bude psát - a když to překročíš, tak by měla funkce ti vstup zkrátit a dát na poslední prvek nulový znak. Šikovná věc ;)
podobně funguje funkce sprintf(), která "krmí" řetězec proměnnými, které už mají nějakou hodnotu (a tyto je pak třeba vypsat) - i od těch existuje _s alternativa

Druhý warn jsem nepotkal, asi tím, že funkci system nepoužívám, ale na MSDN jsem našel něco ve smyslu, že funkce system je definovaná v headerech process.h, resp. stdlib.h - zkus includnout jeden z těchto headerů, a warn by měl zmizet

Btw, jaké dvě chyby? všiml jsem si, že jsem (a to u obou, u té "výslovně špatné" i u té "správné" verze) zapomněl středník, (to se mi stává velmi často, ale lepší zapomenout, než aby byl někde navíc, například za hlavičkou cyklu nebo ifem), ale ta druhá chyba?? fakt nevidím :) a rád se dám poučit, nesežral jsem všechnu moudrost světa :)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#12 05. 12. 2011 15:03

Palice
Zelenáč
Příspěvky: 9
Reputace:   
 

Re: Definice datového typu - jazyk C

No vidíš, že tu chybu vidíš :) nebo středník není chyba? Ale sama nejsem o nic lepší, když jsem přehlídla, že chybí i v prvním kódu^^
Napsala, jsem to jen proto, že to co jsi napsal by mohlo vyznít jako že

int input;
scanf("%d", input);

je správně.

Offline

 

#13 05. 12. 2011 16:16

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Definice datového typu - jazyk C

Pravdu máš, akorát (a to už odbočujeme od původního tématu) - zapomenutý středník samozřejmě chyba jest, ovšem takovéto "drobnosti", které rozzlobí překladač a program ti odmítne vyrobit je menší zlo, než předat argument, do kterého se má psát, hodnotou (tedy kopii té proměnné) - na to překladač neupozorňuje (zcela logicky) a pak se tady člověk (také zcela logicky) vzteká a několik hodin hledá takovouhle "blbost"

Každopádně díky za report, původní příspěvek jsem opravil, kdyby to náhodou někdo četl, aby nebyl zbytečně zmaten :)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#14 05. 12. 2011 17:57

Palice
Zelenáč
Příspěvky: 9
Reputace:   
 

Re: Definice datového typu - jazyk C

bezva :)

Aby ta odbočka nebyla tak velká, tak sem pak aspoň zkopíruju můj konečný velevýtvor^^ (samozřejmě až potom, co za něho dostanu zasloužené body). Pro případ, že by někdo jiný nevěděl, jak napsat triviální complex calculator:)

Offline

 

#15 05. 12. 2011 23:44

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Definice datového typu - jazyk C

:)

Super, těším se :) mám takový jednoduchý v hlavě, ale asi by nebylo moc výchovné ho sem dát :) jen se chvilku trap, děvče :)

A nezapomeň (k tomu bys potřebovala ale C++, aby to "vypadalo hezky") přetížit příslušné operátory.. v C budeš "jenom" volat funkce


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#16 03. 02. 2012 00:47

Palice
Zelenáč
Příspěvky: 9
Reputace:   
 

Re: Definice datového typu - jazyk C

Ach bože, stres, zápočty, zkouškový, únava, stres :D S velkým zpožděním, tady je ta moje hrůza. Výsledek - 5 bodů z 5 ^_^  Celkově je ten program poněkud nevyužitelný... nicméně odpovídá zadání. Taky by se hodilo nechat ta čísla zadat uživatelem, ale na to já jsem líná. Ještě jednou, díky za pomoc!
@frank_horrigan: a potrápila jsem se dost :)
__________________________________________________________________________________
#include <stdio.h>

typedef struct {
      float rc;
      float ic;
} complex;

int i;
char operace[4];

complex v, vi, vp;                            /* výsledek, mezivýsledek */
complex c;
   
complex soucet(complex, complex);        /* deklarace funkcí */
complex rozdil(complex, complex);
complex soucin(complex, complex);
complex podil(complex, complex);
complex calculator(char[], complex[]);

complex numbers[5];                        /* pole komplexních čísel */

complex n1, n2, n3, n4, n5;
   
   
int main()
{
    n1.rc = 1;        n1.ic = 1;            /* Zadání 5 komplexních čísel */
    n2.rc = 1;        n2.ic = 2;
    n3.rc = 1;        n3.ic = 3;
    n4.rc = 2;        n4.ic = 1;
    n5.rc = 2;        n5.ic = 2;
       
    numbers[0] = n1;
    numbers[1] = n2;
    numbers[2] = n3;
    numbers[3] = n4;
    numbers[4] = n5;

    printf("V poli jsou cisla:\n\n");
    for (i = 0; i < 5; i++) {
      printf("%f + %f i\n", numbers[i].rc, numbers[i].ic);
    }

    printf("\nZadejte 4 operace:\n\n");
    scanf("%s", &operace);
    printf("\nMezivysledky:\n\n");

    v = calculator(operace, numbers);        /* výsledek */
    printf("\n\nVysledek:  %f + %f i\n\n\n", v.rc, v.ic );
   
    system("pause");

return 0;
}
                                               
complex soucet(complex a, complex b) {        /* definice funkcí */
    c.rc = a.rc + b.rc;
    c.ic = a.ic + b.ic;
    return c;
}
complex rozdil(complex a, complex b) {
    c.rc = a.rc - b.rc;
    c.ic = a.ic - b.ic;
    return c;
}
complex soucin(complex a, complex b) {
    c.rc = (a.rc * b.rc) - (a.ic * b.ic);
    c.ic = (a.rc * b.ic) + (a.ic * b.rc);
    return c;
}
complex podil(complex a, complex b) {
    c.rc = (((a.rc*b.rc) + (a.ic*b.ic)) / ((b.rc*b.rc) + (b.ic*b.ic)));
    c.ic = (((a.ic*b.rc) - (a.rc*b.ic)) / ((b.rc*b.rc) + (b.ic*b.ic)));
}

complex calculator(char operace[], complex numbers[]) {
       
    switch (operace[0]) {
   
      case '+' : vi = soucet(numbers[0], numbers[1]);
        break;
      case '-' : vi = rozdil(numbers[0], numbers[1]);
        break;
      case '*' : vi = soucin(numbers[0], numbers[1]);
        break;
      case '/' : vi = podil(numbers[0], numbers[1]);
        break;
    }
    printf("%f + %f i\n", vi.rc, vi.ic);

    for (i=1; i<4; i++) {
   
      switch (operace[i]) {

        case '+' : vi = soucet(vi, numbers[i+1]);
          break;
        case '-' : vi = rozdil(vi, numbers[i+1]);
          break;
        case '*' : vi = soucin(vi, numbers[i+1]);
          break;
        case '/' : vi = podil(vi, numbers[i+1]);
          break;
      }
    if (i<3) printf("%f + %f i\n", vi.rc, vi.ic);   
    }
    return vi;
   
}
__________________________________________________________________________________

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson