Új hozzászólás Aktív témák
-
mm779
tag
Most arra lenne szükségem, hogy egy dinamikusan foglalt 3D-s tömböt át kell adnom egy függvénynek és ott feltölteni. C++ -ban ezt hogy tudom megoldani?
2D -re:
void main()
{
...
char **t = new char*[sor]; -
mm779
tag
Most arra lenne szükségem, hogy egy dinamikusan foglalt 3D-s tömböt át kell adnom egy függvénynek és ott feltölteni. C++ -ban ezt hogy tudom megoldani?
2D -re:
void fv(char **t, .... );
void main()
{
...
char **t = new char*[sor];
...
}
void fv(char **t, ...)
{
for(int i = 0, i < sor, i++) t[i] = new char[oszlop];
....
}3D-re ez hogy van? (vagy úgy általában 2-nél több dimenziós tömb esetén)
-
Dirty_Pio
csendes tag
Hihetetlen de mindig az ilyen huesegeken akadok fent: szoval van egy file es be kene olvasni belole par adatot, az elso sorban egy lebegopontos valtozo(k) van es egy egesz tipusu(n) szunettel elvalasztva. N a kovetkezo ket sorban tallahato elemek szamat adja meg. A kovetkezo sorban n darab lebegopontos valtozo van es az azt koveto sorban n darab egesz. a kodom igy nez ki:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f;
int n,i;
float k;
if ( !(f=fopen("thief.in","r")) ){
printf("error input file");
exit (1);
}
fscanf(f,"%f %d",&k,&n);
int v[n];
float d[n];
for (i=0;i<n;i++)
{
fsncaf(f,"%d",&v[i]);
printf("%d ",v[i]);
}
for (i=0;i<n;i++)
{
fsncaf(f,"%f",&d[i]);
printf("%f ",d[i]);
}
close(f);
return 0;
}A program nem, a kovetkezo errorra hivatkozva: [Linker error] undefined reference to'fscanf'. Ha jo tudom az fscanf a stdio.h header filebe van definialva szoval kene menjen nem?
-
Sk8erPeter
nagyúr
Valószínű elég láma kérdés, de kezdő vagyok C-ben, két feladatom van:
1.) Kör egyenlete alapján karakteresen kirajzolni egy kört (pl. mittudomén, X-ekkel ) (persze nyilván nem lesz egy szép kör, de nem baj)
2.) Mondjuk 5 db egymásban elhelyezkedő téglalapot kirajzolni szintén karakteresen (szintén mondjuk X-ekkel), lehetőleg rekurzívan (de nem rekurzív megoldás is jöhet)
Most gyorsan lerajzoltam Paint-ben, valami ilyesmire gondolok:
Csak a téglalap oldalai X-ekkel kirajzolva.
De ha sima négyzettel jóval egyszerűbb, akkor akár az is jó.Ilyen tök alap (ANSI) C utasításokra gondoljatok, semmi komplikált, ezekkel kellene tudni megoldani a feladatot.
Előre is köszönöm!
Sk8erPeter
-
Jester01
veterán
válasz Sk8erPeter #957 üzenetére
A platformfüggetlen megoldás az lenne, hogy csinálsz egy tömböt a memóriában ami a rajzfelületed. Implementálsz egy csoda setpixel függvényt ami kitesz egy képpontot ebben a tömbben. A rajzolás végén pedig sorban végigmész a tömbön és kiteszed a képernyőre. Azért kell ilyen körülményesen, hogy elkerüljük a kurzorpozícionálás problémáját.
Innentől kezdve a kör és a téglalapok rajzolása már triviális.Jester
-
Sk8erPeter
nagyúr
válasz Jester01 #958 üzenetére
Lehet, hogy triviális, csak nem számomra.
Nem tanultunk setpixel függvényről, ami azt jelenti, hogy jelen esetben nem is kéne használni, hanem csak olyan alap függvényekkel és utasításokkal kellene megoldani, amiket az elején tanul az ember, kb. printf, scanf, for és (do-)while ciklusok, if/else, tömbök meg hasonlók szintjén, szóval tényleg nagyon amatőr módon, meg olyan headereket include-olva, mint az stdio.h, string.h, stdlib.h, esetleg math.h, vagy ha nagyon kell, a kevésbé független conio.h, stb...
Ilyen megoldás elképzelhető?Egyébként köszi, hogy ilyen gyorsan válaszoltál!
Sk8erPeter
-
doc
nagyúr
válasz Sk8erPeter #959 üzenetére
Jester pont errol beszelt
tehat a setpixel fv-t neked kell megcsinalni, ez annyit tesz majd hogy a megfelelo tombelemet pl. space-rol X-re allitja
kezdd a teglalappal, az egyszeru -
Jester01
veterán
válasz Sk8erPeter #959 üzenetére
Persze, hogy nem tanultál a setpixel függvényről, azt neked kellene megírni
Induláshoz: a setpixelnek semmi más dolga nincs, mint a megfelelő tömbelembe egy X-et tenni. Kört legegyszerűbb az x = r cos fi, y = r sin fi, r=0..2 PI paraméteres egyenletből csinálni, téglalapot meg simán a négy egyenesből.
Az egészet nem fogom megírni helyetted, de ha elakadsz valahol akkor segítek.
MOD: de lassú vagyok
[ Szerkesztve ]
Jester
-
doc
nagyúr
válasz Sk8erPeter #961 üzenetére
tulajdonkeppen nem is kell kulon fuggveny, ha van egy ketdimenzios tombod, mondjuk char screen[80][25]; akkor ebbe irogathatsz, mondjuk screen[5][9]='X' az (5;9) koordinatan "kigyujt egy pixelt"
ha a rajzolas elott feltoltod sima space-ekkel, akkor mas dolgod nem is lesz, mint megcsinalni a "rajzolo" fuggvenyeket, amik a screen[x][y] elemet irva 'rajzolnak'
a vegen meg egy ciklussal siman kiiratni a tombot -
bkgb
csendes tag
Sziasztok! Egy feladatban kérném a segítségeteket:
Billentyűzetről megadunk egy teljesen zárójelezett kifejezést, amely csak egyetlen betűből álló azonosítójú változókat és a +, -, *, / kétoperandusú operátorokat tartalmazhatja a zárójeleken kívül. Írjon programot, amely beolvassa a kifejezést, és ha az szintaktikusan helyes, akkor felépíti a hozzátartozó bináris fát, ha pedig hibás, akkor képernyőre írja azt a részkifejezést, amely még hibátlan volt, és ezután megjelöli a hiba okát! Feltesszük, hogy redundáns zárójelek nincsenek. Írjon hozzá egy eljárást is, amely a szintaktikusan helyes kifejezést képernyőre írja és megjelöli azt az operátort, amely utoljára lesz végrehajtva a kifejezés kiértékelésénél!
Előre is köszönettel: bkgb. -
Davey7
senior tag
Adott egy állomány, amely magyar nyelvű mondatokat tartalmaz, minden sorban pontosan egyet. Írj programot, amely egy másik állományba írja az első állomány azon mondatait, amelyeknek van olyan legalább öt karakter hosszúságú szava, amely palindróma. (A wchar.h használata javasolt.)
Nekem már van egy olyan programom,hogy EOF-ig szavakat olvas be és megnézi,hogy palindroma e és aztán ezeket kiírja egy fájlba...
Ezt a feladatot,hogyan kellene a legegyszerűbben megoldani? Én gondoltam arra,hogy egy hosszabb sztringbe beolvasom a mondatot és onnan valahogy(nemtudom,hogy kell) egy másik sztringbe átmásolom a szavakat és ha palindroma akkor kiírom a mondatot.
Mert akkor itt egyszerű lenne az a vizsgálat is,hogy figyelembe vegye azt,hogy legalább 5 betűs legyen a palindroma....Mi van a wchar.h-ban amiért ajánlják?Utánanéztem,de nem esett le...
Másik: több szó közül,hogyan állapítom meg,hogy melyik fordul elő a leggyakrabban?
-
Jester01
veterán
Azért kínálgatják a wchar.h-t, hogy az ékezetes karaktereket helyesen tudd kezelni. Éppen csak azt felejtették el megmondani, hogy milyen kódolásban van a fájl.
Igen, ha mondatonként olvasol be, az jó megoldás lehet. Figyelned kell arra, hogy esetleg nem fér bele a pufferbe, ezért dinamikusan kell méretezni. Vagy, ha nagyon csúnyán akarod, akkor egyszerre be is olvashatod az egész fájlt Mindenesetre azt kellene tudni, mi határoz meg egy mondatot - erre jó lenne ha a specifikáció kitért volna. Márcsak azért is, mert bizonyos esetkben igen nehéz eldönteni. Például az Apám neve id. Kiss János. az hány mondat is? Ennek hiányában egyszerű szabályként például azt lehet használni, hogy a mondat vége ott van ahol egy vagy több ., ! vagy ? áll ami után a következő betű nagy. De ezt mindenképp rögzíteni kell a dokumentációban. Összességében ez egy igen rosszul specifikált probléma, szerintem ne vállald el
A másik kérdésre: valamilyen alkalmas adatszerkezetben nyilván kell tartani a szavakat. Ahogy olvasod a bemenetet, a megfelelő szó előfordulásainak számát növeled. Tipikusan erre a hash tábla a célszerű, de mivel C-ben ilyen nincs, ezért például egy láncolt lista vagy egy bináris fa is megteszi. MOD: persze ilyenek sincsenek, de könnyebb csinálni
[ Szerkesztve ]
Jester
-
Davey7
senior tag
válasz Jester01 #967 üzenetére
a példabemenetben egy sorban egy mondat és a végén van egy pont.
be kell vállalnom,mert beadandó és talán ez annyira nem vészes Ugye ilyenkor egy sztringbe lesz a mondat, és itt kellene valahogy megoldani,hogy ha 5 betűnél nagyobb egy szó akkor megnézze,hogy palindroma e... úgy gondoltam,hogy valahogy szavanként át kellene másolni egy másik tömbbe,de azt hogyan tudom megoldani?
-
Jester01
veterán
Ja, ha soronként egy mondat van az jó.
Tulajdonképpen átmásolni felesleges, elég pozíció alapján nézegetni a mondatot. Tehát nyilvántartod a szó elejét és a végét és az alapján ellenőrzöl. Valami ilyesmivel:
int start = 0;
int end;
int found = 0;
while(next_word(&start, &end))
{
if (end - start >= 5 && is_palindrome(start, end))
{
found = 1;
break;
}
}Értelemszerűen a next_word és is_palindrome függvényeket neked kell megírni. Az előbbi sorban visszaadja a szavak kezdő és végpozícióját, az utóbbi pedig megnézi, hogy az adott szó palindróma-e.
Jester
-
Sk8erPeter
nagyúr
válasz Jester01 #967 üzenetére
Mi így oldottuk meg az ékezetes karakterek helyes megjelenítését:
char * magyarit(const char * src){
unsigned i;
static char dest[2000];
for(i=0;src[i];i++){
switch(src[i]){
case 'á': dest[i]=160; break;
case 'é': dest[i]=130; break;
case 'í': dest[i]=161; break;
case 'ó': dest[i]=162; break;
case 'ö': dest[i]=148; break;
case 'ő': dest[i]=139; break;
case 'ú': dest[i]=163; break;
case 'ü': dest[i]=129; break;
case 'ű': dest[i]=251; break;
case 'Á': dest[i]=181; break;
case 'É': dest[i]=144; break;
case 'Í': dest[i]=214; break;
case 'Ó': dest[i]=224; break;
case 'Ö': dest[i]=153; break;
case 'Ő': dest[i]=138; break;
case 'Ú': dest[i]=233; break;
case 'Ü': dest[i]=154; break;
case 'Ű': dest[i]=235; break;
default: dest[i]=src[i];
}
}
dest[i]=0;
return dest;
}Aztán printf-nél meg így hivatkozom rá, pl.:
printf(magyarit("Nettó ár: "));
Ez itt nem lenne jó?
Sk8erPeter
-
Davey7
senior tag
válasz Jester01 #969 üzenetére
de ha ismeretlen mondatot olvas be akkor nem tudom,hogy milyen szavak vannak benne...így hogyan tartom nyílván a szó elejét és végét?
azért kérdeztem,hogy az átmásolás,hogy van,mert még nagyon kezdő vagyok és talán úgy meg tudnám csinálni...
tehát a mondat sztringből valamilyen módon a szavakat átrakom egy másik sztringbe és ott az strlen-el meg tudom mondani a szó hosszát és el tudom minden szóra végezni a vizsgálatot...aztán a kiíratás talán már nem vészes. -
Jester01
veterán
A másoláshoz eleve tudnod kellene hol kezdődik és hol végződik. És ha azt tudod, akkor már nem is kell átmásolni
int next_word(const wchar_t** start, const wchar_t** end)
{
/* az előző szó végétől indulunk */
*start = *end;
/* keressük meg a következő szó elejét */
while(**start != 0 && !iswalnum(**start)) *start += 1;
/* ha a string vége, akkor kész */
if (**start == 0) return 0;
/* keressük meg a szó végét */
*end = *start + 1;
while(iswalnum(**end)) *end += 1;
return 1;
}Az előző példához képest ez most pointeres, de ugyanaz a logika.
Jester
-
Sk8erPeter
nagyúr
válasz Jester01 #962 üzenetére
Bocs, de mi az az "r=0..2 PI"?
Elsőre úgy értelmezném, hogy a 2kPi-t akarja jelenteni, ahol k=0,1,2, de ennek a körnél semmi értelme, mert a sugár nem 2kPi.
A kör egyenlete alapján kéne megoldanom a feladatot:
ha C(u,v) a kör középpontja, és P(x,y) a kör egyik pontja, akkor az egyenlet:
CP^2 = r^2 = (x-u)^2 + (y-v)^2De nem igazán tudom, hogy is oldjam meg ez alapján a feladatot.
Sk8erPeter
-
Jester01
veterán
válasz Sk8erPeter #973 üzenetére
Hát mert elírtam! Nyilván nem az r megy 0-tól 2PI-ig, mert az állandó, hanem a fi. Uppsz.
Annyi lépésben amennyi pontra szükséged van. Ez is a kör egyenlete, ha behelyettesíted a tiedbe, akkor látszik (a sin^2 fi + cos^2 fi = 1 azonosság alapján)
Tehát pl. így lehetne ezzel kört rajzolni:for(i = 0; i < 100; i++)
{
double fi = i / 100.0 * 2 * M_PI;
setpixel(r * cos(fi) + u, r * sin(fi) + v);
}Ez a lépésszám függvényében lehet, hogy lukacsos lesz kicsit.
Van persze másik módszer is, de az szerintem macerásabb.Jester
-
Sk8erPeter
nagyúr
válasz Jester01 #974 üzenetére
Értem, de sajnos egyelőre így sincs elképzelésem, hogy hogyan kéne megcsinálni ezt a feladatot, meg szerintem nem is totál kezdőnek való feladat, de persze lehet, hogy csak én vagyok a béna.
Mondjuk itt ezt sem értem: "double fi = i / 100.0 * 2 * M_PI;" Növelgetjük egészen 99-ig i-t (for(i = 0; i < 100; i++)), de nem tudom, miért.
Sk8erPeter
-
Davey7
senior tag
válasz Jester01 #972 üzenetére
ez eléggé bonyolult nekem... beszéltük egy cimborámmal,hogy talán úgy is meg lehetne csinálni,hogy beolvasunk egy sort aztán egy másik fájlba azt elmentjük,aztán abból a fájlból szavanként kiolvasom és úgy végzem el a vizsgálatot.
Hogy lehetne egész mondatot beolvasni EOF-ig?Mert ugye az fgets nem is meri az EOF-ot.
-
Jester01
veterán
válasz Sk8erPeter #975 üzenetére
Azért növelgetük egy tetszőleges számig, mert annyi darab pontot teszünk ki. Vagyis a kört 100 részre osztjuk. A teljes kör ugye 2*PI radián, ezért lesz a fi annyi amennyi.
A P futó pont koordinátái nyilvánvalóan azok, amik a setpixel hívásban szerepelnek.
Ha a képpont rajzolás már megvan (a setpixel, vagy bármi ami azzal ekvivalens) akkor a fenti for ciklus kirajzolja a kört, semmi egyebet nem kell csinálni.
Jester
-
kampi_
csendes tag
Sziasztok!
Szeretnék csinálni, egy olyan programot, aminek kb ez lenne a működési elve, hogy van egy .txt (pl.arget.txt) és van egy másik (pl.:what.txt). A target.txt-ben csak gépnevek vannak. Minden gép domainban van. Ha elindítom a progit, akkor a target.txt-ből kiolvassa a gépneveket, és minden gépen lefutattja a what.txt-ben megadott file-szerveren lévő fájlt. Ez így medoldható szerintetek? Mert én csak leginkább olyan megoldást találtam, hogy külön csinálok egy kliens progit, amit minde gépre fel kell tennem, és egy szerver progit, amit meg ugye én vezérelek, hogy mit csináljon éppen a progi. A kérdés az lenne, hogy ahogy én leírtam (nem a kliens-szerver megoldással) megoldható-e valahogyan a progi amit szeretnék, és ha igen akkor egy két ötletet is kérnék, hogy nagyjából miket kellene hozzá használnom.
Előre is ksözi szépen a segítséget!
-
-
kampi_
csendes tag
Utoljár 4-5 éve programoztam rendesebben, szóval mind a kettő problémát jelent Bár most eszembe jutott, hogy olyan progit tudok csinálni, ami meghívja a psexec-et és ott paraméteresen átadom neki az épp aktuális gépnevet. Legalábbi remélem, hogy menni fog Köszi szépen a segítséget
-
timikee
csendes tag
sziasztok
dev c++ban, windows alatt kéne szervert/klienst programoznom. milyen headereket/libeket kéne belinkelnem?
-
Celebro
csendes tag
Sziasztok!Most kezdem programozói életem C ben és egy olyan problémába ütköztem amit nem tudok megoldani. A problémá(i)m a következő:
Egy 8 elemű tömb címét szeretném átadni egy függvénynek mutatóval.
Hogy a függvény meghatározza a tömb összegét és átlagát, és adja vissza őket mutatókkal.
Ha valaki tud segítsen LÉCCI és linkelje be nekem a progit! Én már kb 5órája verem a fejem a falba.
Előre is köszi minden segítséget![ Szerkesztve ]
Ha nem tudsz úszni, ne mássz fára, mert elüt a villamos!
-
doc
nagyúr
a fuggveny fejlece lehet mondjuk:
void szamol(int *tomb, int *osszeg, int *atlag)
es meghivhatod mondjuk igy:
int tombocske[8];
int sum;
int avg;
...
szamol (tombocske, &sum, &avg);a fv belseje szerintem menni fog, ha megsem segitunk
de tenyleg erdemes lenne bemasolni ide a kodot, az sem baj ha rossz, abbol tanulhatsz a legtobbet
-
Celebro
csendes tag
válasz Jester01 #985 üzenetére
Amire jutottam az nem sok.. Eddig simán ciklussal próbálgattam de az 6 elemnél nem bír többet a 7. re túlcsordul.Olvasgattam hogy ha cím szerint kezeljük a tömböt akkor kevesebb hely is elég neki, mert ha jól tudom a címnek csak fele annyi bit kell.Ezért gondoltam arra, hogy függvénnyel és címekkel kéne számoltatni, csak még nem jöttem rá a nyitjára.(Sajnos a könyv amiben keresgéltem nem nyújtott használható infókat.) A progi amit eddig alkottam itt van:deh ez csak 6 elemet bír...
int main(void)
{
double a[6]={3.4, 1.4, 2.3, 6.8, 6.6, 2.4};
double osszeg;
int i;
double z2=0;for(i=0;i<6;i++)
{
z2=a[i];
osszeg=osszeg+z2;
z2=0;}
double atl;
atl=osszeg/6;
printf("az atlaga: %.2f\n",atl);
printf("az osszege: %.2f\n",osszeg);system("PAUSE");
}
ui:ha hülyeséget írtam boocccs..[ Szerkesztve ]
Ha nem tudsz úszni, ne mássz fára, mert elüt a villamos!
-
doc
nagyúr
ezt eleg durvan tulbonyolitottad
MOD: amit az elejen irsz a cimekrol meg meretekrol abbol egy arva szot sem ertettem
nincs itt semmi magia, hasznalhatsz 6000 elemu tombot is, ugyanugy mukodni fogint main(void)
{
double a[6]={3.4, 1.4, 2.3, 6.8, 6.6, 2.4};
double osszeg; // ezt nullazd le az elejen!
int i;
double z2=0; // ez tokfoloslegesfor(i=0;i<6;i++)
{
z2=a[i]; // ez is
osszeg=osszeg+z2; // ehelyett siman: osszeg += a[i];
z2=0; // ez is}
double atl;
atl=osszeg/6;
printf("az atlaga: %.2f\n",atl);
printf("az osszege: %.2f\n",osszeg);
}tehat mondjuk igy:
int main()
{
double a[]={3.4, 1.4, 2.3, 6.8, 6.6, 2.4};
double osszeg=0;
double atl;
int i;
for(i=0;i<6;i++)
osszeg += a[i];
atl=osszeg/6;
printf("az atlaga: %.2f\n",atl);
printf("az osszege: %.2f\n",osszeg);
}[ Szerkesztve ]
-
Celebro
csendes tag
hm....
Köszönöm!!!
Amit írtál az tök jól működik: így már nem is kell bonyolítani tovább.(azt viszont nem értem, hogy nálam a régi miért akadt ki a 7. elem hozzáadása után... )
Na de mind1 majd egyszer utána járok
Még egyszer köszi a segítséget!Ha nem tudsz úszni, ne mássz fára, mert elüt a villamos!
-
kampi_
csendes tag
Sziasztok!
Tudnátok nekem mondani egy függvényt, aminek segítségével C-ben tudok egy külső programot futtatni paraméterekkel?? Én így próbáltam :
execl("psexec.exe","\\\\target -i -c d:\\kampi\\map.bat",NULL);
A target az egy változó, ami mindig egy épp aktuális gépnevet tartalmaz amit fájlból olvas ki, de így nem műkődik sajnos.
Előre is köszönöm a segítséget!
-
blaces
tag
Hello!
Tudtok olyan C vagy C++ könyvet ajánlani amelyben rengeteg: Fa, Lista programkód található?
-
félisten
Hali!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int error;
error = execl ("c:\\windows\\system32\\mspaint.exe", " d:\\ubul.jpg", NULL);
system("c:\\windows\\system32\\mspaint.exe d:\\ubul.jpg");
return 0;
}Mindkét esetben megnyitom a Paint-et 1 paraméterrel ami egy kép elérése, azaz a Paint elindul és betölti az adott képet automatikusan.
A system-es megoldás nem elegáns és nem is szokták javasolni, de ennek ellenére használható, ha nem fontos hogy a progi hordozható legyen, és tudod hogy csak egy adott környezetben fogod úgyis csak használni a progit.(vagy másképp fogalmazva: ha magánhasználatra készíted a progit)
Ahogy látszik execl esetén csak simán fel kell sorolni az adott paramétereket(ügyelve hogy szóköz legyen közte!), az error változó ha -1, akkor nem sikerült futtatni az adott külső alkalmazást.
Az execl használatához az unistd.h headerfile szükséges.Fire.
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
Vessel
csendes tag
Üdv nektek,érdeklődni szeretnék,hogy esetleg nincs valami ismerősötök aki vállalná korrepetálásomat c-ből?Szeretném az alapokat elsajátítani,csak hát egyedűl nem megy.Netes tanulós módszert nem alkalmaztam,valaki azt mondja meg lehet tanúlni így is,valaki azt hogy nem.Köszi
-
DJ.Gróf
aktív tag
Sziasztok. Tanulgatom a c++-ot. Honnan tudnák egy ingyenes otthoni használatú borland builderX-et letölteni? Köszönöm
-
kampi_
csendes tag
válasz Fire/SOUL/CD #993 üzenetére
Hi!
Tehát ha jól értem, akkor elvileg ebben a formában működnie kellene, ugye?
execl("psexec.exe","\\\\target -i -c d:\\kampi\\map.bat",NULL);
Csak az volt a gáz ezzel, hogy a "target" változót nem értelmezte rendesen, mert a "\\target" nevű gépen akarta lefutattni a progit, pedig pont az lenne a lényege, hogy a target az változik. Kiolvas egy gépnevet egy fájlból és azon a gépen lefut a progi, aztán kiolvassa a következőt és megint lefut. Mondjuk azóta variáltam még, csak sajnos legkésőbb hétfőn este tudom majd kipróbálni....
Másik kérdés. Mielőtt ez a rész lefutna, akarok egy olyat, hogy megpingelje az összes gépet ami a fájlban van, mert ha a psexec-et egy olyan gépen akarom futtatni, ami nem elérhető akkor leáll a progi. Ezért szertnék olyat csinálni, hogy előtte megpingelek minden gépet ami a fájlban van, és ha elérhető, akkor kiírja egy fájlba, ha meg nem akkor egy másik fájlba, és így tuti lefutna végig a progi rendesen. A kérdés csak az, hogy hogyan tudom a ping visszatérési értékét vizsgálni?? Nincs erre valamilyen ötletetek, vagy programrészleteteket, ami ha lefutott a ping akkor pl.: visszaad 0-át, ha nem elérhető, akkor 1-et, ha meg valamilyen hiba van akkor 2-vel. Mert így már tudnám kezelni rendesen.
Köszi a segítséget!
-
félisten
Hali!
1. Elméletileg működnie kell(főleg ha a "\\\\target.......... elé teszel egy szóközt
" \\\\target.......2. pont az a dolga, hogy a target nevű gépen futtassa az adott progit....
3. Több gép esetén(LAN vagy ugyanazon Domain esetén) van megoldás, hogy ne kelljen pl 20-szor lefuttatni külön gépnevekkel.
készítesz egy TXT fájlt pl : gepek.txt néven, ebbe a TXT fájba felsorolod azokat a gépeket, amiket szeretnél:
\\gep1
\\gep2
....
\\gepXezután:execl("psexec.exe"," @gepek.txt -i -c d:\\kampi\\map.bat",NULL);
(figyelj a szóközre, itt is ott van)3. a psexec nem ad vissza hibakódot!(bele is vagyon írva)
Ha 0-val tér vissza akkor minden ok, ha nem akkor azt az általa futtatott alkalmazás vagy egyéb adja vissza. Ezek a hibakódok szabványos Windows hibakódok(már ha az alkalmazás amit futattál windows-os)
Ezen hibakódokat itt megtalálhatod: [Windows System Error Codes]Ha van esetleg még kérdésed(és tudok bent segíteni) akkor azt privbe légyszives, mert ez mégis csak C Topic, amiről meg beszélünk az egész más már...
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
blaces
tag
Hali!
Így csináltam meg a házim:
A feladat:[I]Írj programot, amely kiszámítja, hogy két szöveges állomány szóhasználata mennyire hasonló! A hasonlóságot egy 0 és 1 közé eső törtszámmal mérjük. Kiszámítása a következőképpen történik: minden szóra, ami legalább az egyik állományban előfordul, vesszük a szó gyakoriságát az első fájlban és a másodikban. A két gyakoriságot kivonjuk egymásból, majd a különbség abszolútértékét elosztjuk a szó összes előfordulásának számával (gyakoriság_az_első_fájlban + gyakoriság_a_második_fájlban). Ezt a számítást elvégezzük minden szóra. Az szavakra kiszámított értékeket végül összeadjuk, és elosztjuk a két állományban előforduló különböző szavak számával.A szöveges állományok nevét a program parancssori argumentumként kapja meg. Az állományok minden sora legfeljebb 1000 karakter hosszú. A sorokban a szavak szóközzel, vesszővel, felkiáltójellel, kérdőjellel és ponttal lehetnek elválasztva. A kis- és nagybetűket azonosként kell kezelni. Az állományok szavai közül csak azokat kell figyelembe venni, amelyek három vagy több karakterből állnak. Minden szó csak az angol ábécé kis- és nagybetűit tartalmazhatja.
A program a kiszámított értéket írja a kimenetre 5 tizedesjegy pontossággal![/I]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define IGAZ 1
#define HAMIS !IGAZ
typedef struct listaelem{
char szo[50];
struct listaelem *kov;
}LISTAELEM;
int abszolut(int a,int b)
{ int c;
c=(a-b)>=0 ? (a-b):(a-b)*(-1);
return c;
}
int keres(LISTAELEM *fej,char sz[])
{
LISTAELEM *seged;
for(seged=fej;seged;seged=seged->kov)
{
if(strcmp(sz,seged->szo)!=0)
return IGAZ;
}
return HAMIS;
}
LISTAELEM* beszur(LISTAELEM *fej,char szo[])
{
LISTAELEM *ujelem=(LISTAELEM*)malloc(sizeof(LISTAELEM));
strcpy(ujelem->szo,szo);
ujelem->kov=NULL;
if(!fej)
return ujelem;
else
{
LISTAELEM *seg=fej;
while(!seg->kov)
seg=seg->kov;
seg->kov=ujelem;
}
return fej;
}
LISTAELEM* feldolgoz(FILE *f,LISTAELEM *fej)
{
char betu,sz[50];
int j,i=0;
while( (betu=fgetc(f)) !=EOF)
{
if(betu==' ' || betu==',' || betu=='!' || betu=='?' || betu=='.' || betu=='\n')
{
if(strlen(sz)>2)
{
fej=beszur(fej,sz);
for(j=0;j<50;j++)
sz[j]=' ';
i=0;
}
}
else
{
sz[i]=tolower(betu);
i++;
}
}
return fej;
}
int gyak(LISTAELEM *fej,char sz[])
{
LISTAELEM *seg;
int gyakorisag=0;
for(seg=fej;seg;seg=seg->kov)
{
if(strcmp(seg->szo,sz)==0)
gyakorisag++;
}
return gyakorisag;
}
int main(int argc,char **argv)
{
FILE *f1,*f2;
LISTAELEM *fej1,*fej2,*fej3,*seged;
int gyak1,gyak2,szavak=0,n;
float hasonlosag=0,eredm;
f1=fopen(argv[1],"r");
f2=fopen(argv[2],"r");
fej1=feldolgoz(f1,fej1);
fej2=feldolgoz(f2,fej2);
for(seged=fej1;seged;seged=seged->kov)
{
if((n=keres(fej3,seged->szo))==0)
{
gyak1=gyak(fej1,seged->szo);
gyak2=gyak(fej2,seged->szo);
hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
szavak++;
}
}
for(seged=fej2;seged;seged=seged->kov)
{
if((n=keres(fej3,seged->szo))==0)
{
gyak1=gyak(fej1,seged->szo);
gyak2=gyak(fej2,seged->szo);
hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
szavak++;
}
}
eredm=hasonlosag/szavak;
printf("%.5f\n",eredm);
return 0;
}De lefordításkor ilyen szegmens hibát ír ki:
Szegmens hiba
A debug.out fájlban nyomkövetési információk érhetőek el.
A teszt_debug.out fájlban a nyomkövetés során előállt kimenet található!
Érvenytelen memória hivatkozás.debug tartalma:
==21624== Conditional jump or move depends on uninitialised value(s)
==21624== at 0x40079A: feldolgoz (1_feladat.c:57)
==21624== by 0x4008C3: main (1_feladat.c:95)
==21624==
==21624== Conditional jump or move depends on uninitialised value(s)
==21624== at 0x4A1CD9E: strcpy (mc_replace_strmem.c:272)
==21624== by 0x4006E5: beszur (1_feladat.c:35)
==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
==21624== by 0x4008C3: main (1_feladat.c:95)
==21624==
==21624== Conditional jump or move depends on uninitialised value(s)
==21624== at 0x4006F7: beszur (1_feladat.c:37)
==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
==21624== by 0x4008C3: main (1_feladat.c:95)
==21624==
==21624== Invalid read of size 8
==21624== at 0x40071D: beszur (1_feladat.c:42)
==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
==21624== by 0x4008C3: main (1_feladat.c:95)
==21624== Address 0x38 is not stack'd, malloc'd or (recently) free'd
==21624==
==21624== Process terminating with default action of signal 11 (SIGSEGV)
==21624== Access not within mapped region at address 0x38
==21624== at 0x40071D: beszur (1_feladat.c:42)
==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
==21624== by 0x4008C3: main (1_feladat.c:95)Ez meg egy másik házinak a kódja, de itt is ugyanaz a hiba, érvénytelen memória hivatkozás:
#include <stdio.h>
#include <stdlib.h>
typedef struct faelem{
int adat;
struct faelem *bal,*jobb;
}FA;
typedef struct listaelem{
int adat;
struct listaelem *kov;
}LISTA;
LISTA* beszur_lista(LISTA *fej,int adat)
{
LISTA *ujelem=(LISTA*)malloc(sizeof(LISTA));
ujelem->adat=adat;
ujelem->kov=NULL;
if(!fej)
return ujelem;
else
{
LISTA *segb=fej;
while(!segb->kov)
segb=segb->kov;
segb->kov=ujelem;
}
return fej;
}
FA *ujelem(){
FA *uj = (FA *)malloc(sizeof(FA));
uj -> bal = NULL;
uj -> jobb = NULL;
return uj;
}
FA *beszur_fa(FA *gyoker, int adat){
FA *uj;
if(gyoker == NULL)
{
uj = ujelem();
uj -> adat = adat;
gyoker = uj;
}
else if(adat <= gyoker -> adat)
gyoker -> bal =beszur_fa(gyoker -> bal, adat);
else if(adat > gyoker -> adat)
gyoker -> jobb =beszur_fa(gyoker -> jobb, adat);
return gyoker;
}
int elemszam(FA *fa)
{
return fa ? 1+elemszam(fa->bal)+elemszam(fa->jobb) : 0;
}
LISTA* preorder(FA *fa,LISTA *fej1)
{ if(fa)
{
fej1=beszur_lista(fej1,fa->adat);
preorder(fa->bal,fej1);
preorder(fa->jobb,fej1);
}
return fej1;
}
LISTA* inorder(FA *fa,LISTA *fej2)
{
if(fa)
{
inorder(fa->bal,fej2);
fej2=beszur_lista(fej2,fa->adat);
inorder(fa->jobb,fej2);
}
return fej2;
}
int hasonlit(LISTA *fej1,LISTA *fej2)
{
LISTA *seged1,*seged2;
seged1=fej1;
seged2=fej2;
while(seged1)
{
if(seged1->adat!=seged2->adat)
goto c;
seged1=seged1->kov;
seged2=seged2->kov;
}
c:return 1;
return 0;
}
int main(int argc,char **argv)
{
int szam,i;
FILE *f,*ki;
FA *forras;
LISTA *in,*pre;
f=fopen(argv[1],"r");
ki=fopen(argv[2],"w");
fscanf(f,"%d\n",&szam);
forras=beszur_fa(forras,szam);
while(szam!=EOF)
{
fscanf(f,"%d\n",&szam);
forras=beszur_fa(forras,szam);
}
in=inorder(forras,in);
pre=preorder(forras,pre);
i=hasonlit(pre,in);
if(i==1)
fprintf(ki,"nem\n");
else fprintf(ki,"igen\n");
fclose(f);
fclose(ki);
return 0;
}A CodeBlocks nem talál hibákat, és az egyik C ismerősöm sem érti, hogy mi a gond...
-
félisten
Hali!
Mondjuk az nem ártana ha ilyenkor azt is leírnád, hogy milyen fejlesztőkörnyezetet használsz.
Vagy hibás a környezet, vagy olyan kapcsoló(k) vannak beállítva(compiler. linker, stb), amik ezt az eredményt adják. (pl memória modellek)Fire.
UI: csak átfutottam, kipróbálni most nem tudtam, de nem látok bent olyan hibát, ami miatt ilyen "hiba" állna elő, mármint hogy befordul simán(az viszont gyanús hogy nem is lehet futtatni, majd 15-óra után ki tudom próbálni, még az is lehet, hogy kékhalált fog dobni)
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
Jester01
veterán
Már majdnem megdícsértelek, hogy milyen ügyesen használod a valgrind-ot.
Az első hiba amit a vg talált, hogy az 57-es sorban nem inicializált változót használsz. Ez konkrétan az strlen(sz) és nyilván azért mert az sz nincs inicializálva. Ráadásul a cikluson belül is csupa szóközzel akarod feltölteni, 0 byteok helyett.
A második az az első folyománya, ha azt javítod, ez is eltűnik.
A harmadik a 37. sorban a main-ben inicializálatlan fej változók miatt van.
A következő a 42. sorban gondolom a fordított while feltétel miatt van.
#1000
[ Szerkesztve ]
Jester
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!