Hirdetés
-
Már nem az Apple a kínai mobilpiac kedvence
it Az IDC szerint az Apple 6,6 százalékkal kevesebb mobilt tudott leszállítani Kínában az első negyedév során – a Counterpoint 19 százalékos visszaesést említ.
-
Premier előzetest kapott a Sand Land
gp Befutottak az első tesztek is a hamarosan megjelenő játékhoz.
-
Garmin Forerunner 165 - alapozó edzés
ma Leizzadtunk a Garmin legolcsóbb amoledes futóórájával.
Új hozzászólás Aktív témák
-
WonderCSabo
félisten
Sziasztok!
stringstreammel szívok. Hogy lehet normálisan törölni, majd megint írni bele?
stringstreamneve.str("");
strinstreamneve.clear();függvényekkel törölni tudok, de már újra beleírni nem... Ha csak cleart használok, nem csinál semmit, ha csak strt, akkor kitörli, de megint nem tudok bele írni...
[ Szerkesztve ]
-
sghc_toma
senior tag
válasz WonderCSabo #701 üzenetére
legjobb tudomasom szerint szep modszer nincs ra, de a clear + str("") kombonak mukodnie kellene.. az, hogy nem tudsz bele irni, mit jelent? hibat dob, vagy csak siman ures marad a stream?
esetleg meg megprobalhatod, hogy torlod az error flag-eket, es a put/get pointereket meg beallitod a stream elejere:stringstreamneve.clear();
stringstreamneve.seekp(0);
stringstreamneve.seekg(0);"Ha csak cleart használok, nem csinál semmit"
nem meglepo, a clear az error flag-eket allitja be...in asm we trust
-
sghc_toma
senior tag
válasz WonderCSabo #703 üzenetére
hmm.. milyen forditot hasznalsz? 4.4.3-as GCC-vel mukodik mindket megoldas.. esetleg egy forraskodreszletet be tudsz masolni ide (hatha mashol van a hiba)?
in asm we trust
-
Sk8erPeter
nagyúr
philoxenia jóarc volt, és kérésemre megváltoztatta a topic nevét egy kissé tisztességesebbre. Szerintem a "C++ gyors segitseg kellene" cím helyett a "C++ programozás" kicsit jobban hangzik.
Sk8erPeter
-
Gyuri16
senior tag
nem annyira c++ programozos kerdes, de ide illik inkabb:
most kezdek c++-ban programozni, es ezt vimben teszem. masik topicban mar kaptam helpet ctags-rol, ami nagyjabol mukodott is c-ben. most viszont osszeveszik a omnicppcompletion pluginnal (auto completion). az utobbinak ilyen tags generalast hasznalok: ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
ha ezt hasznalom akkor a completion mukodik, de a fajlban ugralas nem (ctrl+], ctrl+t). ha csak ctags -R * hasznalok akkor pedig az ugralas mukodik de a completion nem. valaki tud ezzel segiteni?Nem vagyok egoista, csak uborkagyalu!
-
Gyuri16
senior tag
válasz sghc_toma #709 üzenetére
valami ilyesmit ajanl:
ctags -o./_tags -R --c++-kinds=+p --fields=+iaS --extra=+q \
--languages=c,c++,c#,python,vim,html,lua,javascript,uc,math \
--langmap=c++:+.inl,c:+.fx,c:+.fxh,c:+.hlsl,c:+.vsh,c:+.psh,c:+.cg,c:+.shd,javascript:+.as ..
nekem igy se mukodik.egyelore jobb otletem nincs, mint meghekkelni az omnicpp plugint, valahogy ugy, hogy legyen ket kulon tags file (egyik a completenek a masik az ugralasra), es ravenni, hogy mielott kidobja a talalatokat allitsa at a tags valtozot.
lehet majd kesobb megnezem, most a c++ leckemet kellene csinalnomNem vagyok egoista, csak uborkagyalu!
-
sghc_toma
senior tag
Gyuri16: segiteni sajnos nem tudok, en is nemreg gondolkodtam azon, hogy jo lenne a Vim-et hasznalni IDE-kent, de nem volt tul sok idom foglalkozni vele.. az exVim-re guglizas kozben talaltam, feltettem, kiprobaltam egy projekten, de nem igazan melyedtem meg bele..
doc: nincs mit..
in asm we trust
-
nepszter1
addikt
Üdv, valahogy szeretnék egy progit csinálni c++ hogy adott pl. egy négyzet és a kerülete területe kiszámítása . Vagy pl. téglalap stb .
Hogyan lehetne ezt megoldani ? -
WonderCSabo
félisten
válasz nepszter1 #715 üzenetére
Ha úgy szeretnéd, hogy először megkérdezze, hogy melyik sokször legyen, akkor kell.
Pl.if (teglalap)
{
cout<<"magasság?"
cin>>magassag;
cout<<endl<<"szélesség?";
cin>>szelesseg;
kerulet=(2*magassag)+(2*szelesseg);
terulet=magassag*szelesseg;
cout<<kerulet<<endl<<terulet;
}
if (haromszog)
{
...[ Szerkesztve ]
-
Sk8erPeter
nagyúr
válasz WonderCSabo #716 üzenetére
Dehát akkor ilyen alapon az if-ek helyett valóban lehet switch-case is, semmivel sem csúnyább, sőt.
Sk8erPeter
-
WonderCSabo
félisten
válasz Sk8erPeter #717 üzenetére
Vhogy sosem szerettem a caset, de úgy csinálja a kolléga, ahogy akarja.
shev7: hello world már fordul.
[ Szerkesztve ]
-
-
WonderCSabo
félisten
válasz Sk8erPeter #722 üzenetére
Jaja, elvártam volna...
nepszter1: A változók száma attól függ, hogy hány fajta sokszöget, hány fajta módszerrel számolsz, de persze pl a háromszög magassága lehet ua. változó, mint a téglalap magassága és a négyzet oldalhossza. Meg persze csinálhatod egy változóval is, egy vectortt push_backelni, de sztem azt hagyjuk.
[ Szerkesztve ]
-
labuwx
tag
Sziasztok!
Szeretnék építeni egy robotot, ami bluetooth-on keresztül kommunikál a számítógéppel.
Arra lennék kíváncsi, hogy mennyire nehéz/hogyan lehet megoldani egy ASUS USB-BT211-gyel történő adat küldést illetve fogadást visual c++-ban? -
Sk8erPeter
nagyúr
Hali!
Van egy olyan feladatom, amivel kapcsolatban kíváncsi lennék a véleményetekre, hogy milyen megoldásokat javasoltok.
Egész pontosan ez a feladat szövege:
"Készítsen tetszőleges hosszúságú sorokból álló szöveges állományt reprezentáló objektumot! Valósítsa meg a UNIX tail(1) program funkcióit!
Valósítsa meg az összes értelmes műveletet operátor átdefiniálással (overload), de nem kell ragaszkodni mindenáron az operátorok átdefiniálásához!
Amennyiben lehetséges használjon iterátort!
Demonstrálja a működést külön modulként fordított tesztprogrammal!
A UNIX parancsok pontos leírását a man paranccsal kérdezheti le.
A parancs nevét követő zárójelben a man kötet sorszáma található.
A megoldáshoz NE használjon STL tárolót vagy algoritmust!"A tail() program lényege, hogy kiírja a standard outputra egy paraméterként kapott állomány utolsó 10 sorát. További paraméterezéssel az is elérhető, hogy az utsó n sort vagy n byte-ot írja ki az állományból (a 10 csak alapértelmezett), vagy akár az n-edik sortól kezdődően írja ki egy állomány tartalmát.
Kérdésem hozzátok az lenne, hogy ennek az OOP-s szemléletben történő megvalósítását hogy képzelnétek el? Maga a fájl beolvasása legyen külön osztály, aminek a tagfüggvényeit örökli egy másik, pl. a Tail osztály?
Itt találtam egy lehetséges megvalósítást (átláthatóság kedvéért felraktam a pastebinre), aminek azonban az OOP-hez nem túl sok köze van, nekem viszont objektum-orientáltan kell megvalósítanom az egészet. Ja, és STL-tároló sem használható.Így elsőre milyen javaslataitok lennének a konkrét megvalósítással kapcsolatban?
Hány osztály, milyen tagfüggvények, stb.?Ja, és miért tail(1)? Mi zárójelben az az (1)?
Előre is köszi minden javaslatot!
[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
válasz Sk8erPeter #727 üzenetére
A legutsó hülye kérdés volt, ott volt a válasz, hogy "A parancs nevét követő zárójelben a man kötet sorszáma található."
Azt az operátor átdefiniálós dolgot ilyen sablonszerűen minden feladatba beleírták, tehát ahhoz szerintem az én esetemben nem igazán kell ragaszkodni, tekintve, hogy szerintem itt nincs igazán értelme mit overloadolni.
Már nagyjából tanultuk, hogyan lehet saját iterátort létrehozni, de jelen esetben nem igazán látom gyakorlati hasznát, itt nem kell randomszerűen tudni elérni elemeket, vagy gyorsan az elejére, majd a végére ugrani, vagy hasonló, mint a klasszikus iterátoroknál, így itt nem látom olyan sok értelmét. Vagy mégis van? Esetleg velük végig lehet menni a sorokon, esetleg karaktereken....
De ez sima indexeléssel is elérhető, most itt nem tudom, van-e értelme készíteni iterátort.Ha valakinek eszébe jut ötlet, akkor megköszönöm, ha leírja.
Sk8erPeter
-
Mr. Teddy
őstag
Sziasztok!
Volna egy problémám, nem értem mi lehet a hiba.
Van nekem egy "unsigned __int64" változóm. Enek a változónak meg szeretnm pl. adni ezt az értéket: p= 0x0F5<<25 és nagyon fals számot ír ki. Vagyis kiírja a számot jól, csak a felső biteket 1-esekkel feltölti: FFFFFFFFEA000000. És azt kéne, hogy kapjam hogy simán: EA00000000.Mitől lehet ez?
-
sghc_toma
senior tag
válasz Sk8erPeter #727 üzenetére
"Maga a fájl beolvasása legyen külön osztály, aminek a tagfüggvényeit örökli egy másik, pl. a Tail osztály?"
nem.. a feladatkiirasban benne van, hogy magat a szoveges allomanyt kell reprezentalnod egy objektummal.. pl. csinalsz egy osztalyt, aminek van egy std::vector<std::string> adattagja, es ebben tarolod a sorokat.. mondjuk a konstruktor kap parameterkent egy filenevet, megnyitja, beolvassa a file-t, es eltarolja a tartalmat a vektorban.. az operator<< lehet uj sor vektorba rakasa, az operator>> meg egy sor olvasasa.. operaor+ ket file osszefuzese, stb.. az iterator meg a sorokon megy vegig, tulajdonkeppen ugyanaz, mint a vektor iteratora.. igy a tail egesz egszeruen megvalosithato mondjuk az std::for_each-csel, vagy egy sima for ciklussal.."de jelen esetben nem igazán látom gyakorlati hasznát, itt nem kell randomszerűen tudni elérni elemeket, vagy gyorsan az elejére, majd a végére ugrani, vagy hasonló, mint a klasszikus iterátoroknál"
az iterator pont nem a random hozzaferesre lett kitalalva.. ahogy a neve is mutatja, arra valo, hogy egy kontener elemein vegiglepkedj..in asm we trust
-
Sk8erPeter
nagyúr
válasz sghc_toma #730 üzenetére
Hali!
Köszi, de a feladatkiírásban az is benne van, hogy STL-tárolót NEM szabad használni, így értelemszerűen nem tárolhatom a könyvtári vectorban, saját tárolót kell létrehozni. Épp ez nehezíti az ügyet, ha lehetne STL-t használni, akkor elég gyorsan kész lenne a feladat.
Az std::for_each ugyanígy STL-algoritmus...Az iterátorok létrehozására itt található egy elég jó módszer: [link].
Igazából az operator+ fájlösszefűzés, meg a többi felüldefiniálás jó ötlet, de pl. az összefűzésnek a tail program szempontjából nem biztos, hogy van értelme, mivel ennek nem is alapfunkciója az összefűzés.
Igen, a szöveges állomány egy objektum, de akkor ennek az osztálynak milyen tagfüggvényei legyenek? Beolvasás, utolso_x_sor(), utolso_x_byte(), stb., egyéb ötletek? Vagy akkor inkább az lenne a jobb módszer, ha ezt az egész objektumot átpasszolnám egy Tail osztálynak, amiben lennének az említett utolso_x_sor(), utolso_x_byte() függvények, amik aztán feldolgozzák az objektumot, és a kívánt sorokat/byte-okat visszaadják a mainnek?
Bocs, hogy ennyi kérdésem van, csak mielőtt nekimegyek a feladatnak, mint tót az anyjának, azelőtt jobb gondolkodni, mi lenne az ideális és egyben kényelmes módszer.Sk8erPeter
-
sghc_toma
senior tag
válasz Sk8erPeter #731 üzenetére
hmm, ezt az STL-dolgot beneztem, bocs.. figyelmetlenul olvastam el a feladatot
en a file-t reprezentalo osztalyba nem pakolnam bele a tail megvalositasat.. legyen neki megnyitas/bezaras metodusa, meg iteratorai.. szerintem a tail objektum kap egy file objektumot megkozelites jo; a file iteratorait hasznalva kenyelmesen megvalosithatod a tail osztalyt.. ez azert jobb, mintha beleraknad a file osztalyba, mert ha pl. kesobb kelleni fog a head parancs is, akkor nem kell megbolygatni a file osztalyt, eleg irni egy head-et..
in asm we trust
-
j0k3r!
senior tag
hello mindenkinek!
olyan programot szeretnek irni, ami beker 2 adatot (nev char[20], ok char[50]) es ezek melle hozzafuzi az adott datumot a datum char[11] valtozoba. (ilyen formaban pl.: 2009.01.23.)
aztan az egesz cuccost hozzafuzi az adatok-txt-hez. (es igy majd folyamatosan bovul a lista)
egy otletet szeretnek kerni toletek az aktualis datum lekerdezesehez es valtozoba mentesehez.
a segitsegetek elore is koszonom.some men just wanna watch the world burn...
-
j0k3r!
senior tag
hello! elakadtam :/
van egy ilyen strukturam:
struct user
{
char nev[20];
char ok[30];
char datum[11];
};egy ilyen bovitofuggvenyem:
int banlist::bovit()
{
user adat;
system("cls");
cout<<"uj ban hozzaadasa"<<endl;
cout<<"-----------------"<<endl;
cout<<"nev: ";
cin>>adat.nev;
cin.ignore(80,'\n');
cout<<"ban oka: ";
cin.getline(adat.ok, 30);
cout<<"datum: ";
cin.getline(adat.datum, 11);
cout<<endl;
lista.push_back(adat);
cout << "\nsikeresen bovitettuk a listat";
cin.clear();
cout << endl;
return 0;
}teszt celjabol ugy csinaltam meg, hogy kezzel kelljen bevinni a datumot, de a te modszereddel sehogy se megy. tudnal segiteni, hogy az adat.datum -ba az aktualis datum keruljon?(2000.01.01. formaban)
elore is koszi.some men just wanna watch the world burn...
-
Gyuri16
senior tag
#include <iostream>
#include <sstream>
#include <time.h>
using namespace std;
int main() {
time_t t;
time(&t);
struct tm * tt = localtime(&t); // feltoltjuk a tm structot
// kiszamoljuk az ertekeket a struct leirasa alapjan
int year = 1900 + tt->tm_year;
int month = 1 + tt->tm_mon;
int day = tt->tm_mday;
stringstream ss; // Int -> String konverziohoz
ss << year << '.'; //Ev
if (month < 10) { // 1 helyett 01 legyen
ss << 0;
}
ss << month << '.'; //Honap
if (day < 10) {
ss << 0;
}
ss << day << '.'; //Nap
string datum = ss.str(); //stringet csinalunk belole
cout << datum << endl;
return 0;
}most vettem csak eszre, hogy char tombot hasznalsz, szoval akkor meg stringbol csinalni kell egy char[]-t, pl igy:
char d[12];
strcpy(d, datum.c_str());
(strcpynek a string.h include kell)
vigyazz mert a te kododban csak 11 byteot foglalsz le a datumnak, de az 12 byteot foglal (a null byte a vegen)Nem vagyok egoista, csak uborkagyalu!
-
Jester01
veterán
ss << year << '.'; //Ev
if (month < 10) { // 1 helyett 01 legyen
ss << 0;
}
ss << month << '.'; //Honap
if (day < 10) {
ss << 0;
}
ss << day << '.'; //NapEzt c++ nyelvjárásban úgy mondják, hogy
ss << setfill('0')
<< setw(4) << year << '.'
<< setw(2) << month << '.'
<< setw(2) << day << '.';Jester
-
j0k3r!
senior tag
egyebkent valaki tudna ajanlani c++ hoz valami jo ebookot/konyvet?
some men just wanna watch the world burn...
-
Sk8erPeter
nagyúr
Eddigi olvasgatások alapján a Szoftverfejlesztés C++ nyelven c. könyv elég jónak tűnik, de feltételezi a C nyelv ismeretét, nem írtad, hogy van-e ilyen alapod.
Ha nincs, akkor pl. a Programozzunk C++ nyelven c. könyv.Ezenkívül/ehelyett biztos a többiek is tudnak még ajánlani megfelelő forrásokat.
[ Szerkesztve ]
Sk8erPeter
-
j0k3r!
senior tag
koszonom mindkettotoknek!
c alapom nincs, mivel algoritmuselmelet utan egybol c++ jott.some men just wanna watch the world burn...
-
papa019
senior tag
Sziasztok.
Van egy hatalmas problémám. :SStringekből (osztály) álló vektor osztályt kellett készítenünk.
Minden megy szuperül egy dolgot kivéve://using namespace std;
ostream & operator << (ostream& os, const Vector &v)
{
for(unsigned int i=0;i<v.elementNum;i++)
{
os<<' '<<v.at(i);
}
return os;
}Így olyan hibákat dob ki a rendszer, hogy:
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2143: syntax error : missing ';' before '&'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2065: 'os' : undeclared identifier
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(124) : error C2059: syntax error : 'const'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(125) : error C2143: syntax error : missing ';' before '{'
1>d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(125) : error C2447: '{' : missing function header (old-style formal list?)
Ha a namespace nincs kikommentezve, akkor pedig egy nagyon hosszú hibasort, mely az ostream-re mutat...A forráskódok:
Vector.cpp:
#include <limits.h>
#include <assert.h>
#include <iostream>
#include "Vector.h"
#include "string.h"
using namespace HomeMadeString;
Vector::Vector(const Vector& theOther)
{
pData=NULL;
*this=theOther;
}
void Vector::clear()
{
elementNum=0;
delete [] pData;
}
void Vector::erase(unsigned int position)
{
assert(position<elementNum);
if(elementNum==1)
{
delete []pData;
pData=NULL;
elementNum=0;
return;
}
elementNum--;
String* pTemp=new String[elementNum];
for(unsigned int i=0, j=0;i<elementNum+1;i++,j++)
{
if(i==position)
{
j--;
}
else
{
pTemp[j]=pData[i];
}
}
delete[] pData;
pData=pTemp;
}
String& Vector::at(unsigned int position)
{
assert(position<elementNum);
return pData[position];
}
const String& Vector::at(unsigned int position)const
{
assert(position<elementNum);
return pData[position];
}
bool Vector::insert(unsigned int position, String element)
{
if(elementNum==UINT_MAX)
{
return false;
}
if(position<elementNum)
{
String* pTemp=new String[elementNum+1];
for(unsigned int i=0,j=0;i<elementNum;i++,j++){
if(j==position){
pTemp[i]=element;
j--;
}
else pTemp[i]=pData[j];
}
delete[] pData;
pData=pTemp;
elementNum++;
}
else{
String* pTemp=new String[position+1];
for(unsigned int i=0;i<=position;i++){
if(i<elementNum)pTemp[i]=pData[i];
else{
if(i==position)pTemp[i]=element;
else pTemp[i]=0;
}
}
delete[] pData;
pData=pTemp;
elementNum=position+1;
}
return true;
}
String & Vector::operator [](unsigned int position)
{
return at(position); // Miért nem return pData[position]; ???
}
const String & Vector::operator [](unsigned int position)const
{
return at(position); // Miért nem return pData[position]; ???
}
const Vector& Vector::operator= (const Vector & theOther)
{
assert(this!=&theOther);
delete[] pData;
elementNum=theOther.elementNum;
if(elementNum==0) pData=NULL;
else {
pData=new String[elementNum];
for(unsigned int i=0;i<elementNum;i++) pData[i]=theOther.pData[i];
}
return *this;
}
using namespace std;
ostream & operator << (ostream& os, const Vector &v)
{
for(unsigned int i=0;i<v.elementNum;i++)
{
os<<' '<<v.at(i);
}
return os;
}Vector.h:
#ifndef VECTOR_H
#define VECTOR_H
#include <iostream>
#include "string.h"
// Egy dinamikus tömb osztály
using namespace HomeMadeString;
class Vector
{
// A tömb mérete
unsigned int elementNum;
// Az adatokra mutató pointer
String *pData;
// Diagnosztikai célú globális kiiratóoperátor
friend std::ostream & operator << (std::ostream& os,const Vector& v);
public:
// Konstruktorok, destruktor
Vector() {elementNum=0;pData=NULL;}
Vector(const Vector& theOther);
~Vector() {delete[]pData;}
// Visszatér a tömb méretével.
int size()const{return elementNum;}
// Törli a tömböt (ez konzisztens állapotba is hozza a tömböt, nem csak a dinamikus adatterületet szabadítja fel)
void clear();
// Törli a megadott indexu elemet. A 0 és size()-1 közötti indexek érvényesek.
void erase(unsigned int position);
// Visszatér a megadott indexu elemmel, amely módosítható is egyben.
// A 0 és size()-1 közötti indexek érvényesek.
String& at(unsigned int position);
// Visszatér a megadott indexu elemmel, amely csak olvasható.
// A 0 és size()-1 közötti indexek érvényesek. Az int típus esetén nem kellene
// const referencia, de saját típus esetén igen, lásd házi feladat.
const String& at(unsigned int position)const;
// Beszúr egy elemet a megadott indexu helyre.
// Ha az index nagyobb, mint a tömb mérete, megnöveli a tömb méretét,
// és a szükséges új helyeket nullákkal tölti fel.
bool insert(unsigned int position, String element);
// Operator=
const Vector& operator= (const Vector & theOther);
// Két operator[]. Az at() tagfüggvény operator formában is.
String & operator [](unsigned int position);
const String & operator [](unsigned int position)const;
};
// Diagnosztikai célú kiiratás
std::ostream & operator << (std::ostream& os, Vector& v);
#endif /*VECTOR_H */String.h:
#ifndef STRING_H
#define STRING_H
#include <iostream> // A coutnak
namespace HomeMadeString
{
class String
{
// A karakterek aktuális száma:
int elementsNum;
// A karaktereket tartalmazó memóriaterületre mutató pointer:
char *pData;
public:
// Argumentum nélküli konstruktor:
String();
// Másoló konstruktor:
String(const String & string);
// Egy NULL végu sztringet váró konstruktor
String(char * str);
// Egy karaktert és egy elojel nélküli egészet (times) váró konstruktor,
// amely times darab c karakterrel inicializálja a stringet:
String(char c, unsigned int times);
// A destruktor:
~String();
// A string objektum tartalmát a megadott bufferbe másolja, és NULL-lal lezárja
// (a buffernek a hívó foglal helyet):
void getStr(char * pBuff);
// Visszatér a sztring hosszával
unsigned int getLength(){return elementsNum;}
// Kiírja a sztringet a megadott kimeneti adatfolyamba (A 'cout' ostream típusú.
// A .h állományban nem használunk using namespace-t, mert nem tudjuk, hova lesz
// beépítve, és ott milyen hatása lesz. Ezért kiíjuk az std::-t. Ez a .cpp állományban
// már nem kell, ot használhatjuk a using namespace std utasítást):
void print(std::ostream& os);
// Visszaadja a megadott pozícióban lévo karaktert, egyébként nullát:
char getChar(unsigned int pos);
// --- Statikus függvények. Ezek két stringen végeznek muveletet. ---
// Összefuz két sztringet, és visszatér vele:
static String concatenate(const String& string1,const String& string2);
// Összehasonlít két sztringet:
static bool compare(const String& string1,const String& string2);
// A második sztringet az elso sztringbe másolja:
static void copy(String& string1,const String & string2);
};
}
#endif /* STRING_H */String.cpp:
#include <iostream>
#include <locale>
#include <string.h>
#include "String.h"
using namespace std;
using namespace HomeMadeString;
String::String()
{
elementsNum=0;
pData=NULL;
}
String::String(const String & string)
{
int i;
this->elementsNum=string.elementsNum;
this->pData=new char[elementsNum];
for (i=0;i<elementsNum;i++)
pData[i]=string.pData[i];
pData[i]='\0';
}
String::String(char *str)
{
int i;
for (i=0;str[i];i++);
elementsNum=i;
pData=new char[i];
for (i=0;str[i];i++)
pData[i]=str[i];
pData[i]='\0';
}
String::String(char c, unsigned int times)
{
int i;
elementsNum=times;
if (!times)
pData=NULL;
else
{
pData=new char [times];
for (i=0;i<elementsNum;i++)
pData[i]=c;
pData[i]='\0';
}
}
String::~String()
{
//delete[] pData;
}
void String::getStr(char *pBuff)
{
int i;
for (i=0;pData[i];i++)
pBuff[i]=pData[i];
pBuff[i]='\0';
}
char String::getChar(unsigned int pos)
{
if (elementsNum>pos)
return pData[pos];
else
return 0;
}
String String::concatenate(const String& string1,const String& string2)
{
String str;
str.elementsNum=string1.elementsNum+string2.elementsNum;
str.pData=new char[str.elementsNum];
int i,j;
for (i=0;string1.pData[i];i++)
str.pData[i]=string1.pData[i];
for (j=0;string2.pData[j];j++)
str.pData[i+j]=string2.pData[j];
return str;
}
bool String::compare(const String& string1,const String& string2)
{
if (!(strlen(string1.pData)==strlen(string2.pData)))
return false;
for (int i=0;i<string1.elementsNum;i++)
if (!(string1.pData[i]==string2.pData[i]))
return false;
return true;
}
void String::copy(String & string1,const String & string2)
{
delete[] string1.pData;
string1.elementsNum=string2.elementsNum;
if (!string1.elementsNum)
string1.pData=NULL;
else
{
string1.pData=new char[string1.elementsNum];
int i;
for (i=0;string2.pData[i];i++)
string1.pData[i]=string2.pData[i];
}
}
void String::print(std::ostream & os)
{
for (int i=0;i<elementsNum;i++)
os<<pData[i];
}És a tesztelésre használt VectorSample.cpp:
#include "Vector.h"
#include "String.h"
using namespace std;
int main()
{
Vector v1;
// Insert tesztelése
for(int i=1;i<10;i++)
{
v1.insert(i,"i");
}
// A kiírás (operator<<) és az at() függvény tesztelése
cout<<v1<<endl;
//Helyes eredmény:
// 0 1 2 3 4 5 6 7 8 9
// Másoló konstruktor
Vector v2(v1); // Lehetne: Vector v2=v1;
// op=
Vector v3;
v3=v2;
// Megváltoztatjuk v1-t (erase tesztelése)
v1.erase(0);
// v1.erase(9); //Ennek assertelni kell
cout<<endl<<v1<<endl<<v2<<endl<<v3<<endl;
// Helyes eredmény:
// 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
// 0 1 2 3 4 5 6 7 8 9
v2.insert(0,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 9
v2.insert(10,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9
v2.insert(12,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1
v2.insert(15,"-1");
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1 0 0 -1
v2[15]="-2";
cout<<v2<<endl;
// Helyes eredmény:
// -1 0 1 2 3 4 5 6 7 8 -1 9 -1 0 0 -2
// v2[16]=3; //Ennek assertelni kell
return 0;
}Kérem valaki segítsen nekem, már több órája ezzel harcolok, de nem jövök rá, hogy mi a probléma. :S
Üdvözlettel: Papa
-
Jester01
veterán
Neked igen érdekes hibát dob a fordító, az enyém az "érthetően" megmondja mi a baj:
Vector.cpp:127: error: no match for 'operator<<' in 'std:perator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std:stream*)os)), 32) << ((const Vector*)v)->Vector::at(i)'
Magyarul, a Vector-t kiíró operator<< a String-et kiíró operator<< függvényt szeretné hívni, csakhogy ilyen nincs. Van helyette viszont String::print, szóval ez jobb: os<<' '; v.at(i).print(os); Ehhez még szükséges a String::print const-tá alakítása, illetve a Vector.h-ban az operator<< prototípusát is javítani kell mert nem egyezik az implementációval. Ha ez mind megvan, akkor már fordul, csak nem működik
Felhívom a figyelmed továbbá, hogy a string konstansok azok bizony konstansok, tehát const char* típusúak.
Jester
-
papa019
senior tag
válasz Jester01 #748 üzenetére
Köszi, rengeteget segítettél, kijavítottam az általad említett hibákat.
A Vector.h-ban a 2. paraméter elé odaírtam a const-ot, illetve beírtam az os<<' '<<v.at(i).print(os); sort is.Nekem viszont nem fordul és ezt írja ki:
"d:\egyetem\2. félév\programozás alapjai 2\khf\7.hazi\7\7\vector.cpp(127) : error C2662: 'HomeMadeString::String::print' : cannot convert 'this' pointer from 'const HomeMadeString::String' to 'HomeMadeString::String &'"
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!