Hello (and a happy new year)
I'm quite new to C++ and have to programm something for school and can't
get my head around
a couple of things, but at the moment this one is the most important for me:
I have defined a class String and before I go on I should mention that
I'm not allowed to use any pre-defined templates (no STL) and not the
standard C++ String class, kind of mean :)
Nevertheless I want to tokenize a String with a predefined delimiter,
which will be used later to
cut words out of a sentence.
String.cpp
String[] String::tokenize(const String s, char* delimiter)
{
String stringArray[];
// tokenize the String and put each word into the String array
...
return stringArray;
}
String.h
String[] tokenize(const String s, char* delimiters);
My first problem is that I get a bunch of errors for the header line
(the first is C3409, I'm using VC++ .NET),
I assume this is not the way how one should define an array return type?
I know I have a second problem too, because I have to define the size
of the array I want to return, but honestly I want to avoid that, I
would love to do that dynamicly
as in a Vector. 9 2239
On Sun, 02 Jan 2005 11:12:07 +0100 in comp.lang.c++, Steve
<s.*******@fhtw-berlin.de> wrote, String[] tokenize(const String s, char* delimiters);
An array return type is not allowed.
You can return a struct that contains an array. Or you can let the
caller provide a pointer to an array argument that you fill with
your results. You can return a pointer to an array that you got
somewhere, but that means you have to pay more attention to where
the array is allocated.
David Harmon wrote: On Sun, 02 Jan 2005 11:12:07 +0100 in comp.lang.c++, Steve <s.*******@fhtw-berlin.de> wrote,
String[] tokenize(const String s, char* delimiters);
An array return type is not allowed.
Ohhh, ok didn't know that! You can return a struct that contains an array. Or you can let the caller provide a pointer to an array argument that you fill with your results. You can return a pointer to an array that you got somewhere, but that means you have to pay more attention to where the array is allocated.
Thanks, I will give the struct idea a try.
cheers
Steve
"Steve" <s.*******@fhtw-berlin.de> wrote in message news:33*************@news.dfncis.de... David Harmon wrote: On Sun, 02 Jan 2005 11:12:07 +0100 in comp.lang.c++, Steve <s.*******@fhtw-berlin.de> wrote,
String[] tokenize(const String s, char* delimiters);
An array return type is not allowed. Ohhh, ok didn't know that! You can return a struct that contains an array. Or you can let the caller provide a pointer to an array argument that you fill with your results. You can return a pointer to an array that you got somewhere, but that means you have to pay more attention to where the array is allocated.
Thanks, I will give the struct idea a try.
Most time, return a struct is not a good idea. This cause a copy operation of
the members in the struct. cheers Steve
String.cpp
std::vector<String> String[] String::tokenize(const String s, char* delimiter)
{
std::vector<String> stringArray;
// tokenize the String and put each word into the String array
...
return stringArray;
}
OK?
But a little slow.
--
---http://snnn.blogone.net-----
"Mole Wang" <mo****@yahoo.com.cn> writes: Most time, return a struct is not a good idea. This cause a copy operation of the members in the struct.
Or return a std::SmartPtr allocated by the function ?
Who should own it?
Who should allocate it?
Who should free it?
Pointers bring too trouble to it.
--
---------------snnn-------------
---http://snnn.blogone.net-----
"cyper" <cy***@163.com.haha.removeme> a écrit dans le message de news: u1***********@163.com.haha.removeme... "Mole Wang" <mo****@yahoo.com.cn> writes:
Most time, return a struct is not a good idea. This cause a copy operation of the members in the struct. Or return a std::SmartPtr allocated by the function ?
Who should own it? Who should allocate it? Who should free it?
Depending on the design, receiving a reference to an object for modification
can be more "efficient" than returning it. The thing is, modifying
parameters received by reference is usually dangerous, since it is not
always clear that the function will modify it. I prefer passing by address
when my functions modify their arguments.
void f(A &a);
void g(A *a);
int main()
{
A a;
f(a); // watch out, f() modifies a
g(&a); // that's clearer (imho)
}
Except for specific cases, I prefer returning by value since it is the
clearest way and users can safely ignore the modifications.
Jonathan
"cyper" <cy***@163.com.haha.removeme> wrote in message
news:u6***********@163.com.haha.removeme... String.cpp
std::vector<String> String[] String::tokenize(const String s, char*
delimiter) { std::vector<String> stringArray; // tokenize the String and put each word into the String array ...
return stringArray; }
OK? But a little slow.
Did you try to compile that?
-Mike
Steve wrote: Hello (and a happy new year)
I'm quite new to C++ and have to programm something for school and can't get my head around a couple of things, but at the moment this one is the most important for me:
I have defined a class String and before I go on I should mention that I'm not allowed to use any pre-defined templates (no STL) and not the standard C++ String class, kind of mean :)
Nevertheless I want to tokenize a String with a predefined delimiter, which will be used later to cut words out of a sentence.
String.cpp
String[] String::tokenize(const String s, char* delimiter)
From a design perspective , the String argument to the function,
seems a little bit unconventional and confusing, since it is not
clear why this ought to be a member function since you are
passing a String and a delimiter as argument to the function.
(well, then you can as well have this method as static, which
may not be the best design though ).
Some suggestions:
1. You can have a method as follows.
vector<String> String::tokenize(const char * delimiter)
//Tokenize the String object's contents' here.
2. A better way would be to have a StringTokenizer class.
vector<String> StringTokenizer::tokenize(const char * delimiter);
--
Karthik.
Steve wrote: String[] String::tokenize(const String s, char* delimiter) { String stringArray[]; // tokenize the String and put each word into the String array ...
return stringArray; }
The typical C++ approach to this is to have the function take an output
iterator which is written to in the function, i.e. something like this:
| template <typename OutIt>
| OutIt String::tokenize(char const* delimiters, OutIt to)
| {
| // ...
| *to++ = token;
| // ...
| return to;
| }
You could then use your 'tokenize()' function something like this:
| std::vector<String> vec;
| String str(/*...*/);
| str.tokenize(",", std::back_inserter(vec));
.... or use whatever appropriate container type you wish instead of
'std::vector' as long as it supports a 'push_back()' operation. This
also
allows output e.g. to standard output using an appropriate iteartor:
| str.tokenize(',', std::ostream_iterator<String>(std::cout, "\n"));
The trouble is somewhat that your teacher apparently does not
understand
how C++ works and deprived you from reasonable use of the standard
library
thereby either forcing you to reimplement fairly large portions thereof
or
using inferior programming techniques. If he wanted you to provide an
implementation of some particular algorithms without using the
corresponding
algorithms from the standard library he should have specified it that
way
rather.
String[] tokenize(const String s, char* delimiters);
This is illegal syntax. If it were possible to return an array from a
function, the syntax would rather be something like this:
| String (tokenize(String const&s, char const* delimiters))[10];
A declaration like this should give an error message similar to the one
issued e.g. by SUN's compiler:
| Error: Functions cannot return arrays or functions.
However, please note two other important changes I applied to the
function
signature:
- The string is taken as reference argument: there is probably no need
to
copy the String, especially if you want it to be 'const' anyway.
- To allow passing of string literals to the functions, the second
parameter uses a pointer to 'char const' (i.e. an array of constant
'char's; 'char const' and 'const char' is equivalent but I consider
it
to be easier to read to place the 'const' as far to the right as
possible).
My first problem is that I get a bunch of errors for the header line (the first is C3409, I'm using VC++ .NET), I assume this is not the way how one should define an array return
type?
Right. See above.
I know I have a second problem too, because I have to define the size of the array I want to return, but honestly I want to avoid that, I would love to do that dynamicly as in a Vector.
To do so, you need to handle dynamic memory allocation - or,
preferably,
use one of the standard containers. Proper implementation of a
container
is actually non-trivial and involves loads of intrinsic little nits
which
are, IMO, far beyond a typical school assignment level. For example,
reasonable implementation of a 'std::vector' replacement involves
allocation
of uninitialized memory and placement construction/destruction of
elements.
No real rocket science but hardly what students need to be exposed to
learn
dealing with data structures either. Of course, some issues can be side
stepped by default constructing a bigger array and only considering a
subset
of the actual elements to be present in the vector...
--
<mailto:di***********@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Phil Powell |
last post by:
if (is_array($_POST)) {
foreach ($this->getAssocSectionsObjArray($key, $dbAP) as
$obj) {
print_r($obj); print_r(" in array? ");
print_r(in_array($obj, $result)); print_r("<P>");
if...
|
by: OlgaM |
last post by:
Hello,
i'm trying to initialize an array.
The class List contains this in its private data members:
ListNode<DATATYPE> *dataItems;
In the constructor, i'm trying to allocate space for...
|
by: Raptor |
last post by:
Hi,
I'm quite new to MySQL and quite impressed by its feature set. I've
also been looking at Interbase and it has a feature that allows a
multidimensional array to be stored in a single field. ...
|
by: Magix |
last post by:
Hi,
what is wrong with following code ?
typedef struct
{
word payLen;
datatype data;
} msg_type;
|
by: nafri |
last post by:
hello all,
I want to create a function that returns the first element of the Array
that is input to it. However, the Input Array can be an Array of points,
double, or anyother type, which means...
|
by: Andrew |
last post by:
Hi all,
I have a method that wants to return an array. What datatype should I use ?
I tried using an "Array" but there was a compilation error. Why ?
public Array setReviewAll2 (int intNumQn)...
|
by: DWalker |
last post by:
VBA, as used in Excel 2000 and Excel 2003, has a function called Array.
It's commonly seen in statements like the following:
Workbooks.OpenText Filename:=ACFileName, _
StartRow:=1,...
|
by: rascal_mon |
last post by:
I'm new with XML. Please give me some advice.
I wonder there are any difference between XML that is automatically generated
from ADO and XML file that shows in many textbooks. I found that the...
|
by: Tom |
last post by:
Is there a function to get a variable to return its name w/datatype of
string? i.e.:
$var would return "var"
|
by: antdb |
last post by:
Ⅰ. Advantage of AntDB: hyper-convergence + streaming processing engine
In the overall architecture, a new "hyper-convergence" concept was proposed, which integrated multiple engines and...
|
by: WisdomUfot |
last post by:
It's an interesting question you've got about how Gmail hides the HTTP referrer when a link in an email is clicked. While I don't have the specific technical details, Gmail likely implements measures...
|
by: Oralloy |
last post by:
Hello Folks,
I am trying to hook up a CPU which I designed using SystemC to I/O pins on an FPGA.
My problem (spelled failure) is with the synthesis of my design into a bitstream, not the C++...
|
by: BLUEPANDA |
last post by:
At BluePanda Dev, we're passionate about building high-quality software and sharing our knowledge with the community. That's why we've created a SaaS starter kit that's not only easy to use but also...
|
by: Ricardo de Mila |
last post by:
Dear people, good afternoon...
I have a form in msAccess with lots of controls and a specific routine must be triggered if the mouse_down event happens in any control.
Than I need to discover what...
|
by: Johno34 |
last post by:
I have this click event on my form. It speaks to a Datasheet Subform
Private Sub Command260_Click()
Dim r As DAO.Recordset
Set r = Form_frmABCD.Form.RecordsetClone
r.MoveFirst
Do
If...
|
by: ezappsrUS |
last post by:
Hi,
I wonder if someone knows where I am going wrong below. I have a continuous form and two labels where only one would be visible depending on the checkbox being checked or not. Below is the...
|
by: jack2019x |
last post by:
hello, Is there code or static lib for hook swapchain present?
I wanna hook dxgi swapchain present for dx11 and dx9.
|
by: DizelArs |
last post by:
Hi all)
Faced with a problem, element.click() event doesn't work in Safari browser.
Tried various tricks like emulating touch event through a function:
let clickEvent = new Event('click', {...
| |