Hirdetés

2024. április 26., péntek

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  C++ (téma lezárva)

Hozzászólások

(#151) amargo


amargo
addikt

DEVC++ eddig 1x használtam, de nekem nem jött be. Ha nem akarjátok megvenni a Borlandod van Development változata is.. x ideig hazsnálható.. persze nem lehet vele eladni semmit.
Ezt csak azért írtam be, ha a nem ingyenesség miatt nem akarjátok használni.

“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

(#152) virtual


virtual
tag

Lenne egy C++ házim holnapra, amit úgy néz ki nem igazán tudok megcsinálni. Elvileg egyszerű feladat lenne, csak nem értek C++-hoz. Van egy minta is, ami alapján meg lehet csinálni, illetve fel lehet használni. Ha valaki tudna segíteni, küldhetne egy mailt.

Természetesen nem ingyen kérem, mivel elég fontos lenne hogy meglegyen.

Ide írjon akit érdekel, és küldöm a mintát és a feladatot is:
virtual(kukac)pro(pont)hu

(#153) virtual válasza virtual (#152) üzenetére


virtual
tag

Up?
Most betegre keresheted magad, itt a nagy alkalom. :U

(#154) c4-eXp válasza virtual (#153) üzenetére


c4-eXp
aktív tag

Lehet, hogy itt is lesz jelentkező, de szerintem jobban jársz, ha a prog.hu-n keresel embert, aki megírja neked: [link].
Ott tuti lesz jelentkező, ha fizetsz érte.

[Szerkesztve]

while (state(Korso) != _BROKEN) go(Korso, &Kut);

(#155) virtual válasza c4-eXp (#154) üzenetére


virtual
tag

Megoldódott a dolog elég gyorsan, :C és ezúton is köszi akik írtak. Most már elmondhatom, hogy nem csak játékra, hanem tanuláshoz is használom a netet. :DDD

(#156) CrazyTM


CrazyTM
csendes tag

EZT AZ OLDALT MINDENKINEK MEG KELL NÉZNIE: [link]

cRaZy | http://coderz.hu/ | http://tbc.coderz.hu | info@coderz.hu | gdai2@hotmail.com | crazywew@gmail.com | crazyw

(#157) NikhodemuS


NikhodemuS
csendes tag

Sziasztok!
Kezdo kerdes, mivelhogy en is kezdo vagyok c, c++-ban:
Hogy viszel ki egy megvaltoztatott string parametert egy fuggvenybol?
Es itt a kerdesem: hogy viszed ki a fuggvenybol a string valtozot, vagy az erteket ?--sehol nem talaltam eddig erre doksikat...:((


Vagy itt egy kodszelet: hol a baja?

char *megfordit(char *szoveg)
{ unsigned int i=0,hossz=0;
char *forditva;
while(szoveg[hossz] != '\0') {hossz++;};//megnezem a hosszat

while(szoveg!='\0'){forditva=szoveg[hossz-1-i];++i;};
forditva='\0';

return forditva;
}

DevC++ utolso betaja kidob a progibol az ertekatadas kozben(Hozzaferesi megsertes--Segmentation Fault )

[Szerkesztve]

Tévedni emberi dolog. A számítógépek csak felgyorsíitják a folyamatot...

(#158) VladimirR válasza NikhodemuS (#157) üzenetére


VladimirR
nagyúr

eredeti kod (ha jol hamoztam ki a html-bol):

char *megfordit( char *szoveg ) {
unsigned int i = 0, hossz = 0;
char *forditva;
while( szoveg[hossz] != '\0' ) {
hossz++;
}; //megnezem a hosszat
while( szoveg[i] != '\0' ) {
forditva[i] = szoveg[hossz-1-i];
++i;
};
forditva[i] = '\0';
return forditva;
}



en nem latok benne hibat - mondjuk en nem ertek hozza :)



[Szerkesztve]

(#159) Jester01 válasza NikhodemuS (#157) üzenetére


Jester01
veterán

A forditott szövegnek nem foglalsz helyet. Ezt c-ben neked kell. És persze fel is kell szabadítani, ha már nincs rá szükség:


forditva = (char*)malloc(hossz + 1); /* a lezáró nulla bytenak is kell hely */



Egyébként egy string hosszát az strlen() függvénnyel le lehet kérdezni.

VladimirR: Köszi a bányászást, így már mindjárt más.
MOD: Ugyanakkor a dõlt betû megint továbbterjed a következõ hozzászólásra. Azt hittem ez már javítva :F



[Szerkesztve]

Jester

(#160) tomcs válasza VladimirR (#158) üzenetére


tomcs
őstag

szerintem meg a forditva az egy ures pointer lesz es aze seg fault.

memoriat kene neki foglalni vagy inkabb helyben megforditani

(#161) Miracle válasza VladimirR (#158) üzenetére


Miracle
senior tag

bizony bizony ez elszall segfaulttal, ime egy jobban mukodo megoldas:


char* megfordit(char *str)
{
char temp;
int p = 0;
int l = strlen(str);
while (l - p > l/2)
{
temp = str[p];
str[p] = str[l-p];
str[l-p] = temp;
++p;
}
return str;
}



értelmező késziszótár :: rekurzió --> lásd : rekurzió

(#162) tomcs válasza Miracle (#161) üzenetére


tomcs
őstag

ember, aludjal mar...

btw visszaadtam mar az opkut jegyzeted?
kicsit ossze vannak folyva mar a dolgok..

(#163) Miracle válasza tomcs (#162) üzenetére


Miracle
senior tag

ahah most ebredtem ne szorakozz velem.
amugy visszaadtad.
tud.fant.vilagnezetekrol nincs valami infod? ;]

értelmező késziszótár :: rekurzió --> lásd : rekurzió

(#164) tomcs válasza Miracle (#163) üzenetére


tomcs
őstag

vegyel fel vmi vizsgaidopontot, az elott par nappal kuldj esszeket, beszelj rola vmennyit hogy miert irtad azt amit irtal es orulj az otosodnek.

(te allat fel birsz ilyenkor kelni? en inkabb ilyen ejszakai ize vagyok, foleg hogy mar nem kell bejarni. most fogom magam, ledontok kb 3 vodor kavet, irok egy zh-t majd jovok haza aludni :D)

(#165) Miracle válasza tomcs (#164) üzenetére


Miracle
senior tag

este 7kor fekudtem, igazabol nem vagyok faradt :) de en is tanulni akarok.
es van jegyzeted hogy mirol van szo? es milyen es mekkora essze?
najo de ne offoljuk szet ezt a topikot inkabb jelentkezz be icqra

értelmező késziszótár :: rekurzió --> lásd : rekurzió

(#166) tomcs válasza Miracle (#165) üzenetére


tomcs
őstag

van egy aminel valaszthatsz hogy alapitvany vagy kiberiada es mindenfele szempontok meg kerdesek vannak megadva. csekkold meg a targy honlapjat a hps szerveren

a masik meg egy altalad valasztott sf konyvrol vagy novellarol szoljon meg lehetoleg vmilyen szinten filozofiai is :) mer tartod azt a konyvet olyan nagyon jonak, milyen filozofiai problemat piszkal, konkluzio meg ilyen egyeb nyavajak. vhogy ezen is tul kell lenni. (de hogy felig-meddig on legyek: szivesebben irnek vmi durva c++ beadandot helyette :DDD)

(#167) NikhodemuS válasza Miracle (#161) üzenetére


NikhodemuS
csendes tag

Koszi, Miracle....de ez megint seg fault....
nem akarja kivinni azt a stringet...sehogy sem. fordito bug lenne?...kezdek begolyozni. 30 orat toltottem el vele, kiprobalva minden(ertek es cim szerinti) atadasi megoldast,remelem jol...nem tud vki linket adni egy okes doksihoz, ami ezt (is) targyalja?

[Szerkesztve]

Tévedni emberi dolog. A számítógépek csak felgyorsíitják a folyamatot...

(#168) Jester01 válasza NikhodemuS (#167) üzenetére


Jester01
veterán

Esetleg ha az egész programot megmutadnád. Jellemzõen ilyenkor máshol van a hiba :F
Ha az eredeti kódodba beszúrod a malloc-ot amit én írtam, akkor sem jó?

Mellesleg Miracle kódjával vigyázni kell, mert bár úgy látszik mintha új stringet adna vissza, valójában helyben fordítja meg. Ezzel két baj van: az összes többi helyen, ahol eltároltad a stringre mutató pointert szintén megfordul, illetve nem adhatsz be neki konstans stringet. Ha tehát úgy próbáltad ki pl. hogy megfordit(''abcde'') akkor az bizony segfault, mert a konstans string az nem írható, kivéve, ha erre külön kéred a fordítót (de ne tedd):

-fwritable-strings
Store string constants in the writable data segment and don't uniquize them. This is for compatibility with old programs which assume they can write into string constants.
Writing into string constants is a very bad idea; ``constants'' should be constant.

Jester

(#169) tomcs válasza NikhodemuS (#167) üzenetére


tomcs
őstag

c-ben tenyleg ENNYIRE gaz a sztringkezeles. gyakorlatilag nincs is.. :)

az algoritmus amit miracle adott ''majdnem'' jo, csak az indexeles van elcseszve de az nem okoz szegmens hibat

helyesen:

char* megfordit(char *str)
{
char temp;
int p = 0;
int l = strlen(str);
while (l - p > l/2)
{
temp = str[p];
str[p] = str[l-p-1];
str[l-p-1] = temp;
++p;
}
return str;
}



ezt ha <pre>char* akarmi = ''akarmi'' </pre><p> -kent deklaralt ''stringre'' hivod, az nem tom pontosan melyik szegmensben lesz de mindenesetre jo esellyel olyan helyen ahol nem szabad felulirnod, igy szepen vedelmi hiba lesz.

ezt a fv-t csak malloc-al foglalt char*-okra szabad meghivni, de malloc + akarmi = ''dasds'' mar megint nem jo mert az a pointert allitja at.

hogy ertsd mennyire korulmenyes, ez pl mar mukodne:

int main(int argc, char *argv[])
{
char* nyekk = (char*)malloc(6);
nyekk[0]='n';
nyekk[1]='y';
nyekk[2]='e';
nyekk[3]='k';
nyekk[4]='k';
nyekk[5]='/0';
printf(nyekk);
nyekk=megfordit(nyekk);
printf(nyekk);
return 0;
}



ha deklaralasnal megadott stringekre akarod hasznalni, akkor masolatot kell keszitened a stringrol es azt visszaadnod, szal lekerdezed a hosszat, malloc-olsz neki 1el tobbet es abba pakolod a megforditott stringet, meg a vegere /0-t is. ekkor figyelni kell, hogy a kozepso betut is masolja at. (ha paratlan hosszu a stringed)</p></p>

[Szerkesztve]



[Szerkesztve]

(#170) tomcs válasza tomcs (#169) üzenetére


tomcs
őstag

b+ aludnom kene.. van olyan is hogy strcpy en meg karakterenkent adom meg :DDD

(#171) Jester01 válasza tomcs (#170) üzenetére


Jester01
veterán

Sõt, van strdup is ;]
De ha már úgyis dinamikus foglalás van, akkor miért ne a megfordított string legyen dinamikus?

Jester

(#172) tomcs válasza Jester01 (#171) üzenetére


tomcs
őstag

azt mondtam en is, de nem irtam be a kodot csak hogy mit kene csinalnia.

aze nehogyma terjedjen a kopipasztolos programozoi stilus :)

(#173) NikhodemuS válasza tomcs (#172) üzenetére


NikhodemuS
csendes tag

itt a kod. Lehet hogy a main-ben a hiba?

lassuk,tehat, ho a baj, nekem mar elszallt a maradek energiam is...:F

#include<string.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>

char* megfordit(char *str)
{
int hossz=0,i = 0;
char* forditva;
while( *str++ ) ++hossz;

forditva=(char*)malloc(hossz+1);
while(!(str))forditva=str[hossz-i++];
forditva='\0';
/*ha felszabaditom a forditva-nak lefoglalt helyet, akkor mi kerul a str-be? vagy automatikusan torlodik a fuggveny elhagyasakor?*/
return strcpy(str,forditva);
}

int main(void)
{char *sz,*szov;
printf(''kerem a szoveget...'');
scanf(''%s'',&sz);
printf(''a szoveg:...%s'',&sz);
printf(''forditva:...%s'',megfordit(sz));
getch();
return 0;
}


[Szerkesztve]

Tévedni emberi dolog. A számítógépek csak felgyorsíitják a folyamatot...

(#174) Jester01 válasza NikhodemuS (#173) üzenetére


Jester01
veterán

Mindjárt jobban látjuk a hibát.
Sajnos a bekért stringnek is kell hely és azt is neked kell lefoglalni.
Valamint a scanf és a printf hívásban nem &sz kell hanem simán sz.

Az ideiglenes stringet (forditva) az strcpy után felszabadíthatod, nem törlõdik automatikusan.

MOD: A printf nem tesz soremelést automatikusan, neked kell \n formában.

[Szerkesztve]

Jester

(#175) NikhodemuS válasza Jester01 (#174) üzenetére


NikhodemuS
csendes tag

Igy gondoltad?

char* megfordit(char *str)

{
int hossz=0,i = 0;
char* forditva;
while( *str++ ) ++hossz;
printf(''Checkpoint'');getch(); //ezt figyeld!
forditva=(char*)malloc(hossz+1);
while(!(str))forditva=str[hossz-i++];
forditva='\0';
str=forditva;
free(forditva);
return strcpy(str,forditva);

}
int main(void)
{char *sz,*szov; int i=0;

printf(''kerem a szoveget...'');
scanf(''%s'',&sz);
printf(''a szoveg:...%s'',&sz);
szov=(char*)malloc(strlen(sz));
printf(''forditva:...%s'',megfordit(szov));
getch();
return 0;
}
Itt valami nem tiszta...de koszi a joindulatot, remelem sikerul elmagyaraznotok, hol mind hibazok....:F

Tévedni emberi dolog. A számítógépek csak felgyorsíitják a folyamatot...

(#176) Jester01 válasza NikhodemuS (#175) üzenetére


Jester01
veterán

Nem :(
Igy:

strcpy(str, forditva);
free(forditva);
return str;



A main-be pedig ilyesmit:

char sz[81];
...
scanf(''%80s'', sz);
printf(''a szoveg: %s\n'', sz);



MOD: az sz-t persze malloc-cal is foglalhatod, de mindenképp a scanf elõtt, mert az akar beleírni. A szov változóra nincs szükség.



[Szerkesztve]

Jester

(#177) NikhodemuS válasza Jester01 (#176) üzenetére


NikhodemuS
csendes tag

koszi. Meg van egy kis hiba a forditva-ban, de azt megoldom. Fo az, hogy a segfaulttol megszabadultam, Koszi, sracok:)

Tévedni emberi dolog. A számítógépek csak felgyorsíitják a folyamatot...

(#178) Miracle válasza Jester01 (#168) üzenetére


Miracle
senior tag

Mellesleg Miracle kódjával vigyázni kell, mert bár úgy látszik mintha új stringet adna vissza, valójában helyben fordítja meg. Ezzel két baj van: az összes többi helyen, ahol eltároltad a stringre mutató pointert szintén megfordul, illetve nem adhatsz be neki konstans stringet. Ha tehát úgy próbáltad ki pl. hogy megfordit(''abcde'') akkor az bizony segfault, mert a konstans string az nem írható, kivéve, ha erre külön kéred a fordítót (de ne tedd):

ha C kodot keszitek, akkor igyekszek olyat kesziteni, hogy az szepen simuljon a glibc-be, mert en altalaban ezt a C libet hasznalom. Szoval a fuggvenyem nem veletlenul vagy lustasagbol nem foglal helyet maganak, hanem azert, mert ez igy jobban hasznalhato, es szebben valasztja el a stringfordito viselkedest minden mastol, es igy tobb helyen fel lehet hasznalni, mint egy olyan fuggvenyt, ami maganak allokal teruletet. mindenfele C libek fejlesztoi is kifejezetten ugyelnek arra, hogy csak olyan fv foglaljon teruletet, aminek a funkcioja kifejezetten terulet allokalas, mint pl az atrdup(). persze nehany helyen meg kikerulhetetlen, hogy a lib foglaljon helyet nekunk, mert pl. valamilyen adatstrukturat kell feltoltenie, de ilyenkor a fuggveny definiciojaban szepen leirjakhogyha beleirsz halottvagy, es ami kell azt MASOLD ki, es utana szabaditsd fel az erre szolgalo fv.el. ha en allokalnek helyet, akkor konnyen elofordulhatna ilyen hiba:
str = megfordit (str); es rogton buktam nehany byteot, ami sosem jo. arrol az aprosagrol ne is beszeljunk hogy din. memoriafoglalas nem annyira gyors, mint inkabb lassu, nem minden rendszeren, es nem minden korulmenyek kozott erheto el, ha mar van 1 giga din.an foglalt memoriad linuxon pl mar konnyen lehet hogy elszall a progi meg ha 4 giga van is a masinaban. szoval egy fuggveny a leheto legkevesebb olyan muveletet vegezzen, aminek esetleg lehetnek mellekhatasai, es a leheto legkevesebb funkcionalitast valositsa meg, ami mar megfelel a specifikacionak. (szerintem)

u.i. elindexelesert sorry, elofordul nalam :(

értelmező késziszótár :: rekurzió --> lásd : rekurzió

(#179) Jester01 válasza Miracle (#178) üzenetére


Jester01
veterán

Én csak azt mondtam, hogy vigyázni kell vele, nem azt, hogy rossz :R
Kezdõként szerintem könnyû belefutni abba a két problémába amit említettem.

Nekem spec. egy olyan függvény ami visszaad egy char*-ot azt sugallja, hogy új stringet kapok (értelemszerûen ha olyan függvényrõl van szó, ami módosít). De ez csak az én hülyeségem. Igen, tudom, hogy a c libben is több ilyen van. Nyilván ha az ember elolvassa a dokumentációt akkor egyértelmû hogyan kell használni az adott függvényt.

Jester

(#180) tomcs válasza Miracle (#178) üzenetére


tomcs
őstag

mindenesetre ez igy nekem is serti a szeperzekem, helyben forgatashoz hasznaljunk void fvt es akkor egyertelmuen latszik, hogy az eredetit cseszi el a program, mert a tieddel meg csak annyit er el hogy lesz ket pointere ugyanarra a (megforditott) stringre, pedig c++-os gondolkodasmod alapjan marhara nem ezt varna.

(#181) Miracle válasza tomcs (#180) üzenetére


Miracle
senior tag

igaz, a char* visszateresi ertekre semmi szukseg, ez csak affele c++os szokas ahol altalaban az ilyesmi metodusok sajat magukra adnak vissza referenciat.

értelmező késziszótár :: rekurzió --> lásd : rekurzió

Útvonal

Fórumok  »  Szoftverfejlesztés  »  C++ (téma lezárva)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.