Thread overview | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
November 27, 2014 Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
auto parseConfig() { auto lines = File(txtlinks, "r").byLine; return lines; } Error: cannot return non-void from void function I can't understand the reasons of the error; Can I return auto from function? |
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Suliman | Full function look like this: auto parseConfig() { auto config = Ini.Parse(getcwd ~ "\\" ~ "config.ini"); string txtlinks = getcwd ~ "\\" ~ config.getKey("input_links"); if(!exists(txtlinks)) { writeln("Can't find input file with list of links."); return; } auto lines = File(txtlinks, "r").byLine; return lines; } |
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Suliman | On Thursday, 27 November 2014 at 13:07:59 UTC, Suliman wrote:
> Full function look like this:
>
> auto parseConfig()
> {
> auto config = Ini.Parse(getcwd ~ "\\" ~ "config.ini");
> string txtlinks = getcwd ~ "\\" ~ config.getKey("input_links");
> if(!exists(txtlinks))
> {
> writeln("Can't find input file with list of links.");
> return;
> }
> auto lines = File(txtlinks, "r").byLine;
> return lines;
>
> }
You have two return statements in your function. Each of them returns a result of a different type (the first one returns a "void" result). That's not allowed.
Instead of writing "Can't find input file" and then returning, consider throwing an exception. Then you only have one return statement, and one return type.
Graham
|
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Suliman Attachments: | On Thu, 27 Nov 2014 13:07:58 +0000 Suliman via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > Full function look like this: > > auto parseConfig() > { > auto config = Ini.Parse(getcwd ~ "\\" ~ "config.ini"); > string txtlinks = getcwd ~ "\\" ~ config.getKey("input_links"); > if(!exists(txtlinks)) > { > writeln("Can't find input file with list of links."); > return; > } > auto lines = File(txtlinks, "r").byLine; > return lines; > > } ah, that's it! as spec says, D determines function return value from the first 'return' statement it seen. in your case this is `return;`, so function return type is determined to be `void`. if you doing `auto` functions, try to arrange your code so the first `return` returning the actual value. besides, your code is wrong anyway, 'cause you can't have function that returns both "nothing" and "something". your first `return;` should either return something, or must be changed to throwing some exception. |
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Posted in reply to ketmar |
> ah, that's it! as spec says, D determines function return value from
> the first 'return' statement it seen. in your case this is `return;`,
> so function return type is determined to be `void`.
>
> if you doing `auto` functions, try to arrange your code so the first
> `return` returning the actual value.
>
> besides, your code is wrong anyway, 'cause you can't have function that
> returns both "nothing" and "something". your first `return;` should
> either return something, or must be changed to throwing some exception.
How I can terminate program? First return I used to terminate app if config file is exists.
|
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Suliman Attachments: | On Thu, 27 Nov 2014 17:22:35 +0000 Suliman via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > > > ah, that's it! as spec says, D determines function return value > > from > > the first 'return' statement it seen. in your case this is > > `return;`, > > so function return type is determined to be `void`. > > > > if you doing `auto` functions, try to arrange your code so the > > first > > `return` returning the actual value. > > > > besides, your code is wrong anyway, 'cause you can't have > > function that > > returns both "nothing" and "something". your first `return;` > > should > > either return something, or must be changed to throwing some > > exception. > > How I can terminate program? First return I used to terminate app if config file is exists. throw an exception. uncatched exception will terminate your program. |
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Suliman | On Thursday, 27 November 2014 at 17:22:36 UTC, Suliman wrote:
>
>> ah, that's it! as spec says, D determines function return value from
>> the first 'return' statement it seen. in your case this is `return;`,
>> so function return type is determined to be `void`.
>>
>> if you doing `auto` functions, try to arrange your code so the first
>> `return` returning the actual value.
>>
>> besides, your code is wrong anyway, 'cause you can't have function that
>> returns both "nothing" and "something". your first `return;` should
>> either return something, or must be changed to throwing some exception.
>
> How I can terminate program? First return I used to terminate app if config file is exists.
You can use this:
auto parseConfig()
{
string txtlinks = buildPath(getcwd,"notexist");
if(exists(txtlinks))
{
auto lines = File(txtlinks, "r").byLine;
return lines;
}
writeln("Can't find input file with list of links.");
return typeof(return)();
}
it works somehow, but it is not good way how to do it.
Other way is use exit
if(!exists(txtlinks))
{
import core.runtime;
import std.c.process;
writeln("Can't find input file with list of links.");
Runtime.terminate();
exit(1);
}
But best way is use throw exception
if(!exists(txtlinks))
{
throw new Exception("Can't find input file with list of links.");
}
and catch it somewhere from calling side
|
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Kozak Attachments: | On Thu, 27 Nov 2014 21:14:57 +0000 Daniel Kozak via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > import core.runtime; > import std.c.process; > writeln("Can't find input file with list of links."); > Runtime.terminate(); > exit(1); please-please-please don't teach people that! using such features requiring deep understanding of how D runtime works, and how it interacts with C runtime, with GC, with stack objects and so on. it's better to now show people bad samples instead of telling them "don't do what i just wrote". ;-) |
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Dne Thu, 27 Nov 2014 22:21:52 +0100 ketmar via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> napsal(a): > On Thu, 27 Nov 2014 21:14:57 +0000 > Daniel Kozak via Digitalmars-d-learn > <digitalmars-d-learn@puremagic.com> wrote: > >> import core.runtime; >> import std.c.process; >> writeln("Can't find input file with list of links."); >> Runtime.terminate(); >> exit(1); > please-please-please don't teach people that! using such features > requiring deep understanding of how D runtime works, and how it > interacts with C runtime, with GC, with stack objects and so on. > > it's better to now show people bad samples instead of telling them > "don't do what i just wrote". ;-) I know, I just can't help myself :). |
November 27, 2014 Re: Error: cannot return non-void from void function | ||||
---|---|---|---|---|
| ||||
Attachments: | On Thu, 27 Nov 2014 22:25:10 +0100 Daniel Kozak via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > Dne Thu, 27 Nov 2014 22:21:52 +0100 ketmar via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> napsal(a): > > > On Thu, 27 Nov 2014 21:14:57 +0000 > > Daniel Kozak via Digitalmars-d-learn > > <digitalmars-d-learn@puremagic.com> wrote: > > > >> import core.runtime; > >> import std.c.process; > >> writeln("Can't find input file with list of links."); > >> Runtime.terminate(); > >> exit(1); > > please-please-please don't teach people that! using such features requiring deep understanding of how D runtime works, and how it interacts with C runtime, with GC, with stack objects and so on. > > > > it's better to now show people bad samples instead of telling them "don't do what i just wrote". ;-) > > I know, I just can't help myself :). me too sometimes. taking into accout that "don't try this at home" warning is never working makes it even funnier. ;-) |
Copyright © 1999-2021 by the D Language Foundation