Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# -> C++

Macro [13.02.2010 20:31:05]

#

Osaisiko joku kääntää minulle tämmöisen helpohkon pätkän C++:ksi?

using System;
using System.Collections.Generic;
using System.Text;

namespace Alert {
    class Program {
        static string ProcessInput(string s) {
            return s;
        }

        static void Main(string[] args) {
            Console.WriteLine("Alert.exe invoked with the following parameters.\r\n");
            Console.WriteLine("Raw command-line: \n\t" + Environment.CommandLine);

            Console.WriteLine("\n\nArguments:\n");

            foreach (string s in args) {
                Console.WriteLine("\t" + ProcessInput(s));
            }
            Console.WriteLine("\nPress any key to continue...");
            Console.ReadKey();
        }
    }
}

Grez [13.02.2010 21:01:10]

#

Onhan sinulla tietokone kotona...

namespace Alert
{
private __gc class Program
{
    // Methods
    private: static void __gc* Main(String __gc* args __gc [])
    {
        Console::WriteLine(S"Alert.exe invoked with the following parameters.\r\n");
        Console::WriteLine(String::Concat(S"Raw command-line: \n\t", Environment::CommandLine));
        Console::WriteLine(S"\n\nArguments:\n");
        foreach (String __gc* s in args)
        {
            Console::WriteLine(String::Concat(S"\t", Program::ProcessInput(s)));
        }
        Console::WriteLine(S"\nPress any key to continue...");
        Console::ReadKey();
    }

    private: static String __gc* ProcessInput(String __gc* s)
    {
        return s;
    }

}
}

(Suora konekäännös)

Edit: Näköjään vieläpä vanhaa syntaksia.. Noh, joku voisi tehdä paremman käännöksen. Kiinnostaisi tosin tietää miksi haluat C# -> C++ vai olisiko tarkoitus myös tehdä ei-CLR:ää siitä?

Macro [13.02.2010 22:40:01]

#

ei-CLR?

Saan nyt virheen

lainaus:

C:\Documents and Settings\Mikko\Desktop\alert.cpp|2|error: expected unqualified-id before "private"|
||=== Build finished: 1 errors, 0 warnings ===|

namespace Alert {
    private __gc class Program {
        private: static void __gc* Main(String __gc* args __gc []) {
            Console::WriteLine(S"Alert.exe invoked with the following parameters.\r\n");
            Console::WriteLine(String::Concat(S"Raw command-line: \n\t", Environment::CommandLine));
            Console::WriteLine(S"\n\nArguments:\n");

            foreach (String __gc* s in args) {
                Console::WriteLine(String::Concat(S"\t", Program::ProcessInput(s)));
            }

            Console::WriteLine(S"\nPress any key to continue...");
            Console::ReadKey();
        }

        private: static String __gc* ProcessInput(String __gc* s) {
            return s;
        }
    }
}

Metabolix [13.02.2010 23:09:14]

#

CLR tarkoittaa MS:n .NET Frameworkia, jota C# käyttää ja jolle on myös C++:sta tuo Grezin esittelemä versio C++/CLI (tai vanhempi Managed Extensions for C++). Tämä "C++.NET" on todella kaukana oikeasta C++:sta. Jos .NET-ohjelmointi kiinnostaa, suosittelen C#:aa, joka on huomattavasti selkeämpi syntaksiltaan. Muussa tapauksessa unohda sekä C# että C++/CLI.

Oikean C++:n tapauksessa kannattaa katsoa vaikka viidennen C++-oppaan lopussa olevaa esimerkkiä. Yhtenäiseen komentoriviin (tuossa Environment.CommandLine) C++:lla ei pääse käsiksi (paitsi ehkä jotenkin Windowsin omien kirjastojen kautta), mutta ohjelmalle välitetään vastaavat tiedot kuin tuossa args-taulukossa.

(Edit: linkkejä)

Grez [13.02.2010 23:12:53]

#

Tosiaan tuossa tulikin jo selitys. Lisään vielä että CLR on lyhenne sanoista Common Language Runtime.

En ole itsekään tehnyt koskaan mitään CLR-softaa C++:lla.. Mielestäni tuntuu hieman masokistiselta.

Tein itse tällaisen nykysyntaksin mukaisen käännöksen C# -> C++ (mitään muuta muuttamatta.) Nyt en vaan keksi miten saisin sen hyväksymään entrypointin olevan tuolla nimiavaruuden ja luokan sisällä (heittää siis linkkerivirheen: fatal error LNK1561: entry point must be defined)

#include "stdafx.h"

using namespace System;

namespace Alert {

	class Program {

	public:	static int main(array<String ^> ^args)
		{
			Console::WriteLine(L"Alert.exe invoked with the following parameters.\r\n");
			Console::WriteLine(String::Concat(L"Raw command-line: \n\t",Environment::CommandLine));
			Console::WriteLine(L"\n\nArguments:\n");
			for each (String ^s in args)
				{
					Console::WriteLine(String::Concat(L"\t", Program::ProcessInput(s)));
				}
			Console::WriteLine(L"\nPress any key to continue...");
			Console::ReadKey();
			return 0;
		};

	private: static String ^ ProcessInput(String ^s)
			{
				return s;
			}

	};

}

En nyt jaksanut tapella tuon kanssa enempää vaan laitoin loppuun:

int main(array<String ^> ^args) {
	return Alert::Program::main(args);
}

Todella ruman näköistä, mutta ainakin sain testattua että tuo kääntyy ja toimii.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta