Sigdal Skrevet 28. september 2008 Del Skrevet 28. september 2008 (endret) Jeg kommer til å begynne å skrive litt i C/C++ igjen og fikk ideen at det kanskje går an å oversette C/C++ kode til VB (vba for Excel). Det er helt enkle ting jeg har bruk for å oversette: variabeldeklarasjoner, løkker, arrays osv. Finnes det noe sånt program? mvh Sigdal Endret 28. september 2008 av Sigdal Lenke til kommentar
aadnk Skrevet 28. september 2008 Del Skrevet 28. september 2008 (endret) Du kan nok tilnærme deg VB-programmer rent syntaksmessig, men jeg tviler på noen har tatt seg det bryet å utvikle et fullendt automatisk oversettelsesprogram (foruten fra VB6 til .NET) som tar seg av alle programmeringsmønstre, bibliotekskall og andre uforutsette omstendigheter. Du må med andre ord kunne programmere i VB for å bruke et slikt program. Eksempelvis måtte jeg gjøre følgende endringer når jeg benyttet denne netttjenesten for å konvertere fra C++ til VB.NET og endelig VB6: #include <cstdlib> #include <iostream> #include <math.h> using namespace std; const float Pi = 3.1415926535897932384626433832795; /* converts degree to radian */ float toRadian(float degree) { return degree * (Pi / 180); } int main(int argc, char *argv[]) { printf("sin(30) = %f\n", sin(toRadian(30))); system("PAUSE"); return EXIT_SUCCESS; } Dette ble oversatt til følgende VB-NET-program: 'Translation of code submitted from xx.xxx.x.xxx'Converted from C++ by xlat on 2008Sep28.1236 'C++ parser version:2006Jan.A0 Imports System Public Class Globals Public Shared Pi As float = 3.1415926535897932384626433832795 Public Shared Function toRadian(degree As float) As float Return degree * Pi / 180 End Function Public Shared Function Main(argv() As string) As Integer Console.Write("sin(30) = {0}\n",sin(toRadian(30))) system("PAUSE") Return EXIT_SUCCESS End Function End Class Dette lar seg imidlertid ikke kompileres. Til det må man modifisere koden kraftig: Option Explicit ' Påkrever variabeldeklarering 'Imports System ' Navneområder eksisterer ikke i VB6/VBA 'Public Class Globals ' Man må lage egne filer for klasser, og i dette tilfellet må koden legges ' i en modul. Fjern evt. former om de kommer opp i standardprosjektet. ' Man bruker Const fremfor variabler - i tillegg kan man ikke sette ' variabler samtidig som man deklarerer dem. Const Pi As Double = 3.14159265358979 ' Datatypen er Single, ikke float. Videre må parametre settes som ByVal (kontra ByRef (default) - dvs. ' som referansetyper/pointers) dersom C-funksjonen ikke bruker OUT. Endelig er Shared-nøkkelordet ' meningsløst i en VB6-modul. Public Function toRadian(ByVal degree As Single) As Single ' Return-ekvivalenten er å sette en intern variabel med samme navn ' som funksjonen og hoppe ut av kjøringen med Exit-operasjonen toRadian = degree * Pi / 180 Exit Function ' Nokså unødvendig her dog End Function ' Main er en tom prosedyre. For å avlese args må man bruke Command() Public Sub Main() ' Da VB6 (og VBA forørig) ikke kan kompilere til konsollapplikasjoner, må man implementere ' dette manuelt ved å bruke API-funksjoner/eksterne biblioteker samt endre på enkelte ' attributter i selve EXE-filen (fremgangsmåten/verktøyet kan graves frem med Google). ' Her har jeg valgt å bruke VBCorLib (velg Project - References og avmerker ' VB.EXT: VBCorLib 2.3 eller last det ned og bla deg frem til DLL-filen i overnevnte dialogboks) Console.WriteValue "sin(30) = {0}{1}", Sin(toRadian(30)), vbCrLf ' Man bruker ikke paranteser ' rundt prosedyrekall. I tillegg kan man ikke escape (/n) karakterer. Dette må legges ved ' manuelt (her: vbCrLf) ' Man kan også skrive en ny linje således: 'Console.WriteLine "Ny linje" ' System ("PAUSE") Console.WriteValue "Press any key to continue." Console.Read ' Unødvendig da vi har med en prosedyre å gjøre 'Return 0 'EXIT_SUCCESS End Sub 'End Class Til sist står vi igjen med følgende VB6-program. Hva dette eksempelet angår ville det nok vært lettere å ha oversatt programmet direkte: Option Explicit Const Pi As Double = 3.14159265358979 Public Function toRadian(ByVal degree As Single) As Single toRadian = degree * Pi / 180 End Function Public Sub Main() Console.WriteValue "sin(30) = {0}{1}", Sin(toRadian(30)), vbCrLf Console.WriteValue "Press any key to continue." Console.Read End Sub Endret 28. september 2008 av aadnk Lenke til kommentar
Sigdal Skrevet 28. september 2008 Forfatter Del Skrevet 28. september 2008 Ok. Takk for webtipset. Jeg har bare programmert VB i excel og da virker det som koden er litt enklere enn det som kommer ut der: Kun Sub og End Sub og programmet innimellom. Saken var at C/C++ er enklere å programmere, synes jeg, så tenkte jeg kunne spare litt tid mht det Skal se mer på det. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå