C - předání hodnot v poli (pointeru)z funkce do mainu + předání 1 proměnné – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C - předání hodnot v poli (pointeru)z funkce do mainu + předání 1 proměnné  – C / C++ – Fórum – Programujte.comC - předání hodnot v poli (pointeru)z funkce do mainu + předání 1 proměnné – C / C++ – Fórum – Programujte.com

 

MajklB0
Newbie
8. 3. 2011   #1
-
0
-

Zdravím, už jsem to řešil na jiném fóru ale nebyl mi nikdo schopný poradit tak, aby mi program fungoval a vyzkoušel jsem všechno co mě napadlo, ale prostě kód "funguje" ale nikdy se mi nedostane do hlavního programu jediná hodnota, kterou načítám ze souboru do pole vstup[i]. Takže se mi v souboru soucet.txt vypíše, že jsem měl 0 čísel a součet je 0.

Posílám jen tu část programu, aby jste viděli o co jde a aby to šlo případně otestovat jestli to funguje nebo ne. Pokud byste to chtěli testovat, tak musíte vytvořit vstup.txt v adresáři programu a hodit tam pár hodnot pod sebe.
Prosím poraďte jak to spravit, jsem si jistej, že to bude zase jen nějaká "maličkost" díky které se mi hned po vrácení do mainu vynuluje hodnota vstup na 0x0. Jsem začátečník, tak se omlouvám za pravděpodobně né moc dobrou konstrukci programu. Je to poslední projekt který v C dělám a jen tohle potřebuji abych ho mohl odevzdat.
Předem všem díky




#include <stdio.h>
#include <stdlib.h>

int nacteni_souboru(int velikost, int *vstup, int cpocet)
{
int cti = 0, i;
const char *VSTUPNISOUBOR = "vstup.txt";
FILE *cteni;
cteni = fopen(VSTUPNISOUBOR,"r");
while(fscanf(cteni, "%d",&cti) != EOF)
cpocet += 1;
velikost = cpocet;
for(i = 0; i < velikost; i++)
fscanf(cteni, "%d", &vstup[i]);

if ((vstup = (int*)malloc(velikost * sizeof(int))) == NULL) {
printf("Malo pameti!\n");
exit(1);
}
fclose(cteni);
return cpocet;
}

int soucet_cisel(int *vstup, int velikost)
{
int soucet = 0, i = 0;
for( i = 0; i < velikost; i++) {
soucet += vstup[i];
}
return soucet;
}
int main()
{
//const char *VSTUPNISOUBOR = "vstup.txt";
const char *SOUCET = "soucet.txt";
const char *SERAZENI= "MinMax.txt";
//const char *INTERVALY= "interval od Min.txt";
int *minMax, *interval, *vstup = 0;
int i, min, max, velikost = 0, pocet = 0, soucet = 0, cpocet = 0, rozsah_intervalu;
FILE *zapis;

cpocet = nacteni_souboru(velikost, vstup, cpocet);
printf("Ve vstupnim souboru je %d cisel, s nimiz bude program pracovat\n", cpocet);
printf("Zadejte rozsah intervalu do kterych budete chtit vase data tridit: ");
scanf("%d", &rozsah_intervalu);

soucet = soucet_cisel(vstup, velikost);
zapis = fopen(SOUCET,"w+");
fprintf(zapis,"Celkovy soucet od 1. do %d. císla je %d\n",velikost, soucet);
fclose(zapis);

return 0;
}



Nahlásit jako SPAM
IP: 147.230.154.–
m->29+6
Super člen
8. 3. 2011   #2
-
0
-

Musíš predávať pointer na pointer:

int nacteni_souboru(int velikost, int **vstup, int cpocet)
A následne s tým aj tak pracovať:
*vstup = (int*)malloc(velikost * sizeof(int))
Ale hlavne by si mal alokovať pamäť pred tým ako budeš do toho poľa načítavať.

Nahlásit jako SPAM
IP: 83.240.51.–
MajklB0
Newbie
8. 3. 2011   #3
-
0
-

To m->29 :
A předávat to do té funkce mám jak? jelikož mi to hází chybu s tím, že předávám jinej typ
"2rocnik\test\main.c||In function 'nacteni_souboru':|
2rocnik\test\main.c|15|warning: format '%d' expects type 'int *', but argument 3 has type 'int **'|
2rocnik\test\main.c|43|warning: passing argument 2 of 'nacteni_souboru' from incompatible pointer type|
2rocnik\test\main.c|4|note: expected 'int **' but argument is of type 'int *'|

Nahlásit jako SPAM
IP: 147.230.154.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #4
-
0
-

To MajklB : &vstup pro predani... *neco pro dereferenci (tj. z int ** na int *)

ale problemu tam bude asi trosku vic

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MajklB0
Newbie
8. 3. 2011   #5
-
0
-

tak už jsem to upravil podle tvého návodu :) a to funguje ;) jen teď mi to hází ten warning:format '%d' expects type 'int *', but argument 3 has type 'int ** při deklaraci funkce , takže se to mělo týkat položky cpocet, ale když jsem to přehodil na druhou pozici při deklaraci (jak u funkce, tak v mainu při volání), tak mi to hází stejně argument 3, čemuž teda nerozumím

Nahlásit jako SPAM
IP: 147.230.154.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #6
-
0
-

To MajklB : &vstup[i] mozna todle... & udela int *** a [..] udela int ** ... videl bych to na neco jako (*vstup)+i
nebo &(vstup[0][i]) - snad to strilim od boku spravne :D

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MajklB0
Newbie
8. 3. 2011   #7
-
0
-

a to bych měl hodit kam? teď jsem se teda ztratil

Nahlásit jako SPAM
IP: 147.230.154.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #8
-
0
-

To MajklB : tam kde ti to hlasi warning.. pravdepodobne scanf

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MajklB0
Newbie
8. 3. 2011   #9
-
0
-

no tam teď už mám &vstup[i] do kterého to načítá ty hodnoty (nebo aspoň doufám), ale když jsem tam hodil *&vstup[i] tak to nehází warning, ale stále nefunguje. Popravdě nemám moc ponětí co se tím přesně dělá. V problematice pointerů jsem skutečně neznalý.

Nahlásit jako SPAM
IP: 147.230.154.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #10
-
0
-

no to ani nevim jak bude fungovat.. *& se spis vyrusi nez ze by k necemu bylo...
spis to &(vstup[0][i]) nebo ((*vstup) + i)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MajklB0
Newbie
8. 3. 2011   #11
-
0
-

stále přicházím na nové chyby, nebo vylepšení, která mi to zjednoduší, ale bohužel ani 1 z těchto přiřazování mi nefungují :( tak buď je chyba v načítání, nebo předávání, a nebo pak až u sčítání. Jde nějak zjistit jaké hodnoty tam zrovna ten vstup obsahuje??

Nahlásit jako SPAM
IP: 147.230.154.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #12
-
0
-

hod celej kod .. jen hadam podle toho co se tam asi mohlo zmenit

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MajklB0
Newbie
8. 3. 2011   #13
-
0
-



#include <stdio.h>
#include <stdlib.h>

int nacteni_souboru(int cpocet, int **vstup)
{
int cti = 0, i;
const char *VSTUPNISOUBOR = "vstup.txt";
FILE *cteni;
cteni = fopen(VSTUPNISOUBOR,"r");
while(fscanf(cteni, "%d",&cti) != EOF)
cpocet += 1;
// *vstup = (int*)malloc(velikost * sizeof(int));
if ((*vstup = (int*)malloc(cpocet * sizeof(int))) == NULL) {
printf("Malo pameti!\n");
exit(1);
}
for(i = 0; i < cpocet; i++)
fscanf(cteni, "%d", ((*vstup) + i));
fclose(cteni);
return cpocet;
}

int soucet_cisel(int *vstup, int velikost)
{
int soucet = 0, i = 0;
for( i = 0; i < velikost; i++) {
soucet += vstup[i];
}
return soucet;
}
int main()
{
//const char *VSTUPNISOUBOR = "vstup.txt";
const char *SOUCET = "soucet.txt";
const char *SERAZENI= "MinMax.txt";
//const char *INTERVALY= "interval od Min.txt";
int *minMax, *interval, *vstup = 0;
int i, min, max, velikost = 0, pocet = 0, soucet = 0, cpocet = 0, rozsah_intervalu;
FILE *zapis;

cpocet = nacteni_souboru(cpocet, &vstup);
printf("Ve vstupnim souboru je %d cisel, s nimiz bude program pracovat\n", cpocet);
printf("Zadejte rozsah intervalu do kterych budete chtit vase data tridit: ");
scanf("%d", &rozsah_intervalu);
velikost = cpocet;
soucet = soucet_cisel(vstup, velikost);
zapis = fopen(SOUCET,"w+");
fprintf(zapis,"Celkovy soucet od 1. do %d. císla je %d\n",velikost, soucet);
fclose(zapis);

return 0;
}


Nahlásit jako SPAM
IP: 147.230.154.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #14
-
0
-

vis o tom ze kdyz nactes ze souboru vsechny polozky a nevratis se na zacatek, do toho vysledku tezko neco dalsiho nactes?

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
8. 3. 2011   #15
-
0
-

krom toho na minimum, maximum, a soucet nepotrebujes vubec nikde ukladat vsechny hodnoty - to se da udelat "za letu"

a nekontrolujes vubec, zda se ti otevterel soubor!!!

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MajklB0
Newbie
8. 3. 2011   #16
-
0
-

k té první otázce, to jsem doteď neměl tušení, ale pokud vím, tak ze vstupu jen načtu položky a už se k tomu nevracím. A k tomu dalšímu postu - ten soucet asi určitě jde udělat elegantnějc, ale to minimum a amximum potřebuju v další části programu, kde podle toho vytvářím intervaly. A ta kontrola otevření souboru, na to jsem se ptal učitelky(je to do školy) a prej to nemusíme řešit..ona je co se tohohle týče "volnomyšlenkářská", víc jí zajímá jak mám kód naformátovanej a podobně "důležitý" věci

Nahlásit jako SPAM
IP: 147.230.154.–
nervak0
Věrný člen
8. 3. 2011   #17
-
0
-

V prvním cyklu čteš až do konce souboru a počítáš počet položek. Když je pak chceš načíst do toho pole, tak musíš číst zase od začátku. Když se ti ten soubor nepovede otevřít, tak z něj nemůžeš číst. Učitelku jsi buď nepochopil, nebo je to kráva. A jestli jí záleží na vzhledu toho kódu, tak to celé smaž a napiš znova, protože toto je na blití i pro toho, kdo na to kašle.

Nahlásit jako SPAM
IP: 213.211.51.–
MajklB0
Newbie
8. 3. 2011   #18
-
0
-

ahá, takže mám podruhé u toho načítání těch položek na vstupu se mám nějakým způsobem vrátit na začátek, nebo jsi tím chtěl říct, že to mám načítat ty hodnoty už při tom prvním čtení?? A tohle zrovna bych řekl, že mám i hezky naformátovaný :-D ale stejně to pak nechám projet pluginem na formátování v codeblocku. A výslovně na tohle jsem se jí ptal, jestli to mám kontrolovat a ona, že mám kontrolovat jen to, jestli jsem zavřel ten soubor.

Nahlásit jako SPAM
IP: 147.230.154.–
nervak0
Věrný člen
8. 3. 2011   #19
-
0
-

Můžeš to načítat do pole už při prvním čtení, ale do toho se asi zamotáš. Nech to takhle a jen tam přidej ten přesun zpátky na začátek (funkce rewind).

Nahlásit jako SPAM
IP: 213.211.51.–
MajklB0
Newbie
8. 3. 2011   #20
-
0
-

ok, díky ;-) to už jsem tam napsal a chybu to nehází, tak snad je to na začátku,ale stále mi to počítá v nějakých extra velkých číslech (asi 8 místných a možná i víc). Takže nevím kde se tam berou, nemůžu náhodou počítat s adresami?(že by byli nějak převedený na čísla)

a hází mi to warning u tohohle řádku fscanf(cteni, "%d", &vstup[i]); a to tohle warning: format '%d' expects type 'int *', but argument 3 has type 'int **'|

Nahlásit jako SPAM
IP: 147.230.154.–
crAzY^
~ Moderátor
+10
Grafoman
8. 3. 2011   #21
-
0
-

musí tam být jenom:

fscanf(cteni, "%d", vstup[i]);

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
MajklB0
Newbie
8. 3. 2011   #22
-
0
-

aha, díky :) zatím stále minimálně výpis je špatný, tak jdu ještě debugovat a pokusit se zjistit kde je chyba, jestli se mi předávají aspoň už skutečné hodnoty do mainu

Nahlásit jako SPAM
IP: 147.230.154.–
nervak0
Věrný člen
8. 3. 2011   #23
-
0
-

&(*vstup)[i]

Nahlásit jako SPAM
IP: 213.211.51.–
nervak0
Věrný člen
8. 3. 2011   #24
-
0
-

...

Nahlásit jako SPAM
IP: 213.211.51.–
crAzY^
~ Moderátor
+10
Grafoman
8. 3. 2011   #25
-
0
-

a hlavně jak už psal KIIV, tak musíš vrátit pozici kurzoru v souboru než z nějbudeš číst znova:

rewind(cteni);


for(i = 0; i < cpocet; i++)

fscanf(cteni, "%d", (*vstup)+i);


EDIT: pozdě...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
MajklB0
Newbie
8. 3. 2011   #26
-
0
-

tak díky moc :) teda takový práce s tím :) to si ani nemusel, i když jsem v C asi hodně natvrdlej takže jednoduše mi říct něco z oboru C, tak nevím o čem je řeč :-D tak to jdu zkusit naroubovat na to :)

Nahlásit jako SPAM
IP: 147.230.154.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 69 hostů

Podobná vlákna

Předání hodnot mezi třídami — založil roman.jaros

Předání proměnné — založil Mautinek

Moderátoři diskuze

 

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