www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Returning multiple values from a function

reply Vino.B <vino.bheeman hotmail.com> writes:
Hi,

  Can you help me in how to return multiple values from a 
function, the below code is throwing an error as below

Program:
import std.stdio: writeln;
import std.typecons: tuple, Tuple;

Tuple!(int, string[]) Params () {
int Test1;
string[] Path;
Test1 = 1;
Path = ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"];
return Test1;
return Path;
}

void main (){
int Test1;
string[] Path;
Params;
writeln(Test1);
writeln(Path);
}

Error:
TEx1.d(9): Error: cannot implicitly convert expression Test1 of 
type int to Tuple!(int, string[])
TEx1.d(10): Error: cannot implicitly convert expression Path of 
type string[] to Tuple!(int, string[])

From,
Vino.B
Sep 04 2017
parent reply crimaniak <crimaniak gmail.com> writes:
On Monday, 4 September 2017 at 07:27:12 UTC, Vino.B wrote:
 Hi,

  Can you help me in how to return multiple values from a 
 function, the below code is throwing an error as below
import std.stdio: writeln; import std.typecons: tuple, Tuple; Tuple!(int, string[]) Params () { return tuple(1, ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"]); } void main (){ Params.writeln; }
Sep 04 2017
parent reply Vino.B <vino.bheeman hotmail.com> writes:
On Monday, 4 September 2017 at 07:40:23 UTC, crimaniak wrote:
 On Monday, 4 September 2017 at 07:27:12 UTC, Vino.B wrote:
 Hi,

  Can you help me in how to return multiple values from a 
 function, the below code is throwing an error as below
import std.stdio: writeln; import std.typecons: tuple, Tuple; Tuple!(int, string[]) Params () { return tuple(1, ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"]); } void main (){ Params.writeln; }
Hi, Thank you very much, i have used your idea and was able to resolve, and i need one more favor. the below code outputs the value but i need the name of the variable + value as below. Output : 1 2 ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"] Required Output: Test1 = 1 Test2 = 2 Path = ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"] Program: import std.stdio: writeln; import std.typecons: tuple, Tuple; import std.array: appender; Tuple!(int,int, string[]) Params () { int Test1; int Test2; string[] File1; string[] File2; auto Path = appender!(string[]); Test1 = 1; Test2 = 2; File1 = ["C:\\Temp\\TEAM1\\BACKUP"]; File2 = ["C:\\Temp\\TEAM2\\ARCHIVE"]; Path ~= File1; Path ~= File2; return tuple (Test1, Test2, Path.data); } void main (){ writeln(Params[0]); writeln(Params[1]); writeln(Params[2]); } return tuple (Test1, Test1Test2, Path.data); } void main (){ writeln(Params[0]); writeln(Params[1]); } From, Vino.B
Sep 04 2017
next sibling parent crimaniak <crimaniak gmail.com> writes:
On Monday, 4 September 2017 at 09:22:25 UTC, Vino.B wrote:

  Thank you very much, i have used your idea and was able to 
 resolve, and i need one more favor. the below code outputs the 
 value but i need the name of the variable + value as below.

 Output :
 1
 2
 ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"]

 Required Output:
 Test1 = 1
 Test2 = 2
 Path = ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"]
For fixed names case you can hardcode it: writeln("Test1 = ", Params[0]); writeln("Test2 = ", Params[1]); writeln("Path = ", Params[2]); You can't print the actual name of the variable used in tuple constructing because tuple doesn't store it. More of this, the tuple can be constructed from expression without a name, so it's impossible in common case.
Sep 04 2017
prev sibling parent Azi Hassan <azi.hassan live.fr> writes:
On Monday, 4 September 2017 at 09:22:25 UTC, Vino.B wrote:
 Output :
 1
 2
 ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"]

 Required Output:
 Test1 = 1
 Test2 = 2
 Path = ["C:\\Temp\\TEAM1\\BACKUP", "C:\\Temp\\TEAM2\\ARCHIVE"]

 From,
 Vino.B
If you just need it to be displayed then you can add it to the writeln call : writeln("Test 1 = ", Params[0]); But if you want to do it dynamically then maybe you should be using an associative array or a tuple of tuples : import std.stdio; import std.array; import std.typecons; alias Result = Tuple!( Tuple!(string, int), Tuple!(string, int), Tuple!(string, string[]) ); Result Params () { int Test1; int Test2; string[] File1; string[] File2; auto Path = appender!(string[]); //string[] path; path.reserve(2) ? Test1 = 1; Test2 = 2; File1 = ["C:\\Temp\\TEAM1\\BACKUP"]; File2 = ["C:\\Temp\\TEAM2\\ARCHIVE"]; Path ~= File1; Path ~= File2; return tuple( tuple("Test1", Test1), tuple("Test2", Test2), tuple("Path", Path.data) ); } void main (){ auto res = Params(); writeln(res[0][0], " = ", res[0][1]); writeln(res[1][0], " = ", res[1][1]); writeln(res[2][0], " = ", res[2][1]); } You can also loop through res : void main (){ auto res = Params(); foreach(r; res) writeln(r[0], " = ", r[1]); }
Sep 04 2017